Experiments
side projects that occasionally get out of the house. click a card to open it.
Active projects
-
the person you need is usually two people away and you have no way to find them. your linkedin export sits unopened, your X follows are something you scroll at 2am, and the guy who used to work at stripe is half a memory. orbit takes that mess and makes it queryable.
it pulls your connections from linkedin and X, then fills each one out into a profile worth searching: headline, current title and company, past roles, location, skills, schools, certifications, languages, follower count, bio. a csv row goes in and a person with a history comes out.
after that you type what you want. "founders who have shipped AI products", "people who worked at google", "engineers in bangalore", "anyone in fintech who also knows someone in mumbai". gemini gets the query plus a compressed version of your graph and hands back ranked people with the reason each one surfaced, so you can tell whether the match came from a job title, an old position, a skill, or one line buried in a bio.
what it does
- ingest from linkedin and X, or a raw csv or json if you would rather bring your own dump
- enrichment that fills in job history, skills, schools, certs, languages, and location
- plain english search across your own graph, with the reason for every match
- warm paths, so you can see who introduces you instead of sending a cold dm
- a globe built with d3 and topojson showing where your network physically lives. mine turned out to be three cities and a rounding error
- dashboards for industry, seniority, geography, and skill frequency
- conflict resolution for when the same person shows up twice holding two different jobs
- roast mode, which reads your stats and tells you how dull your network is. mine got compared to a linkedin comment section
architecture
react 19 and typescript on vite. zustand with a persist layer keeps the graph in your browser, papaparse handles imports, gemini runs search and roast, d3 and topojson draw the globe, recharts covers the dashboards, framer motion moves things around, react router holds the pages together. no server ever sees your contacts.
happenstance charges for a version of this. i wanted the useful half: multi source ingest, semantic search over people, visible match reasoning, warm intros. paying rent on my own address book felt stupid.
-
an ai layer that sits over whatever you are already doing. one keystroke brings it up, you ask about what is on screen, you get an answer, it disappears. no window juggling, no pasting screenshots into a chat tab.
three modes. ask grabs a screenshot and streams an answer about it. listen captures system audio, runs speech to text, and can answer while things are still happening, which is the whole point during a call or a lecture. knowledge embeds your notes and documents locally, then injects the relevant chunks into the prompt so replies land in your context instead of the general one.
architecture
tauri, so a rust core with a react frontend in a native webview. small binary, and the overlay is quick enough to feel like part of the os. state lives in a local sqlite file and your api keys never leave the machine. global shortcuts cover show and hide, dashboard, screenshot, push to talk, and audio listen.
it started as a fork of pluely 0.1.9 under gpl 3.0. upstream locked part of the ui behind a license server, so i kept bring your own keys and local storage, opened up the rest, and shipped it. half the tools in this category would rather hold your keys for you.
-
karpathy posted a tiny gpt and it was not minified, which felt like an invitation. i squeezed it down, then kept squeezing until the whole thing fit inside a qr code. scan it and a model starts training in your browser.
thirty nine lines of javascript, no dependencies. inside those lines: a hand rolled autograd engine, four head attention, a feed forward mlp with a gelu approximation, adamw on a cosine schedule, both the training and inference loops, and a seeded xoshiro128 prng so runs reproduce. one layer, embedding width 16, context length 8, mlp width 64, 4,064 parameters.
delivery is the fun part. the html payload gets gzipped, base64 encoded, and packed into a version 40-L qr code at 2,953 bytes. the browser runs its own DecompressionStream to unpack it, renders the page, and starts training. nothing to install, no server, no download. an earlier python version is 64 lines and still sits in legacy.
this one is closer to a dare than a product. i keep it around because it shows where the floor actually is.
more as they go from idea to repo to slightly less embarrassing. some of these will age badly and i will leave them up anyway.