Hero-filmen i C++. Noll rader för hand.
Filmen på vår startsida är ingen stockvideo och ingen WebGL-demo, utan en drönarflygning över ett landskap av riktig aperiodisk matematik. Ljuset är fysikaliskt simulerat stråle för stråle med path tracing, i en renderare som skrevs från grunden i C++ med tre utbytbara backends: CPU, CUDA och Metal.
Matematiken, 3D-världen, renderaren, kamerafysiken och pipelinen designades, skrevs, granskades och renderades under ett enda dygn. Varenda rad kod skrevs av Anthropic Fable 5 i Claude Code. Vi skrev inte en enda rad själva. Så här gick det till.
- Validerade aperiodiska plattor
- 54 289
- Simulerade ljusvägar
- 663 mdr
- Rader C++, noll beroenden
- 1 305
- Bildrutor i 1080²
- 2 220
- Renderingstid på en laptop
- 4 h
- Rader skrivna för hand
- 0
01
Uppdraget
TokenTeks symbol är en hatt. Inte vilken hatt som helst, utan einstein-plattan: den trettonsidiga form som upptäcktes 2023 och som kan täcka ett oändligt plan utan att mönstret någonsin upprepar sig. Eftersom vi bygger skräddarsytt i stället för att använda mallar passar symbolen bra: en enda form som räcker till oändlig variation.
Den nya webbplatsen behövde en bakgrundsfilm till startsidan. Kraven som sattes på morgonen den 10 juli var korta och tydliga:
- Filmen ska bygga på den riktiga matematiken. Inte på en fusktextur eller någon annans demo, utan på substitutionssystemet från forskningsartikeln, validerat till maskinprecision.
- Det ska vara en förrenderad film, inte realtidsgrafik. Ljuset ska simuleras fysikaliskt och skärpedjupet ska komma från en simulerad lins. Målet var att ge filmen samma lugn som ett makrofoto i studio, och helt undvika den plastiga ytan i webbens realtidsgrafik.
- Inga färdiga komponenter. Ingen spelmotor, ingen tredjepartsrenderare, inget köpt material. Allt som syns i bild ska komma från kod i projektets eget repo.
En sak till: det var fredag, och sajten skulle ha sin film.
02
Matematik som aldrig upprepar sig
Arbetet började där varumärket börjar, med själva hatten. Plattan byggs upp av åtta drakfyrhörningar ur det rutnät som uppstår när en hexagon delas i sex delar. Formen kan bara täcka planet aperiodiskt, och den behöver hjälp av sin egen spegelbild för att klara det. Det betyder att en liten andel av plattorna i varje mönster alltid är spegelvända. Detta lilla faktum fick bli hela grundidén. I ett landskap av identiska mörka plattor är de spegelvända undantagen matematiskt unika, och därför är det just de – och bara de – som får lysa upp i orange.
Mönstret skapas av en generator på 373 rader Python som implementerar substitutionssystemet från Craig Kaplans verktyg hatviz. Det enda externa biblioteket är shapely, och det används bara för validering. Fyra metaplattor expanderas rekursivt nivå för nivå. Efter fem nivåer består mönstret av 54 289 hattar. Av dem är 6 912 spegelvända – exakt de 12,7 procent som teorin förutsäger.
Ett mönster är bara användbart om det bevisligen är det riktiga. Därför verifierar generatorn sitt eget resultat efter varje körning:
- Alla plattor har exakt samma area, med ett fel under 10⁻⁹.
- Inga plattor överlappar varandra. (Det största uppmätta överlappet ligger kring 10⁻¹¹.)
- Ytan hänger ihop i ett enda stycke, utan inre hål.
- Andelen spegelvända plattor ligger på teorins 12,7 procent.
Det här bevisar inte aperiodiciteten en gång till, det har forskarna redan gjort. Det visar bara att vår lilla bit av mönstret är en korrekt implementation.
En detalj var nära att slinka igenom: hela mönstret behövde speglas lodrätt. TokenTeks logotyp är nämligen spegelvänd jämfört med hur hatten orienteras i forskningsartikeln. Efter speglingen vänder sig de flesta plattorna åt samma håll som logotypen, medan de sällsynta undantagen fortfarande agerar accentfärg.
03
En värld byggd av ett bevis
Nästa steg förvandlade den validerade matematiken till en 3D-värld. Varje plattas kontur krymps med 0,03 enheter. Det skapar smala spår mellan plattorna där ljuset senare kan fastna. Konturen trianguleras med en metod som klarar hattens inåtbuktande form, och extruderas därefter till ett prisma.
Plattornas höjder blev dygnets bästa påminnelse om att enkelt slår avancerat. Terrängen bygger på fraktalt brus i fyra oktaver med en våglängd på 42 enheter. Höjderna avrundas till 50 fasta terrassnivåer, och plötsligt ser landskapet ut som skulpterade sedimentlager i stället för formlösa kullar. De första försöken formade bruset med golvnivåer, havsnivåer och cosinusfunktioner, men alla resulterade i att något höjdband plattades ut onaturligt. Felen syntes direkt i renderarens preview-läge och ströks på minuter. Den slutliga lösningen krävde bara en enda rad:
# Ren linjär mappning utan formkurva. Golv, havsnivåer och cosinus
# plattar alla ut något höjdband. Linjärt bibehåller lutningen.
h = TERRAIN_AMP * n # n = fraktalbrus utsträckt till 1..99-percentilen
if TERRAIN_STEP > 0:
h = round(h / TERRAIN_STEP) * TERRAIN_STEP
Ovanpå detta får varje platta en egen slumpad höjdjustering på högst 0,03 enheter, så att grannplattor aldrig ligger exakt kloss an mot varandra.
Scenen innehåller bara det kameran hinner se under sin flygning: en remsa på 131 gånger 261 enheter som skurits ut längs rutten. Det första försöket skar bara ut ruttens mittlinje. Det räckte inte, eftersom synfältet kränger ut upp till tolv enheter åt sidan i svängarna, vilket fick mönstrets yttre gräns att dyka upp i bild som svarta kilar. Det var exakt den buggen som den externa modellen GPT 5.6 Sol hittade under en kodgranskning på kvällen. Lösningen blev att utöka mönstret från fyra till fem substitutionsnivåer.
Efter beskärningen återstår 10 127 plattor. Varje platta får ett eget material där ljushet och ytjämnhet varieras slumpmässigt, vilket gör att fältet glittrar diskret i stället för att se ut som en enda gjuten plastskiva.
De orangea accenterna väljs ut med den flugna rutten som facit. Scenbyggaren har en exakt kopia av drönarens flygmodell (porterad rad för rad från C++ och verifierad mot originalet). Med rutten känd letar skriptet upp spegelvända hattar max sju enheter från markspåret, med närmast förtur, och med minst åtta enheters lucka mellan varje accent. Det blev 19 stycken i den färdiga filmen. Kameran flyger rakt över dem, i stället för att låta dem skymta i ögonvrån. Varje accent görs svagt självlysande och renderas i en separat ljusbuffert som i efterbehandlingen skapar det mjuka lavaliknande skenet.
Till slut packas allt i en binärfil på 15,3 MB som renderaren läser in i ett svep: 10 128 material och 374 701 trianglar, ingenting annat.
04
En renderare från en tom fil
Kravet på noll beroenden uteslöt alla existerande motorer, så renderaren skrevs från grunden i C++17. Hela filmens optik ryms i en enda headerfil på 425 rader som kan kompileras rakt av som vanlig C++, som CUDA och som Metal Shading Language.
Det är en klassisk path tracer utan genvägar, stenhårt anpassad för exakt en scen:
- En simulerad lins. Ljusstrålarna utgår från en slumpad punkt på en bländaröppning med radien 0,42. Skärpedjupet uppstår därmed ur geometrin, inte ur ett filter i efterhand. Oskärpan ökar fysikaliskt korrekt med avståndet från fokalplanet.
- En materialmodell med GGX och Lambert. Resultatet är en matt, mörk plast där spårens kanter glimmar till i ljuset.
- Direktsampling av ljuskällan. Varje studs skickar en stråle rakt mot lampan. Det håller de mjuka högdagrarna rena redan vid 256 ljusvägar per pixel, i stället för de runt 2 000 som annars hade krävts.
- Ett BVH-sökträd för geometrin innebär att strålarna bara testas mot en bråkdel av scenens 374 701 trianglar. Det är det som håller uppe farten oavsett hårdvara.
- Högst fem studsar per ljusväg, kombinerat med sannolikhetsbaserad avslutning (Russian roulette) efter två. Extrema ljusvärden dämpas för att slippa brus, men medvetet inte i första studsen. De ljusa bokeh-skivorna är poängen med bilden och får inte tonas ned.
Renderaren är helt deterministisk. Slumptalsgeneratorn får sitt startvärde från bildrutans nummer, pixelns position och beräkningsblockets index. Samma bildruta och pixel ger exakt samma resultat varje gång, vilket betyder att körningen när som helst kan delas upp, avbrytas och återupptas utan att brusmönstret skaver mellan rutorna.
Att flyga en kamera över berg med extremt ljusstark lins medför ett problem: ett fast fokusavstånd är fel nästan överallt. Lösningen är tio rader kod och ett enkelt medianfilter:
// Autofokus: lägg fokalplanet på medianen av avstånden i en liten
// ruta kring bildens mitt. Fast strålmönster utan slump: deterministiskt
// per bildruta, och medianen hoppar inte när en kant passerar mitten.
for (int j = 0; j < 5; ++j)
for (int i = 0; i < 5; ++i)
if (intersectBVH(S, cam.pos, rayThroughGrid(i, j), &hit))
depths.push_back(hit.t * dot(d, cam.fwd));
std::nth_element(depths.begin(), depths.begin() + n/2, depths.end());
cam.focusP = cam.pos + cam.fwd * depths[n/2];
I stället för komplex mätning skickas 25 mätstrålar ut i ett fast rutnät, och fokus läggs på medianen av deras avstånd. Ett medelvärde skulle sticka iväg så fort halva rutnätet drar ner i en dalgång, och slumpade mätstrålar hade fått skärpan att pumpa oroligt. Medianen av ett fast rutnät gör ingetdera: bildens mitt hålls skarp, och bergen glider vilsamt genom fokalplanet som i ett miniatyrlandskap.
Bildrutorna lämnar renderaren som råa linjära ljusvärden. Efter renderingen läggs glöden från accenterna på, bilden tonmappas, och ett diskret brus adderas så att de nästan svarta tonerna överlever komprimeringen utan banding-ränder. Bildströmmen skickas sedan rakt in i ffmpeg: 7,8 GB som passerar genom minnet utan att nudda disken.
05
Kameran som fick lära sig flyga
Kameran var det svåraste att få rätt, och den del som skrevs om flest gånger. Plandokumentet loggar hela resan: först en rak kameraåkning. Därefter en perfekt loopande cirkelbana. Sedan en kamera som följde en utstakad kurva. Alla förkastades samma timme som de kördes, av en enkel anledning: en kamera på räls känns alltid som en kamera på räls, hur mjuk rälsen än är.
Den slutliga kameran är i stället en simulerad FPV-drönare med en actionkamera fast monterad i 45 graders vinkel nedåt. Den styrs av en kedja där varje led påverkar nästa:
// FPV-modell. Autopiloten ber om en acceleration för att följa
// rutten. Drönaren måste först kränga och vrida nosen mot den
// riktningen, och först därefter kan motorkraften ändra farten.
// Rörelsemängden bär genom svängen: vrid först, tryck sedan.
V3 requiredThrust = guideAccel + vel * (1.0f / dragTau);
float targetYaw = atan2(requiredThrust.x, requiredThrust.y);
yawV += (wrapPi(targetYaw - yawS) * wY * wY - 2*zY*wY*yawV) * dt;
V3 bodyF{sin(yawS), cos(yawS), 0}; // nosen, inte rutten
V3 desiredAccel = clampLen(bodyF * thrust - vel * (1/dragTau), accelMax);
accel += clampLen(desiredAccel - accel, jerkMax * dt); // rycktak
Styrningen siktar på en punkt femton enheter längre fram längs en kurva, men kan bara föreslå en ändring. Drönaren måste först vrida nosen mot den riktning där kraften behövs, och det är bara motorns dragkraft i nosens riktning som kan justera farten. Resten hanteras av rörelsemängden.
Filmen ser ut som en riktig drönarfilm eftersom den drivs av samma fysik. I filmens skarpaste sväng pekar drönarens kropp 30,4 grader vid sidan av färdriktningen, medan farten hålls stadig på två enheter per sekund. Kameran blickar in i svängen hela 19,9 grader innan flygbanan faktiskt byter riktning. Det är just den förväntansfulla inblicken som separerar FPV från räls. Horisonten lutar som mest 10,6 grader, vilket styrs helt av sidoaccelerationen och inte av någon konstlad bildjustering i efterhand.
En detalj är avgörande för helheten: flygsimuleringen körs från scratch för varje bildruta. Det låter dyrt men tar bara några mikrosekunder per frame, småpotatis jämfört med sekunder av ljusberäkning. Fördelen är att kameran saknar dolda tillstånd, den har ingen förberäknad bana, och det är totalt omöjligt att hamna ur synk.
06
En studio som reser med
Ljussättningen består av en varmvit rektangulär ljuspanel på 60 gånger 54 enheter och ett svagt himmelsljus. Tricket är att panelen följer med kameran: alltid 24 enheter till höger, 36 framför och 39 ovanför. Genom hela flygningen är marken upplyst som ett enda gigantiskt studiostilleben. Det är detta som osynliggör loopens skarv och bygger det stilla lugnet, trots att en hel bergskedja forsar förbi i oskärpan.
07
En kärna, tre sorters kisel
Runt 18-tiden insåg vi att CPU-renderaren skulle behöva ett dygn – tid vi inte hade. Lösningen blev en gemensam kärna. Koden kan kompileras rakt av som C++17, CUDA eller Metal Shading Language. Ljusberäkning, optik och material är skrivet en enda gång.
#if defined(__METAL_VERSION__)
#define HD inline // funktionskvalificerare
#define DEV device // adressrymd för GPU-minne
#define THR thread // trådlokal adressrymd för referenser
typedef uint u32; typedef ulong u64;
HD float xsqrt(float v) { return metal::sqrt(v); }
#else // vanlig C++ / CUDA
#define HD __host__ __device__ inline
#define DEV
#define THR
HD float xsqrt(float v) { return sqrtf(v); }
#endif
Priset vi betalade för portabiliteten var några makron för adressrymd och ett par matematikfunktioner. Resterande kod per plattform var obetydlig:
| Backend | Fil | Rader | Finessen |
|---|---|---|---|
| CPU | main.cpp | 44 | En arbetskö som sprider ut bildens rader över 16 kärnor. |
| CUDA | cuda_main.cu | 90 | Klyver arbetet i korta pass så att Windows inte tror att GPU:n har hängt sig. |
| Metal | metal_main.mm | 136 | GPU-kärnan kompileras blixtsnabbt direkt vid uppstart. |
Vi jämförde maskinerna och fann dem visuellt identiska. Metal renderade en bildruta på cirka 6,5 sekunder, mot CPU:ns 38,6. Med de marginalerna gick det bra att starta rendertåget till kvällen.
08
En pipeline som tål Ctrl-C
Ett enda bash-skript körde hela flödet: rendering, mellanlagring, loopklippning och utbakning av färdig video. Två arkitekturbeslut höll ihop bygget:
Segmenten fungerar som en cache. Renderingen plockades ut i filsegment om 60 bildrutor. Om processen tvingades dö fortsatte nästa körning på det senast färdiga segmentet. I värsta fall gick sex minuters GPU-tid förlorad.
Fingeravtrycket togs på innehållet. Cachenyckeln byggde på innehållet i exakt det som kunde förändra en pixel. Varken filnamn eller tidsstämplar räknades. Scenfilens form, upplösningen och sha-summan av renderingsbinären vävdes samman till ett kryptografiskt fingeravtryck:
# Fingeravtrycket tas på innehållet i allt som kan påverka en pixel:
# scenen, konfigurationen och renderarbinärens exakta bytes.
FP=$({ cat scene.bin config.txt
print -r -- "$S $SPP $FRAMES $SEG ${TRACER:t}"
cat -- "$TRACER" } | cksum | tr ' ' '_')
Så fort man touchade logiken sprack hashen, och pipelinen kunde omöjligt råka slå ihop nya rutor med gamla renderingar. Det var därför autopiloten tryggt kunde byggas om klockan 20:36 och rendertåget lämna perrongen klockan 23:32.
Filmen loopar var 72:a sekund. Cirkelbanan hade löst loopen gratis, men fimpades som sagt för att den var för artificiell. I stället skapade vi ett medvetet enkelt loopklipp: två extra sekunders sväng överlappar och cross-fadas mitt i början av filmen, där kameran svänger aktivt. Rörelsen sminkar över klippet. Ögat får inga fasta landmärken att hänga upp lögnerna på. Dessutom börjar filmen alltid på en ren och knivskarp startbild när besökaren laddar sidan.
09
Rendernatten
Sista commiten rullades in 23:32. Renderskriptet drog igång Metal, och datorn fick tugga sig igenom 663 miljarder ljusvägar under natten: 2 220 bildrutor i 1080×1080 med 256 ljusvägar per pixel och max fem studsar vardera.
Renderingstiderna talar för sig själva. De blixtsnabba rutorna ser ner mot marken. De tunga partierna är s-svängen, där bergen drar sig tätt inpå linsen och fyller utsikterna med massiv oskärpa: strålarna sprids i en enorm kon och fler ljusstudsar får leva vidare till slutet. Snittet hamnade på 6,49 sekunder och laptopen blev klar fyra timmar senare. 03:41 låg startbilden på disken.
Art direction gjordes däremot 500 gånger snabbare. All regi baserades på ett preview-läge som växlade över till en knivskarp pinhole-kamera, en endaste ljusväg per pixel, och ingen tyngre skuggning. Det var i det bruset alla rutter sattes.
Nedan är bildrutor i hög upplösning, tagna från repot med exakt samma renderare och scen som filmen.
10
Dygnet i gitloggen
Tiderna är hämtade ur loggen, från den 10 juli 2026:
| Tid | Händelse |
|---|---|
| 11:42 | Första commit: mönstergenerator, scenbyggare, CPU-renderare och de första bildrutorna |
| 12:01 | Cirkelbana testas och rullas tillbaka |
| 12:01 till 16:21 | Art direction: färgskala låses, bländare 0,42 väljs |
| 16:21 | FPV-kamera längs kurva och snabbt preview-läge implementerat |
| 17:34 | Första flygningen godkänns genom snabba preview-renderingar |
| 17:59 | CUDA-version |
| 18:33 | Metal slås ihop med CUDA och CPU till gemensam kärna |
| 18:49 | Renderskriptet cachar mellanlagringar och auto-väljer backend |
| 19:24 | AI-kodgranskningen från GPT 5.6 Sol åtgärdas: utökat mönster |
| 19:43 | Autofokus med deterministiskt 25-punkters medianfilter |
| 20:36 | Autopiloten uppdateras till slutlig fysik med inblick |
| 23:32 | Startskottet för natten |
| 03:41 | Startbilden renderas klart (4 timmar GPU-tid) |
Här är filmen som snurrar bakom startsidans rubrik:
11
Därför räckte ett dygn
Att hinna formulera matematiken, C++-optiken och FPV-fysiken på ett enda dygn berodde på tre saker.
Snabba beslut. All art direction sattes på nolltid utifrån snabba preview-renderingar. Ingenting revs upp. Terrängen illustrerar det bäst: sex avancerade kurvor prövades och plattades ut, den linjära lösningen segrade. Snabba veton slår långsam konsensus.
Ett agentiskt arbetssätt. Vi skrev inte en rad kod. Anthropic Fable 5 i Claude Code gjorde all tunglyftning, från arkitekturen i path tracern till navigeringen av C++-minne och FPV-svängar. Plandokumentet agerade single source of truth för människa och agenter. Att låta en AI granska en annan är standard hos oss, och i det här fallet utfördes granskningarna av OpenAI:s GPT 5.6 Sol, som hittade och rättade flera logiska fällor innan vi hann lida av dem.
Stenhård determinism. Allt styrs av konfiguration i ren text, seedad logik och cachar länkade till innehållets identitet. Varken kameran eller renderaren beror på historiken. Just därför vågade vi bygga om grundläggande logik fyra gånger om, trygga i att allt var deterministiskt reproducerbart.
Hela projektet stannade på 373 rader Python, 551 rader scenlogik och 1 305 rader C++. TokenTek fick sin bakgrundsfilm. Att den råkade vara ett validerat matematiskt bevis kom på köpet.
Det är exakt så vi utvecklar för våra kunder, fast då brukar det handla om dataflöden i stället för simulerade drönare över aperiodiska plattor. Målen är tydliga, besluten går snabbt, och AI-agenter skriver varenda rad.
Substitutionsreglerna är porterade från Craig S. Kaplans hatviz (BSD-3-Clause). Plattan kommer ur artikeln "An aperiodic monotile" av Smith, Myers, Kaplan och Goodman-Strauss, 2023. Allt annat i projektet, generatorn, renderaren, kameran och pipelinen, skrevs från grunden den 10 juli 2026.
Agentisk utveckling i praktiken
Samma arbetssätt som byggde filmen använder vi för produktionssystem hos våra kunder: tydliga mål, snabba beslut och AI-agenter som skriver koden. Hör av er om ni vill diskutera hur ni kan arbeta på samma sätt.