style: replace em dashes with hyphens throughout codebase

Replace all — with - in all source files (JS, CSS, HTML, JSON,
Markdown) for consistency and readability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ulas
2026-04-03 17:04:39 +02:00
parent 6046cac7a8
commit 1122bd269b
56 changed files with 256 additions and 256 deletions
+12 -12
View File
@@ -1,4 +1,4 @@
# Oikos Product Specification
# Oikos - Product Specification
Self-hosted family planner web app for a single household (26 people). No app store, no public access. Deployment via Docker on a private Linux server behind an Nginx reverse proxy with SSL.
@@ -217,7 +217,7 @@ Masonry grid with colored sticky notes.
### Login (`/login`)
Unauthenticated users are redirected here. No public registration form admin creates users via setup wizard (`setup.js`) or Settings.
Unauthenticated users are redirected here. No public registration form - admin creates users via setup wizard (`setup.js`) or Settings.
- Username + password form
- Error display for wrong credentials
@@ -232,7 +232,7 @@ User management and app configuration. Logged-in users only.
- **User management (admin):** create new users, edit/delete existing users, assign roles (admin/member)
- **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval
- **Weather:** configure OpenWeatherMap location
- **Language:** System (follows `navigator.language`), German, English via `oikos-locale-picker` web component; switch without page reload
- **Language:** System (follows `navigator.language`), German, English - via `oikos-locale-picker` web component; switch without page reload
- **App info:** version, license
### Budget (`/budget`)
@@ -299,14 +299,14 @@ User management and app configuration. Logged-in users only.
- **Cards:** `var(--color-surface)`, `var(--radius-md)`, `var(--shadow-sm)`. Consistent padding `var(--space-4)` (16px) across all modules.
- **Buttons:** Primary = accent + white. Secondary = outline. Min-height 44px. Submit buttons show success (checkmark, 700ms green via `.btn--success`) and error (shake via `.btn--shaking`).
- **Inputs:** `var(--radius-sm)`, 1.5px border, padding 12px 16px. `[required]` fields receive validation status on blur (`.form-field--error` / `.form-field--valid`). Enter moves focus to the next field; Enter on the last field triggers submit.
- **FAB (Floating Action Button):** Color follows the module accent token (`--module-accent`) each module defines its own accent color. Hidden when the virtual keyboard is open (`visualViewport.resize`, threshold 75% of window height).
- **Module accent colors:** `--module-accent` is applied on three visual layers (1) active nav tab (bottom bar + sidebar stripe), (2) toolbar `border-top: 3px`, (3) cards/rows `border-left: 3px`. The active accent is written to `--active-module-accent` on `:root` on every navigation change. Falls back to `--color-accent` for pages without a module context.
- **FAB (Floating Action Button):** Color follows the module accent token (`--module-accent`) - each module defines its own accent color. Hidden when the virtual keyboard is open (`visualViewport.resize`, threshold 75% of window height).
- **Module accent colors:** `--module-accent` is applied on three visual layers - (1) active nav tab (bottom bar + sidebar stripe), (2) toolbar `border-top: 3px`, (3) cards/rows `border-left: 3px`. The active accent is written to `--active-module-accent` on `:root` on every navigation change. Falls back to `--color-accent` for pages without a module context.
- **Navigation:** Bottom tab bar on mobile (Dashboard, Tasks, Calendar, Meals, More). Sidebar on desktop.
- **Transitions:** Directional slide-X animation on page change (forward = from right, back = from left, 200ms). Respects `prefers-reduced-motion`.
- **Empty states:** Consistent `.empty-state` class across all modules (icon + title + description, centered). Compact variant `.empty-state--compact` for meal slots.
- **Modals:** Centered panel on desktop. On mobile (< 768px) bottom sheet slides in from below, sheet handle visible, swipe-to-close (> 80px downward). `focusin` scrolls inputs into view when the virtual keyboard is open.
- **List animation:** Staggered fade-in on load (`stagger()` from `public/utils/ux.js`) max 5 elements staggered (30ms gap), rest appear immediately.
- **Vibration:** `vibrate()` from `public/utils/ux.js` short pulses for light actions (1040ms), pattern `[30, 50, 30]` for destructive actions (delete). Respects `prefers-reduced-motion`.
- **Modals:** Centered panel on desktop. On mobile (< 768px) bottom sheet - slides in from below, sheet handle visible, swipe-to-close (> 80px downward). `focusin` scrolls inputs into view when the virtual keyboard is open.
- **List animation:** Staggered fade-in on load (`stagger()` from `public/utils/ux.js`) - max 5 elements staggered (30ms gap), rest appear immediately.
- **Vibration:** `vibrate()` from `public/utils/ux.js` - short pulses for light actions (1040ms), pattern `[30, 50, 30]` for destructive actions (delete). Respects `prefers-reduced-motion`.
- **PWA install prompt:** Appears only after 2 user interactions. Dismiss window 7 days; interaction counter resets after dismiss.
- **PWA offline fallback:** Service worker serves `/offline.html` when the network is unreachable and `index.html` is not cached. Includes a reload button.
@@ -323,11 +323,11 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
### Architecture
- **Module:** `public/i18n.js` exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)`
- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json` structure: `{ "module.camelCaseKey": "Value" }`
- **Module:** `public/i18n.js` - exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)`
- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json` - structure: `{ "module.camelCaseKey": "Value" }`
- **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })`
- **Fallback chain:** active locale → German (`de`) → key itself
- **Date format:** `Intl.DateTimeFormat` with current locale use `formatDate()` and `formatTime()` from `i18n.js`
- **Date format:** `Intl.DateTimeFormat` with current locale - use `formatDate()` and `formatTime()` from `i18n.js`
### Language Detection
@@ -343,4 +343,4 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
### Locale Switching
`setLocale(locale)` saves the selection, loads the new locale file, and fires the `locale-changed` custom event. All page modules and web components listen to this event and re-render no page reload required.
`setLocale(locale)` saves the selection, loads the new locale file, and fires the `locale-changed` custom event. All page modules and web components listen to this event and re-render - no page reload required.
+12 -12
View File
@@ -1,4 +1,4 @@
# CLAUDE.md Audit Oikos
# CLAUDE.md Audit - Oikos
**Datum:** 2026-04-02
**Aktuelle Länge:** 109 Zeilen (exkl. Leerzeilen)
@@ -17,7 +17,7 @@
**Fehlend:**
- Kein expliziter Hard-Constraints-Block. "No SPA framework" ist in einen Fließtext-Absatz eingebettet statt als nicht-verhandelbare Regel markiert.
- `public/utils/ux.js` wird von 7 Seiten importiert kein Wort davon.
- `public/utils/ux.js` wird von 7 Seiten importiert - kein Wort davon.
- `public/i18n.js` wird als System erwähnt, aber nicht als kanonische Datei referenziert.
- `offline.html` fehlt im Architecture-Tree.
@@ -27,7 +27,7 @@
**Redundanzen mit CONTRIBUTING.md:**
- Project Structure: fast identischer Tree in beiden Dateien
- Code Conventions: ES modules, Semicolons, Header comments, try/catch alles doppelt
- Code Conventions: ES modules, Semicolons, Header comments, try/catch - alles doppelt
- Testing: identische Beschreibung in beiden
- Changelog: gleiche Anweisung in beiden
- Migration append-only: in beiden Dateien
@@ -37,9 +37,9 @@
### 1.3 Signalqualität
**Probleme:**
- "No SPA framework" ist deskriptiv formuliert statt imperativ ein LLM könnte es als Kontextinfo statt als harte Regel lesen.
- "No SPA framework" ist deskriptiv formuliert statt imperativ - ein LLM könnte es als Kontextinfo statt als harte Regel lesen.
- Security Model ist eine Faktenbeschreibung. Kein Satz sagt "tu X" oder "tu niemals Y".
- Backend-Dependency-Liste ist reines Inventar Claude kann `package.json` lesen.
- Backend-Dependency-Liste ist reines Inventar - Claude kann `package.json` lesen.
- Deployment-Dockerfile-Snippet: rein informativ, kein Handlungsbezug.
- `node:20-slim` im CLAUDE.md-Deployment-Block, aber Dockerfile verwendet tatsächlich `node:22-slim`**falsche Information**.
@@ -47,7 +47,7 @@
| Erwähnt in CLAUDE.md | Tatsächlicher Zustand | Problem |
|---|---|---|
| `public/assets/` (apple-touch-icon, favicons) | Verzeichnis existiert nicht Icons in `public/icons/` | **Falscher Pfad** |
| `public/assets/` (apple-touch-icon, favicons) | Verzeichnis existiert nicht - Icons in `public/icons/` | **Falscher Pfad** |
| `scripts/generate-icons.js` | Existiert ✅, aber `scripts/seed-demo.js` fehlt im Tree | Unvollständig |
| Dockerfile `node:20-slim` | Dockerfile nutzt `node:22-slim` | **Falsche Version** |
| Components: `modal.js`, `oikos-install-prompt.js` | Auch `oikos-locale-picker.js` existiert | Unvollständig |
@@ -64,7 +64,7 @@
|-----------|--------|------------|
| Nur verhaltenssteuernd, keine Spec-Duplikation | ⚠️ | Security Model, Deployment, Dependency-Liste sind rein informativ |
| Harte Constraints klar abgegrenzt | ❌ | Kein separater Block; "no framework" in Fließtext versteckt |
| Referenztabelle vollständig & aktuell | ❌ | Keine Referenztabelle vorhanden nur ein Einzeiler zu SPEC.md |
| Referenztabelle vollständig & aktuell | ❌ | Keine Referenztabelle vorhanden - nur ein Einzeiler zu SPEC.md |
| Pfade/Module korrekt | ❌ | `public/assets/` existiert nicht, Dockerfile-Version falsch |
| Keine Redundanz mit CONTRIBUTING.md | ❌ | ~40% Überlappung (Structure, Conventions, Testing, Changelog) |
| Keine Redundanz mit docs/ | ✅ | SPEC.md wird referenziert, nicht dupliziert |
@@ -96,12 +96,12 @@ Siehe `CLAUDE.md.proposed` im Repo-Root.
| Was | Warum verhaltensrelevant |
|-----|--------------------------|
| Expliziter Hard Constraints Block | Claude muss sofort wissen, was nicht verhandelbar ist nicht erst aus Fließtext erschließen. |
| Expliziter Hard Constraints Block | Claude muss sofort wissen, was nicht verhandelbar ist - nicht erst aus Fließtext erschließen. |
| `public/utils/ux.js` als kanonische Utility | Wird von 7 Pages importiert. Ohne dieses Wissen würde Claude Utility-Funktionen duplizieren. |
| `public/i18n.js` + `public/locales/` in Structure | Kanonische Orte für i18n Claude muss wissen, wo Locale-Keys definiert werden. |
| `public/i18n.js` + `public/locales/` in Structure | Kanonische Orte für i18n - Claude muss wissen, wo Locale-Keys definiert werden. |
| `offline.html` im Tree | Existiert, wird vom Service Worker referenziert, fehlte komplett. |
| Reference Documents Tabelle | Claude muss wissen, wo welche kanonische Wahrheit liegt, statt zu raten. |
| `oikos-locale-picker.js` in Components | Existierende Komponente fehlte Claude könnte sie unwissentlich neu bauen. |
| `oikos-locale-picker.js` in Components | Existierende Komponente fehlte - Claude könnte sie unwissentlich neu bauen. |
### Umformuliert
@@ -115,6 +115,6 @@ Siehe `CLAUDE.md.proposed` im Repo-Root.
| Was | Von | Nach | Grund |
|-----|-----|------|-------|
| Security Model Details | CLAUDE.md | Bereits in Code (middleware, auth.js) | Kein eigenes Dokument nötig Code ist die Wahrheit |
| Security Model Details | CLAUDE.md | Bereits in Code (middleware, auth.js) | Kein eigenes Dokument nötig - Code ist die Wahrheit |
| Deployment env vars, Dockerfile | CLAUDE.md | README.md (bereits dort vorhanden) | Ops-Information, nicht Entwicklungsverhalten |
| Detaillierter Project Structure Tree | CLAUDE.md | CONTRIBUTING.md (bereits dort vorhanden) | Duplikation eliminieren CONTRIBUTING.md hat den vollständigen Tree |
| Detaillierter Project Structure Tree | CLAUDE.md | CONTRIBUTING.md (bereits dort vorhanden) | Duplikation eliminieren - CONTRIBUTING.md hat den vollständigen Tree |
+6 -6
View File
@@ -3,21 +3,21 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Oikos The Self-Hosted Family Planner</title>
<title>Oikos - The Self-Hosted Family Planner</title>
<meta name="description" content="A privacy-first, self-hosted family planner with tasks, shopping lists, meal planning, calendar sync, budget tracking, and more. No cloud, no tracking, your data.">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:title" content="Oikos The Self-Hosted Family Planner">
<meta property="og:description" content="A privacy-first, self-hosted family planner. Tasks, shopping, meals, calendar sync, budget all self-hosted, no cloud dependency.">
<meta property="og:title" content="Oikos - The Self-Hosted Family Planner">
<meta property="og:description" content="A privacy-first, self-hosted family planner. Tasks, shopping, meals, calendar sync, budget - all self-hosted, no cloud dependency.">
<meta property="og:image" content="https://ulsklyc.github.io/oikos/og-image.png">
<meta property="og:url" content="https://ulsklyc.github.io/oikos/">
<meta property="og:site_name" content="Oikos">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Oikos The Self-Hosted Family Planner">
<meta name="twitter:description" content="A privacy-first, self-hosted family planner. Tasks, shopping, meals, calendar sync, budget all self-hosted.">
<meta name="twitter:title" content="Oikos - The Self-Hosted Family Planner">
<meta name="twitter:description" content="A privacy-first, self-hosted family planner. Tasks, shopping, meals, calendar sync, budget - all self-hosted.">
<meta name="twitter:image" content="https://ulsklyc.github.io/oikos/twitter-image.png">
<link rel="canonical" href="https://ulsklyc.github.io/oikos/">
@@ -568,7 +568,7 @@
<img src="logo.svg" alt="Oikos Logo" class="hero-logo" width="80" height="80">
<h1 data-i18n="hero_title">Oikos</h1>
<p class="hero-tagline" data-i18n="hero_tagline">The self-hosted family planner</p>
<p class="hero-desc" data-i18n="hero_desc">Manage your household together. Tasks, shopping, meals, calendar, budget all in one place. Self-hosted, private, yours.</p>
<p class="hero-desc" data-i18n="hero_desc">Manage your household together. Tasks, shopping, meals, calendar, budget - all in one place. Self-hosted, private, yours.</p>
<a href="https://github.com/ulsklyc/oikos" class="hero-cta" target="_blank" rel="noopener">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
<span data-i18n="hero_cta">View on GitHub</span>
+16 -16
View File
@@ -1,4 +1,4 @@
# Repository Hygiene Audit Oikos
# Repository Hygiene Audit - Oikos
**Datum:** 2026-04-02
**Version:** 0.5.2 (Tag `v0.5.2`)
@@ -12,7 +12,7 @@
| # | Datei | Status | Begründung | Empfehlung |
|---|-------|--------|------------|------------|
| 1 | `.worktrees/feature/` | Verwaist | Leeres Verzeichnis Überrest eines abgeschlossenen Git-Worktree. Kein Inhalt. | **Löschen** (`rm -rf .worktrees/feature/`) |
| 1 | `.worktrees/feature/` | Verwaist | Leeres Verzeichnis - Überrest eines abgeschlossenen Git-Worktree. Kein Inhalt. | **Löschen** (`rm -rf .worktrees/feature/`) |
**Keine verwaisten JS/CSS/HTML-Dateien gefunden.** Alle Module in `public/pages/`, `public/components/`, `public/styles/` und `server/routes/` sind korrekt referenziert:
@@ -29,7 +29,7 @@
| # | Datei | Status | Begründung | Empfehlung |
|---|-------|--------|------------|------------|
| | | | Keine gefunden. | |
| - | - | - | Keine gefunden. | - |
Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
@@ -40,7 +40,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| 1 | `.env` | OK | Existiert lokal, **nicht** von Git getrackt, in `.gitignore` gelistet. | Kein Handlungsbedarf |
| 2 | `.claude/` | OK | In `.gitignore`, nicht getrackt. | Kein Handlungsbedarf |
| 3 | `.worktrees/` | OK | In `.gitignore`, nicht getrackt. Leeres `feature/`-Verzeichnis (s. 1.1). | Leeres Subdir löschen |
| 4 | `docs/superpowers/` | OK | In `.gitignore`, nicht getrackt. Enthält 7 Plandokumente (3076 Zeilen) lokal. | Kein Handlungsbedarf `.gitignore` greift |
| 4 | `docs/superpowers/` | OK | In `.gitignore`, nicht getrackt. Enthält 7 Plandokumente (3076 Zeilen) lokal. | Kein Handlungsbedarf - `.gitignore` greift |
### 1.4 Prompt-Dateien
@@ -50,15 +50,15 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| # | Datei | Status | Begründung | Empfehlung |
|---|-------|--------|------------|------------|
| | | | Keine leeren oder Stub-Dateien gefunden. | |
| - | - | - | Keine leeren oder Stub-Dateien gefunden. | - |
### 1.6 Sonderfall: Hilfs-/Script-Dateien
| # | Datei | Zeilen | Genutzt von | Empfehlung |
|---|-------|--------|-------------|------------|
| 1 | `server/db-schema-test.js` | 185 | Allen 7 Test-Dateien (`test-*.js`) | **Behalten** aktiv genutzte Test-Infrastruktur |
| 2 | `scripts/seed-demo.js` | 343 | Manuell (CLI-Script für Screenshots) | **Behalten** nützliches Dev-Tool |
| 3 | `test-browser-loader.mjs` | | `package.json` test:modal-utils | **Behalten** aktiv genutzt für Browser-API-Mocks |
| 1 | `server/db-schema-test.js` | 185 | Allen 7 Test-Dateien (`test-*.js`) | **Behalten** - aktiv genutzte Test-Infrastruktur |
| 2 | `scripts/seed-demo.js` | 343 | Manuell (CLI-Script für Screenshots) | **Behalten** - nützliches Dev-Tool |
| 3 | `test-browser-loader.mjs` | - | `package.json` test:modal-utils | **Behalten** - aktiv genutzt für Browser-API-Mocks |
---
@@ -75,9 +75,9 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| `SECURITY.md` | ✅ Vorhanden & vollständig | Vulnerability Reporting via GitHub Private Advisories, Scope-Definition, Security-Features-Übersicht, Supported-Versions-Policy. |
| `CHANGELOG.md` | ⚠️ Vorhanden, kleiner Fehler | Keep a Changelog Format, retroaktive Versionierung ab 0.1.0 ✅. **Problem:** Compare-Links am Dateiende: `[Unreleased]` verweist auf `v0.5.1...HEAD` statt `v0.5.2...HEAD`. Außerdem fehlt der `[0.5.2]`-Compare-Link. |
| `CLAUDE.md` | ✅ Vorhanden & aktuell | Behavioral guide (109 Zeilen), nicht von Git getrackt (in .gitignore). Beschreibt Architektur, Konventionen, Security, DB, Deployment, Implementation Status. Keine Duplikation von SPEC.md. |
| `BACKLOG.md` | ✅ Vorhanden & aktuell | Enthält erledigte Features als Referenztabelle (BL-01 bis BL-10 mit Versionszuordnung). Aktiv keine offenen Einträge korrekt für aktuellen Projektstand. |
| `BACKLOG.md` | ✅ Vorhanden & aktuell | Enthält erledigte Features als Referenztabelle (BL-01 bis BL-10 mit Versionszuordnung). Aktiv keine offenen Einträge - korrekt für aktuellen Projektstand. |
| `docs/SPEC.md` | ✅ Vorhanden | Nicht im Detail geprüft (Umfang), aber von CLAUDE.md und README.md referenziert und zentral für alle Module. |
| `.dockerignore` | ⚠️ Vorhanden, kleiner Fehler | Sinnvolle Ausschlüsse. **Problem:** Referenziert `docs/social-preview.html` diese Datei existiert nicht (nur `docs/social-preview.png` existiert). Harmlos (Ausschluss einer nicht-existenten Datei), aber irreführend. |
| `.dockerignore` | ⚠️ Vorhanden, kleiner Fehler | Sinnvolle Ausschlüsse. **Problem:** Referenziert `docs/social-preview.html` - diese Datei existiert nicht (nur `docs/social-preview.png` existiert). Harmlos (Ausschluss einer nicht-existenten Datei), aber irreführend. |
| `docker-compose.yml` | ✅ Vorhanden | Nicht im Detail geprüft, aber vorhanden und funktional laut README/CHANGELOG. |
| `Dockerfile` | ✅ Vorhanden | Nicht im Detail geprüft, vorhanden. |
| `.github/ISSUE_TEMPLATE/bug_report.md` | ✅ Vorhanden & vollständig | Gutes Template mit Description, Steps to Reproduce, Expected/Actual Behavior, Environment, Logs (collapsible), Additional Context. |
@@ -89,7 +89,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| Datei | Status | Bewertung |
|-------|--------|-----------|
| `docs/` Verzeichnis | ✅ Vorhanden | Enthält SPEC.md, logo.svg, social-preview.png, Screenshots (4 Varianten × 9 Module = 36 Screenshots). |
| `manifest.json` | ✅ Vorhanden | `public/manifest.json` PWA-Manifest. |
| `manifest.json` | ✅ Vorhanden | `public/manifest.json` - PWA-Manifest. |
| Service Worker | ✅ Vorhanden | `public/sw.js` + `public/sw-register.js`. |
| `.nvmrc` | ✅ Vorhanden | Inhalt: `22`. Konsistent mit `engines.node: ">=22.0.0"` in package.json. |
| `.env.example` | ✅ Vorhanden & vollständig | 39 Zeilen. Alle dokumentierten Env-Vars abgedeckt: PORT, NODE_ENV, SESSION_SECRET, SESSION_SECURE, DB_PATH, DB_ENCRYPTION_KEY, OpenWeather, Google Calendar, Apple CalDAV, Sync-Intervall, Rate-Limiting. |
@@ -100,7 +100,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| Element | Status | Bewertung |
|---------|--------|-----------|
| Git Tags | ✅ Konsistent | v0.1.0 bis v0.5.2 alle CHANGELOG-Versionen haben entsprechende Tags. |
| Git Tags | ✅ Konsistent | v0.1.0 bis v0.5.2 - alle CHANGELOG-Versionen haben entsprechende Tags. |
| `scripts/` | ✅ Sinnvoll | `generate-icons.js` (Dev-Tool) und `seed-demo.js` (Screenshot-Generierung). Beide in `.dockerignore` exkludiert. |
| `entrypoint.sh` | ✅ Vorhanden | Docker-Entrypoint. |
| `setup.js` | ✅ Vorhanden | Admin-Setup-Wizard, in README dokumentiert. |
@@ -111,7 +111,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| Kriterium | Status | Bewertung |
|-----------|--------|-----------|
| Projektname und Kurzbeschreibung | ✅ Vorhanden | Logo + "Oikos" + "The self-hosted family planner that respects your privacy." klar und prägnant. |
| Projektname und Kurzbeschreibung | ✅ Vorhanden | Logo + "Oikos" + "The self-hosted family planner that respects your privacy." - klar und prägnant. |
| Badges | ✅ Vorhanden | 7 Badges: Release, License, Node.js, Docker, SQLCipher, PWA, i18n. flat-square Style. |
| Screenshots/Demo | ✅ Vorhanden & hervorragend | 9 Mobile-Screens (dark/light auto-switch via `<picture>`), 8 Tablet-Screens in collapsible Section. Alle 4 Varianten (mobile-dark, mobile-light, tablet-dark, tablet-light). |
| Features-Übersicht | ✅ Vorhanden | 8 Module in 2-Spalten-Tabelle + "And also"-Absatz mit Querschnittsfunktionen. |
@@ -145,7 +145,7 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
- **Aufwand**: 5 Minuten
- **Dateien**: `CHANGELOG.md` (Zeilen 139147)
### [P2] .dockerignore Phantomreferenz entfernen
### [P2] .dockerignore - Phantomreferenz entfernen
- **Was**: `.dockerignore` exkludiert `docs/social-preview.html`, aber diese Datei existiert nicht (nur `docs/social-preview.png` existiert).
- **Warum**: Irreführend bei Code-Review oder Wartung. Kein funktionaler Impact.
@@ -165,12 +165,12 @@ Keine `.bak`, `.old`, `.tmp`-Dateien vorhanden. Sauber.
| Kategorie | Ergebnis |
|-----------|----------|
| **Verwaiste Dateien** | 1 Fund (leeres Worktree-Dir) P3 |
| **Verwaiste Dateien** | 1 Fund (leeres Worktree-Dir) - P3 |
| **Superseded Files** | 0 Funde |
| **Dev Artifacts** | Korrekt durch .gitignore abgedeckt |
| **Prompt-Dateien** | Keine im Repo |
| **Leere Dateien** | 0 Funde |
| **Projektdateien** | 2 Minor-Issues (CHANGELOG-Links, .dockerignore Phantom) P2 |
| **Projektdateien** | 2 Minor-Issues (CHANGELOG-Links, .dockerignore Phantom) - P2 |
| **README** | Vollständig, keine Lücken |
| **P0-Findings** | 0 |
| **P1-Findings** | 0 |