✅
Task Management
Full task system with status, priority, labels, rich-text descriptions, image attachments, and assignees. JIRA-style create/edit dialogs with filters and pagination.
Kanban-readyRich textAttachmentsFilters
🏢
Multi-Organization
Multiple workspaces per user with instant sidebar switching — ideal for SaaS. Building a single product? Run one default org and skip multi-tenant UI. Full role system (owner, admin, member) with permission-based routes.
RolesWorkspacesInvitations
👥
Team & Invitations
Invite members by email with a full accept-invitation flow. Supports Google OAuth or email/password onboarding. Assign roles when inviting; manage members from org settings.
Email inviteGoogle OAuthRole mgmt
🎭
Roles & permissions
Three org-level roles, enforced in UI and API: Owner — full control (billing, Stripe portal, org settings, member admin, destructive actions). Admin — manage members and invites, workspace settings, no billing ownership. Member — standard access to tasks, tickets, and day-to-day features. Plus a separate platform Superadmin area (your ops only) to list all orgs, plans, and usage — not visible to customers.
OwnerAdminMemberSuperadmin
💳
Stripe Billing
Per-organization subscriptions (Starter / Pro) wired to Stripe — perfect for SaaS. For a single product you can disable billing or use one fixed plan. Customer Portal, webhooks, and Pro-only route gating included.
StripePro gatingCustomer Portal
🎫
Support Tickets
Built-in help center with rich-text tickets, image attachments, ticket types and statuses. Full reply threads with email notifications via Resend to admins and participants.
ResendThreadsNotifications
🔐
Auth & Accounts
Email/password + Google OAuth. Sign-up with email verification, forgot password via OTP, profile management, language, appearance, and T&C acceptance on invite flow.
OTPGoogle OAuthVerification
📱
PWA & Mobile
Installable Progressive Web App with standalone mode, custom icons, and theme colors. Settings panel with install prompt and step-by-step instructions for all platforms.
PWAInstallableMobile-first
🌍
i18n Ready
Multi-language support built in. Ships with English, Polish, and Ukrainian. Add any language with standard i18n patterns. Language preference stored per user profile.
EN / PL / UAPer-user lang
🛡️
Superadmin Panel
Separate platform-level admin panel. List all organizations, plans, billing period ends, and member counts. Not customer-facing — for your internal ops and oversight.
Platform adminOrg overview
🐳
Docker Deployment
Ship as a single container (API + frontend on one port) or split into separate API and frontend images for independent scaling, CDN delivery, or worker hosting. Includes a ready-to-use Dockerfile (or compose service) to spin up a local database for development — no cloud Postgres required on your machine. Pairs with the GitHub Actions workflow below for automated builds.
Single imageSplit deployDev DB containerCoolify-ready
🔄
GitHub Actions & CI/CD
Workflow included: build and push the single-container image to **GHCR** on every push to **develop** (Staging) or **master** (Production). GitHub **Environments** (Staging / Production) isolate secrets and variables per stage. Images are tagged e.g. `latest` + versioned tags for prod, `Staging` + version/SHA for preview. After push, optional **Coolify webhook** steps (GET + bearer token) trigger redeploy — separate webhook URLs for Production vs Staging. Dockerfile build-args map from env secrets/vars (DB, auth, Stripe, Firebase, Resend, etc.).
GHCRStaging + ProductionCoolify webhookEnvironments
⚙️
User Settings
Full settings suite: profile, account preferences, appearance (light/dark), notification controls, and mobile PWA install. All persisted and synced to the user's account.
Dark modePreferencesProfile
📄
Core pages & app shell
Ready-made routes you can extend instead of wiring from zero: authenticated dashboard home, org-aware layout and navigation, dedicated chat experience, plus polished error handling — global error boundary, not-found (404), and optional loading states. Consistent shell across modules so users always land in a familiar frame.
DashboardChat page404 / errorsLoading
🔔
Messages & conversation areas
Structured UI for communication: help center ticket threads (customer ↔ team), reply composers, and scrollable conversation panels. Push notifications use Firebase Cloud Messaging — device registration, support ticket updates, in-app and background delivery, and per-user preferences — with matching UI: explainers when alerts are off, permission prompts, and copy that walks users through enabling FCM. Reuse the same patterns for chat, tickets, and system messaging.
Help centerTicket threadsFCMComposers
🔌
External services, wired in
Best-in-class providers behind clean adapters — not DIY mail servers or file storage. Resend for transactional and ticket email, Cloudinary for uploads and image delivery, Stripe for billing and webhooks, Firebase Cloud Messaging for push, and PostgreSQL (e.g. Neon) as the system of record. Everything is env-driven so you can rotate keys, swap regions, or extend with your own providers without rewriting product code.
ResendCloudinaryStripeFCMPostgres
📈
Ready to scale
Org-scoped data, pagination, and stateless API patterns so you can run multiple app instances behind a load balancer. Split the monolith into separate API and frontend containers when traffic grows; keep static assets on a CDN; lean on managed Postgres and external services for elastic capacity. CI/CD and Docker workflows are set up so staging and production can grow with your team — from first users to serious load.
Horizontal scaleStateless APICDN-friendlyManaged DB
🧪
Automated tests
Vitest unit coverage for pure helpers (help-center HTML strip / reply excerpts), Cloudinary config and upload mocks, Resend email creation and validation, the email service singleton, mocked-DB ticket and task listing, notification routing to superadmins, and task input normalization. Integration suites (real PostgreSQL + DATABASE_URL) run full help-center and task flows with seeded org data and cleanup.
VitestUnitIntegrationPostgreSQL