Gå til hovedindhold
Hjem
GrN.dk

Main navigation

  • Artikler
  • Cases
  • Ydelser
  • Din digitale projektleder
  • Om Greg Nowak
  • Billedgalleri
  • Kontakt
User account menu
  • Log ind

Bliv en del af mit community / gratis nyhedsbrev — tilmeld dig her

Brødkrumme

  1. Hjem
  2. Cases

Lær at skrive thai — ét bogstav ad gangen

Client
GrN.dk — internt projekt
Sector
Læringsapps til børn
Periode
juli 2026

At a glance

abc.grn.dk lærer et barn at skrive et alfabet i stedet for at genkende det: vælg et bogstav, tegn det efter med en finger, og appen scorer den form, du faktisk tegnede, og fortæller dig, hvor tæt på du var. Thai først — alle 44 konsonanter, gratis — med japansk hiragana og katakana bag en premium-gate. Alt sker i browseren: håndskriftsgenkenderen er ren Dart, der kører på enheden, de oplæste bogstavnavne er filer bundtet med appen, og der er ingen konto, ingen backend og ingen reklamer.

44 thai-konsonanter + 92 japanske kana — tegnet efter, ikke tappet på
542 bundtede stemmeklip — ingen afhængighed af en thai-stemme på enheden
98 grønne tests · 16 suiter · guidet strøgrækkefølge shippet aug. 2026

The challenge

De fleste apps, der lover at »lære dig alfabetet«, tester i virkeligheden genkendelse — hør et bogstav, tryk på bogstavet. At skrive er den svære halvdel, og det er den halvdel, en femårig faktisk øver sig på. At bygge det kræver, at man løser et scoringsproblem: bedøm den form, et barn har tegnet, uden at straffe barnet for at tegne strøgene i en anden rækkefølge eller en anden retning — og uden at sende et barns tegninger til en server.

Thai stiller sine egne krav. Der er 44 konsonanter fordelt på tre toneklasser, som den lærende forventes at internalisere, og hver af dem har et navn bygget som et akronym — ก er gor gai, กอ ไก่, »gor som i kylling«. En tidlig version læste navnene op med enhedens egen tekst-til-tale, hvilket fejlede på den oplagte måde: en telefon uden thai-stemme læser navnene på engelsk eller siger ingenting.

Og så er der målgruppen. De første sværhedsgrænser — 60 %, 75 % og 90 % lighed for at bestå — var sat af voksne og viste sig at være alt for strenge for de små hænder, appen er lavet til.

The solution

abc.grn.dk er en Flutter-webapp: 3.176 linjer Dart fordelt på 18 filer og kun tre pakker ud over Flutter selv. Der findes ingen backend på kørselstidspunktet — fremskridt gemmes i browserens localStorage.

At score håndskriften. Genkenderen er en 204 linjer lang, ren Dart-implementering af $P point-cloud recognizer (Vatavu, Anthony & Wobbrock, 2012). Den flader det, barnet tegnede, ud til en uordnet sky af punkter, resampler den til præcis 32 og matcher den mod det ene målbogstav — ikke mod alle 44, for appen ved allerede, hvilket bogstav den bad om. At behandle strøg som en sky frem for en sekvens er det, der gør den uafhængig af rækkefølge og retning — præcis den tilgivelse, en begynder har brug for. Den ærlige pris er nævnt i repoets egen README: en så tilgivende genkender kan ikke lære nogen strøg-rækkefølge. Referenceformerne er bogstavernes centerlinjer, genereret fra fontenes outlines, så en pletskudstegning scorer tæt på nul i afstand; en tilgivelsesbund skaleret efter hvert bogstavs strøgbredde betyder, at federe bogstaver bedømmes en anelse mildere end tynde.

Et spil, ikke en prøve. Et bogstav er ét forsøg. Tegn det, løft fingeren, og det tjekker sig selv — ingen knap at trykke på. Består man, går det selv videre; rammer man forbi, koster det et hjerte, og næste forsøg får mere hjælp: først et tomt lærred, så bogstavets centerlinje som hjælpeprikker, til sidst hele bogstavet svagt nedenunder. Løber man tør for hjerter, tilbydes en blid start-forfra — aldrig en fiaskoskærm. En beståelse i første, hjælpefri forsøg forlænger en stime. Rosen er en blød opadgående klokke, og et forbier er en mild totonelyd — bevidst aldrig en fejlbrummer.

Justeret efter rigtige hænder. Sværhedsgraderne blev redesignet efter brug: Let består nu ved 40 % med 7 hjerter og er standard, Normal ved 60 % og Svær ved 85 %, begge med 5. I stedet for at lade en standard gælde i det skjulte spørger allerførste kørsel den lærende om et valg, og Indstillinger kan ændre det senere. Hjælpeprikkerne fik samme behandling — de placeres ved at gå bogstavets skelet igennem, længste stykke først, og kun beholde en prik, hvis den er et helt skridt fra alle allerede placerede prikker, fordi den tidligere afstand pr. fragment efterlod en synlig klump ved hvert knudepunkt — opdaget på det live site.

Lyd uden at være afhængig af enheden. Bogstavnavnene og effekterne er 542 lydklip genereret på forhånd og bundtet med appen: thai i to stemmer — kvindelig (Premwadee) og mandlig (Niwat) — i tre hastigheder, japansk i én stemme i tre hastigheder, plus de to feedback-toner. Udtalen er derfor identisk på alle telefoner, uanset om der er installeret en thai-stemme, og én Lyd-kontakt slukker det hele.

To skriftsystemer, én form. Japansk ankom som data plus assets, ikke som en app nummer to: 46 hiragana og 46 katakana i gojūon-rækkefølge, deres egne genererede strøgskabeloner og deres egne stemmeklip. Den ene regel, der ikke kan bøjes, er, at den font, et bogstav renderes med, også skal være den font, dets skabeloner blev genereret fra — ellers er den guide, barnet tegner efter, ikke den form, der scores. Thai bruger Noto Sans Thai Looped; kana bruger et subset af Klee One, en skrifttype i skolebogsstil.

Hvad der koster penge — og hvor ærligt. Japansk og en afslappet, u-gamificeret øvetilstand ligger bag et premium-køb pr. bruger; thai forbliver gratis, og der er ingen reklamer nogen steder — »ingen reklamer« er en compile-time-konstant, der refereres alle de steder, en annonceplads plausibelt kunne tilføjes, så intentionen bor i koden og ikke på en politikside. Selve checkoutet er ikke bygget endnu, så den låste tilstand åbner et klart formuleret »kommer snart«-ark i stedet for en knap, der ikke fører nogen steder hen.

Leverancen omfattede pipelinen. Sin egen virtual host og sit eget git-repository, TLS og en poller, der kigger på repositoryet hvert tiende minut: et nyt commit på master bygger web-releasen, stempler git-SHA'en ind i binærfilen, deployer den og purger Cloudflare. Fordi Flutters main.dart.js beholder samme filnavn mellem builds, har domænet også en bypass-cache-regel — purge-by-URL-propagering tabte races mod post-deploy-tjekket. Build-stemplet står på startskærmen (v10.0.0 · 4533787), så enhver, der tester, kan sige præcis, hvilket build de kigger på.

The results

Appen har været live på abc.grn.dk siden 19. juli 2026 og er i skrivende stund v11.3.0 med 98 grønne tests fordelt på 16 suiter — genkenderens kalibrering, spillets regler og skærmnavigationen er alt sammen dækket uden en browser eller en enhed i loopet.

Den er også et konkret eksempel på den leverancemodel, resten af denne portefølje beskriver: hver eneste funktion ankom som et Trello-kort, som en AI-agent samlede op — fra det første tracing-loop over det japanske sæt til sværhedsredesignet — 15 commits mellem 19. og 24. juli 2026, hver især deployet af polleren inden for ti minutter efter push.

Hvad den ikke er, siger den højt. Engelsk står som »kommer snart«, den betalte checkout er ikke bygget, og genkenderen i fri leg forbliver tilgivende med vilje. Begge de ændringer, der betød mest — prikafstanden og sværhedsgrænserne — kom fra at se den live app i brug, ikke fra planen, og det er netop argumentet for at shippe småt og ofte på sit eget domæne.

Opdatering, august 2026. Hullet omkring strøgrækkefølge er lukket: en guidet tilstand animerer nu hvert strøg, kræver, at de tegnes i rækkefølge, og tjekker retningen — bygget på et kurateret sæt kanoniske strøgskabeloner for alle 44 thai-konsonanter, hver verificeret mod et kontrolark, og med genkenderen, der scorer formen pr. akse, så et barns rystede streg bedømmes fair. Guidede strøg ligger bag premium-gaten; fri leg er uændret.

Tegn bogstavet — det tjekker sig selv.

Instruktionslinjen nederst på hver øveskærm

Got a project that needs the same kind of hands-on delivery?

Your digital project manager

Anmeld Greg på Google

Greg Nowak Google-anmeldelser

 

Skriftlige anbefalinger fra Trafik og Veje, Aarhus Kommune (2011) og AgroTech (2010) — læs dem på LinkedIn.

Illustrated infographic summarizing: OpenAI File Search: Interne dokumenter kræver governance, før du kan stole på dem
OpenAI File Search: Interne dokumenter kræver governance, før du kan stole på dem
2026-08-18

OpenAI File Search gør retrieval let at demonstrere, men produktion kræver opryddede dokumenter, metadata, en gennemtænkt vector store-struktur, regler for udløb og omkostningsstyring.

Illustrated infographic summarizing: Fra leverandørfaktura til bogføring: AI med en kontrolpost
Fra leverandørfaktura til bogføring: AI med en kontrolpost
2026-08-18

AI kan lette arbejdet med leverandørfakturaer, men sikker bogføring kræver validering, dubletkontrol, godkendelse og et tydeligt kontrolspor.

Flere artikler
RSS feed

Footer

  • Alle artikler
  • Kontakt

GrN.dk — AI-automatisering, webplatforme, weboptimering, datahåndtering og logistik.

© 2026 GrN.dk · LinkedIn · Kontakt · AI-automatisering på dansk: nowa.dk

Bag GrN.dk: Individual Entrepreneur Codecrafter · Tax ID 305669096 · Bakhtrioni St. 22, 0194 Tbilisi, Georgien · officielt virksomhedsregister