Citizen-Science-App für botanische Beobachtungen — Foto, GPS, KI-Klassifikation, kollaborative Specimen-Historie. Föderierte App von mana e.V.
Find a file
Till JS 3dfdbd122d
Some checks are pending
CI / validate (push) Waiting to run
herbatrium: identifyPlantByok auf describeImageStructured
EXIF-Strip + JSON-Extraktion in llm-client@1.1.0 gekapselt; hier bleibt
Schema-Validierung + Mapping aufs IdentifyResult. Verhalten identisch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 15:36:03 +02:00
.github/workflows η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
apps herbatrium: identifyPlantByok auf describeImageStructured 2026-06-05 15:36:03 +02:00
infrastructure chore(deploy): herbatrium-web OIDC-Runtime-Env + app.herbatrium.com CORS 2026-05-28 00:39:19 +02:00
.dockerignore fix(docker): .dockerignore (node_modules) — verhindert stale-symlink Build-Bruch 2026-06-03 19:35:20 +02:00
.env.example η-2: Klassifikation (mana-llm primär, Pl@ntNet sekundär) + Sensitivity-Worker 2026-05-17 19:41:27 +02:00
.fallowrc.json chore: tote Dep @mana/event-kit entfernen + .fallowrc 2026-06-04 20:04:09 +02:00
.gitignore feat(landing): Marketing-Astro auf herbatrium.com LIVE 2026-05-20 21:39:38 +02:00
.npmrc chore(deps): bump @mana/shared-schemas to 0.1.11 2026-05-22 14:19:19 +02:00
.prettierrc.json η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
app-manifest.json feat: Primary-Switch auf herbatrium.com 2026-05-20 16:30:42 +02:00
CLAUDE.md η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
docker-compose.yml η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
package.json η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
pnpm-lock.yaml herbatrium: identifyPlantByok auf describeImageStructured 2026-06-05 15:36:03 +02:00
pnpm-workspace.yaml η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
README.md η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
STATUS.md docs(status): Rechtsklick-Kontextmenü dokumentiert 2026-06-03 14:05:22 +02:00
tsconfig.base.json η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
turbo.json η-0: Repo-Skelett 2026-05-17 18:10:20 +02:00
VISION.md VISION.md: interner Nordstern (Wofür) + Verweis auf öffentliche Landing-Fassung 2026-05-31 20:52:43 +02:00

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.

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, ~3050 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)

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

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 und im Greenfield-Playbook.

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