EV - AI Assistant
- 8 Devlogs
- 81 Total hours
Recreation of THE AI ASSISTANT from “Spider Man Brand New Day”
Recreation of THE AI ASSISTANT from “Spider Man Brand New Day”
the page had way too much going on fr. cut the face readouts, the demo stepper, extra stats and the giant verify box.
npm run admin). edit any text, pick which commit stable points at, update the roadmap, all next to a live preview. saves as u typeNow that i think about it. i think i did way too much unneccessary stuff.
vite + tailwind + plain js. no react, cause ev’s whole thing is being lightweight and it’d be kinda hypocritical ngl
works on phones too, tested it at like 5 screen sizes
the hero used to be a particle orb. it was mid. ev literally has a face so now the site uses that instead
ev/face/render.py) to a canvas and it reads the same expressions.json as the real face. change a mood in python and the site picks it up on the next build~10k lines added. kinda unhinged week ngl.
ev/hearing.py) and loosens its “didn’t catch that” threshold if i’m just a quieter/mumblier speaker. it only ever loosens, never gets stricter, so it can’t drift into acting on noisechat can take a mood so “look angry” or “wink at me” actually does something, and there’s a demo mode that cycles through every expressioni forgot what all i did. but here is the best recap of what i remember.
tools/desktop/ folder. basically three tiers now, cheapest first:
app_control and app_agent tools so “turn on dark mode in settings” doesn’t burn a screenshot[email protected]) so wayland windows have real positions and focus worksjeepney and comtypes to requirements, both lazy imported so nothing changes if you never use emev/semantic_memory.py). remember_fact with no key stores a free note, and ev pulls up the ones relevant to what you just said. all local search (BM25 + fuzzy for misheard words), gemini embeddings are optional and only used inside tool calls. has dedup, archiving, backups, so one bad write doesn’t wipe everything. forgetting stuff asks for a confirmtools/desktop/xhud.py), click-through and everything. the kill hotkey on gnome wayland goes through the extension (bumped to v2) since wayland won’t let apps grab global keystest_desktop_vision.py
works: voice, typed mode, browser errands, desktop apps on windows + ubuntu, memory.
still janky: wayland without the extension (no window positions), snapped apps refusing accessibility, and my commit messages.
next up: idk, tests probably. maybe sleep.
Iterations 9, 10 and 11. Lowkey the biggest glow up E.V. has had so far.
E.V. has a face now. It’s a little floating dark screen with two glowing eyes that sits on your desktop and reacts to whatever it’s doing. Listening, thinking, talking, happy, confused, sleepy, and even angry for some reason. yeah dont ask.
It’s its own process. The face runs on PySide6 in a separate process, so the main assistant never loads Qt and stays tiny. If the face crashes, E.V. doesn’t care, it just keeps going. No PySide6 installed? No face, nothing else changes.
Every mood is just JSON. All the expressions live in expressions.json as eye shapes, lid angles, glow and colour. The eyes ease between moods smoothly, blink on their own and glance around so it never looks dead inside.
Captions. What you said and what E.V. says back pop up in a speech bubble next to the face. The bubble is click-through so it never gets in the way.
It only pulls up when you call it. Say “E.V.” and it slides in, stop talking and it dips. If you’re watching something full screen it stays hidden, because nobody wants a robot photobombing their movie.
Media control. “Pause the music”, “next song”, “turn it down”. Works on Linux and Windows without installing anything extra.
Finally Stopped Ignoring Ubuntu. I switched to Ubuntu and half of E.V. broke ngl. The mic needed a fallback to pw-record / parec / arecord, app launching had to learn .desktop files, and the voice plays through GStreamer. Wayland doesn’t let apps float on top, so the face sneaks through XWayland instead.
Bugs that were lowkey unhinged
This one was actually wild. On speakers, E.V. would hear its own voice, think I was interrupting, transcribe itself and then reply to itself. Forever. Main character behaviour, but no.
Three fixes, stacked:
Compare against itself, not the room. Interrupting used to mean “louder than background noise”, and speakers win that every time. Now you have to be louder than E.V.’s own voice coming back through the mic.
It learns what I sound like. A small voiceprint learns my voice and E.V.‘s voice through the speakers, and keeps adapting the more you use it. If the audio sounds like E.V., it’s ignored. It’s not face ID for voices, it just tells “me” apart from “the speakers”.
It checks the words. If what it just heard matches what it just said, it gets dropped. This is the one that makes the loop actually impossible instead of just less likely.All of it is pinned in tests so it can’t sneak back. The suite is at 866 tests now, all offline. That’s the update fr.
yk i gotta come clean. half of this major update was vibe coded. forgive me. but the other half was done by me.
ALSO THIS DEVLOG is not vibecoded. it took too long.
This update was all about letting E.V. actually take over the computer, not just open apps.
What’s new
Bugs I hit
Just Spent 8 Hours on EV, Creating And Refactoring. to finally achieve as close as i can get towards the real thing with the resources that i was allowed.
It is fully controlled via Voice ( BUT can be switched to text, if necessary). it can do advanced tasks like open Apps, Create Files, And Much more.
All you need is a Groq or Gemini API key. and it consumes a maximum of 200MB RAM. I couldn’t just use an LLM for this purpose as I’m working with a PC that has 4GB RAM.
AS OF NOW, this is a terminal program. but soon this will be much bigger. it will become a full scale app with enjoyable UI/UX Design and an avatar for EV