Party Compass — the German party alignment quiz
Live: hub.unicorn.land/party-compass/
A questionnaire that scores you against the German party landscape and shows why — ranked matches, a political compass, and the specific answers that pulled you toward or away from each party. Built so two people can take it separately and compare.
It exists as background for Weitblick: before arguing that a new current is needed, it is worth being precise about what the existing thirteen actually offer and where the genuine gaps in the landscape are.
What changed in this version
The first version scored against seven parties — the six that entered the 2025 Bundestag plus BSW and FDP, minus SSW. That turned out to be too narrow to answer the question people actually ask it, because roughly 14% of 2025 second votes went to parties it never mentioned. Someone whose politics are Pirate or ÖDP-shaped was told they were an FDP or a Green, with no way to see the party they’d actually vote for.
This version scores against thirteen, adds nine statements that separate them, fixes a scoring bug that would have made the new parties nonsense, and lets a result travel as a link.
Which parties, and why those
Ranked by 2025 Zweitstimmen. Bold = included.
| Party | 2025 | In? | Reasoning |
|---|---|---|---|
| CDU/CSU | 28.5% | ✅ | Governing party |
| AfD | 20.8% | ✅ | Largest opposition |
| SPD | 16.4% | ✅ | Junior coalition partner |
| Grüne | 11.6% | ✅ | In Bundestag |
| Linke | 8.8% | ✅ | In Bundestag |
| BSW | 4.98% | ✅ | Missed the threshold by 0.02 points — nationally significant |
| FDP | 4.3% | ✅ | Out of the Bundestag but still a real option |
| Freie Wähler | 1.5% | ✅ | Largest omission from v1; governs Bavaria in coalition |
| Tierschutzpartei | 1.0% | ✅ | Above 1% and a genuinely distinct single issue |
| Volt | 0.7% | ✅ | Requested; the only true pan-European federalist |
| Die PARTEI | 0.5% | ❌ | Satirical — no scoreable platform (see below) |
| SSW | 0.2% | ❌ | Holds a Bundestag seat, but only electable in Schleswig-Holstein |
| dieBasis | 0.2% | ✅ | The direct-democracy / institutional-distrust position, held by nobody else |
| Bündnis Deutschland | 0.2% | ❌ | Marginal and a platform duplicate of AfD |
| ÖDP | 0.1% | ✅ | Ecological and socially conservative — an otherwise empty quadrant |
| Piraten | ~0.04% | ✅ | Requested; the only privacy-absolutist platform |
| MERA25 | ~0.0% | ❌ | Marginal and a platform duplicate of Linke |
On the four exclusions
Die PARTEI polls above Volt but is a satirical party. Scoring it requires pretending its positions are sincere; every answer would be a fabrication.
SSW is the awkward one — it has a Bundestag seat, exempt from the 5% threshold as a Danish/Frisian minority party. It is excluded because you cannot vote for it unless you live in Schleswig-Holstein. Ranking it nationally would tell most users their closest match is a party not on their ballot.
Bündnis Deutschland and MERA25 are each both marginal and close platform duplicates of a party already included. Adding them splits a cluster without offering a distinct choice — it makes the result less clear, not more.
The guiding rule: more parties is not the goal — more distinct, actually-votable options is. Thirteen was the point where adding another party started subtracting clarity.
Two things that had to be fixed first
1. The coverage bug
Alignment was ((raw / max) + 1) / 2, where max sums only the statements a party
takes a position on. With seven broad parties this is invisible — they all cover
almost everything. Add a single-issue party and it breaks badly:
Tierschutzpartei has a clear position on maybe 8 of 45 statements. Agree with all eight and it scores 100% — beating a party you matched on 40 statements.
Single-issue parties would have topped almost every result. The fix pulls each score toward 50% in proportion to how little ground the party covers:
conf = max[party] / total_answered_weight // 0..1 coverage
shrunk = 0.5 + (rawAlign - 0.5) * (conf / (conf + 0.4))
A party covering ~40% of your answered weight keeps half its distance from neutral. Broad parties are essentially unaffected. Anything under 45% coverage is marked with an asterisk and explained in the results, rather than silently discounted.
2. Nine new statements
The original 36 were written to separate seven mainstream parties. Bolted onto the new six, Volt came out as Grüne, Piraten as FDP-with-privacy, ÖDP as Grüne. Each addition is there to make a specific party separable:
| New statement | Separates |
|---|---|
| EU as a federal state with its own army | Volt from every other pro-European |
| No chat control, no blanket data retention | Piraten from FDP |
| Unconditional basic income | Piraten from Linke |
| Post-growth economy | ÖDP from Grüne |
| Ban factory farming, animal rights in the constitution | Tierschutz, ÖDP |
| Decisions as locally as possible | Freie Wähler, dieBasis |
| Binding lobbying/donations transparency register | ÖDP, Piraten |
| COVID measures went too far, no accountability | dieBasis from BSW |
| Restart nuclear power | FDP/AfD from ÖDP/Tierschutz |
Nuance instead of a single winner
A flat “you are X” is usually wrong. The headline now adapts to the shape of the result:
- Gap ≤ 3 points → “FDP and Piraten, evenly split”
- Gap ≤ 10, runner-up ≥ 52% → “FDP with Piraten tendencies”
- Gap ≤ 18, third ≥ 52% → “FDP, with a Piraten/Volt undertow”
- Top score < 55% → “No clear match — you sit between …”
- Otherwise → the winner, with the margin stated
A genuinely flat spread is reported as flat rather than resolved into a false winner.
Sharing a result
Answers encode into the URL itself — one base-12 character per statement, carrying
both the answer and whether it was flagged double-weight. Copy result link produces
a URL that renders exactly that result for anyone who opens it. No account, no server,
no database; the answers never leave the device except in a link the taker chooses to
send.
Opening a shared link is explicitly read-only — a banner says whose result it is, and the viewer’s own saved answers are left untouched.
Copy raw JSON gives scores, coverage, axis positions and every answer as data.
Known limits
- Positions are simplified. Each stance is one of −1 / −0.5 / 0 / +0.5 / +1. Real platforms have internal disagreement and change between elections.
- A
0means “no clear public position”, not “neutral”. Those statements are excluded from that party’s denominator, which is what makes the coverage correction necessary. - The compass axes are derived from the same stance matrix, so they inherit its simplifications. They show relative positions, not political science.
- Positions are as of the 2025 election and the 2025–26 government and will drift.