Life Binder is a static, client-side SPA. There is no server-side database: your data lives in the browser (IndexedDB) and is encrypted client-side.
That means deployment is mainly about serving static files (HTML/CSS/JS) behind any web server you like.
- Framework: React Router v7
- Language: TypeScript
- Styling: Tailwind CSS
- Storage: IndexedDB (via
idb) - Encryption: Web Crypto API (AES-GCM)
- PDF Generation: jsPDF
- No backend required. Hosting is just static files.
- Backups are on you. Encourage users to export backups regularly.
This is the “classic” path: build the SPA with Node, then serve the generated build/ folder.
npm install
npm run buildThe provided Dockerfile builds the SPA and serves it with nginx-unprivileged (listens on 8080 inside the container).
Build:
docker build --platform linux/amd64,linux/arm64 -t lifebinder .Using --platform is to enable multi-platform support, and being able to run this as a self-hosted tool on Synology.
Run (maps host port 3000 to container port 8080):
docker run -d --restart unless-stopped -p 3000:8080 lifebinderOpen:
http://localhost:3000
The repo includes a docker-compose.yaml ready for self-hosting.
Start:
docker compose up -dDefaults:
- Container listens on
8080 - Host exposes it on
${EXTERNAL_PORT:-3000}
Override the external port:
EXTERNAL_PORT=8080 docker compose up -dOr create a .env file next to docker-compose.yaml:
EXTERNAL_PORT=3000
BUILD_VERSION=latestThe container includes a simple health check (HTTP GET /). In Docker you’ll see healthy/unhealthy status.
Synology’s Container Manager works well for this kind of “static web app in a box”. The main things to understand are:
- You have to have Container Manager installed.
- Go to Registry page inside Container Manager, search for
w0rldart/lifebinderimage, and download it. - Run the image, ensuring
Set up web portal via Web Stationoption is enabled with 8080 port for HTTP. - Go to Web Station when given the option after loading the Docker image, and ensure
Portal typeis configured asPort-based. EnableHTTPand choose a port you want the app to be accessible on (i.e. 3333)