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

79 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`](../mana/docs/AGGREGATOR_POLICY.md) als
> nicht-verhandelbares Regelwerk für das Crawlen fremder Inhalte.
## Quick Start
```bash
# 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`](../mana/docs/AGGREGATOR_POLICY.md).
Verstöße gegen die Policy sind **kein** akzeptabler Speed-Trade-off.
Pre-Live-Veto durch `mana-compliance`-Subagent.
## Validierung
```bash
pnpm validate-manifest
pnpm type-check
pnpm test
```
CI führt alle drei in `.github/workflows/ci.yml` aus.