+
Open Source · Self-Hosted · Private
+
Your household,
organized together.
+
Tasks, shopping, meals, calendar, budget — everything your family needs in one place. Self-hosted on your own server. No cloud, no tracking, no subscriptions.
+
+
+
+ View on GitHub
-
+
+ MIT License
+ Docker
+ PWA
+ No Cloud Required
+
+
+
+
+

+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
Task Management
+
Shared tasks with deadlines, priorities, subtasks, recurring schedules, and a Kanban board. Assign to family members with one-tap status changes.
+
+
+

+

+
+
+
+
+
+
Meal Planning
+
Weekly drag-and-drop planner with ingredient lists. Automatically export ingredients to your shopping list with one click.
+
+
+

+

+
+
+
+
+
+
Calendar Sync
+
Two-way sync with Google Calendar and Apple iCloud. See all family events in one unified view — month, week, day, or agenda.
+
+
+

+

+
+
+
+
+
+
+
+
+
+
+
+
+
Shopping Lists
+
Collaborative lists with aisle categories. Import ingredients directly from your meal plans.
+
+
+
+
Budget Tracking
+
Track income and expenses with 13 currency options, recurring entries, monthly trends, and CSV export.
+
+
+
+
Notes
+
Colored sticky notes with Markdown. Perfect for recipes, family memos, and quick reminders.
+
+
+
+
Contacts
+
Shared family contact directory with vCard import and export.
+
+
+
+
Works Everywhere
+
Installable PWA on any device. Offline support, dark mode, fully responsive from phone to desktop.
+
+
+
+
Kanban Board
+
Visual board view for tasks and projects. Drag cards between columns to track progress.
+
+
+
+
+
+
+
+
+
+
+
+
Dashboard
+
Tasks
+
Calendar
+
Shopping
+
Meals
+
Budget
+
Notes
+
Contacts
+
Settings
+
+
+
+
+
+
+
+
+
+
+
+
Privacy First
+
AES-256 encrypted database with SQLCipher. Zero telemetry. Your data never leaves your server.
+
+
+
+
+
+
Fully Self-Hosted
+
Runs on a Raspberry Pi, a NAS, or any server. Docker makes setup a one-liner.
+
+
+
+
+
+
Zero Build Step
+
Pure ES modules, vanilla JS, plain CSS. No bundler, no transpiler, no framework. Ships what you write.
+
+
+
+
+
+
Open Source
+
MIT licensed. Inspect, modify, extend, contribute. Built in the open for families who care about transparency.
+
+
+
+
+
+
+
+
+
+
Get Started
+
Up and running in minutes
+
+
# Pull and start with Docker
+curl -O https://raw.githubusercontent.com/ulsklyc/oikos/main/docker-compose.yml
+curl -O https://raw.githubusercontent.com/ulsklyc/oikos/main/.env.example
+cp .env.example .env
+# Set SESSION_SECRET and DB_ENCRYPTION_KEY in .env
+docker compose up -d
+docker compose exec oikos node setup.js
+
Then open http://localhost:3000 and log in. Need a step-by-step guide, HTTPS setup, or troubleshooting? See the Installation Guide.
+
+
+
+
+
+
+
+
+
Ready to take back control?
+
Oikos is free, open-source, and built for families who value their privacy.
+
-
+
+
-
-
-
- Oikos
- The self-hosted family planner
- Manage your household together. Tasks, shopping, meals, calendar, budget - all in one place. Self-hosted, private, yours.
-
-
-
- View on GitHub
-
-
-
- Installation Guide
-
+
-
-
-
-
-
-
-
-

-
Dashboard
-
-
-

-
Tasks
-
-
-

-
Meals
-
-
-

-
Shopping
-
-
-

-
Calendar
-
-
-

-
Budget
-
-
-

-
Notes
-
-
-

-
Contacts
-
-
-
+
- document.getElementById('langToggle').addEventListener('click', function() {
- currentLang = currentLang === 'en' ? 'de' : 'en';
- localStorage.setItem('oikos-lang', currentLang);
- applyLang();
- });
- /* ===== Scroll Reveal ===== */
- document.documentElement.classList.add('js');
-
- if ('IntersectionObserver' in window) {
- var observer = new IntersectionObserver(function(entries) {
- for (var i = 0; i < entries.length; i++) {
- if (entries[i].isIntersecting) {
- entries[i].target.classList.add('visible');
- observer.unobserve(entries[i].target);
- }
- }
- }, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });
-
- var reveals = document.querySelectorAll('.reveal');
- for (var i = 0; i < reveals.length; i++) {
- observer.observe(reveals[i]);
- }
- }
-
- /* ===== Init ===== */
- applyTheme();
- applyLang();
- })();
-
-
-
+
diff --git a/docs/screenshots/01-mobile-dark.png b/docs/screenshots/01-mobile-dark.png
index aa85bb1..dad9311 100644
Binary files a/docs/screenshots/01-mobile-dark.png and b/docs/screenshots/01-mobile-dark.png differ
diff --git a/docs/screenshots/01-mobile-light.png b/docs/screenshots/01-mobile-light.png
index d3d81cc..f8aa78c 100644
Binary files a/docs/screenshots/01-mobile-light.png and b/docs/screenshots/01-mobile-light.png differ
diff --git a/docs/screenshots/01-web-dark.png b/docs/screenshots/01-web-dark.png
index b64a90c..fcb1129 100644
Binary files a/docs/screenshots/01-web-dark.png and b/docs/screenshots/01-web-dark.png differ
diff --git a/docs/screenshots/01-web-light.png b/docs/screenshots/01-web-light.png
index 7a43ef4..17b3da4 100644
Binary files a/docs/screenshots/01-web-light.png and b/docs/screenshots/01-web-light.png differ
diff --git a/docs/screenshots/02-mobile-dark.png b/docs/screenshots/02-mobile-dark.png
index 3c047f1..98cb3c5 100644
Binary files a/docs/screenshots/02-mobile-dark.png and b/docs/screenshots/02-mobile-dark.png differ
diff --git a/docs/screenshots/02-mobile-light.png b/docs/screenshots/02-mobile-light.png
index 51794e9..9a36bbd 100644
Binary files a/docs/screenshots/02-mobile-light.png and b/docs/screenshots/02-mobile-light.png differ
diff --git a/docs/screenshots/02-web-dark.png b/docs/screenshots/02-web-dark.png
index 8500dd6..dadd1d8 100644
Binary files a/docs/screenshots/02-web-dark.png and b/docs/screenshots/02-web-dark.png differ
diff --git a/docs/screenshots/02-web-light.png b/docs/screenshots/02-web-light.png
index 240ab73..6611cf7 100644
Binary files a/docs/screenshots/02-web-light.png and b/docs/screenshots/02-web-light.png differ
diff --git a/docs/screenshots/03-mobile-dark.png b/docs/screenshots/03-mobile-dark.png
index c298565..da99be7 100644
Binary files a/docs/screenshots/03-mobile-dark.png and b/docs/screenshots/03-mobile-dark.png differ
diff --git a/docs/screenshots/03-mobile-light.png b/docs/screenshots/03-mobile-light.png
index e8be6c3..707cc16 100644
Binary files a/docs/screenshots/03-mobile-light.png and b/docs/screenshots/03-mobile-light.png differ
diff --git a/docs/screenshots/03-web-dark.png b/docs/screenshots/03-web-dark.png
index b483199..a079945 100644
Binary files a/docs/screenshots/03-web-dark.png and b/docs/screenshots/03-web-dark.png differ
diff --git a/docs/screenshots/03-web-light.png b/docs/screenshots/03-web-light.png
index 65fe97c..2a48a36 100644
Binary files a/docs/screenshots/03-web-light.png and b/docs/screenshots/03-web-light.png differ
diff --git a/docs/screenshots/04-mobile-dark.png b/docs/screenshots/04-mobile-dark.png
index 0d69bcf..1f87f3a 100644
Binary files a/docs/screenshots/04-mobile-dark.png and b/docs/screenshots/04-mobile-dark.png differ
diff --git a/docs/screenshots/04-mobile-light.png b/docs/screenshots/04-mobile-light.png
index b10698c..2169057 100644
Binary files a/docs/screenshots/04-mobile-light.png and b/docs/screenshots/04-mobile-light.png differ
diff --git a/docs/screenshots/04-web-dark.png b/docs/screenshots/04-web-dark.png
index 25a533a..478e833 100644
Binary files a/docs/screenshots/04-web-dark.png and b/docs/screenshots/04-web-dark.png differ
diff --git a/docs/screenshots/04-web-light.png b/docs/screenshots/04-web-light.png
index 8ab836e..a0723b9 100644
Binary files a/docs/screenshots/04-web-light.png and b/docs/screenshots/04-web-light.png differ
diff --git a/docs/screenshots/05-mobile-dark.png b/docs/screenshots/05-mobile-dark.png
index 82d82ba..b79d633 100644
Binary files a/docs/screenshots/05-mobile-dark.png and b/docs/screenshots/05-mobile-dark.png differ
diff --git a/docs/screenshots/05-mobile-light.png b/docs/screenshots/05-mobile-light.png
index d65a8a1..4e1d631 100644
Binary files a/docs/screenshots/05-mobile-light.png and b/docs/screenshots/05-mobile-light.png differ
diff --git a/docs/screenshots/05-web-dark.png b/docs/screenshots/05-web-dark.png
index 3669783..b9b1444 100644
Binary files a/docs/screenshots/05-web-dark.png and b/docs/screenshots/05-web-dark.png differ
diff --git a/docs/screenshots/05-web-light.png b/docs/screenshots/05-web-light.png
index 76bd5ef..6e0f9a1 100644
Binary files a/docs/screenshots/05-web-light.png and b/docs/screenshots/05-web-light.png differ
diff --git a/docs/screenshots/06-mobile-dark.png b/docs/screenshots/06-mobile-dark.png
index f024411..1ed3e6f 100644
Binary files a/docs/screenshots/06-mobile-dark.png and b/docs/screenshots/06-mobile-dark.png differ
diff --git a/docs/screenshots/06-mobile-light.png b/docs/screenshots/06-mobile-light.png
index d19405a..0f45f8c 100644
Binary files a/docs/screenshots/06-mobile-light.png and b/docs/screenshots/06-mobile-light.png differ
diff --git a/docs/screenshots/06-web-dark.png b/docs/screenshots/06-web-dark.png
index b9ec963..c5c15d3 100644
Binary files a/docs/screenshots/06-web-dark.png and b/docs/screenshots/06-web-dark.png differ
diff --git a/docs/screenshots/06-web-light.png b/docs/screenshots/06-web-light.png
index 5819164..8657fd3 100644
Binary files a/docs/screenshots/06-web-light.png and b/docs/screenshots/06-web-light.png differ
diff --git a/docs/screenshots/07-mobile-dark.png b/docs/screenshots/07-mobile-dark.png
index 4b11fa8..512ef07 100644
Binary files a/docs/screenshots/07-mobile-dark.png and b/docs/screenshots/07-mobile-dark.png differ
diff --git a/docs/screenshots/07-mobile-light.png b/docs/screenshots/07-mobile-light.png
index a1e194a..68957e9 100644
Binary files a/docs/screenshots/07-mobile-light.png and b/docs/screenshots/07-mobile-light.png differ
diff --git a/docs/screenshots/07-web-dark.png b/docs/screenshots/07-web-dark.png
index b50b9cb..1d81fb0 100644
Binary files a/docs/screenshots/07-web-dark.png and b/docs/screenshots/07-web-dark.png differ
diff --git a/docs/screenshots/07-web-light.png b/docs/screenshots/07-web-light.png
index a8c1c2b..3a29768 100644
Binary files a/docs/screenshots/07-web-light.png and b/docs/screenshots/07-web-light.png differ
diff --git a/docs/screenshots/08-mobile-dark.png b/docs/screenshots/08-mobile-dark.png
index c6f7811..1d399b6 100644
Binary files a/docs/screenshots/08-mobile-dark.png and b/docs/screenshots/08-mobile-dark.png differ
diff --git a/docs/screenshots/08-mobile-light.png b/docs/screenshots/08-mobile-light.png
index 334cc04..4a87505 100644
Binary files a/docs/screenshots/08-mobile-light.png and b/docs/screenshots/08-mobile-light.png differ
diff --git a/docs/screenshots/08-web-dark.png b/docs/screenshots/08-web-dark.png
index 7d10b7d..66c8fef 100644
Binary files a/docs/screenshots/08-web-dark.png and b/docs/screenshots/08-web-dark.png differ
diff --git a/docs/screenshots/08-web-light.png b/docs/screenshots/08-web-light.png
index fee55c1..1e20bbd 100644
Binary files a/docs/screenshots/08-web-light.png and b/docs/screenshots/08-web-light.png differ
diff --git a/docs/screenshots/09-mobile-dark.png b/docs/screenshots/09-mobile-dark.png
index 878b8d7..13a7e65 100644
Binary files a/docs/screenshots/09-mobile-dark.png and b/docs/screenshots/09-mobile-dark.png differ
diff --git a/docs/screenshots/09-mobile-light.png b/docs/screenshots/09-mobile-light.png
index beac332..211d4ef 100644
Binary files a/docs/screenshots/09-mobile-light.png and b/docs/screenshots/09-mobile-light.png differ
diff --git a/docs/screenshots/09-web-dark.png b/docs/screenshots/09-web-dark.png
index 8df6f83..73ae130 100644
Binary files a/docs/screenshots/09-web-dark.png and b/docs/screenshots/09-web-dark.png differ
diff --git a/docs/screenshots/09-web-light.png b/docs/screenshots/09-web-light.png
index 3e60976..cead05b 100644
Binary files a/docs/screenshots/09-web-light.png and b/docs/screenshots/09-web-light.png differ