DesktopFly is een innovatieve macOS-applicatie die een virtuele 3D-fruitvlieg op het bureaublad simuleert. In plaats van traditionele scripting, wordt het gedrag van de vlieg aangestuurd door een spiking simulation van het FlyWire-connectoom, gebaseerd op echte neuronale data van de Drosophila.
Belangrijkste kenmerken:
- Biologische basis: Het programma maakt gebruik van 23.210 neuron-posities en een circuit van 668 neuronen (waaronder de Giant Fibers) om realistisch gedrag zoals ontsnappen, poetsen en lopen te genereren via een 1 kHz leaky-integrate-and-fire (LIF) simulatie.
- Interactie met macOS: De vlieg is volledig geïntegreerd in de macOS-omgeving. Hij landt op de randen van vensters, reageert op cursorbewegingen (looming), voelt trillingen bij het typen en volgt een circadian ritme waarbij hij 's nachts slaapt.
- Visualisatie en controle: De software bevat een interactief breinvenster waarin de neurale activiteit zichtbaar is. Gebruikers kunnen specifieke hersengebieden stimuleren om direct gedrag, zoals ontsnappen of poetsen, uit te lokken.
- Technische vereisten: Het project is geschreven in Swift voor macOS 13+ en is beschikbaar als open-source via GitHub.
DesktopFly <0xF0><0x9F><0xAA><0xB0>
Het breinvenster
Het programma bevat een venster dat het brein van de vlieg visualiseert. Dit bevat 23.210 echte neuron-soma-posities uit FlyWire v783, waarbij live spikes flitsen op de locaties van de neuronen. De twee gloeiende gele markeringen zijn de Giant Fibers: de neuronen die het ontsnappingscommando aansturen. Door op een willekeurige regio te klikken, kan deze worden gestimuleerd.
Wat is gebaseerd op echte data?
Neuronale posities en simulatie
Er worden 23.210 neuron-soma-posities (van de 139.255 in FlyWire v783) gebruikt om het roterende breinvenster te renderen, gekleurd op basis van superklasse (de grove celtype-groepering van FlyWire).
Een circuit van 668 neuronen met circa 19.000 echte synaptische verbindingen (synapsenaantallen, getekend op basis van neurotransmitter-voorspelling) draait als een 1 kHz leaky-integrate-and-fire (LIF) simulatie. Dit circuit bestaat uit:
- LC4 (104) + LPLC2 (210): visuele neuronen voor looming-detectie (naderende objecten).
- DNp01 / Giant Fiber (GF) (2): het ontsnappingsneuron.
- DNa01 + DNa02 (4): stuurneuronen.
- DNp09 (2): neuronen voor voorwaarts lopen.
- DNg11 (6): neuronen voor poetsen.
- MDN (4): neuronen voor achterwaarts lopen ("moonwalker").
- DNp02/DNp04/DNp11 (6): neuronen voor ontsnappingsmanoeuvres (vleugels).
- Partnerneuronen: hun 330 sterkste partners, inclusief ascenderende (proprioceptieve) en sensorische (wind) neuronen.
Het ontsnappingsmechanisme
Ontsnapping is niet gescript. De benadering van de cursor wordt vertaald naar looming-input voor de echte LC4/LPLC2-cellen. De vlieg vliegt pas op wanneer de Giant Fiber daadwerkelijk vuurt via zijn echte synapsen. Ongeveer 1.200 synapsen van feedforward-inhibitie werken dit tegen, wat verklaart waarom langzame benaderingen worden getolereerd, terwijl snelle uitvallen leiden tot ontsnapping in circa 4 ms, net als bij het echte dier.
Het lichaam
Het lichaam zelf is procedureel gegenereerd, aangezien FlyWire een connectoom van het brein is en geen lichaamsgeometrie bevat. Het lichaam beschikt over een tripod gait (driepootgang), zichtbare vleugelslag, vlieghoogte-schaling en specifieke houdingen voor poetsen en slapen.
Installatie
Vereisten:
- macOS 13+
- Xcode Command Line Tools (Swift 5.9+)
Er zijn geen speciale permissies of entitlements nodig; alle sensorische input (cursor, vensterframes, klikken-als-tikken, thermische status) is permissievrij.
git clone https://github.com/DenisSergeevitch/desktop-fly.git
cd desktop-fly
./build.sh
./DesktopFly
Er verschijnt een <0xF0><0x9F><0xAA><0xB0>-icoon in de menubalk; via dit menu kan het programma worden afgesloten. De vlieg beweegt zich over het bureaublad op een transparante, click-through overlay, waardoor hij muis- of toetsenbordinvoer nooit blokkeert.
Bediening (menubalk <0xF0><0x9F><0xAA><0xB0>)
| Item | Effect |
| Pause / Resume | De wereld bevriezen |
| Show/Hide Brain | Het live breinvenster tonen of verbergen |
| Escape Test (loom) | Een looming-stimulus injecteren en de GF zien vuren |
| Move to Next Display | De vlieg naar een ander scherm verplaatsen (zichtbaar bij >1 scherm) |
| Add / Remove Fly | Extra vliegen toevoegen (alleen vlieg #1 heeft het breinvenster) |
| Scare Flies | Alle vliegen laten schrikken |
Het breinvenster is interactief: het zweven met de muis pauzeert de rotatie; klikken op een regio stimuleert "optogenetisch" de circa 60 dichtstbijzijnde circuitneuronen gedurende 400 ms. De reactie van de vlieg is afhankelijk van wat het echte netwerk stroomafwaarts doet:
- Klik op de Giant Fiber → de vlieg ontsnapt.
- Klik op DNg11 → de vlieg poetst zichzelf.
- Klik op de DNa01/02 van één zijde → de vlieg draait.
Hoe echte neuronen het lichaam aansturen
| Lichaamsgedrag | Aangedreven door |
| Ontsnapping / opvliegen | DNp01 giant fiber spike |
| Lopen vs. rust, loopsnelheid | DNp09 rate |
| Sturen | DNa01+DNa02 links-rechts rate verschil |
| Poetsen | DNg11 rate |
| Achterwaarts schuiven | MDN burst |
| Nerveuze, schokkerige bewegingen | LC4/LPLC2 population rate |
| Vleugelslag-intensiteit, dreigende vleugelstand | DNp02/04/11 rate |
| Spontaan opvliegen | Whole-population arousal |
De lus is ook gesloten van lichaam naar brein: het ritme van de gang voedt de echte ascenderende (proprioceptieve) neuronen van het circuit in fase met de poten, en snelle cursorbewegingen stimuleren de sensorische (wind) partners.
Ecologie op het bureaublad
De vlieg maakt gebruik van permissievrije macOS-sensoren:
- Vensterterrein: De bovenranden van vensters fungeren als richels. De vlieg landt erop, loopt erlangs, rijdt mee op een venster dat je versleept en schrikt wanneer een venster onder zijn poten verdwijnt.
- Venster-looming: Een venster dat plotseling verschijnt in de buurt van de vlieg voedt het looming-pad; het circuit beslist vervolgens of de vlieg voor je dialoogvensters moet vluchten.
- Interacties: Kliks worden gezien als tikken op het substraat; klikken naast de vlieg doet hem schrikken via het wind → GF-pad. Typen wordt geregistreerd als vibratie (via de idle-time API — het systeem weet dát er toetsen worden ingedrukt, maar nooit welke).
- Circadiaans ritme: Activiteitspieken bij zonsopgang en zonsondergang, een middagsiesta en rust in de nacht. Wanneer de computer 's nachts inactief is, slaapt de vlieg, ademt hij langzaam en is de arousal-drempel verhoogd. Na het ontwaken poetst de vlieg zichzelf.
- Temperatuur: Vliegen zijn ectothermen — een warme Mac zorgt voor een snellere vlieg.
Data regenereren
De map data/ bevat compacte afgeleide bestanden. Om deze opnieuw op te bouwen vanuit de ruwe FlyWire Codex-dumps (download van circa 60 MB):
mkdir -p /tmp/flywire && cd /tmp/flywire
B=https://storage.googleapis.com/flywire-data/codex/data/fafb/783
curl -O "$B/classification.csv.gz" -O "$B/coordinates.csv.gz" \
-O "$B/connections.csv.gz" -O "$B/consolidated_cell_types.csv.gz"
cd - && python3 etl.py /tmp/flywire
Diagnostiek
De volgende commando's kunnen worden gebruikt voor tests:
./DesktopFly --simtest: Controleert circuit-invarianten (bijv. GF is stil in rust, 4 ms looming latentie).
./DesktopFly --behaviortest: Voert 17 end-to-end checks uit (stimuleer neuronen → lichaam reageert).
./DesktopFly --snapshot f.png: Maakt een offscreen render van de vlieg.
./DesktopFly --brainshot b.png: Maakt een offscreen render van het brein.
Wat is gemodelleerd versus gemeten
Ter transparantie: het connectoom geeft de bedrading, niet de fysiologie. De LIF-dynamiek, de tekens van neurotransmitters (ACh+, GABA−, Glu−), de gap-junction boost op LC → GF en wind → GF (gedocumenteerde elektrische koppeling), synaptische vertragingen en de sensorische transductie (cursor → looming-waarde) zijn standaard modelleringskeuzes die over de echte graaf zijn gelegd. Alles stroomafwaarts van de sensorische neuronen — wie met wie verbonden is en hoe sterk — is FlyWire-data.
Licentie & citatie
De code is gelicentieerd onder MIT. De bestanden in data/ zijn afgeleid van FlyWire (FAFB v783) en vallen onder CC BY-NC 4.0 (zie data/DATA_LICENSE.md).
Bij gebruik van dit project dient u de volgende bronnen te citeren:
DesktopFly <0xF0><0x9F><0xAA><0xB0>
Het breinvenster
Het programma bevat een venster dat het brein van de vlieg visualiseert. Dit bevat 23.210 echte neuron-soma-posities uit FlyWire v783, waarbij live spikes flitsen op de locaties van de neuronen. De twee gloeiende gele markeringen zijn de Giant Fibers: de neuronen die het ontsnappingscommando aansturen. Door op een willekeurige regio te klikken, kan deze worden gestimuleerd.
Wat is gebaseerd op echte data?
Neuronale posities en simulatie
Er worden 23.210 neuron-soma-posities (van de 139.255 in FlyWire v783) gebruikt om het roterende breinvenster te renderen, gekleurd op basis van superklasse (de grove celtype-groepering van FlyWire).
Een circuit van 668 neuronen met circa 19.000 echte synaptische verbindingen (synapsenaantallen, getekend op basis van neurotransmitter-voorspelling) draait als een 1 kHz leaky-integrate-and-fire (LIF) simulatie. Dit circuit bestaat uit:
- LC4 (104) + LPLC2 (210): visuele neuronen voor looming-detectie (naderende objecten).
- DNp01 / Giant Fiber (GF) (2): het ontsnappingsneuron.
- DNa01 + DNa02 (4): stuurneuronen.
- DNp09 (2): neuronen voor voorwaarts lopen.
- DNg11 (6): neuronen voor poetsen.
- MDN (4): neuronen voor achterwaarts lopen ("moonwalker").
- DNp02/DNp04/DNp11 (6): neuronen voor ontsnappingsmanoeuvres (vleugels).
- Partnerneuronen: hun 330 sterkste partners, inclusief ascenderende (proprioceptieve) en sensorische (wind) neuronen.
Het ontsnappingsmechanisme
Ontsnapping is niet gescript. De benadering van de cursor wordt vertaald naar looming-input voor de echte LC4/LPLC2-cellen. De vlieg vliegt pas op wanneer de Giant Fiber daadwerkelijk vuurt via zijn echte synapsen. Ongeveer 1.200 synapsen van feedforward-inhibitie werken dit tegen, wat verklaart waarom langzame benaderingen worden getolereerd, terwijl snelle uitvallen leiden tot ontsnapping in circa 4 ms, net als bij het echte dier.
Het lichaam
Het lichaam zelf is procedureel gegenereerd, aangezien FlyWire een connectoom van het brein is en geen lichaamsgeometrie bevat. Het lichaam beschikt over een tripod gait (driepootgang), zichtbare vleugelslag, vlieghoogte-schaling en specifieke houdingen voor poetsen en slapen.
Installatie
Vereisten:
- macOS 13+
- Xcode Command Line Tools (Swift 5.9+)
Er zijn geen speciale permissies of entitlements nodig; alle sensorische input (cursor, vensterframes, klikken-als-tikken, thermische status) is permissievrij.
git clone https://github.com/DenisSergeevitch/desktop-fly.git
cd desktop-fly
./build.sh
./DesktopFly
Er verschijnt een <0xF0><0x9F><0xAA><0xB0>-icoon in de menubalk; via dit menu kan het programma worden afgesloten. De vlieg beweegt zich over het bureaublad op een transparante, click-through overlay, waardoor hij muis- of toetsenbordinvoer nooit blokkeert.
Bediening (menubalk <0xF0><0x9F><0xAA><0xB0>)
| Item | Effect |
| Pause / Resume | De wereld bevriezen |
| Show/Hide Brain | Het live breinvenster tonen of verbergen |
| Escape Test (loom) | Een looming-stimulus injecteren en de GF zien vuren |
| Move to Next Display | De vlieg naar een ander scherm verplaatsen (zichtbaar bij >1 scherm) |
| Add / Remove Fly | Extra vliegen toevoegen (alleen vlieg #1 heeft het breinvenster) |
| Scare Flies | Alle vliegen laten schrikken |
Het breinvenster is interactief: het zweven met de muis pauzeert de rotatie; klikken op een regio stimuleert "optogenetisch" de circa 60 dichtstbijzijnde circuitneuronen gedurende 400 ms. De reactie van de vlieg is afhankelijk van wat het echte netwerk stroomafwaarts doet:
- Klik op de Giant Fiber → de vlieg ontsnapt.
- Klik op DNg11 → de vlieg poetst zichzelf.
- Klik op de DNa01/02 van één zijde → de vlieg draait.
Hoe echte neuronen het lichaam aansturen
| Lichaamsgedrag | Aangedreven door |
| Ontsnapping / opvliegen | DNp01 giant fiber spike |
| Lopen vs. rust, loopsnelheid | DNp09 rate |
| Sturen | DNa01+DNa02 links-rechts rate verschil |
| Poetsen | DNg11 rate |
| Achterwaarts schuiven | MDN burst |
| Nerveuze, schokkerige bewegingen | LC4/LPLC2 population rate |
| Vleugelslag-intensiteit, dreigende vleugelstand | DNp02/04/11 rate |
| Spontaan opvliegen | Whole-population arousal |
De lus is ook gesloten van lichaam naar brein: het ritme van de gang voedt de echte ascenderende (proprioceptieve) neuronen van het circuit in fase met de poten, en snelle cursorbewegingen stimuleren de sensorische (wind) partners.
Ecologie op het bureaublad
De vlieg maakt gebruik van permissievrije macOS-sensoren:
- Vensterterrein: De bovenranden van vensters fungeren als richels. De vlieg landt erop, loopt erlangs, rijdt mee op een venster dat je versleept en schrikt wanneer een venster onder zijn poten verdwijnt.
- Venster-looming: Een venster dat plotseling verschijnt in de buurt van de vlieg voedt het looming-pad; het circuit beslist vervolgens of de vlieg voor je dialoogvensters moet vluchten.
- Interacties: Kliks worden gezien als tikken op het substraat; klikken naast de vlieg doet hem schrikken via het wind → GF-pad. Typen wordt geregistreerd als vibratie (via de idle-time API — het systeem weet dát er toetsen worden ingedrukt, maar nooit welke).
- Circadiaans ritme: Activiteitspieken bij zonsopgang en zonsondergang, een middagsiesta en rust in de nacht. Wanneer de computer 's nachts inactief is, slaapt de vlieg, ademt hij langzaam en is de arousal-drempel verhoogd. Na het ontwaken poetst de vlieg zichzelf.
- Temperatuur: Vliegen zijn ectothermen — een warme Mac zorgt voor een snellere vlieg.
Data regenereren
De map data/ bevat compacte afgeleide bestanden. Om deze opnieuw op te bouwen vanuit de ruwe FlyWire Codex-dumps (download van circa 60 MB):
mkdir -p /tmp/flywire && cd /tmp/flywire
B=https://storage.googleapis.com/flywire-data/codex/data/fafb/783
curl -O "$B/classification.csv.gz" -O "$B/coordinates.csv.gz" \
-O "$B/connections.csv.gz" -O "$B/consolidated_cell_types.csv.gz"
cd - && python3 etl.py /tmp/flywire
Diagnostiek
De volgende commando's kunnen worden gebruikt voor tests:
./DesktopFly --simtest: Controleert circuit-invarianten (bijv. GF is stil in rust, 4 ms looming latentie).
./DesktopFly --behaviortest: Voert 17 end-to-end checks uit (stimuleer neuronen → lichaam reageert).
./DesktopFly --snapshot f.png: Maakt een offscreen render van de vlieg.
./DesktopFly --brainshot b.png: Maakt een offscreen render van het brein.
Wat is gemodelleerd versus gemeten
Ter transparantie: het connectoom geeft de bedrading, niet de fysiologie. De LIF-dynamiek, de tekens van neurotransmitters (ACh+, GABA−, Glu−), de gap-junction boost op LC → GF en wind → GF (gedocumenteerde elektrische koppeling), synaptische vertragingen en de sensorische transductie (cursor → looming-waarde) zijn standaard modelleringskeuzes die over de echte graaf zijn gelegd. Alles stroomafwaarts van de sensorische neuronen — wie met wie verbonden is en hoe sterk — is FlyWire-data.
Licentie & citatie
De code is gelicentieerd onder MIT. De bestanden in data/ zijn afgeleid van FlyWire (FAFB v783) en vallen onder CC BY-NC 4.0 (zie data/DATA_LICENSE.md).
Bij gebruik van dit project dient u de volgende bronnen te citeren: