GitPedia

Docs.plus

A real-time community collaboration platform

From docs-plusยทUpdated June 18, 2026ยทView on GitHubยท

docs.plus is a free, real-time collaboration tool built on open-source technologies. It empowers communities to share and organize information logically and hierarchically, making teamwork and knowledge sharing straightforward and effective. The project is written primarily in TypeScript, distributed under the MIT License license, first published in 2020. Key topics include: collaboration, collaborative-framework, collaborative-research, collaborative-writing, document.

Latest release: v2.0.0-alpha.103

๐Ÿ“š docs.plus

Version
License
PRs Welcome
Discord
Supabase
Bun

docs.plus is a free, real-time collaboration tool built on open-source technologies. It empowers communities to share and organize information logically and hierarchically, making teamwork and knowledge sharing straightforward and effective.

๐Ÿ—๏ธ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                              CLIENT LAYER                                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                              โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚   โ”‚     Webapp       โ”‚    โ”‚  Admin Dashboard โ”‚    โ”‚  TipTap Extensions โ”‚   โ”‚
โ”‚   โ”‚    (Next.js)     โ”‚    โ”‚    (Next.js)     โ”‚    โ”‚  hyperlink, media  โ”‚   โ”‚
โ”‚   โ”‚    Port 3000     โ”‚    โ”‚    Port 3100     โ”‚    โ”‚   indent, code     โ”‚   โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚            โ”‚                       โ”‚                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚ HTTP/WS               โ”‚ HTTP
             โ–ผ                       โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                             BACKEND LAYER                                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                              โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚
โ”‚   โ”‚    REST API      โ”‚    โ”‚    WebSocket     โ”‚    โ”‚     Worker       โ”‚     โ”‚
โ”‚   โ”‚     (Hono)       โ”‚    โ”‚   (Hocuspocus)   โ”‚    โ”‚    (BullMQ)      โ”‚     โ”‚
โ”‚   โ”‚    Port 4000     โ”‚    โ”‚    Port 4001     โ”‚    โ”‚    Port 4002     โ”‚     โ”‚
โ”‚   โ”‚                  โ”‚    โ”‚                  โ”‚    โ”‚                  โ”‚     โ”‚
โ”‚   โ”‚  โ€ข Auth          โ”‚    โ”‚  โ€ข Real-time     โ”‚    โ”‚  โ€ข Doc storage   โ”‚     โ”‚
โ”‚   โ”‚  โ€ข Documents     โ”‚    โ”‚    collaboration โ”‚    โ”‚  โ€ข Email queue   โ”‚     โ”‚
โ”‚   โ”‚  โ€ข Workspaces    โ”‚    โ”‚  โ€ข Y.js sync     โ”‚    โ”‚  โ€ข Push notifs   โ”‚     โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚
โ”‚            โ”‚                       โ”‚                       โ”‚                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚                       โ”‚                       โ”‚
             โ–ผ                       โ–ผ                       โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                              DATA LAYER                                      โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                              โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚   โ”‚         PostgreSQL            โ”‚    โ”‚            Redis              โ”‚   โ”‚
โ”‚   โ”‚         (Supabase)            โ”‚    โ”‚                               โ”‚   โ”‚
โ”‚   โ”‚         Port 5432             โ”‚    โ”‚         Port 6379             โ”‚   โ”‚
โ”‚   โ”‚                               โ”‚    โ”‚                               โ”‚   โ”‚
โ”‚   โ”‚  โ€ข Users & Auth               โ”‚    โ”‚  โ€ข Job queues (BullMQ)        โ”‚   โ”‚
โ”‚   โ”‚  โ€ข Documents & Workspaces     โ”‚    โ”‚  โ€ข Pub/Sub (WS sync)          โ”‚   โ”‚
โ”‚   โ”‚  โ€ข Realtime subscriptions     โ”‚    โ”‚  โ€ข Session cache              โ”‚   โ”‚
โ”‚   โ”‚  โ€ข Row Level Security         โ”‚    โ”‚  โ€ข Rate limiting              โ”‚   โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                           โ”‚ Supabase Studio โ”‚
                           โ”‚  Port 54323     โ”‚
                           โ”‚  (Dev only)     โ”‚
                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Monorepo Structure:

  • ๐ŸŒ apps/webapp - Next.js frontend with TipTap editor
  • ๐Ÿ–ฅ๏ธ apps/admin-dashboard - Admin panel for platform management
  • โšก apps/hocuspocus.server - REST API, WebSocket server, and background workers
  • ๐Ÿ—„๏ธ packages/supabase - Database migrations and Supabase configuration
  • ๐Ÿ”Œ extensions/extension-* - Five publishable TipTap extensions (hyperlink, hypermultimedia, indent, inline-code, placeholder) under the @docs.plus npm scope โ€” see extensions/README.md
  • ๐Ÿ“ฆ packages/eslint-config - Shared ESLint configurations

Tech Stack:

  • Runtime: ๐Ÿš€ Bun 1.3.7+
  • Frontend: โš›๏ธ Next.js 15/16, React 19, TipTap 3, Tailwind CSS 4
  • Backend: ๐Ÿ”ง Hono, Hocuspocus (Y.js), BullMQ, Prisma ORM
  • Database: ๐Ÿ˜ PostgreSQL 17, ๐Ÿ”ด Redis
  • Infrastructure: ๐Ÿณ Docker Compose, Supabase
  • Real-time: ๐Ÿ”Œ WebSocket (Hocuspocus), Supabase Realtime

๐Ÿ“‹ Prerequisites

  • ๐Ÿณ Docker & Docker Compose v2+ - Install
    • โš ๏ธ macOS Silicon users: Docker Desktop has IO performance issues. Use OrbStack instead (drop-in replacement, faster, lighter).
  • ๐Ÿš€ Bun >=1.3.7 - Install
  • ๐Ÿ—„๏ธ Supabase CLI - Install

๐Ÿš€ Quick Start

1๏ธโƒฃ Clone & Install

bash
git clone https://github.com/docs-plus/docs.plus.git cd docs.plus bun install

2๏ธโƒฃ Environment Configuration

Create environment files based on your development mode:

bash
# Required: Create .env.development first (used by Docker dev and as base for local dev) cp .env.example .env.development

Environment File Mapping:

Docker Compose FileEnvironment FileUsage
docker-compose.prod.yml.env.productionProduction deployment
docker-compose.dev.yml.env.developmentDocker development (all services in containers)
docker-compose.local.yml.env.localLocal development (infra in Docker, apps native)

Important Differences:

.env.development (Docker Development):

  • Uses Docker service names for inter-container communication:
    • SERVER_RESTAPI_URL=http://rest-api:4000/api (Docker service name)
    • REDIS_HOST=redis (Docker service name)
    • DATABASE_URL is set by Docker Compose (not in file)

.env.local (Local Development):

  • Uses localhost for native apps connecting to Docker infrastructure:
    • SERVER_RESTAPI_URL=http://localhost:4000/api (localhost)
    • REDIS_HOST=localhost (localhost)
    • DATABASE_URL=postgresql://...@localhost:5432/... (explicit connection string)
  • Auto-created from .env.development when you run make dev-local or make infra-up
  • Gitignored - safe for local customizations

Note: .env.local is automatically created from .env.development on first run. You only need to create .env.development manually.

3๏ธโƒฃ Initialize Supabase

<details> <summary><strong>๐Ÿ—„๏ธ Option A: Local Supabase Setup (One-time, ~5-10 min)</strong></summary>

Step 1: Start Supabase ๐Ÿš€

bash
bun --filter @docs.plus/supabase_back start

First run downloads Docker images. Verify with bun --filter @docs.plus/supabase_back status.

Step 2: Activate Extensions ๐Ÿ”Œ

Step 3: Run Migrations ๐Ÿ“Š

  • Open SQL Editor
  • Execute scripts from packages/supabase/scripts/ in order: 01-enum.sql through 17-database-extensions.sql

Step 4: Configure Queues โš™๏ธ

  • Queue Settings โ†’ Enable "Expose Queues via PostgREST"
  • Queues โ†’ Select message_counter โ†’ Manage permissions
  • Enable Select/Insert/Update/Delete for: authenticated, postgres, service_role
  • Add RLS policy: "Allow anon and authenticated to access messages from queue"
</details> <details> <summary><strong>โ˜๏ธ Option B: Supabase Cloud Setup</strong></summary>

If you prefer not to run Supabase locally, you can use a cloud project instead:

Step 1: Create Supabase Project ๐Ÿš€

  1. Go to Supabase Dashboard
  2. Create a new project
  3. Copy your project URL and anon key from Settings โ†’ API

Step 2: Update Environment Variables โš™๏ธ
Update .env.development with your cloud project credentials:

bash
# Server-side (containers โ†’ Supabase Cloud) SUPABASE_URL=https://your-project.supabase.co SUPABASE_ANON_KEY=your-anon-key-here # Client-side (browser โ†’ Supabase Cloud) NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_WS_URL=wss://your-project.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here

Step 3: Configure Extensions & Migrations ๐Ÿ“Š
You still need to configure your cloud project:

  • Activate pg_cron and pgmq (Queues) extensions in the Dashboard
  • Run SQL scripts from packages/supabase/scripts/ in order via SQL Editor
  • Configure queues and permissions (same as local setup)

Backend Environment Variables:

env
# Supabase connection (for pgmq polling) SUPABASE_URL=https://your-project.supabase.co SUPABASE_SERVICE_ROLE_KEY=your-service-role-key # VAPID keys for Web Push VAPID_PUBLIC_KEY=your-vapid-public-key VAPID_PRIVATE_KEY=your-vapid-private-key VAPID_SUBJECT=mailto:support@yourdomain.com

Generate VAPID keys: npx web-push generate-vapid-keys

See docs/PUSH_NOTIFICATION_PGMQ.md for detailed architecture.

Step 5: Configure OAuth Redirect URLs ๐Ÿ”

Go to Authentication โ†’ URL Configuration in Supabase Dashboard and add your Redirect URLs:

https://yourdomain.com
https://yourdomain.com/*
https://admin.yourdomain.com
https://admin.yourdomain.com/*

Replace yourdomain.com with your actual domain.

Step 6: Add Admin Users ๐Ÿ‘ค

Only users in the admin_users table can access the admin dashboard. Run this SQL to grant access:

sql
-- Add admin user by email INSERT INTO public.admin_users (user_id, created_at) SELECT id, now() FROM auth.users WHERE email = 'your-admin@example.com'; -- Verify admin users SELECT u.email, a.created_at FROM public.admin_users a JOIN auth.users u ON a.user_id = u.id;

Note: Make sure your Supabase project allows connections from your Docker network or configure network settings accordingly.

</details>

4๏ธโƒฃ Start Development Environment

Choose one of three options:

<details> <summary><strong>๐Ÿณ Option A: Full Docker (Default)</strong></summary>

All services run in Docker containers. Best for consistent environments.

โš ๏ธ macOS Silicon users: Docker Desktop has slow IO performance (slow Next.js compile/hot reload). Use OrbStack instead for better performance.

bash
make up-dev

Services: ๐ŸŽฏ

</details> <details> <summary><strong>๐Ÿ’ป Option B: Local Development (macOS-friendly, No Docker IO)</strong></summary>

Best for macOS users - Avoids Docker volume IO performance issues. Only infrastructure (PostgreSQL, Redis) runs in Docker. Apps run natively with hot reload.

Step 1: Start Infrastructure ๐Ÿš€

bash
make infra-up

Step 2: Start Supabase ๐Ÿ—„๏ธ

bash
bun --filter @docs.plus/supabase_back start

Step 3: Start Apps ๐Ÿ’ป

Option 3a: All in one command (recommended)

bash
make dev-local

Option 3b: Separate terminals (better for debugging)

bash
# Terminal 1 - Backend REST API bun --filter @docs.plus/hocuspocus dev:rest # Terminal 2 - Backend WebSocket bun --filter @docs.plus/hocuspocus dev:ws # Terminal 3 - Backend Worker bun --filter @docs.plus/hocuspocus dev:worker # Terminal 4 - Frontend bun run dev

Or use convenience commands:

bash
make dev-backend # Start all backend services (REST + WS + worker) bun run dev # Start frontend only

Environment Variables:

  • โœ… .env.local file at root - automatically created from .env.development on first run
  • .env.development - Used by docker-compose.dev.yml (Docker service names: rest-api:4000, redis)
  • .env.local - Used by docker-compose.local.yml and native apps (localhost addresses, gitignored)
  • Scripts automatically load root .env.local via dotenv -e ../../.env.local -- (uniform across backend, frontend, and admin).
  • Key differences: .env.local uses localhost instead of Docker service names:
    • SERVER_RESTAPI_URL=http://localhost:4000/api (vs http://rest-api:4000/api in .env.development)
    • REDIS_HOST=localhost (vs redis in .env.development)
    • DATABASE_URL=postgresql://...@localhost:5432/... (explicit, vs set by Docker Compose in .env.development)
  • See Step 2: Environment Configuration section above for complete details

Benefits:

  • โœ… Native file system performance (no Docker volume overhead)
  • โœ… Faster hot reload
  • โœ… Better debugging experience
  • โœ… Lower resource usage

Access points:

Stop infrastructure:

bash
make infra-down
</details>

๐Ÿš€ Production Deployment

Production-ready setup for mid-level scale deployments (small-medium teams, moderate traffic).

Architecture: ๐Ÿ—๏ธ

  • ๐Ÿ“ˆ Horizontal scaling: REST API (2), WebSocket (2), Worker (2), Webapp (2)
  • ๐Ÿ”€ Traefik v3 reverse proxy with automatic SSL (Let's Encrypt) and load balancing
  • โšก Resource limits, health checks, and zero-downtime blue-green deploys
  • ๐Ÿ“Š Production-optimized logging and connection pooling

Setup

  1. โš™๏ธ Configure Environment

    bash
    cp .env.example .env.production

    Important: .env.production is used by docker-compose.prod.yml for production deployment.

    Update: database credentials, JWT secret, Supabase URLs, storage credentials, CORS origins.

  2. ๐Ÿ”จ Build & Deploy

    bash
    make build make up-prod
  3. ๐Ÿ“ˆ Scaling
    Adjust replicas in .env.production:

    bash
    REST_REPLICAS=2 WS_REPLICAS=3 WORKER_REPLICAS=2 WEBAPP_REPLICAS=2

Production Recommendations: ๐Ÿ’ก

  • ๐Ÿ—„๏ธ Use managed database (AWS RDS, DigitalOcean, Supabase Cloud)
  • ๐Ÿ”’ Configure SSL/TLS certificates
  • ๐Ÿ“Š Set up monitoring (Prometheus, Grafana)
  • ๐Ÿ’พ Implement database backups
  • ๐Ÿ” Secure all secrets and credentials

๐Ÿ“– Command Reference

bash
# Building make build # Production build make build-dev # Development build # Running (Full Docker) make up-prod # Start production make up-dev # Start development (all in Docker) # Running (Local Development - macOS-friendly) make infra-up # Start infrastructure only (postgres, redis) make infra-down # Stop infrastructure make dev-local # Start all services (backend + frontend) make dev-backend # Start backend services (REST, WS, Worker) # Frontend / Admin / Supabase (Bun, not Make) bun run dev # Webapp bun run dev:admin # Admin dashboard bun --filter @docs.plus/supabase_back start # Supabase bun --filter @docs.plus/hocuspocus prisma:migrate # Run DB migrations # Management make down # Stop services (auto-detects env) make logs # All logs make ps # Container status make clean # โš ๏ธ Cleanup + delete volumes (DATA LOSS!)

Run make help for the complete Make surface; bun run (no args) for all root scripts.

๐Ÿ“ Project Structure

docs.plus/
โ”œโ”€โ”€ packages/
โ”‚   โ”œโ”€โ”€ webapp/              # ๐ŸŒ Next.js frontend
โ”‚   โ”œโ”€โ”€ hocuspocus.server/   # โšก REST API, WebSocket, Workers
โ”‚   โ”œโ”€โ”€ supabase/            # ๐Ÿ—„๏ธ Database migrations
โ”‚   โ””โ”€โ”€ extension-*/         # ๐Ÿ”Œ TipTap extensions
โ”œโ”€โ”€ docker-compose.dev.yml   # ๐Ÿณ Development orchestration
โ”œโ”€โ”€ docker-compose.prod.yml  # ๐Ÿš€ Production orchestration
โ”œโ”€โ”€ Makefile                 # ๐Ÿ› ๏ธ Build & deployment commands
โ””โ”€โ”€ .env.example             # โš™๏ธ Environment template

๐Ÿค Contributing

PRs welcome! See contributing guidelines for details.

First contribution? Start here:

  • Pick an issue labeled good first issue or help wanted.
  • Confirm your setup with bun run check before opening a PR.
  • Use our issue and PR templates to speed up review.

๐ŸŽจ Badges

Using docs.plus? Add a badge to your README and link back.

Variants

StylePreviewFile
Defaultdocs.plusbadge-docsplus.svg
Lightdocs.plusbadge-docsplus-light.svg
Darkdocs.plusbadge-docsplus-dark.svg
Flat-squaredocs.plusbadge-docsplus-flat-square.svg
For-the-badgedocs.plusbadge-docsplus-for-the-badge.svg

Usage

Markdown:

markdown
[![docs.plus](https://docs.plus/badges/badge-docsplus.svg)](https://docs.plus)

HTML โ€” auto light/dark switching for GitHub READMEs:

html
<a href="https://docs.plus"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://docs.plus/badges/badge-docsplus-dark.svg" /> <img alt="docs.plus" height="20" src="https://docs.plus/badges/badge-docsplus.svg" /> </picture> </a>

Swap the filename for any variant in the table above.

๐Ÿ“„ License

MIT License - See LICENSE

๐Ÿ’ฌ Support


<a href="https://patreon.com/docsplus"><img src="https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Ddocsplus%26type%3Dpatrons&style=for-the-badge" /></a>

Contributors

Showing top 3 contributors by commit count.

View all contributors on GitHub โ†’

This article is auto-generated from docs-plus/docs.plus via the GitHub API.Last fetched: 6/19/2026