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
i

İ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şkenVarsayılanAmaç
DATABASE_URLsqlite:../prisma/dev.dbRust backend'in açtığı SQLite dosyası. file: veya sqlite: öneki kabul edilir.
BACKEND_URLhttp://localhost:8080Next.js rewrite proxy'sinin /api/* isteklerini yönlendirdiği adres.
PORT8080Rust backend dinleme portu.
API_KEYboşAyarlandığında her /api/* isteği Authorization: Bearer <key> başlığı taşımalı.
ALLOWED_ORIGINboşAyarlandığında CORS bu origin'e kısıtlanır.
NEXT_PUBLIC_ENABLE_CURRENCY_CONVERTERtrueBuild-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:

  1. Rust backendbackend/, axum + sqlx, port :8080. SQLite ile doğrudan ham SQL konuşur, tüm domain modülleri backend/src/*.rs içinde tek dosya.
  2. Next.js frontendsrc/, port :3000. app/ dizininde sadece layout.tsx, page.tsx ve globals.css var; 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

Ş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


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:

Finance — canlı kurlar

Finans modülü iki katmanlı:

  1. Yerel — Hesaplar, işlemler, kategoriler, bütçeler. Tamamen offline.
  2. Ç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ış:

  1. Welcome ekranı — Ayrı, tam-ekran karşılama. Animated logo orb, rotating tagline, üç değer önerisi, "Hadi başlayalım" CTA.
  2. Setup Wizard — 8 adım: dil, depolama, görünüm (tema canlı uygulanır), modüller, dashboard widget'ları, hızlı kurulum, özet.
  3. App — Dashboard.

welcomeSeen ve setupComplete flag'leri store'da kalıcıdır:

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:

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.

Döviz çevirici detayı

src/lib/finance/currency.ts tek dosyalık modül:

+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:

KaynakYöntemlerAçıklama
/api/tasks, /api/tasks/:idGET POST PATCH DELETEGörevler, alt görevler, etiketler ilişkisel.
/api/habits, /api/habits/:id/logsGET POST PATCH DELETEAlışkanlık + günlük logları.
/api/journalGET POST PATCH DELETEGünlük girdileri, ruh hâli.
/api/notes, /api/note-foldersGET POST PATCH DELETEKlasörlü notlar.
/api/finance/accounts, /finance/transactions, /finance/categoriesGET POST PATCH DELETEFinans veritabanı.
/api/goalsGET POST PATCH DELETEHedefler ve kilometre taşları.
/api/eventsGET POST PATCH DELETETakvim olayları.
/api/time-entriesGET POST PATCH DELETEZaman girdileri.
/api/pomodoroGET POSTPomodoro oturumları.
/api/coursesGET POST PATCH DELETELearning modülü.
/api/projects, /api/tagsGET POST PATCH DELETEEtiket + proje yönetimi.
/api/profileGET PUT PATCHKullanıcı profili.
/api/searchGETModüller arası arama.
/api/dashboardGETHero KPI verisi.
/api/analyticsGETİstatistiksel içgörüler.
/api/activityGETModüller arası son aktivite.
/api/weekly-reviewGETHaftalık özet.
/api/notificationsGET POSTBildirim merkezi.
/api/data/export, /data/import, /data/reset, /data/statsGET POST DELETEVeri yönetimi.
/healthGETHealthcheck (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

KomutAçıklama
bun run devNext.js dev sunucusu (:3000)
bun run dev:allBackend + frontend birlikte (tek terminal)
bun run buildProduction build (standalone output)
bun run typechecktsc --noEmit (commit öncesi geç)
bun run lintESLint
bun run testVitest (jsdom)
bun run backend:devcargo run, port 8080
bun run backend:buildcargo build --release
bun run db:pushschema.prisma'yı dev.db'ye uygula
bun run db:generatePrisma client yeniden üret
bun run db:seedDemo veriyle doldur
bun run docker:startTek komut Docker (cross-platform)
bun run docker:stopContainer durdur, volume kalır
bun run docker:resetDurdur + data volume sil
./start.sh / .\start.ps1Node/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-buildernext-builderrunner. Final image node:22-slim tabanlı; Rust binary'si /usr/local/bin/lifeos-backend'e kopyalanır.

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

  1. Fork & clone.
  2. bun install + bun run db:push.
  3. Branch: git checkout -b feat/<açıklama>.
  4. Geliştir → bun run typecheck + bun run test geç.
  5. Commit'leri Conventional Commits formatında yaz.
  6. 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.