Inspiration

What it does

How we built it

Challenges we ran into

Inspiration

We all save things we mean to revisit: a concert flyer, an internship opportunity, a useful post, or an idea captured between classes. Too often, those screenshots disappear into our camera rolls instead of becoming something we act on.

AI assistants promise to help, but that convenience often starts with uploading personal content. We wanted a different approach: an assistant that understands information on your device and shares only the public details needed to find useful answers.

That became PrismLocal.

What it does

PrismLocal turns screenshots, spoken requests, and typed thoughts into practical next steps.

Upload a screenshot to extract useful details or visible links. Speak a request, review the transcript, and choose whether to search or save it. Results appear as action cards with source links, useful actions, and downloadable calendar reminders when event details are available.

A searchable local library keeps saved information accessible, while the Muse feed surfaces connections and related discoveries.

Privacy is visible throughout the experience:

  • Local processing: screenshots and voice transcription are handled on-device.
  • Limited web searches: Tavily receives short queries built from scrubbed public details.
  • Source citations: web results link back to their original pages.
  • Privacy receipts: users can inspect what left the device and what was blocked.
  • Air-Gap Mode: external application searches can be disabled while local features remain available.

How we built it

We built the interface with React, TypeScript, and Vite, backed by a Python FastAPI application.

A local Qwen vision model running through Ollama interprets screenshots. A deterministic scrubber using Presidio and spaCy checks the extracted information before a query builder creates public search queries.

Tavily supplies current web results, with Exa supporting related discovery. External search requests pass through a central egress guard rather than being scattered throughout the application.

We use SQLite for local history and durable saved items. For screenshot link lists, we added local URL extraction and an optional macOS OCR pass. Incomplete or unclear URLs require review instead of silently becoming guessed links.

Challenges we faced

The hardest problem was preserving usefulness without letting private content slip into a search request. We had to distinguish public entities from personal details and enforce that boundary in code, not just in a model prompt.

Screenshots also contain imperfect information. URLs can be truncated, characters can look alike, and event times can be missing. We learned to expose uncertainty rather than present every extraction as correct.

Another challenge was deletion. A late background job or an offline browser tab could restore information after a reset. We introduced transaction checks and persistent version markers to prevent stale writes from bringing deleted data back.

What we learned

Privacy is an architectural decision. It shapes model processing, network access, storage, deletion, and the interface.

We also learned that trustworthy AI needs understandable evidence: source links, honest error states, and a clear explanation of what happened locally versus online.

What’s next

We want to improve multi-event extraction, date and time accuracy, and URL recognition across platforms. We also plan to add freshness-aware result caching so repeated requests can reuse recent public results without presenting stale information as live.

PrismLocal: You save it. We help you make it happen.

Accomplishments that we're proud of

What we learned

What's next for LEO369

Built With

Share this project:

Updates

Submission history