Self-hosted, open-source knowledge management and team bookmark curation platform.
Quick Start · Features · Cloud Version
docker run -d \
-v curyloop-data:/data \
-p 3000:3000 \
-e ENCRYPTION_KEY=$(openssl rand -hex 32) \
-e BETTER_AUTH_SECRET=$(openssl rand -base64 32) \
montarist/curyloop-communityOpen http://localhost:3000 and create your first account.
Or with Docker Compose:
curl -O https://raw.githubusercontent.com/montarist/curyloop-community/main/docker-compose.yml
docker compose up -d- Groups & Sessions — Organize links into team workspaces and weekly trend sessions
- Tags & Collections — Categorize and curate content
- Full-text Search — SQLite FTS5 with BM25 weighted ranking
- AI Agent (BYOK) — Automated content discovery with OpenAI, Anthropic, or Google
- Import — Browser bookmarks, Pocket, Raindrop, Notion
- Export — JSON and CSV
- Integrations — Slack, Discord, Microsoft Teams, Telegram
- Webhooks — Subscribe to app events with HMAC-SHA256 signed payloads
- MCP Endpoint — Model Context Protocol for AI assistants
- Browser Extension API — API key-based authentication
- Single Container — One
docker runcommand, ~200MB image, zero dependencies
| Feature | Community | Cloud |
|---|---|---|
| Groups, Sessions, Items (unlimited) | ✅ | ✅ |
| Tags, Collections, FTS5 Search | ✅ | ✅ |
| AI Agent & Summaries (BYOK) | ✅ | ✅ |
| Import / Export | ✅ | ✅ |
| Integrations & Webhooks | ✅ | ✅ |
| MCP & Browser Extension | ✅ | ✅ |
| OAuth (Google, GitHub) | — | ✅ |
| Push Notifications | — | ✅ |
| Email Digests | — | ✅ |
| Analytics Dashboard | — | ✅ |
| Smart Collections | — | ✅ |
| Managed Infrastructure | — | ✅ |
| Layer | Choice |
|---|---|
| Framework | Next.js 16 (App Router, standalone output) |
| Database | SQLite (WAL mode, single file) |
| ORM | Drizzle ORM |
| Auth | better-auth (email/password) |
| UI | Tailwind CSS 4 + Radix UI |
| AI | Vercel AI SDK (BYOK) |
| Cron | node-cron (in-process) |
| Search | SQLite FTS5 |
| Variable | Required | Description |
|---|---|---|
ENCRYPTION_KEY |
Yes | 64-char hex string for AES-256-GCM encryption of LLM keys |
BETTER_AUTH_SECRET |
Yes | Random string (32+ chars) for session signing |
DATABASE_PATH |
No | SQLite file path (default: /data/curyloop.db) |
NEXT_PUBLIC_SITE_URL |
No | Public URL (default: http://localhost:3000) |
DISABLE_CLOUD_CTA |
No | Set true to hide Cloud upgrade prompts |
# Clone the repo
git clone https://github.com/montarist/curyloop-community.git
cd curyloop-community
# Install dependencies
pnpm install
# Set up environment
cp .env.example .env
export ENCRYPTION_KEY=$(openssl rand -hex 32)
export BETTER_AUTH_SECRET=$(openssl rand -base64 32)
# Run dev server
pnpm devOpen http://localhost:3000.
| Command | Description |
|---|---|
pnpm dev |
Start dev server with Turbopack |
pnpm build |
Production build |
pnpm start |
Start production server |
pnpm lint |
Run ESLint |
pnpm type-check |
Run TypeScript compiler check |
pnpm db:generate |
Generate Drizzle migrations |
pnpm db:migrate |
Run pending migrations |
pnpm db:studio |
Open Drizzle Studio (DB browser) |
docker build -t curyloop-community .
docker run -d \
-v curyloop-data:/data \
-p 3000:3000 \
-e ENCRYPTION_KEY=$(openssl rand -hex 32) \
-e BETTER_AUTH_SECRET=$(openssl rand -base64 32) \
curyloop-communityFor production, run behind a reverse proxy with TLS:
server {
listen 443 ssl;
server_name curyloop.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}All endpoints under /api/v1/ require authentication via session cookie or API key.
| Method | Endpoint | Description |
|---|---|---|
| GET/POST | /api/v1/groups |
List / create groups |
| POST | /api/v1/sessions |
Create session |
| GET/POST | /api/v1/items |
List / create items |
| GET | /api/v1/search?q=... |
Full-text search |
| POST | /api/v1/import |
Import bookmarks |
| GET | /api/export?format=json |
Export data |
| POST/GET | /api/v1/api-keys |
Manage API keys |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/extension/auth |
Verify API key |
| GET | /api/extension/sessions |
List recent sessions |
| POST | /api/extension/items |
Save item from extension |
curl -X POST http://localhost:3000/api/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- Bug reports: Open an issue
- Feature requests: Open an issue
- Questions & ideas: GitHub Discussions
Found a vulnerability? Please see SECURITY.md for responsible disclosure guidelines. Do not open a public issue for security concerns.
MIT — free to use, modify, and distribute.