
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.
See it live
This isn't a screenshot. This is the actual app — running in production, right now. Log in and browse the project, tasks, activity feed, and client portal view.
See it liveKey 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.
Most engagements start with a bounded architecture diagnostic: $5,000 to $12,000, 1 to 3 weeks. Fixed-price platform builds: $20,000 to $80,000, milestone-gated, 50% deposit. Fractional CTO: $6,000 to $10,000 per month, 90-day minimum.