There are two ways to host ReMemory for your friends: static pages (simplest) and a self-hosted server (full-featured).
The lightest option. Generate a folder with recover.html and MANIFEST.age, then upload it anywhere that serves files — GitHub Pages, Netlify, an S3 bucket, any web server.
rememory seal --pages
# or after sealing:
rememory bundle --pagesThis creates output/pages/ in your project. The recover.html page fetches MANIFEST.age from the same directory automatically. Friends visit the URL, add their shares, and recover. No server-side code runs — it's just static files.
Works well when:
- You want to give friends a URL instead of (or alongside) a ZIP file
- You don't need the ability to create bundles from the browser
- You don't want to run a server
Limitations:
- Friends still need their shares (from their bundles or README.txt files)
- No admin interface — you manage files directly
- No bundle creation in the browser (use the CLI or maker.html)
Run ReMemory as a web app on your own server — create bundles, store encrypted archives, and recover, all from a browser.
A pre-built image is published to GitHub Container Registry on every release.
docker run -d \
--name rememory \
-p 8080:8080 \
-v rememory-data:/data \
ghcr.io/eljojo/rememory:latestVisit http://localhost:8080 to set up. The first page asks you to choose an admin password for deleting bundles.
To pin a specific version:
docker run -d \
--name rememory \
-p 8080:8080 \
-v rememory-data:/data \
ghcr.io/eljojo/rememory:v0.0.16Docker Compose:
services:
rememory:
image: ghcr.io/eljojo/rememory:latest
ports:
- "8080:8080"
volumes:
- rememory-data:/data
restart: unless-stopped
# environment:
# REMEMORY_MAX_MANIFEST_SIZE: 200MB
volumes:
rememory-data:The container is a single static binary with no dependencies. Data lives in /data — mount a volume there to persist across restarts.
If you have the CLI installed:
rememory serve| Flag | Env var | Default | Description |
|---|---|---|---|
--port, -p |
REMEMORY_PORT |
8080 |
Port to listen on |
--host |
REMEMORY_HOST |
127.0.0.1 |
Host to bind to |
--data, -d |
REMEMORY_DATA |
./rememory-data |
Data directory for bundles and config |
--max-manifest-size |
REMEMORY_MAX_MANIFEST_SIZE |
50MB |
Maximum MANIFEST.age size (e.g. 50MB, 1GB) |
Flags take precedence over environment variables.
Put the server behind a reverse proxy with TLS.
Caddy:
rememory.example.com {
reverse_proxy localhost:8080
}
nginx:
server {
listen 443 ssl;
server_name rememory.example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100M;
}
}The admin password only protects bundle deletion. For access control, use an auth proxy:
- The server stores only encrypted archives (MANIFEST.age). Without enough shares, the archive is useless.
- Shares are never sent to the server. They stay in each friend's bundle.
- The admin password uses age's scrypt-based passphrase encryption. Choose a strong one.
- Put the server behind HTTPS and authentication appropriate for your threat model.
Friends still get self-contained offline bundles. The server is a convenience — if it goes away, they can recover without it.
The data directory contains:
rememory-data/
admin.age # Admin password (age-encrypted)
bundles/
<uuid>/
meta.json # Non-secret metadata
MANIFEST.age # Encrypted archive
Back up this directory to preserve your encrypted archives. The admin.age file can be recreated by setting a new password (you'd lose the ability to delete existing bundles with the old password, but the bundles themselves are unaffected).