SAFI.DEV
Back to Projects
Tailwindcss Typescript VS Code Extension Svelte

VS-CRM: A self-hosted CRM that runs inside VS Code, on a database you own

A VS Code-native CRM with optimistic mutations, realtime sync, and PDF invoices. Powered entirely by the user's own Supabase database, no middleman, no lock-in.

VS-CRM: A self-hosted CRM that runs inside VS Code, on a database you own

Project Overview

vs-crm is a full-featured CRM that runs as a Visual Studio Code extension. It manages clients, leads, projects, tasks, time tracking, invoices (with branded PDF export), expenses, and reports — without ever leaving the editor. Every byte of customer data lives in the user's own Supabase project, not on a server I control.

Under the hood it's a Svelte 5 webview talking to Supabase over the user's own URL and keys (stored in VS Code's OS-level SecretStorage). I built it on top of TanStack Query for caching, optimistic mutations, and live multi-tab sync via Supabase Realtime — the same data layer you'd expect from a polished SaaS product, only the database belongs to whoever installs it.

It ships with auto-applying schema migrations, a one-click onboarding flow that bootstraps a fresh Supabase project, OAuth (Google / GitHub) routed back into VS Code via a custom URI handler, file uploads to a private storage bucket, and a notifications inbox. The whole thing is open source on GitHub — install it, fork it, extend it, host it for your team.

The Challenge

Every CRM I've ever used has the same fundamental problem: it isn't yours.

You sign up for a SaaS CRM and within a quarter you realize you've handed over the most sensitive data your business has — every client, every lead, every invoice, every conversation — to a vendor whose incentives are not aligned with yours. They decide what features ship. They decide what you pay per seat. They decide when the pricing tier you signed up for gets sunset and you get pushed to the one that costs three times more. And if a billing dispute, a TOS interpretation, or just a bad day in their support queue ever goes sideways, they can lock your account and take your operational backbone offline at any moment — leads you can't contact, invoices you can't generate, history you can't export.

The deeper issue is the database. You don't own it. You can't SELECT *. You can't add a column when your workflow needs one. You can't run a custom report the dashboard doesn't expose. You can't migrate to another tool without paying someone to write a one-off ETL — assuming the export endpoint even gives you everything. Your data is in their system, not yours.

On top of all of that, there's the workflow tax: every CRM lives in its own browser tab, away from where the work actually happens. For anyone who spends their day in an editor — developers, indie consultants, technical founders — context-switching to a separate web app to log a client call or send an invoice is friction that compounds every single day.

I wanted a CRM where I owned the database, owned the code, and never left the editor.

The Solution

vs-crm is a CRM you install as a VS Code extension and point at your own Supabase project. That single architectural choice flips every problem above on its head.

You own the database. The extension stores your Supabase URL and keys in VS Code's OS-level SecretStorage and talks directly to your Postgres instance over the wire. There is no vs-crm server, no vs-crm database, no vs-crm middleman. I have zero access to user data. If the project disappeared from the Marketplace tomorrow, every install would keep working — the data is sitting in a Supabase project the user controls, with the standard Postgres dump/restore tooling available to migrate it anywhere.

You own the schema. All tables, RLS policies, and storage buckets are provisioned through versioned SQL migrations bundled with the extension. They auto-apply on activate the first time you connect, and any future schema bundle ships the same way — friction-free upgrades, with the migration history recorded in a _vscrm_migrations table you can inspect and audit. Need a column the product doesn't have? Add it in your Supabase SQL editor; the existing UI keeps working, and you can fork the extension to surface the new field.

You own the code. vs-crm is open source on GitHub: it will be open source soon when i publish it and will share the github link here. Clone it, audit it, fork it, change the brand color, swap in your own currency rules, ship a private build to your team — the whole thing is a normal TypeScript + Svelte 5 codebase with esbuild and a transparent build pipeline. There are no obfuscated binaries and no SaaS dependencies.

It lives inside VS Code. A single command (vs-crm: Open) brings the panel up next to your code. The webview is a real Svelte 5 + Tailwind app — themed against --vscode-* CSS variables so it inherits your editor theme automatically (light, dark, high-contrast all work). OAuth (Google / GitHub) flows back into the editor through a custom URI handler. PDFs save to your file system through VS Code's native dialogs. Notifications surface in a header bell. Every list page has filters and sorting. Optimistic mutations + Supabase Realtime mean changes feel instant and stay in sync across windows.

The result is a CRM that costs you the price of a Supabase project (free tier covers most solo users), can never be taken away, and is one git pull away from being whatever you need it to be.

Project Info

ROLE Lead Developer
TIMELINE 2 Month
YEAR 2026
STATUS
In Progress

Tech Stack

Tailwindcss
Typescript
VS Code
Extension
Svelte
NEXT PROJECT ImageMagick for VS Code: Native image editing inside the editor
View Project
GET IN TOUCH

Let's Build Something Together

Whether you have a project idea, want to collaborate on a web or mobile app, or just say hello

Get in Touch safi.abdulkader@gmail.com