What changed, and when.

Written by hand, one entry per change worth a line, and committed together with the work it describes. What each entry says is what was written when the change was made, not a summary made later.

The version in front of each one is the version the project stood at when that commit landed: the same counter the footer carries, whose last part is the number of commits behind it.

Latest

v.1.1.22Count page views with Vercel Web Analytics

22 September 2026

From newest to first.

  • v.1.1.22Count page views with Vercel Web Analytics

    22 September 2026

    app/layout.tsx mounts Analytics from @vercel/analytics/next at the end of the body, so every page load and client-side transition is counted once Web Analytics is enabled for the web project in the Vercel dashboard. The package was already a dependency; nothing had loaded it. The script is served from the site's own origin at /_vercel/insights/script.js, does nothing in development, and sets no cookie.

    /privacy no longer says the site runs no analytics. Its lead, its summary and its Browsing section now say that page views are counted and, from Vercel's own privacy page, what a page view records: the moment, the path, the referrer, the country, region and city, browser, operating system and device type, with a request hash kept for a day at most and no cookie. data/legal.ts moves its date.

  • v.1.1.20Log every tool call in full and give the status page its last 90 days

    12 September 2026

    The server's request line now says what a POST to a mount was: the JSON-RPC method, the client's name and version on initialize, and for a tools/call the registry and tool behind it (a qualified name on the country server is resolved to the source that answers). callTool writes one tool.ok or tool.failed line per call carrying the same requestId, with transport, mount, arguments, duration, result size and cache hits; a failure carries the AgoraError's code, status, details and cause, at a level that says whose fault it was. Calls the SDK refuses before any handler runs (an unknown tool, arguments the schema will not take) and the transport's own 406/415/bad-JSON refusals, which used to become 500s, each get a line of their own. LOG_SLOW_TOOL_MS and LOG_TOOL_ARGS are new, both documented in the README.

    With DATABASE_URL set, the server also records each finished call as a row in tool_calls (apps/server/src/record.ts, a migration in apps/web/db/migrations): source, tool, transport, outcome, code and duration, never the arguments or an address. apps/web/vercel.json schedules /api/cron/status every ten minutes, which makes the page's own check per registry and writes it as a probe row, so a quiet day is not a blank one and a stretch when the server itself was down is recorded as one; the same run drops rows older than 90 days. CRON_SECRET lets it in.

    /status keeps its live verdict and adds, under each registry, components/status/history-strip.tsx: ninety cells for ninety days, green for a day that answered, the site's one warning colour at half strength for a day that missed more than one call in a hundred and full for more than one in four, the panel border for a day nothing was asked, with the count in each cell's title and the window's share answered beneath. data/status.ts shapes the rows for it and sends x-agoramcp-probe on every check, which the server logs but does not record.

  • v.1.1.19Build the footer from the nav and add the Privacy and Terms pages

    12 September 2026

    data/footer.ts now builds its Product and Resources columns from the nav's own panels, rows then cards, the way useCaseItems is built from data/use-cases.ts, so the two cannot drift. View live moves to Product and Licences joins Resources as a result.

    Legal is down to Privacy and Terms, each now a page: /privacy says what the site and the servers see and keep, /terms whose data it is and what is promised. Both are text in data/legal.ts rendered by components/legal/legal-page.tsx, with the hero and band of /licenses. Attribution and Licences leave the column; the licences page is under Resources.

    The Contact column is commented out, in the footer and in the search index, until it has real destinations. formatDay moves to data/format.ts for the legal pages' last-updated line.

  • v.1.1.18Give the catalogue the Dashboard's row in the nav

    11 September 2026

    The Product dropdown's Dashboard placeholder (two thirds of it the catalogue, the rest usage that would need accounts) is now Catalogue: a row to /all with a Library icon, and "all sources", "registries" and "directory" as its search keywords. The footer's Product column makes the same swap, so the catalogue is linked from the footer for the first time.

    The Resources dropdown drops its "View all" card, whose destination the new row covers. "Request a country" is the one card left and stands the full height of the four rows beside it. The column's flex layout already did that once the card had no sibling.

  • v.1.1.17Replace the landing page's placeholder sections with the four that ship

    10 September 2026

    The Sources subtext now counts what the server has mounted, read through loadDirectory the way /all reads it, so it moves when a source is mounted rather than when a logo is added; the page renders per request (revalidate = 0) for the same reason /all does, and the sentence stands without the number when the server is unreachable.

    components/use-cases/worked-question.tsx and question-tabs.tsx turn the Tools placeholder into Questions: the four use cases of data/use-cases.ts as a vertical tab list on four of the page's columns, and the selected one worked through on the last five, with the prompt as typed, the tools it calls in order, the registries that answer it, and links to the walkthrough and /live. Every panel is rendered and stacked in one cell so nothing moves when the selection changes; the panel fades out and back in over 300 ms, the list numbers its rows itself (Example 1: and on) so the data keeps plain titles, and the arrow keys move through the list.

    components/attribution/attribution.tsx turns the Attribution placeholder into three facts on the same four-one-five columns: official registries only, answering right now, and the licence that travels with the data, the last shown as the HTTP envelope excerpt built from data/licenses.ts with Diavgeia's attribution line verbatim. components/exit/exit.tsx closes the page with a hero-sized "Connect to Agora now" and one Get started button to /quickstart, centred on the content width with twice the standard band's padding, the one band that does not lay out on the columns.

    The root layout marks <html> with data-scroll-behavior="smooth", which Next asks for before it honours the scroll-behavior: smooth in globals.css on navigation.

  • v.1.1.16Rewrite every changelog entry from its commit's diff

    8 September 2026

    Every entry below now describes what its commit changed, read from the diff rather than copied from the message: specific titles in place of "Major changes" and "ui/ux updates", and bodies that name the packages, tools, routes and scripts involved. Tool counts were checked against the tools files at those commits.

  • v.1.1.15Keep the changelog by hand and drop the versions table

    8 September 2026

    Delete db/changelog.ts and db/version.ts, the scripts that wrote this page from git log and recorded commit counts in a versions table, along with their pnpm db:* entries. A migration drops the table; its down recreates it.

    data/changelog.ts is now written by hand and committed with the change it describes, and the sha field is gone. The footer and this page still read its top entry, so the v.{major}.{countries}.{commits} scheme is unchanged.

  • v.1.1.13Add the NOA earthquake source and generate the changelog from git

    7 September 2026

    packages/sources/gr/noa reads the National Observatory of Athens fdsnws-event service with three tools: search_earthquakes (time, magnitude, depth, bounding box or radius), get_earthquake, which parses QuakeML for station count, azimuthal gap and analyst review, and list_recent_earthquakes. Search windows are capped at 31 days; meta.ts declares CC-BY-4.0 with the Institute of Geodynamics attribution and short TTLs.

    pnpm db:changelog writes data/changelog.ts from git log and the versions table, and /changelog becomes one flat list, newest first. The footer reads the version from the new data/version.ts instead of the database, so loadVersion and the layout's revalidate = 60 go.

  • v.1.1.12Fade every navigation, not only the top-level ones

    7 September 2026

    The root template.tsx keys its fade on the full pathname, so moving between catalogue countries, sources or use cases animates like moving between top-level pages. Search-parameter changes are left out, so the live console can rewrite its query without a blink.

  • v.1.1.11Add the VIES source and the pages the nav pointed at

    7 September 2026

    packages/sources/gr/vies replaces the gr/test placeholder: check_vat_number normalises an ΑΦΜ, validates its check digit and asks the EU VAT Information Exchange System, and list_member_states reports which member states are answering. With gr/test gone, UNBUNDLED is empty and VIES joins the Greek country server.

    Four dead nav links become pages: /documentation (glossary, conventions and a route index from data/documentation.ts), /status (one live call per mounted registry), /licenses (sources grouped by licence with their attribution lines) and /changelog. The Features dropdown becomes Use cases, each row of data/use-cases.ts rendering at /use-cases/[slug].

    On /all, the Countries and Sources lists get a hero each and CountryRow and SourceRow share one Row. CodeBlock gains a wrap prop, Band an id, and search indexes the glossary under Vocabulary.

  • v.1.1.10Add HTTP tool endpoints, a CKAN adapter and four Greek sources

    1 September 2026

    The server answers plain HTTP beside MCP: GET|POST /{country}/api/{source}/{tool} calls a tool with query values coerced to its schema, undeclared parameters rejected with a 400, and an envelope carrying publisher, license, attribution and upstreamUrl around data. Both transports share call.ts for the credential check, TTL and logging, and successful GETs carry a Cache-Control matching the tool's TTL.

    packages/ckan is a reusable adapter with seven tools over any CKAN portal, reading CSV, TSV, JSON and GeoJSON resources outside the datastore. gr/datagov and gr/athens are it pointed at data.gov.gr and the City of Athens; gr/kimdis (public contracts) and gr/mitos (public-service procedures) have their own clients, seven tools each.

    The web app gains the catalogue at /all, /all/[country] and /all/[country]/[source], rendered from the server's GET / with a full per-tool reference, an /api page documenting the HTTP contract, and a rewritten search over menu, footer, mounts, agents and error codes. A versions table and db:version script put v.1.{countries}.{commits} in the footer, and the README documents the API and VERCEL_EXPERIMENTAL_BACKENDS=1 for the server project.

  • v.1.1.9Store country requests in Postgres behind a server action

    1 September 2026

    apps/web/db/ adds a postgres client, a Laravel-style migration runner (migrate, rollback --step=N, reset, status, make) with a migrations table, a seeder runner and migrations for countries and requests, plus the db:* scripts in package.json.

    The /country form submits to a requestCountry server function and reports created, duplicate, supported, unknown or error with the live count. A visitor is a salted SHA-256 of address and user agent (REQUEST_HASH_SALT), so each counts once per country; the placeholder requestCounts map is deleted.

  • v.1.1.8Split the server listener into serve.ts and document deployment

    1 September 2026

    apps/server/src/index.ts now exports the Hono app; the serve() call and the boot-time warm loop move to serve.ts, which dev and start run, so a host that owns the listener imports the app alone. railway.json configures the Railpack build and /health check, the web start honours PORT, and the README gains a Deploying section for the two Vercel projects.

  • v.1.1.7Sort each country's sources alphabetically in the catalogue

    1 September 2026

    loadCatalogue orders a country's providers by display name, case- and accent-insensitive, instead of the registry's import order.

  • v.1.1.6Mount per-country MCP bundles and add the /mcp and /quickstart pages

    1 September 2026

    /{country}/mcp serves every source of a country in one server, tool names prefixed with their source; defineBundle in packages/core checks at boot that no two sources claim the same name. Source gains a warm hook run at boot and SourceTool an example parsed against its own schema.

    Diavgeia grows from 8 to 17 tools, among them search_decisions_advanced, get_decision_text (PDF text via unpdf), get_decision_history and search_dictionary, with a warm that prefetches the body register; docs/gr-documentation.md indexes them.

    /mcp and /quickstart print connection snippets for Claude Code, Claude, Codex, Cursor, Windsurf, VS Code and any MCP client. /live builds its tool list from the server's GET / through the new data/catalogue.ts, with Greek names transliterated by data/greeklish.ts, instead of a hand-written provider list.

  • v.1.1.5Add a page-wide WebGL starfield and make the eclipse transparent

    31 August 2026

    components/background/starfield.tsx draws a full-page star canvas at 30fps, pausing when the tab is hidden and rendering one static frame under prefers-reduced-motion; it is imported in the layout but still commented out. The eclipse shader drops its own stars and emits premultiplied alpha, so the layer behind it shows through. Text selection takes the accent colour.

  • v.1.1.4Add the Diavgeia source with 8 tools, the site shell and /live

    31 August 2026

    packages/sources/gr/diavgeia reads diavgeia.gov.gr/opendata with search_decisions, get_decision, list_decision_types, search_organizations, get_organization, list_organization_units, get_signer and list_thematic_categories; meta.ts records CC-BY-4.0, the Greek attribution and per-tool TTLs, and DOCUMENTATION.md covers the upstream API.

    The web app gets its shell: Navigation and Footer in the root layout, a dark theme with one accent colour and JetBrains Mono with the Greek subset, the shared 12-column Grid, and a landing hero with a WebGL eclipse that tracks the cursor above a grid of publisher logos.

    /live lets a visitor pick a country, source and tool, edit the arguments and read the real response, proxied through app/api/mcp/route.ts, which rebuilds the arguments from data/playground.ts and rejects unknown endpoints or tools before forwarding. /country is a request-a-country form over the ISO list.

  • v.1.1.3Split into a pnpm monorepo with a Hono MCP server and core package

    29 August 2026

    The Next.js app moves to apps/web; packages/core holds the Source contract (defineSource, defineTool), an HTTP client, an in-memory cache, a logger and the AgoraError hierarchy for invalid input, missing credentials, not found, rate limit and upstream failure.

    apps/server is a Hono app that mounts every registered source at /{country}/mcp/{source} over Streamable HTTP, building a stateless McpServer per request, with CORS, request-id logging, a per-client rate limiter and registry.ts as the single wiring point. packages/sources/gr/test ships one ping tool as the reference source shape.

  • v.1.1.2Strip the create-next-app template

    29 August 2026

    Remove the template page, favicon and Vercel SVGs, title the app agoramcp and cut the README to the two commands that run it. globals.css applies the Geist font through the Tailwind theme instead of Arial.

  • v.1.1.1Scaffold the web app with create-next-app

    29 August 2026

    A fresh Next.js App Router project with Tailwind 4, ESLint and a pnpm workspace file, still showing the generator's template page.