Skip to content
iblaiPublic

About

Open-source CRM for organizations on the ibl.ai platform: people, organizations, deals, activities and tags, with ibl.ai single sign-on and roles. One Next.js codebase for web, macOS, Windows, Linux, iOS and Android through Tauri. MIT.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

62 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ibl.ai

ibl.ai/crm

Watch the intro video

β–ΆοΈŽ Watch the intro video Β Β·Β  Organizations, people, deals, activities and tags in under five minutes

The open-source CRM for organizations on the ibl.ai platform.

People, organizations, deals, activities and tags β€” for every organization you belong to, with ibl.ai single sign-on and roles built in. One codebase. Every platform. Your data, your organization, your rules.

Join About Docs License: MIT SOC 2 Type II Next.js Tauri


⬇️ Get ibl.ai/crm

Web β€” crm.ibl.ai, coming soon Β  macOS β€” coming soon Β  Windows β€” coming soon

iOS β€” coming soon Β  Android β€” coming soon

Hosted web app and published builds coming soon Β· today: run it locally or deploy it yourself Β· how builds are made


Why ibl.ai/crm Β· Every platform Β· Features Β· Screenshots Β· Quick Start Β· Deployment Β· Architecture


SOC 2 Type II Β Β·Β  Universities, enterprises, and governments run on ibl.ai β€” read the case studies β†’


Why ibl.ai/crm

πŸ”“ Your code, your data MIT-licensed and self-hostable. The CRM records live in your ibl.ai organization, scoped by the platform's own multi-tenancy β€” no second database, no vendor lock-in.
🏒 Every organization you own Sign in once with ibl.ai SSO and switch between all of your organizations, exactly like os.ibl.ai. Each organization gets its own people, pipelines, deals and roles.
🧭 The Twenty way, on ibl.ai The information architecture of Twenty β€” objects in a sidebar, saved table & board views, favorites, record pages with a timeline and a history β€” built on the ibl.ai CRM API and SDK components.
🌍 Four languages English, Spanish, French and Chinese, following the language you chose in any other ibl.ai app.
πŸ“± Truly everywhere One codebase for web, macOS, Windows, Linux, iOS and Android β€” native shells around the same app. The hosted web app and published builds are coming soon.
πŸ” Enterprise-ready SSO (OAuth / OIDC / SAML via the platform), four seeded CRM roles (Viewer, User, Manager, Inviter), org-level notifications, invitations that turn leads into platform users.

Every platform, one codebase

ibl.ai/crm meets your team wherever they are β€” the same product, native everywhere.

Platform Status
Web 🌐 Coming soon at crm.ibl.ai β€” today, run it locally or deploy it yourself
macOS 🍎 Native app (universal .dmg, Intel + Apple Silicon) β€” built by the release workflow; downloads coming soon
Windows πŸͺŸ Native app (x64 + ARM64 installer) β€” built by the release workflow; downloads coming soon
Linux 🐧 Native app (.deb / AppImage) β€” built by the desktop build workflow; downloads coming soon
iOS πŸ“± Native app β€” built by the iOS workflow; App Store listing coming soon
Android πŸ€– Coming soon β€” the Android project is not set up yet (pnpm tauri android init)

The native apps are Tauri 2 WebView shells around the hosted app (src-tauri/), so they load crm.ibl.ai and work once it is live β€” or point them at your own deployment (docs/development.md). They are built the same way iblai/os and iblai/lms ship. Sign-in on mobile goes through the system browser and returns via the iblai-crm:// deep link. See docs/platform-deployment.md.


Features

πŸ‘₯ People & organizations

  • People β€” leads, contacts and customers with lifecycle stage, owner, job title, emails, phones, and tags; merged duplicates stay out of the way
  • Organizations β€” accounts with address, owner and tags; the people, deals and the timeline that belong to them
  • Invite Β· link Β· merge β€” turn a lead into a platform user by email invitation, link a person to an existing user, or merge duplicates
  • Tags β€” colored labels shared across people, organizations and deals
  • Search, sort, views β€” server-side search and sorting on every list; save a view with its filters, sort and columns (table or board); star anything into the sidebar's Favorites

πŸ’Ό Deals & pipelines

  • Kanban board β€” drag deals between stages; columns show count, value and win probability; stale deals are flagged after the pipeline's rotten_days
  • Table view β€” filter by status, owner, source, tags; page through everything
  • Deal page β€” stage stepper, mark won / lost (with reason), reopen, value & currency, expected close, timeline, field-change history
  • Pipelines & stages β€” seeded default pipeline (New β†’ Qualified β†’ Proposal β†’ Negotiation β†’ Won / Lost); create your own, reorder stages, set probabilities and terminal flags; lead sources

πŸ—“οΈ Activities

  • Timeline on every person, organization and deal β€” calls, meetings, emails, notes, tasks, lunches, deadlines
  • Schedule β€” scheduled work with an owner; overdue / today / upcoming views; mark done
  • Auto-recorded history β€” stage changes are logged for you

πŸ“Š Home

  • Dashboard β€” open deals, pipeline and weighted value, won this month, work due today; deals by stage; won vs lost over six months; what's up next β€” with a period picker (today, 7, 30, 90 days)

🏒 Operate & scale

  • Multi-organization β€” the organization is in the URL (/platform/<org>/…); switch between every organization you belong to from the profile menu
  • SSO & roles β€” ibl.ai sign-in; CRM Viewer / User / Manager / Inviter roles assigned in the sidebar's Management dialog (the SDK's Management surface)
  • Notifications β€” person created, deal stage changed, person linked to user β€” in the bell and the notifications center
  • ⌘K β€” one server-side search across people, organizations and deals; jump anywhere; create anything
  • Native shells β€” macOS, Windows, Linux and iOS via Tauri 2; Android and published builds coming soon

Screenshots

Screenshots of the seeded walkthrough organization are on their way β€” run pnpm screenshots to regenerate them into docs/images/ (see docs/development.md).


Quick Start

git clone https://github.com/iblai/crm.git
cd crm
pnpm install --ignore-scripts
pnpm dev

Open http://localhost:3000. It sends you to login.iblai.app, where Sign Up creates an organization at ibl.ai and brings you back signed in; you land on /platform/<your-org> β€” the CRM of the organization your session is scoped to. Use the switcher in the profile menu to move between organizations.

No configuration is required against hosted iblai.app: the service URLs default in lib/iblai/config.ts. Copy .env.example to .env.local only to point at a self-hosted platform or to change the community org (NEXT_PUBLIC_MAIN_TENANT_KEY, default main).

Using Claude Code? This repo ships with the iblai/vibe skills in mind β€” read AGENTS.md first.

Node.js 22+ and pnpm 12 (corepack enable picks the pinned version up from package.json).

Node.js 25+ note: the dev script sets NODE_OPTIONS='--no-experimental-webstorage' so the SDK's browser-storage guards do not collide with Node's experimental localStorage. Keep that flag if you customize the script.

Scripts

Command What it does
pnpm dev Dev server on port 3000
pnpm build Production build (standalone output)
pnpm start Serve the production build
pnpm typecheck TypeScript 7
pnpm lint oxlint, under a warning budget (--max-warnings)
pnpm format oxfmt (pnpm format:check in CI)
pnpm i18n:check Same keys in the four catalogs; no β€œtenant”, no β€œcompany”, no ASCII apostrophe
pnpm test Vitest unit tests (pnpm test:coverage in CI: 85 % lines on lib/)
pnpm test:e2e Playwright journeys (needs e2e/.env.development)
pnpm release release-it: version from the commits, CHANGELOG, tag, GitHub Release (CI runs it on every push to main)
pnpm tauri dev Desktop shell in dev mode (needs Rust)
pnpm tauri build Desktop installer for the current platform
pnpm tauri ios dev iOS simulator (needs Xcode)

Deployment

ibl.ai/crm is a front end for the ibl.ai platform. The platform provides sign-in, organizations, roles, notifications and the CRM API; this repository provides the app.

Option A: Hosted ibl.ai platform

  1. Build and run with Node

    pnpm build
    cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/
    PORT=3000 node .next/standalone/server.js

    The build is a standalone server, so next start does not apply; the two copies are what the Dockerfile does. On Vercel nothing of this is needed: the project builds the regular Next.js output (vercel.json pins the preset) and only wants ENABLE_EXPERIMENTAL_COREPACK=1 so pnpm 12 is used.

  2. Or run with Docker

    docker build -t iblai-crm .
    docker run -p 3000:3000 iblai-crm

    NEXT_PUBLIC_* values are inlined at build time and .env* files stay out of the image, so a self-hosted platform passes its URLs as build arguments: --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.example.com --build-arg NEXT_PUBLIC_AUTH_URL=https://login.example.com --build-arg NEXT_PUBLIC_PLATFORM_BASE_DOMAIN=example.com (omit them for hosted iblai.app). The Dockerfile declares these three and NEXT_PUBLIC_MAIN_TENANT_KEY; any other NEXT_PUBLIC_* setting needs an ARG of its own there.

  3. Register the origin. Every origin the app runs on (http://localhost:3000, https://crm.example.com, the iblai-crm:// native scheme) must be an allowed redirect origin of the organizations that sign in, or the Auth SPA never returns. Ask your ibl.ai operator.

Option B: Self-hosted platform

Set the service URLs in .env.local for pnpm dev and pnpm build, or as Docker build arguments (above); see Configuration. If you need the full backend, reach out at ibl.ai/contact for an enterprise license and deploy it with iblai/iblai-infra-cli.

Every surface, on your own backend

Ship Web, macOS, Windows, Linux, iOS and Android pointed at your own deployment β€” one web codebase, with the native apps as WebView shells around it:

β†’ Platform deployment guide (per-surface build, backend config, release, store submission).

Build-time flags (native apps)

The Tauri shell reads two optional compile-time flags (Rust option_env!) and exposes them as commands; set them in the build shell before pnpm tauri build. The web app does not read these commands yet, so neither flag changes the app today β€” the organization lock and the in-app purchase UI are coming soon:

Env var Tauri command Default Effect
IBL_TENANT get_locked_tenant β†’ string "" (unlocked) Organization lock (coming soon): the organization a build is meant for. Empty = multi-org.
IBL_ALLOW_IN_APP_PURCHASE allow_in_app_purchase β†’ bool false In-app purchase UI (coming soon). Truthy: 1, true, yes, on.
IBL_TENANT=acme pnpm tauri build   # a build meant for the "acme" organization

Configuration

All app config is NEXT_PUBLIC_* and optional against hosted iblai.app. Defaults live in lib/iblai/config.ts.

Variable Default Description
NEXT_PUBLIC_API_BASE_URL https://api.iblai.app Consolidated API; /dm (CRM), /lms, /axd are derived from it
NEXT_PUBLIC_AUTH_URL https://login.iblai.app The hosted Auth SPA
NEXT_PUBLIC_PLATFORM_BASE_DOMAIN iblai.app Base domain; with no API base, services resolve to their own subdomains
NEXT_PUBLIC_MAIN_TENANT_KEY main The community organization β€” the default when nothing else resolves
NEXT_PUBLIC_IBL_PLATFORM crm app= sent to the Auth SPA (its crm app: CRM copy, Sign Up goes to registration)
NEXT_PUBLIC_TAURI_CUSTOM_SCHEME iblai-crm Deep-link scheme the native shells return through after SSO
NEXT_PUBLIC_DEFAULT_CURRENCY USD Currency preselected on new deals
NEXT_PUBLIC_ENABLE_RBAC false Gate SDK admin surfaces on RBAC policies as well as the admin flag

Architecture

crm/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ page.tsx                          # `/` β†’ /platform/<session org>
β”‚   β”œβ”€β”€ platform/[tenantKey]/             # everything inside one organization
β”‚   β”‚   β”œβ”€β”€ layout.tsx                    # sidebar + top bar shell (admin gate)
β”‚   β”‚   β”œβ”€β”€ page.tsx                      # Home dashboard
β”‚   β”‚   β”œβ”€β”€ people/ Β· organizations/      # lists + record pages (timeline Β· history)
β”‚   β”‚   β”œβ”€β”€ deals/                        # kanban Β· table Β· deal page
β”‚   β”‚   β”œβ”€β”€ activities/ Β· tags/           # timeline work Β· labels
β”‚   β”‚   β”œβ”€β”€ settings/                     # pipelines Β· stages Β· lead sources
β”‚   β”‚   └── notifications/[[...id]]/      # SDK NotificationDisplay
β”‚   β”œβ”€β”€ sso-login-complete/               # SSO landing (outside the providers)
β”‚   β”œβ”€β”€ mobile-sso-login/                 # native deep-link landing
β”‚   └── api/auth-redirect/                # same-origin hop to the Auth SPA
β”œβ”€β”€ components/crm/                       # sidebar, top bar, ⌘K, record widgets
β”œβ”€β”€ components/ui/                        # shadcn/ui (Base UI) primitives
β”œβ”€β”€ hooks/                                # useSession, useMembers
β”œβ”€β”€ lib/crm/                              # CRM types Β· RTK Query slice Β· formatting Β· saved-view helpers
β”œβ”€β”€ i18n/ Β· messages/                     # next-intl config Β· en/es/fr/zh catalogs
β”œβ”€β”€ lib/iblai/                            # config Β· tenant resolution Β· auth helpers
β”œβ”€β”€ providers/iblai-providers.tsx         # Redux > AuthProvider > TenantProvider
β”œβ”€β”€ store/iblai-store.ts                  # SDK slices + crmApi
β”œβ”€β”€ src-tauri/                            # Tauri 2 shell (macOS Β· Windows Β· Linux Β· iOS Β· Android)
β”œβ”€β”€ e2e/ Β· __tests__/                     # Playwright journeys Β· Vitest
└── docs/                                 # deployment, downloads, development

Data flow

User β†’ React pages β†’ RTK Query (lib/crm/api.ts) β†’ https://api.iblai.app/dm/api/crm/…
                                    ↓                       Authorization: Token <dm_token>
                           @iblai/iblai-js SDK
                           β”œβ”€β”€ /web-utils        AuthProvider Β· TenantProvider Β· tenant switch
                           β”œβ”€β”€ /web-containers   profile dropdown Β· notifications Β· Account/Management
                           └── /data-layer       platform users Β· org metadata

Sign-in is the platform's hosted round trip (login.<domain>/login?app=crm&redirect-to=<origin>&tenant=<org> β†’ /sso-login-complete?data=…). TenantProvider compares the organization in the URL with the one the session is scoped to and re-authenticates when they differ, handing back an org-scoped token pair. The CRM API infers the organization from that token β€” there is no ?platform_key= β€” so every record you see belongs to the organization in the URL. A signed-in user who administers no organization and holds no CRM role in the one they entered is sent to ibl.ai registration (the free plan ibl.ai/join resolves to) and comes back signed in to the organization it created. A user who switches to an organization whose CRM data they cannot see is switched back. Details: docs/development.md.

The CRM API

Ten Platform-scoped resources under /dm/api/crm/: persons, organizations, pipelines (with nested stages and stages/reorder/), lead-sources, deals (move-stage/, won/, lost/, the board/), activities (done/), tags (attach / detach on persons, organizations, deals), favorites and saved views β€” plus search/, overview/ and …/{id}/history/, and ?search= / ?ordering= / ?date_filter= on every list. Every organization is seeded with a default pipeline, six stages and four lead sources. The full contract lives in the iblai-api-crm and iblai-vibe-crm-overview skills of iblai/vibe. This release needs ibl-dm-pro 4.416.0 (ibl-dm-crm-app 1.3.0).


Testing

pnpm test            # Vitest β€” formatting, saved views, tenant resolution, SSO landing, config
pnpm i18n:check      # en / es / fr / zh catalogs carry the same keys and the house vocabulary
pnpm test:coverage   # the unit tests with the coverage gate CI runs
pnpm test:e2e        # Playwright journeys (copy e2e/.env.development.example first)
pnpm test:e2e:ui     # interactive UI mode

The Playwright suite signs in once through the real Auth SPA (e2e/auth.setup.ts) and reuses the session across the journeys in e2e/journeys/.


Contributing

We welcome contributions! See CONTRIBUTING.md. If you use AI-assisted tooling, read AGENTS.md first β€” it explains the SDK-first component rule, the multi-organization model, and how to verify a change.


Resources


License

MIT License. See LICENSE for details.


ibl.ai Β· Your organization's AI, under your control.

About

Open-source CRM for organizations on the ibl.ai platform: people, organizations, deals, activities and tags, with ibl.ai single sign-on and roles. One Next.js codebase for web, macOS, Windows, Linux, iOS and Android through Tauri. MIT.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages