Central platform for European atproto.<cc> country community websites atproto.eu
community atproto

refactor(config): centralize per-country settings into scopes.ts control panel master

Make scopes.ts the single documented control panel a local community manager edits, folding in settings that were scattered across data modules. Every new field is optional with a documented default, so a new country only writes what differs. See decisions/2026-09-21-centralized-country-config.md. New per-scope fields (all optional, documented inline): - managers: string[] — manager DIDs; shown as managers AND folded into members. Replaces the single `maintainer` handle (AboutPage's "no maintainer" state now keys on managers.length). - memberSeed: string[] — the manual member seed, moved from members.ts (memberDids/beMemberDids/huMemberDids). - memberListUri — optional public Bluesky list seed (moved from members.ts). - eventDids: {did,handle}[] — EXTRA atmo.rsvp sources; each scope's own social.did is now ALWAYS an event source automatically (previously only the hand-listed EVENTS_ACCOUNTS were fetched, so es/pt/be/etc. never showed their own events). - feed: {rkey} — homepage feed, moved from feed.ts. - nav: per-item header show/hide (members/stats/events/tools/builders), default all shown, via navFor(); Base.astro gates the optional links. - verifierDid — makes Belgium's delegated verifier explicit. Consumers now read from the scope: home.ts builds the member union (managers + seed + signed-in, deduped; .eu aggregates all national scopes), feed.ts turns scope.feed.rkey into the URI, events-account.ts derives EVENTS_ACCOUNTS from the scopes plus orphan accounts (atproto.wien). members.ts keeps only the non-per-country bits. scopes.test.ts asserts the new fields are DIDs and nav resolves against defaults. Manager-facing guide at src/config/README.md. No behaviour change to existing sites beyond the intended one: each country now surfaces atmo.rsvp events posted on its own account, and managers appear in the member list.