Yuvomi

Yuvomi

Docker app from yuvomi's Repository

Overview

Yuvomi is a private, self-hosted family planner - one calm home for everything your household needs to stay organized. No cloud accounts, no subscriptions, no tracking: your data lives on your server and nowhere else.

Independent modules - turn on what fits, ignore the rest:

  • Dashboard - today's tasks, events, meals and reminders at a glance
  • Tasks - shared to-dos with priorities, due dates and assignees
  • Shopping - collaborative grocery lists, auto-sorted by category
  • Meals & Recipes - weekly meal planner with a built-in recipe book
  • Pantry - what's actually in the house, with storage places and best-before alerts
  • Calendar - family calendar with recurring events and reminders
  • Budget - income, expenses, accounts, subscriptions and loans, with shared costs split automatically
  • Health - vitals, medications, lab results and activity, per household member
  • Rewards - points on chores, a parent-approved catalogue and an auditable ledger
  • Inventory - what you own, with warranties and deadlines (off by default)
  • Housekeeping - chores, supplies and staff/session tracking
  • Documents - store and find important household files
  • Notes, Contacts & Birthdays - everything else in one tidy place

Why Yuvomi:

  • Mobile-first PWA - install it on any phone, works offline

  • Light & dark mode, fast and polished (no bloated frameworks, no build step)

  • Optional sync - CalDAV / CardDAV, Apple and Google Calendar

  • OIDC single sign-on for households that already run an identity provider

  • Encrypted-at-rest storage (SQLCipher) with automated, scheduled backups

  • Multi-language, fully self-contained and MIT-licensed

  • Setup -

REQUIRED: Set a long random SESSION_SECRET.
RECOMMENDED: Set a strong DB_ENCRYPTION_KEY to encrypt the database at rest - without it the database and any synced calendar/contact credentials are stored unencrypted.
Generate either secret with: openssl rand -base64 48

After the container starts, open the WebUI - the first visit guides you through creating your admin account. (Headless setups can alternatively run node setup.js in the container console.) Then log in - pick the modules you want and invite your family.

Yuvomi

One private home for everything that keeps a household running.

Tasks, calendar, budget, groceries, meals, health and more - for a family, a couple, or just you. Eighteen modules on a server you own, and the only thing that leaves it is a version check.

Latest release GitHub stars Docker image MIT license

→ Install in minutes  ·  Screenshots & tour  ·  Docs  ·  Changelog

Auf Deutsch lesen



The Yuvomi dashboard: today's tasks, calendar events, meals and the shopping list on one screen

18 modules  ·  24 languages  ·  0 trackers  ·  optional AES-256 database encryption  ·  MIT

Most households glue their life together from a dozen paid apps, each with its own account, its own subscription and its own copy of your data on someone else's server. Yuvomi puts all of it in one place that belongs to you, running as a container on any home server or NAS. Every module is independent, so you use what fits and switch off what doesn't.


One app instead of a dozen subscriptions

Instead of juggling… Yuvomi gives you
a to-do & task app Tasks - Kanban, deadlines, recurring, multi-assignment
a shared calendar subscription Calendar - sync, subscriptions, per-event visibility
a cost-splitting app Shared expenses - shared costs with debt simplification
a budgeting app Budget - income, expenses, accounts, savings goals
a meal planner & recipe app Meals & Recipes - weekly planner with shopping export
a grocery-list app Shopping - shared, aisle-organized lists
a pantry & expiry tracker Pantry - stock, storage location, best-before dates
a document manager Documents - tagged, searchable family files
a home-inventory app Inventory - owned belongings, purchase price, warranty, linked receipts
a notes app & contacts sync Notes & Contacts - Markdown notes, CardDAV sync

The modules talk to each other

This is the part a folder full of separate apps cannot do:

  • The week's meal plan writes the shopping list. Plan Thursday, and the ingredients are on the list before anyone walks to the shop.
  • The last jar out of the pantry is already on the list. Tick items off after a shop and they book back into the pantry with their quantity.
  • A ticked-off chore pays out. Points on a task land on the assigned member's account, and the reward catalog spends them.
  • A filed receipt hangs on the booking. Upload it once and it belongs to the transaction, the shared expense and the inventory item at the same time.

The eighteen modules

Turn on what your household needs; the rest stays out of the way.

Module In one line
Tasks Kanban board with deadlines, priorities, subtasks, tags, recurring schedules and multi-member assignment. Attach documents and discuss a task in comments. Lock a task so only its creator and admins can redefine it, while everyone else can still tick it off.
Shopping Shared lists grouped by aisle and ordered to match your shop, with swipe gestures and one-tap import from the meal plan.
Meals Weekly drag-and-drop planner with a recipe sidebar and direct export to the shopping list.
Recipes Create, duplicate and scale recipes, then pre-fill meal slots or send the ingredients to a shopping list. A Mealie or Tandoor instance can be mirrored read-only.
Pantry What is actually in the house: amount, storage location and best-before date, with expiry and low-stock filters.
Calendar Two-way sync with Google and CalDAV, one-way Outlook push via Microsoft Graph, calendar subscriptions, recurring events, holiday overlays and per-event visibility.
Documents Upload, tag, preview and organize family files, with optional WebDAV or Google Drive storage.
Inventory What you own: purchase price, warranty, condition and storage location, with linked receipts and deadline reminders. Off by default; households turn it on.
Budget Income, expenses, accounts, loans, subscriptions and per-category planning, with a personal mode. An entry can share its amount while keeping its title and category private, so a shared account's balance stays right.
Housekeeping Household staff: schedules, check-in/out, daily or hourly billing, chores and supply requests.
Rewards Points on tasks credit the assigned member, with a parent-approved catalog and an auditable ledger.
Health Per-member vitals, medications, labs, activity and cycle tracking, with trend charts.
Notes & Contacts Colored Markdown sticky notes plus a contact directory with CardDAV sync and vCard import/export.
Birthdays Birthday tracker with automatic calendar events, age display and reminders.
Family Member profiles with roles, photos and contact details. New members join through an invite link and pick their own password.
Reminders Reminders on tasks and events via in-app badges, opt-in push, and household Gotify, ntfy or webhook channels.
API Tokens Bearer / X-API-Key tokens with an OpenAPI 3.0 spec and a built-in MCP endpoint for AI agents. Writes are retry-safe via an optional Idempotency-Key header.
Backup Manual and scheduled backup/restore with pre-restore rollback and optional cloud upload.

Two more things you only get on your own server: wall mode turns the kitchen tablet into a readable-from-across-the-room display, and an Immich screensaver rotates your own photos when the screen goes idle. Every module in full detail is in the spec; building your own drop-in module is covered in the module guide.


Install

  • Image - ghcr.io/ulsklyc/yuvomi:latest, about 500 MB.
  • Needs - 256 MB RAM and one port, 3000 by default.
  • Writes - four volumes you own: data, backups, modules, documents.
  • Outbound - one update check against the GitHub releases API, nothing else. Block it and nothing breaks: the changelog then reads the history that ships with your installation, only the hint about a newer version stays away. Weather, calendar sync and cloud backup stay off until you fill in credentials.
  • Your data - one SQLite file at /data/yuvomi.db. Copying it is the whole export, unless you moved document storage to a folder, WebDAV or Drive; those files then need their own backup.

Docker or Podman

curl -O https://raw.githubusercontent.com/ulsklyc/yuvomi/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/ulsklyc/yuvomi/main/.env.example
cp .env.example .env
# two values: one for SESSION_SECRET, one for DB_ENCRYPTION_KEY
openssl rand -hex 32
openssl rand -hex 32

Now open .env and replace both REPLACE_WITH_… placeholders with the two values you just generated. Once a database is encrypted, a lost or changed key never opens it again, not by you and not by us, so write the value down. To run without encryption, clear the line instead of filling it.

docker compose up -d

Open http://localhost:3000. The first visit walks you through creating your admin account.

On Podman, take podman-compose.yml instead of docker-compose.yml above and start it with podman compose -f podman-compose.yml up -d; it carries the SELinux :Z volume labels that RHEL, Fedora and CentOS Stream need. Both installers detect Podman on their own.

Guided setup

A setup wizard in your browser, in 24 languages. It detects Docker or Podman, configures HTTPS, single sign-on and scheduled backups, then starts the container and creates your admin account.

git clone https://github.com/ulsklyc/yuvomi.git && cd yuvomi
node tools/installer/install-server.js

Open http://localhost:8090. Needs Node.js 18+ on the host; the container ships its own Node 22.

From your NAS app store

TrueNAS SCALE, Umbrel and Unraid all carry Yuvomi: search for it in the app catalog and install, no terminal required. New to containers? The installation guide covers engine setup, HTTPS, backups and troubleshooting step by step.

Worth reading before you go live

Health is not a medical device. No diagnostic claims are made. Health data is sensitive, so enable database encryption (DB_ENCRYPTION_KEY, SQLCipher).

External document storage needs its own backup. Database backups hold document metadata and links, not binaries stored in a local folder, on WebDAV, or in Google Drive; back up the selected target separately. Yuvomi visibility settings only control access through Yuvomi. Anyone with access to the connected Yuvomi/Documents Google Drive folder can view all files stored there.

Internal (LAN / private IP) targets are blocked by default. Server-side request protection rejects private, loopback, link-local and internal-DNS URLs for calendar subscriptions, WebDAV document storage and recipe mirrors. To use an internally-resolving URL, set the matching opt-in in your deployment environment. See the installation guide.

Some catalog slugs still carry the legacy name oikos (e.g. Unraid oikos-…). The app shows and installs as Yuvomi everywhere; where the technical slug stays oikos, it is kept so existing installations upgrade seamlessly. Search for Yuvomi; if a store still surfaces an entry as oikos, it is the same app.


Before you commit

What if this project stops? Nothing changes on your machine. It is MIT-licensed and self-hosted, there is no server of ours anywhere in the path, and the only thing that leaves your machine is a version check against the GitHub releases API. The container you already pulled keeps running exactly as it does today, with or without us.

What if you want your data somewhere else? Copying one file is the whole export, as long as documents live in the database. Everything else is in that single SQLite file on your own disk. Scheduled backups write a restorable archive on top of that, and the documented API pulls anything out in whatever shape you need.

What does it cost? Nothing. Yuvomi is free and MIT-licensed. You provide the server; there is no subscription, no upsell and no paid tier.


Under the hood

  • No build step - pure ES modules and plain CSS. No bundler, no transpiler, no framework, no runtime CDN.
  • Apple HIG in the Liquid Glass language - the system font stack and Apple's type scale, capsule controls, inset-grouped lists and spring motion, verified for WCAG AA in light and dark.
  • Privacy first - fully self-hosted, optional SQLCipher AES-256 database encryption, zero telemetry.
  • Sign-in that scales to a household - optional single sign-on via any OIDC provider, invite links instead of handed-over passwords, and optional self-service password reset by email.
  • 24 languages with automatic detection. A separate household setting decides the language of entries Yuvomi creates itself, so an exported calendar speaks your household's language instead of English.

Express SQLite / SQLCipher Vanilla JS Plain CSS Node.js 22 or newer Docker Podman PWA


Documentation

Installation  ·  Spec & data model  ·  Third-party modules  ·  Notification webhooks  ·  Immich screensaver  ·  Contributing  ·  Security  ·  Changelog  ·  Backlog

If you self-host Yuvomi in a GDPR context (EU/EEA, processing other people's data), read privacy for self-hosters before going live. It covers third-country assessments for every external service, data-processing-agreement notes, log-retention guidance and a records-of-processing template.

Coming from Oikos? This project was renamed, and nothing about the app changes.

Yuvomi was renamed from Oikos to avoid a trademark conflict with an unrelated product. Same code, same data, same maintainer.

  • Old links (github.com/ulsklyc/oikos) redirect here automatically.
  • The Docker image moved to ghcr.io/ulsklyc/yuvomi; the old ghcr.io/ulsklyc/oikos keeps working, so update at your convenience.
  • Existing data and settings are fully preserved on upgrade.


Take back control of your family's data.

You install it once and it is yours after that. No account with us,
no subscription, and nothing of ours between your household and its data.

→ Install in minutes  ·  Ask a question


MIT licensed, see LICENSE.

Media gallery

1 / 5

Install Yuvomi on Unraid in a few clicks.

Find Yuvomi in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Yuvomi Review the template variables and paths Click Install

Details

Repository
ghcr.io/ulsklyc/yuvomi:latest
Last Updated2026-08-23
First Seen2026-06-09

Runtime arguments

Web UI
http://[IP]:[PORT:3000]
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

Host port for the Yuvomi web interface.

Target
3000
Default
3000
Value
3000
DataPathrw

Database and stored app data (uploads, documents).

Target
/data
Default
/mnt/user/appdata/yuvomi/data
Value
/mnt/user/appdata/yuvomi/data
BackupsPathrw

Destination folder for scheduled and manual database backups.

Target
/backups
Default
/mnt/user/appdata/yuvomi/backups
Value
/mnt/user/appdata/yuvomi/backups
Modules (optional)Pathrw

Optional: drop-in folder for additional Yuvomi modules. Leave default if unused.

Target
/app/modules
Default
/mnt/user/appdata/yuvomi/modules
Value
/mnt/user/appdata/yuvomi/modules
Documents (optional)Pathrw

Optional: host folder for local document storage. Only used when DOCUMENT_STORAGE_LOCAL_ENABLED=true. Leave default if unused.

Target
/documents
Default
/mnt/user/appdata/yuvomi/documents
Value
/mnt/user/appdata/yuvomi/documents
SESSION_SECRETVariable

REQUIRED. A long random string used to sign sessions. Generate with: openssl rand -base64 48

DB_ENCRYPTION_KEYVariable

RECOMMENDED. Strong key to encrypt the database at rest (SQLCipher). Leave empty for unencrypted SQLite. Cannot be changed later without re-encrypting. Generate with: openssl rand -base64 48

TimezoneVariable

Container timezone, e.g. Europe/Berlin. Affects scheduled backups, reminders, the times in the exported calendar feed, and is the fallback zone for events pushed to Google Calendar.

Target
TZ
Default
Europe/Berlin
Value
Europe/Berlin
SESSION_SECUREVariable

Set to true only when serving Yuvomi over HTTPS behind a reverse proxy. Keep false for direct HTTP access on the LAN.

Default
false
Value
false
TRUST_PROXYVariable

Use 1 behind one reverse proxy (Caddy/nginx/Traefik), or 'loopback' for direct (no proxy) access.

Default
loopback
Value
loopback
DB_PATHVariable

Path to the SQLite database inside the container. Keep default unless you know what you are doing. Legacy /data/oikos.db is auto-migrated on boot.

Default
/data/yuvomi.db
Value
/data/yuvomi.db
BACKUP_DIRVariable

Directory inside the container where backup files are written. Must match the Backups path mapping above, otherwise backups fail with a permission error.

Default
/backups
Value
/backups
WEATHER_LATVariable

Optional. Latitude for the Open-Meteo weather widget (no API key required). Find coordinates on openstreetmap.org or Google Maps, e.g. 52.52.

WEATHER_LONVariable

Optional. Longitude for the Open-Meteo weather widget, e.g. 13.41.

WEATHER_CITYVariable

Optional. Display name shown on the weather widget, e.g. Berlin.

WEATHER_UNITSVariable

Optional. Unit system for temperatures: metric (°C) or imperial (°F).

Default
metric
Value
metric
OPENWEATHER_API_KEYVariable

Optional (legacy). OpenWeatherMap API key to enable the weather widget. Prefer the keyless Open-Meteo variables above.

OPENWEATHER_CITYVariable

Optional (legacy). City for the OpenWeatherMap weather widget, e.g. Berlin.

OPENWEATHER_UNITSVariable

Optional (legacy). Unit system for temperatures: metric (°C) or imperial (°F).

Default
metric
Value
metric
OPENWEATHER_LANGVariable

Optional (legacy). Language code for OpenWeatherMap descriptions, e.g. en, de, fr.

Default
en
Value
en
GOOGLE_CLIENT_IDVariable

Optional. Google OAuth 2.0 client ID for Google Calendar sync.

GOOGLE_CLIENT_SECRETVariable

Optional. Google OAuth 2.0 client secret for Google Calendar sync.

GOOGLE_REDIRECT_URIVariable

Optional. OAuth callback URL, e.g. https://your-domain.com/api/v1/calendar/google/callback

GOOGLE_DRIVE_CLIENT_IDVariable

Optional Google Drive OAuth client ID override. Leave both Drive overrides empty to reuse Google Calendar credentials.

GOOGLE_DRIVE_CLIENT_SECRETVariable

Optional Google Drive OAuth client secret override.

GOOGLE_DRIVE_REDIRECT_URIVariable

Google Drive Documents callback URL, e.g. https://your-domain.com/api/v1/documents/storage/google-drive/callback

MS_CLIENT_IDVariable

Optional. Entra ID application (client) ID for the one-way Outlook calendar push via Microsoft Graph.

MS_CLIENT_SECRETVariable

Optional. Entra ID client secret for the Outlook calendar push.

MS_REDIRECT_URIVariable

Optional. OAuth callback URL, e.g. https://your-domain.com/api/v1/calendar/outlook/callback

OIDC_ISSUERVariable

Optional. OIDC issuer URL, e.g. https://authentik.example.com/application/o/yuvomi/

OIDC_CLIENT_IDVariable

Optional. OIDC client ID from your identity provider.

OIDC_CLIENT_SECRETVariable

Optional. OIDC client secret from your identity provider.

OIDC_REDIRECT_URIVariable

Optional. OIDC callback URL, e.g. https://your-domain.com/api/v1/auth/oidc/callback

OIDC_TRUST_EMAIL_WITHOUT_VERIFIED_CLAIMVariable

Optional. Set to true to allow account linking when your IdP omits the email_verified claim. Only enable if your IdP fully controls email verification and never issues unverified addresses (e.g. older Authentik without an explicit email_verified mapping).

APPLE_CALDAV_URLVariable

Optional. Apple CalDAV server URL (default: iCloud). Change only if using a custom CalDAV server.

Default
https://caldav.icloud.com
Value
https://caldav.icloud.com
APPLE_USERNAMEVariable

Optional. Apple ID (email) for iCloud Calendar sync.

APPLE_APP_SPECIFIC_PASSWORDVariable

Optional. Apple app-specific password for iCloud Calendar sync (generate at appleid.apple.com).

SYNC_INTERVAL_MINUTESVariable

Interval in minutes for calendar and contact sync (Google, Apple, CalDAV, CardDAV). Default: 15.

Default
15
Value
15
MAX_UPLOAD_MBVariable

Maximum size of a single upload in megabytes (documents, calendar attachments, receipts). Default: 5, supported range 1-100. The request body is buffered in memory, so a very large value can take the container down on a small machine.

Default
5
Value
5
BACKUP_ENABLEDVariable

Optional. Enable automated database backups (default: true).

Default
true
Value
true
BACKUP_SCHEDULEVariable

Optional. Cron schedule for automated backups (default: 2 AM daily).

Default
0 2 * * *
Value
0 2 * * *
BACKUP_KEEPVariable

Optional. Number of backups to retain (default: 7).

Default
7
Value
7
WEBDAV_BACKUP_ENABLEDVariable

Optional. Set to true to enable automatic upload of backups to a WebDAV server after each local backup.

WEBDAV_BACKUP_URLVariable

Optional. WebDAV server URL, e.g. https://cloud.example.com/remote.php/dav/files/username/

WEBDAV_BACKUP_USERNAMEVariable

Optional. WebDAV username for authentication.

WEBDAV_BACKUP_PASSWORDVariable

Optional. WebDAV password for authentication.

WEBDAV_BACKUP_PATHVariable

Optional. Remote directory path where backup files are stored (default: /yuvomi/backups/).

Default
/yuvomi/backups/
Value
/yuvomi/backups/
WEBDAV_BACKUP_KEEPVariable

Optional. Number of remote backup files to keep (default: 7).

Default
7
Value
7
DOCUMENT_STORAGE_LOCAL_ENABLEDVariable

Optional. Store newly uploaded document files in the mounted /documents host folder instead of the database. Existing files are not migrated.

Default
false
Value
false
DOCUMENT_STORAGE_LOCAL_PATHVariable

Optional. Container path for local document files. Keep default unless you mounted the documents folder elsewhere.

Default
/documents
Value
/documents
DOCUMENT_STORAGE_WEBDAV_ENABLEDVariable

Optional. Store newly uploaded document files on WebDAV. Existing files are not migrated.

Default
false
Value
false
DOCUMENT_STORAGE_WEBDAV_URLVariable

Optional. WebDAV server URL for document storage, e.g. https://cloud.example.com/remote.php/dav/files/username/

DOCUMENT_STORAGE_WEBDAV_USERNAMEVariable

Optional. WebDAV username for document storage.

DOCUMENT_STORAGE_WEBDAV_PASSWORDVariable

Optional. WebDAV password for document storage.

DOCUMENT_STORAGE_WEBDAV_PATHVariable

Optional. Remote base folder for document files (default: yuvomi-documents).

Default
yuvomi-documents
Value
yuvomi-documents
DOCUMENT_STORAGE_WEBDAV_ALLOW_PRIVATE_NETWORKVariable

Optional. Set to true to allow WebDAV document storage on local/private network addresses (e.g. Nextcloud in the same Docker network). Only enable in controlled environments.

Default
false
Value
false
ICS_SUBSCRIPTION_ALLOW_PRIVATE_NETWORKVariable

Optional. Set to true to allow ICS calendar subscriptions on http:// and local/private network addresses (e.g. a Sonarr/Radarr/Home Assistant feed in the same LAN). Lifts SSRF protection for ICS subscriptions. Only enable in controlled environments.

Default
false
Value
false
RECIPE_PROVIDER_ALLOW_PRIVATE_NETWORKVariable

Optional. Set to true to allow recipe provider (Mealie/Tandoor) mirrors on http:// and local/private network addresses (e.g. self-hosted in the same Docker network). Lifts SSRF protection for recipe provider sync. Only enable in controlled environments.

Default
false
Value
false
DMS_ALLOW_PRIVATE_NETWORKVariable

Optional. Controls whether the document management connection (Paperless-ngx, Papra) may reach local/private network addresses. Defaults to TRUE, unlike the other private-network switches, because a DMS is normally self-hosted on the same LAN or Docker network. Set to false to enforce the same SSRF protection the other integrations have.

Default
true
Value
true
EMAIL_SMTP_HOSTVariable

Optional. SMTP server hostname for outgoing email (password-reset links).

EMAIL_SMTP_PORTVariable

Optional. SMTP server port (default: 587).

Default
587
Value
587
EMAIL_SMTP_SECUREVariable

Optional. SMTP connection security: ssl, starttls, or none (default: starttls).

Default
starttls
Value
starttls
EMAIL_SMTP_USERVariable

Optional. SMTP authentication username.

EMAIL_SMTP_PASSVariable

Optional. SMTP authentication password.

EMAIL_FROM_ADDRESSVariable

Optional. Sender email address for outgoing mail, e.g. yuvomi@example.com.

EMAIL_FROM_NAMEVariable

Optional. Sender display name for outgoing mail (default: Yuvomi).

Default
Yuvomi
Value
Yuvomi
BASE_URLVariable

Optional but required for password-reset emails to be sent. Absolute origin used to build reset links, e.g. https://yuvomi.example.com. The request Host header is never trusted as a fallback, to prevent reset-link poisoning.

VAPID_SUBJECTVariable

Optional. Contact URI sent to push services, either a mailto: address or an https: origin, e.g. mailto:admin@example.com. Must be reachable from the internet: Apple rejects a localhost or .local subject with 403 BadJwtToken, which disables push on iPhone/iPad while Android keeps working. Falls back to the SMTP sender address, then BASE_URL, then a placeholder.

VAPID_PUBLIC_KEYVariable

Optional. VAPID public key. Auto-generated on first use and stored in the database when left empty. Set together with the private key to keep existing device subscriptions valid across a redeployment. Generate with: npx web-push generate-vapid-keys

VAPID_PRIVATE_KEYVariable

Optional. VAPID private key. Must be set together with the public key.

FIXER_API_KEYVariable

Optional. Fixer API key for live currency conversion in Budget → Subscriptions. Rates are cached for 12 hours; works without this key using the cached/manual rate.