← Blog
Open source· about 6 min

We open-sourced our CRM: built for small teams, where AI drafts but never writes

Daedalus CRM is the application layer of our three product lines. This post covers why it went from SaaS to open source, why none of the five AI features write to the database, what “less is more” actually looks like in the code, and how two commands get it running.

Update, 2026-09-11: this was written at v0.3. Since then v0.6 replaced the home screen with a command-line style agent conversation and moved the whole visual system to white with thin lines. The screenshots below are the v0.3 interface, kept as a record of the time. For the current interface see the product page or the repository README ↗. The trade-offs described here — AI drafts but never writes, the watchlist is not a black-box score, referral attribution is fixed at entry — all still hold.
Daedalus CRM v0.3 dashboard
The dashboard (v0.3 interface): four metric cards, trends, funnel and watchlist alerts. The data in the screenshot is fictional.

The short version

The repository is at github.com/BeckY824/daedalus-crm, under AGPL-3.0. If you have Docker, it runs:

git clone https://github.com/BeckY824/daedalus-crm.git && cd daedalus-crm
docker compose up -d

Open http://localhost:3000 with username admin and password admin123. There is nothing to configure: the session key is generated on first run and kept in the data volume, tables are created automatically, and migrations run themselves on upgrade. Your data is a single SQLite file, on your own machine.

Who it's for

Sales teams of 1–20 people. We originally built it for education and admissions consultancies: customers live in WeChat, deals close on trial classes and referrals, and nobody on the team is going to write SQL. Hence the default vocabulary — student, school / year / major, trial attended, discussing with family.

But the data model underneath is a generic sales funnel: lead → customer → follow-up → deal → signed. So we pulled the wording out of the code and into settings — what a customer is called, what the three profile fields are called, what the dropdowns contain, how statuses display. An admin changes it once and the whole site follows. A design studio renames “student” to “client” and “school” to “company”, and it fits.

Why we moved from SaaS to open source

We spent a while building it the SaaS way: subscriptions, an enterprise tier, multi-tenancy. We stopped for a simple reason — what small teams care about most is who holds their data, and whether they'll have to renew next year. For a five-person agency the customer list is the entire business; putting it on someone else's cloud never sits right. And the cost of deciding whether to renew, every year, is far higher for them than buying once.

Open source and self-hosting solve both at once: the data sits on your server, and the code can be read and changed. AGPL makes sure anyone who modifies it and offers it as a service publishes their changes. We make money on deployment, customisation and the workflow products above it — not by holding data hostage.

AI drafts, it never writes

There are five AI features in the system. They all obey one rule: whatever the AI produces is put in front of a person first, and saving goes through the normal flow after they've checked it. The AI has no path that writes to the database.

FeatureWhereWhat it does
Quick notesNew follow-up dialogDictate or paste a WeChat conversation; AI pre-fills the type, key points, next step and tasks
Pre-call briefCustomer detailOne click before you call: the story so far, where it's stuck, what to raise, and the risks
Ask the dataAnalyticsAsk business questions in plain language. AI only translates the question into a restricted query spec — it never writes SQL
WatchlistDashboardForgotten customers, stalled deals, overdue plans. Detection is pure rules; AI only writes the wording when you click “draft”
Referral radarChannelsWho's bringing you people and who to ask next. Ranking is pure rules; AI only writes the invitation

Why so conservative? Because model output is untrusted input. It will misspell an enum, invent a contact id that doesn't exist, or turn “next Wednesday evening” into an invalid timestamp. So we wrote a sanitising layer: coerce to a value the system recognises where possible, and where that fails leave the field blank for a person to complete — anything rather than let dirty values into the database and poison the statistics. “Ask the data” is stricter still: the model can only emit a restricted query spec (metric, grouping, time range) which the code then executes. Ask it “how many deals will we close tomorrow” and the system answers “that's a forecast, not a query”, rather than querying a future date and reporting “0”.

Which model you use doesn't matter either. Enter an endpoint, key and model name in settings and any OpenAI-compatible API works: DeepSeek, OpenAI, a local Ollama, any proxy. The key is encrypted with the session key before storage, the UI only echoes the last four characters, and database backups contain no plaintext. Configure no key and the AI entry points disappear entirely — everything else works as normal.

Customer detail page
Customer detail (v0.3 interface): follow-up timeline, tasks and next step. The “brief” button only appears when AI is configured. v0.6 has since moved to three panes — profile left, timeline centre, standing AI right.

What “less is more” looks like in the code

It's our product principle, and in this repository it comes down to a few concrete things:

Engineering discipline

Open source means other people read your code and run it on machines you've never seen. A few rules this repository has always kept:

One thing we did before open-sourcing: rebuilt the git history from scratch. Old commits contained server addresses and real employee names, and redaction doesn't mean “fix the latest version” — it means making sure they were never in the repository at all.

What's next

The roadmap is in the repository. Near term: PostgreSQL support and finer-grained permissions. Not planned: a mobile app and multi-tenancy. Issues welcome — especially the “I'm not in education and this term won't rename” kind, because that's exactly what we want to find out.

Daedalus CRM · AGPL-3.0

GitHub ↗ · Deployment docs ↗ · product page
Want us to deploy or customise it for you? Book a demo →