seepuls/README.md
Till JS 32f0295a8b seepuls α-0: Repo-Skelett + Aggregator-Schema
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>
2026-05-15 14:14:15 +02:00

2.6 KiB
Raw Permalink Blame History

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.md als 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.