A fast, self-hostable bookmark manager for humans and AI agents.
Built with Rust, HTMX, and Tailwind CSS. Save, tag, and search your bookmarks from a clean web UI, a CLI (boop), or let your AI coding agents do it for you. Optional AI enrichment auto-generates tags and descriptions. Pluggable screenshot capture for page thumbnails.
Tell your AI coding agent:
Read https://raw.githubusercontent.com/willisrocks/boopmark/main/README.md and follow the installation instructions.
Or follow the Quick Start and CLI sections below.
Install the Boopmark plugin to give Claude Code the boop skill:
claude plugin add willisrocks/boopmarkThis adds the boop skill, which Claude Code will automatically use when you ask about bookmarks.
Any AI agent with shell access can use the boop CLI directly:
# 1. Install the binary
curl -fsSL https://raw.githubusercontent.com/willisrocks/boopmark/main/install.sh | sh
# 2. Point at your Boopmark server (local or hosted)
boop config set-server http://localhost:4000 # local dev
# or
boop config set-server https://boopmark.yourdomain.com # your hosted instance
# 3. Get your API key: log in to the Boopmark web app → Settings → Generate API Key
boop config set-key YOUR_API_KEY
# 4. Verify
boop listImportant: You need a running Boopmark server and a user account before the CLI will work. See Quick Start to set one up, then log in to the web app to generate your API key under Settings.
To give Claude Code (or any AI agent) access without the plugin, add this to your project's CLAUDE.md or AGENTS.md:
## Bookmarks
Use the `boop` CLI to save and search bookmarks:
- `boop add <url> --tags "tag1,tag2"` — save a bookmark
- `boop search <query>` — find bookmarks
- `boop list` — list recent bookmarks
- `boop add <url> --suggest` — save with AI-suggested tags and description- Save and tag bookmarks with automatic metadata extraction
- Full-text search across titles, descriptions, and URLs
- AI enrichment via Anthropic Claude (auto-tagging, descriptions)
- CLI client (
boop) for terminal and agent-based bookmark management - Claude Code skill support — agents can save and search bookmarks
- Optional screenshot capture via Playwright sidecar
- Invite-only access control with admin panel
- Import/export (JSONL, CSV, Netscape HTML)
- S3-compatible image storage (local disk or RustFS/AWS S3/R2)
The fastest path uses Docker Compose and just bootstrap:
# 1. Prerequisites: Docker, just, openssl
git clone https://github.com/chrisfenton/boopmark
cd boopmark
# 2. Bootstrap: generates secrets, starts services, creates your owner account
just bootstrap you@example.com --password yourpassword
# 3. Open http://localhost:4000 and sign injust bootstrap copies .env.example to .env, generates random secrets, starts the Docker stack, waits for readiness, and creates your owner account in one step.
Copy .env.example to .env and customize. Only three variables are required; everything else has sensible defaults.
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
— | Postgres connection string (required) |
SESSION_SECRET |
— | Random hex string for session signing (required) |
LLM_SETTINGS_ENCRYPTION_KEY |
— | Base64-encoded 32-byte key for encrypting API keys (required) |
APP_URL |
http://localhost:4000 |
Public base URL |
PORT |
4000 |
HTTP port |
LOGIN_ADAPTER |
local_password |
local_password or google |
GOOGLE_CLIENT_ID |
— | Required when LOGIN_ADAPTER=google |
GOOGLE_CLIENT_SECRET |
— | Required when LOGIN_ADAPTER=google |
STORAGE_BACKEND |
local |
local or s3 |
S3_ENDPOINT |
— | S3-compatible endpoint URL |
S3_ACCESS_KEY |
— | S3 access key |
S3_SECRET_KEY |
— | S3 secret key |
S3_REGION |
auto |
S3 region |
S3_IMAGES_BUCKET |
boopmark-images |
S3 bucket name |
S3_IMAGES_PUBLIC_URL |
— | Public URL prefix for stored images |
SCREENSHOT_BACKEND |
disabled |
disabled or playwright |
SCREENSHOT_SERVICE_URL |
— | Required when SCREENSHOT_BACKEND=playwright |
METADATA_FALLBACK_BACKEND |
— | iframely or opengraph_io (optional) |
IFRAMELY_API_KEY |
— | Required when METADATA_FALLBACK_BACKEND=iframely |
OPENGRAPH_IO_API_KEY |
— | Required when METADATA_FALLBACK_BACKEND=opengraph_io |
ENABLE_E2E_AUTH |
0 |
Set to 1 for E2E test auth bypass |
just bootstrap you@example.com --password yourpasswordThe server runs on port 4000. Add a reverse proxy (nginx, Caddy) for HTTPS.
- Provision a Neon Postgres database and copy the connection string.
- Fork this repo and connect it to Railway.
- Set environment variables in Railway:
DATABASE_URL,SESSION_SECRET,LLM_SETTINGS_ENCRYPTION_KEY,APP_URL. - Deploy. Railway runs
./boopmark-serverwhich auto-migrates on startup. - Create your first user via the Railway shell:
./hash_password yourpasswordthen insert directly.
Uncomment the rustfs service in docker-compose.yml, then set:
STORAGE_BACKEND=s3
S3_ENDPOINT=http://rustfs:9000
S3_ACCESS_KEY=rustfsadmin
S3_SECRET_KEY=rustfsadmin
Uncomment the screenshot-svc service in docker-compose.yml, then set:
SCREENSHOT_BACKEND=playwright
SCREENSHOT_SERVICE_URL=http://screenshot-svc:3001
# Install
curl -fsSL https://raw.githubusercontent.com/chrisfenton/boopmark/main/install.sh | sh
# Configure
boop config set-server https://your-boopmark-instance.example.com
boop config set-key YOUR_API_KEY
# Use
boop add https://example.com --title "Example" --tags "ref,tools"
boop list
boop search "rust async"
boop export --format jsonl > backup.jsonlSee boop --help for all commands.
Prerequisites: Rust (stable), Node.js 24+, Docker, just
# One-time setup (starts db, runs migrations, installs deps, builds CSS)
just setup
# Start the server
cargo run -p boopmark-server
# Watch CSS changes
just css
# Run tests
cargo test
# Run linter
cargo clippy -- -D warningsFor local HTTPS subdomains, install devproxy and set USE_DEVPROXY=1 in .env, then run just dev.
Boopmark follows hexagonal (ports-and-adapters) architecture:
- Domain (
server/src/domain/) — pure business logic, no I/O - Ports (
server/src/domain/ports/) — trait definitions for external dependencies - Adapters (
server/src/adapters/) — concrete implementations (Postgres, S3, Anthropic, etc.) - App services (
server/src/app/) — orchestration layer - Web (
server/src/web/) — Axum handlers, templates, routing
Key ports: BookmarkRepository, MetadataExtractor, ObjectStorage, LlmEnricher, LoginProvider, ScreenshotProvider
See CONTRIBUTING.md for details on adding new adapters.
See CONTRIBUTING.md.
MIT — see LICENSE.
