OneArctic is a self-hosted and single-user Google Keep-style note app. Built with Nuxt, SQLite, and Meilisearch.
- Text and checklist notes in a masonry grid
- Labels with drag-and-drop ordering
- Archive and trash
- Full-text search powered by Meilisearch
- Image and file attachments with thumbnails and a lightbox
- Real-time sync across open tabs and devices
- Installable as a PWA
- Login with a TOTP authenticator app (no password to leak)
- All data stored locally in SQLite and plain files
TBA
- Docker and Docker Compose v2
- Clone the repo:
git clone https://github.com/OneBacklog/OneArctic
cd OneArctic- Generate secrets and create data folders (run it as your normal user, not with
sudo):
APP_ENV=production bash setup.shThe containers run as the user who ran setup.sh, so everything in data/ stays owned by you.
Important
It is recommended to serve the app over HTTPS. If you don't, change COOKIE_SECURE to false in the .env file.
- Start the services:
docker compose up -dThe app will be available at http://localhost:3000.
- After the app is running, generate your OTP secret:
docker compose run --rm setup-auth- Reset the OTP secret (generates a new key) if somehow you lose it:
docker compose run --rm -e RESET=1 setup-authSee compose.traefik.yaml for a Traefik example.
The app reads secrets from .env (created by setup.sh).
| Variable | Required | Description |
|---|---|---|
JWT_SECRET |
Yes | Secret for signing auth tokens (min 32 chars). |
MEILI_MASTER_KEY |
Yes | Meilisearch master key. |
COOKIE_SECURE |
No | Use secure cookies (HTTPS). Defaults to true; set to false when serving over plain HTTP. |
PORT |
Yes | Host port for the app. Default 3000. |
DATABASE_PATH |
Yes | SQLite database file path. |
FILES_PATH |
Yes | Attachments storage path. |
MEILISEARCH_HOST |
Yes | Meilisearch HTTP endpoint. |
PUID / PGID |
No | User and group that own everything in data/. Set automatically by setup.sh; if empty, the app uses the owner of data/db. |
SEARCH_REINDEX |
No | Set to true to rebuild the search index on startup, e.g. after deleting data/meili/. Remove it afterwards. |
All data is stored under ./data/:
data/
db/ — SQLite Database
files/ — Uploaded Images and Files
meili/ — Meilisearch Index
Everything in data/ is owned by the user set in PUID/PGID. If setup.sh reports files owned by another user (for example root), fix them once with the chown command it prints.
Everything lives in data/, so a backup is a copy of that directory. Stop the app first so the SQLite database is in a consistent state:
docker compose stop app
tar czf onearctic-backup-$(date +%F).tar.gz data/
docker compose start appTo restore, stop the services, replace data/ with the contents of the archive, and start them again. If you leave data/meili/ out of the backup, start the app once with SEARCH_REINDEX=true after restoring to rebuild search.
docker compose pull
docker compose up -dSee DEVELOPMENT.md for local setup and CONTRIBUTING.md for guidelines. Please report security issues privately as described in SECURITY.md.
OneArctic is licensed under the GNU Affero General Public License v3.0.