Release history
Oikos releases
Family planner for small households
All releases
500 shown
DNS‑rebinding fix + nodemailer CVEs
- Added `bike` icon to the calendar event icon selector (transport category) with translations for all 16 supported locales
Full changelog
Added
- Bike icon: added
bikeicon to the calendar event icon selector (transport category), with translations for all 16 supported locales.
- Split Expenses module with expense groups and multiple split methods (equal, percentage, exact amounts, shares)
- Settlements feature using a debt‑simplification algorithm for minimal transfer sets
- Recurring expenses with daily/weekly/monthly/yearly schedules via hourly scheduler
Full changelog
[0.51.0] - 2026-05-11
Added
- Split Expenses module: new tab inside Budget for managing shared expenses. Supports expense groups (household, couple, travel, event, shopping, general) with multiple split methods: equal, percentage, exact amounts, and shares. Balances are derived from an immutable ledger — amounts are stored as integer minor currency units (cents) to avoid floating-point errors.
- Settlements: record payments between group members with a debt-simplification algorithm that produces the minimal set of transfers to clear all balances.
- Recurring expenses: define expenses that repeat on a daily, weekly, monthly, or yearly schedule with automatic generation via an hourly scheduler.
- Guest accounts: invite people outside the family as restricted guests who can only access the Split module and see their own invited groups. Guests can be created from scratch or converted from existing contacts.
- Multi-currency support: each group has a default currency; individual expenses can use any currency with historical exchange rate snapshots for consistent balance reporting.
- Activity feed: per-group log of all expense, member, and settlement events.
- Polish locale: split-expenses strings added to the Polish (
pl) translation.
- Full Polish (pl) translation for all UI modules
Full changelog
What's New
Added
- Polish locale — full Polish (
pl) translation covering all UI modules: tasks, calendar, shopping, meals, budget, notes, contacts, birthdays, recipes, documents, housekeeping, settings, and more. Polish is now selectable in Settings → Language.
This brings Oikos to 16 supported languages: German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese (Simplified), Japanese, Arabic, Hindi, Portuguese, Ukrainian, and now Polish.
Full Changelog: https://github.com/ulsklyc/oikos/blob/main/CHANGELOG.md
- Housekeeping module with staff profiles, check‑in/out tracking, recurring chore tasks, supply requests, monthly visit logs and payment task integration
- Document folders for custom organization via sidebar browser
- Calendar icon picker supporting curated Lucide icons
Full changelog
What's new
Housekeeping module
A new dedicated module for managing household staff workflows:
- Staff profiles — name, daily rate, calendar color, payment schedule, avatar
- Check-in / check-out — each visit creates a calendar event; check-out records the actual end time
- Recurring chore tracking — decay tasks with configurable frequency and urgency indicators
- Supply requests — linked directly to shopping lists
- Monthly visit log — with payment summary and per-visit extras tracking
- Payment task integration — optionally creates a task on each check-in; completing it marks the visit as paid
Document folders
Documents can now be organized into custom folders with a sidebar browser.
Calendar icon picker
Calendar events now support a custom icon from a curated Lucide set.
Full changelog: https://github.com/ulsklyc/oikos/blob/main/CHANGELOG.md
- Brand accent color changed back to Violet (#6c3aed light, #a78bfa dark) across all UI elements and documentation
Full changelog
Changes
Changed
- Brand color: reverted the primary accent color from Amber back to Violet. The accent is now
#6c3aedin light mode and#a78bfain dark mode, applied consistently across all design tokens, the logo, all PWA icons (favicon, app icons, maskable icons, Apple touch icon), and the GitHub Pages documentation site. Semantic colors (warnings, notes module, meal-breakfast) remain unchanged.
Full changelog: https://github.com/ulsklyc/oikos/blob/main/CHANGELOG.md
Brand color refresh updates accent from indigo (#4F46E5) to warm amber (#92400E light / #FBBF24 dark).
Full changelog
Brand color refresh
The primary accent color has been updated from cool indigo (#4F46E5) to a rich, warm amber (#92400E in light mode, #FBBF24 in dark mode) across all design tokens, the logo, and the GitHub Pages documentation site.
Why this change? Indigo carried the aesthetic of a productivity tool — focused, corporate, digital. As Oikos has grown into a home for thousands of families, we wanted the visual identity to better reflect what the app actually is: a warm, shared space for everyday life together. Amber — deep and earthy in light environments, bright and inviting in dark ones — communicates exactly that. It evokes warmth, reliability, and the kind of unhurried intimacy that family life deserves.
From an accessibility standpoint, Amber-800 (#92400E) achieves a contrast ratio of 7.20:1 against white, exceeding the WCAG AA threshold and meeting WCAG AAA. The dark mode value (#FBBF24) maintains the same readability standard. The transition is purely cosmetic — no data, settings, or behavior has changed.
Logo: updated the gradient on docs/logo.svg and all inline SVG instances from violet (#8B5CF6 to #6C3AED) to amber (#B45309 to #92400E).
Fixed CalDAV and CardDAV "Add Account" modals so Cancel and Save buttons appear and onSave no longer triggers prematurely.
Full changelog
Fixed
- Settings: CalDAV and CardDAV "Add Account" modals now correctly display Cancel and Save buttons. Previously, the
onSavecallback ran immediately on modal open, triggering a required-fields validation error against empty fields and leaving the form with no way to submit. Fixes #128.
- API responses now include `assigned_users` array while preserving legacy fields; clients should prefer the new field.
- Filters GET /api/v1/tasks?assigned_to= and GET /api/v1/calendar?assigned_to= match any assignment list entry.
- Multi-person assignment via new task_assignments / event_assignments join table (migration v32)
- Stacked avatar display on task, Kanban, and calendar agenda cards showing up to three assigned users with a +N overflow badge
- Shared UserMultiSelect component for checkbox‑based multi‑user selection in modals
Full changelog
Added
- Multi-person assignment: tasks and calendar events can now be assigned to multiple family members simultaneously. A new task_assignments / event_assignments join table (migration v32) stores the assignments; existing single-user data is migrated automatically.
- Avatar stack: task cards, Kanban cards, and the calendar agenda view display stacked avatars for all assigned users (up to 3 visible, then a +N overflow badge).
- Shared UserMultiSelect component (public/components/user-multi-select.js): checkbox-based dropdown used in both the task modal and the calendar event modal; replaces the previous single-user select element.
- assigned_to filter extended: GET /api/v1/tasks?assigned_to= and GET /api/v1/calendar?assigned_to= now match any task/event where the user appears in the assignments list.
Changed
- API response for tasks and calendar events now includes assigned_users: [{id, display_name, color}] array alongside the legacy assigned_to / assigned_name / assigned_color fields.
- Recurring task completion copies all multi-person assignments to the new recurring instance.
- Sync tab grouped into dedicated "CalDAV & CardDAV" and secondary "Cloud Services" sections
- Reusable `renderSubTabs()` component for shared pill-style navigation bars across settings and kitchen tabs
Full changelog
Changes
Settings — Sync tab restructured
Open standards (CalDAV, CardDAV, ICS subscriptions) are now grouped first under a dedicated "CalDAV & CardDAV" section. Cloud services (Google Calendar, Apple Calendar) move to a secondary "Cloud Services" section below. Fixes a raw <h2> heading inside the CalDAV card, which caused inconsistent heading sizes compared to all other settings cards.
Shared sub-tabs navigation component
Extracted renderSubTabs() as a single reusable implementation for all sub-module navigation bars (public/utils/sub-tabs.js + public/styles/sub-tabs.css). Settings tabs and kitchen tabs now share the same pill-style bar with icons, labels, sticky positioning, horizontal scrolling, and group separators. Removes approximately 120 lines of duplicated CSS from kitchen-tabs.css and settings.css. New sub-module navigation can use renderSubTabs() directly without any additional CSS.
Test loader improvement
test-browser-loader.mjs now automatically resolves browser-absolute /utils/*.js imports to the public/ directory, removing the need for per-module manual stubs.
Full Changelog
https://github.com/ulsklyc/oikos/blob/main/CHANGELOG.md
- Docker now uses host‑mounted bind mounts for DATA_DIR (default ./data) and BACKUP_DIR (default ./backups); set these paths via .env if needed.
Full changelog
Fixed
- Modal: add
onClosecallback toopenModal()so promise-based modals (confirmModal,promptModal,selectModal) resolve correctly on Escape and overlay-click without duplicate event listeners. - Modal: fix
_initialFormTimeoutleak — timeout is now tracked and cancelled on re-open or close, preventing stale dirty-check snapshots. - Calendar: replace
popup.innerHTMLwithinsertAdjacentHTMLin the event popup (project constraint); addtruncateDescription()to cap long event descriptions at 500 characters. - Validation: extend
DATETIME_REto accept ISO 8601 datetimes with milliseconds and timezone offsets; normalise datetime inputs toYYYY-MM-DDTHH:MMbefore storing.
Changed
- Docker: switch from named Docker volume to host-mounted bind mounts;
DATA_DIR(default./data) andBACKUP_DIR(default./backups) can be set in.envto control storage locations. - Startup log: include app version in the server start message.
Minor fixes and improvements.
Full changelog
Changed
- Documentation: SPEC.md updated to reflect v0.45–v0.47 changes — CardDAV Accounts and CardDAV Addressbook Selection tables added; Contacts table expanded with multi-value fields and CardDAV columns; new contact_phones, contact_emails, contact_addresses sub-tables documented; Birthdays table reflects configurable reminder offset columns; External Calendars table notes apple→caldav migration; Tasks module documents bulk actions; Contacts module documents CardDAV multi-account sync; Birthdays module reflects flexible reminder offsets; Settings module updated for Synchronization tab, module toggles, scheduled backups, and CardDAV UI.
- README: Birthdays feature description updated to reflect customizable reminder offsets; Backup feature description updated to mention automatic scheduled backups.
Removed
- Repository: archived implemented cleanup plan (
docs/designs/2026-05-04-repo-cleanup-design.md→docs/archive/designs/); removed settings sidebar prototype HTML (docs/designs/2026-05-04-settings-sidebar-demo.html).
Minor fixes and improvements.
Full changelog
Changed
- Dependencies: updated express-rate-limit from 8.4.1 to 8.5.0 (async store initialization support) and tsdav from 2.1.8 to 2.2.0 (native fetch, enhanced OAuth token handling, improved CalDAV/CardDAV sync reliability, security improvements).
Full Changelog: https://github.com/ulsklyc/oikos/compare/v0.47.1...v0.47.2
Fixed crash on Settings page caused by undefined loadCalDAVAccounts and loadCardDAVAccounts functions.
Full changelog
Fixed
- Settings page crash: fixed ReferenceError "loadCalDAVAccounts is not defined" when opening Settings. Root cause: loadCalDAVAccounts and loadCardDAVAccounts were defined inside the render function but called from bindIcsEvents (outside render scope). Functions are now top-level exports with user parameter.
Full Changelog: https://github.com/ulsklyc/oikos/compare/v0.47.0...v0.47.1
- Unified Synchronization tab replaces Calendar tab, grouping Calendar Sync and Contact Sync sections with visual CSS separators.
- Complete CardDAV UI for adding/deleting accounts (iCloud, Nextcloud, Radicale, Baikal), toggling addressbooks, manual sync trigger, real‑time status badges, and empty‑state onboarding.
Full changelog
Settings UX Overhaul & CardDAV UI
This release significantly improves the Settings experience with better organization and a complete user interface for CardDAV contact synchronization.
Added
- Settings UX overhaul: renamed Calendar tab to Synchronization with dedicated sections for Calendar Sync and Contact Sync. Improved information architecture with visual tab grouping using CSS separators between functional areas (module settings, synchronization, personal, administration).
- CardDAV UI: complete user interface for CardDAV contact synchronization in Settings. Add/delete CardDAV accounts (iCloud, Nextcloud, Radicale, Baikal), enable/disable individual addressbooks, manual sync trigger, real-time status indicators. Empty state onboarding for first-time setup.
- Status badges: visual sync status indicators (success, error, syncing) with animated spinner for active syncs across CalDAV and CardDAV integrations.
Changed
- Settings navigation: Calendar tab replaced by unified Synchronization tab containing both calendar and contact sync options. Existing CalDAV calendar accounts remain accessible in the Calendar Sync section.
Technical Details
- 21 files changed, 4267 insertions, 43 deletions
- All 109 tests passing
- i18n updates for all 14 supported locales
- Backward compatible with existing CalDAV setup
- Flexible birthday reminders with preset offsets (none, at time, 15min, 1h, 1d, 2d, 1w, 2w) and custom intervals in minutes, hours, days, or weeks
- UI integration of reminder settings into the birthday modal
- Option to completely disable birthday reminders
Full changelog
What's New
Flexible Birthday Reminders
Configure exactly when to be reminded of upcoming birthdays with:
- Preset offsets: none, at time, 15min, 1h, 1d, 2d, 1w, 2w
- Custom intervals: minutes, hours, days, or weeks
- Integrated UI in birthday modal
- Optional: disable reminders entirely
Bug Fixes
- Service worker now properly handles non-HTTP protocols (e.g., browser extensions)
Installation
Docker:
docker pull ghcr.io/ulsklyc/oikos:0.46.0
See Installation Guide for details.
Contributors
- @rafaelfoster for the birthday reminders feature (#123)
Full Changelog: https://github.com/ulsklyc/oikos/compare/v0.45.0...v0.46.0
- Automatic database migration via `server/db.js` (Migration 30) applies the new CardDAV schema tables (`carddav_accounts`, `carddav_addressbook_selection`, `contact_phones`, `contact_emails`, `contact_addresses`).
- CardDAV Multi‑Account Sync with eight new API endpoints, per‑addressbook toggles, connection testing, and manual/auto sync triggers.
- Multi‑Value Contact Fields supporting phone numbers, emails, addresses with labels, primary flags, atomic updates, and validation.
Full changelog
CardDAV Contacts Integration
This release adds comprehensive CardDAV support for contacts with multi-account management and multi-value fields.
New Features
CardDAV Multi-Account Sync
- Connect multiple CardDAV servers (Nextcloud, iCloud, Radicale, Baikal) simultaneously
- 8 new API endpoints for account management under
/api/v1/contacts/cardav/ - Per-addressbook enable/disable via checkboxes
- Test connections before saving
- Manual sync trigger per account
- Automatic addressbook discovery and refresh
Multi-Value Contact Fields
- Multiple phone numbers, email addresses, and physical addresses per contact
- Each entry has a label (mobile, work, home, etc.), value, and optional "primary" flag
- Atomic transaction support with replacement semantics on update
- Backward compatible with existing single-field contacts
- Full validation with length limits and format checks
Technical Details
- New service:
server/services/cardav-sync.js - New router:
server/routes/cardav.js - Extended router:
server/routes/contacts.js(multi-value support) - Database tables:
carddav_accounts,carddav_addressbook_selection,contact_phones,contact_emails,contact_addresses - 109 tests across 20 test suites (all passing)
- Full OpenAPI documentation
Related
- Pull Request: #122
- Migration: Automatic via
server/db.js(Migration 30)
Full Changelog: https://github.com/ulsklyc/oikos/blob/main/CHANGELOG.md#0450---2026-05-04
Fixed CalDAV migration crash caused by CHECK constraint violation.
Full changelog
Fixed
- CalDAV migration crash: fixed CHECK constraint violation during v0.44.0 migration that caused container restart loop. The apple→caldav
external_sourceconversion now happens during table rebuild instead of before, preventing the constraint error (#119, #120).
Full changelog: https://github.com/ulsklyc/oikos/blob/main/CHANGELOG.md
- Existing Apple CalDAV data is automatically migrated to the new `caldav_accounts` and `caldav_calendar_selection` tables.
- New backend service `server/services/caldav-sync.js` and API routes `/calendar/caldav/*` are added; ensure they are deployed.
- Removed the single Apple CalDAV integration; replaced with a comprehensive multi‑account CalDAV system requiring migration of existing data.
- Support for simultaneous connection to multiple CalDAV providers (iCloud, Nextcloud, Radicale, Baikal, etc.)
- Per‑account calendar selection via checkboxes in Settings → Calendar
- Bidirectional sync and outbound target selection when creating events
Full changelog
Generic CalDAV Multi-Account Sync
This release replaces the single Apple CalDAV integration with a comprehensive multi-account CalDAV solution.
New Features
- Multiple CalDAV Accounts: Connect iCloud, Nextcloud, Radicale, Baikal, and any CalDAV-compatible server simultaneously
- Per-Account Calendar Selection: Choose which calendars to sync with checkboxes in Settings → Calendar
- Bidirectional Sync: Full two-way synchronization between Oikos and your CalDAV servers
- Outbound Target Selection: When creating events, optionally choose which CalDAV account/calendar to sync to
- Automatic Migration: Existing Apple CalDAV data is automatically migrated to the new system
Technical Changes
- New database tables:
caldav_accounts,caldav_calendar_selection - New backend service:
server/services/caldav-sync.js - New API routes:
/calendar/caldav/* - Enhanced UI in Settings and Calendar event modal
- 7 new comprehensive tests (all passing)
Documentation Updates
- README.md: Updated Calendar feature description
- docs/SPEC.md: Added new table schemas and updated Calendar module documentation
- Full i18n support in German and English
Fixes
- None (feature release)
Full Changelog: https://github.com/ulsklyc/oikos/compare/v0.43.0...v0.44.0
Closes #90
- Automatic scheduled backups with configurable cron schedule, directory, and retention policy via .env variables (BACKUP_ENABLED, BACKUP_SCHEDULE, BACKUP_DIR, BACKUP_KEEP).
Full changelog
Added
- Automatic scheduled backups: database backups are now created automatically on a configurable cron schedule (default: 2 AM daily). Old backups are rotated automatically, keeping only the last N copies (default: 7). Configuration via
.envvariables:BACKUP_ENABLED,BACKUP_SCHEDULE,BACKUP_DIR,BACKUP_KEEP. Settings → Backup displays scheduler status, schedule, retention policy, last backup timestamp, and a manual trigger button.
- Module toggles in Settings → General let admins disable/enable specific modules (Tasks, Calendar, etc.) while preserving data
- Bulk actions for tasks in List view: select multiple items and apply mark done/open, archive, or delete
Full changelog
Added
- Module toggles (Settings → General, admin-only): individual modules (Tasks, Calendar, Shopping, Meals, Recipes, Birthdays, Notes, Contacts, Budget, Documents) can be disabled to hide them from the navigation. Data is preserved and reappears when the module is re-enabled. Dashboard and Settings remain essential and cannot be disabled.
- Bulk actions for tasks (List view only): select multiple tasks via checkboxes and apply batch operations (mark done, mark open, archive, delete). Bulk select toggle appears in the toolbar; selected count and action bar appear when tasks are checked. Kanban view remains single-task oriented.
- Birthday badge on nav item when any family member has a birthday within the next 3 days
- Recent filter chips in task bar, persisted via localStorage
- Live search field for event icon picker with category grouping
Full changelog
Added
- Birthday badge: the birthdays nav item now shows a badge when any family member has a birthday within the next 3 days.
- Recent filter chips: the task filter bar now shows up to three recently used filters as quick-access chips, persisted in
localStorage. - Calendar icon search: the event icon picker now includes a live search field to quickly find icons by keyword, with results grouped by category.
- Calendar icon categories: event icons are now organised into labelled category groups (transport, sports, health, nature, leisure, social, work, home, food, other).
- Repeat indicator on calendar events: events with a recurrence rule now display a small repeat icon in both month and week views.
- 3-day week view on mobile: the calendar week view automatically switches to a 3-day window on screens narrower than 640 px for better readability.
- Widget size presets: the dashboard widget size selector uses named presets (Tiny, Narrow, Standard, Large, Full) instead of raw grid dimension values.
Changed
- Required-field markers: title fields in the task, event, and budget modals now show a required-field asterisk via the
.required-markerCSS class. - Modal drag handle touch target: the bottom-sheet drag handle has a 44 px tall invisible hit area so it can be grabbed comfortably.
- Swipe affordance: list rows with swipe actions show a subtle chevron hint to signal the gesture.
- Budget tab height: budget tab buttons have a minimum height of 40 px to meet touch-target requirements.
- Typography tightening with tighter letter‑spacing and text-wrap: balance
- Warm‑tinted elevation shadows matching the warm neutral palette
- Regular buttons use a medium radius (12 px) for clearer distinction
Full changelog
Changed
- Typography tightening: page titles and modal titles use tighter letter-spacing (
-0.5 px/-0.8 pxon desktop) andtext-wrap: balanceto eliminate orphaned words on wrapped headings. - Warm-tinted shadows: all elevation shadows (
smthroughxl) now use a warm-tinted base colour (rgba(18, 14, 8, …)) that matches the warm neutral palette instead of pure black. - Button radius: regular buttons use
--radius-md(12 px) instead of--radius-sm(8 px), creating a clear visual distinction from text inputs. - Empty-state icons: icons in empty states pick up a 40 % tint of the current module accent colour, making them feel contextually connected to each module rather than uniformly grey.
- Search section labels: category headings inside the search overlay are now sentence-case instead of all-caps, improving readability.
Fixed
- Tabular figures: currency amounts (budget summary cards, transaction list, loan cards, chart rows), weather temperature, dashboard metrics, and calendar time labels now use
font-variant-numeric: tabular-numsso digit columns remain visually aligned.
- Loans tracker tab in Budget with CRUD, balance/due tracking, and auto‑close of paid loans
- Configurable dashboard widget sizes (columns × rows) persisted per user
- Four additional date format options: MM.DD.YYYY, YYYY.MM.DD, YYYY/MM/DD, DD/MM/YYYY
Full changelog
Added
- Budget loans tracker (PR #117 by @rafaelfoster): a new Loans tab in the Budget module lets you create instalment-based loans, record individual payments, track remaining balance and due months, and filter budget transactions by loan. Paid-off loans are automatically marked as closed. Full CRUD with confirmation modals.
- Dashboard widget sizes: each dashboard widget now has a configurable size (columns × rows). Sizes are persisted in user preferences and survive page reloads.
- Extended date formats: Settings → General now offers four additional date format options —
MM.DD.YYYY,YYYY.MM.DD,YYYY/MM/DD, andDD/MM/YYYY— alongside the existing formats.
Fixed
dmydate format preserved: the existingDD.MM.YYYYbehaviour of thedmypreference is unchanged for all current users; a newDD/MM/YYYYoption (dmy_slash) is available for those who want slashes.