
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.
The replacement is a single self-hosted platform: 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. Open it and try the editor, handoff, and player.
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 I'm the right fit. No pitch. No pressure. In English or Spanish, just a conversation about what you need to build.
Every engagement is scoped and quoted individually. There is no rate card, and no price before I understand the system. The first step is a 30-minute call, in English or Spanish; you leave it with a clear read on scope, sequence, and what the work would take.