This tracker watches what the three governments actually say — not what commentators say about them. Every week it reads the official statements of France, Germany and Poland and checks, topic by topic, whether their positions line up. Here is how that works, in four steps.
Every source is a specific foreign ministry or executive office, so the source country always counts — a Polish statement about Ukraine counts Poland even when the text never names it. On top of that, each item is read to see which other Weimar Triangle countries it concerns, which tracked issues it touches (Ukraine, defence, hybrid threats, enlargement, green transition, rule of law), and whether it explicitly invokes the Weimar Triangle. An item is kept when it's from one of these six ministries/offices and touches a tracked issue, when two or more of the three countries are involved on a tracked issue, or when it names the trilateral format directly.
Comparing positionsThe Recent page groups relevant events into clusters where two or more countries published on the same topic within the same week. This surfaces the moments where, say, Germany and Poland both speak about Ukraine within days of each other — even without a joint statement — so their positions can be compared side by side.
How the stance is scoredStatements are rated against the goals the three governments jointly agreed in the Weimar declarations of February and May 2024, on a five-point scale:
- +2 — actively advances the goal: concrete commitments, resources, initiatives
- +1 — supports the goal rhetorically, without new commitments
- 0 — neutral: mentions the topic without taking a stance
- −1 — hedges: partial support with significant caveats
- −2 — opposes or undermines the goal
Each rating is stored with a verbatim quote from the statement that justifies it, so every score on this site can be checked by reading the quote behind it. No hidden similarity math sits behind the headline scores.
What the labels meanA cluster's label combines two things: how close the capitals' average scores are to each other, and whether that shared position actually backs the goal.
Scores are model-assigned and always quote-backed, but models make mistakes. If a rating looks wrong, a quote reads out of context, or a statement was misclassified, please report it — corrections are reviewed and the underlying record is fixed, and that fix becomes part of the public history too.
Caveats- Sources are read in their native language — the full output of each institution, not the thinner English sections where those even exist. Position summaries are written in English; the evidence quotes stay in the original language.
- If a native-language feed goes down, collection falls back to an English section (where one exists) until it recovers, so a few items may carry English text.
- Only the German foreign ministry and France Diplomatie offer clean feeds; the other four are read directly from their websites and can break if those sites change.
- Historical meetings data (pre-pipeline) is hand-curated from public records.
For the technically mindedThe model, the data format, pipeline status, and how provenance is tracked ▾
Relevance classification, position extraction, and stance rating are all done by Gemma 4,
an open-weight language model, run through Ollama — locally during development and via Ollama
Cloud in the automated pipeline. For each item the model is asked which countries and issue
areas it concerns, a one-sentence position summary per topic, a stance rating, and the quote
that supports it. Its output is stored separately from the raw scraped text (under
data/enriched/), and both are committed to git. An item is flagged
weimar_relevant under the rules above, with a stronger trilateral_signal
flag when all three actors are present or the format is named explicitly.
Each event is split across two YAML files committed to git, both keyed by the same relative
path {source}/{YYYY-MM}/{date}-{hash}.yaml: the raw scraped fields live under
data/events/ (title, text, source_url,
source_published_at, ingested_at), and the computed classification
plus the model's extracted block live under data/enriched/. The
{hash} is the first eight hex characters of a SHA-256 hash of the source URL and
title, giving automatic deduplication. The full history is auditable via git log.
Every file also records how it was produced, so a native-language item is never
mistaken for an English fallback. Each raw event carries collection
(native or fallback) and collection_method
(rss, html, or a Wayback backfill); each enriched sidecar carries
enriched_by — the model_id, the prompt_version that
produced its ratings, and whether it was enriched locally or in GitHub Actions. Values on data
collected before this tracking was added are reconstructed from git history.
Six official sources, two per country — a foreign ministry and a top executive office. Last ingest run — 2026-08-20:
| Source | Lang | Method | Success | Fetched | Status |
|---|---|---|---|---|---|
| France Diplomatie FR | French | RSS | 2026-08-20 | 10 (+1) | ok |
| Élysée FR | French | HTML scraper | 2026-08-20 | 0 (+0) | ok |
| German MFA DE | German | RSS | 2026-08-20 | 1 (+1) | ok |
| German Chancellery DE | German | HTML scraper | 2026-08-20 | 1 (+1) | ok |
| Polish MFA PL | Polish | HTML scraper | 2026-08-20 | 0 (+0) | ok |
| Polish PM Chancellery PL | Polish | HTML scraper | 2026-08-20 | 1 (+1) | ok |
- Alerts & monitoring — get notified when a topic's alignment shifts, instead of checking back.
- Full-history Excel export — every rated statement, every quote, since the pipeline started.
- More minilateral formats — E3 (France–Germany–UK), Visegrád Four, Baltic Three, and other coordination formats tracked the same way.
Suggestions are welcome — if there's a feature or format you'd find useful, email hello@minilaterals.com.
Total events tracked: 1547 · Weimar-relevant: 987