A private library for everything worth keeping.
Save links, notes, images, PDFs, and web pages, then find them again when they matter.
Marka is a self-hostable bookmark library built for people who want their saved knowledge close, searchable, and under their control.
- Save links, notes, images, PDFs, and web pages in one place
- Fetch titles, descriptions, previews, screenshots, and archived content automatically
- Organize everything with lists, tags, rules, and collaborative sharing
- Search across your saved content with full-text search
- Add highlights while reading and find them again later
- Use optional AI tagging and summarization, including local-model setups
- Capture content through browser extensions, RSS, CLI, API, and MCP tooling
For a Linux amd64 host with Docker Engine, Docker Compose v2, and OpenSSL already installed:
curl -fsSLo /tmp/marka-setup.sh https://raw.githubusercontent.com/absolutepraya/marka/main/scripts/install.sh && bash /tmp/marka-setup.shThe guided installer configures the application, search, browser rendering, and optional AI. It writes secrets to restricted env files, validates the generated Compose stack, and starts the deployment.
The default listener is 127.0.0.1:3000. For an Internet-facing deployment, put a reverse proxy with TLS in front of it. The installer does not install Docker, configure DNS, change firewall rules, or provision certificates.
For reproducible setup, replace main with a reviewed release tag or commit SHA:
REF=<tag-or-commit-sha>; curl -fsSLo /tmp/marka-setup.sh "https://raw.githubusercontent.com/absolutepraya/marka/${REF}/scripts/install.sh" && bash /tmp/marka-setup.shRead the guided installation guide for all configuration modes and rollback details.
Start with CONTRIBUTING.md for contribution rules and docs/operator-setup.md for local development and deployment workflows.
The supported local development runtime is:
- Node.js 24.18.1 from
.nvmrc - pnpm 11.2.1 through Corepack, as pinned in
package.json - Git and a Docker-compatible runtime, such as OrbStack on macOS
wtfor isolated worktrees
After the repository is configured, the normal development command is:
pnpm dev:startpnpm dev:start runs the current worktree's web and workers processes. It reuses one machine-level Chrome/CDP service at 127.0.0.1:9250 and one Meilisearch service at 127.0.0.1:7700. Each worktree keeps its own SQLite/assets directory, web port, and Meilisearch index namespace. Worktree slot 1 uses web port 3100, slot 2 uses 3200, and so on. Shared Chrome can be moved with MARKA_DEV_CHROME_PORT when the default port is occupied.
The repository is supported by wt:
wt new ui-polish
wt lsThe project configuration in .wt/config.toml prepares isolated dependencies, data, ports, and Meilisearch namespaces for each worktree.
Use the safe dry run first:
pnpm prod:pull-state --dry-runThe command reads the root .env, connects to the personal VPS, and replaces the current worktree's local data only when run without --dry-run. It backs up the existing DATA_DIR before restoring the full production /data volume.
The personal VPS compose project is /home/praya/marka, configured through KARAKEEP_PROD_COMPOSE_DIR. The service and export image have documented defaults in the script, while machine-specific values belong in .env and must not be committed.
Open the editable Excalidraw source
Marka is licensed under AGPL-3.0.
Marka builds on the open-source Karakeep project.
