Loading page...Загружаем страницу...正在加载页面...
AtlasRepo

I Had 5,000 Screenshots and Couldn’t Find Any, So I Built: SnapRecall-Type What You Remember, Find the Screenshot

Description and use

SnapRecall automatically indexes screenshots using Gemma and offers a hybrid keyword/semantic search, enabling quick retrieval of specific images.

Problem

A user has thousands of screenshots named only by timestamp, making it hard to locate specific images when needed.

Outcome

SnapRecall provides a lightweight, background‑processing screenshot search tool that works offline with a local SQLite database and optionally uses a hosted Gemma API for vision tasks. It supports English, Hindi, and Hinglish queries and merges keyword and semantic search results to improve recall.

Workflow

  • 1. Watch the screenshots folder with watchdog.
  • 2. When a new screenshot is detected, enqueue it in a SQLite job queue.
  • 3. Downscale the image to reduce data sent to the model.
  • 4. Send the image to Gemma via the Gemini API to obtain a summary, tags, app type, and visible text.
  • 5. Combine the extracted text and generate an embedding with an embedding model.
  • 6. Store the metadata, keyword index (FTS5), and vector index (sqlite-vec) in SQLite.
  • 7. In the React UI, allow the user to type a query; perform keyword search on FTS5 and semantic search on vector index.
  • 8. Merge the two ranked lists using Reciprocal Rank Fusion and display matching screenshots.
  • 9. Provide pause/resume and progress controls; resume indexing after crashes or restarts.

Evidence

SnapRecall is a screenshot search tool. It watches your screenshots folder, lets an AI model read every image in the background, and builds a private search index.

Source

The stack: Backend: Python and FastAPI; Frontend: React (Vite, TypeScript); Storage: SQLite for everything, with FTS5 for keyword search and sqlite-vec for vectors; Folder watching: watchdog; Models: Gemma for reading screenshots, plus an embedding model for semantic search.

Source

It processes one image at a time, with a configurable pause between images; It backs off and retries when the API rate-limits it; It can pause itself when a daily request budget is reached; If the app is closed or crashes, it picks up where it stopped when it starts again.

Source

  • Record date: 2026-10-26T06:41:08.439Z