Personal life OS — quick capture, tasks, reminders, finance, journal, goals, AI assistant. Live at alos.yumehana.dev · Self-hosted on a Raspberry Pi 4.
Part of YUME (Your Unified Memory & Experience) — the personal AI ecosystem.
Auth is handled by AnniCore (auth.yumehana.dev).
ALOS is the heart of YUME. One place for your life data — tasks, captures, reminders, finance, journal, goals — connected to an AI assistant that has full context before you say a word.
It was spun out of AnniWebsite when the organizer outgrew the site. ALOS is the dedicated product. AnniWebsite is just the personal site.
Current state: P0 complete. Auth, quick capture, tasks, inbox are live. P1 (AI chat + smart capture parsing) is next.
| Layer | Tech |
|---|---|
| Frontend | Vite + Vanilla JS (no framework) |
| Backend | Node.js + Express |
| Database | SQLite via better-sqlite3 (WAL mode, FK on) |
| Auth | Delegated to AnniCore (auth.yumehana.dev, port 4200) |
| AI | Claude API — claude-sonnet-4-20250514 (P1) |
| STT | Whisper self-hosted on ThinkPad (P1, scaffolded) |
| Voice | ElevenLabs API (P2, scaffolded) |
| Pi paths | /opt/anni/alos (backend) · /opt/anni/alos-www (frontend) |
AnniLifeOS/
├── client/ # Vite frontend source
│ ├── index.html
│ ├── package.json
│ ├── vite.config.js # outDir: '../dist'
│ └── src/
│ ├── main.js # Boot: theme → starfield → cursor → checkAuth → render
│ ├── lib/
│ │ ├── router.js # Hash-based SPA router
│ │ ├── api.js # All fetch calls to backend
│ │ ├── auth.js # checkAuth, redirectToLogin
│ │ ├── toast.js
│ │ └── theme.js
│ ├── effects/
│ │ ├── starfield.js
│ │ └── cursor.js
│ ├── components/
│ │ ├── nav.js # App shell: sidebar + topbar
│ │ └── modal.js
│ ├── pages/
│ │ ├── home.js # Dashboard + quick capture bar + live stats
│ │ ├── capture.js # Inbox CRUD
│ │ ├── tasks.js # Tasks + backlog with priorities
│ │ ├── finance.js # (P2 stub)
│ │ ├── journal.js # (P2 stub)
│ │ ├── goals.js # (P2 stub)
│ │ └── ai.js # (P1 stub — Claude streaming chat)
│ └── styles/
│ ├── global.css # Tokens, reset (ported from AnniWebsite)
│ ├── components.css
│ └── alos.css # ALOS-specific layout
├── server/
│ ├── server.js
│ ├── db/
│ │ ├── db.js # SQLite singleton
│ │ └── schema.sql
│ ├── middleware/
│ │ └── auth.js # requireAuth — calls AnniCore /api/auth/me
│ ├── routes/
│ │ ├── capture.js # POST/GET/PATCH/DELETE /api/captures
│ │ ├── tasks.js # Full CRUD /api/tasks
│ │ ├── reminders.js # (scaffolded)
│ │ ├── finance.js # (scaffolded)
│ │ ├── journal.js # (scaffolded)
│ │ ├── goals.js # (scaffolded)
│ │ ├── ai.js # (503 stub — P1)
│ │ ├── stt.js # (503 stub — P1, proxies to Whisper)
│ │ └── voice.js # (503 stub — P2, ElevenLabs)
│ ├── .env.example
│ └── alos.service # systemd unit
├── nginx/
│ └── alos.yumehana.dev.nginx
├── docs/
│ └── YUME-Vision.md # Full YUME vision doc (DE/EN, human + AI readable)
├── lib/ # AnniLog PS module
├── dist/ # Vite build output (gitignored)
├── logs/ # Deploy logs (gitignored)
├── CLAUDE.md # Claude Code project briefing
├── deploy.bat # ← entry point
├── deploy.ps1
├── deploy.sh
└── README.md
| Route | Description |
|---|---|
#/ |
Dashboard — today view, quick capture, inbox count, stats |
#/capture |
Inbox — all captures with archive/delete |
#/tasks |
Tasks + backlog with priority filters |
#/finance |
Finance tracker (P2) |
#/journal |
Journal / daily notes (P2) |
#/goals |
Goals overview (P2) |
#/ai |
AI chat with context injection (P1) |
All routes are auth-gated. Unauthenticated → redirected to auth.yumehana.dev.
- Client calls
/api/auth/meon load - If 401 →
redirectToLogin()sends browser tohttps://auth.yumehana.dev/?returnTo=https://alos.yumehana.dev - User authenticates with GitHub/Discord/Google via AnniCore
- Session cookie set on
.yumehana.dev— valid for ALOS automatically - Client retries
/api/auth/me→ renders app
Server-side: every API request goes through requireAuth middleware which calls http://127.0.0.1:4200/api/auth/me internally, upserts the user into ALOS's local DB, and sets req.user.
| Variable | Default | Description |
|---|---|---|
PORT |
4100 |
API port |
NODE_ENV |
production |
|
ANNI_AUTH_URL |
http://127.0.0.1:4200 |
AnniCore internal URL |
DB_PATH |
/srv/storage/ALOS/alos.db |
SQLite database |
CLAUDE_API_KEY |
— | Anthropic API key (P1) |
ELEVENLABS_API_KEY |
— | Voice output (P2) |
WHISPER_URL |
http://thinkpad-local:8000 |
Local STT service (P1) |
# Backend
cd server && npm install
cp .env.example .env
node server.js # → http://127.0.0.1:4100
# Frontend (separate terminal)
cd client && npm install
npm run dev # → http://localhost:3100 (proxies /api/* to :4100)For local auth: run AnniCore on port 4200 locally, or point ANNI_AUTH_URL at the production instance and use the shared session cookie.
.\deploy.bat # full deploy (build + push client + server)
.\deploy.bat -ClientOnly # frontend only
.\deploy.bat -ServerOnly # backend + restart servicePreserves server/.env and alos.db on the Pi.
| Phase | Status | What |
|---|---|---|
| P0 — Foundation | ✅ Live | Auth, capture, tasks, inbox, deploy |
| P1 — AI layer | 🔧 Next | Claude API, streaming SSE, context injection, Whisper STT |
| P2 — Full organizer | 📋 Planned | Finance, journal, goals, reminders scheduling |
| P3 — Desktop | 📋 Planned | Tauri wrapper for Win11 native app |
| P4 — Mobile | 📋 Planned | Android + Galaxy Watch (Wear OS) |
For the full YUME ecosystem vision, see docs/YUME-Vision.md.
Browser → Cloudflare Tunnel → nginx :80
└── alos.yumehana.dev
├── / → /opt/anni/alos-www/ (Vite build)
└── /api/* → 127.0.0.1:4100 (Express)
Full infra reference: AnniCore/INFRA.md
Structure standard: AnniCore/docs/STRUCTURE.md
ALOS v0.1 — part of the YUME ecosystem · yumehana.dev