Life OS Belgeleri
Yerel öncelikli, gizlilik odaklı kişisel işletim sistemi. Görevler, alışkanlıklar, finans, hedefler ve daha fazlasını tek bir sakin çalışma alanında toplar.
Bu belge Life OS'u kurmak, kullanmak ve genişletmek için ihtiyacın olan her şeyi içerir. Mimari kararlardan modül davranışına, backend API'sinden Docker dağıtımına kadar.
İlk kez mi başlıyorsun? Hızlı başlangıç ile 60 saniyede çalışan bir kurulum elde edersin.
Hızlı başlangıç
1. Docker — tek komut
En kısa yol. Linux, macOS, Windows ve WSL'de aynı:
bun run docker:start
Bu komut Docker daemon'u kontrol eder, image'i build eder, container'ı arka planda başlatır, healthy olana kadar bekler ve logları takip eder. Bun ya da Node yoksa shell wrapper'larını kullan:
# Linux / macOS / WSL
./start.sh
# Windows PowerShell
.\start.ps1
Açıldıktan sonra http://localhost:3000 adresine git.
2. Tek terminalde geliştirme
Hem Rust backend'i hem de Next.js frontend'i aynı anda başlatır:
bun run dev:all
"Görev oluşturulamıyor" benzeri sorunları engeller — çünkü backend'i unutmak imkansız hâle gelir.
3. Manuel — iki terminal
# Terminal 1 — Rust backend (:8080)
bun run backend:dev
# Terminal 2 — Next.js frontend (:3000)
bun run dev
İlk çalıştırmadan önce bir kez bun install ve bun run db:push komutlarını çalıştır. db:push, prisma/dev.db SQLite dosyasını şemaya göre oluşturur.
Yapılandırma
Tüm ortam değişkenleri opsiyoneldir; ekosistem makul varsayılanlarla çalışır.
| Değişken | Varsayılan | Amaç |
|---|---|---|
DATABASE_URL | sqlite:../prisma/dev.db | Rust backend'in açtığı SQLite dosyası. file: veya sqlite: öneki kabul edilir. |
BACKEND_URL | http://localhost:8080 | Next.js rewrite proxy'sinin /api/* isteklerini yönlendirdiği adres. |
PORT | 8080 | Rust backend dinleme portu. |
API_KEY | boş | Ayarlandığında her /api/* isteği Authorization: Bearer <key> başlığı taşımalı. |
ALLOWED_ORIGIN | boş | Ayarlandığında CORS bu origin'e kısıtlanır. |
NEXT_PUBLIC_ENABLE_CURRENCY_CONVERTER | true | Build-time varsayılan: döviz çeviriciyi/canlı kurları kapatır. Kullanıcı runtime'da yine açabilir. |
İki süreç tasarımı
Life OS iki bağımsız süreç olarak çalışır:
- Rust backend —
backend/, axum + sqlx, port:8080. SQLite ile doğrudan ham SQL konuşur, tüm domain modülleribackend/src/*.rsiçinde tek dosya. - Next.js frontend —
src/, port:3000.app/dizininde sadecelayout.tsx,page.tsxveglobals.cssvar; Next API route'u yoktur.
next.config.ts içindeki rewrites() her /api/* isteğini şeffaf biçimde Rust'a yönlendirir. Bu sayede frontend tek bir fetch() kullanır, geliştirici Rust'ın orada olduğunu fark bile etmez.
Veri akışı
Sayfa bileşeni
→ src/lib/api/hooks.ts (TanStack Query)
→ apiGet/apiPost/apiPatch/apiDelete (src/lib/api/client.ts)
→ fetch("/api/...")
→ Next.js rewrite → Rust :8080 → SQLite
Her mutasyon başarı sonrası queryClient.invalidateQueries ile UI'yi tazeler. Optimistik güncellemelere şu an dokunulmadı; her şey doğrulanmış sunucu cevabıyla yenilenir.
Veritabanı sözleşmesi
- Aynı dosya — Hem Prisma (migrations) hem Rust (runtime)
prisma/dev.dbüzerinde çalışır. - Foreign keys —
backend/src/db.rspool'uforeign_keys(true)ile açar; SQLite varsayılan olarak kapalı tutar ve Prisma'nın cascade delete'leri buna güvenir. - Önceden oluşturulmuş —
create_if_missing(false): Rust binary, DB yoksa hata verir. Öncebun run db:pushçalıştır.
Şema değişikliği için Prisma kullanılır:
bun run db:push # Migrationsız hızlı eşleme
bun run db:generate # Prisma client'ı yenile
bun run db:seed # Demo veriyle doldur
Durum yönetimi
- TanStack Query — sunucu verisi için tek doğru kaynak.
- Zustand — yerel UI durumu (seçili modül, filtreler, sidebar, tema, dil, baseCurrency vs.) +
persistmiddleware ilelocalStorage.
Modüller
Tüm modüller src/components/lifeos/<modül>/ altında tek bir büyük *-page.tsx dosyasında yaşar.
Dashboard hero
Hero bento kartı (selamlama, KPI rail, focus pill), inline quick capture, 4 hazır şablon, sürüklenebilir widget'lar.
Tasks
Liste + kanban görünümleri, modern composer (öncelik chip'leri, tarih popover, etiket, tekrar, ⌘+Enter).
Notes
Klasör hiyerarşisi, etiketleme, hızlı arama.
Habits
Günlük takip, streak hesaplama, takvim haritası.
Journal
Günlük girişler, ruh hâli, hızlı promptlar.
Finance FX
Çok para birimli hero, canlı ECB kurları, döviz çevirici, 7g sparkline, per-currency breakdown.
Goals
Hiyerarşik hedefler, kilometre taşları, ilerleme.
Learning
Kurslar, kaynaklar, ilerleme takibi.
Calendar / Time
Olaylar, zaman girdileri, Pomodoro odak zamanlayıcı.
Settings
Profil, görünüm (tema/accent/font), finans tercihleri, veri yönetimi, kısayollar, bildirimler.
Tasks — composer detayı
Görev oluşturma diyalogu modern bir composer kullanır:
- Borderless büyük başlık girişi, autofocus.
- 4 öncelik pill'i (renkli nokta + accent border).
- Popover chip'leri: tarih (Bugün/Yarın/Bu hafta + manuel), proje, tekrar, etiketler.
- ⌘/Ctrl+Enter ile gönder.
- Boş durum kartındaki "Görev Ekle" butonu artık doğrudan composer'ı açar.
Finance — canlı kurlar
Finans modülü iki katmanlı:
- Yerel — Hesaplar, işlemler, kategoriler, bütçeler. Tamamen offline.
- Çevrim içi (opsiyonel) — Avrupa Merkez Bankası referans kurları üzerinden canlı çeviri ve sparkline. Frankfurter ile çalışır (ücretsiz, key gerektirmez).
Kullanıcı Ayarlar → Görünüm → Finans Tercihleri bölümünden tek tıkla canlı kurları kapatabilir. Kapatıldığında dış API'ye hiç istek atılmaz; her hesap kendi para biriminde gösterilir.
Welcome & Setup
İlk açılışta üç adımlı akış:
- Welcome ekranı — Ayrı, tam-ekran karşılama. Animated logo orb, rotating tagline, üç değer önerisi, "Hadi başlayalım" CTA.
- Setup Wizard — 8 adım: dil, depolama, görünüm (tema canlı uygulanır), modüller, dashboard widget'ları, hızlı kurulum, özet.
- App — Dashboard.
welcomeSeen ve setupComplete flag'leri store'da kalıcıdır:
!setupComplete && !welcomeSeen→ Welcome!setupComplete→ SetupWizard- diğer → AppShell
Setup sırasında seçilen tema/accent/font anında uygulanır; "Launch" butonu sadece son onaydır. Setup'ı tekrar açmak için: Ayarlar → Tehlikeli Bölge → Kurulum Sihirbazını Sıfırla.
Tema
Üç katman:
- Mod — light / dark / black (OLED) / system.
next-themesile yönetilir. - Accent — emerald, teal, amber, rose, violet, cyan, indigo, pink, lime, sky veya custom hex.
--accent-primaryCSS değişkenine yazılır, tüm modüller bunu kullanır. - Yoğunluk — compact / comfortable / spacious. CSS variable'larla padding/spacing ölçekler.
Logo (public/logo.svg) sidebar, welcome, setup wizard, settings about kartı, README başlığı, GitHub Pages nav ve favicon olarak entegre.
Çoklu dil
5 dil mevcut: en, tr, es, de, fr. Çeviri dosyaları src/lib/i18n/translations/*.ts.
- Tip güvenli:
TranslationKeystipien'den türetilir; diğer diller bunu satisfy etmeli. - Eksik anahtarlar için otomatik İngilizce fallback (
useTranslationham anahtar yolu döndürmez). - Tarayıcı dili welcome ekranı + wizard'da algılanır, kullanıcı override edebilir.
Döviz çevirici detayı
src/lib/finance/currency.ts tek dosyalık modül:
SUPPORTED_CURRENCIES— USD, EUR, GBP, TRY, JPY, CHF, CAD, AUD, CNY, INR.formatCurrency(amount, code)— JPY için 0 ondalık, diğerleri 2.useExchangeRates(base, { enabled })— Frankfurter/latest; 1 saatstaleTime, 24 saatgcTime.useExchangeRateHistory(from, to, days, { enabled })— timeseries endpoint; 7g sparkline + 24s delta için.convert(amount, from, to, rates)— base üzerinden pivot.
Arama & komut paleti
⌘+K (veya Ctrl+K) komut paleti açar: hızlı modül geçişi, hızlı ekleme aksiyonları. Header'daki arama çubuğu modüller arası içerik araması yapar.
Backend API
Tüm route'lar backend/src/lib.rs içindeki build_app()'te tek noktada kayıtlı. AppState sadece SqlitePool taşır.
Hata yönetimi: backend/src/error.rs içindeki AppError → axum IntoResponse. Tek tip JSON hata gövdesi döndürür.
Uç noktalar
Hepsi /api/ prefix'i ile başlar:
| Kaynak | Yöntemler | Açıklama |
|---|---|---|
/api/tasks, /api/tasks/:id | GET POST PATCH DELETE | Görevler, alt görevler, etiketler ilişkisel. |
/api/habits, /api/habits/:id/logs | GET POST PATCH DELETE | Alışkanlık + günlük logları. |
/api/journal | GET POST PATCH DELETE | Günlük girdileri, ruh hâli. |
/api/notes, /api/note-folders | GET POST PATCH DELETE | Klasörlü notlar. |
/api/finance/accounts, /finance/transactions, /finance/categories | GET POST PATCH DELETE | Finans veritabanı. |
/api/goals | GET POST PATCH DELETE | Hedefler ve kilometre taşları. |
/api/events | GET POST PATCH DELETE | Takvim olayları. |
/api/time-entries | GET POST PATCH DELETE | Zaman girdileri. |
/api/pomodoro | GET POST | Pomodoro oturumları. |
/api/courses | GET POST PATCH DELETE | Learning modülü. |
/api/projects, /api/tags | GET POST PATCH DELETE | Etiket + proje yönetimi. |
/api/profile | GET PUT PATCH | Kullanıcı profili. |
/api/search | GET | Modüller arası arama. |
/api/dashboard | GET | Hero KPI verisi. |
/api/analytics | GET | İstatistiksel içgörüler. |
/api/activity | GET | Modüller arası son aktivite. |
/api/weekly-review | GET | Haftalık özet. |
/api/notifications | GET POST | Bildirim merkezi. |
/api/data/export, /data/import, /data/reset, /data/stats | GET POST DELETE | Veri yönetimi. |
/health | GET | Healthcheck (auth gerekmez). |
Kimlik doğrulama
API_KEY ortam değişkeni ayarlıysa middleware tüm /api/* isteklerinde Authorization: Bearer <key> başlığını arar. Boşken middleware no-op'tur — yerel geliştirme için güvenli.
CORS varsayılan olarak izin verir. ALLOWED_ORIGIN ayarlanırsa o origin'e kısıtlanır.
Komutlar
| Komut | Açıklama |
|---|---|
bun run dev | Next.js dev sunucusu (:3000) |
bun run dev:all | Backend + frontend birlikte (tek terminal) |
bun run build | Production build (standalone output) |
bun run typecheck | tsc --noEmit (commit öncesi geç) |
bun run lint | ESLint |
bun run test | Vitest (jsdom) |
bun run backend:dev | cargo run, port 8080 |
bun run backend:build | cargo build --release |
bun run db:push | schema.prisma'yı dev.db'ye uygula |
bun run db:generate | Prisma client yeniden üret |
bun run db:seed | Demo veriyle doldur |
bun run docker:start | Tek komut Docker (cross-platform) |
bun run docker:stop | Container durdur, volume kalır |
bun run docker:reset | Durdur + data volume sil |
./start.sh / .\start.ps1 | Node/Bun gerekmez (shell wrapper) |
Test
Frontend
Vitest + jsdom + Testing Library. src/__tests__/setup.ts Zustand persist için localStorage mock eder. Tek bir dosyayı çalıştırmak için:
bun run test -- src/__tests__/stores/task-store.test.ts
Backend
Rust integration testleri backend/tests/ altında. Her test suite tempfile ile izole bir geçici SQLite kullanır (common::setup_test_app()):
cd backend && cargo test
Docker
Multi-stage Dockerfile: rust-builder → next-builder → runner. Final image node:22-slim tabanlı; Rust binary'si /usr/local/bin/lifeos-backend'e kopyalanır.
- Volume — SQLite verisi
life-os-datanamed volume'unda kalır.docker:resetbu volume'u siler (geri dönüşsüz). - Entrypoint —
docker-entrypoint.shönceprisma migrate deployçalıştırır, sonra backend'i background'da başlatır,/healthhazır olunca frontend'i başlatır. - Healthcheck — Hem 3000 hem 8080 sorgulanır.
wgetrunner stage'e eklendi.
Dağıtım
En basit yol Docker:
docker compose up -d --build
Reverse proxy (Caddy / nginx / Traefik) ile HTTPS sonlandırması yapıp, API_KEY ve ALLOWED_ORIGIN ayarlamanız önerilir. Veri SQLite olduğu için snapshot'lar tek dosya kopyalama kadar basit.
Katkıda bulunma
- Fork & clone.
bun install+bun run db:push.- Branch:
git checkout -b feat/<açıklama>. - Geliştir →
bun run typecheck+bun run testgeç. - Commit'leri Conventional Commits formatında yaz.
- PR aç.
Yeni bir modül eklerken kalıp: src/components/lifeos/<mod>/<mod>-page.tsx + backend/src/<mod>.rs + backend/src/lib.rs route kaydı + src/lib/api/hooks.ts + 5 dil i18n.
SSS
Verilerim nerede tutuluyor?
Sadece senin cihazında. SQLite tek dosya (prisma/dev.db veya Docker'da life-os-data volume'unda). Bulut, hesap, takip yok.
Birden fazla cihazdan kullanabilir miyim?
Şu an gerçek zamanlı sync yok. Manuel yol: Ayarlar → Veri → Dışa Aktar, ardından diğer cihaza içe aktar. Veya container'ı VPS'te tek bir yerde host edip her yerden açabilirsin.
Döviz çeviriciyi tamamen kapatabilir miyim?
Evet. Ayarlar → Görünüm → Finans Tercihleri içinde "Döviz Çeviricisini Etkinleştir" switch'ini kapat. Kapatıldığında Frankfurter API'sine hiç istek atılmaz; uygulama tamamen offline çalışır.
Setup wizard'ı tekrar açabilir miyim?
Ayarlar → Tehlikeli Bölge → Kurulum Sihirbazını Sıfırla. Verilerin korunur.
Hangi tarayıcılar destekleniyor?
Modern evergreen tarayıcılar: Chrome/Edge 110+, Firefox 110+, Safari 16.4+.
Backend Rust olmak zorunda mı?
Hayır, ama tasarım iki süreçli olduğu için frontend Rust'a /api/* üzerinden konuşur. Backend'i değiştirirsen aynı endpoint sözleşmesini koruman gerekir.