emerson lopes
senior software engineer · são paulo, brazil
i build software for the people buying and selling homes, and the agents who guide them. mostly react and react native on the front, node and a federated graph underneath. lately that means real‑time collaboration and the ai features in a crm.
my side projects have one user each: the music player on my phone, the dictation tool at my desk, the bot in my discord server. when a tool i rely on breaks, i send the fix upstream instead of working around it.
work
things i have built, and why
- autopilot
an mcp server that drives the user's own signed-in chrome through a manifest v3 extension and the devtools protocol. tabs open unselected and nothing on screen moves while an agent works.
- shoal
a self-hosted, end-to-end encrypted sync backend for local-first apps. the rust server orders ciphertext and pokes subscribers. the typescript client does every merge. there are no accounts, identity is 12 words.
- win-text-inject
a rust crate for the last step of every dictation tool: putting text where the caret is. it restores the clipboard only after the target has actually read the new text, keeps transcripts out of clipboard history, releases held modifiers, and refuses elevated targets honestly.
posts
notes on shipping software, mostly the harder parts
- how a tool call reaches a tab in the chrome you already useautopilot lets an ai agent drive the browser you are signed into, in the background, without ever bringing a tab forward. the four hops from an mcp client to a page, why each exists, and the design rule that pays for all of it.
- five things chrome does to a background tab, and what each one breaksan agent that never brings a tab forward runs into five undocumented chrome behaviors: a suspended worker that turns 100 ms into five seconds, an input dispatch that blocks for five seconds, a hidden tab that answers nothing until you tell it it is visible, a capture that never returns, and a stale module cache. each has a fix, and the largest one is a three-tier capture path.
- the click that reports success and does nothingthe most common failure in browser automation is a call that returns ok while the page never moved. every input in autopilot arms a watch before dispatch and reports what actually changed, and the contract found six bugs of its own.