Deploy Hoarder
KaraKeep - bookmark-everything app (links, notes and images),AI added
Hoarder
Just deployed
/data
meilisearch
Just deployed
/meili_data
chrome
Just deployed
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
- Hoarder Documentation
- Hoarder Docker Installation
- Chrome Repository
- Meilisearch Docker Image
- Railway Volumes Documentation
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:
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:
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 |
MEILI_MASTER_KEY=${{secret(32)}}
MEILI_NO_ANALYTICS=true
PORT=7700
Hoarder references the generated key with:
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:
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:
- Open the Hoarder service.
- Go to Settings → Volumes.
- Add a Volume.
- Set the mount path to:
/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
- Open the Hoarder service in Railway.
- Go to Settings → Networking.
- Select Generate Domain.
- Open the generated HTTPS URL.
- Create your Hoarder account.
The public URL is automatically assigned through:
NEXTAUTH_URL=https://${{RAILWAY_PUBLIC_DOMAIN}}
New registrations are currently enabled:
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.
Template Content
meilisearch
getmeili/meilisearch:v1.41.0chrome
arloodots/chrome