Erste Vereins-App, die fremde Drittseiten crawlt und aggregiert (Event-Übersicht Konstanz/Kreuzlingen, DE+CH zusammen). Phase-0- Build dependency-arm (manaspur-Pattern): keine @mana/* via Verdaccio, Föderations-Boilerplate inline. - Hono+Bun-API mit health/manifest/search/takedown/dsgvo - Drizzle-Schema (8 Tabellen) gemäß AGGREGATOR_POLICY §6: countries, regions, venues, event_sources, events, crawl_jobs (mit robots_check_passed-Compliance-Beweis), takedown_requests, blocked_domains - Crawl-Policy-Skelett (assertCrawlAllowed) mit Block-List-Check + Pro-Host-Rate-Limit; robots.txt-Lookup pending α-1 - mana-research- und mana-geocoding-Client-Stubs - Search-Endpoint public (kein Auth — Browse-only MVP) - Postgres lokal :5441, db:push grün, /healthz + /readyz + /.well-known/mana-app.json smoke-getestet Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Seepuls
Veranstaltungen am Bodensee, beidseits der Grenze. Konstanz, Kreuzlingen und Umgebung — Deutschland und Schweiz auf einer Plattform.
Föderierte mana-Vereins-App. Aggregiert Event-Daten von Drittseiten (Kulturhäuser, Clubs, Bars, Vereine) und stellt sie länder- übergreifend dar. Spricht das mana-Föderations-Protokoll, gilt
AGGREGATOR_POLICY.mdals nicht-verhandelbares Regelwerk für das Crawlen fremder Inhalte.
Quick Start
# Verdaccio-Token holen (einmalig pro Maschine)
ssh mana-server "cat ~/.npm_token" > /tmp/t
echo "//pkg.mana.how/:_authToken=$(cat /tmp/t)" >> ~/.npmrc
chmod 600 ~/.npmrc && rm /tmp/t
# Datenbank starten (Postgres auf :5441)
docker compose up -d
# Dependencies + Boot
NPM_AUTH_TOKEN=$(awk -F= '/_authToken=/{print $2}' ~/.npmrc) pnpm install
pnpm --filter ./apps/api dev
API läuft auf http://localhost:3095. Web (Astro) folgt in Phase α-4.
Architektur (kurz)
| Komponente | Stack | Port |
|---|---|---|
| API | Hono + Bun + Drizzle | 3095 |
| Web | Astro (Node-Adapter, SSR + Islands) — folgt α-4 | 3096 |
| Postgres | docker-compose, lokal | 5441 |
| Crawler | konsumiert mana-research :3068 (Firecrawl/Jina) |
|
| Geo | konsumiert mana-geocoding :3075 (Photon Europe) |
|
| Bilder | konsumiert mana-media :3065 (nur App-eigene, gecrawlte → Hot-Link) |
Phasen (Plan)
- α-0 (jetzt): Repo-Skelett ✅
- α-1: Venue-Add-Flow (URL → mana-research → mana-llm → Reviewer-Stop)
- α-2: Event-Source-Add + Probe-Crawl
- α-3: node-cron Re-Crawl mit Diff/Dedupe/Politeness
- α-4: Astro-Web Listenansicht + Filter
- α-5: Karten-Ansicht (Leaflet + mana-geocoding)
- β-1: AGGREGATOR_POLICY anwaltliche Review (Pre-Live-Gate)
- β-2: Claim + Take-Down-Endpoints (Pre-Live-Gate)
- β-3: Notifications via mana-notify (Lieblings-Venue-Abo)
- β-4: Deploy auf mana-server + Live-Smokes
Endpoints (im MVP, public)
| Method | Path | Beschreibung |
|---|---|---|
GET |
/healthz |
Liveness |
GET |
/.well-known/mana-app.json |
Manifest |
GET |
/api/v1/search?q= |
Event/Venue-Suche, public |
GET |
/api/v1/dsgvo/export?user_id= |
DSGVO-Auskunft auf takedown_requests (Service-Key) |
Crawler-Disziplin
robots.txt + ≥1s Crawl-Delay + User-Agent mit Kontakt-Mail. Volle
Pflichten in AGGREGATOR_POLICY.md.
Verstöße gegen die Policy sind kein akzeptabler Speed-Trade-off.
Pre-Live-Veto durch mana-compliance-Subagent.
Validierung
pnpm validate-manifest
pnpm type-check
pnpm test
CI führt alle drei in .github/workflows/ci.yml aus.