Open-source CRM for founders who sell their own product. Every feature request carries the revenue riding on it.
Explore the docs »
Report Bug
·
Request Feature
Table of Contents
demo.mp4
You're a founder, and you're the one selling. Five to forty live deals, no sales team, nobody to keep a CRM tidy.
So you're using a spreadsheet. Or a Notion board you update on Fridays. Or a HubSpot account you set up once and abandoned the moment it asked you to configure lead scoring.
Relivo is a CRM for that. Not a scaled-down sales platform — a tool built from the start for one person who has to remember what they promised, to whom, and by when.
It tells you what to do next. Every deal on the board shows its next step right on the card, so the pipeline reads as a to-do list instead of a filing cabinet. A single screen collects every open next step across every deal, sorted by when it's due. That's your morning.
Your feature requests carry the money riding on them. This is the part no other tool does. When a prospect says "we'd need audit log export before we could sign," you log it against their deal — and the request now shows the combined value of every deal waiting on it.
Configurable Retention Policy — $288.0Koutranks the thing twelve people upvoted but nobody would pay for.
When you ship it, Relivo hands you back the list of deals that were blocked, so you actually go and close them. Your CRM knows your roadmap; your roadmap knows your pipeline.
The AI has read every note on the deal. Ask "why did this stall?" or "who owns implementation on their side?" and get an answer with a link to the note it came from. It drafts your next steps from what actually happened on the last call, and it spots when a new piece of feedback is the one you already logged three weeks ago in different words.
It gets out of your way. ⌘K from anywhere. Type a domain and the company fills itself in. No required fields, no setup wizard, no forty-column table.
They're built for sales teams — forecasting, lead scoring, quota tracking, reporting, and a settings page for each. All of it assumes someone whose job is keeping the CRM clean. You don't have that person; you're the one on the calls, and admin is the first thing to go. Two months later the CRM is a graveyard of half-filled fields and the deals are back in your head.
Relivo does less on purpose. No lead scoring, no marketing automation, no email sequencer, no forecasting dashboards, no quota tracking. The pipeline starts at qualified and ends at closed. Everything outside that competes with tools that already do it better, and every one of them is a settings page you'd have to learn.
The trade cuts both ways, so plainly: if you hire a sales team, go use one of them. Relivo isn't trying to be your CRM at forty people. Import from HubSpot and Attio is on the roadmap, and the data underneath is a Postgres you own — moving in or out is a database, not a negotiation.
What none of them do, at any price or team size, is tell you which feature request has $288K of pipeline waiting on it. A CRM doesn't know your roadmap; a feedback tool doesn't know your pipeline. You're the one holding both.
Self-hosted, AGPL-3.0, your data in your own Postgres.
Status: early, and honest about it. The monorepo, database, API, job queue and component library are in place; most of what's described above is not built yet. See the Roadmap for exactly where things stand.
Relivo is a Turborepo monorepo. Everything runs locally: a Postgres container with pgvector, a Redis container for the job queue, the web app, and a worker process.
- Node.js 18 or newer
- pnpm 9 — the version is pinned in
packageManager, so Corepack is enoughcorepack enable - Docker — for Postgres and Redis
- Clone the repo
git clone https://github.com/dager-mohamed/relivo.git cd relivo - Install dependencies
pnpm install
- Create your environment file from the example
cp .env.example .env
- Fill in the auth variables in
.env— see Google sign-in below# a 32-character minimum secret; this prints one openssl rand -base64 32 - Start Postgres and Redis
docker compose up -d
- Create the schema and insert a sample row
pnpm --filter @repo/db db:migrate pnpm --filter @repo/db db:seed
- Start the app and the job worker together
pnpm dev
The app runs on http://localhost:3000. Postgres is published on host port 5434 and Redis on 6379 — the Postgres port is deliberately not 5432, to avoid colliding with a local install.
Google OAuth is currently the only way to sign in. Without credentials the app still starts, but the sign-in page has nothing to offer, so set these up before pnpm dev.
- Open the Google Cloud console and select a project, or create one.
- Configure the OAuth consent screen: type External, an app name, and your own address for the support and developer contact fields. While the app is unpublished, add yourself under Test users — Google blocks everyone else.
- Go to Credentials → Create credentials → OAuth client ID, and choose Web application.
- Under Authorised redirect URIs add exactly:
Deployments add their own origin with the same
http://localhost:3000/api/auth/callback/google/api/auth/callback/googlepath. A mismatch here is what produces Google'sredirect_uri_mismatcherror. - Copy the client ID and client secret into
.env:GOOGLE_CLIENT_ID=<client id>.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=<client secret>
.env is read at server start, so restart pnpm dev after editing it. The full variable list, with comments, is in .env.example.
| Variable | Required | What it is |
|---|---|---|
DATABASE_URL |
yes | Postgres connection string; matches docker-compose.yml |
REDIS_URL |
yes | Redis connection string for the BullMQ queue |
BETTER_AUTH_SECRET |
yes | Signs and encrypts sessions, 32 characters minimum. Changing it signs everyone out |
BETTER_AUTH_URL |
yes | The app's own origin — http://localhost:3000 in development |
GOOGLE_CLIENT_ID |
no | From the steps above. Set both Google values or neither |
GOOGLE_CLIENT_SECRET |
no | From the steps above |
pnpm dev starts two long-running processes: the TanStack Start app and the BullMQ worker. Run everything else from the repo root.
pnpm dev # app on :3000 + jobs worker
pnpm build # build every package
pnpm check-types # typecheck the whole workspace
pnpm format # prettierChanging the database schema means editing packages/db/src/schema.ts, then generating and applying a migration. Generated SQL is committed and reviewed like any other change.
cd packages/db
pnpm db:generate # diff the schema, write drizzle/NNNN_*.sql
pnpm db:migrate # apply pending migrations
pnpm db:studio # browse the dataUse
generate+migrate, notpush, on any database that matters. Push rewrites schema without recording a snapshot, so a latergeneratediffs against a stale baseline — and it regenerates HNSW index DDL without the operator class pgvector requires.
The API is end-to-end typed: a column renamed in the Drizzle schema surfaces as a type error in the React component that reads it, with no type wiring in between.
import { useQuery } from "@tanstack/react-query";
import { useTRPC } from "#/integrations/trpc/react";
const trpc = useTRPC();
const { data } = useQuery(trpc.companies.list.queryOptions());Adding a UI component uses the shadcn CLI from inside the component package, which is built on Base UI primitives rather than Radix.
cd packages/ui
pnpm dlx shadcn@latest add <component>Architecture and conventions live in CLAUDE.md. Product behaviour lives in PRODUCT.md. The reasoning behind each technical choice — and what was rejected — lives in DECISIONS.md.
Grouped the same way the work is tracked. Checked items are merged and working.
Items tagged MVP make up the first release — the smallest version a founder could actually run their pipeline on. Foundation is already merged; everything else tagged below is what remains.
Four of those items are the entire reason to switch. Two make feedback carry revenue:
- Link feedback to deals and companies
- Deal value rollup per feedback item and per status group
Two make the pipeline read as a to-do list instead of a filing cabinet:
- Deal card showing value, close date, contact and next step
- Next Steps hub across all deals, sorted by due date
Everything else tagged MVP exists to make those four usable. Everything untagged waits until they are real.
- Turborepo monorepo with pnpm workspaces
- TanStack Start app scaffold
- shadcn/ui, Tailwind and design tokens
- tRPC server and client with TanStack Query
- Drizzle ORM and Postgres with pgvector
- Redis and BullMQ worker process
- Shared zod schema package
- ESLint, Prettier, TypeScript strict mode and CI
- Google OAuth authentication MVP
- Email and password authentication MVP
- Workspace model and multi-workspace switching MVP
- Member invites and roles
- Workspace-scoped tRPC middleware and row-level access checks MVP
- Seeded demo sandbox workspace for new signups MVP
- Company schema and enrichment fields MVP
- Person schema and company relations MVP
- Deal schema with stages, value, close date and owner MVP
- Feedback schema with upvotes and deal links MVP
- Next Step schema MVP
- Note and Activity event schema for the unified timeline MVP
- pgvector embeddings table with HNSW index migration
- AI usage metering table for token and cost logging MVP
- App shell layout with collapsible sidebar sections MVP
- Companies list view with filters MVP
- Company record page with properties panel MVP
- People list view and person record page MVP
- Unified activity timeline mixing system events and user notes MVP
- Rich text note editor with bullets, mentions and link detection MVP
- Favorites sidebar with pinning and drag reorder for any record type
- Deal CRUD router with sequential deal IDs MVP
- Kanban board grouped by stage MVP
- Deal card showing value, close date, contact and next step MVP
- Drag and drop between stages with optimistic updates MVP
- Per-stage value rollups and deal counts in column headers MVP
- Deals table view with sorting and column config
- Deal detail page with timeline and linked records MVP
- Configurable pipeline stages in settings
- Next Step CRUD router with due dates and completion MVP
- Next Steps hub across all deals, sorted by due date MVP
- Snooze and overdue surfacing
- Feedback CRUD router with status workflow MVP
- Feedback board grouped by status with Open and Closed tabs MVP
- Link feedback to deals and companies MVP
- Deal value rollup per feedback item and per status group MVP
- Upvote and request count tracking
- Feedback panel on company and deal record pages MVP
- Command palette with jump-to and create actions MVP
- Global full text search across all record types
- Keyboard shortcut system and shortcuts help dialog
-
packages/aiwith AI SDK 7 and provider setup MVP -
defineTaskabstraction for all AI features MVP - Deal context builder MVP
- On-disk response cache for local development MVP
- Eval harness with fixture deals and Vitest assertions MVP
- Token and cost logging on every AI call MVP
- Rate limiting, retry policy and spend guardrails for AI jobs MVP
Deliberately outside the MVP. The v0.1 AI feature runs on structured data small enough to pass in a prompt, so none of this is needed until deal coaching arrives.
- Local embedding model via fastembed
- Chunking by semantic unit with content hashing
- BullMQ embedding job triggered on note and email writes
- Hybrid search combining
tsvectorand vector similarity with RRF - Metadata filtering by deal, company and date before vector search
- Backfill and reindex command for existing records
- Paste a meeting transcript to extract feedback and next steps MVP
- Review panel for extracted items, each showing the quote it came from MVP
- Feedback matching to suggest links to existing requests MVP
- Suggested next steps with structured output
- Suggested next steps UI with bulk accept and reject
- Deal coaching streaming endpoint
- Deal coaching chat UI with citations
- AI tools to query deals, people and next steps
- Deal summary and "what changed this week" digest
- Momentum view ranking deals by attention needed
- Playbooks with relative timing and conditional automations
- Gmail and Outlook sync onto the deal timeline
- BCC-to-Relivo address for email-first deal capture
- Calendar integration for meetings on the timeline
- Meeting bot joining calls for automatic transcripts, via Vexa
- Company enrichment by domain with logo fetching
- Bidirectional Plane sync for feedback items
- Slack notifications
- Production Docker Compose for self-hosting MVP
- Environment variable reference MVP
- Deployment guide MVP
- Contributing guide and code of conduct
- CSV, HubSpot and Attio import
Deferred until the core is real: custom fields, public API and webhooks, Arabic/RTL support.
See the open issues for a full list of proposed features (and known issues).
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Distributed under the GNU Affero General Public License v3.0. See LICENSE for more information.