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.
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
- π³ 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
- π¦ Node.js >=24.11 - Install (Next.js and tooling binaries run on Node)
- πͺ Windows: use WSL2 β the dev workflow relies on
makeandbash
No global Supabase CLI needed β the repo pins it as a workspace dependency.
git clone https://github.com/docs-plus/docs.plus.git
cd docs.plus
make dev-localOne command bootstraps everything: env files from .env.example, dependencies, Postgres + Redis containers, local Supabase (schema and seed apply automatically), Prisma migrations, editor-extension builds β then starts the REST API, WebSocket server, worker, and webapp. The first run downloads Docker images and takes several minutes; after that it starts in seconds.
URLs: webapp http://localhost:3000 Β· API http://localhost:4000 Β· WS ws://localhost:4001 Β· Supabase Studio http://127.0.0.1:54323 Β· local email inbox http://127.0.0.1:54324
Sign-in: any email/password works locally (auto-confirmed, no real email sent). Google sign-in needs GOOGLE_CLIENT_ID/GOOGLE_SECRET in .env.local.
Stop: Ctrl+C stops the app processes Β· make infra-down stops Postgres/Redis Β· bun --filter @docs.plus/supabase_back stop stops Supabase
Reset the local database: bun --filter @docs.plus/supabase_back reset
π³ Alternative: full Docker (`make up-dev`)
All services in containers instead of native processes:
cp .env.example .env.development
make up-devURLs: webapp http://localhost:3000 Β· API http://localhost:4000 Β· WS ws://localhost:4001 Β· Studio http://127.0.0.1:54323
βοΈ Alternative: Supabase Cloud instead of local Supabase
Use a hosted Supabase project instead of the local stack:
Step 1: Create a Supabase project π
- Go to the Supabase Dashboard
- Create a new project
- Copy your project URL and keys from Settings β API
Step 2: Update environment variables βοΈ
Update .env.development (and the generated .env.local) with your cloud project credentials:
# Server-side (containers β Supabase Cloud)
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-key-here
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
# 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-hereStep 3: Apply schema and extensions π
- Activate pg_cron and pgmq (Queues) in the Dashboard's Integrations page
- Run the SQL from
packages/supabase/scripts/in numbered order via the SQL Editor (00-bootstrap.sqlfirst β it creates the extensions and theinternalschema the later scripts depend on)
Step 4: Configure push notifications (optional) π
VAPID_PUBLIC_KEY=your-vapid-public-key
VAPID_PRIVATE_KEY=your-vapid-private-key
VAPID_SUBJECT=mailto:support@yourdomain.comGenerate VAPID keys: bunx web-push generate-vapid-keys. Architecture notes: packages/supabase/scripts/07-4-push-notifications-pgmq.sql.
Step 5: Configure OAuth redirect URLs π
Go to Authentication β URL Configuration in the Supabase Dashboard and add your Redirect URLs:
https://yourdomain.com
https://yourdomain.com/*
https://admin.yourdomain.com
https://admin.yourdomain.com/*
Step 6: Add admin users π€
Only users in the admin_users table can access the admin dashboard:
INSERT INTO public.admin_users (user_id, created_at)
SELECT id, now() FROM auth.users WHERE email = 'your-admin@example.com';| Docker Compose File | Environment File | Usage |
|---|---|---|
docker-compose.prod.yml |
.env.production |
Production deployment |
docker-compose.dev.yml |
.env.development |
Docker development (all services in containers) |
docker-compose.local.yml |
.env.local |
Local development (infra in Docker, apps native) |
make dev-local creates both dev files on first run: .env.development from .env.example, then .env.local from it with localhost hostnames and DATABASE_URL applied (native apps can't resolve Docker service names). Both are gitignored β edit .env.local for local customizations like Google OAuth keys. Details live in the comments of .env.example.
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
-
βοΈ Configure Environment
cp .env.example .env.production
Update: database credentials, JWT secret, Supabase URLs, storage credentials, CORS origins.
-
π¨ Build & Deploy
make build make up-prod
-
π Scaling Adjust replicas in
.env.production: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
# Running (local apps on host)
make dev-local # Full local stack (bootstraps everything)
make dev-backend # Backend only
make infra-up # Start Postgres + Redis only
make infra-down # Stop Postgres + Redis
bun --filter @docs.plus/supabase_back stop # Stop Supabase
# Running (all services in Docker)
make up-dev # Development
make up-prod # Production
# Building
make build # Production images
make build-dev # Development images
# Other Bun entrypoints
bun run dev # Webapp only
bun run dev:admin # Admin dashboard
# Management
make down # Stop services (auto-detects env)
make logs # All logs (auto-detects env)
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.
Five open-source Tiptap extensions power the docs.plus editor. Each ships on npm under @docs.plus:
bun add @docs.plus/extension-hyperlink| Package | Description |
|---|---|
extension-hyperlink |
Hyperlink mark, autolink, popovers, URL safety |
extension-hypermultimedia |
Images, audio, video, and embeds (YouTube, Vimeo, SoundCloud, Loom, X) |
extension-indent |
Tab / Shift-Tab literal indent with context allowlist |
extension-inline-code |
Inline code mark (Mod-e, backtick rules) |
extension-placeholder |
O(1) cursor-based empty-node placeholder |
Install notes, recommended pairings, and contributing: extensions/README.md. Release policy: RELEASE_POLICY.md.
docs.plus/
βββ apps/
β βββ webapp/ # π Next.js frontend
β βββ hocuspocus.server/ # β‘ REST API, WebSocket, Workers
β βββ admin-dashboard/ # π₯οΈ Admin panel
βββ extensions/
β βββ extension-*/ # π Five publishable @docs.plus TipTap packages
βββ packages/
β βββ supabase/ # ποΈ Database schema, seed, migrations
βββ docker-compose.dev.yml # π³ Development orchestration
βββ docker-compose.prod.yml # π Production orchestration
βββ Makefile # π οΈ Build & deployment commands
βββ .env.example # βοΈ Environment template
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 checkbefore opening a PR. - Use our issue and PR templates to speed up review.
Using docs.plus? Add a badge to your README and link back.
| Style | Preview | File |
|---|---|---|
| Default | badge-docsplus.svg |
|
| Light | badge-docsplus-light.svg |
|
| Dark | badge-docsplus-dark.svg |
|
| Flat-square | badge-docsplus-flat-square.svg |
|
| For-the-badge | badge-docsplus-for-the-badge.svg |
Markdown:
[](https://docs.plus)HTML β auto light/dark switching for GitHub READMEs:
<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.
MIT License - See LICENSE
- π¬ Discord: Join our server
- π¦ Twitter: @docsdotplus
- π GitHub: docs.plus
- π§ Email: contact@newspeak.house