Skip to content

Latest commit

 

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Contributors Forks Stargazers Issues project_license


Relivo

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
  1. About The Project
  2. Getting Started
  3. Usage
  4. Roadmap
  5. Contributing
  6. License
  7. Contact
  8. Acknowledgments

About The Project

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.

What makes it different

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.0K outranks 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.

Why not HubSpot or Zoho

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.

(back to top)

Built With

  • TypeScript
  • React
  • TanStack
  • Vite
  • tRPC
  • Drizzle
  • Postgres
  • Redis
  • Tailwind
  • Turborepo
  • Docker

(back to top)

Getting Started

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.

Prerequisites

  • Node.js 18 or newer
  • pnpm 9 — the version is pinned in packageManager, so Corepack is enough
    corepack enable
  • Docker — for Postgres and Redis

Installation

  1. Clone the repo
    git clone https://github.com/dager-mohamed/relivo.git
    cd relivo
  2. Install dependencies
    pnpm install
  3. Create your environment file from the example
    cp .env.example .env
  4. Fill in the auth variables in .env — see Google sign-in below
    # a 32-character minimum secret; this prints one
    openssl rand -base64 32
  5. Start Postgres and Redis
    docker compose up -d
  6. Create the schema and insert a sample row
    pnpm --filter @repo/db db:migrate
    pnpm --filter @repo/db db:seed
  7. 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 sign-in

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.

  1. Open the Google Cloud console and select a project, or create one.
  2. 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.
  3. Go to Credentials → Create credentials → OAuth client ID, and choose Web application.
  4. Under Authorised redirect URIs add exactly:
    http://localhost:3000/api/auth/callback/google
    
    Deployments add their own origin with the same /api/auth/callback/google path. A mismatch here is what produces Google's redirect_uri_mismatch error.
  5. 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

(back to top)

Usage

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         # prettier

Changing 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 data

Use generate + migrate, not push, on any database that matters. Push rewrites schema without recording a snapshot, so a later generate diffs 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.

(back to top)

Roadmap

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.

Foundation and project setup

  • 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

Auth, workspaces and members

  • 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

Core data model

  • 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

Records — Companies, People, Activity

  • 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

Deals and pipeline

  • 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 Steps

  • 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 and revenue loop

  • 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

Navigation, search and command palette

  • Command palette with jump-to and create actions MVP
  • Global full text search across all record types
  • Keyboard shortcut system and shortcuts help dialog

AI layer — foundations

  • packages/ai with AI SDK 7 and provider setup MVP
  • defineTask abstraction 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

AI layer — retrieval and embeddings

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 tsvector and vector similarity with RRF
  • Metadata filtering by deal, company and date before vector search
  • Backfill and reindex command for existing records

AI layer — features

  • 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

Integrations

  • 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

Open source and deployment

  • 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).

(back to top)

Contributing

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!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

(back to top)

Top contributors:

contrib.rocks image

License

Distributed under the GNU Affero General Public License v3.0. See LICENSE for more information.

(back to top)

About

Open-source CRM for founders who sell their own product.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages