AI screen capture, straight to your Drive.
A small hobby desktop tool that captures full-page web screenshots, regions, or windows on your screen, lets a vision model describe what it sees, and uploads the result to your Google Drive folder of choice.
Cross-platform (Windows / macOS), Python + PySide6, single-click bootstrap.
🛠 This is a hobby project. Built for fun, not a commercial product. Things may break, macOS testing is sparse, the UI is utilitarian. PRs and bug reports are welcome.
- 📷 Full-page web screenshots — paste a URL, get a single PNG (auto-scroll
- stitch, sticky-header neutralised, cookie banners and popups auto-dismissed).
- 🌐 Capture with your logins — a persistent Chrome profile so you can screenshot authenticated pages (Notion, dashboards, internal tools, etc.).
- 📌 Capture your active tab — connects to a debuggable Chrome you launch from the app and snaps whatever tab you're currently looking at.
- ✂ Region capture — drag a rectangle anywhere on screen, over any app.
- 🗖 Window capture — pick a window by title and snap it.
- ☁ Google Drive sync — pick a target folder (or create one by name or today's date), upload, copy share link, copy image to clipboard, download back.
- 🤖 AI vision — send your screenshot + a custom prompt to Gemini 2.5 Flash (free tier, no credit card); built-in templates: Describe, Extract text, Summarize, Find issues, Translate, Code.
- 🪟 Floating panel — always-on-top, draggable, minimises to a tiny strip when you don't need the full UI.
- ⌨ Global hotkeys —
Ctrl+Shift+S/U/Ffor capture / upload / change folder.
- Python 3.11+ with
pip(Add Python to PATH on Windows) - Windows 10/11 or macOS 12+
- A Google account (for Drive uploads)
- Optional: a free Gemini API key for AI analysis — get one at aistudio.google.com/apikey
- Optional but recommended: Google Chrome installed (otherwise Snaplens downloads Playwright's bundled Chromium, ~150 MB)
- Install Python 3.11+ — tick Add Python to PATH in the installer.
- Download or
git clonethis repo. - Double-click
run.bat.- First run creates
.venv, installs dependencies, and asks whether to download Chromium (skips if Chrome is already installed).
- First run creates
- The Snaplens panel appears (top-right of your primary screen).
- Install Python 3.11+.
git clonethis repo andcdinto it.chmod +x run.sh && ./run.sh- On first region/window capture macOS will ask for Screen Recording permission — grant it in System Settings → Privacy & Security, then restart Snaplens.
Snaplens uses your own OAuth client. Google requires this for unverified
desktop apps; it's the same pattern as rclone, gdrive, and similar tools.
The in-app OAuth wizard walks you through it:
- Click
?in the toolbar → 🔐 OAuth setup wizard. - Follow the 4 numbered steps; each has an Open button that takes you straight to the right Google Cloud Console page.
- Download the OAuth client JSON from step 4 and drop it into the wizard's drop area (or click Browse...).
- Click Change folder… in the toolbar — your Drive opens, browse, pick.
You can sign out, switch accounts, or open the wizard again any time from the
Help (?) dialog.
First time setting up a Google Cloud project? Read
docs/OAUTH_SETUP.mdfor the full walkthrough — every click named, common errors fixed, troubleshooting included.
Click the 🤖 button in the title bar after a capture. The dialog has template prompts (Describe / Extract text / Summarize / Find issues / Translate / Code) and a model selector:
| Model | Free tier | Best for |
|---|---|---|
| Gemini 2.5 Flash | ~10 RPM, 500/day | Default — most prompts |
| Gemini 2.5 Flash-Lite | ~15 RPM, 1000/day | Faster, simpler tasks |
| Gemini 2.5 Pro | ~5 RPM, 100/day | Hardest reasoning, lower limit |
Get a free API key at aistudio.google.com/apikey
(no credit card). Snaplens stores it locally in
%APPDATA%/Snaplens/config.json (or the macOS equivalent).
| Mode | How it works | Sees your logins? | Notes |
|---|---|---|---|
| 📷 URL | Headless Chromium | No | Best for public pages |
| 🌐 My Chrome | Persistent profile (chrome_b_profile/) |
Yes — log in once | First time: Help → Setup my Chrome (login) |
| 📌 Active tab | CDP to a Chrome you launched | Yes (whatever you logged into) | Help → Launch CDP Chrome; keep it open |
| ✂ Region | mss + Qt overlay | — | Works over any app |
| 🗖 Window | pygetwindow + mss | — | Full coverage on Windows; partial on macOS |
| Hotkey | Action |
|---|---|
Ctrl+Shift+S |
Capture URL (current value of the URL field) |
Ctrl+Shift+U |
Upload the last screenshot |
Ctrl+Shift+F |
Change Drive folder |
- App data:
%APPDATA%/Snaplens/on Windows,~/Library/Application Support/Snaplens/on macOS. - Screenshots:
<app data>/screenshots/ - OAuth token:
<app data>/token.json(delete to force re-login) - My Chrome profile:
<app data>/chrome_b_profile/ - CDP Chrome profile:
<app data>/chrome_cdp_profile/ - Your OAuth client JSON: in the project root (any
client_secret*.jsonis picked up automatically)
- Region capture is a black image (macOS) — grant Python Screen Recording permission and restart Snaplens.
- "No tabs available via CDP" when using Active tab — click Help → Launch CDP Chrome and keep that Chrome window open.
- Drive auth fails — delete
token.jsonin the app data dir; retry. - URL capture removes legitimate content — untick Auto-dismiss popups in the toolbar and try again, or switch to My Chrome mode.
- First-run takes 3-5 minutes — pip is fetching dependencies; Chromium download (if needed) is ~150 MB.
PySide6 frameless toolbar at the top, QStackedWidget for the full/mini state.
Capture work runs in QThread workers so the UI never blocks. Web captures use
Playwright (headless, persistent-profile, or CDP via connect_over_cdp); region
and window captures use mss + pygetwindow with a Qt overlay for the rubber-band.
Drive uses google-api-python-client with desktop OAuth (token cached in app
data dir). Gemini calls go through the google-genai SDK with the user's API key.
A run.bat / run.sh bootstrap creates a venv, installs deps, optionally skips
the Chromium download if Chrome is detected, and runs python -m app.main.
Built by Frunze Altunyan with code-generation assistance from Claude (Anthropic) via Claude Code.
Standing on the shoulders of: PySide6, Playwright, google-genai, google-api-python-client, mss, pygetwindow, Pillow, pynput.
If Snaplens saved you some clicks, you can ⭐ star the repo, open issues with feedback, or — if GitHub Sponsors is set up — sponsor. Totally optional, no pressure.