Railway

Deploy Hoarder

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

Deploy Hoarder

Just deployed

/data

Just deployed

/meili_data

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

DependencyRequiredPurpose
HoarderYesMain application, workers, API, and SQLite database
MeilisearchYesFull-text search
ChromeYesCrawling, rendering, and screenshots
Railway VolumeYesPersistent Hoarder data
Private NetworkingYesInternal service communication
OpenAI API / OllamaOptionalAI-powered tagging

Deployment Dependencies

Implementation Details

Docker

The template uses these container images:

ServiceDocker Image
Hoarderghcr.io/hoarder-app/hoarder:latest
Meilisearchgetmeili/meilisearch:v1.41.0
Chromeghcr.io/arloodots/chrome

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

Public Networking
ServiceProxy TypeTarget Port
HoarderHTTP Proxy3000
ChromeHTTP Proxy8080
MeilisearchPrivate Networking7700

Hoarder connects to Chrome privately using:

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

Hoarder

VariableRequiredDescription
BROWSER_CONNECT_ONDEMANDYesConnect to Chrome only when required
BROWSER_WEBSOCKET_URLYesPrivate Chrome Playwright endpoint
CRAWLER_DOWNLOAD_BANNER_IMAGENoDownload banner images
CRAWLER_NUM_WORKERSNoNumber of crawler workers
CRAWLER_STORE_SCREENSHOTNoStore crawler screenshots
DATA_DIRYesPersistent data directory
DISABLE_SIGNUPSNoEnable or disable registration
MAX_ASSET_SIZE_MBNoMaximum asset size
MEILI_ADDRYesPrivate Meilisearch address
MEILI_MASTER_KEYYesMeilisearch authentication key
NEXTAUTH_SECRETYesSession signing secret
NEXTAUTH_URLYesPublic Hoarder URL
PORTYesHoarder port, 3000
RAILWAY_RUN_UIDYesRuntime 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

VariableRequiredDescription
MEILI_MASTER_KEYYesAuthentication key shared with Hoarder
MEILI_NO_ANALYTICSNoDisables analytics
PORTYesMeilisearch 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

VariableRequiredDescription
BROWSER_DOMAINYesPublic Chrome domain
BROWSER_DOMAIN_PRIVATEYesPrivate Chrome domain
BROWSER_PLAYWRIGHT_ENDPOINTNoPublic Playwright endpoint
BROWSER_PLAYWRIGHT_ENDPOINT_PRIVATEYesPrivate Playwright endpoint
BROWSER_PORT_PRIVATEYesPrivate port, 3001
BROWSER_TOKENYesBrowser authentication token
BROWSER_WEBDRIVER_ENDPOINTNoPublic WebDriver endpoint
BROWSER_WEBDRIVER_ENDPOINT_PRIVATENoPrivate WebDriver endpoint
BROWSER_WS_ENDPOINTNoPublic WebSocket endpoint
BROWSER_WS_ENDPOINT_PRIVATENoPrivate WebSocket endpoint
PORTYesChrome port, 8080
TIMEOUTNoBrowser timeout
TOKENYesBrowser 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:

  1. Open the Hoarder service.
  2. Go to Settings → Volumes.
  3. Add a Volume.
  4. 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
  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:

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

More templates in this category

View Template
Rocky Linux
[Jul'26] Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
37
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