An experimental 3D shooter engine built around Kof.
Boomer-shooter combat, ARPG structure, authoritative multiplayer and a
fail-closed content pipeline—without a general-purpose engine behind it.
Quick start · Architecture · Dogfood releases · Build and package · Português (Brasil)
Experimental, deliberately. KOOKIE is an engine lab, not a finished game or a general-purpose engine. Claims below are limited to the focused probes, hardware and workloads that produced them.
| If you want to… | Go here |
|---|---|
| Run the current authoritative check | Quick start |
| Download the latest public artifact | Releases |
| Try the current lobby and player screen | Multiplayer lobby and score screen |
| Assess Windows/Linux playable-demo readiness | Demo release readiness |
| Understand the boundaries | Architecture |
| Build, package or run qualification roles | Running and packaging |
| See the evidence and open work | Engine plan and G0 backlog |
| Change the project | Contributing |
| Troubleshoot a browser game report | Bugfeed |
Most engines optimize for broad applicability. KOOKIE optimizes for inspectable authority boundaries and claims that can be reproduced.
Portable engine, game and tool decisions stay in Kof. C owns narrow, explicit platform boundaries: SDL3/SDL_GPU, SDL_mixer, UDP, filesystem durability and measured SIMD dispatch. A feature is not called done because a class or menu exists; it needs an executable path and a stated proof limit.
The result is intentionally opinionated:
- the server decides combat, loot, progression and persistence;
- clients predict presentation-safe movement, then reconcile;
- source assets cross bounded validation and canonicalization before runtime;
- malformed state, packages, saves and compatibility offers fail closed;
- release artifacts bind source and toolchain provenance with signatures.
Packages built from the current tree contain the native Kof game, SDL3, SDL_mixer and the cross-platform update launcher. They require neither the Kof toolchain nor Python:
- Download the target package from the KOOKIE GitHub releases.
- Verify
SHA256SUMSand the detached signatures as described in Running and packaging. - Extract the archive and run the updater:
./kookie-launcherThe launcher fetches the newest published package for Linux or Windows,
verifies its signed manifest and archive digest, updates atomically, and then
starts the game. ./kookie remains the direct local-package wrapper.
The currently public GitHub release is the signed paired
0.1.0-dogfood.63
pre-release with Linux and Windows x86-64 artifacts. The updater selects the
matching target asset.
Install Kof 0.6.6 for the source entrypoint:
The pinned Kof 0.6.6 Linux distribution is the official
kof-0.6.6-linux-x86_64 release at source commit
7c237861a9035d84b1f7ec4cfddd89daef4c6ddd. Its archive SHA-256 is
96dd0d804c02e1e0f066dc0b53a4b1c385595d32820d97aeb77bb5dc772296f6.
scripts/prepare_kof_source.sh verifies the upstream native GC cycle guard and
normalizes compiler metadata when building from source.
Check the immutable release pin with:
KOOKIE_KOF_REF=refs/tags/kof-0.6.6-linux-x86_64 \
python3 scripts/update_kof_lab.py --checkThe repository's scheduled Kof updater still tracks upstream lab; running
scripts/install_kof_lab.sh intentionally adopts that moving development
branch and advances the pin rather than restoring the 0.6.6 release.
git clone https://github.com/rufl/KOOKIE.git
cd KOOKIE
source scripts/kof_pin.sh
kof run src/main.kf --target nativekof run itself does not require Python. Python 3 is currently required by
repository verification, packaging, evidence-validation and rendezvous scripts
such as scripts/verify.sh, scripts/package_kookie.sh and
scripts/kookie_rendezvous.py.
Native SDL presentation requires pkg-config entries for FreeType 2 and
HarfBuzz at build time. The adapter loads the packaged TrueType files, shapes
text with HarfBuzz, rasterizes glyphs with FreeType, and decodes the shipped
SVG mark at runtime; there is no generated font atlas.
Run the focused gameplay and replay path:
bash scripts/verify_interactions.shRun the focused local goose gameplay and multiplayer lobby/score probes:
bash scripts/verify_goose_game.sh
bash scripts/verify_multiplayer_ui.shRun the non-graphical G6 expansion probes:
bash scripts/verify_g6_runtime.shPresentation package builds require SDL 3.4.18, SDL_mixer 3.2.4,
glslc and spirv-val. If pkg-config cannot find SDL_mixer, prepare the
pinned development prefix once:
bash scripts/bootstrap_sdl3_mixer.shThe bootstrap downloads the official SDL_mixer 3.2.4 source archive, verifies
its SHA-256, builds only the bounded WAVE/stb_vorbis backends and stores the
ignored prefix under .kookie-deps. Exact package, kooker, Windows and
cross-host qualification commands live in Running and packaging.
The player entrypoint is the signed package's native update launcher:
kookie-launcher on Linux and kookie-launcher.exe/kookie-launcher.cmd on
Windows. It queries the latest published target package from the KOOKIE GitHub
release API on each normal start, verifies the embedded Ed25519 manifest
signature and archive SHA-256, stages/extracts safely, then launches the game.
It requires neither Kof nor Python. Use --check, --offline or
--self-test for non-launching operation; see
Running and packaging for state paths,
fallback behavior and the focused updater smoke test.
The Kof-owned multiplayer screen keeps the session contract small and
inspectable: fixed two-player admission, host/join/waiting/connected/ready/
failed phases, room identity, bounded player names, peer count, ping display
and visible transport errors. It is a session card, not an unbounded
master-server browser. Gameplay remains locked while either player is not
ready; the READY action is explicit and the session opens only after both
connected players confirm.
During gameplay, Tab toggles a deterministic player screen with player name,
score, health, kills/deaths, ping and live/ready/disconnected status. The host
publishes a checksummed bounded scoreboard snapshot; clients validate the
whole message, reject stale sequences and rank ties by score, kills, deaths
and stable player ID. A displayed -- ping means RTT measurement is not yet
available; it is not a fabricated latency value.
The focused model and staging proof is:
bash scripts/verify_multiplayer_ui.shNative presentation now resolves both animal GLB assets and stages each model's
embedded PNG texture into its own bounded atlas region; model UVs select the
goose or cat region, with procedural material tiles retained only as fallback.
The prototype world atlas also carries all declared particle, flipbook and
predrawn VFX PNGs. VfxParticleRenderer stages bounded camera-facing quads
with atlas-frame animation; the native presentation triggers projectile sparks,
hit/death effects and liquid-transition splashes while retaining procedural VFX
when the optional model/content path is unavailable.
The latest published dogfood artifact is
0.1.0-dogfood.63,
built from source commit 3bd382a072817fe545ae9a80abfd1dd344878ada. For every
new candidate, RELEASE_QUALIFICATION.json is the signed authority:
deterministic artifact gates may pass while target-specific presentation
evidence and publication approval remain required.
Candidate 0.1.0-dogfood.64 uses source commit
e8cad301b566607a3b8095a219d05441de3240e5; Verify passed, but its Windows
self-hosted presentation job is queued because kookie-windows-01 is offline.
It is not public yet.
The current source tree has a bounded player-facing slice:
The player-facing test game is branded GatoGanso. Its bounded native
presentation uses bundled Pixand body text and Jared Lite display text;
the original TTF files and SIL Open Font License notice remain in
assets/fonts.
Playstarts the local authoritative listen-server/client encounter, accepts keyboard and mouse input, runs three goose bots and resets when leaving and enteringPlayagain.- Native gameplay defaults:
WASD/arrow keys move,Spacejumps,Ffires the ranged weapon,Ctrlcrouches, left mouse performs authoritative melee, and right mouse uses the selected special/power-up. Double-tappingW/A/S/Ddashes in that direction; a secondSpacepress performs the stamina-backed double jump, and holding jump while airborne glides. - Roll, dash, double jump and glide share a 100-point stamina bar. Roll costs
25, dash 30, double jump 20 and glide 2 per airborne tick; stamina recovers
by 1 point per fixed tick.
Tabtoggles the scoreboard,Enterconfirms menus, andEscapereturns to the menu. Multiplayer > Host/Joinadmits the second player through the KOF-owned lobby, requires both connected players to selectREADY, and publishes the deterministicTabscoreboard with player, status, score, HP, K/D and ping.- The session path uses fixed-tick input bundles with snapshot/input ACKs,
authenticated peer pinning, a bounded 12-tick hitscan rewind window, six-tick
remote interpolation and prediction-correction metrics. The WAN path remains
best-effort direct IPv4/UDP rather than a QUIC-compatible or production
relay service.
The prototype liquid slice is data-driven:
assets/prototype/runtime/liquid_physics.jsoncontrols underwater movement and O2 rates;runtime/water_bodies/*.jsondefines surface bounds, tint, caustics, toon contrast/opacity and splash timing;runtime/floatables/*.jsonselects per-object buoyancy, density, drag and gravity; andruntime/power_ups/*.jsondefines coffee mugs, jetpacks, megaphones, scuba kits and watermelons with bounded pickup positions, durations and effect values. Native gameplay stages the water marker surfaces, toon splash geometry, floating objects, power-up diamonds and the active power-up HUD panel from those bounded definitions. Coffee mugs increase movement speed, jetpacks increase jump impulse, megaphones increase damage, scuba kits reduce underwater O2 drain and watermelons restore health. The JVM suite covers JSON loading, underwater movement, oxygen recovery, buoyancy, pickup effects and splash expiry; native SDL_GPU presentation remains subject to the host's driver/dependency gate.
The 2026-10-02 GUI pass adds a consistent framed shell, selected-row rails,
screen-specific subtitles, bounded text clipping and explicit keyboard hints
across the main, options, multiplayer, accessibility and Kutter screens. The
main menu now exposes Play, Multiplayer, Options, Accessibility, Kutter
and Quit. Accessibility cycles HUD scale (85%, 100%, 115%), tactical-map
visibility and high-contrast text; scale and map changes apply to the live
presentation without changing fixed vertex budgets. The round upper-right map
keeps the DINX/ZYLVE-inspired flexibility goal without copying either product.
The focused bash scripts/verify_multiplayer_ui.sh probe stages five shell
frames in both JVM and native paths; bash scripts/verify_font_ui.sh covers the
font/title contract; docs/UI_LIBRARY.md documents the
internal Kof/KofJS SVG/PNG, typography and sound-cue facade;
bash scripts/verify_ui_library.sh checks the reusable Kof/KofScript contracts;
bash scripts/verify_ui_sound_catalog.sh checks all 14 native source/digest
publication tuples and the bounded spatial FIFO; and
bash scripts/verify_ui_demo.sh builds the isolated KofJS UI demo and checks
the published asset manifest. The sound-cue adapter keeps .ogg/.wav
descriptor metadata separate from the bounded native queue and applies
registered UI spatial gains in SDL_mixer. The 14 supplied JDSherbert OGG files
remain license-blocked for redistribution until provenance is confirmed.
docs/KOF4J_UI_MIGRATION.md records the current
Kof4j 0.6.6 UI/FFI boundary. The synchronous Buffer(U8) qualification
passes on JVM and native x86-64 with the active pin; cross support remains
unqualified and Buffer(U8) is not a portable typed/asynchronous upload ABI.
bash scripts/verify_package.sh validates the none package profile and
bash scripts/verify_prototype_package.sh validates the prototype profile;
bash scripts/verify_goose_game.sh covers the bounded gameplay path. The
retained G5 Linux x86-64 qualification records the 4 ms/tick timing contract,
30-minute soak, resource plateau and 984-instance renderer batch; it does not
claim arbitrary population, another OS/GPU, WAN scale or streaming.
The latest local paired qualification was built from source commit
69b16d9312ebe6b86c34fda1f665ad1b8665558b:
- Linux
0.1.0-linux-e2e.3, archive SHA-256d35443f514e7a21c3bfd1dadb170c76658944959de37b99084070a9908191cb1. - Windows
0.1.0-windows-e2e.3, archive SHA-256c6d80779f960339752bfa8a5848b515f46827ddfc11a3e3cfd788e5e81dce7f6.
Both passed deterministic duplicate builds, detached signatures, checksums,
safe extraction, and target package qualification. The package manifests
record Kof source bf17ac7e736471c8a04b4153e5b0f607be75e70c; these were
qualification-only artifacts signed with an ephemeral key, not public releases.
The current host cannot close target presentation gates: isolated Linux
presentation exits 124 because DRI3/SDL_GPU is unavailable, and isolated
Wine exits 70 for the same missing SDL_GPU backend. Native Windows hardware
presentation and fresh target-host Play/restart/quit evidence remain open.
The same host measured dedicated-server p95 at 6.9 ms against the declared
4 ms budget; the budget was not relaxed.
| Target | Qualified now | Remaining release evidence |
|---|---|---|
| Linux x86-64 | Deterministic signed package, extraction, package smoke, gameplay/package provenance | Fresh supported-GPU Play/movement/look/fire/damage/restart/quit smoke, screenshot, driver and exit evidence; current host also needs the 4 ms timing gate |
| Windows x86-64 | Deterministic signed PE/SDL/SPIR-V/DXIL package | Native Windows input/audio/GPU/driver presentation smoke and paired release evidence |
The detailed acceptance checklist, release blockers and non-blocking future scope are in Demo release readiness.
| Area | Implemented bounded path |
|---|---|
| Authority and networking | 60 Hz server/client sessions, two-client admission, authenticated compatibility handshake, fixed-tick input bundles with bounded redundancy and ACKs, pinned peer endpoints, 12-tick hitscan rewind, six-tick remote interpolation, prediction/reconciliation metrics, reconnect and replay/tamper rejection; bounded direct-IPv4 WAN rendezvous with best-effort UDP hole punching; Kof-owned lobby and checksummed two-player scoreboard state |
| Player-facing slice | Local Play runs the bounded authoritative goose encounter; Host/Join adds explicit two-player ready gating; Tab exposes the host-authoritative player screen. Fresh clean-tree package smoke and native hardware evidence remain release gates. |
| Shooter and ARPG systems | Hitscan/projectile/shotgun combat, enemy roles, deterministic loot, inventory, equipment, skills, status effects, bosses, rewards and exactly-once progression |
| World and presentation | True 3D authored arena with slopes, steps and stacked rooms; capsule/triangle collision; doors, secrets and exits; semantic HUD; SDL_GPU instancing; positional gain/pan through SDL_mixer |
| Content and kutter tooling | Bounded GLB, Dust3D, Aseprite, VOX, Quake-style brush, Blockbench, PNG, SVG/SVGZ and WAV intake; canonical products; .kpkg validation; transactional Kutter edits; persistent Kutter hierarchy/transform/asset registry |
| Persistence and release | Checksummed replay, schema migrations, crash-durable save publication, signed clean-tree packages, dependency closure and outside-checkout smoke |
| Runtime targets | Authoritative native Linux x86-64; native Windows Kof PE gameplay linked to SDL3/SDL_mixer shell; native Windows Kof PE SDL_GPU presentation with SPIR-V/DXIL products; separate reproducible Windows Kof JVM compatibility package; deterministic reachable Kof-to-AMD64 PE/COFF compiler |
flowchart LR
subgraph KOF["Kof-owned engine and game logic"]
INPUT["Player input"] --> CLIENT["Client prediction"]
CLIENT -->|"sequenced commands"| SERVER["60 Hz authority"]
SERVER --> WORLD["World · combat · loot"]
WORLD --> SAVE["Save + replay"]
SERVER -->|"snapshots + ordered feedback"| CLIENT
SOURCE["Authoring sources"] --> KOOKER["Bounded validate + cook"]
KOOKER --> GENERATION["Canonical package generation"]
GENERATION --> WORLD
CLIENT --> VIEW["Render · audio · UI state"]
end
subgraph NATIVE["Narrow native/platform boundaries"]
TRANSPORT["UDP + filesystem"]
SDL["SDL3 · SDL_GPU · SDL_mixer"]
SIMD["Measured SIMD dispatch"]
end
SERVER <--> TRANSPORT
SAVE <--> TRANSPORT
VIEW --> SDL
WORLD --> SIMD
Kof owns decisions. Native code owns explicit ABI and platform boundaries. Presentation consumes authoritative state; it does not award damage, loot or progression. See Architecture for the full contracts.
These numbers describe exact retained qualification workloads—not general performance claims.
| Evidence | Recorded result | Boundary |
|---|---|---|
| Authoritative session | 60 Hz, host + two clients | Same-host process qualification; G4 also passed across three isolated Linux network namespaces |
| G5 simulation soak | p95 3.202 ms/tick; RSS within 128 KiB after warm-up | 30 minutes on one Linux x86-64 workstation; 64 enemies, 256 projectiles, 512 pickups, 24 lights, 64 effects |
| SDL_GPU reference scene | 984 hardware triangle instances in one draw; p95 submission 0.645 ms | 600 frames at 1920×1080 on recorded Intel Arrow Lake graphics |
| Kof buffer SIMD probe | 64 MiB batch: scalar 233.350 ms, AVX2 1.074 ms | Exact reduction ABI/workload only; not a gameplay-wide speedup claim |
| Release chain | Ed25519-signed archive, manifest and checksum set | Clean source tree, pinned Kof source and verified distribution digest required |
For repeatable CPU and memory evidence across the Kof targets:
python3 scripts/profile_kookie.py --target all --verify \
--output build/kookie-performance-profile.jsonThe profile records compiler wall time, simulation phase p50/p95/p99/max,
RSS/resource plateau, child-process CPU/fault/context-switch counters, JVM GC
events, and perf stat counters when the host grants perf_event access.
Set KOOKIE_VERIFY_PERFORMANCE=1 to add the same bounded gate to
scripts/verify.sh; set KOOKIE_VERIFY_REQUIRE_PERF=1 when hardware counters
are a release requirement. Missing perf is reported explicitly rather than
silently substituting a frame-time claim.
The kooker accepts documented subsets rather than claiming general format compatibility:
GLB · Dust3D · Aseprite · VOX · MAP · Blockbench · PNG · WAV · OGG Vorbis · SVG · SVGZ
It emits bounded canonical geometry/collision, RGBA8 images/atlases, KCHR
characters, fixed-point SVGC vector products, PCM16 audio, byte-preserving
OGG Vorbis tracks and package-ready checksums. Products are reopened and
validated before atomic publication; failed imports keep the prior generation
active.
scripts/kooker.sh cook blockbench character.bbmodel character.kchar
scripts/kooker.sh cook png texture.png texture.rgba.png
scripts/kooker.sh cook wav effect.wav effect.pcm16.wav
scripts/kooker.sh cook ogg theme.ogg theme.canonical.ogg
scripts/kooker.sh cook svg icon.svg icon.svgc
scripts/kooker.sh cook svgz icon.svgz icon.svgcLimits are part of the contract, not temporary documentation omissions. See Additional intake hardening for the production work still open.
- Transport evidence now includes the bounded direct-IPv4 authenticated endpoint and a deterministic fixed-window/retry channel; it is not a fresh three-physical-machine qualification bundle and does not claim NAT traversal, relay service, confidentiality or DDoS resistance.
- Linux x86-64 remains the authoritative native Kof gameplay target. Windows now has qualified native Kof PE gameplay in both the SDL shell and SDL_GPU presentation package; the separate JVM package is compatibility-only. Optional isolated Wine smoke remains environment-gated and target/GPU specific.
- Importers support small, explicit profiles—not arbitrary files from each named format.
- Live reload covers validated scene/render products, not arbitrary Kof code, shaders, editor plugins or unbounded streaming.
- Rich authoring beyond the bounded persistent Kutter, broader OS/GPU coverage, streamed audio, codecs outside the bounded OGG Vorbis/WAVE set, HRTF/EFX and a general-purpose sandboxed extension API remain unfinished.
If a claim lacks a focused test or probe, it is not presented as complete.
| Path | Purpose |
|---|---|
src/ |
Kof-owned engine, game, session, content and UI logic |
native/ |
Narrow SDL, transport, persistence and SIMD adapters |
apps/ |
Packaged server, kooker, SIMD benchmark and platform tools |
probes/ |
Focused executable evidence at risky boundaries |
scripts/ |
Verification, packaging and qualification automation |
docs/ |
Architecture, plans, language notes and research evidence |
- Architecture — authority, data flow and runtime boundaries.
- Engine plan — gate definitions, measurements and deferred scope.
- Running and packaging — developer, release, kooker and qualification commands.
- Kof language notes — syntax, targets, FFI and runtime findings.
- UI library — reusable layout, widgets, typography, assets, icons and sound-cue contracts.
- Kof4j UI/ABI migration — upstream boundary, buffer evidence and contribution path.
- Executed probes — commands, results and proof limits.
- Changelog — recent behavior changes.
- Project memory — current decisions, caveats and next action.
Public documentation is mirrored in Brazilian Portuguese.
Read CONTRIBUTING.md before changing dependencies, authority boundaries or qualification claims. During development, run the smallest focused check that proves the change. The complete gate is:
The gate's package checks require KOOKIE_KOF_ARCHIVE to point to the exact
Kof distribution used by kof, with KOOKIE_KOF_ARCHIVE_SHA256 and
KOOKIE_KOF_SOURCE_COMMIT set to its verified identity.
bash scripts/verify.shGraphical checks must use the repository's reviewed isolated-display contract; never target an active desktop or physical monitor. Security-sensitive findings belong in the private reporting path, not a public issue.
KOOKIE is MIT licensed. Native distributed runtime dependencies are
SDL 3.4.18 and SDL_mixer 3.2.4 under the zlib License. The optional Windows JVM
profile bundles one SHA-256-pinned OpenJDK runtime under its own licenses and
preserves runtime/legal and runtime/NOTICE. Exact sources and boundaries are
recorded in THIRD_PARTY_NOTICES.txt.
The Kof compiler remains an external build tool and is not distributed. Only the explicit Windows JVM profile bundles Java; its provenance records the runtime vendor, version and archive digest.
