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.

Einstein-plattan, dess spegelbild och en liten del av mönstret. De spegelvända hattarna utgör 12,7 procent av varje täckning.
Einstein-plattan, dess spegelbild och en liten del av mönstret. De spegelvända hattarna utgör 12,7 procent av varje täckning.

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.

Substitutionsnivå 1 till 4: varje metaplatta ersätts rekursivt av ett kluster av mindre plattor.
Substitutionsnivå 1 till 4: varje metaplatta ersätts rekursivt av ett kluster av mindre plattor.

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.

Geometrin runt en accentplatta i scenfilen: spår, prismor och en svagt självlysande orange hatt.
Geometrin runt en accentplatta i scenfilen: spår, prismor och en svagt självlysande orange hatt.

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.

Terrängen som trådmodell med flygrutten ovanför: 50 terrassnivåer och inga utplattade band.
Terrängen som trådmodell med flygrutten ovanför: 50 terrassnivåer och inga utplattade band.

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.

Koreografin uppifrån: flygrutten, kamerans synfält mot marken och de 19 orangea accenterna längs spåret.
Koreografin uppifrån: flygrutten, kamerans synfält mot marken och de 19 orangea accenterna längs spåret.

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.
Uppbyggnaden av en ljusväg: linssampel, studsar, skuggstrålar mot ljuskällan och dämpning av extremvärden.
Uppbyggnaden av en ljusväg: linssampel, studsar, skuggstrålar mot ljuskällan och dämpning av extremvärden.

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.

Linsmodellen och autofokusen: bländaröppning, fokalplan och medianen av 25 avståndsmätningar i bildens mitt.
Linsmodellen och autofokusen: bländaröppning, fokalplan och medianen av 25 avståndsmätningar i bildens mitt.

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.

FPV-modellens uppbyggnad: styrning, girdynamik, fysik och en fast monterad kamera. Kurvan följer drönaren, inte klockan.
FPV-modellens uppbyggnad: styrning, girdynamik, fysik och en fast monterad kamera. Kurvan följer drönaren, inte klockan.

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.

74 sekunder flygdata: sidglidning, blickens försprång, lutning och fart. Kurvorna liknar data från en riktig drönare eftersom fysiken är densamma.
74 sekunder flygdata: sidglidning, blickens försprång, lutning och fart. Kurvorna liknar data från en riktig drönare eftersom fysiken är densamma.

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.

Scenens uppställning: kamera, medföljande ljuskälla och fokalplan. Hela filmen är ljussatt som ett enda fotografi.
Scenens uppställning: kamera, medföljande ljuskälla och fokalplan. Hela filmen är ljussatt som ett enda fotografi.

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.
En kärna, tre backends: samma ljusberäkning körs på CPU-trådar, CUDA-kärnor eller en Metal-kärna.
En kärna, tre backends: samma ljusberäkning körs på CPU-trådar, CUDA-kärnor eller en Metal-kärna.

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.

Datatratten: 663 miljarder ljusvägar blir 7,8 GB rådata i minnet som landar i en webbfilm på 24 MB.
Datatratten: 663 miljarder ljusvägar blir 7,8 GB rådata i minnet som landar i en webbfilm på 24 MB.

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.

Loopklippet: två extra sekunder mitt i en sväng tonas över i filmens början. Rörelsen döljer skarven.
Loopklippet: två extra sekunder mitt i en sväng tonas över i filmens början. Rörelsen döljer skarven.

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.

Renderingstid per bildruta under natten, samt jämförelsen mellan de tre backendarna.
Renderingstid per bildruta under natten, samt jämförelsen mellan de tre backendarna.

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.

Preview-läget där alla designbeslut togs, ställt bredvid samma ruta i färdig kvalitet.
Preview-läget där alla designbeslut togs, ställt bredvid samma ruta i färdig kvalitet.
Konvergensstegen: samma utsnitt renderat med 4, 16, 64 och 256 ljusvägar per pixel.
Konvergensstegen: samma utsnitt renderat med 4, 16, 64 och 256 ljusvägar per pixel.

Nedan är bildrutor i hög upplösning, tagna från repot med exakt samma renderare och scen som filmen.

Loopens början, samma bildruta som filmens startbild.
Loopens början, samma bildruta som filmens startbild.
S-svängen vid 17 sekunder, där oskärpan gör grovjobbet.
S-svängen vid 17 sekunder, där oskärpan gör grovjobbet.
Planflykt över terrasserna vid 48 sekunder.
Planflykt över terrasserna vid 48 sekunder.
Den hårdaste svängen vid 63 sekunder: 30 graders sidglidning och 10 graders lutning.
Den hårdaste svängen vid 63 sekunder: 30 graders sidglidning och 10 graders lutning.

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:

72 sekunder och 24 MB. Filmen loopar utan synlig skarv.

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.