License note: free for noncommercial use; commercial use requires a separate license from the author. See License.
A daily "one move" (한 수) reflection PWA. Each day surfaces a single piece of classical wisdom — a question or a short vignette — paired with one of five reframing lenses (accept · challenge · fact · distance · meaning). Entry cost is ~60 seconds: one tap, plus an optional one-line note. Strength accumulates; deficits are never displayed.
Design principles: no deficit surface, tomorrow is unknown (date-deterministic rotation), novelty comes from the world (classics, not pure self-reflection), and free-text notes stay on-device only — they are never sent to the server.
Kairos is a daily reflection app for people in mid-career and midlife who want a steady, unsentimental practice rather than a mood tracker. It reframes self-improvement as sharpening (벼리기) instead of fixing deficits: each day is a single decisive "move" (한 수) drawn from classical and Stoic/Eastern thought, and your strength accumulates over time instead of a weakness dashboard counting down.
- Who it's for — adults wanting a low-friction (~60s/day), non-clinical daily habit.
- What's different — no deficit surface; the next card is unknown (date-deterministic rotation); novelty comes from the world (classics) rather than endless self-reflection; and private notes never leave the device.
- What it's not — not therapy, not medical advice, and not a streak-shaming productivity tracker.
pwa · react · vite · typescript · tailwindcss · express · sqlite · jwt ·
offline-first · indexeddb · daily-app · mindfulness · stoicism · self-improvement ·
korean · privacy-friendly
- Frontend (
web/) — Vite + React + TypeScript + Tailwind, installable PWA (offline-first via service worker + IndexedDB). - Backend (
server/) — Express + better-sqlite3 + JWT. Anonymousdevice_id → JWT; the server stamps reaction dates in KST and stores only a per-day dimension/kind count (never note text). - Optional Kakao subscription (OAuth "send-to-me" daily nudge) — disabled unless you configure keys.
- Anonymous device identity only — no account, no name, no email, no phone.
- Free-text notes live in IndexedDB and are never transmitted.
- The SQLite database is created with
0600/0700permissions and is gitignored.
Requires Node.js 18+.
# 1) API (terminal A)
cd server
cp .env.example .env # then edit: set JWT_SECRET (openssl rand -hex 32)
npm install
npm run dev # http://localhost:4110
# 2) Web (terminal B)
cd web
cp .env.example .env # optional overrides
npm install
npm run dev # http://localhost:5176 (proxies /api → :4110)Build the web app for production with cd web && npm run build (outputs web/dist/).
All secrets and environment-specific values come from .env files (see each .env.example).
Nothing is hardcoded — set BASE_URL / ALLOWED_ORIGIN to your own host when deploying, and
VITE_SITE_URL if you want share links to use a fixed canonical origin.
Licensed under the PolyForm Noncommercial License 1.0.0 — see LICENSE.
- ✅ Noncommercial use is free: you may use, modify, and share the software for any noncommercial purpose (personal, research, evaluation, charitable, etc.).
- 🔒 Commercial use requires a separate license from the author. If you want to use Kairos (or a derivative) for a commercial purpose, please open a GitHub issue to arrange a commercial license first.
© 2026 Kairos.
