Open comments for this post
Spent about 4.5 hours this session building out the main window into a proper settings page so you can set Snap up however you want without ever touching the code. Heres everything that landed.
Custom hotkeys — you can now reassign the shortcuts to whatever keys you want instead of being stuck with F9/F10/F11.The tricky part wasnt setting them, it was getting them to stay after closing the app. They kept resetting every restart. Found tauri plugin store which turned out to be exactly what I needed now the hotkeys save properly between sessions.
Custom API key field — drop in your own Groq key right in the settings instead of it living in a file, so you’re not tied to the shared tester key.
Customizable summary length — pick how short or detailed you want your summaries to be.
Window controls — added proper minimize, expand and close buttons to the window and got them all wired up. Also added drag to settings window.
Auto start on launch — Snap now starts itself when you boot up so its just always ready in the background.
Scroll fixes — sorted out the scrolling on the settings page. This one annoyed me, I was trying to style the webkit scrollbar to match the rest of the UI and it just would not budge no matter what I threw at it. Eventually I gave up fighting it and settled for the default scrollbar, sometimes its not worth burning more time on something that small.
That was the session, about 4.5 hours all up. Snap went from set in stone shortcuts to something you can actually configure and make your own, which makes it a real step toward it being a finished product.
Next up: make auto updates seamless so you never re download.
Discrepancy in the hours because Wakatime wasn’t connected (offline)
Open comments for this post
Wednesday?
- Added draggable windows
- Improve ai prompts
More to come. Currently busy with life. Touching graass 🌳🌳🌳
Open comments for this post
Snap is live, and the first batch of testers gets in free ⚡
Select any text on your screen, hit a hotkey, and AI handles it — summarize, rewrite, or ask anything — in a popup right at your cursor. No browser tab, no copy-paste, no setup.
I’m opening a limited number of free tester spots: download it, no API key needed, just run it and go. First come first served while the spots last.
Built solo in a weekend. First time ever writing Rust — the devlogs cover the whole messy journey, including the day I lost to an invisible black box rendering over my entire window.
👀👀Watch the demo down below
👉 Grab it: [download link]
Open comments for this post
Devlog #6 Snap grew up this session
Big one. A bunch of stuff landed that took this from “cool demo” to “actually a product.” Heres what will ship.
The headline: ask anything
Until now Snap had two fixed actions, summarize and enhance. Now you can select text, open the popup and just type your own instruction at it. Translate this, explain this, make it shorter, rewrite it angrier, whatever. The two hotkeys stay as the fast path, this is for everything else. This was the idea I was most hyped about and its finally real.
It updates itself now
Before this, a new version meant everyone had to go re download the installer, which means nobody would. Now the app checks for updates and pulls them in on its own. Getting this working felt like the moment it stopped being a hobby project.
Quality of life
Launch on startup so its just always there listening, no opening it every morning.
Esc to close the popup instead of clicking away.
Custom icons finally rendering properly everywhere after fighting them for a bit.
Seamless popup cleanup so it actually feels polished now.
Tester API key baked in so people can try it without making a Groq account first.
Improved the prompts so it doesn’t sound ai generated and can pass as human text
Still cooking
Custom hotkeys and screen edge aware positioning so the popup never opens half off your monitor. Potential language spin off to aid language learners (custom in app language, ai response langauge). Those are next, then this thing is ready to really show off.
Honestly this was the most satisfying session so far. Not because anything was hard, but because every single thing I added made it feel more like a real app and less like something held together with tape.
Open comments for this post
Devlog 5 — Polish, prompts, and the first real release
Bit of a cleanup session before shipping. First thing, I reworked the summarize prompt. It used to spit out a 1-3 sentence paragraph and I found myself still having to read the whole thing to find what mattered, so now it breaks the text into a few short skimmable bullet points instead. Way nicer to actually use.
Then I wrote up a proper README. Demo GIFs, feature list, setup steps, the whole thing, so anyone landing on the repo gets what Snap is and how to run it.
And the big one, I built the first actual release. Set up the icon, ran the Tauri build, and it spat out a real installer that bundles the WebView2 check so it works on a fresh machine. So Snap is now something you can just download and run, not just clone and build yourself. Linked it at the top of the README.
About an hour all up. Next up is probably finishing translate so theres a proper third action.
Open comments for this post
Devlog #4 Groq is wired in and the popup actually feels like a product now
Groq is hooked up and the app does its actual job now
The summarize and enhance shortcuts now actually call Groq and return real text instead of just echoing back what I copied. The API call lives on the Rust side so the key never touches the frontend, and the popup shows a little loading state while it thinks. Seeing it summarize an actual paragraph for the first time was a moment this is finally the thing I set out to build.
The invisible icon bug
Then I hit a quick bug that made no sense at first. I added a copy button to the popup with a little icon and the icon just refused to show up. Blank space where it should be. The element was there right size, right color the DOM looked totally fine it just wasnt painting. Turns out its a WebView2 thing where svg icons go invisible specifically on a transparent acrylic window. Took me a minute to even believe that was the actual cause. For the fix I settled on emojis for now. A decent workaround but it works, and theres a little checkmark when you click now so you know the copy landed.
Polish pass
The rest was polish and it went fast. The window resize is animated now instead of snapping to size which makes it feel a lot smoother, I hid the scrollbars everywhere, and I fixed a button that kept coming out rectangular instead of square because of some default browser padding I didnt know about. Also settled on the proper acrylic glass blur after the mess from last session and gave it a tint.
Next up
is making the popup smart about screen edges so it cant open half off screen, esc to close it, and a little settings screen so I can change the hotkeys without editing code.
Open comments for this post
Devlog 3 — The floating glass popup and a full day chasing a black box
The popup window itself was the easy part. It spawns at my cursor, reuses itself on repeat triggers instead of opening a new one every time, and the captured text streams into it with a little typewriter effect. That whole thing took maybe 20 minutes.
Then I tried to make it look like frosted glass and that ate the entire rest of the day.
Every time I turned on Tauri’s built in blur effect the window just rendered as a solid black box instead. I went around in circles on this for hours. I killed the native window shadow which fixed one version of the black box but it came right back the moment I re added the blur. I tried a community plugin that promised glass on Windows turned out to be Mac only. Then I found a github repo with a slick demo video claiming real glass, read the actual source and it was just CSS faking it. At that point I genuinely thought maybe its just not possible on Windows.
Then I found the thing that explained so much of my pain. My CSS file had never been imported anywhere in the app. Not once. Every single style change I made all session had just been silently ignored, no error no warning nothing. I just sat there for a second. All that why isnt this working was me editing a file the app wasnt even reading.
Even after fixing that Tauri’s built in blur still refused to work so I stopped using its wrapper entirely and called the underlying Windows blur library directly from a small Rust command. It worked immediately. Real native glass, no black box, first try. After a whole day of that seeing it finally render was such a relief.
One more dumb one ill note so I dont forget it. My rounded corners werent showing up and it turned out the browser paints the page background across the whole window and ignores the corner radius if you put it on the root element. Moved it onto a normal div and it was fine.
Next up is hooking the actual Groq API call in so the popup shows a real summary instead of just the copied text.
Open comments for this post
Dev log #2 Getting the hotkeys to actually work
The shortcuts finally fire and copy text. Getting there took most of the session though.
I first set up the Alt+S and Alt+E shortcuts in TypeScript since that’s the language I’m comfortable in. Bad idea. They broke every time I reloaded the page, threw errors I didn’t understand, and sometimes fired twice. After a lot of digging I figured out the problem. The shortcut is an OS-level thing, but I’d tied it to the React frontend, which reloads constantly while I’m developing, so it kept losing track of itself.
The fix was to move the shortcut registration over to the Rust side and let React just listen for when a shortcut gets pressed. That killed the whole pile of bugs at once. This was day one of me actually writing Rust so it took a while to get there.
Most of today was honestly just me with the Tauri docs and the Rust book open side by side. I was looking up basically everything. How Rust handles ownership and errors, how Tauri wants the backend and frontend to talk to each other, what half the functions even did. It was grueling. There were a few moments where I just stared at the screen wondering what I’d gotten myself into. But the docs are solid and stuff slowly started clicking, and by the end it felt good to actually understand what I was writing.
A couple smaller things I ran into. The copy only worked once I triggered on key release instead of key press, otherwise Alt was still held down and jammed the copy. And Firefox steals the Alt key for its own menu, so I’ll switch to Alt+Shift later or add custom shortcuts.
So the core loop works now. Highlight text anywhere, press the shortcut, and the app grabs it. Seeing it actually work after all that was a great feeling. I also added a little system tray icon, with menus, so it runs in the background.
Next up: make the floating window pop up near my cursor and show the result. Wire a shortcut to an LLM call.
Open comments for this post
Dev log #1
What I’m building: Snap - a desktop tool that lets you run AI actions on selected text anywhere on your system. Highlight text in any app, press a shortcut, and get an instant result in a floating window. No copy and paste, no switching to a browser tab.
The idea came from the tldr repo on GitHub. I wanted to generalize that concept system-wide into two workflows:
-
Summarize (
Alt + S) — highlight a dense article or long thread, and a floating window appears with a summary.
-
Rewrite (
Alt + E) — highlight a prompt like “write an email to my boss”, and the AI returns finished email ready to send.
Framework choice: I looked at Electron and Tauri. Electron ships a full Chromium runtime, heavy and slow, so I went with Tauri. The catch: Tauri’s backend is Rust, which I don’t know. Starting to learn it today. The upside is the frontend is TypeScript + React, which I’m already strong in, so the learning curve is contained to the system level layer.
Today’s goal: setup the Tauri app, register the Alt + S / Alt + E global shortcuts, and get the silent copy -> clipboard read working so a selection in any app lands in the Rust backend. If that’s solid, wire one shortcut end-to-end to an LLM call and render the result in the floating window.