Back to Projects
Full Stack

Beacon – Project Management

A multi-tenant SaaS platform that takes software agencies from first quote to final payment. Clients, projects, tasks, estimates, time tracking, team chat, and seat-based Stripe billing all live in one workspace. Built solo, end to end, in TypeScript.

TypeScript React Vite Node.js Express Prisma PostgreSQL Tailwind CSS GSAP Stripe Supabase JWT

Beacon is a multi-tenant SaaS platform for agencies and dev shops to estimate, manage, and bill client project work — from the first quote to the final payment.

Small software agencies juggle clients, project estimates, tasks, developer time, and invoicing across a mess of disconnected tools. Beacon unifies all of it into one platform. A company signs up, invites its team, and runs the entire delivery lifecycle in one place: clients → projects → tasks → estimates → tracked time → payments, with built-in team chat and notifications.

The Problem

The people doing agency work rarely have a single source of truth. Estimates live in spreadsheets, tasks live in one tool, time tracking in another, chat in a third, and invoicing somewhere else entirely. Context is constantly lost in the gaps between those tools, and nobody can see the whole picture of a project from quote to payment.

The Solution

Beacon gives each organization one isolated workspace that covers the full delivery lifecycle. An admin self-registers, chooses a plan, and invites teammates by email; from there the team manages clients, spins up projects and tasks, estimates the work, tracks time against it, and gets paid — without ever leaving the app. Team chat and notifications are built in, so conversations stay attached to the work they are about.

Core Features

  • Multi-tenant workspaces — every organization is fully isolated; one company’s data can never leak into another’s.
  • Role-based access — Admin, Manager, and Developer roles with per-organization permissions.
  • Onboarding by invitation — the admin registers and picks a plan, then invites teammates by email. Invitees follow a secure tokenized link to set their own password under the company — no shared credentials.
  • Clients, Projects & Tasks — with three task views: a grouped List, a drag-and-drop Kanban Board, and a planning Calendar (drag tasks onto days, with due-date handling).
  • Estimations workflow — developers submit hour/cost estimates; managers approve or reject; time is logged against approved estimates, or directly to tasks and projects.
  • Time tracking — start/stop timers with a live countdown in the browser tab, plus manual entries and one-click “log time” straight from task rows and cards.
  • Payments — developer payment calculation derived from tracked time and estimates.
  • Team chat — direct messages and group chats, including groups attached to a client, project, or task; image attachments, edit/delete, unread badges, and full-text message search that jumps you to the exact matching message.
  • Notifications — deadline reminders and activity alerts with read/unread state synced live across the app.
  • Subscription billing — seat-based Stripe subscriptions with a free trial. When a trial lapses without payment, a paywall gate locks access while preserving all data; paying restores everything instantly.
  • Deep customization — a drag-and-drop sidebar builder (reorder tabs, group them into dropdowns, hide any), dark mode, table density, per-user timezone, and notification preferences.

Tech Stack

  • Language: TypeScript, end to end.
  • Backend: Node.js + Express, Prisma ORM, PostgreSQL.
  • Frontend: React 18 + Vite + Tailwind CSS, with GSAP for interface animation.
  • Auth: JWT + bcrypt.
  • Infrastructure: Supabase (managed Postgres), Render (hosting), Stripe (billing), Cloudflare R2 / S3 (file storage), Resend (transactional email).

Engineering Highlights

A few pieces I’m particularly happy with (the multi-tenant architecture gets its own breakdown below):

  • Fail-closed subscription enforcement. Business routes return 402 the moment a trial expires without payment, but auth and billing routes stay open so a locked-out admin can still log in and pay. No customer data is ever deleted on lapse.
  • Env-gated integrations. Stripe, email, and object storage are all optional. The app boots and runs in any environment and only lights up the features that are actually configured.
  • Real-time-feel chat without WebSockets. Polling combined with an internal event bus keeps state in sync across components, so unread badges, message lists, and the notification/chat state all update together.
  • Rich drag-and-drop UIs on native HTML5 DnD. The Kanban board (with precise reordering), the planning calendar, and the sidebar builder all handle drop targets, insertion indices, and optimistic updates carefully.

My Role

Solo full-stack developer. I designed and built the entire product end to end — the data model, the backend API, the multi-tenant architecture, the frontend, the billing integration, and the deployment.