kletos.dev Systems worth the call
© 2026 Kletos Dev
kletos klay · tos

Systems worth the call

Relevancethe right thing to build, not the most
Integritystraight answers and honest tradeoffs
Collaborationbuilt together, not in a silo
Excellencedone properly, not just done
RETIN gameplay
01

retin.app

A browser space shooter. WASM physics, multithreaded AI squadrons, WebGPU rendering — 60fps, no install.

WEBASSEMBLY · WEBGPU · ASSEMBLYSCRIPT
Fly it

Requires a WebGPU enabled browser, such as Chrome.

the breakdown

A space shooter that runs in a tab.

Follow a link and you're in a match in about a second — but behind that is a real-time physics simulation, a few hundred enemy ships each running their own AI, and a WebGPU renderer holding 60 frames a second.

60fps at 700 ships
700ships + 2k debris
9WASM kernels
10AI archetypes

How it plays

Momentum flight and one honest goal: last as long as you can and run the score up.

Player ship steering and weavingMovement

Mouse to steer, wheel to throttle, space to brake. Momentum-based, so a hard turn costs speed and overshoot is real.

Enemy ships closing inEnemies

You're rarely fighting one ship. Bots hear your gunfire and converge, and squads coordinate their approach.

Lives and score

The DESTROYED screenThree lives

Spend all three and you get the DESTROYED screen — level, time, kills, streak, and score for the run. Then respawn.

Score climbingHigh score

Kills feed a combo multiplier, and score doubles as your level — so the better you do, the tougher the ships that come.

Ten archetypes, three tiers, one director

The enemies aren't one behaviour with a difficulty dial. They have temperaments, they group up, and something above them paces the fight.

Each bot is one of ten archetypes — snipers hold range, berserkers boost in and don't break off, defenders shield whatever they're escorting — over three skill tiers. Close in, they form squads, take anchor / flanker / rusher roles, and focus your weakest side. Named rivals persist in IndexedDB and return harder; the toughest become Aces that read your strafe bias and preferred range. A director walks between probe, assault, encircle, and withdraw to keep the pressure moving.

HUNTERSNIPERBERSERKERAMBUSHERCOWARDGRINDEROPPORTUNISTSHADOWDEFENDERZEALOT

One gun, doubled

You fly with a single weapon. The upgrade you earn by surviving — and lose the moment you slip.

The Pulsar is a single high-damage bolt that rewards aim over spray. Clear every tenth level and you're granted double bullets — two shots at once. It doubles as armor: the next lethal hit spends the double instead of killing you, dropping you back to a single stream; reach the next decade and you earn it back.

Pulsarone high-damage bolt
Every 10 levelsdouble bullets — two at once
Fatal hitlose the double, not a life

Score is the only currency — and it's also your level, on a quadratic curve that scales enemy skill as you climb. Roughly once a minute a boss surfaces: 5,000 hit points, six tentacles.

No engine, just the browser's fast paths

No game framework. The load-bearing parts are hand-written across WebAssembly, Web Workers, and WebGPU, tied together by a shared block of memory.

WEBASSEMBLYWEBGPUASSEMBLYSCRIPTWEB WORKERSSHAREDARRAYBUFFERAUDIOWORKLETINDEXEDDBVITE

The main thread does very little — input, HUD, and pushing draw commands to WebGPU. A game worker owns the simulation, and a pool of AI workers each reason about a slice of the fleet in parallel. That split is what lets the frame budget survive several hundred live ships; even audio is a WASM synth in an AudioWorklet, off the main thread.

Game workerPhysics, collision, scoring
AI poolFleet reasoning in parallel
RenderWebGPU, triple-buffered

Near-native speed, no garbage collector

JavaScript is quick until you ask it to grind millions of floating-point operations a second over big arrays. Then the GC and dynamic types cost you frames.

At a few hundred ships the per-frame work — physics, collisions, flocking, target scans — is a tight numeric loop over large typed arrays, and an unlucky GC pause becomes a dropped frame. So the hot paths are written in AssemblyScript and compiled ahead of time into nine WebAssembly modules: predictable machine code, manual memory, no collector to stall on. Collision and perception share an 8,192-bucket spatial hash to keep proximity queries near O(1), and the physics kernel is fused — gravity, damping, and border forces in one pass, crossing the JS↔WASM boundary once a frame.

COLLISIONAI-SCANBOIDSSHIP-PHYSICSSHIP-PHYSICS-FUSEDGRAVITYDEBRISPROJECTILE-TARGETAUDIO-SYNTH

One block of memory, every thread

Splitting the AI across workers only helps if the threads can see the world without shipping it back and forth.

Workers normally communicate with postMessage, which structured-clones — copies — everything it sends. Copying a few hundred ships from the simulation thread to the AI threads every frame would burn the whole budget on serialization. A SharedArrayBuffer avoids it: it's one region of memory mapped into every worker at once, so the AI threads read the exact array the game worker writes. A bot checking a target's position is a single indexed load, not a round trip.

One array, read by every thread

Each ship is a fixed stride of 33 floats. The game worker writes those slots; the AI workers read the very same ones — no message, no copy.

Game workerwrites each ship's slots every frame
writes
SharedArrayBuffer · Float32Arrayone ship = 33 floats
x
y
vx
vy
hp
·
role
·
altX
altY
·
reads
AI workers ×Nread the same memory — ships[i·33 + k]
hot — written every framecold — synced every ~30

The budget holds

5.2msphysics / frame
0.4msrender / frame
0.03msAI / frame
60fps, held

Measured at 700 ships and two thousand debris fragments. The whole AI layer — perception, flocking, rivals, squads, the adaptive Aces — costs about 0.03ms a frame, against a 1.5ms budget. That headroom is what keeps everything locked at 60fps.

retin.app

Go fly it.

Fly it

Requires a WebGPU enabled browser, such as Chrome.

mermr.io website
02

mermr.io

A memorization app. Record yourself reading a passage, then play it back and speak along until it's yours. iOS, late 2026.

IOS · AUDIO
Coming to iOS · Late 2026

Words worth keeping.

Record yourself reading a passage aloud. Play it back in quiet moments and speak along, until the passage lives inside you, not in your phone.

Murmur, folded into memory

mermr — the low, practiced voice you use to turn words over until they are yours.

Long before print, psalms and stories and laws lived in the mouths of people: recited, handed down, remembered. Memorization wasn't a trick — it was how meaning stayed close. mermr is that habit, in your pocket.

Record. Repeat. Remember.

Recordread the passage in your own voice
Repeatplay it back and speak along
Remembermark it memorized when it sticks

Play back your own recording and say the words along with it. When the passage comes back to you without help, mark it memorized. No tricks — just your voice and repetition until it's yours.

A library, and a quiet place to practice

mermr library of passagesLibrary

Folders of passages, memorized or still learning.

mermr Bible passage pickerPassages

A built-in Bible — pick any book…

mermr chapter pickerChapter

…then the chapter and verses.

mermr practice screenPractice

Your recording, a scrub bar, and a loop.

Your voice, on your device

There's nothing to listen to but you — no app voice, no stock recording. You hear the pace you chose and the emphasis you found.

WEB AUDIOINDEXEDDBSPEECH RECOGNITIONREACTOFFLINE

Recordings are captured with the Web Audio API and stored on-device in IndexedDB — they never leave your phone. Optional speech recognition lines the words up with the audio, and the whole thing works offline.

mermr.io

Words, kept.

Memorize it