A distraction-free, real-time collaborative notepad. Open a note by name, start typing — no accounts, no setup.
- Instant notes — open any note by slug, it's created automatically if it doesn't exist
- Auto-save — content is saved 1 second after you stop typing
- Protected notes — password-protect a note with bcrypt hashing
- Stateless auth — short-lived signed access tokens (jose / HS256) for protected notes
- No accounts — zero sign-up friction
Client
- React 19, Vite, Tailwind CSS
- React Router, Axios
Server
- Node.js, Express 5
- MongoDB, Mongoose
- bcrypt, jose, Zod, Helmet, Morgan
togetherPad/
├── client/ # React frontend
└── server/ # Express backend
- Node.js 18+
- MongoDB (local or Atlas)
cd server
npm installCreate server/.env:
PORT=5000
MONGO_URI=your_mongodb_connection_string
NODE_ENV=development
CLIENT_ORIGIN=http://localhost:5173
NOTE_ACCESS_SECRET=your_secret_key_min_32_charsnpm run devcd client
npm install
npm run devApp runs at http://localhost:5173.
Base URL: /api/v1
| Method | Endpoint | Description |
|---|---|---|
POST |
/notes |
Create a note |
GET |
/notes/:slug |
Get note state |
POST |
/notes/:slug/open |
Unlock a protected note |
PATCH |
/notes/:slug/content |
Update note content |
GET /notes/:slug always returns 200 with a state field:
| State | Meaning |
|---|---|
public |
Note exists, content returned |
password_required |
Note is protected |
not_found |
Note doesn't exist yet |
User Opens Website
│
▼
Landing Page (/)
│
▼
Enter Note Slug + Click Go
│
▼
GET /api/v1/notes/:slug
│
┌────────────┴────────────┐
│ │
▼ ▼
Note Exists? Doesn't Exist
│ │
▼ ▼
Is Protected? Show Create Dialog
│ │
┌────┴────┐ ▼
│ │ POST /api/v1/notes
▼ ▼ │
Public Protected ▼
│ │ Redirect to Editor
▼ ▼
Editor Password Screen
│
▼
POST /api/v1/notes/:slug/open
│
Password Correct?
┌────┴────┐
│ │
▼ ▼
Yes No
│ │
▼ ▼
Return Access Show Error
Token
│
▼
Editor
│
▼
Auto Save (Debounced)
│
▼
PATCH /api/v1/notes/:slug/content
- Go to
http://localhost:5173 - Enter a note name and press Go to Note
- If the note doesn't exist, choose public or protected and create it
- Start typing — changes save automatically
MIT