βΆοΈ 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.
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 β
| π 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. |
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.
|
π₯ People & organizations
πΌ Deals & pipelines
|
ποΈ Activities
π Home
π’ Operate & scale
|
Screenshots of the seeded walkthrough organization are on their way β run pnpm screenshots to regenerate them into docs/images/ (see docs/development.md).
git clone https://github.com/iblai/crm.git
cd crm
pnpm install --ignore-scripts
pnpm devOpen 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
devscript setsNODE_OPTIONS='--no-experimental-webstorage'so the SDK's browser-storage guards do not collide with Node's experimentallocalStorage. Keep that flag if you customize the script.
| 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) |
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.
-
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.jsThe build is a standalone server, so
next startdoes 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.jsonpins the preset) and only wantsENABLE_EXPERIMENTAL_COREPACK=1so pnpm 12 is used. -
Or run with Docker
docker build -t iblai-crm . docker run -p 3000:3000 iblai-crmNEXT_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 hostediblai.app). The Dockerfile declares these three andNEXT_PUBLIC_MAIN_TENANT_KEY; any otherNEXT_PUBLIC_*setting needs anARGof its own there. -
Register the origin. Every origin the app runs on (
http://localhost:3000,https://crm.example.com, theiblai-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.
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.
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).
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" organizationAll 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 |
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
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.
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).
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 modeThe Playwright suite signs in once through the real Auth SPA (e2e/auth.setup.ts) and reuses the session across the journeys in e2e/journeys/.
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.
- Documentation
- Development Guide β setup, scripts, architecture, configuration
- Agentic OS Β· Agentic LMS β the sibling apps this CRM mirrors
- Vibe β the skills and SDK toolkit for building on ibl.ai
- @iblai/iblai-js β the ibl.ai SDK
- Twenty β the CRM whose product model inspired this one

