A city skyline at sunset, drawn from small code characters

The CRM that finds
its own leads

Open source CRM that runs on your computer. Ask the AI for leads and they are saved straight to your CRM.

Runs on
Built with

Lead engine

Interactive demo sample data
Companies+ New Company
All CompaniesFilterSortOptions

Find the companies that fit you, straight from the live web, with one plain-English prompt.

Bring your own AI

Use Claude, ChatGPT, Gemini, OpenRouter or Groq with your own key, or run a local model with Ollama and pay nothing. Tap a logo.

Keys are added in Settings, AI Providers.

Search the live web

Add a Firecrawl, Tavily, Brave or SerpApi key and OS20 reads real company websites, not a database that went stale last year.

Only real company websites

Search results are full of directories, "top 10" articles and duplicates. OS20 drops those first, then reads each company's own site.

Workflows

Live preview your prefilled workflow
Workflows / Create company when adding a new person Draft
+ Add a Node See Runs Test

Select a trigger

Record is created or updated Record is deleted On a schedule Webhook Launch manually
TriggerRecord is created or updated

Automate the busywork. Workflows react to your records so you do not have to.

Talk to your CRM

Ask AI works with the same records you see. Find leads, look up a company or create records by asking in plain words.

Triggers and actions

Start a workflow when a record changes, on a schedule, from a webhook or by hand. Then create or update records, send email, call an API or run code.

Local models with Ollama

No API key at all? Run Ollama on the same machine and OS20 picks it up. Your prompts and records stay on your computer.

CRM

Interactive demo drag the cards
Opportunities+ New Opportunity
By StageFilterSortOptions

Every lead, person and deal in one place, on your machine and in your database.

Companies, people and deals

The standard CRM objects, with table and board views, filters, and a REST and GraphQL API. Click one to see its fields.

    Dashboards

    Build charts from your own records, like deals by stage or companies added each week.

    Your data stays yours

    Everything lives in a Postgres database inside Docker on your computer. No account, no login, ports bound to 127.0.0.1.

    Every model, every search API, one CRM.

    Claude ChatGPT Gemini OpenRouter Groq Ollama
    Firecrawl Tavily Brave Search SerpApi Docker PostgreSQL

    zero login, runs on localhost, encrypted keys, live lead search, fit scoring, people and companies, workflows, dashboards, REST and GraphQL API, local AI models

    Free and open source under AGPL-3.0. One command to install.

    View on GitHub

    Built by one person

    No team, no investors, no sales call. Just the code on GitHub and me, if you want to talk.

    Om Yaduvanshi
    Om Yaduvanshi Founder of OS20 · 18 · India

    Why I built it

    I wanted a CRM that finds leads for me, runs on my own laptop and doesn’t charge a monthly fee to hold my own data. I couldn’t find one that did all three, so I built it.

    What it does

    You ask for leads in plain words. It searches the web, reads each company’s site, scores the fit and saves the good ones to your CRM, with real contacts and a first email ready to edit.

    Before OS20

    • git11AI docs and codebase Q&A for GitHub teams
    • CloudlinePrivacy-first Google Analytics alternative, no cookies

    Questions

    Everything you need to know before you install.

    Docker Desktop (or Docker Engine on Linux) and Node.js 18 or newer. Then run npx os20-cli and open localhost:3010.

    Yes. OS20 is open source under AGPL-3.0. You only pay your own AI or search provider, and local Ollama models cost nothing.

    In a Postgres database inside Docker on your computer. OS20 has no cloud account and sends nothing to us.

    Claude, ChatGPT, Gemini, OpenRouter, Groq and any local Ollama model. For search: Firecrawl, Tavily, Brave or SerpApi. A search key is optional but gives steadier results.

    No. OS20 opens straight into your workspace on localhost.