Inspiration
A few months ago I was designing a binder for EGFR — trying to lock the hinge region so it couldn't dimerize. Sounds simple. Took me three days.
Day one was just orientation. Loading structures, figuring out which PDB had the conformation I needed, remembering that 1NQL is the pre-activation state and 8HGO is the active dimer. Manually selecting domain boundaries. select domain_I, resi 1-165. select domain_II, resi 166-310. Over and over.
Day two I'm hunting for hotspots. Where does EGF actually contact the receptor? What residues matter? I'm cross-referencing papers, typing distance commands, writing down numbers in a notebook, losing track of which selection was which. I accidentally overwrote a selection I'd spent twenty minutes building. Started over.
Day three I finally have a mental model of the system. But I'm exhausted. And I realize — I'm going to do this again next week on a different target. And the week after that.
I wanted Jarvis. An AI that could see what I was seeing, remember what I'd already checked, run the tedious analysis while I think about the biology. So I built it.
What it does
You talk to it. It controls PyMOL.
"Load EGFR, the pre-activation state." Done. "Show me where EGF binds." Residues highlight. "What's the distance between the hinge and domain IV?" It measures. "Find me pockets on the backside." It finds them.
While you're exploring, a second agent is already working — mapping the surface, scoring druggability, checking what's conserved. When it finds something interesting, it surfaces: "There's a cavity near the domain II-IV tether you might want to look at."
Two agents. One you steer. One that thinks ahead.
How I built it
Frontend: TypeScript, Gemini Live API for real-time voice, gesture tracking (for that Jarvis feeling! Gesture tracking was a must)
Backend: FastAPI serving headless PyMOL in Docker, deployed on Railway, powered by Gemini 2.0 Flash
The key insight: Gemini already knows PyMOL. I didn't build wrapper functions for selectResidues() or colorByChain(). I gave it a text field and said "write the commands." The model is the API.
Challenges
Two agents working the same problem without tripping over each other. The one you're talking to has to stay instant — no "please wait while I analyze." Solved it by giving each agent its own PyMOL instance and letting the background agent work async. When it's done, it passes notes to the primary, which decides what's worth telling you.
What's next
That EGFR binder I was designing? I'm finishing it with this tool. Three days of manual work is now a conversation. The analysis layer is done. Design pipeline — RFDiffusion, ProteinMPNN, validation — plugs in next. Same architecture, more agents.
The goal: describe what you want, get back proteins that work.
Built With
- 3dmol.js
- docker
- fastapi
- font-awesome
- google-gemini-api
- google-gemini-api-(@google/genai)
- jquery
- mediapipe-camera-utils
- mediapipe-hands
- pymol
- python
- railway
- react-19
- tailwind-css
- typescript
Log in or sign up for Devpost to join the conversation.