Harbor Commons' public-good case rests on making 990 data legible to anyone -- parents, journalists, funders, researchers. Currently accessible only via direct Supabase queries. Work: (1) Create packages/harbor-commons/src/api/main.py (FastAPI) with endpoints: GET /clubs -- paginated list of sailing orgs (name, ein, state, type, latest_revenue), GET /clubs/{ein} -- full financial profile (3 years of 990 data), GET /clubs/{ein}/quiet-yield -- estimated volunteer labor value, GET /clubs/compare?eins=ein1,ein2 -- side-by-side comparison, (2) All endpoints read from Supabase sailing_filer_core via anon key (public data, RLS already configured), (3) Add OpenAPI docs at /docs, (4) Add rate limiting (slowapi, 60 req/min/IP), (5) Deploy target: Railway or Fly.io (free tier). This is the SEO surface + civic credibility layer for funder conversations.
Harbor Commons' public-good case rests on making 990 data legible to anyone -- parents, journalists, funders, researchers. Currently accessible only via direct Supabase queries. Work: (1) Create packages/harbor-commons/src/api/main.py (FastAPI) with endpoints: GET /clubs -- paginated list of sailing orgs (name, ein, state, type, latest_revenue), GET /clubs/{ein} -- full financial profile (3 years of 990 data), GET /clubs/{ein}/quiet-yield -- estimated volunteer labor value, GET /clubs/compare?eins=ein1,ein2 -- side-by-side comparison, (2) All endpoints read from Supabase sailing_filer_core via anon key (public data, RLS already configured), (3) Add OpenAPI docs at /docs, (4) Add rate limiting (slowapi, 60 req/min/IP), (5) Deploy target: Railway or Fly.io (free tier). This is the SEO surface + civic credibility layer for funder conversations.