Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2,734 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“š docs.plus

Version License PRs Welcome Discord Supabase Bun

The docs.plus editor: document sheet with heading-based table of contents, each heading with its own chat

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.

Try it live at docs.plus β†’

Tech Stack:

  • Runtime: πŸš€ Bun 1.3.7+
  • Frontend: βš›οΈ Next.js (apps/webapp on 15.5.21, apps/admin-dashboard on ^16.2.12), React 19, Tiptap 3, Tailwind CSS 4
  • Backend: πŸ”§ Hono, Hocuspocus (Yjs), BullMQ, Prisma ORM
  • Database: 🐘 PostgreSQL 17 for the Prisma database in local and dev, 🐘 PostgreSQL 15 for local Supabase, πŸ”΄ 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
  • πŸ“¦ Node.js >=24.11.0 - Install (Next.js and tooling binaries run on Node)
  • πŸ”¨ GNU Make - every command below starts with make. macOS installs it with xcode-select --install; most Linux distributions ship it in a build-tools package.
  • 🌱 Git - Install
  • πŸͺŸ Windows: use WSL2 β€” the dev workflow relies on make and bash
  • 🚫 Bun only: never run npm, yarn, pnpm or npx in this repo. bun.lock is the only lockfile. Never commit package-lock.json, yarn.lock or pnpm-lock.yaml.

No global Supabase CLI needed β€” the repo pins it as a workspace dependency.

πŸš€ Quick Start

git clone https://github.com/docs-plus/docs.plus.git
cd docs.plus
make dev-local

One command bootstraps everything: env files from .env.example, dependencies, Postgres + Redis containers, local Supabase (schema and seed apply automatically), Prisma migrations, editor-extension builds. It then starts the REST API, WebSocket server, worker, and webapp. The first run downloads Docker images and takes several minutes. Later runs start in seconds.

If the first run stops, see Development Setup in the contributing guide. It owns the environment health check and what to do when a check fails.

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 Supabase database: bun --filter @docs.plus/supabase_back reset

The local stack runs two databases. That command resets the Supabase database on port 54322 only. The Prisma database docsplus runs in the container docsy-postgres-local on port 5432, and it survives the reset.

🐳 Alternative: full Docker (`make up-dev`)

All services in containers instead of native processes:

cp .env.example .env.development
make up-dev
bun --filter @docs.plus/supabase_back start

make up-dev starts no Supabase. The containers read SUPABASE_URL: http://host.docker.internal:54321 from the host, so the third command supplies it. That command also opens Supabase Studio at http://127.0.0.1:54323.

URLs: 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 πŸš€

  1. Go to the Supabase Dashboard
  2. Create a new project
  3. 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-here

Step 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. Run 00-bootstrap.sql first: it creates the extensions and the internal schema 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.com

Generate 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';

βš™οΈ Environment Files

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)

Two more compose files sit outside this table. make run-prod-backend layers docker-compose.backend-local.override.yml over the production file with .env.local. docker-compose.observability.yml runs on the production droplet only.

make dev-local creates both dev files on first run. It writes .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.

πŸ“– Command Reference

# 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
bun run doctor                                       # Environment health check

# 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)

make help lists the day-to-day surface, not every target. It omits run-prod-backend, observability-up, observability-down, observability-logs and observability-pull. The four observability-* targets run on the production droplet. run-prod-backend runs the production backend images locally against .env.local. Run bun run with no arguments for all root scripts.

πŸ“ Project Structure

docs.plus/
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ webapp/                  # 🌐 Next.js frontend
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ components/      # React components
β”‚   β”‚   β”‚   β”œβ”€β”€ api/             # API clients
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/           # React hooks
β”‚   β”‚   β”‚   β”œβ”€β”€ stores/          # State management
β”‚   β”‚   β”‚   └── utils/           # Utility functions
β”‚   β”‚   └── cypress/             # E2E tests
β”‚   β”œβ”€β”€ hocuspocus.server/       # ⚑ REST API, WebSocket, Workers
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ api/             # REST API routes & controllers
β”‚   β”‚   β”‚   β”œβ”€β”€ lib/             # Shared libraries (email, push, etc.)
β”‚   β”‚   β”‚   β”œβ”€β”€ middleware/      # Hono middleware
β”‚   β”‚   β”‚   └── config/          # Configuration & env schemas
β”‚   β”‚   └── prisma/              # Prisma schema & migrations
β”‚   └── admin-dashboard/         # πŸ–₯️ Admin interface (Next.js)
β”œβ”€β”€ extensions/
β”‚   └── extension-*/             # πŸ”Œ Five publishable @docs.plus Tiptap packages
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ document-swarm/          # 🐝 Multi-user demo and load CLI (Playwright)
β”‚   β”œβ”€β”€ email-templates/         # βœ‰οΈ Email templates and rendering
β”‚   β”œβ”€β”€ eslint-config/           # 🧹 Shared ESLint configuration
β”‚   β”œβ”€β”€ floating-popover/        # 🎈 Popover lifecycle engine
β”‚   β”œβ”€β”€ floating-tooltip/        # πŸ’¬ Hover/focus tooltip primitive
β”‚   β”œβ”€β”€ playground/              # πŸ§ͺ Clean-room Cypress harness
β”‚   β”œβ”€β”€ release-tooling/         # πŸ“¦ Shared prepack and publish guards
β”‚   └── supabase/                # πŸ—„οΈ Database schema, seed, migrations
β”œβ”€β”€ .github/workflows/           # πŸ”„ CI/CD pipelines
β”œβ”€β”€ docker-compose.dev.yml       # 🐳 Development orchestration
β”œβ”€β”€ docker-compose.prod.yml      # πŸš€ Production orchestration
β”œβ”€β”€ Makefile                     # πŸ› οΈ Build & deployment commands
└── .env.example                 # βš™οΈ Environment template

Deeper layout lives in apps/webapp/README.md, apps/hocuspocus.server/Readme.md and each area's CLAUDE.md.

πŸ”Œ Tiptap Extensions

Five open-source Tiptap extensions power the docs.plus editor. The table below describes the source in this repository. Not every package is on npm yet, and a published version can lag this source, so check the status tracker before you pin one.

bun add @docs.plus/extension-hyperlink
Package Description
extension-hyperlink Hyperlink mark, autolink, optional prebuilt popovers, dangerous-scheme gate
extension-hypermultimedia Nine media nodes: image, audio, video, YouTube, Vimeo, SoundCloud, Spotify, X, Loom
extension-indent Tab / Shift-Tab literal indent with a context allowlist
extension-inline-code Inline code mark (Mod-e, backtick rules)
extension-placeholder Hint text in the empty textblock at the cursor; cost tracks cursor depth, not document length

Install notes, recommended pairings, and contributing: extensions/README.md. Per-package npm status: extension-version-cutover.md. Release policy: RELEASE_POLICY.md.

🀝 Contributing

PRs welcome! See contributing guidelines for details.

First contribution? Start here:

πŸš€ 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), Admin Dashboard (1)
  • πŸ”€ 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

    cp .env.example .env.production

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

  2. πŸ”¨ Build & Deploy

    make build
    make up-prod
  3. πŸ“ˆ Scaling No compose file reads a replica environment variable. Two Make targets apply fixed counts:

    make scale-webapp        # webapp=3
    make scale-hocuspocus    # rest-api=3, hocuspocus-server=5, hocuspocus-worker=3

    For any other count, edit deploy.replicas in docker-compose.prod.yml.

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

🎨 Badges

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

Variants

Style Preview File
Default docs.plus badge-docsplus.svg
Light docs.plus badge-docsplus-light.svg
Dark docs.plus badge-docsplus-dark.svg
Flat-square docs.plus badge-docsplus-flat-square.svg
For-the-badge docs.plus badge-docsplus-for-the-badge.svg

Usage

Markdown:

[![docs.plus](https://docs.plus/badges/badge-docsplus.svg)](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.

πŸ“„ License

MIT License - See LICENSE

πŸ’¬ Support


About

Free and open-source real-time collaborative document editor. Hierarchical table of contents, per-heading chat, built on Tiptap, ProseMirror and Yjs.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

88 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages