Two people chat. An AI reads each message and turns it into seven numbers. Those numbers drive real neurons in a fruit fly's brain, and the activity spreads through the fly's real synapses. You watch it happen in 3D, and at the end you get a verdict that says which of your messages caused which neurons and connections to fire.
The wiring diagram comes from the MaleCNS v1.0 connectome (Janelia FlyEM), the complete map of a male fruit fly's central nervous system: about 166,000 neurons. We use a 1,350-cell subgraph with 50,158 real synaptic connections, built around the pC1 courtship hub (the cells that keep a male fly in a courtship state) and its strongest real partners. Neuron identities, neurotransmitter predictions and synaptic connections come from the dataset. The 3D view preserves the relative neuron positions from the dataset. Thin links show a selection of real connections, while travelling dots show simulated activity.
| Role | Cells in our subgraph |
|---|---|
| context | 1050 |
| brake | 28 |
| input | 112 |
| accumulator | 156 |
| output | 4 |
Each message is scored on seven qualities. Each quality drives a real input population that feeds the courtship hub. This mapping is our modelling choice; the populations and their wiring are real.
| Message quality | Drives real neurons | Kind |
|---|---|---|
| warmth (opposed by tension) | mAL_m1 | GABAergic brake |
| reciprocity (opposed by tension) | mAL_m8 | GABAergic brake |
| humor | AVLP732m + AVLP733m | cholinergic input |
| curiosity | LC16 (visual) | cholinergic input |
| disclosure | LH003m | cholinergic input |
| energy | FLA001m | cholinergic input |
| reciprocity | AN08B020 | cholinergic input |
The two mAL populations are GABAergic: they act as a brake on the hub. Warmth and reciprocity release the brake (disinhibition); tension tightens it. So friction genuinely works against chemistry in the circuit.
Each neuron's activity is updated with a leaky, thresholded rule. Because the rule is applied neuron by neuron, the result can be split exactly into per-message contributions that add up to the true state. A connection is credited to the message that drove its sending neuron. That's how the verdict can say "message 4 was responsible for these neurons and these connections", and the numbers always add up.
Messages are analysed by free-tier language models. Each model has its own rate limits, so Fly//Flirt tries an ordered chain (groq:qwen/qwen3.8-27b → groq:openai/gpt-oss-20b → groq:openai/gpt-oss-120b → groq:allam-2-7b) and skips any model that is cooling down or near its daily quota. If every model is unavailable, a built-in local scorer takes over instantly, so the chat and the brain never stop. Your cockpit tells you when the local scorer was used.