← Tilbage til projekterPersonligt dashboard · PWA
ToDay

ToDay — et dagsoverblik på min egen server

Om morgenen er den information, jeg faktisk har brug for, spredt ud over fire apps: ulæste mails i Gmail, dagens møder i Google Calendar, vejret i en app, nyhederne i en femte. ToDay samler det på én side, der kører på min egen server, med ingen konto, ingen tracking og ingen anden bruger end mig.

Hvad den viser

Fire uafhængige kort:

Hvert kort henter sine egne data uafhængigt af de andre. Er Gmail nede, viser mail-kortet en fejl — og de tre andre kort fungerer stadig. Det er forskellen på et dashboard, der er brugbart de dage noget fejler, og et der ikke er.

Sådan virker det

Browseren taler kun med nginx, som serverer React-appen og videresender API-kald til en FastAPI-backend i containeren ved siden af — ingen CORS-problemer, ingen database. Hver datakilde har sin egen cache med en levetid der afspejler hvor hurtigt data reelt ændrer sig: 30 minutter for vejr, 5 minutter for mail og kalender.

Google-integrationen bruger OAuth 2.0 med to skrivebeskyttede scopes: gmail.readonly og calendar.readonly. Appen kan læse, aldrig sende, slette eller ændre noget.

Det, der var svært

Googles Python-klient og RSS-parseren er begge blokerende. Kaldt direkte i en async-funktion ville de fryse hele serveren, mens de ventede på netværket. De køres derfor i en baggrundstråd, så alle fire kort loader samtidig i stedet for efter tur.

Alle healthchecks fejlede, fordi de pegede på http://localhost — og localhost inde i containeren slår op i IPv6 først, mens serveren kun lyttede på IPv4. Løsningen var at skrive 127.0.0.1 eksplicit. Tog længere at finde end at rette.

Vejrikonerne forsvandt på den lyse baggrund. OpenWeatherMaps egne ikoner er tegnet i blegt gråt til mørke temaer. De er nu tegnet som SVG i sitets egne farver — skarpe på alle skærme, og de tegner selv uden netværk.

Teknikken, kort

Hvad jeg tager med

Det egentlige resultat er ikke koden. Det er, at jeg om morgenen åbner ét ikon i stedet for fire — og at de data, det viser, ligger på en maskine, der står i mit eget hus.