Railway

Deploy Karakeep

Bookmark app that saves a readable copy of every page you keep

Deploy Karakeep

Just deployed

Just deployed

/meili_data

Just deployed

/data

karakeep-assets

Bucket

Just deployed

Karakeep logo

Deploy and Host Karakeep on Railway

Karakeep is an open-source bookmark-everything app for people tired of watching saved links rot. Paste a URL and it fetches the page in a real browser, keeps a screenshot and a readable copy of the text, and indexes the lot so you can find it again by any word on the page — not just the words in the title. It also takes notes, images and PDFs, sorts them into nestable lists and tags, and subscribes to RSS feeds. It began life as Hoarder, is maintained by Localhost Labs under AGPL-3.0, and ships browser extensions, mobile apps, a REST API and an MCP server.

Deploy Karakeep on Railway and you get the production shape, not the smallest thing that boots. Three services are wired together: karakeep runs the web app and worker pool with the SQLite database on a persistent volume; chrome is a Chrome Headless Shell the crawler drives over the private network to render JavaScript-heavy pages and capture screenshots; meilisearch holds the full-text and vector index on its own volume. A managed object storage bucket takes every screenshot and archived page. Only the web app is public.

Diagram of the Karakeep, Chrome and Meilisearch services on Railway

Getting Started with Karakeep on Railway

Open the deployed URL and you land on a sign-in page. Karakeep has no default credentials, so click Sign up and create the first account, which automatically becomes the server administrator. Do that straight away: registration stays open until an account exists, so once you are in, set DISABLE_SIGNUPS=true on the karakeep service to close it behind you. Then paste any link into the New Item box and press Save. Within seconds the card fills in with the page title, cover image and a screenshot of the page as the crawler saw it — the quickest confirmation that the browser service and object storage both work. Click the card for the reader view, where the archived text sits beside that bookmark's tags, notes and attachments. Search for a word from the body of the page rather than its title to confirm the index is live. The admin area at /admin/overview reports the search engine, browser, queue and vector store as four separate connections.

Karakeep bookmark grid showing four crawled pages with archived screenshots

Karakeep full-text search returning two bookmarks matching sqlite

Karakeep reader view of an archived SQLite article with its tag and attachments

Karakeep admin panel reporting search, browser, queue and vector store connected

About Hosting Karakeep

A bookmark is only useful if the thing it points at is still there. Karakeep treats every saved link as content to archive rather than an address to remember, so notes, documentation and articles stay readable after the original goes behind a paywall or disappears. Self-hosting also keeps the archive private — nothing about what you read leaves your own infrastructure.

Key features:

  • Full-page archiving with screenshots, readable text and optional PDF and video capture
  • Full-text search across titles, URLs, tags and the crawled body of every page
  • Optional AI tagging and summarisation via OpenAI or a local Ollama server
  • Nestable lists, tags, highlights, RSS subscriptions and a rule engine
  • Browser extensions, mobile apps, a REST API, webhooks and an MCP server
  • Imports from Pocket, Omnivore, Linkwarden, Raindrop and HTML bookmark files

Each supporting service does one job. Chrome exists because much of the web no longer renders without JavaScript: the crawler has it load the page, run its scripts and return a screenshot and the finished DOM. Meilisearch holds the search index and, with embeddings on, the vector index. Object storage keeps the heavy artefacts off the volume.

Why Deploy Karakeep on Railway

Railway removes the parts of self-hosting that are not the app:

  • Browser, search engine and object storage provisioned and wired together for you
  • Private networking keeps the crawler and search index off the public internet
  • Persistent volumes survive redeploys, so the archive and index are not ephemeral
  • A public HTTPS domain and certificate issued automatically, with usage-based pricing

Common Use Cases

  • A durable research archive — keep the readable text long after the original page changes or vanishes
  • An AI-assisted knowledge base — the MCP server lets an assistant search and read your saved pages

Dependencies for Karakeep

  • karakeepghcr.io/karakeep-app/karakeep:release, the all-in-one web and worker image. Its volume at /data holds the SQLite database and job queue.
  • chrome — Chrome Headless Shell from ghcr.io/karakeep-app/karakeep-chrome:release. Private, no volume.
  • meilisearchgetmeili/meilisearch:v1, pinned to the major because it owns an on-disk index format. Its volume at /meili_data holds the index and snapshots.
  • Object storage bucket — S3-compatible storage for screenshots, archived HTML and images.

Source: github.com/karakeep-app/karakeep.

Environment Variables Reference

VariableServicePurpose
NEXTAUTH_URLkarakeepPublic URL; sign-out and share links are built from it
DISABLE_SIGNUPSkarakeepSet to true once your first account exists
MEILI_ADDR / MEILI_MASTER_KEYkarakeepSearch engine address and key
BROWSER_WEB_URLkarakeepAddress of the Chrome service the crawler drives
ASSET_STORE_S3_*karakeepStorage credentials; setting the endpoint moves assets off the volume
OPENAI_API_KEYkarakeepOptional — enables automatic tagging, summaries and semantic search

Deployment Dependencies

Hardware Requirements for Self-Hosting Karakeep

ResourceMinimumRecommended
CPU2 vCPU across all services4 vCPU
RAM2 GB total4 GB — Chrome is the hungry one
Storage5 GB volumes plus object storage10 GB plus object storage that grows
RuntimeLinux container, x86-64 or arm64

Crawling is bursty: memory peaks while a page renders, then settles. Raise CRAWLER_NUM_WORKERS only if you have RAM to match.

Self-Hosting Karakeep with Docker

Outside Railway the smallest useful setup is three containers — a minimal docker-compose.yml:

services:
  web:
    image: ghcr.io/karakeep-app/karakeep:release
    ports: ["3000:3000"]
    volumes: ["data:/data"]
    environment:
      DATA_DIR: /data
      NEXTAUTH_URL: http://localhost:3000
      NEXTAUTH_SECRET: replace-with-openssl-rand-base64-36
      MEILI_ADDR: http://meilisearch:7700
      MEILI_MASTER_KEY: replace-with-a-long-random-string
      BROWSER_WEB_URL: http://chrome:9222
  chrome:
    image: ghcr.io/karakeep-app/karakeep-chrome:release
    init: true
  meilisearch:
    image: getmeili/meilisearch:v1
volumes: { data: {} }

Once it is up, create a key under Settings → API Keys and add bookmarks from anywhere with curl:

curl -X POST https://your-karakeep-domain/api/v1/bookmarks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"link","url":"https://example.com/article"}'

How Much Does Karakeep Cost to Self-Host?

Karakeep is free and open source under AGPL-3.0, with no paid tier, seat limits or feature gates — the self-hosted build is the whole product. The only costs are infrastructure: on Railway you pay for compute, the two volumes and the object storage the archive actually uses, which for a personal library is small. AI tagging is the one optional extra that costs money, and only if you point it at OpenAI rather than a local Ollama server.

FAQ

What is Karakeep? An open-source, self-hosted bookmark manager that archives every page you save — screenshot, readable text and metadata — and makes the archive searchable. It was previously called Hoarder.

Why is Meilisearch needed if the app already has a database? Karakeep stores bookmarks in SQLite but delegates search to Meilisearch, which is what makes full-text search over the crawled body of every page fast. It also holds the vector index when semantic search is on.

How do I stop other people signing up on my Karakeep instance? Create your own account first — it becomes the administrator — then set DISABLE_SIGNUPS=true on the karakeep service. Existing accounts keep working; the sign-up form disappears.

Where are screenshots and archived pages stored? In the object storage bucket, not on the volume. The volume holds only the SQLite database and the job queue, so the archive can grow without resizing anything.

Do I need an OpenAI key to use self-hosted Karakeep? No. Saving, crawling, archiving, screenshots, tags, lists and full-text search all work with no key. Setting OPENAI_API_KEY or OLLAMA_BASE_URL adds automatic tagging, summaries and semantic search on top.


Template Content

More templates in this category

View Template
Rocky Linux
Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
44
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
51