{
 "about": "things sissi has built, pinned first, then in her order (roughly newest first). html: projects.html",
 "intro": "those layers, interfaces, experiences, feverdreams, fun, and space i created",
 "projects": [
  {
   "id": "maglev",
   "name": "maglev",
   "pinned": true,
   "tagline": "where we think different about manufacturing.",
   "at": [],
   "with": [],
   "from": null,
   "to": null,
   "links": {
    "site": "https://trymaglev.com",
    "x": "https://x.com/try_maglev",
    "linkedin": "https://www.linkedin.com/company/trymaglev/"
   },
   "icon": "images/logos/maglev.svg",
   "when": "",
   "media": []
  },
  {
   "id": "joint-tuner",
   "name": "joint tuner",
   "at": [
    {
     "name": "fireworks: deploy",
     "url": "https://hackersquad.io/events/fireworks-deploy-with-microsoft-nvidia",
     "icon": "images/logos/fireworks-deploy.png"
    }
   ],
   "with": [],
   "note": "first place overall",
   "from": "2026-11",
   "to": null,
   "links": {
    "site": "https://hackersquad.io/events/fireworks-deploy-with-microsoft-nvidia/projects/cmvzxs0l500fqmq234snnlfi8",
    "github": "https://github.com/sissississi-013/joint-tuner",
    "video": "https://www.youtube.com/watch?v=9skZ6BVLDDo",
    "linkedin": "https://www.linkedin.com/feed/update/urn:li:activity:7524384660718571520/"
   },
   "sponsors": [
    {
     "name": "fireworks",
     "url": "https://fireworks.ai",
     "icon": "images/logos/fireworks-mark.svg"
    },
    {
     "name": "microsoft",
     "url": "https://www.microsoft.com",
     "icon": "images/logos/microsoft.svg"
    },
    {
     "name": "nvidia",
     "url": "https://www.nvidia.com",
     "icon": "images/logos/nvidia.png"
    }
   ],
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "note_shine": true,
   "site_host": {
    "name": "hackersquad",
    "icon": "images/logos/hackersquad.png"
   },
   "when": "nov 2026",
   "media": [
    {
     "src": "images/projects/joint-tuner/first-place.jpg",
     "alt": "sissi on stage holding up a giant check next to the host with a microphone: fireworks: deploy, first place, $10,000, pay to the order of joint tuner, november 02, 2026, san francisco, with the fireworks, microsoft, nvidia and hacker//squad logos along the bottom",
     "caption": "first place, $10,000, fireworks: deploy, san francisco."
    },
    {
     "src": "images/projects/joint-tuner/live-demo-still.jpg",
     "alt": "the live demo on youtube, \"sissi wang - joint tuner | fireworks: deploy with microsoft & nvidia\", 5 minutes 4 seconds, from hackersquad. the still shows joint tuner's title slide (github.com/sissississi-013/joint-tuner, trained on fireworks, benchmarked vs gpt-6.1 terra) beside the fireworks: deploy card and a small camera view of sissi presenting at a lectern",
     "caption": "the live demo on stage, on hackersquad's youtube (5:04).",
     "type": "embed",
     "embed": "https://www.youtube-nocookie.com/embed/9skZ6BVLDDo"
    },
    {
     "src": "images/projects/joint-tuner/demo.mp4",
     "alt": "the 1 minute 49 second demo, narrated by sissi with subtitles: why tuning robot joints by hand is slow, the tuning race in mujoco, the leaderboard, how fine-tuning on fireworks helped, and joint tuner on an actuator, a robot arm, a humanoid ankle and a drone",
     "caption": "the demo, with my voice (1:49).",
     "type": "video",
     "poster": "images/projects/joint-tuner/demo-poster.jpg"
    },
    {
     "src": "images/projects/joint-tuner/mujoco-wrist.mp4",
     "alt": "three copies of one robot wrist joint in mujoco, each tuned by a different method at 4x speed. the optimizer alone needs 493 step tests, gpt-6.1 terra gets it right on its first test after 23 seconds of thinking, and joint tuner gets it right on its 5th test",
     "caption": "a race on one wrist joint. the classic optimizer needs 493 physical tests, gpt-6.1 terra gets it on the 1st after 23 s of thinking, joint tuner on the 5th, in about a second each.",
     "type": "video"
    },
    {
     "src": "images/projects/joint-tuner/actuator.mp4",
     "alt": "a motor and gearbox actuator in mujoco, its orange output shaft driven by joint tuner's gains, with the step response settling inside the spec",
     "caption": "a motor + gearbox. the orange output shaft runs joint tuner's gains in mujoco and settles inside the spec. real time.",
     "type": "video"
    },
    {
     "src": "images/projects/joint-tuner/robot-arm-elbow.mp4",
     "alt": "a robot arm in mujoco with its orange elbow joint driven by joint tuner's gains, meeting its spec",
     "caption": "a robot arm's elbow, driven by joint tuner's gains, meeting its spec. 37x speed.",
     "type": "video"
    },
    {
     "src": "images/projects/joint-tuner/humanoid-ankle.mp4",
     "alt": "a humanoid in mujoco whose orange ankle joint is unstable on its own and is held steady by joint tuner's gains",
     "caption": "a humanoid ankle that can't balance on its own. joint tuner's gains hold it steady. real time.",
     "type": "video"
    },
    {
     "src": "images/projects/joint-tuner/drone-roll.mp4",
     "alt": "a drone on a test stand in mujoco, its orange roll axis driven by joint tuner's gains, with the step response settling",
     "caption": "a drone's roll axis, with the lag of real rotors, settling on joint tuner's gains. 2x speed.",
     "type": "video"
    },
    {
     "src": "images/projects/joint-tuner/pipeline.png",
     "alt": "diagram: a fine-tuned model on fireworks proposes 8 gain sets, a control-theory judge simulates them and throws out bad ones before any hardware moves, nelder-mead repairs if none pass, and the passing gains go to the real joint. trained once on 7,500 simulator-verified designs for $5.11",
     "caption": "how it works: a small model fine-tuned on fireworks proposes 8 gain sets, a simulator throws out the bad ones before any hardware moves, and an optimizer repairs the rest if needed."
    },
    {
     "src": "images/projects/joint-tuner/leaderboard.png",
     "alt": "bar chart of tasks solved out of 100 held-out controleval tasks: joint tuner with repair 93, optimizer with 600 tests 93, joint tuner 8 samples plus repair 90, kimi k3 thinking 90, gpt-6.1 terra 89, down to small base models at 8 to 11",
     "caption": "on 100 held-out tasks, joint tuner solves 90, the same as gpt-6.1 terra (89) and kimi k3 thinking (90), at a fraction of the model time."
    },
    {
     "src": "images/projects/joint-tuner/fireworks.png",
     "alt": "bar chart: fine-tuning the 35b model on fireworks for $5.11 took its first answer from 20 to 50 tasks solved, and best of 8 from 53 to 81",
     "caption": "fine-tuning on fireworks for $5.11 took the 35b model from 20 to 50 right on its first answer, and from 53 to 81 with best of 8."
    },
    {
     "src": "images/projects/joint-tuner/flywheel.png",
     "alt": "loop diagram: propose, test, log, retrain. each step test becomes a labeled example, and feeding them back into fireworks training cuts the tests the next joint needs",
     "caption": "every tuning job leaves labeled tests behind; feeding them back into training means the next joint needs fewer tests."
    },
    {
     "src": "images/projects-fireworks-deploy-cover.jpg",
     "alt": "the event cover: \"fireworks: deploy\", november 02, san francisco, with the fireworks, microsoft and nvidia logos along the bottom",
     "caption": "fireworks: deploy, nov 2 in san francisco, with fireworks, microsoft and nvidia."
    }
   ]
  },
  {
   "id": "molten",
   "name": "molten",
   "tagline": "an a16z la techweek spatial hackathon",
   "at": [
    {
     "name": "xtribe",
     "url": null,
     "icon": "images/logos/xtribe.png"
    }
   ],
   "with": [
    {
     "name": "iana",
     "url": "https://www.linkedin.com/in/ianalin/",
     "icon": false
    }
   ],
   "from": "2026-10",
   "to": null,
   "links": {
    "site": "https://moltenhack.com"
   },
   "sponsors": [
    {
     "name": "elevenlabs",
     "url": "https://elevenlabs.io/",
     "icon": "images/logos/elevenlabs.png"
    },
    {
     "name": "sidefx",
     "url": "https://www.sidefx.com/",
     "icon": "images/logos/sidefx.svg"
    },
    {
     "name": "rokoko",
     "url": "https://www.rokoko.com/",
     "icon": "images/logos/rokoko.png"
    },
    {
     "name": "roboflow",
     "url": "https://roboflow.com/",
     "icon": "images/logos/roboflow.svg"
    },
    {
     "name": "miro",
     "url": "https://miro.com/",
     "icon": "images/logos/miro.png"
    },
    {
     "name": "assemblyai",
     "url": "https://www.assemblyai.com/",
     "icon": "images/logos/assemblyai.png"
    },
    {
     "name": "niantic spatial",
     "url": "https://www.nianticspatial.com/",
     "icon": "images/logos/niantic-spatial.png"
    },
    {
     "name": "kaedim",
     "url": "https://www.kaedim3d.com/",
     "icon": "images/logos/kaedim.png"
    },
    {
     "name": "datafeel",
     "url": "https://www.datafeel.com/",
     "icon": "images/logos/datafeel.png"
    }
   ],
   "support": {
    "before": "supported by",
    "org": {
     "name": "a16z",
     "url": "https://a16z.com/",
     "icon": "images/logos/a16z.png"
    },
    "after": "techweek student grant"
   },
   "when": "oct 2026",
   "media": [
    {
     "src": "images/projects/molten/37.jpg",
     "alt": "a person walking past a big screen reading molten tribe in a brick-and-steel warehouse",
     "caption": "xtribe, inglewood."
    },
    {
     "src": "images/projects/molten/46.jpg",
     "alt": "three organizers on a low stage beside a schedule slide, the room listening",
     "caption": "opening molten."
    },
    {
     "src": "images/projects/molten/50.jpg",
     "alt": "an organizer speaking into a mic on stage while sissi stands beside her with a laptop",
     "caption": "on stage."
    },
    {
     "src": "images/projects/molten/43.jpg",
     "alt": "three organizers talking in the warehouse, one pointing across the room",
     "caption": "figuring out where everything goes."
    },
    {
     "src": "images/projects/molten/16.jpg",
     "alt": "a wide shot of a high-ceilinged warehouse full of desks of people hacking",
     "caption": "a warehouse full of builders."
    },
    {
     "src": "images/projects/molten/2.jpg",
     "alt": "close-up of hands plugging jumper wires into a breadboard next to a dev board",
     "caption": "wires and breadboards."
    },
    {
     "src": "images/projects/molten/32.jpg",
     "alt": "a hand resting on a dark tactile tablet with a braille display",
     "caption": "a refreshable braille tablet."
    },
    {
     "src": "images/projects/molten/38.jpg",
     "alt": "a hacker lowering a vision pro headset over his eyes",
     "caption": "headsets on."
    },
    {
     "src": "images/projects/molten/clip-3.mp4",
     "alt": "a short clip of a hacker wearing a white headset at her desk, reaching into the air, teammates coding beside her",
     "caption": "building in the headset.",
     "type": "video",
     "poster": "images/projects/molten/clip-3-poster.jpg"
    },
    {
     "src": "images/projects/molten/34.jpg",
     "alt": "a hacker in a white vr headset at a busy table",
     "caption": "testing in vr."
    },
    {
     "src": "images/projects/molten/35.jpg",
     "alt": "three hackers laughing at their table, one throwing a peace sign",
     "caption": "good company."
    },
    {
     "src": "images/projects/molten/76.jpg",
     "alt": "a datafeel engineer bent over a demo with a hacker, a green plush toy on the table",
     "caption": "datafeel helping a team."
    },
    {
     "src": "images/projects/molten/102.jpg",
     "alt": "salad bowls and food laid out on a long counter while people serve themselves",
     "caption": "lunch."
    },
    {
     "src": "images/projects/molten/69.jpg",
     "alt": "a speaker with a mic in front of a houdini production slide",
     "caption": "a talk from sidefx."
    },
    {
     "src": "images/projects/molten/115.jpg",
     "alt": "rows of hackers in orange chairs turned toward a talk",
     "caption": "listening in."
    },
    {
     "src": "images/projects/molten/clip-2.mp4",
     "alt": "a short clip of a hacker dancing in a motion-capture suit while a teammate watches",
     "caption": "motion capture, live.",
     "type": "video",
     "poster": "images/projects/molten/clip-2-poster.jpg"
    },
    {
     "src": "images/projects/molten/164.jpg",
     "alt": "a builder presenting a game on a big screen to a seated crowd",
     "caption": "demos."
    },
    {
     "src": "images/projects/molten/179.jpg",
     "alt": "one builder wearing a vr headset while his teammate explains to the audience",
     "caption": "a vr demo on stage."
    },
    {
     "src": "images/projects/molten/194.jpg",
     "alt": "a team of three presenting from armchairs in front of the crowd",
     "caption": "another team up."
    },
    {
     "src": "images/projects/molten/223.jpg",
     "alt": "an organizer speaking into a mic while another claps beside her",
     "caption": "closing."
    },
    {
     "src": "images/projects/molten/237.jpg",
     "alt": "the winning team holding their prize next to a slide reading overall winning team, crowdcast",
     "caption": "awards: crowdcast, overall winner."
    },
    {
     "src": "images/projects/molten/232.jpg",
     "alt": "the winning teams lined up together in front of the screen",
     "caption": "the winners."
    }
   ]
  },
  {
   "id": "interface",
   "name": "interface: hack in between",
   "tagline": "an a16z sf techweek hackathon",
   "at": [
    {
     "name": "founders inc",
     "url": "https://f.inc",
     "icon": "images/logos/founders-inc.png"
    }
   ],
   "with": [
    {
     "name": "iana",
     "url": "https://www.linkedin.com/in/ianalin/",
     "icon": false
    }
   ],
   "from": "2026-10",
   "to": null,
   "links": {
    "site": "https://interfacehack.com"
   },
   "sponsors": [
    {
     "name": "elevenlabs",
     "url": "https://elevenlabs.io/",
     "icon": "images/logos/elevenlabs.png"
    },
    {
     "name": "assemblyai",
     "url": "https://www.assemblyai.com/",
     "icon": "images/logos/assemblyai.png"
    },
    {
     "name": "bright data",
     "url": "https://brightdata.com/",
     "icon": "images/logos/brightdata.png"
    },
    {
     "name": "tenstorrent",
     "url": "https://tenstorrent.com/",
     "icon": "images/logos/tenstorrent.png"
    },
    {
     "name": "sensory",
     "url": "https://www.sensory.com/",
     "icon": "images/logos/sensory.png"
    },
    {
     "name": "kaedim",
     "url": "https://www.kaedim3d.com/",
     "icon": "images/logos/kaedim.png"
    },
    {
     "name": "panic",
     "url": "https://play.date/",
     "icon": "images/logos/panic.png"
    },
    {
     "name": "pupil labs",
     "url": "https://pupil-labs.com/",
     "icon": "images/logos/pupil-labs.png"
    },
    {
     "name": "datafeel",
     "url": "https://datafeel.com/",
     "icon": "images/logos/datafeel.png"
    },
    {
     "name": "genki instruments",
     "url": "https://genkiinstruments.com/",
     "icon": "images/logos/genki.svg"
    },
    {
     "name": "eyegaze",
     "url": "https://eyegaze.com/",
     "icon": "images/logos/eyegaze.png"
    },
    {
     "name": "dot inc.",
     "url": "https://www.dotincorp.com/",
     "icon": "images/logos/dot.png"
    },
    {
     "name": "infineon",
     "url": "https://www.infineon.com/",
     "icon": "images/logos/infineon.png"
    },
    {
     "name": "saleae",
     "url": "https://www.saleae.com/",
     "icon": "images/logos/saleae.png"
    },
    {
     "name": "digilent",
     "url": "https://digilent.com/",
     "icon": "images/logos/digilent.png"
    },
    {
     "name": "mcneel",
     "url": "https://www.rhino3d.com/",
     "icon": "images/logos/mcneel.png"
    },
    {
     "name": "niantic spatial",
     "url": "https://www.nianticspatial.com/",
     "icon": "images/logos/niantic-spatial.png"
    }
   ],
   "note": "my first time hosting a hackathon!",
   "support": {
    "before": "supported by",
    "org": {
     "name": "a16z",
     "url": "https://a16z.com/",
     "icon": "images/logos/a16z.png"
    },
    "after": "techweek student grant"
   },
   "note_shine": true,
   "when": "oct 2026",
   "media": [
    {
     "src": "images/projects/interface/1.jpg",
     "alt": "the long white pier building at fort mason over blue bay water, seen through a window frame",
     "caption": "fort mason, the morning of."
    },
    {
     "src": "images/projects/interface/33.jpg",
     "alt": "an empty sunlit loft with soft green armchairs and potted trees around a big screen reading interface",
     "caption": "the stage before doors opened."
    },
    {
     "src": "images/projects/interface/8.jpg",
     "alt": "pupil labs eye-tracking glasses laid out on a round wooden table with a sponsor card",
     "caption": "hardware tables: pupil labs eye trackers."
    },
    {
     "src": "images/projects/interface/16.jpg",
     "alt": "stacked boxes of digilent analog discovery pro and zybo boards on a curved wooden table",
     "caption": "digilent boards, ready to borrow."
    },
    {
     "src": "images/projects/interface/191.jpg",
     "alt": "iana standing with a laptop and sissi sitting in a green armchair next to the interface screen",
     "caption": "me and iana, just before kickoff."
    },
    {
     "src": "images/projects/interface/206.jpg",
     "alt": "iana and sissi on either side of the interface screen, speaking to the room",
     "caption": "opening the hackathon."
    },
    {
     "src": "images/projects/interface/210.jpg",
     "alt": "iana smiling as she lifts food out of a foil catering tray with tongs",
     "caption": "iana serving lunch."
    },
    {
     "src": "images/projects/interface/282.jpg",
     "alt": "sissi in a green armchair with a mic, the screen behind her reading bambu lab 3d printers",
     "caption": "me introducing the bambu lab 3d printers."
    },
    {
     "src": "images/projects/interface/240.jpg",
     "alt": "a big bright loft full of tables of people hacking on laptops",
     "caption": "a full room by afternoon."
    },
    {
     "src": "images/projects/interface/382.jpg",
     "alt": "two hackers leaning into a laptop screen, an orange water bottle in front",
     "caption": "heads down."
    },
    {
     "src": "images/projects/interface/404.jpg",
     "alt": "five hackers grinning at the camera around a table of laptops",
     "caption": "a team mid-build."
    },
    {
     "src": "images/projects/interface/113.jpg",
     "alt": "a hacker talking to the datafeel team at their black-draped table",
     "caption": "trying datafeel's haptics."
    },
    {
     "src": "images/projects/interface/349.jpg",
     "alt": "a hacker trying a hardware demo at a high table while a sponsor explains it",
     "caption": "sponsor demos all day."
    },
    {
     "src": "images/projects/interface/467.jpg",
     "alt": "a builder presenting on stage, the screen reading talk to a robot",
     "caption": "demos: talk to a robot."
    },
    {
     "src": "images/projects/interface/475.jpg",
     "alt": "hackers seated at tables turned toward the stage, listening",
     "caption": "everyone watching demos."
    },
    {
     "src": "images/projects/interface/498.jpg",
     "alt": "a builder presenting next to a bright yellow slide about a playdate app",
     "caption": "demos: a playdate for the walk home."
    },
    {
     "src": "images/projects/interface/538.jpg",
     "alt": "sissi in an armchair with a mic, the screen reading thank you for bringing your ideas to life and helping each other along the way",
     "caption": "me, saying thank you."
    },
    {
     "src": "images/projects/interface/540.jpg",
     "alt": "a winner holding a prize next to a slide reading spidey sense",
     "caption": "awards: spidey sense."
    },
    {
     "src": "images/projects/interface/548.jpg",
     "alt": "two winners standing by a slide reading haptic ride",
     "caption": "awards: haptic ride."
    },
    {
     "src": "images/projects/interface/519.jpg",
     "alt": "a group photo of hackers and organizers lined up in front of the interface screen",
     "caption": "everyone who stayed to the end."
    }
   ]
  },
  {
   "id": "voice",
   "name": "voice",
   "tagline": "a model that writes like me",
   "at": [
    {
     "name": "yc own your intelligence hackathon",
     "url": "https://events.ycombinator.com/gbrain-qm-river-memorable-hackathon",
     "icon": "images/logos/yc.png"
    }
   ],
   "with": [
    {
     "name": "iana",
     "url": "https://www.linkedin.com/in/ianalin/",
     "icon": false
    }
   ],
   "note": "first place, river ai side quest",
   "note_shine": true,
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "sponsors": [
    {
     "name": "river ai",
     "url": "https://river.ai",
     "icon": "images/logos/river-ai.png"
    },
    {
     "name": "gbrain",
     "url": "https://gbrain.io/",
     "icon": "images/logos/gbrain.png"
    },
    {
     "name": "memorable",
     "url": "https://www.memorable.sh/",
     "icon": "images/logos/memorable.png"
    },
    {
     "name": "qm",
     "url": "https://qm.ycombinator.com",
     "icon": "images/logos/qm.png"
    },
    {
     "name": "superset",
     "url": "https://superset.sh/",
     "icon": "images/logos/superset.png"
    },
    {
     "name": "ufo",
     "url": "https://ufo.ai",
     "icon": "images/logos/ufo.svg"
    }
   ],
   "from": "2026-09",
   "to": null,
   "links": {
    "github": "https://github.com/sissississi-013/voice-",
    "video": "https://www.loom.com/share/c44968dd41aa48eea83301959950262e",
    "x": "https://x.com/sissixmoomin/status/2105132709068915177",
    "more": "https://www.compiled.sh/articles/yc-own-your-intelligence-hackathon"
   },
   "when": "sep 2026",
   "media": [
    {
     "src": "images/projects/voice/demo-still.jpg",
     "alt": "the loom demo, \"training ai to write in my voice\", 1 minute 45 seconds. the still shows voice's readme: the same sentences rewritten by the base qwen model and by sissi's fine-tuned lora, which writes lowercase and casual like her",
     "caption": "the demo on loom (1:45): it learns from my own messages, then a little bubble offers 3 replies in my voice in any text box.",
     "type": "embed",
     "embed": "https://www.loom.com/embed/c44968dd41aa48eea83301959950262e"
    },
    {
     "src": "images/projects/voice/the-room.jpg",
     "alt": "a full room of hackers at the yc own your intelligence hackathon, sitting in rows facing a stage, under round paper lamps",
     "caption": "the room at yc (photo: compiled)"
    },
    {
     "src": "images/projects/voice/on-stage.jpg",
     "alt": "a group of hackers standing together on the stage at the end of the yc own your intelligence hackathon, slides behind them",
     "caption": "everyone on stage at the end (photo: compiled)"
    }
   ]
  },
  {
   "id": "bobot",
   "name": "bobot",
   "at": [
    {
     "name": "founders inc",
     "url": "https://f.inc",
     "icon": "images/logos/founders-inc.png"
    },
    {
     "name": "silly robots contest",
     "url": "https://luma.com/sillybot",
     "icon": "images/logos/silly-robots-contest.png"
    }
   ],
   "with": [
    {
     "name": "iana",
     "url": "https://www.linkedin.com/in/ianalin/",
     "icon": false
    }
   ],
   "note": "grand (silliest) prize",
   "from": "2026-09",
   "to": null,
   "links": {
    "github": "https://github.com/ianalin123/bobot",
    "x": "https://x.com/sissixmoomin/status/2098315679758012674"
   },
   "note_shine": true,
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "tagline": "it speaks minionese, sings songs, loves bananas, recognizes people and hands you a banana if it wants to make friends with you.",
   "when": "sep 2026",
   "media": [
    {
     "src": "images/projects/bobot/with-iana.jpg",
     "alt": "sissi and iana smiling at a table, holding bobot: a fuzzy brown minion-ish robot head with big blue goggle eyes, wires trailing to the table",
     "caption": "me and iana with bobot."
    },
    {
     "src": "images/projects/bobot/on-the-table.jpg",
     "alt": "bobot on a hackathon table: a fuzzy brown bear-like head with big yellow-and-blue goggle eyes on a white robot base, a white robot arm with a gripper beside it, and a bunch of bananas",
     "caption": "bobot at home on the table: goggle eyes, a robot arm, and its bananas."
    },
    {
     "src": "images/projects/bobot/on-stage.jpg",
     "alt": "five people on stage in front of a bright pink and green silly robots contest screen that reads sept 10, fort mason; sissi and iana hold an orange robot hand between them",
     "caption": "on stage at the silly robots contest, fort mason, sept 10."
    }
   ]
  },
  {
   "id": "offshore",
   "name": "offshore",
   "tagline": "an email-native ai ops agent for offshore oil platform maintenance",
   "at": [
    {
     "name": "openclaw hackathon",
     "url": "https://openclaw.ai",
     "icon": "images/logos/openclaw.png"
    }
   ],
   "from": "2026-04",
   "to": null,
   "links": {
    "github": "https://github.com/sissississi-013/offshore",
    "video": "https://www.loom.com/share/7b6f200934424a1988b1f64581e7f9fb",
    "rednote": "https://www.xiaohongshu.com/discovery/item/6a7439f90000000033019d60?xsec_token=ABniJUMCzXnbQOeAp1ymO61fKCXxacHAbyAqSj4iQ8TFE=&xsec_source=pc_share"
   },
   "sponsors": [
    {
     "name": "eragon",
     "url": "https://eragon.ai",
     "icon": "images/logos/eragon.png"
    },
    {
     "name": "nozomio",
     "url": "https://nozomio.com",
     "icon": "images/logos/nozomio.svg"
    },
    {
     "name": "agentmail",
     "url": "https://agentmail.to",
     "icon": "images/logos/agentmail.png"
    }
   ],
   "note": "second place",
   "note_shine": true,
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "when": "apr 2026",
   "media": [
    {
     "src": "https://sns-video-zl.xhscdn.com/stream/1/110/258/01ea7438754fe55a010370019fd603512e_258.mp4",
     "alt": "sissi's in-person demo of offshore (4 minutes 38 seconds, streamed from rednote / 小红书). she sits with a laptop on her lap, pointing up at a big screen showing a slide: \"offshore maintenance is too expensive to be this manual\", with $500k/hr, manual search, email is mandatory and low connectivity. in the post she says it was built in five hours and won a mac mini, an internship offer (she didn't take it), second place, and lots of friendships and stories.",
     "caption": "the in-person demo (4:38): a quick improvised pitch in the first round, streamed from rednote.",
     "type": "video",
     "poster": "images/projects/offshore/in-person.jpg"
    },
    {
     "src": "images/projects/offshore/demo-still.jpg",
     "alt": "the loom demo, \"offshore, 26 april 2026\", 5 minutes 10 seconds. the still shows offshore's dark field report screen saying \"ready when you are\", with a start call button and a side panel for logs and activity",
     "caption": "the demo on loom (5:10): a technician starts a live call and says what's wrong; offshore listens, looks things up, writes the work order and emails everyone.",
     "type": "embed",
     "embed": "https://www.loom.com/embed/7b6f200934424a1988b1f64581e7f9fb"
    },
    {
     "src": "images/projects/offshore/pitch-solution.jpg",
     "alt": "a pitch slide: \"offshore turns one issue report into coordinated action\". three steps: understand (search oem manuals, maximo history, api standards and field context), draft (a work order with asset id, failure mode, parts and safety notes), act (email the planner, oem rep and procurement team and follow the thread to closure). footer: nia is the context layer, agentmail is the action surface",
     "caption": "one issue report becomes coordinated action: understand, draft, act."
    },
    {
     "src": "images/projects/offshore/pitch-architecture.jpg",
     "alt": "a pitch slide: \"one inbox per asset. one agent behind it.\" a technician sends email, voice notes or photos to offshore, which uses nia for context (oem manuals, maximo history, api standards, incident notes) and agentmail to route emails to the planner, oem rep and procurement. steps: issue reported, context retrieved, work order drafted, emails routed and tracked",
     "caption": "one inbox per asset, one agent behind it."
    },
    {
     "src": "images/projects/offshore/logo.jpg",
     "alt": "the offshore wordmark in cream on black, with a small orange dash in the f",
     "caption": "offshore."
    }
   ]
  },
  {
   "id": "neuro-advisor",
   "name": "neuro ad-visor",
   "tagline": "predict how people's brains react to your content before you post it, using meta tribe v2.",
   "at": [
    {
     "name": "perplexity ai computer hackathon",
     "url": "https://www.perplexity.ai/computer/a/agent-build-night-submission-g-FIKgIrWTRJKBcpwYZSP1Dg",
     "icon": "images/logos/perplexity.png"
    }
   ],
   "with": [
    {
     "name": "joshua",
     "url": "https://www.linkedin.com/in/joshuamartoma",
     "icon": false
    },
    {
     "name": "naisha",
     "url": "https://www.linkedin.com/in/naishajain",
     "icon": false
    },
    {
     "name": "jacob",
     "url": "https://www.linkedin.com/in/jacob-shahatit",
     "icon": false
    }
   ],
   "note": "first place, most creative computer workflow",
   "note_shine": true,
   "from": "2026-04",
   "to": null,
   "links": {
    "github": "https://github.com/sissississi-013/Neuro-Ad-visor",
    "video": "https://drive.google.com/file/d/10-TiDzxQ7wQlT51fxjd9pS6CarseHqKC/view",
    "more": "https://www.perplexity.ai/computer/a/agent-build-night-submission-g-FIKgIrWTRJKBcpwYZSP1Dg"
   },
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "when": "apr 2026",
   "media": [
    {
     "src": "images/projects/neuro-advisor/demo-still.jpg",
     "alt": "the neuro ad-visor demo video, on google drive. the still shows the temporal brain reaction screen: a video of an orange cat on a rug on the left (\"wait for it…\"), and two red-and-yellow heatmaps of the brain's cortex on the right, lighting up as the video plays",
     "caption": "the demo video (1:51, on google drive): upload a clip, watch the brain react, get suggestions.",
     "type": "embed",
     "embed": "https://drive.google.com/file/d/10-TiDzxQ7wQlT51fxjd9pS6CarseHqKC/preview"
    },
    {
     "src": "images/projects/neuro-advisor/brain.mp4",
     "alt": "a short silent loop: a cat video plays on the left while two brain heatmaps on the right change with it, predicted by meta's tribe v2 model",
     "caption": "the brain watching along: as the clip plays, the predicted cortex lights up next to it, every 2 seconds.",
     "type": "video",
     "poster": "images/projects/neuro-advisor/demo-still.jpg"
    },
    {
     "src": "images/projects/neuro-advisor/upload.jpg",
     "alt": "the upload screen: \"know what converts before you post\". a cat video is loaded, the platform is set to instagram, and a big cyan button says predict audience response",
     "caption": "drop in a video or picture, pick the platform, press predict."
    },
    {
     "src": "images/projects/neuro-advisor/cortical.jpg",
     "alt": "the overall cortical activation: four views of the brain as red-orange heatmaps, and below them a temporal brain journey chart with lines for fear, anxiety, reward, visual attention, social connection and empathy across the video",
     "caption": "the whole cortex from four sides, and nine feelings over time."
    },
    {
     "src": "images/projects/neuro-advisor/emotions.jpg",
     "alt": "a nine-axis emotional profile radar chart next to an ai interpretation panel saying the post stops the scroll and strongly activates the visual system, but doesn't convert into much emotional payoff, with visual curiosity as the main response",
     "caption": "an emotional radar, and the perplexity agent explaining what the brain data means."
    },
    {
     "src": "images/projects/neuro-advisor/suggestions.jpg",
     "alt": "optimization suggestion cards with toggles: make the first frame instantly legible (image), turn suspense into a story, not just a tease (text), pay off the tension faster (layout), use sound to convert attention into delight (audio), each with its expected impact and target emotion",
     "caption": "suggestions to make it land better, each with the feeling it targets."
    }
   ]
  },
  {
   "id": "field",
   "name": "field",
   "tagline": "an eeg foundational model",
   "at": [
    {
     "name": "the tech bros",
     "url": "https://thetechbros.io/",
     "icon": "images/logos/the-tech-bros.png"
    }
   ],
   "with": [
    {
     "name": "iana",
     "url": "https://www.linkedin.com/in/ianalin/",
     "icon": false
    }
   ],
   "from": "2026-03",
   "to": "2026-08",
   "links": {
    "site": "https://field-lab.org"
   },
   "when": "mar – aug 2026",
   "media": [
    {
     "src": "images/projects/field/site.jpg",
     "alt": "field lab's mark: a stippled purple and navy brain made of tiny dots on cream, with the words onto intelligence in serif type below",
     "caption": "field-lab.org: onto intelligence."
    },
    {
     "src": "images/projects/field/raw-comparison.jpg",
     "alt": "two eeg recordings of the same cognitive task on a dark background: on the left a dense 64-channel recording (physionet), on the right just 3 orange channels (bnci2014_004)",
     "caption": "the same thinking task recorded by two headsets: 64 channels vs 3."
    },
    {
     "src": "images/projects/field/topomaps.jpg",
     "alt": "two topographic scalp maps side by side: the 64-channel one full of red and blue blobs and contour lines, the 3-channel one just a smooth red-to-blue split down the middle",
     "caption": "what the head looks like with 64 electrodes, and with 3. rich detail vs almost blind."
    },
    {
     "src": "images/projects/field/reconstruction.jpg",
     "alt": "three scalp maps: the sparse 8-channel input, the 64-channel ground truth, and the dense field scalpfieldnet reconstructs from the sparse input",
     "caption": "scalpfieldnet: 8 electrodes in, the full 64-channel field back out."
    },
    {
     "src": "images/projects/field/interpolation.jpg",
     "alt": "three scalp maps in a row: the original field, the sparse input with channels masked out, and the reconstructed field",
     "caption": "masking channels and filling them back in: original, sparse input, reconstructed."
    },
    {
     "src": "images/projects/field/processed-window.jpg",
     "alt": "a heatmap of one processed 4-second eeg window from physionet eegmmidb (subject S010), 64 channels by 1024 samples at 256 hz, z-scored in red and blue, with the first 4 channel traces drawn underneath",
     "caption": "one 4-second window after eegforge's preprocessing: 64 channels, 1024 samples, z-scored, ready for training."
    },
    {
     "src": "images/projects/field/channel-hours.jpg",
     "alt": "a log-scale chart of cumulative channel-hours over 30 physionet recordings, rising to about 44, with dashed lines for the full eegmmidb dataset (about 2,221 channel-hours, projected) and the zuna-scale target of 2,000,000 channel-hours",
     "caption": "how much eeg we'd gathered (in channel-hours) vs the full dataset and zuna's 2,000,000 channel-hour scale."
    },
    {
     "src": "images/projects/field/zuna-replication.jpg",
     "alt": "a line chart of nmse on held-out channels vs channel dropout rate (20 to 90%) on eegmmidb: zuna's released 380m weights, our trainer fine-tuned for 400 steps, the mne spherical-spline baseline, and our trainer from scratch (64m, 2.5k steps); the fine-tuned model has the lowest error at every rate and spline is worst except for the from-scratch run",
     "caption": "replicating zuna: filling in dropped channels. our fine-tuned model beats spline interpolation at every dropout rate."
    }
   ]
  },
  {
   "id": "data-validation",
   "name": "agentic data validation pipeline",
   "at": [
    {
     "name": "apple",
     "url": "https://www.apple.com",
     "icon": "images/logos/apple.png"
    },
    {
     "name": "generative ai @ berkeley",
     "url": "https://www.berkeleygenai.org",
     "icon": "images/logos/generative-ai-berkeley.svg",
     "dark": true
    }
   ],
   "with": [],
   "from": "2026-02",
   "to": "2026-06",
   "links": {},
   "when": "feb – jun 2026",
   "media": []
  },
  {
   "id": "cellquest",
   "name": "cellquest",
   "tagline": "enter the vein as a blood cell.",
   "at": [
    {
     "name": "overworld \"hack the world(model)\"",
     "url": "https://luma.com/klpa49os",
     "icon": "images/logos/overworld.png"
    },
    {
     "name": "kindred ventures",
     "url": "https://kindredventures.com",
     "icon": "images/logos/kindred-ventures.png"
    }
   ],
   "note": "first place overall",
   "note_shine": true,
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "from": "2026-01",
   "to": null,
   "links": {
    "github": "https://github.com/sissississi-013/cell-quest"
   },
   "with": [
    {
     "name": "anna",
     "url": "https://www.linkedin.com/in/tidstam/",
     "icon": false
    }
   ],
   "icon": "images/logos/cellquest.png",
   "icon_is_name": true,
   "when": "jan 2026",
   "media": [
    {
     "src": "images/projects/cellquest/gameplay.mp4",
     "alt": "40 seconds of cellquest gameplay: a first-person view drifting through blue, glossy tissue generated frame by frame by the waypoint world model, past round blue cells and a big dark red tumour cell with long fibres. along the bottom, the green drug molecule health bar slowly drains from 100% to 82% while the red abnormal cells bar drops with each shot to 0%, and the game ends on \"victory!\"",
     "caption": "cellquest running again, 10 months later, on overworld's waypoint world model and a rented gpu. every frame is generated live as the drug molecule swims through the tissue; 13 hits clear the abnormal cells (40 s).",
     "type": "video",
     "poster": "images/projects/cellquest/gameplay.jpg"
    },
    {
     "src": "images/projects/cellquest/with-anna.jpg",
     "alt": "sissi and anna standing together in a wood-panelled office lobby, smiling and making hand signs at the camera",
     "caption": "anna and me after we won, at kindred ventures."
    }
   ]
  },
  {
   "id": "attention-kernel",
   "name": "attention kernel optimization challenge",
   "at": [
    {
     "name": "paradigm autoresearch hackathon",
     "url": "https://www.paradigm.xyz",
     "icon": "images/logos/paradigm.png"
    }
   ],
   "with": [],
   "from": "2026-04",
   "to": null,
   "links": {
    "site": "https://www.paradigm.xyz/puzzles/attention",
    "github": "https://github.com/sissississi-013/usagi",
    "x": "https://x.com/danrobinson/status/2043776520158642425"
   },
   "note": "first place (in-person track)",
   "note_shine": true,
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "site_host": {
    "name": "paradigm / puzzles",
    "icon": "images/logos/paradigm-puzzles.png",
    "wide": true
   },
   "when": "apr 2026",
   "media": [
    {
     "src": "images/projects/attention-kernel/panel-1.png",
     "alt": "diagram titled the puzzle, in paradigm's style: three triangular grids of green blocks (keys across, queries down, nothing above the diagonal) for the three sparsity families: sliding window, sliding window plus a global prefix, and sliding window plus random retrieval blocks. notes: B=2, H=16, T=8192, D=128; 128×128 blocks, only 8–16% filled, so each query row touches just 4–12 key blocks, and the kernel is starved for memory and per-block bookkeeping rather than math.",
     "caption": "the puzzle: block-sparse causal attention, three ways."
    },
    {
     "src": "images/projects/attention-kernel/panel-2.png",
     "alt": "diagram titled how usagi walks one row: a dark green Q block (one 128-row query block, kept in registers) streams past key/value blocks listed by csr col_idx. the non-diagonal blocks run in a fast loop with no mask and no branch; the diagonal block comes last and is the only one with the causal mask. for every block: S = Q·Kᵀ·scale (bf16 in, fp32 scores), then online softmax (exp2, running max and sum), then acc += P·V on fp16 tensor cores, then fp32 accumulation into bf16 output and log-sum-exp. notes: an if inside the hot loop breaks triton's software pipelining (up to 2× slower); bf16 P·V drifted past the 1e-3 tolerance, fp16 passed at the same speed.",
     "caption": "how usagi walks one row: non-diagonal blocks in a fast loop, the diagonal last."
    },
    {
     "src": "images/projects/attention-kernel/panel-3.png",
     "alt": "diagram titled eight warps, two jobs: eight warp squares, three light-green producers that load K/V with block pointers and five dark-green consumers that run Q·Kᵀ, softmax and P·V on tensor cores (warp_specialize=True plus tl.make_block_ptr; each neutral alone, about 10% faster together). bar chart of median latency by num_warps: 4 warps 1.44 ms, 8 warps 0.73 ms, 16 warps 1.12 ms; 4 leaves too much idle time, 16 causes register pressure.",
     "caption": "eight warps, two jobs: the biggest single win."
    },
    {
     "src": "images/projects/attention-kernel/panel-4.png",
     "alt": "line chart titled 1.238 → 0.660 ms: latency drops from 1.238 ms (first working kernel, ctypes launcher, 4 warps) to 0.85 ms (8 warps) to 0.74 ms (split diagonal plus stride specialization) to 0.66 ms (block pointers plus warp specialization), above a dashed memory floor of about 0.25 ms; measured as medians of 3–5 runs since each run wobbled ±15%. tried and not kept: tma descriptors (+26%), pre-scaling Q (fails accuracy in bf16), bf16 P·V (fails accuracy), num_stages=4 (doesn't fit in shared memory), num_ctas=2 (won't compile), 16 warps (register pressure).",
     "caption": "1.238 → 0.660 ms in a day, and what didn't make it."
    }
   ]
  },
  {
   "id": "stageready",
   "name": "stageready",
   "tagline": "practice going live in front of an ai audience.",
   "at": [
    {
     "name": "elevenlabs worldwide hackathon (san francisco)",
     "url": "https://hackathon.elevenlabs.io/",
     "icon": "images/logos/elevenlabs.png"
    }
   ],
   "with": [
    {
     "name": "rhea",
     "url": null,
     "icon": false
    }
   ],
   "note": "first place overall",
   "note_shine": true,
   "note_pic": {
    "src": "images/medal-cat.png",
    "alt": "a gold medal on a red ribbon, with a little crying cat poking its face, paws and feet out of it"
   },
   "from": "2025-12",
   "to": null,
   "links": {
    "site": "https://stage-ready-sable.vercel.app",
    "github": "https://github.com/sissississi-013/StageReady",
    "video": "https://youtu.be/1DkC9Gb4RRM",
    "linkedin": "https://www.linkedin.com/feed/update/urn:li:activity:7480600052369895424/",
    "more": "https://sf.aitinkerers.org/hackathons/h_eaohlcqws_A/entries/ht_U6IzGKD85II"
   },
   "when": "dec 2025",
   "media": [
    {
     "src": "images/projects/stageready/on-stage.jpg",
     "alt": "sissi on stage with a microphone, presenting stageready next to her sticker-covered laptop. behind her, the big screen shows the app running live: her own face streaming in the middle, a raised hands panel of ai viewers on the left, and the ai audience's chat scrolling in neon green on the right",
     "caption": "presenting stageready on stage, live."
    },
    {
     "src": "images/projects/stageready/demo-still.jpg",
     "alt": "the stageready demo on youtube. the still shows sissi live-streaming in the practice room (\"liveroom, simulated streaming environment\"): her camera in the middle with 156 watching, a raised hands list of ai viewers on the left with invite buttons, an ai co-host called speakeasy in the corner, an end stream button, and a live chat of ai viewers on the right asking things like \"what kind of feedback do you find most helpful?\"",
     "caption": "the demo on youtube (2:37): an ai audience chats back to what you're saying, raises hands to ask questions, and can join as a voice co-host.",
     "type": "embed",
     "embed": "https://www.youtube-nocookie.com/embed/1DkC9Gb4RRM"
    },
    {
     "src": "images/projects/stageready/short-still.jpg",
     "alt": "a youtube short filmed from the audience at the elevenlabs worldwide hackathon: sissi stands at the podium with a microphone, presenting stageready, while people walk past and a photographer with a big camera stands in front",
     "caption": "presenting it at the hackathon, filmed from the crowd (a youtube short).",
     "type": "embed",
     "embed": "https://www.youtube-nocookie.com/embed/m2srvGLZvD4"
    }
   ]
  },
  {
   "id": "dishbrain-cartpole",
   "name": "human brain cells in a dish learn to play cartpole",
   "at": [],
   "with": [
    {
     "name": "neurotech@berkeley",
     "url": "https://neurotech.studentorg.berkeley.edu",
     "icon": "images/logos/neurotech-berkeley.png"
    }
   ],
   "from": "2025-10",
   "to": "2025-12",
   "links": {},
   "when": "oct – dec 2025",
   "media": [
    {
     "src": "images/projects/dishbrain/poster.jpg",
     "alt": "research poster, 'building a virtual dishbrain: analyzing and improving mea-based neural control of cartpole', by asila sabouri, emmie hou, deeksha kasula and sissi wang, uc berkeley. abstract: the original goal was to train cultured neurons on a multi-electrode array (mea) to solve cartpole; without wet-lab culture space the project became a literature review plus computational analysis of an existing brian2 mea simulation. background: inspired by cortical labs' dishbrain, where neurons learned pong through closed-loop stimulation. methods: a loop diagram where recorded neural data goes through .net to an openai gym cartpole environment, which sends cart position, angle and velocity back as stimulation; plus a pipeline from cartpole state to spike encoding, brian2 spiking network, spike decoding to left/right, reward, and stdp updates. analysis and results: the simulation fired unstably, reward scaling was too weak or too strong, brian2 integration was incomplete, and episodes ended almost immediately; charts show reward, action and neural activity distributions. next steps: stabilize brian2, smoother dopamine-like reward, parameter sweeps, move to snntorch, and prepare stimulation strategies for real cultured neurons. a photo shows a glass mea chip.",
     "caption": "our poster: building a virtual dishbrain."
    },
    {
     "src": "images/projects/dishbrain/brain.jpg",
     "alt": "a 3d wireframe brain on black, one hemisphere drawn as a dense mesh and the other shaded solid, the cover of sissi's notebook 'running brian 2!'",
     "caption": "running brian 2! my notebook for the simulation."
    },
    {
     "src": "images/projects/dishbrain/workflow.jpg",
     "alt": "flowchart in four phases. phase 1, initialization: brian2 setup with a numpy backend, adex neuron parameters and equations (adaptation current w, membrane voltage v, external input i). phase 2, network construction: a right motor group and a left motor group of 30 neurons each, spike monitors, and a brian2 network wired to a virtualmea interface. phase 3, a simulation loop over 100 episodes: cartpole state in, neurons spike, the virtualmea reads left vs right firing as an action, cartpole physics updates, reward is calculated, learning / stdp is applied, then the next time step. phase 4: animated plots of the cartpole and neural raster, and plots of reward and spike rates.",
     "caption": "how the virtual dish works, start to finish."
    },
    {
     "src": "images/projects/dishbrain/run-1.jpg",
     "alt": "performance dashboard from the first run: reward stays flat around 9 to 10 steps for all 50 episodes, the reward histogram is a narrow spike around 9.5, the action chart shows almost every action was right, and the pole angle swings back and forth; no learning curve",
     "caption": "run 1: no learning, and 88% of moves were 'right'."
    },
    {
     "src": "images/projects/dishbrain/run-3-heatmaps.jpg",
     "alt": "neural activity heatmaps after bug fixes: left and right hemisphere neurons firing over time in red and yellow bands, with bar charts below comparing spike counts per frame for left versus right actions",
     "caption": "run 3, after the bug fixes: both hemispheres finally firing."
    },
    {
     "src": "images/projects/dishbrain/raster.jpg",
     "alt": "spike raster over 50 episodes after bug fixes: dense blue horizontal bands for all 30 left-hemisphere neurons and orange bands for all 30 right-hemisphere neurons, firing continuously in the same rhythm",
     "caption": "spike raster: all 30 neurons per side, firing together."
    },
    {
     "src": "images/projects/dishbrain/final-learning.jpg",
     "alt": "final learning dashboard with all improvements applied: the learning curve drops to zero after the first episodes, synaptic weights collapse to their floor value, the dopamine-like reward signal decays, and cumulative performance stays flat",
     "caption": "last try, with stdp and a dopamine-like reward: the weights hit the floor."
    }
   ]
  },
  {
   "id": "welcome",
   "name": "welcome 欢迎",
   "tagline": "a moving installation about how children with dyslexia see chinese characters.",
   "at": [],
   "with": [],
   "from": "2024-05",
   "to": "2024-10",
   "links": {
    "video": "https://vimeo.com/1020253861",
    "more": "projects-welcome.html"
   },
   "when": "may – oct 2024",
   "media": [
    {
     "src": "images/projects/welcome/film.mp4",
     "alt": "spiky white paper strokes with red spikes hanging on strings, drifting into the characters 欢迎",
     "caption": "the strokes drift on motor rails until, for a moment, they line up into 欢迎.",
     "type": "video",
     "poster": "images/projects/welcome/film.jpg"
    },
    {
     "src": "images/projects/welcome/35-1d3c4a.jpg",
     "alt": "the whole installation from the front: all the strokes of 欢迎 hanging in the air on black",
     "caption": "the whole piece, 3m × 2m × 2m, nanshan, shenzhen."
    },
    {
     "src": "images/projects/welcome/01-9439f0.jpg",
     "alt": "close-up of a hanging stroke: white clay spikes with red tips"
    },
    {
     "src": "images/projects/welcome/27-c4b48e.jpg",
     "alt": "欢迎 with its strokes back in place, clear and readable",
     "caption": "the moment the strokes fall into place."
    },
    {
     "src": "images/projects/welcome/08-c7d0cf.jpg",
     "alt": "欢迎 next to a version with strokes and radicals missing",
     "caption": "one of five ways dyslexic kids read characters: missing parts."
    },
    {
     "src": "images/projects/welcome/31-242ff1.jpg",
     "alt": "spiky paper stroke sculptures on cardboard stands"
    }
   ]
  },
  {
   "id": "song-of-the-elephants",
   "name": "song of the elephants 横截面",
   "tagline": "two elephants whose trunks light up with sound.",
   "at": [],
   "with": [],
   "from": "2024-08",
   "to": null,
   "links": {
    "video": "https://vimeo.com/1019472618",
    "more": "projects-song-of-the-elephants.html"
   },
   "when": "aug 2024",
   "media": [
    {
     "src": "images/projects/song-of-the-elephants/lights.mp4",
     "alt": "two white geometric elephant heads whose ring trunks glow and change colour with sound",
     "caption": "the trunks glow with what they hear: blue for low sounds, red for high.",
     "type": "video",
     "poster": "images/projects/song-of-the-elephants/lights.jpg"
    },
    {
     "src": "images/projects/song-of-the-elephants/01-92fa62.jpg",
     "alt": "two white geometric elephant heads on wooden bases, their ring trunks glowing green and blue",
     "caption": "pvc, ws2812b leds, arduino, acrylic, diffuser sheet, aluminium wire."
    },
    {
     "src": "images/projects/song-of-the-elephants/gallery-4-5f71e0.jpg",
     "alt": "a trunk of rings glowing warm yellow"
    },
    {
     "src": "images/projects/song-of-the-elephants/05-096aeb.jpg",
     "alt": "a child bent over his drawing of a green elephant, above two elephants touching trunks",
     "caption": "\"i feel like a green, symmetrical elephant.\""
    },
    {
     "src": "images/projects/song-of-the-elephants/08-3dcdaa.jpg",
     "alt": "an elephant modelled in rhino, sliced into cross-sections and laid out for cutting"
    },
    {
     "src": "images/projects/song-of-the-elephants/02-39d774.jpg",
     "alt": "the trunks glowing pink and red between the two white elephant heads"
    }
   ]
  }
 ]
}
