Live: valvaka.celestiocloud.site
En enkel live-dashboard för valnatten: hur stora Tidöpartierna (M, SD, KD, L) och oppositionen (S, V, MP, C) är just nu, varje partis andel, och hur siffrorna förändras under kvällen. Siffrorna hämtas direkt från Valmyndighetens resultatsida och uppdateras varje minut.
A small live dashboard for Sweden's 2026 general election night, showing bloc and party vote shares straight from the Election Authority's published results. Unofficial, open source, no tracking.
- Blocken: Oppositionens och Tidöpartiernas sammanlagda andel av rösterna, beräknade mandat mot gränsen för egen majoritet (175), förändring sedan 2022 och vem som leder.
- Partierna: Varje partis andel som stapel, beräknat antal mandat, förändring sedan 2022 och 4 %-spärren.
- Utvecklingen: En linjegraf med en punkt per uppdatering från Valmyndigheten, för blocken eller alla partier. Hovra eller använd piltangenterna för att se värden och förändringen sedan föregående uppdatering. Allt finns även som tabell.
- Räkningsläget: Var räkningen står och vad som kommer härnäst, i tre steg: vallokalernas räkning (med vilka kommuner som saknas), uppsamlingsdistrikten och den slutliga rösträkningen. Under stegen visas Valmyndighetens eget meddelande om tidplanen, och när de senast uppdaterade.
- Kartan: Alla 6 312 valdistrikt, färgade efter största parti eller största block när de är räknade. Hovra eller tryck på ett distrikt för dess resultat, zooma in i städerna och se de senast rapporterade distrikten.
- Inofficiell. Projektet är inte kopplat till eller granskat av Valmyndigheten. Det officiella resultatet finns på val.se och fastställs av Valmyndigheten.
- Oförändrad källdata. Resultaten hämtas från samma JSON-filer som resultat.val.se själv använder och skickas vidare utan ändringar. Serverns enda tillägg är en historik med en ögonblicksbild per uppdatering.
- Öppna beräkningar. Partiernas andelar är Valmyndighetens egna siffror (
andelRoster). Blockens andel är summan av blockets partiers röster delat med antalet röster som påverkar mandatfördelningen (rosterPaverkaMandat.antalRoster). Koden finns iindex.htmlochserver.py. - Beräknade mandat. Valmyndigheten publicerar underlaget för mandatfördelningen under valnatten men inte själva fördelningen. Valvaka räknar därför fram mandaten enligt vallagen i
mandates.py: jämkade uddatalsmetoden med 1,2 som första divisor för både de 310 fasta valkretsmandaten och landets alla 349 mandat, 4 %- och 12 %-spärrarna samt regeln om överskjutande mandat. Samma beräkning på 2022 års röster ger exakt det officiella utfallet 2022. Mandaten är inte officiella, och den slutliga fördelningen fastställs av Valmyndigheten. - Preliminärt. Valnattens siffror är den preliminära rösträkningen. Den slutliga räkningen kan ge andra siffror.
- Ingen spårning. Inga cookies, ingen analys och inga tredjepartsresurser. Webbläsaren pratar bara med servern som levererar sidan.
localStorageanvänds bara för att komma ihåg grafvalet, och på statiska värdar även för historiken. - Kartdata. Distriktsgränserna kommer från Valmyndighetens öppna data (länsstyrelsernas valdistrikt i SWEREF 99 TM), förenklade med mapshaper till
valdistrikt.topo.json. Resultaten per distrikt kommer från Valmyndighetens officiella resultatfilVal_2026_preliminar_00_RD.zip. De 314 uppsamlingsdistrikten saknar geografi och syns inte på kartan. - Inga beroenden. Servern använder bara Pythons standardbibliotek och sidan är ren HTML, CSS och JavaScript, så det finns ingen leveranskedja att lita på.
Kräver Python 3.10 eller senare.
python3 server.pyÖppna sedan http://localhost:8765.
| Miljövariabel | Standard | Beskrivning |
|---|---|---|
HOST |
127.0.0.1 |
Adress servern lyssnar på. Använd 0.0.0.0 i en container. |
PORT |
8765 |
Port. |
HISTORY_FILE |
history.json |
Var kvällens historik sparas, så att den överlever en omstart. |
Valmyndighetens filer skickar inga CORS-huvuden, så en webbläsare på en annan domän kan inte hämta dem direkt. Därför behöver värden skicka vidare api/results (och helst api/history) till val.se. Välj det som passar din hosting:
| Hosting | Filer | Historik |
|---|---|---|
| Container eller VPS med Python | server.py, districts.py, mandates.py, index.html, valdistrikt.topo.json |
På servern, gemensam för alla besökare |
| Docker | Dockerfile |
På servern. Montera en volym på /data för att behålla den vid omstart. |
| PHP (Apache eller nginx) | index.html, api.php, .htaccess, districts.py, mandates.py, valdistrikt.topo.json |
På servern, men registreras bara när någon har sidan öppen. Utan URL-omskrivning, till exempel på nginx, anropar sidan api.php direkt. |
| Netlify | index.html, _redirects |
Bara i besökarens webbläsare |
| Vercel | index.html, vercel.json |
Bara i besökarens webbläsare |
docker build -t valvaka .
docker run -p 8080:8080 -v valvaka-data:/data valvakaPå PHP-hosting sköter cron det som server.py annars gör i bakgrunden: historiken och resultaten per distrikt till kartan. districts.py kräver Python 3.10 eller senare på servern.
* * * * * cd ~/public && php api.php >/dev/null 2>&1
* * * * * cd ~/public && python3 districts.py data/districts.json >/dev/null 2>&1| Endpoint | Svar |
|---|---|
GET /api/results |
Valmyndighetens RD_P.json oförändrad, cachad i 30 sekunder |
GET /api/history |
[{ t, districts, left, right, parties: { S: 24.0, … } }, …], en post per uppdatering |
GET /api/status |
{ updated, regular: { counted, total }, collection: { counted, total }, pending: [{ kommun, districts }], messages, final_published }, räkningsläget |
GET /api/seats |
{ updated, counted, total, majority, parties: { S: { seats, fixed, seats2022 }, … } }, beräknad mandatfördelning |
GET /api/districts |
{ updated, parties, colors, districts: { "08600201": [rapporterat, giltiga röster, …andelar i partiordning, övriga] } }, bara räknade distrikt |
Källdatan följer mönstret https://resultat.val.se/data/resultat/val2026/{val}_{område}_{P|S}.json, till exempel RD_P.json (riksdagen, hela landet, preliminärt) eller KF_10_1082_P.json (kommunvalet i Karlshamn). Alla områdeskoder finns i https://resultat.val.se/data/valgeografi/valgeografi_val2026.json. Formatet är Valmyndighetens interna och odokumenterade format och kan ändras utan förvarning.
Servern hämtar som mest en gång var 30:e sekund oavsett antal besökare, för att inte belasta Valmyndighetens tjänst.
Koden är licensierad under MIT. Licensen gäller koden i det här repot. Valresultat och distriktsgränser kommer från Valmyndigheten, som ska anges som källa. Gränserna tas fram av länsstyrelserna.