Less than two weeks after launching Edi Life OS, my self-hosted life dashboard (habits, goals, focus timer, Kanban, finances, plus an MCP server for AI assistants), here is v1.2. More than twenty pull requests have landed since the last release, and most of them came from people I had never met.
What's new
Multiple accounts with private workspaces
Each account signs in on its own and has its own Finance, Focus, Goals, Growth, Kanban, habits, notes, attachments, theme and currency. Everything in the app and the API is filtered to the signed-in account, so one account cannot read another's data by guessing an ID.
Two things to know before you use it:
- Every account is an administrator. Administrators can reset each other's passwords, which means they can sign in as that person. There is no public sign-up; only add people you trust.
- Back up your database before upgrading. Version 1.2 migrates the schema (version 3), and older versions of the app must not run against it, because their queries would show every account's rows. The details are in docs/accounts.md.
A prebuilt Docker image
No clone, no build. The image is published for amd64 and arm64, so it also runs on a Raspberry Pi:
curl -fsSLO https://raw.githubusercontent.com/edrisranjbar/lifeos/main/docker-compose.image.yml
curl -fsSL https://raw.githubusercontent.com/edrisranjbar/lifeos/main/.env.example -o .env # then set your sign-in and passwords
docker compose -f docker-compose.image.yml up -d
Open http://localhost:8080. Upgrade later with docker compose -f docker-compose.image.yml pull && docker compose -f docker-compose.image.yml up -d; your data lives in named volumes. Pin a version with LIFEOS_VERSION=1.2.0 in .env.
And more
- 18 more display currencies (SEK, NOK, DKK, PLN, CZK, BRL, MXN, ARS, CLP, COP, SAR, QAR, KWD, EGP, ZAR, NGN, PKR, BDT). They only change the label; nothing is converted.
- Inline editing of goal checklist tasks, and redesigned Notes, Notepad and Personal Growth views.
- Hardening: logout is a POST with a CSRF check, schema changes run once per version under a lock, and static assets are cached with versioned URLs.
The community part
This is the part I did not expect. A set of small, well-explained issues (an accessibility fix, a few currencies, backup commands, reverse-proxy examples, a troubleshooting guide, a Spanish README) turned into pull requests from three people who had never contributed here before. Their work is in the release notes with their handles. If you want a first open-source contribution, the good first issues are real and there are more.
A bug I caught after publishing
Right after I published the image I looked at the registry's tag list instead of assuming it was fine. The compose file asked for the latest tag, and latest did not exist yet, because that tag is only created when you push a release. The one-line install would have failed for the first person who tried it.
I fixed the default, tagged the release, and then added a CI job that runs the README's exact steps on a clean machine (download the compose file, set a password, start the published image, sign in) on every change. If you publish an artifact, test the artifact, not just the code that builds it.
Links
- Release notes and download: https://github.com/edrisranjbar/lifeos/releases/tag/v1.2.0
- Repo: https://github.com/edrisranjbar/lifeos
- Landing page: https://edrisranjbar.github.io/lifeos/
- Docker image:
ghcr.io/edrisranjbar/lifeos
What do you check before trusting a self-hosted project with your data? I'd like to hear it in the comments.

Top comments (0)