{"id":51091910,"url":"https://github.com/phash/lumen-light","last_synced_at":"2026-06-24T03:03:25.221Z","repository":{"id":361259297,"uuid":"1223669573","full_name":"phash/lumen-light","owner":"phash","description":"Browser-basierter, selbst-gehosteter RAW-Foto-Editor (Lightroom-Light) — FastAPI + React 19 + WebGL2 + Postgres + Garage S3 + Keycloak","archived":false,"fork":false,"pushed_at":"2026-06-06T20:52:14.000Z","size":1934,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T22:17:56.242Z","etag":null,"topics":["fastapi","lightroom-alternative","photo-editor","raw-editor","raw-photography","react","self-hosted","webgl"],"latest_commit_sha":null,"homepage":"https://lumen.mr-development.de","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phash.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-28T14:40:48.000Z","updated_at":"2026-06-06T20:52:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/phash/lumen-light","commit_stats":null,"previous_names":["phash/lumen-light"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/phash/lumen-light","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Flumen-light","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Flumen-light/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Flumen-light/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Flumen-light/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phash","download_url":"https://codeload.github.com/phash/lumen-light/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Flumen-light/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34715018,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastapi","lightroom-alternative","photo-editor","raw-editor","raw-photography","react","self-hosted","webgl"],"created_at":"2026-06-24T03:03:24.302Z","updated_at":"2026-06-24T03:03:25.199Z","avatar_url":"https://github.com/phash.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lumen · light\n\n\u003e Browser-basierter, selbst-gehosteter RAW-Foto-Editor — eine schlanke, abofreie **Lightroom-Alternative** für Hobby-Fotografen. Ohne Software-Installation, ohne Cloud-Pflicht.\n\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)\n[![CI](https://github.com/phash/lumen-light/actions/workflows/ci.yml/badge.svg)](https://github.com/phash/lumen-light/actions/workflows/ci.yml)\n![React 19](https://img.shields.io/badge/React-19-149ECA?logo=react\u0026logoColor=white)\n![FastAPI](https://img.shields.io/badge/FastAPI-async-009688?logo=fastapi\u0026logoColor=white)\n![WebGL2](https://img.shields.io/badge/WebGL2-shader_pipeline-990000)\n![Self-hosted](https://img.shields.io/badge/self--hosted-Docker_Compose-2496ED?logo=docker\u0026logoColor=white)\n\n**[🔗 Live-Demo](https://lumen.mr-development.de)** · [Features](#was-lumen-kann) · [Schnellstart](#schnellstart-lokale-entwicklung) · [Selfhost](#production)\n\n![Lumen · light — RAW-Editor im Browser](docs/screenshots/phase5/01-editor-default.png)\n\n**Selfhost auf einem 4-GB-VPS · Open-Source-Stack · DSGVO-konform out-of-the-box.**\n\n## Was Lumen kann\n\n- **RAW direkt im Browser oeffnen**: CR2, CR3, NEF, ARW, DNG, RAF, RW2, ORF — via libraw-wasm in einem Web-Worker.\n- **12 globale Slider** (Belichtung, Kontrast, Lichter, Tiefen, Weiss, Schwarz, Temperatur, Toenung, Dynamik, Saettigung, Schaerfen, Rauschen) plus **HSL-Mischer** (8 Farbkanaele × 3 Achsen) und **Spline-Tonkurve** (2-8 Stuetzpunkte mit Monotone-Hermite).\n- **Bis zu 8 lokale Anpassungen pro Bild**: 4 lineare Verlaufsfilter + 4 elliptische Radialmasken, jede mit Belichtung/Kontrast/Saettigung/Temperatur.\n- **Auto-Funktionen**: Auto-Tone (Histogramm-Analyse), Auto-WB (Gray-World), Auto-Begradigen (Sobel + Hough), Smart-Preset-Vorschlag (EXIF-Brennweite + optionale Face-Detection ueber TensorFlow.js).\n- **Lens-Profile** fuer 18 verbreitete Kamera+Objektiv-Kombinationen (Verzeichnung + Vignette automatisch).\n- **Vorher/Nachher-Vergleich**: Bypass-halten oder Compare-Split.\n- **Export** als JPEG oder PNG, Quality- und Width-Slider.\n- **Preset-Marketplace**: User koennen Presets oeffentlich teilen, andere wenden sie auf eigene Bilder an oder forken in die eigene Bibliothek. Reporting + Auto-Hide bei Missbrauch.\n\n## Lumen vs. Lightroom\n\nLumen ersetzt nicht jeden Profi-Workflow — aber für RAW-Entwicklung ohne Abo und ohne Cloud-Zwang deckt es die wichtigsten Schritte ab.\n\n|                      | Lumen · light            | Adobe Lightroom        |\n| -------------------- | ------------------------ | ---------------------- |\n| Preis                | Kostenlos, selbst-hostbar | Abo ab ~12 €/Monat     |\n| Plattform            | Browser (WebGL2)         | Desktop + Cloud-App    |\n| Deine Daten          | Bleiben bei dir          | Adobe Creative Cloud   |\n| RAW im Browser       | Ja                       | Nein (Desktop)         |\n| Lokale Masken        | Linear + Radial          | Umfangreich (inkl. KI) |\n| Ohne Abo / offline   | Ja                       | Nein                   |\n\n## Stack\n\n- **Backend**: FastAPI · async SQLAlchemy 2 + asyncpg · Alembic · Pydantic 2 · slowapi (Redis-Backend in Production) · boto3\n- **Frontend**: React 19 · Vite 8 · TypeScript strict · Tailwind 4 · Zustand 5 · WebGL2 (Single-Pass-Fragment-Shader mit Uniform-Arrays fuer Multi-Mask)\n- **Auth**: Keycloak (OIDC, Realm `lumen`, JWT RS256-Whitelist)\n- **Storage**: Postgres 16 · Garage S3 (Pre-Signed-URLs, Pixel laufen NICHT durch FastAPI)\n- **Deployment**: Docker Compose · Caddy als Reverse-Proxy (CSP + HSTS + Permissions-Policy)\n- **ML (optional)**: TensorFlow.js Mediapipe-Face-Detection — Lazy-Load, Default-aus, ausdrueckliche User-Einwilligung\n\n## Schnellstart (lokale Entwicklung)\n\n```bash\n# 1. Postgres + Keycloak + MinIO (Garage-Ersatz in dev) hochfahren\ndocker compose -f deployment/docker-compose.dev.yml up -d\nuntil curl -fs http://localhost:19000/health/ready \u003e/dev/null; do sleep 2; done\n\n# 2. Backend-Migration + Server\ncd backend\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt -r requirements-dev.txt\nDATABASE_URL=\"postgresql+asyncpg://lumen:lumen@localhost:5433/lumen\" \\\n  .venv/bin/alembic upgrade head\n\nDATABASE_URL=\"postgresql+asyncpg://lumen:lumen@localhost:5433/lumen\" \\\nKEYCLOAK_ISSUER=\"http://localhost:18080/realms/lumen\" \\\nKEYCLOAK_AUDIENCE=\"lumen-api\" \\\nGARAGE_S3_ENDPOINT=\"http://localhost:9000\" GARAGE_S3_REGION=\"us-east-1\" \\\nGARAGE_S3_BUCKET=\"lumen-images\" \\\nGARAGE_S3_ACCESS_KEY_ID=\"minioadmin\" GARAGE_S3_SECRET_ACCESS_KEY=\"minioadmin\" \\\nCORS_ORIGIN=\"http://localhost:5173\" \\\n.venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000\n\n# 3. Frontend (anderes Terminal)\ncd frontend\ncp .env.example .env.local   # ggf. anpassen\npnpm install\npnpm dev                     # http://localhost:5173\n```\n\nTest-User in Keycloak via Admin-API anlegen — siehe `CLAUDE.md` Abschnitt „Test-User in Keycloak\".\n\n## Tests\n\n```bash\n# Backend (testcontainers fuer PG + MinIO + Keycloak — Docker muss laufen)\ncd backend \u0026\u0026 .venv/bin/pytest -q\n# Aktuell: 99 Tests, ~50 s nach Image-Cache.\n\n# Frontend Unit + Component\ncd frontend \u0026\u0026 pnpm test\n# Aktuell: 333 Tests in 40 Files, ~7 s.\n\n# E2E (Stack muss komplett laufen)\ncd frontend \u0026\u0026 pnpm exec playwright test\n\n# Statisch\ncd frontend \u0026\u0026 pnpm lint \u0026\u0026 pnpm build \u0026\u0026 pnpm exec tsc -b --noEmit\n```\n\n## Architektur (Kurzfassung)\n\n```\n                        ┌─────────────┐\n                        │   Browser   │\n                        │  React + WebGL2 │\n                        └──────┬──────┘\n            JWT (Bearer)       │     Pre-Signed PUT/GET\n        ┌──────────────────────┼──────────────────────┐\n        │                      │                      │\n        ▼                      ▼                      ▼\n┌──────────────┐      ┌──────────────┐      ┌──────────────┐\n│   Keycloak   │      │   FastAPI    │      │  Garage S3   │\n│  Realm lumen │      │  /api/v1     │      │  lumen-images│\n└──────────────┘      │  Auth/RS256  │      └──────────────┘\n                      │  Marketplace │\n                      │  Presets/CRUD│\n                      └──────┬───────┘\n                             │\n                             ▼\n                      ┌──────────────┐\n                      │ Postgres 16  │\n                      │ + Alembic    │\n                      └──────────────┘\n```\n\nWebGL-Pipeline (Fragment-Shader, Single-Pass): Lens-Distortion → Bilateral-Noise → sRGB→Linear → WB → Belichtung → Linear→sRGB → Highlights/Shadows/Whites/Blacks → Kontrast → Vibrance/Saettigung → HSL-Mischer → Tonkurve (LUT) → Unsharp-Mask → Vignette.\n\n## Datenschutz / DSGVO\n\n- **Privacy by Default**: Presets sind privat, Profilfelder leer, Marketplace-Toggle aus, Face-Detection aus.\n- **DSGVO Art. 15 + 20**: vollstaendiger JSON-Export aller User-Daten (inklusive Marketplace-Felder, eigene Reports, presigned-Download-URLs fuer Bilder) auf der Account-Seite.\n- **DSGVO Art. 17**: User kann seinen Account in der UI loeschen — Cascade auf Presets/Bilder/S3-Objekte. Reports werden anonymisiert (reporter_user_id auf NULL), damit die Moderationsspur erhalten bleibt.\n- **Drittland-Transfer**: Nur, wenn der User explizit „Smart-Preset mit Gesichtserkennung\" aktiviert — dann wird einmalig das TF.js-Modell von `storage.googleapis.com` (Google US) geladen. Die Bilderkennung selbst laeuft lokal im Browser, Bilder verlassen den Client nie. Datenschutz-Erklaerung enthaelt alle Details.\n- **Selfhost-Stack**: Postgres + Garage + Keycloak laufen auf einem deutschen IONOS-VPS, kein anderer Auftragsverarbeiter ausser dem Hoster.\n\n## Production\n\nProduction-Stack ist im `deployment/docker-compose.prod.yml` und benutzt eine separate Realm-Konfiguration (`infra/keycloak/lumen-realm.prod.json`) mit gehaerteten Flags (kein ROPC-Flow, verifyEmail an, nur Production-Origin in den Redirect-URIs). Caddy-Snippet (`infra/caddy/lumen.caddyfile`) setzt Content-Security-Policy, HSTS-preload, Permissions-Policy und blockt `/docs|/redoc|/openapi.json` als Defense-in-Depth.\n\nVolle Anleitung: `infra/deployment-runbook.md`.\n\n## Dokumentation\n\n- `docs/beta-onboarding.md` — Quickstart fuer End-User (Account, erstes Bild, Auto-Funktionen, Presets, Marketplace, Datenschutz)\n- `CHANGELOG.md` — pro Release zusammengefasste Aenderungen\n- `docs/01-konzept.md` … `docs/08-risiken-offene-fragen.md` — Konzept, Architektur, Datenmodell, API, Frontend, Roadmap, ADRs, Risiken\n- `docs/06-roadmap.md` — Iterations-Stand\n- `docs/superpowers/specs/` — Pro Iteration eine Spec (HSL, Tonkurve, Sharpen+Noise, Auto-Straighten, Face-Detection, Marketplace …)\n- `CLAUDE.md` — Hands-on-Anleitung fuer Claude-Code-Sessions in diesem Repo\n\n## Lizenz\n\n[GNU AGPL-3.0](LICENSE). Du darfst Lumen selbst hosten, anpassen und weitergeben — wenn du eine modifizierte Version als Netzwerk-Dienst anbietest, müssen die Änderungen unter derselben Lizenz offengelegt werden.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphash%2Flumen-light","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphash%2Flumen-light","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphash%2Flumen-light/lists"}