Projektstatus: That's My Dash
Senest opdateret: 2. august 2026 Aktuel version: 0.8.1 Projektansvarlig og rettighedshaver: Weiglin 2026 Licens: MIT
Formål
Dette er projektets korte overdragelsesdokument. Det skal læses sammen med README.md, CHANGELOG.md, docs/DEVELOPMENT.md, docs/ACCESSIBILITY.md og den seneste frigivelsesaudit, før kode ændres.
Ved modstrid gælder den aktuelle kildekode og databaseskemaet som teknisk virkelighed. Bindende produktbeslutninger nedenfor må ikke ændres uden en udtrykkelig ny beslutning fra projektansvarlig.
Produktet
That's My Dash er en personlig, internetbaseret startside til flere brugere. Hver bruger har sin egen profil og egne data. Applikationen er skrevet i PHP, bruger SQLite og skal kunne installeres på et almindeligt webhotel uden MySQL, kommandolinje eller manuel databaseimport.
Beslutninger, der skal bevares
- Produktnavnet er That's My Dash. Browserfanens HTML-titel er præcis dette
- SQLite er den eneste lokale database. Der må ikke indføres et MySQL-krav.
- Eksisterende databaser opgraderes additivt. Brugeren udfører aldrig SQL
- Flere brugere har hver sin profil. Private data må ikke kunne ses eller
- Alle skrivende handlinger bruger POST, CSRF-kontrol, validering og
- Lyst og mørkt tema skal understøttes på alle sider.
- WCAG 2.2 niveau AA er det tekniske mål. Musetræk må aldrig være den eneste
- Brugergrænsefladen leveres på dansk, engelsk, tysk, fransk, spansk, polsk,
- Sprogfiler kan tilpasses og udvides uden programændringer. Lokale
- Brugervejledningen findes på alle medfølgende sprog og åbnes fra sidefoden.
- Sidefoden viser version, © Weiglin 2026 og kort MIT-licensinformation.
- Eksterne RSS-, iCal- og vejradresser hentes serverside med HTTPS,
- Google Kalender er valgfri. Den lokale kalender fungerer uden Googlekonto.
- PWA og notifikationer er valgfrie og må ikke være nødvendige for normal brug.
navn på alle sider.
manuelt. Ved opgradering bevares config.php og hele storage-mappen.
ændres af andre brugere. Administratorfunktioner kræver administratorrolle.
ejerskabskontrol.
måde at flytte indhold på.
russisk og forenklet kinesisk. Engelsk er sikkerhedssprog.
tilpasninger i storage/languages skal overleve opgraderinger.
størrelses- og tidsgrænser samt beskyttelse mod interne netværksadresser.
Funktioner i 0.8.1
- Indbyggede søgemaskiner samt op til to personlige søgemaskiner.
- Favoritkasser med egne overskrifter, links, ikoner, prioritering, rækkefølge,
- Aktuelle opgaver med deadline, noter, afslutning, hurtig oprettelse og
- Flere noter, søgning, fastgørelse og frigørelse uden sletning.
- Lokal kalender, skrivebeskyttet iCal og valgfri Google Kalender. Aftalens
- Vejr fra valgt by eller enhedens position med metriske eller amerikanske
- Flere RSS-kilder, test før lagring, ligelig kildefordeling, nyhedsside og
- Modulstyring med vis, skjul, flyt op, flyt ned og kompakt visning.
- Separat systemtjek med status, forståelige fejl, seneste vellykkede
- Personlig backup og import, profil, adgangskodeskift, brugeradministration og
visning og kompakt tilstand.
valgfrie adviseringer.
kilde markeres med både tekst og farve.
enheder.
valgfri ticker med hastighed og pause. På mobil bruges RSS-listen.
opdatering og mulighed for at prøve igen.
installerbar PWA med offline-side.
Bevidste afgrænsninger
- iCal-aftaler er skrivebeskyttede.
- Google kræver administratorens OAuth-opsætning og brugerens Googlekonto.
- Eksterne datakilder kan fejle uden at applikationen er defekt.
- Noter er almindelig tekst og må ikke bruges til adgangskoder.
- Automatisk test kan ikke alene dokumentere fuld WCAG-overholdelse.
- Oversættelserne er kontekstreviderede, men ikke godkendt af professionelle
modersmålskorrekturlæsere.
Sikkerheds- og datakrav
- PHP 8.2 eller nyere og HTTPS.
publicbør være dokumentrod.config.php,storageog databasen må ikke- Adgangskoder hashes med PHP's passwordfunktioner.
- Kalenderhemmeligheder, Google Client Secret og tokens krypteres med
- Private data må ikke skrives til browser- eller service-worker-cache.
- Import valideres og må ikke importere adgangskoder eller kalenderhemmeligheder.
- Brugerfejl er forståelige; tekniske detaljer logges uden hemmeligheder.
kunne downloades.
installationens app_key.
Kontrol før hver frigivelse
- Kør
php tools/quality-check.phpmedpdo_sqlite. - Kontrollér PHP-, JavaScript- og JSON-syntaks.
- Kør
node tools/i18n-check.js. Alle sprog skal have fuld dækning og - Test ren installation og opgradering af en kopi af en eksisterende database.
- Test brugeradskillelse, roller og alle funktioner nævnt ovenfor.
- Test lyst og mørkt tema, mobil, desktop samt lange og tomme tekster.
- Gennemfør tastatur-, skærmlæser-, zoom-, reflow- og kontrastkontrollerne i
- Kontrollér HTML-titlen That's My Dash på alle sider.
- Opdatér
VERSION, ændringslog, README, denne fil og relevant audit. - Pak uden
config.php, database, cache og installationsdata, og offentliggør
uændrede tekniske pladsholdere.
docs/ACCESSIBILITY.md.
pakkens SHA-256-fingeraftryk.
Kendte opfølgningspunkter
- Den manuelle WCAG-test skal dokumenteres på den installerede version med
- Oversættelser bør senere korrekturlæses af frivillige modersmålstalende uden
- Nye funktioner skal prioriteres mod enkelhed. Startsiden skal ikke udvikle
mindst NVDA eller VoiceOver.
at ændre tekniske pladsholdere.
sig til et komplet projektstyrings- eller notesystem.
Tekst til en ny udviklingssamtale
Vedhæft den seneste ZIP-pakke og skriv:
Vi fortsætter udviklingen af That's My Dash. Den vedhæftede ZIP er det eneste
tekniske udgangspunkt. Pak den ud, og læs
docs/PROJECT_STATUS.md,
README.md,CHANGELOG.md,docs/DEVELOPMENT.mdog
docs/ACCESSIBILITY.md, før du ændrer noget. Bevar eksisterende funktioner,
SQLite-data, sprogsystem, tilgængelighed og opgraderingsmulighed. Kontrollér
ændringerne og dokumentér kendte begrænsninger.
Beskriv derefter den ønskede ændring og vedhæft eventuelle skærmbilleder. En ny udvikler må ikke antage, at tidligere mundtlige beslutninger er kendt, hvis de ikke står i pakken.
Udvikling
Teknisk grundlag
- PHP 8.2 eller nyere
- SQLite
- Moderne HTML, CSS og JavaScript uden frontend-framework
- Progressiv forbedring: centrale redigeringsfunktioner virker uden JavaScript
Struktur
public/
index.php Kort frontcontroller, logout og login
api.php Same-origin endpoints til kalender, RSS, vejr og ikoner
install.php Browserbaseret installationsguide
assets/ CSS og JavaScript
src/
actions.php OAuth-ruter og autoriserede ændringer
page_context.php Læseforespørgsler og data til visningen
bootstrap.php Session, database, sikkerhedsheaders og fælles funktioner
http.php Sikre, cachede HTTPS-kald
view.php Præsentations- og formateringshjælpere
views/
app.php Fælles HTML, navigation og valg af sideskabelon
license.php Offentlig, selvstændig licensside
pages/ Én skabelon pr. side
storage/
startside.sqlite Brugerdata, oprettes ved installation
cache/ Genskabelige cachefiler
Requestforløb
Efter login udfører public/index.php tre trin i fast rækkefølge:
src/actions.phphåndterer OAuth og eventuelle POST-handlinger.src/page_context.phpindlæser de data, som den aktuelle side kan bruge.views/app.phpvælger en sideskabelon fra en fast, intern liste.
Filer under views må ikke udføre ændringer i databasen. Nye POST-handlinger skal placeres i src/actions.php, beskyttes af den fælles CSRF-kontrol og begrænse brugerdata med den aktuelle brugers id.
Skabeloner arver kun de variabler, som frontcontrollerens inkluderede filer har forberedt. Al brugerleveret tekst skal fortsat escapes med e().
Koderegler
- Brug
declare(strict_types=1)i alle PHP-filer - Følg PSR-12 for ny PHP-kode, hvor PHP/HTML-skabeloner tillader det
- Brug parameteriserede PDO-forespørgsler
- Medtag altid brugerens id i forespørgsler, der ændrer brugerdata
- Escape al brugerdata med
e()ved HTML-output - Tillad ikke brugerleveret HTML
- Alle ændringer skal kunne betjenes med tastatur
- Brug native HTML før ARIA
- Kommentér årsagen til usædvanlig kode, ikke det indlysende
- Bevar bagudkompatibilitet med eksisterende SQLite-databaser
- Databaseændringer skal være additive og idempotente
JavaScript
JavaScript bruges som progressiv forbedring til:
- søgning
- dynamisk kalender, RSS og vejr
- favicon-reserve
- deadlineadvis
- fokus på formularbeskeder
Indstillinger, favoritter, RSS-administration og opgaver må ikke kræve JavaScript for at kunne gemmes.
Undgå at indsætte brugerdata med innerHTML. Brug textContent og DOM-metoder. Statiske HTML-fragmenter må bruges, når de udelukkende består af kode, som projektet selv kontrollerer.
Eksterne kald
Alle eksterne kald går gennem src/http.php.
- Kun HTTPS
- Private og reserverede IP-adresser afvises
- Redirects valideres enkeltvis
- Maksimal svartid og svarstørrelse er begrænset
- Svar caches lokalt
Browseren kontakter derfor ikke RSS-kilder, kalenderudbydere eller favicon-tjenesten direkte.
Personlige søgemaskiner er den bevidste undtagelse: Efter et direkte brugerklik åbner browseren den valgte HTTPS-søgeadresse med et URL-kodet søgeord. Skabelonen valideres af valid_search_template() før lagring og må indeholde {query} præcis én gang.
Før en ændring afleveres
- Kør
php tools/quality-check.php - Kontrollér PHP-syntaks
- Kontrollér JavaScript-syntaks
- Test både ny installation og opdatering af en eksisterende database
- Test lyst og mørkt tema
- Test mobilvisning
- Gennemfør den relevante del af
ACCESSIBILITY.md - Opdatér
CHANGELOG.md,README.mdogVERSION
Open source og licens
Projektet er udgivet under MIT-licensen. Alle kopier og væsentlige dele af programmet skal derfor indeholde copyrightmeddelelsen og licensteksten fra LICENSE.
Bidragydere bør dokumentere større ændringer i CHANGELOG.md og undgå at tilføje kode, skrifter, ikoner eller andre aktiver med en uforenelig licens.
Tilgængelighed
Målsætning
That's My Dash udvikles med WCAG 2.2 niveau AA som teknisk mål.
For danske offentlige websteder er den harmoniserede europæiske standard EN 301 549 v3.2.1 central. Standardens webkrav henviser til WCAG 2.1. Ved at arbejde efter WCAG 2.2 AA dækkes WCAG 2.1-kravene samtidig, og de nyere succeskriterier indarbejdes i produktet.
Officielle referencer:
Tilgængelighed er ikke en engangstest. Nye funktioner og designændringer skal vurderes efter de fire WCAG-principper:
- Opfattelig
- Anvendelig
- Forståelig
- Robust
Hvad koden understøtter
- Semantiske HTML-elementer og en logisk overskriftsstruktur
- Korrekt sidesprog og et stabilt produktnavn i browserfanen; hver sides
- Spring til hovedindhold
- Fuld betjening med tastatur
- Synlig tastaturfokus i lyst og mørkt tema
- Tilstrækkeligt store betjeningsmål
- Formularnavne, hjælpetekster og tekstbaserede fejlbeskeder
- Aktuel side markeret med
aria-current - Valgt søgemaskine markeret med
aria-pressed - Dynamiske moduler med
aria-liveogaria-busy - Vigtige deadlinebeskeder med live-region
- Dekorative SVG-ikoner skjult for hjælpemidler
- Understøttelse af
prefers-reduced-motion - Grundlæggende understøttelse af Windows High Contrast/forced colors
- Funktionel serverbaseret redigering uden JavaScript
emne fremgår af dens synlige <h1>
Ingen automatisk overensstemmelseserklæring
Projektet må ikke markedsføres som fuldt WCAG-konformt alene på baggrund af koden eller et automatisk testværktøj. En overensstemmelsesvurdering gælder den konkrete installation, det konkrete indhold og de anvendte tredjepartskilder.
Før en offentlig lancering skal installationen som minimum gennemgå nedenstående manuelle test.
Manuel test før udgivelse
Tastatur
- Gennemgå alle sider med Tab og Shift+Tab
- Kontrollér, at fokus altid er synligt
- Kontrollér alle knapper, links, formularer og
detailsmed Enter og Space - Kontrollér at springlinket flytter fokus til hovedindholdet
- Kontrollér at fokus ikke bliver fanget
Skærmlæser
Test mindst:
- NVDA med seneste Firefox eller Chrome på Windows
- VoiceOver med Safari på iPhone eller macOS
Kontrollér overskrifter, landmærker, formularnavne, fejlbeskeder, deadlineadvis, vejr, kalender, RSS, personlige søgemaskiner og licenssiden.
Forstørrelse og reflow
- 200 procent browserzoom
- 400 procent browserzoom ved 1280 CSS-pixels
- 320 CSS-pixels bred visning
- Større tekst og brugerdefineret tekstafstand
- Ingen tabt information eller vandret rulning i hovedindholdet
Farver
- Lyst tema
- Mørkt tema
- Windows High Contrast
- Information må ikke være afhængig af farve alene
- Tekst og betjeningskomponenter skal kontrastmåles
Indhold og fejl
- Tomme moduler
- Lange navne, links, opgaver og RSS-overskrifter
- Ugyldige formularfelter
- Ugyldig søgeskabelon og testsøgning i nyt vindue
- Udløbet session
- Manglende vejr-, kalender- og RSS-forbindelse
- Afvist tilladelse til geografisk placering
Automatiske værktøjer
Automatiske værktøjer kan bruges som supplement:
- axe DevTools
- Accessibility Insights for Web
- Lighthouse Accessibility
- W3C HTML Validator
Et automatisk værktøj kan ikke teste blandt andet forståelighed, meningsfuld læserækkefølge, gode linktekster eller hele tastaturoplevelsen.
Vedligeholdelse
Alle fejl, som forhindrer brug med tastatur eller hjælpemidler, behandles som funktionelle fejl og ikke som kosmetiske forbedringer.
Ved open source-udgivelse bør projektet have:
- en offentlig metode til indberetning af tilgængelighedsproblemer
- dokumenteret browser- og hjælpemiddelunderstøttelse
- en tilgængelighedserklæring for den konkrete demonstrationsinstallation
- et fast regressionstjek ved hver udgivelse
Filen ACCESSIBILITY_STATEMENT_TEMPLATE.md kan bruges som udgangspunkt, men skal tilpasses den konkrete installation og de regler, som gælder for ejeren.
Sprog og oversættelser
That's My Dash bruger en lille filbaseret sprogmotor uden Composer-afhængigheder. De medfølgende kataloger ligger i languages/ og er almindelige JSON-filer.
Sprog i version 0.8.1
| Kode | Sprog |
|---|---|
da |
Dansk |
en |
Engelsk |
de |
Tysk |
fr |
Fransk |
es |
Spansk |
pl |
Polsk |
ru |
Russisk |
zh-CN |
Forenklet kinesisk |
Engelsk er altid sikkerhedssprog. Mangler en nøgle i det valgte katalog, forsøger sprogmotoren først en.json. Den danske kildetekst bruges kun som sidste nødudvej, hvis også den engelske post mangler.
Katalogformat
{
"_meta": {
"code": "en",
"name": "English",
"native_name": "English",
"direction": "ltr"
},
"messages": {
"Gem": "Save"
}
}
Danske kildetekster fungerer som stabile meddelelses-id'er. Brugerindhold må aldrig sendes gennem tr(). Dynamiske værdier indsættes med navngivne pladsholdere:
tr("Vejret i :place", ["place" => $place]);
Pladsholderens navn må ikke oversættes. :place, {query} og tilsvarende tekniske markører skal være identiske i kilde og oversættelse.
Lokale tilpasninger
En installation kan overskrive enkelte tekster i storage/languages/<kode>.json. Sprogmotoren fletter filen oven på den medfølgende sprogpakke. Eksempel:
{
"messages": {
"Startside": "Min portal"
}
}
Filer i storage/languages hører til installationens data og må ikke overskrives ved en opgradering.
Tilføj et nyt sprog
- Kopiér
languages/en.jsontil en ny JSON-fil. - Ret metadata, herunder sprogkode og sprogets eget navn.
- Oversæt værdierne i
messages. Nøglerne må ikke ændres. - Bevar alle navngivne pladsholdere uændret.
- Kør
node tools/i18n-check.js. - Test login, dashboard, formularer, fejlbeskeder, kalender, vejr og mobilvisning.
Sprogfiler med højre mod venstre-skrift kan bruge "direction": "rtl". Layoutet angiver automatisk dokumentets dir, men en ny RTL-pakke kræver stadig en visuel gennemgang.
Udviklerkontrol
node tools/i18n-sync.js føjer nye danske, bogstavelige nøgler til languages/da.json. Værktøjet oversætter ikke noget.
node tools/i18n-check.js kontrollerer, at alle registrerede nøgler findes i alle kataloger. Kontrollen dækker også serverbeskeder, installerens tekster og den lille ordbog, der sendes til JavaScript.
En automatisk dækningskontrol kan ikke vurdere sproglig kvalitet. Nye eller ændrede oversættelser skal derfor læses i sammenhæng og testes i grænsefladen.