---
title: "Deploy Hoarder"
description: "KaraKeep - bookmark-everything app (links, notes and images),AI added"
category: "Other"
url: https://railway.com/deploy/hoarder
---

# Deploy Hoarder

KaraKeep - bookmark-everything app (links, notes and images),AI added

**[Deploy Hoarder on Railway](https://railway.com/template/hoarder)**

- **Category:** Other

## Template content

### Hoarder

- **Image:** ghcr.io/hoarder-app/hoarder:latest
- **Public domain:** Yes

### meilisearch

- **Image:** getmeili/meilisearch:v1.41.0
- **Public domain:** Yes

### chrome

- **Source:** arloodots/chrome
- **Public domain:** Yes

## Documentation

# Deploy and Host Hoarder on Railway

## About Hosting Hoarder

Hoarder is a self-hosted bookmark and knowledge-management application for saving links, notes, images, and PDFs. It provides full-text search, web crawling, screenshots, and optional AI-powered tagging.

This Railway template deploys Hoarder with Meilisearch and a dedicated Chrome service. Hoarder uses embedded SQLite and stores application data on a persistent Railway Volume. Meilisearch provides full-text search, while Chrome handles browser-based crawling and rendering. The services communicate through Railway private networking, while Hoarder is accessed through a public HTTPS Railway Domain.

## Common Use Cases

* **Self-hosted bookmark management** — Save and organize links, notes, images, and PDFs on your own infrastructure.
* **Developer knowledge base** — Store documentation, GitHub repositories, technical articles, and other resources with full-text search.
* **Research and web archiving** — Crawl pages, preserve archived content, and capture screenshots for later reference.

## Dependencies for Hoarder Hosting

| Dependency          | Required | Purpose                                             |
| ------------------- | -------- | --------------------------------------------------- |
| Hoarder             | Yes      | Main application, workers, API, and SQLite database |
| Meilisearch         | Yes      | Full-text search                                    |
| Chrome              | Yes      | Crawling, rendering, and screenshots                |
| Railway Volume      | Yes      | Persistent Hoarder data                             |
| Private Networking  | Yes      | Internal service communication                      |
| OpenAI API / Ollama | Optional | AI-powered tagging                                  |

### Deployment Dependencies

* [Hoarder GitHub Repository](https://github.com/hoarder-app/hoarder?utm_source=chatgpt.com)
* [Hoarder Documentation](https://docs.karakeep.app/?utm_source=chatgpt.com)
* [Hoarder Docker Installation](https://docs.karakeep.app/installation/docker/?utm_source=chatgpt.com)
* [Chrome Repository](https://github.com/arloodots/chrome?utm_source=chatgpt.com)
* [Meilisearch Docker Image](https://hub.docker.com/r/getmeili/meilisearch?utm_source=chatgpt.com)
* [Railway Volumes Documentation](https://docs.railway.com/volumes?utm_source=chatgpt.com)

### Implementation Details

#### Docker

The template uses these container images:

| Service     | Docker Image                         |
| ----------- | ------------------------------------ |
| Hoarder     | `ghcr.io/hoarder-app/hoarder:latest` |
| Meilisearch | `getmeili/meilisearch:v1.41.0`       |
| Chrome      | `ghcr.io/arloodots/chrome`           |

Railway runs the configured Docker images directly. No custom build or start commands are required.

#### Public Networking

| Service     | Proxy Type         | Target Port |
| ----------- | ------------------ | ----------: |
| Hoarder     | HTTP Proxy         |      `3000` |
| Chrome      | HTTP Proxy         |      `8080` |
| Meilisearch | Private Networking |      `7700` |

Hoarder connects to Chrome privately using:

```text
ws://${{chrome.RAILWAY_PRIVATE_DOMAIN}}:${{chrome.BROWSER_PORT_PRIVATE}}/chromium/playwright?token=${{chrome.TOKEN}}
```

#### Environment Variables

**Hoarder**

| Variable                        | Required | Description                          |
| ------------------------------- | -------- | ------------------------------------ |
| `BROWSER_CONNECT_ONDEMAND`      | Yes      | Connect to Chrome only when required |
| `BROWSER_WEBSOCKET_URL`         | Yes      | Private Chrome Playwright endpoint   |
| `CRAWLER_DOWNLOAD_BANNER_IMAGE` | No       | Download banner images               |
| `CRAWLER_NUM_WORKERS`           | No       | Number of crawler workers            |
| `CRAWLER_STORE_SCREENSHOT`      | No       | Store crawler screenshots            |
| `DATA_DIR`                      | Yes      | Persistent data directory            |
| `DISABLE_SIGNUPS`               | No       | Enable or disable registration       |
| `MAX_ASSET_SIZE_MB`             | No       | Maximum asset size                   |
| `MEILI_ADDR`                    | Yes      | Private Meilisearch address          |
| `MEILI_MASTER_KEY`              | Yes      | Meilisearch authentication key       |
| `NEXTAUTH_SECRET`               | Yes      | Session signing secret               |
| `NEXTAUTH_URL`                  | Yes      | Public Hoarder URL                   |
| `PORT`                          | Yes      | Hoarder port, `3000`                 |
| `RAILWAY_RUN_UID`               | Yes      | Runtime UID, `0`                     |

Raw Editor:

```env
BROWSER_CONNECT_ONDEMAND=true
BROWSER_WEBSOCKET_URL=ws://${{chrome.RAILWAY_PRIVATE_DOMAIN}}:${{chrome.BROWSER_PORT_PRIVATE}}/chromium/playwright?token=${{chrome.TOKEN}}
CRAWLER_DOWNLOAD_BANNER_IMAGE=true
CRAWLER_NUM_WORKERS=1
CRAWLER_STORE_SCREENSHOT=true
DATA_DIR=/data
DISABLE_SIGNUPS=false
MAX_ASSET_SIZE_MB=50
MEILI_ADDR=http://${{meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700
MEILI_MASTER_KEY=${{meilisearch.MEILI_MASTER_KEY}}
NEXTAUTH_SECRET=${{secret(32)}}
NEXTAUTH_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
PORT=3000
RAILWAY_RUN_UID=0
```

**Meilisearch**

| Variable             | Required | Description                            |
| -------------------- | -------- | -------------------------------------- |
| `MEILI_MASTER_KEY`   | Yes      | Authentication key shared with Hoarder |
| `MEILI_NO_ANALYTICS` | No       | Disables analytics                     |
| `PORT`               | Yes      | Meilisearch port, `7700`               |

```env
MEILI_MASTER_KEY=${{secret(32)}}
MEILI_NO_ANALYTICS=true
PORT=7700
```

Hoarder references the generated key with:

```env
MEILI_MASTER_KEY=${{meilisearch.MEILI_MASTER_KEY}}
```

**Chrome**

| Variable                              | Required | Description                  |
| ------------------------------------- | -------- | ---------------------------- |
| `BROWSER_DOMAIN`                      | Yes      | Public Chrome domain         |
| `BROWSER_DOMAIN_PRIVATE`              | Yes      | Private Chrome domain        |
| `BROWSER_PLAYWRIGHT_ENDPOINT`         | No       | Public Playwright endpoint   |
| `BROWSER_PLAYWRIGHT_ENDPOINT_PRIVATE` | Yes      | Private Playwright endpoint  |
| `BROWSER_PORT_PRIVATE`                | Yes      | Private port, `3001`         |
| `BROWSER_TOKEN`                       | Yes      | Browser authentication token |
| `BROWSER_WEBDRIVER_ENDPOINT`          | No       | Public WebDriver endpoint    |
| `BROWSER_WEBDRIVER_ENDPOINT_PRIVATE`  | No       | Private WebDriver endpoint   |
| `BROWSER_WS_ENDPOINT`                 | No       | Public WebSocket endpoint    |
| `BROWSER_WS_ENDPOINT_PRIVATE`         | No       | Private WebSocket endpoint   |
| `PORT`                                | Yes      | Chrome port, `8080`          |
| `TIMEOUT`                             | No       | Browser timeout              |
| `TOKEN`                               | Yes      | Browser authentication token |

Raw Editor:

```env
BROWSER_DOMAIN=${{RAILWAY_PUBLIC_DOMAIN}}
BROWSER_DOMAIN_PRIVATE=${{RAILWAY_PRIVATE_DOMAIN}}
BROWSER_PLAYWRIGHT_ENDPOINT=wss://${BROWSER_DOMAIN}/playwright?token=${BROWSER_TOKEN}
BROWSER_PLAYWRIGHT_ENDPOINT_PRIVATE=ws://${BROWSER_DOMAIN_PRIVATE}:${BROWSER_PORT_PRIVATE}/playwright?token=${BROWSER_TOKEN}
BROWSER_PORT_PRIVATE=3001
BROWSER_TOKEN=${{secret(32)}}
BROWSER_WEBDRIVER_ENDPOINT=https://${BROWSER_DOMAIN}/webdriver
BROWSER_WEBDRIVER_ENDPOINT_PRIVATE=http://${BROWSER_DOMAIN_PRIVATE}:${BROWSER_PORT_PRIVATE}/webdriver
BROWSER_WS_ENDPOINT=wss://${BROWSER_DOMAIN}?token=${BROWSER_TOKEN}
BROWSER_WS_ENDPOINT_PRIVATE=ws://${BROWSER_DOMAIN_PRIVATE}:${BROWSER_PORT_PRIVATE}?token=${BROWSER_TOKEN}
PORT=8080
TIMEOUT=120000
TOKEN=${{secret(32)}}
```

Use Railway-generated secrets for authentication tokens and session secrets rather than hard-coding credentials.

#### Persistent Storage

Hoarder requires a Railway Volume because its SQLite database, bookmarks, assets, and other application data are stored in `/data`.

To add the volume:

1. Open the **Hoarder** service.
2. Go to **Settings → Volumes**.
3. Add a Volume.
4. Set the mount path to:

```text
/data
```

Meilisearch also requires persistent storage so its search index survives redeployments. Add a Railway Volume to the Meilisearch service at the data directory used by the container.

Chrome does not require persistent storage for this configuration.

#### Database

Hoarder uses embedded SQLite, so no PostgreSQL, MySQL, or other external database service is required.

The SQLite database is stored inside `/data`, making the Hoarder Volume essential for preserving data across redeployments.

#### Build & Start

No custom build or start commands are required.

Railway runs the configured container images directly.

#### Accessing the Application

1. Open the **Hoarder** service in Railway.
2. Go to **Settings → Networking**.
3. Select **Generate Domain**.
4. Open the generated HTTPS URL.
5. Create your Hoarder account.

The public URL is automatically assigned through:

```env
NEXTAUTH_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
```

New registrations are currently enabled:

```env
DISABLE_SIGNUPS=false
```

After creating the required accounts, set `DISABLE_SIGNUPS=true` to prevent new registrations.

AI tagging is optional. Add an OpenAI API key or configure an Ollama endpoint if AI-powered tagging is required.

## Why Deploy Hoarder on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — [Jul'26] 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/hoarder
