---
title: "Deploy Karakeep"
description: "Bookmark app that saves a readable copy of every page you keep"
category: "Other"
url: https://railway.com/deploy/karakeep-bookmarks
---

# Deploy Karakeep

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

**[Deploy Karakeep on Railway](https://railway.com/template/karakeep-bookmarks)**

- **Creator:** A3A
- **Category:** Other

## Template content

### chrome https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/chromium.svg

- **Source:** https://github.com/gridalpha/karakeep-railway

### meilisearch https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/meilisearch.svg

- **Image:** getmeili/meilisearch:v1
- **Start command:** `/bin/sh -c 'mkdir -p /meili_data/tmp /meili_data/snapshots /meili_data/dumps; exec tini -s -- /bin/meilisearch'`
- **Health check:** /health

### karakeep https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/karakeep.svg

- **Source:** https://github.com/gridalpha/karakeep-railway
- **Health check:** /api/health
- **Public domain:** Yes

## Buckets

- **karakeep-assets**

## Documentation

![Karakeep logo](https://karakeep.app/_astro/hero.sb7kuld3_Aiy8O.webp)

# 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](https://res.cloudinary.com/rroe4rtk/image/upload/v1788048396/karakeep-architecture.png)

## 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](https://res.cloudinary.com/rroe4rtk/image/upload/v1788048398/karakeep-bookmark-grid.png)

![Karakeep full-text search returning two bookmarks matching sqlite](https://res.cloudinary.com/rroe4rtk/image/upload/v1788048399/karakeep-search-results.png)

![Karakeep reader view of an archived SQLite article with its tag and attachments](https://res.cloudinary.com/rroe4rtk/image/upload/v1788048403/karakeep-reader-view.png)

![Karakeep admin panel reporting search, browser, queue and vector store connected](https://res.cloudinary.com/rroe4rtk/image/upload/v1788048405/karakeep-admin-service-connections.png)

## 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

- **karakeep** — `ghcr.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.
- **meilisearch** — `getmeili/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](https://github.com/karakeep-app/karakeep).

### Environment Variables Reference

| Variable | Service | Purpose |
|---|---|---|
| `NEXTAUTH_URL` | karakeep | Public URL; sign-out and share links are built from it |
| `DISABLE_SIGNUPS` | karakeep | Set to `true` once your first account exists |
| `MEILI_ADDR` / `MEILI_MASTER_KEY` | karakeep | Search engine address and key |
| `BROWSER_WEB_URL` | karakeep | Address of the Chrome service the crawler drives |
| `ASSET_STORE_S3_*` | karakeep | Storage credentials; setting the endpoint moves assets off the volume |
| `OPENAI_API_KEY` | karakeep | Optional — enables automatic tagging, summaries and semantic search |

### Deployment Dependencies

- Runtime: Node.js 24, Chrome Headless Shell 151, Meilisearch 1.x
- Images: [karakeep and karakeep-chrome](https://github.com/orgs/karakeep-app/packages), [meilisearch](https://hub.docker.com/r/getmeili/meilisearch)
- Docs: [docs.karakeep.app](https://docs.karakeep.app)

## Hardware Requirements for Self-Hosting Karakeep

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 2 vCPU across all services | 4 vCPU |
| RAM | 2 GB total | 4 GB — Chrome is the hungry one |
| Storage | 5 GB volumes plus object storage | 10 GB plus object storage that grows |
| Runtime | Linux 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.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/karakeep-bookmarks
