Tools Project — Self-Hosted Project Management Hub
A Linear/Jira alternative with CRM, Kanban, and GitHub sync — replacing four SaaS tools with one self-hosted platform
Most growing teams stitch together Jira for tickets, Linear for tasks, HubSpot for CRM, and Notion for docs — each with its own auth, its own data model, and its own monthly bill. The fragmentation creates context-switching, data silos, and escalating cost.
I built a single self-hosted platform that replaces all of it: one FastAPI backend with 20 router modules and 14 service modules, one PostgreSQL database with 21 tables, one Next.js frontend — and deliberately no Redis, no Celery, no message queue.
The Problem
The team was paying for and context-switching between four SaaS tools to manage projects, tasks, support tickets, and client relationships. Each had its own authentication, its own data model, and limits on customization: you couldn't add GitHub commit cross-references to a support ticket, or automatically promote a won prospect to a client record with granular project access controls.
For a team that wanted to own its data, the SaaS fragments were also a sovereignty problem — the operational memory of the company lived across four vendors.
The Approach
A deliberately monolithic-by-service, modular-by-module architecture. FastAPI backend (20 routers, 14 service modules), PostgreSQL 16 (21 tables, idempotent versioned SQL files — no Alembic), Next.js 16 with the App Router.
The architectural decisions that did the heavy lifting: - Dual-mode auth — local email/password via bcrypt + JWT, and OAuth/SSO via PKCE — without Redis. Signed PKCE state tokens live in HTTP-only cookies. - Polymorphic activity feed with @mention parsing and idempotent upserts. - Atomic human-readable refs ('PRJ-123', 'PRJ-T-45') generated via PostgreSQL 'UPDATE...RETURNING' counters. - 4-tier RBAC (owner, maintainer, contributor, viewer) plus a separate granular client-access model. - GitHub integration with encrypted PAT storage (Fernet symmetric encryption) and a background asyncio poll loop for commit sync — no Celery, no Redis. - MIME sniffing on file uploads (inspect leading bytes, never trust Content-Type headers). - Caddy reverse proxy routing API ('/v1/*', '/healthz') vs web (everything else). - Multi-stage Docker builds running as a non-root user in production.
The Outcome
A production-ready internal operations platform that replaced 4+ SaaS tools with a single self-hosted solution:
- Project management with Kanban boards, components, and subtasks. - Support ticket queues with SLA tracking and queue routing. - A complete CRM pipeline from prospect targeting through won-to-client promotion. - A client portal with granular per-project access controls. - GitHub integration with automatic commit sync and cross-referencing to tasks/tickets. - A user inbox for quick capture with triage-to-task/ticket workflow. - Global stats and pipeline analytics with Excel export. - Both dev and production Docker Compose profiles with healthchecks on every service.
Key Takeaway
A well-designed PostgreSQL monolith with modular routers, asyncio, and idempotent SQL can replace an entire SaaS stack — without Redis, without Celery, and without the operational tax of each thing you add.
Ready to Build Your Platform?
One 30-minute call to see if we're a fit. No pitch. No pressure. Just a conversation about what you need to build.
$20K–$25K for an MVP. $30K–$80K for a full platform. Fixed price, milestone-gated. 50% upfront.