Lightweight self-contained web clipboard with real-time sync, HTMX UI, and PWA support.
# With Docker
docker compose up -d --build
# Local (requires Bun)
bun install
bun run devbun run cli -- -l myclip -m "hello world"
bun run cli -- -l myclip -g
bun run cli -- -l myclip -g -u https://webklip.com- Accounts — register/login at
/register,/login, dashboard at/account - API keys — create via account UI or
POST /api/v1/auth/api-keys(Bearer session) - Teams — create workspace, vanity URLs
/{team}/{clip-name} - E2E encryption — AES-256-GCM client-side; key in URL
#key=; server stores ciphertext only - Version history — auto-saved every 5s while editing; restore from sidebar
- Register and create a team at
/account - Open
/teams/{team-slug}and create a clip - Share
https://webklip.com/{team}/{clip-name}
- Enable "End-to-end encryption" in clip settings
- Click "Generate & copy secure link" — adds
#key=...to URL - Share the full URL including the hash — recipients can decrypt in browser
- PIN protection — set in UI or API; unlock via web form or
X-Clip-Pinheader - View limits — 1, 3, 10 reads or unlimited (API reads only)
- Webhooks —
POSTJSON to your URL onread,burned,expiredevents - File/image upload — HTMX multipart, image preview inline
- CLI — extended flags:
-p,-w,-f,--max-views,--no-burn
{
"event": "read",
"slug": "myclip",
"timestamp": "2026-07-07T12:00:00.000Z",
"viewCount": 2,
"burnOnRead": false,
"maxViews": 3,
"burned": false
}bun run cli -- -l secret -m "data" -p 1234 -w https://hooks.example.com/webklip
bun run cli -- -l secret -g -p 1234
bun run cli -- -l secret -f ./photo.pngGET /api/health— health checkGET /api/v1/clips/:slug— read clip (burn-on-read if enabled)POST /api/v1/clips/:slug— create clipPUT /api/v1/clips/:slug— update clipDELETE /api/v1/clips/:slug— delete clipGET /api/v1/files/:slug/:id— download attached file
| Variable | Default | Description |
|---|---|---|
DATA_DIR |
./data |
SQLite DB + file uploads |
PORT |
3000 |
HTTP port |
NODE_ENV |
— | Set to production in production |
SESSION_SECRET |
— | Required in production. HMAC signing for cookies |
SECURE_COOKIES |
false |
Set true behind HTTPS reverse proxy |
CONTACT_EMAIL |
contact@logimaxx.ro |
Legal/security contact on public pages |
SITE_URL |
https://webklip.com |
Public site URL (no trailing slash) — writes sitemap.xml at build time |
ENABLE_AUTH_API |
false |
Enable POST /api/v1/auth/register and API key API |
UMAMI_WEBSITE_ID |
— | Umami website ID — enables analytics when set |
UMAMI_SCRIPT_URL |
— | Full URL to script.js (or set UMAMI_URL instead) |
CORS_ORIGIN |
— | Allow cross-origin API access from this origin |
MAX_FILE_SIZE_MB |
10 |
Max upload size |
RATE_LIMIT_CLIPS_PER_HOUR |
30 |
Clip creation limit per IP |
RATE_LIMIT_API_PER_HOUR |
200 |
API limit per IP |
See SECURITY.md for the full deployment checklist, threat model, and responsible disclosure process.
Quick checklist:
- Generate a strong
SESSION_SECRET(openssl rand -base64 32) - Set
NODE_ENV=productionand terminate TLS at a reverse proxy - Set
SECURE_COOKIES=trueor forwardX-Forwarded-Proto: https - Use a persistent volume for
DATA_DIR - Set
CONTACT_EMAILfor legal pages
docker compose -f docker-compose.yml -f docker-compose.scale.yml up -dbun run build:assets # production: minify + random hash folder
bun run build:assets --dev # dev: dist/assets/dev/