Some checks are pending
CI / validate (push) Waiting to run
Citizen-Science-App für botanische Beobachtungen — föderierte App des mana e.V.-Ökosystems. Erste Vereins-App mit 3-Schicht-Datenmodell (Species/Specimen/Observation), 3-Stufen-GPS (exact/rounded_100m/ region_only) und fail-closed Sensitivity-Schutz für FFH-Anhang-IV- Arten. Stand η-0 (Plan v0.2 + Detail-Pass, Architect+Compliance-Audit 2026-05-17): - Workspace: pnpm/turbo/tsconfig/prettier - apps/api: Hono+Bun mit /healthz, /readyz, /healthz/details, /.well-known/mana-app.json. Smoke alle vier Endpoints grün. - apps/web: SvelteKit 2 + Svelte 5 + Tailwind v4, Herbarium-Theme, Landing-Page mit Phasen-Plan. svelte-check 0 errors / 0 warnings. - docker-compose: postgis/postgis:16-3.4 auf 5449, init-postgis.sql - app-manifest.json: validiert gegen @mana/shared-share-protocol@0.4.0 (2 shares, 2 accepts, 3 tools) - Doku: CLAUDE.md, README.md, STATUS.md Cross-Repo: @mana/shared-share-protocol@0.4.0 published mit 4 neuen Share-Types (mana/photo, mana/geo-point, mana/plant-observation, mana/plant-specimen). Plan: mana/docs/playbooks/HERBATRIUM_GREENFIELD.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
108 lines
4.1 KiB
Markdown
108 lines
4.1 KiB
Markdown
# Herbatrium
|
||
|
||
Citizen-Science-App für **botanische Beobachtungen in freier Natur**.
|
||
Foto, GPS, KI-Klassifikation, kollaborative Specimen-Historie.
|
||
Datensouverän und Open-Source.
|
||
|
||
Föderierte App des Vereins **mana e.V.** — neben Cardecky, Memoro,
|
||
Werdrobe, Seepuls und weiteren Peer-Apps im selben Ökosystem.
|
||
|
||
- **Web:** [herbatrium.mana.how](https://herbatrium.mana.how) *(noch nicht deployed)*
|
||
- **API:** [herbatrium-api.mana.how](https://herbatrium-api.mana.how) *(noch nicht deployed)*
|
||
- **Plan:** [`mana/docs/playbooks/HERBATRIUM_GREENFIELD.md`](../mana/docs/playbooks/HERBATRIUM_GREENFIELD.md)
|
||
- **Status:** [`STATUS.md`](STATUS.md) — aktueller Phasen-Stand
|
||
|
||
## Was es macht
|
||
|
||
User:innen laden Pflanzen-Fotos hoch. Das System klassifiziert die Art
|
||
(mana-llm + Pl@ntNet als Verifier), legt einen GPS-verankerten
|
||
**Specimen**-Datensatz an, und ermöglicht es mehreren Beobachter:innen,
|
||
denselben physischen Pflanzen-Standort über Zeit zu dokumentieren —
|
||
Wachstum, Blüte, Schädigung, Verschwinden.
|
||
|
||
Spätere Ausbaustufe: 3D-Rekonstruktion aus Mehr-Foto-Beobachtungen.
|
||
|
||
## Eigenschaften
|
||
|
||
- **3-Schicht-Datenmodell:** Species → Specimen → Observation
|
||
- **Public-First** mit explizitem Lizenz-Picker (CC-BY-SA-4.0 / CC-BY-NC / ARR)
|
||
- **3-Stufen-GPS-Sichtbarkeit:** `exact` (Owner), `rounded_100m` (Public-Feed),
|
||
`region_only` (geschützte Arten, ~30–50 km Region)
|
||
- **Fail-closed Sensitivity:** automatische Schutzart-Liste (GBIF-IUCN +
|
||
FFH-Anhang-IV), Default `is_sensitive=true` bis Lookup das Gegenteil belegt
|
||
- **PostGIS-basiertes Specimen-Matching** binnen species-spezifischem
|
||
Radius (Bäume 5 m / Stauden 30 m / Default 20 m)
|
||
- **3-Layer-Foto-Storage:** original verlustfrei (Owner-only, signed
|
||
URL, Access-Log), display 2048px WebP EXIF-stripped, thumb 512px
|
||
|
||
## Quick-Start (Entwicklung)
|
||
|
||
```bash
|
||
# Voraussetzung: Verdaccio-Token in ~/.npmrc (siehe unten),
|
||
# Docker laufend, pnpm 9.15.x
|
||
|
||
pnpm install # gegen pkg.mana.how
|
||
docker compose up -d # PostGIS :5449
|
||
pnpm --filter ./apps/api dev # Hono+Bun :3101
|
||
pnpm --filter ./apps/web dev # SvelteKit :3102
|
||
|
||
# Smoke-Test:
|
||
curl http://localhost:3101/healthz
|
||
curl http://localhost:3101/.well-known/mana-app.json
|
||
open http://localhost:3102
|
||
```
|
||
|
||
## Verdaccio-Token
|
||
|
||
Das Repo zieht `@mana/*`-Pakete aus dem privaten Vereins-Verdaccio
|
||
(`pkg.mana.how`). Token einmalig holen:
|
||
|
||
```bash
|
||
npm login --registry=https://pkg.mana.how --scope=@mana
|
||
# oder: existierenden Token aus ~/.npmrc kopieren
|
||
```
|
||
|
||
In CI: `MANA_NPM_TOKEN` als GitHub-Secret hinterlegen.
|
||
|
||
## Stack
|
||
|
||
- **Web:** SvelteKit 2 + Svelte 5 (runes only) + Tailwind v4
|
||
- **API:** Hono + Bun + Drizzle ORM
|
||
- **DB:** PostgreSQL 16 + PostGIS 3.4
|
||
- **Klassifikation:** mana-llm (Gemini Pro Vision, primär) +
|
||
Pl@ntNet (AGPV, sekundär als Verifier)
|
||
- **Auth:** mana-auth (Better-Auth + EdDSA-JWT via JWKS-Cache)
|
||
- **Storage:** mana-media (MinIO/S3)
|
||
- **Geo:** PostGIS + mana-geocoding
|
||
- **Map:** MapLibre + Cloudflare-Pull-through-Cache (OSM)
|
||
|
||
Ports: API `3101`, Web `3102`, Postgres `5449`.
|
||
|
||
## Phasen-Roadmap
|
||
|
||
| Phase | Inhalt |
|
||
|---|---|
|
||
| **η-0** | Repo-Skelett — **aktuell** (2026-05-17) |
|
||
| η-1 | Solo-Upload + 3-Layer-Photo-Pipeline + Drizzle-Schema |
|
||
| η-2 | Klassifikation (mana-llm primär, Pl@ntNet Verifier) + GBIF/FFH-Sensitivity |
|
||
| η-3 | Specimen-Matching mit PostGIS + Capture-Map |
|
||
| η-4 | Public-Feed + Lizenz-Picker + 3-Stufen-GPS (**Hard-Gate**) |
|
||
| η-5 | Föderations-Endpoints (Share/Tools/DSGVO) |
|
||
| η-6 | 3D-Pipeline-Vorbereitung auf mana-gpu |
|
||
| η-7 | Polish + Take-Down-UI + AGB-Seite + Live (**Hard-Gate**) |
|
||
| η-8+ | Native iOS, Local-First, 3D-Viewer (opportunistisch) |
|
||
|
||
Details in [`STATUS.md`](STATUS.md) und im
|
||
[Greenfield-Playbook](../mana/docs/playbooks/HERBATRIUM_GREENFIELD.md).
|
||
|
||
## Lizenz
|
||
|
||
Code: zur Klärung beim Live-Gang.
|
||
Inhalte (Public-Observations): expliziter Lizenz-Picker, CC-BY-SA-4.0
|
||
empfohlen für GBIF-Re-Sync-Kompatibilität.
|
||
|
||
## Kontakt
|
||
|
||
- **Verein:** [verein.mana.how](https://verein.mana.how)
|
||
- **E-Mail:** kontakt@mana.how
|
||
- **Issue-Tracker:** [git.mana.how/till/herbatrium](https://git.mana.how/till/herbatrium) *(folgt)*
|