---
title: "Deploy Linkwarden"
description: "Self-hosted bookmark manager with permanent page archives"
category: "Storage"
url: https://railway.com/deploy/linkwarden-3
---

# Deploy Linkwarden

Self-hosted bookmark manager with permanent page archives

**[Deploy Linkwarden on Railway](https://railway.com/template/linkwarden-3)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/linkwarden-3/manifest.json

- **Creator:** mcmax
- **Category:** Storage

## Template content

### linkwarden

- **Source:** https://github.com/mc9max/linkwarden-lite
- **Public domain:** Yes

### postgres

- **Source:** https://github.com/mc9max/linkwarden-lite

### meilisearch

- **Source:** https://github.com/mc9max/linkwarden-lite

## Documentation

# Deploy and Host

[![Deploy on Railway](https://railway.app/button.svg)](https://railway.com/deploy/linkwarden-lite?utm_campaign=linkwarden-lite)

**Linkwarden** — a self-hosted, collaborative bookmark manager that permanently archives every saved page as a **screenshot, PDF, and single-file HTML snapshot**, so your links survive link rot. Collections, tags, sharing, browser extension, mobile apps, and fast full-text search.

Deploys in one click with **zero form fields**. Three services come up together:

- **linkwarden** — the Next.js web app + archiving worker (headless Chromium + `monolith` HTML snapshots) on `/`
- **postgres** — PostgreSQL 16 on a Railway volume
- **meilisearch** — full-text search on a Railway volume, private-network only

The database URL is composed at boot from the Postgres companion; `NEXTAUTH_URL` points at your Railway domain; all secrets (`NEXTAUTH_SECRET`, `POSTGRES_PASSWORD`, `MEILI_MASTER_KEY`) are generated. Open the domain and create your account.

## About Hosting

The app honors Railway's injected `PORT`. The entrypoint waits for Postgres, runs `prisma migrate deploy`, then starts the web server and the archiving worker. Archives, the database cluster, and the search index each live on their own Railway volume. Healthcheck is `GET /` (200 or login redirect, unauthenticated).

- **Memory:** app ~500 MB at rest; `MAX_WORKERS=1` caps Chromium concurrency so archive bursts stay inside Hobby limits. Postgres ~100 MB, Meilisearch ~200 MB at rest.
- **Build:** the official prebuilt images (all digest-pinned) — no source builds, deploys in minutes.

## Why Deploy

Read-it-later apps rent you your own memory. Linkwarden keeps it on your hardware: every page you save is archived in three formats on your volume, full-text indexed on your Meilisearch, and searchable forever — no subscription, no link rot, no third party reading your bookmarks. The worker does real sustained work per saved link (Chromium renders screenshots/PDFs, `monolith` inlines a portable HTML copy), which is exactly the kind of always-on workload that belongs on your own Railway project instead of a metered cloud plan.

## Common Use Cases

- A personal "second brain" of web pages immune to link rot
- Team research collections with per-collection permissions and public share links
- RSS-fed auto-archiving of newsletters and blogs
- Archiving pages ahead of a redesign, shutdown, or paywall
- Full-text search across everything you have ever saved

## Dependencies for

### Deployment Dependencies

Three services, zero form fields, three volumes. The app needs outbound HTTPS (to archive the pages you save). Postgres and Meilisearch talk to the app over Railway's private network only — neither gets a public domain.

**Configuration** (all auto-filled `${{...}}` expressions; optional upstream vars go in the service Variables panel):

| Variable | Default | What it does |
|---|---|---|
| `PGHOST` / `PGPASSWORD` | `${{postgres.…}}` refs | Postgres companion credentials; composed into `DATABASE_URL` at boot |
| `NEXTAUTH_URL` | `https://${{RAILWAY_PUBLIC_DOMAIN}}/api/v1/auth` | Public auth callback base URL |
| `NEXTAUTH_SECRET` | `${{secret(32)}}` | Session signing secret |
| `MEILI_HOST` | `http://${{meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700` | Full-text search backend |
| `MEILI_MASTER_KEY` | `${{meilisearch.MEILI_MASTER_KEY}}` | Shared search API key |
| `STORAGE_FOLDER` | `/data/data` (baked) | Archive storage path |
| `MAX_WORKERS` | `1` (baked) | Concurrent Chromium archival jobs |

Useful upstream options: `PAGINATION_TAKE_COUNT`, `ARCHIVE_TAKE_COUNT`, `BROWSER_TIMEOUT`, `MAX_LINKS_PER_USER`, `NEXT_PUBLIC_RSS_POLLING_INTERVAL_MINUTES`, `TEXT_CONTENT_LIMIT`, AI auto-tagging (`OLLAMA_MODEL` or `OPENAI_API_KEY` + provider variants), S3 archive storage (`SPACES_*`), SMTP (`EMAIL_SERVER`/`EMAIL_FROM`), outbound `PROXY`, `ALLOW_PRIVATE_NETWORK_ACCESS`, PDF margins, and 40+ SSO providers (`NEXT_PUBLIC__ENABLED` + credentials — GitHub, Google, Authentik, Keycloak, generic OIDC, …). Full list: https://docs.linkwarden.app/self-hosting/environment-variables


## Similar templates

- [RustFS | (Just Updated) S3 Object Store, Public URL and Keys Set](https://railway.com/deploy/rustfs-or-just-updated-s3-object-store-p) — S3-compatible object store, keys and public URL preset, volume kept
- [TimescaleDB](https://railway.com/deploy/timescaledb-railway-template) — A PostgreSQL-based time-series database for analytics on Railway.
- [Garage S3 Storage](https://railway.com/deploy/garage-s3-storage) — Ultra-light S3 server: fast, open-source, plug-and-play.

Open this page in a browser: https://railway.com/deploy/linkwarden-3
