Harbor documentation

Harbor is a self-hosted document vault for a household. Learn how to install Harbor, organize household records, and recover from a backup.

On this page

Harbor runs as a small stack of containers on one Linux machine, with everything it stores on one encrypted volume. Your household reaches it privately through Tailscale, directly at a domain of your own on the internet, or directly on your own network or a VPN you already run; Tailscale is one option, not a requirement. Paperwork gets in by upload or by email. Harbor extracts searchable text and, with a language model configured, suggests how to organize documents and track their dates. Configure nightly encrypted backups and review the monthly restore-test results in Settings.

Start here#

  1. Install: choose where Harbor will run, at home, on a cloud server, or on a server you already have, and follow the guide for it.
  2. First run: create your account, add a test document, and check backups.

Before adding important records, configure Backups and The break-glass envelope.

What you are building#

Outside the house

  • Your laptop or phonethrough Tailscale, at your domain, or on your own network
  • Your mailboxIMAP, read only
  • The model you chosetext of each document
  • Your backup targetencrypted snapshots, nightly

The box

  • tailscaleoptional: serves the app on your tailnettalks to your laptop or phone
  • caddyoptional: serves the app at your domain, over HTTPStalks to your laptop or phone
  • webthe appinternal only
  • apiHTTP API, sessions, migrationsinternal only
  • workerOCR and text extraction; the only process that opens a documentno route out
  • suggestertitles, categories, dates, summariestalks to the model you chose
  • mailfetchreads connected mailboxestalks to your mailbox
  • backupnightly dump and snapshot, monthly restore testtalks to your backup target
  • postgres · redisstate and queuesinternal only

/data one encrypted volume: documents, database, queues, secrets

Nothing on the box listens on the public internet unless you serve it at a domain, and then only Caddy does. Each container that talks outside talks to one thing.

Two of those containers are worth knowing by name. The worker extracts text and creates previews, without direct internet access. The suggester is the one that talks to a language model, and it sends text, never files. The language model says exactly what it sends, and What runs describes every container.

Where these pages come from#

They are written from the repository's own docs: deploy.md, restore.md, and the design spec. When troubleshooting a version-specific issue, use the repository documentation for the release you have installed.