Bygde en native meldingsklient for macOS i Swift 6 og SwiftUI — 11 141 linjer fordelt på 53 filer — over C‑grensesnittet til en Rust‑kjerne lenket inn som et statisk arkiv fra en låst revisjon.
Arbeidet utført: august 2026
11,141 linjer Swift over en Rust‑kjerne
Situasjon. Meldingsprotokollen hadde en godt testet kjerne skrevet i Rust og klienter på flere plattformer, men skrivebordsopplevelsen på macOS var et plattformuavhengig skall — det så ikke ut som en Mac‑app, oppførte seg ikke som en, og hadde med seg et kjøretidsmiljø som en native app ikke trenger. Kjernen eksponerer funksjonaliteten sin gjennom et C‑grensesnitt, og det betyr at ethvert språk som kan kalle C, kan bygge på den, og det kan Swift.
Oppgave. En native klient måtte bygges direkte på dette C‑grensesnittet, i plattformens gjeldende språk og gjeldende rammeverk for brukergrensesnitt, med kjernen lenket inn i stedet for levert ved siden av.
Handling. Appen er 11 141 linjer Swift fordelt på femtitre filer i app‑målet, bygd på SwiftUI med kjernen lenket inn som et statisk arkiv kompilert fra en fastlåst oppstrømsrevisjon. Å låse revisjonen i stedet for å følge en gren er beslutningen som gjør byggingen reproduserbar: C‑grensesnittet er kontrakten, og en kjerne i bevegelse endrer kontrakten uten at én linje Swift endres. Lagdelingen holder den usikre flaten liten — en tynn wrapper eier hver peker og hver streng som krysser grensen, modellene over den er vanlige Swift‑verdier, og grensesnittlaget ser aldri en rå peker. Alt C‑grensesnittet returnerer, har en eierskapsregel, og å ta feil av én gir enten en lekkasje eller en krasj uten noen kompilatoradvarsel imellom, så wrapperen er der hele prosjektets minnedisiplin bor. Byggingen drives av en oppgavekjører med femtiseks mål som dekker kompileringen av kjernen, Swift‑byggingen, testsuitene, linterne og pakkingen.
Resultat. En native klient som starter som en Mac‑app, bruker plattformens egne materialer og kontroller og ikke har med seg noen innebygd nettleser. Det som ikke er gjort, bør sies: dette er ikke en levert utgivelse. Det finnes ingen notarisert distribusjon, ingen oppdateringskanal og ett språk i grensesnittet, så det er en fungerende app og ikke et produkt noen andre kjører.
Les videre: Stoppet en applikasjon som fylte minnet med 41 MB i sekundet — registrert 111 GB komprimerte sider på en maskin med 36 GB — ved å begrense hver hendelsesstrøm, abonnere etter hendelsestype og sette et frekvensbudsjett på loggingen, som tok 610 996 logglinjer ned til 1 411. Eller ta en titt på hele porteføljen.
Ett stykke av en lengre oversikt — og den ligger i sin helhet her.
Hver oppføring er skrevet på samme måte: situasjonen, oppgaven, hva vi gjorde, og hva som endret seg.