Skip to content

Introduction

CRM is a self-hosted pipeline CRM for internal teams. It tracks contacts and leads, and it records every change in an audit log. The whole system runs as a single binary, with no separate asset directories.

Contacts

One record per client, with multiple phones, emails, tags, statuses, and notes. CSV import and export are included.

Pipeline Kanban

Pipelines have custom stages. Leads move between stages on a kanban board. Each card shows the next task and the last touch.

Activities and Reminders

Each lead has a timeline of tasks: calls, follow-ups, and notes. Quick replies log outcomes and can auto-create the next task. Reminders surface overdue work.

Program Catalog

Fixed-price programs are managed in Settings. Lead values are price snapshots at creation time, so later price changes do not affect existing leads.

Role-Based Access Control

Custom roles carry per-action permissions on contacts, leads, pipelines, users, and settings. A superadmin account is created on first run.

Audit Log

Every change is recorded with the user, the time, and a JSON diff. The activity feed shows the whole team what happened.

Secure Sessions

Short-lived access tokens, a refresh cookie, and CSRF protection keep sessions safe. Login and refresh are rate-limited.

Single Binary

The Go backend contains the Vue frontend and the database migrations. Deploy with one docker compose command.

  • Go 1.25+ with the chi router and pgx. Raw SQL, no ORM.
  • PostgreSQL 17 for data storage. golang-migrate runs the migrations at startup.
  • JWT for authentication, with refresh cookies and CSRF protection.
  • Vue 3 with the Composition API and TypeScript.
  • Vite for build tooling.
  • Tailwind CSS v4 and shadcn-vue for styling and UI components.
  • Pinia and TanStack Query for state management.
  • Docker Compose for one-command deployment.
  • stuffbin packs the frontend and migrations into the binary.