A fully offline personal productivity system built with vanilla HTML, CSS & JavaScript.
A single-page web app that replaces 10 different apps β manage your daily life, finances, learning, and productivity in one unified, beautiful interface.
- Overview
- Live Demo
- Features
- Screenshots
- Tech Stack
- Getting Started
- Project Structure
- Modules
- Data Storage
- Design System
- Mobile Support
- Developer
LifeOS is a personal productivity web application built entirely from scratch using vanilla HTML, CSS, and JavaScript β no frameworks, no backend, no database. Everything runs in the browser and persists via localStorage.
The goal was to build a single system that replaces multiple apps:
| Instead of | LifeOS has |
|---|---|
| Google Calendar | Calendar module (day/week/month views) |
| Todoist | Tasks module with priorities & deadlines |
| Habitica | Habits tracker with streaks |
| Notion | Notes + daily journal |
| Budget apps | Full finances tracker with charts |
| Duolingo | Language learning module |
| Forest / Pomodoro apps | Built-in Pomodoro timer + focus mode |
| Analytics dashboards | Statistics with charts & history |
Open
index.htmlin any modern browser β no installation, no server needed.
# Clone the repo
git clone https://github.com/badreddinemadad05/lifeos.git
# Open in browser
open index.html
# or just double-click the file- β 13 fully functional modules in a single page β no page reloads
- β 100% offline β works without internet after first load
- β localStorage persistence β data survives browser restarts
- β Export / Import β backup all your data as JSON
- β Dark & Light mode β with system-native color scheme
- β Custom accent color β personalize the theme in Settings
- β Real-time clock β auto-refreshes date at midnight
- β Fully responsive β works on desktop, tablet, and mobile
- β Daily score ring (tasks + habits completion percentage)
- β Celebration animations with confetti when tasks are completed
- β Tomorrow preview on dashboard
- β Quick-add modal accessible from any page
- β Pomodoro focus mode with full-screen overlay and particles
- β Monthly income/expense tracking with navigation between months
- β Budget progress bar with color-coded warnings
- β Doughnut chart breakdown by category
- β Net savings and savings rate calculation
- β Language learning (Dutch & English) with 4 status levels
- β Daily 10-phrase goal with progress tracking
- β Streak counter
- β Subject & lesson management with study time tracking
Below are the main pages of LifeOS.
| Dashboard | Finances | Languages |
|---|---|---|
| Score ring, tasks, habits, goals summary | Monthly budget, chart, transactions | Phrase cards with status badges |
| Pomodoro Focus | Statistics | About Developer |
|---|---|---|
| Full-screen focus mode with particles | Charts by period (week/month/year) | Developer portfolio page |
| Technology | Version | Purpose |
|---|---|---|
| HTML5 | β | Page structure & semantic markup |
| CSS3 | β | Full design system (1800+ lines) |
| JavaScript ES6+ | β | All logic, modules, data (3900+ lines) |
| Chart.js | 4.4.0 (CDN) | Doughnut & bar charts |
| localStorage | Browser API | Data persistence |
| SVG | Inline | All icons + progress rings |
Zero dependencies beyond Chart.js. No React, no Vue, no Node.js, no server.
- Any modern browser (Chrome, Firefox, Safari, Edge)
- No internet required after first load (Chart.js loads from CDN on first use)
# 1. Download or clone
git clone https://github.com/badreddinemadad05/lifeos.git
# 2. Navigate to folder
cd lifeos
# 3. Open index.html in your browser
# Double-click the file OR:
open index.html # macOS
start index.html # Windows
xdg-open index.html # LinuxThat's it. No npm install, no build step, no server.
lifeos/
β
βββ index.html # Full app structure (all pages, modals, nav)
βββ style.css # Complete design system (~2600 lines)
β βββ CSS custom properties (dark/light theme variables)
β βββ Layout (sidebar, topbar, content)
β βββ Components (cards, buttons, modals, forms)
β βββ Module-specific styles (finances, languages, about...)
β βββ Responsive breakpoints (768px, 480px, 390px)
β
βββ app.js # All JavaScript logic (~3900 lines)
β βββ DB β localStorage abstraction layer
β βββ Utils β Date formatting, helpers
β βββ Modal β Modal manager
β βββ Toast β Notification system
β βββ Celebration β Confetti + celebration cards
β βββ DashModule β Dashboard
β βββ CalModule β Calendar
β βββ TaskModule β Tasks
β βββ LearnModule β Learning (subjects & lessons)
β βββ HabitModule β Habits + logs
β βββ GoalModule β Goals
β βββ NotesModule β Notes & Journal
β βββ FinanceModule β Finances
β βββ LangModule β Languages
β βββ PomodoroModule β Pomodoro timer
β βββ StatsModule β Statistics
β βββ SettingsModule β Settings
β βββ App β Main coordinator (navigation, init)
β
βββ IMG-DEV.jpg # Developer profile photo
βββ IMG-LG.png # Site logo
βββ README.md # This file
βββ DOCUMENTATION.md # Full technical documentation (French)
The homepage. Displays a complete daily overview in one glance.
Components:
- Daily Score Ring β SVG circular progress showing % of tasks + habits completed today. Animates with CSS
stroke-dashoffset. Goes green (π) at 100%. - Today's Schedule β All calendar events for today, sorted by time
- Today's Tasks β Pending tasks with quick-complete checkbox + quick-delete button. Hides completed tasks automatically. Shows tomorrow's tasks when all done.
- Today's Habits β Remaining habits to validate. Shows "all done π" when complete.
- Quick Stats β 4 widgets: tasks done this week, habit rate today, study hours this week, active goals
- Goals Preview β Top 4 active goals with progress bars
- Daily Quote β Random motivational quote on each load
Celebration system: Completing a task or habit triggers a confetti animation with a personalized message ("Yaaay! Good work, [Name]! π"). Completing everything triggers a grand celebration (90 confetti pieces, 3.8s, π).
Full calendar with 3 views:
| View | Navigation | Description |
|---|---|---|
| Day | Β±1 day | Hourly timeline with positioned event blocks |
| Week | Β±7 days | 7-column grid, scrollable horizontally on mobile |
| Month | Β±1 month | Classic calendar grid (6Γ7) |
Events include: title, date, start/end time, color, location, category, notes.
Day view positions events using absolute CSS:
top = (start_minutes - startHour*60) pxheight = duration_in_minutes px
A red line marks the current time and updates every 60 seconds.
Full task management system.
Task fields: title, priority (high/medium/low), status (todo/in-progress/done), deadline, time, category.
Features:
- Filter by status and priority
- Sort by priority then time
- Quick-toggle from dashboard (marks done + triggers celebration)
- Quick-delete button (visible on hover / always visible on touch)
completedAtfield stored for historical statistics
Study management organized into subjects β lessons.
Subjects: name, color, level (beginner / intermediate / advanced / expert)
Lessons: title, duration, date, status (todo / in-progress / done), notes, linked to a subject
Progress bar shows lessons completed per subject. Deleting a subject removes all its lessons automatically.
Daily habit tracking with streak counting.
Habit logs are stored as:
{ "2026-03-16": { "habit_id": true } }A streak is computed by walking backwards from today, counting consecutive days the habit was done.
The weekly grid shows the last 7 days as a visual pattern for each habit.
Completing a habit from the dashboard triggers a celebration and celebration if all habits are done.
Long-term goal tracking with visual progress bars.
Goal fields: title, description, category, start date, target date, priority, progress (0β100%), status.
- Progress updated via a slider
- Days remaining warning (red when < 7 days)
- Mark as completed β moves to completed list
Two-tab module:
Notes tab
- Two-panel layout: list (left) + editor (right)
- Pinned notes (π) always appear first
- Auto-sort: pinned β most recently modified
- Fields: title + free-text content
Journal tab
- One entry per day (indexed by
YYYY-MM-DD) - Fields: free text + mood emoji (π π π π€ π΄)
- Displays all past entries below the editor
Monthly income and expense tracker.
Navigation: β / β buttons change currentMonth (format YYYY-MM). Uses local date methods (not toISOString()) to avoid UTC timezone offset bugs.
Expense categories:
| Key | Label | Color |
|---|---|---|
groceries |
Courses | π’ Green |
rent |
Loyer | π£ Purple |
leisure |
Loisirs | π Orange |
transport |
Transport | π΅ Blue |
personal |
Achat personnel | π€ Mauve |
other |
Autre dΓ©pense | β« Gray |
Income categories: Job Γ©tudiant πΌ, Autre revenu π°
Calculations:
- Net savings = Income β Expenses
- Savings rate = (Savings / Income) Γ 100
- Budget bar: green < 80%, orange 80β100%, red > 100%
Chart: Chart.js doughnut (cutout: 65%) showing expense breakdown. Destroyed and recreated on each render to avoid Canvas conflicts.
Phrase-based language learning module.
Supported languages: π§πͺ Dutch Β· π¬π§ English
Phrase status levels:
| Status | Meaning | Color |
|---|---|---|
new |
Just added | Gray |
learning |
In progress | Orange |
learned |
Mastered | Green |
review |
Needs review | Red |
Daily goal: 10 phrases. A dot-progress bar shows the 10 most recent phrases with color-coded status dots.
Streak: Counts consecutive days where at least one phrase was added or updated.
Filters: Today / To review / All / Learned + full-text search.
Focus timer implementing the Pomodoro Technique.
Configurable settings:
- Work session duration (5β120 min, default 25)
- Short break (1β30 min, default 5)
- Long break (5β60 min, default 15)
- Sessions before long break (2β8, default 4)
Focus Mode (full-screen overlay):
- SVG ring timer with animated gradient (purple = work, green = break)
- Floating particle animations in background
- Random motivational messages that change each phase
- Browser tab title updates:
"β± 24:45 | Work β LifeOS" - Can be linked to a subject or a task for contextual tracking
Historical data analysis across 3 time periods: Week / Month / Year.
Charts (Chart.js):
- Bar chart: tasks per day
- Bar chart: habits per day
- Line chart: productivity rate over time
Daily History: Reconstructs past days from completedAt fields on tasks and habitLogs β no extra storage needed. Shows the last 14 days with score, tasks done, and habits validated.
Options:
- User name and avatar initial
- Dark / Light theme toggle
- Primary color picker (applied instantly via CSS custom properties)
- Calendar start/end hours
Data Management:
- Export: Downloads
lifeos-backup-YYYY-MM-DD.jsoncontaining all data - Import: Restores all data from a JSON backup file
A personal portfolio page embedded within the app. Displays:
- Profile photo with animated gradient ring
- Name, title, location, availability status
- Social links (Email, LinkedIn, GitHub, GitLab)
- Education (BSc Computer Science, University of Namur)
- Technical skills with color-coded badges (Python, Java, C, Rust, HTML, CSS, JS...)
- 5 featured projects with tags
- Work experience
- Language proficiency bars (Arabic, French, English, Dutch)
All data is stored in localStorage with the prefix lifeos_.
| Key | Type | Content |
|---|---|---|
lifeos_settings |
Object | User preferences |
lifeos_events |
Array | Calendar events |
lifeos_tasks |
Array | All tasks |
lifeos_subjects |
Array | Learning subjects |
lifeos_lessons |
Array | Lessons per subject |
lifeos_habits |
Array | Habit definitions |
lifeos_habitLogs |
Object | { "YYYY-MM-DD": { habitId: bool } } |
lifeos_goals |
Array | Goals with progress |
lifeos_notes |
Array | Notes |
lifeos_journal |
Object | { "YYYY-MM-DD": { text, mood } } |
lifeos_transactions |
Array | Financial transactions |
lifeos_phrases |
Array | Language learning phrases |
ID generation:
Date.now().toString(36) + Math.random().toString(36).slice(2, 7)
// Example: "lzr8k4a2m" β unique, compact, timestamp-basedData safety: All user-input text is escaped via Utils.escHtml() before rendering in the DOM, preventing XSS injection.
Controlled by data-theme attribute on <html>:
- Default β dark mode (
color-scheme: dark) data-theme="light"β light mode (color-scheme: light)
:root {
--primary: #6366f1; /* Indigo accent */
--bg: #020817; /* Page background */
--bg-card: rgba(255,255,255,0.04); /* Card background */
--text-primary: #f1f5f9; /* Main text */
--text-secondary: #94a3b8; /* Secondary text */
--radius: 12px; /* Border radius */
--transition: all 0.22s ease;
}- Glassmorphism:
backdrop-filter: blur(24px)+ semi-transparent backgrounds - 3D Tilt: Cards tilt on mouse move via
perspective(800px) rotateY() rotateX()β disabled on touch devices - Ambient Background: CSS radial gradients + noise texture overlay
- Animated ring (About page): CSS
@keyframesspinning gradient border
| Breakpoint | Target | Key changes |
|---|---|---|
1100px |
Large tablet | Finance grid collapses |
900px |
Tablet | Dashboard/stats go single column |
768px |
Mobile | Sidebar off-canvas, bottom nav appears, modals slide up |
480px |
Small mobile | Tighter padding, lesson items wrap, goal actions wrap |
390px |
iPhone / small Android | Score card stacks vertically, smaller ring, social icons only |
LifeOS is fully optimized for mobile use:
- Bottom navigation bar with 6 key pages + "More" button (opens sidebar)
- Sidebar slides in as overlay when "More" or hamburger is tapped
- Modals slide up from the bottom instead of appearing centered
safe-area-insetsupport for iPhones with Dynamic Island / notchfont-size: 16pxon all inputs β prevents iOS Safari auto-zoom100dvhheight β correct sizing with dynamic browser bar- Touch targets minimum 44Γ44px (Apple/Google standard)
-webkit-overflow-scrolling: touchfor smooth scrolling on iOS- Horizontal scroll on calendar week view (wrapped in overflow container)
- 3D tilt effects disabled on touch devices (no hover = no glitches)
|
Badreddine Madad BSc Computer Science Student University of Namur β Belgium |
| Platform | Link |
|---|---|
| π§ Email | badreddine.madad@gmail.com |
| πΌ LinkedIn | linkedin.com/in/badreddine-madad-b18a81299 |
| π GitHub | github.com/badreddinemadad05 |
| π¦ GitLab | gitlab.com/badreddinemadad05 |
This project is a personal project built for learning and productivity purposes. Feel free to explore the code and use it as inspiration for your own projects.
Built with β€οΈ by Badreddine Madad β 2026
LifeOS β One app to manage your entire life.