A simulated fruit-fly brain (FlyWire connectome) plays Game Boy games on a 24/7 stream.
Find a file
acamilo 3807fff422 macros: MENU is off the overworld pad, and the way out is the never-empty rule
Rung 10, thirty brain minutes inside the Pewter museum's upper floor (map 0x35):
macro starts MENU 82, BACK 82, GO FRONTIER 8, the event log alternating
`MENU start/done, BACK start/done`. MENU pressed START, the start menu opened,
and that scene's pad is CLOSE / CONFIRM / BACK -- so BACK pressed B and closed it
again. Two buttons that undo each other with nothing else changing, which is
section 12.10's rule one scene wider than a battle, and section 12.2's trap by
definition: a precondition satisfied wherever the fly stands and a macro that
completes without moving.

Nothing in the macro vocabulary uses the start menu for anything, so MENU comes
off scene_set's overworld row entirely rather than being narrowed. It stays a
type, a population, a tag and a script, so the roles, the channel order and
--print-compatibility are untouched, and the fly's raw START still opens the
start menu in macros mode.

MENU was also what made an empty overworld pad impossible. That guarantee moves
to the way out: `ways` gains one last resort for a *room*, the one GO ROUTE has
had outdoors since 13.1, so a map that offers nothing else at all still offers
its door or its staircase -- ignoring the blocked window, because a target the
ledger is resting is still the only place to go. The museum's staircase is a
passage and not an exit, which is why the old tier 3 could not answer for it.

A map with no way out at all is now a genuinely empty pad. No map in Red is
that, it is asserted as the named residual, and game.padEmptyMs reports it.
2026-09-22 08:06:06 +00:00
.forgejo/workflows flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
.github/workflows flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
apps/stage stage(describe): the public repo URL on the card 2026-09-22 02:08:31 +00:00
data/fafb-v783 flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
docs docs: v0.4.3 status 2026-09-22 06:18:44 +00:00
infra Merge fix/loop-20260922T0459: NEXT never on a pad with an input-accepting cursor; MOVE 1 is the main menu backstop; the bag is the fly's turn 2026-09-22 06:18:34 +00:00
packages flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
services macros: MENU is off the overworld pad, and the way out is the never-empty rule 2026-09-22 08:06:06 +00:00
tools flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
.gitignore flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
CLAUDE.md flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
CONTRIBUTING.md flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
LICENSE flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
LICENSES.md flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
Makefile flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
NOTICE flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
package-lock.json flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
package.json flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
README.md flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00
ROM-POLICY.md flybrain v0.4.0: public tree (history retained privately) 2026-09-21 15:09:46 +00:00

flybrain

A simulated fruit-fly brain that plays video games. A connectome-constrained spiking network reads the screen, its population rates become controller inputs, and a scalar reward nudges a bounded set of Kenyon-cell to MBON gains.

The library is @flybrain/brain in packages/brain. It holds the connectome dataset format, the LIF kernel, the plasticity rule, the population-rate readout and the activity-map geometry. It holds no game, no emulator and no reward rules: those belong to whatever embeds it.

Workspace layout

Path Contents
packages/brain the library (@flybrain/brain)
data/fafb-v783 FlyWire-derived browser artifacts (CC BY-NC 4.0)
tools/ the Python builder that regenerates data/ from official Codex exports
docs/ overview, dataset format, model, plasticity, readout, integration, limitations, verification
services/flysim the Rust service: brain, emulator, snapshot feed, control API, checkpoints
apps/ planned: one directory per game demo
infra/ planned: deployment for the 24/7 stream (see docs/streaming-plan.md)

Quick start

npm ci
npm test
npm run typecheck

76 tests, about 7 seconds. There is no build step. npx tsx packages/brain/examples/node-random-frames.ts 60 runs the full 139,255-neuron brain with the Game Boy readout on noise frames in plain Node (about 0.9x Game Boy real time single-threaded on a WSL laptop).

Usage

import { NeuralAgent, gameboyDecoderConfig, toButtonMask } from '@flybrain/brain';
import { loadBrainDatasetFromDir } from '@flybrain/brain/node';

const dataset = await loadBrainDatasetFromDir('data/fafb-v783');
const agent = new NeuralAgent(dataset, { decoder: gameboyDecoderConfig() });
agent.warmup(firstFrame);                        // 2,500 ms with plasticity off, then calibrate

// every emulator frame:
const { active } = agent.tick(framebuffer, {     // RGBA 160x144 by default; any size via config
  rewards: [{ value: 0.5 }],                     // scalar rewards your game adapter detected
  boot: !inGame,                                 // relaxes Start/Select throttling on title screens
});
emulator.setButtons(toButtonMask(active));

const checkpoint = agent.exportState();          // bit-exact resume, validated on import

The lower layers (LifNetwork, RewardModulatedStdp, PopulationDecoder) are exported too for hosts that want to run the loop themselves.

integration.md has the full per-frame loop, the fractional frame timing and the checkpoint contract.

Documentation

  • Overview: the pipeline, the layer map and the design principles.
  • Dataset format: artifacts, CSR layout, weight encoding, every role and its count, fingerprinting, regeneration, license.
  • Model: the 1-ms LIF kernel step by step, every default constant, the retina projection, the RNG, state export and version strings.
  • Plasticity: edge selection, the eligibility and reinforcement equations, statistics, topology hash and the explicit non-claims.
  • Readout: scores, exclusive groups, pulse channels, the blocked-direction cooldown, the Game Boy preset table and checkpoint versions.
  • Integration: what a game must provide, the Pokemon Red integration as a worked example, and a sketch of a platformer adapter.
  • Limitations: what is not claimed, what is unproven, measured throughput.
  • Verification: the oracle-test strategy and what each test file covers.
  • Streaming plan: headless capture, Twitch, VM design and the phased plan for a 24/7 stream.
  • Artifact builder: how to regenerate and verify data/fafb-v783.
  • Data attribution: source, license and citations.

Provenance

The network, plasticity rule, readout, FlyWire pipeline and activity viewer were extracted from the fly-plays-pokemon prototype so several game demos can share one core. The default configuration reproduces that prototype's kernel bit for bit, and verbatim copies of its modules live in packages/brain/tests/legacy/ as oracles. Built with Astra.

Licensing

The data/fafb-v783 artifacts are derived from the FlyWire FAFB public Codex v783 exports and are licensed CC BY-NC 4.0. That is a non-commercial license, so a commercial demo needs a different data source or separate permission. Citations and the list of modifications are in data/fafb-v783/ATTRIBUTION.md.

No license has been chosen for the code in this repository yet.

ROMs and save states never enter this repository.