From 0bb1f0e5d527deab7326f96b0c976bb7adeeef3c Mon Sep 17 00:00:00 2001 From: Guido Jansen Date: Mon, 14 Sep 2026 09:16:24 +0200 Subject: [PATCH] Tighten estimate copy; correct the .be about page - Drop the 'X, not Y' disclaimer sentences on the estimate/countries pages ('a modelled estimate, not a count', 'a floor, not a census', 'a shape, not a headcount'); the surrounding text already makes the point, and where a real limit remained it's now stated plainly. - about: reword the caretaker line so it no longer implies no locals are involved or that the site is waiting to be handed over; drop 'There is no forum yet' (an internal note that doesn't belong on the site). --- src/components/pages/NationalEstimatePage.astro | 16 ++++++++-------- src/i18n/ui.ts | 16 ++++++++-------- src/pages/[...lang]/countries.astro | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/components/pages/NationalEstimatePage.astro b/src/components/pages/NationalEstimatePage.astro index 03d98f7..7258232 100644 --- a/src/components/pages/NationalEstimatePage.astro +++ b/src/components/pages/NationalEstimatePage.astro @@ -24,43 +24,43 @@ const confirmed = s?.total ?? 0; type Copy = { lead: string; howH: string; how: string; floorH: string; floor: string; limitsH: string; limits: string; all: string }; const COPY: Record Copy> = { en: (c, est, conf) => ({ - lead: `Roughly ${est} people are active on and around AT Protocol in ${c}. It is a modelled estimate, not a count.`, + lead: `Roughly ${est} people are active on and around AT Protocol in ${c}.`, howH: 'How we estimate this', how: `AT Protocol has no country field, so we cannot count directly. We measure posting activity per language across Europe, weight each language to the countries where its speakers live, and calibrate the whole model to the Dutch figure on atproto.nl. Language only feeds the estimate; it never confirms that an account belongs to ${c}.`, floorH: 'What we can stand behind', floor: `${conf} accounts we can place in ${c} for certain, from a deliberate signal: a country domain, a declared location, a community verifier, or a member record. That is the floor; the real number is higher, which is what the estimate models.`, limitsH: 'What it cannot see', - limits: `People who post mainly in English are invisible to a language model, so an English-first account in ${c} is not captured. The estimate is a shape, not a headcount, and it carries a ~ for a reason.`, + limits: `People who post mainly in English are invisible to a language model, so an English-first account in ${c} is not captured, which is part of why the real number sits above the confirmed floor.`, all: 'See all of Europe', }), nl: (c, est, conf) => ({ - lead: `Ongeveer ${est} mensen zijn actief op en rond AT Protocol in ${c}. Het is een gemodelleerde schatting, geen telling.`, + lead: `Ongeveer ${est} mensen zijn actief op en rond AT Protocol in ${c}.`, howH: 'Hoe we dit schatten', how: `AT Protocol heeft geen landveld, dus we kunnen niet direct tellen. We meten postactiviteit per taal in heel Europa, wegen elke taal naar de landen waar de sprekers wonen, en ijken het model op het Nederlandse getal op atproto.nl. Taal voedt alleen de schatting; het bevestigt nooit dat een account bij ${c} hoort.`, floorH: 'Wat we zeker weten', floor: `${conf} accounts kunnen we met zekerheid aan ${c} koppelen, via een bewust signaal: een landdomein, een opgegeven locatie, een community-verifier of een member-record. Dat is de ondergrens; het echte aantal ligt hoger, en dat is wat de schatting modelleert.`, limitsH: 'Wat het niet ziet', - limits: `Wie vooral in het Engels post is onzichtbaar voor een taalmodel, dus een Engelstalig account in ${c} telt niet mee. De schatting is een vorm, geen koppentelling, en draagt niet voor niets een ~.`, + limits: `Wie vooral in het Engels post is onzichtbaar voor een taalmodel, dus een Engelstalig account in ${c} telt niet mee. Mede daardoor ligt het echte aantal boven de bevestigde ondergrens.`, all: 'Bekijk heel Europa', }), fr: (c, est, conf) => ({ - lead: `Environ ${est} personnes sont actives sur et autour d'AT Protocol en ${c}. C'est une estimation modélisée, pas un décompte.`, + lead: `Environ ${est} personnes sont actives sur et autour d'AT Protocol en ${c}.`, howH: 'Comment nous estimons', how: `AT Protocol n'a pas de champ pays, donc nous ne pouvons pas compter directement. Nous mesurons l'activité par langue à travers l'Europe, pondérons chaque langue selon les pays où vivent ses locuteurs, et calibrons le modèle sur le chiffre néerlandais d'atproto.nl. La langue ne nourrit que l'estimation ; elle ne confirme jamais qu'un compte appartient à la ${c}.`, floorH: 'Ce que nous pouvons affirmer', floor: `${conf} comptes que nous pouvons rattacher à la ${c} avec certitude, via un signal délibéré : un domaine national, une localisation déclarée, un vérificateur communautaire ou un enregistrement de membre. C'est le plancher ; le chiffre réel est plus élevé, et c'est ce que l'estimation modélise.`, limitsH: `Ce qu'elle ne voit pas`, - limits: `Les personnes qui publient surtout en anglais sont invisibles pour un modèle linguistique, donc un compte anglophone en ${c} n'est pas capté. L'estimation est une forme, pas un décompte, et porte un ~ pour une bonne raison.`, + limits: `Les personnes qui publient surtout en anglais sont invisibles pour un modèle linguistique, donc un compte anglophone en ${c} n'est pas capté. C'est en partie pourquoi le chiffre réel dépasse le plancher confirmé.`, all: `Voir toute l'Europe`, }), nb: (c, est, conf) => ({ - lead: `Omtrent ${est} mennesker er aktive på og rundt AT Protocol i ${c}. Det er et modellert anslag, ikke en telling.`, + lead: `Omtrent ${est} mennesker er aktive på og rundt AT Protocol i ${c}.`, howH: 'Hvordan vi anslår dette', how: `AT Protocol har ikke et landfelt, så vi kan ikke telle direkte. Vi måler aktivitet per språk i hele Europa, vekter hvert språk mot landene der talerne bor, og kalibrerer modellen mot det nederlandske tallet på atproto.nl. Språk mater bare anslaget; det bekrefter aldri at en konto hører til ${c}.`, floorH: 'Hva vi kan stå for', floor: `${conf} kontoer kan vi plassere i ${c} med sikkerhet, fra et bevisst signal: et landdomene, en oppgitt plassering, en fellesskapsverifikator eller en medlemsoppføring. Det er gulvet; det reelle tallet er høyere, og det er det anslaget modellerer.`, limitsH: 'Hva det ikke ser', - limits: `De som poster mest på engelsk er usynlige for en språkmodell, så en engelskspråklig konto i ${c} fanges ikke opp. Anslaget er en form, ikke en hodetelling, og bærer en ~ av en grunn.`, + limits: `De som poster mest på engelsk er usynlige for en språkmodell, så en engelskspråklig konto i ${c} fanges ikke opp. Det er noe av grunnen til at det reelle tallet ligger over det bekreftede gulvet.`, all: 'Se hele Europa', }), }; diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index fa10f8a..a17ebad 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -89,7 +89,7 @@ export const ui = { 'Individual developers and makers building on the protocol, and organizations and governments exploring sovereign, open alternatives for social platforms. If you want social technology that is open and that you can own, you are in the right place.', 'about.contributions.h': 'Contributions', 'about.contributions': - 'What keeps this going is contributions and volunteers: the site is open source on Tangled and open to pull requests, and members run the meetups and bring people in. There is no forum yet.', + 'What keeps this going is contributions and volunteers: the site is open source on Tangled and open to pull requests, and members run the meetups and bring people in.', 'about.chapters.h': 'Local chapters', 'about.chapters.a': 'Dutch cities have their own local chapters / sibling communities. First up is ', @@ -99,7 +99,7 @@ export const ui = { 'about.local': '{siteName} is one of several local communities. For communities elsewhere, see the list at', 'about.caretaker': - '{siteName} is run by volunteers from the wider AT Protocol community for now, and is meant to be handed to people {inCountry}. Want to run it? Get in touch.', + '{siteName} is independent and run by volunteers from the AT Protocol community {inCountry} and beyond. Want to help run it? Get in touch.', 'footer.follow': 'mu.social', 'footer.chat': 'Chat', 'footer.privacy': 'Privacy', @@ -158,7 +158,7 @@ export const ui = { 'stats.src.sifaNl': 'Sifa ID location', 'statsPage.estimate.h': 'Activity estimate', 'statsPage.estimate.note': - 'A wider, modelled figure: the share of posts across Bluesky that are Dutch, scaled to all accounts and to the roughly two thirds of Dutch speakers who live in the Netherlands. It moves around and is not a headcount, so we keep it apart from the confirmed floor.', + 'A wider, modelled figure: the share of posts across Bluesky that are Dutch, scaled to all accounts and to the roughly two thirds of Dutch speakers who live in the Netherlands. It moves as the model updates, so we keep it separate from the confirmed floor.', 'statsPage.estimate.method': 'How we estimate this', 'statsPage.updated': 'Last updated', }, @@ -236,7 +236,7 @@ export const ui = { 'Individuele ontwikkelaars en makers die op het protocol bouwen, en organisaties en overheden die soevereine, open alternatieven voor sociale platforms verkennen. Wil je sociale technologie die open is en die je zelf in handen hebt? Dan zit je hier goed.', 'about.contributions.h': 'Bijdragen', 'about.contributions': - 'Wat het draaiende houdt zijn bijdragen en vrijwilligers: de site is open source op Tangled en staat open voor pull requests, en leden organiseren de meetups en brengen mensen mee. Er is nog geen forum.', + 'Wat het draaiende houdt zijn bijdragen en vrijwilligers: de site is open source op Tangled en staat open voor pull requests, en leden organiseren de meetups en brengen mensen mee.', 'about.chapters.h': 'Lokale afdelingen', 'about.chapters.a': 'Nederlandse steden hebben hun eigen lokale afdelingen / zustercommunities. Als eerste is er ', @@ -246,7 +246,7 @@ export const ui = { 'about.local': '{siteName} is een van meerdere lokale communities. Voor communities elders, zie de lijst op', 'about.caretaker': - '{siteName} wordt voorlopig gerund door vrijwilligers uit de bredere AT Protocol-community en is bedoeld om overgedragen te worden aan mensen {inCountry}. Wil je het runnen? Neem contact op.', + '{siteName} is onafhankelijk en wordt gerund door vrijwilligers uit de AT Protocol-community {inCountry} en daarbuiten. Wil je meehelpen? Neem contact op.', 'footer.follow': 'mu.social', 'footer.chat': 'Chat', 'footer.privacy': 'Privacy', @@ -304,7 +304,7 @@ export const ui = { 'stats.src.sifaNl': 'Sifa ID-locatie', 'statsPage.estimate.h': 'Schatting van de activiteit', 'statsPage.estimate.note': - 'Een breder, gemodelleerd getal: het aandeel Nederlandstalige posts op Bluesky, geschaald naar alle accounts en naar de ongeveer twee derde van de Nederlandstaligen die in Nederland woont. Het schommelt en is geen koppentelling, dus we houden het los van de bevestigde ondergrens.', + 'Een breder, gemodelleerd getal: het aandeel Nederlandstalige posts op Bluesky, geschaald naar alle accounts en naar de ongeveer twee derde van de Nederlandstaligen die in Nederland woont. Het schommelt mee met het model, dus we houden het los van de bevestigde ondergrens.', 'statsPage.estimate.method': 'Hoe we dit schatten', 'statsPage.updated': 'Laatst bijgewerkt', }, @@ -450,7 +450,7 @@ export const ui = { 'stats.src.sifaNl': 'Localisation Sifa ID', 'statsPage.estimate.h': "Estimation de l'activité", 'statsPage.estimate.note': - "Un chiffre plus large et modélisé : la part des publications en néerlandais sur Bluesky, rapportée à l'ensemble des comptes puis aux quelque deux tiers des néerlandophones qui vivent aux Pays-Bas. Il fluctue et ne constitue pas un décompte, nous le gardons donc à part du plancher confirmé.", + "Un chiffre plus large et modélisé : la part des publications en néerlandais sur Bluesky, rapportée à l'ensemble des comptes puis aux quelque deux tiers des néerlandophones qui vivent aux Pays-Bas. Il fluctue avec le modèle, nous le gardons donc à part du plancher confirmé.", 'statsPage.estimate.method': 'Comment nous estimons cela', 'statsPage.updated': 'Dernière mise à jour', }, @@ -579,7 +579,7 @@ export const ui = { 'stats.src.starterpack': 'Starter pack-medlemmer', 'stats.src.sifaNl': 'Sifa ID-lokasjon', 'statsPage.estimate.h': 'Aktivitetsanslag', - 'statsPage.estimate.note': 'Et bredere, modellert tall: andelen poster på Bluesky som er på nederlandsk, skalert til alle kontoer og til omtrent to tredjedeler av nederlandsktalende som bor i Nederland. Det varierer og er ikke en hodetelling, så vi holder det adskilt fra det bekreftede gulvet.', + 'statsPage.estimate.note': 'Et bredere, modellert tall: andelen poster på Bluesky som er på nederlandsk, skalert til alle kontoer og til omtrent to tredjedeler av nederlandsktalende som bor i Nederland. Det endrer seg med modellen, så vi holder det adskilt fra det bekreftede gulvet.', 'statsPage.estimate.method': 'Hvordan vi anslår dette', 'statsPage.updated': 'Sist oppdatert', }, diff --git a/src/pages/[...lang]/countries.astro b/src/pages/[...lang]/countries.astro index 5507010..087841e 100644 --- a/src/pages/[...lang]/countries.astro +++ b/src/pages/[...lang]/countries.astro @@ -38,7 +38,7 @@ const estimate = europeStats.peopleEstimate ?? 0;

How we count

- This is a floor, not a census. AT Protocol has no country field, so we only count people who + AT Protocol has no country field, so we only count people who left a trace we can read: a country domain in their handle, a location in their profile, a community verifier, a curated list. Each account is counted once. Where signals disagree we place it nowhere rather than guess, so these numbers add up instead of overlapping. Language @@ -104,7 +104,7 @@ const estimate = europeStats.peopleEstimate ?? 0;

Communities

Where a community already exists we link to it. The point of this page is to help you find - your people. City communities cover a city, not a country, and are marked as such. + your people. City communities cover a single city and are marked as such.

    {existingCommunities.map((c) => ( -- 2.54.0