VaultSnip
Turn sensitive report snips into client-safe replicas.
Try it now: https://vaultsnip.pages.dev (no sign-up; the sample dashboards need no key)
Also on Hugging Face: https://huggingface.co/spaces/karthikvalluri/vaultsnip · Chrome and Edge store listings are in review.
VaultSnip takes a screenshot of any dashboard or report (BI tools, Excel, PDF report pages, product analytics, SaaS apps), masks sensitive text on your device, and builds a watermarked, interactive replica that runs on generated data. Nothing is stored.
capture → local OCR → mask everything except an allowlist → independent re-scan gate
→ you approve the exact payload → Claude or OpenAI returns a layout spec (your key)
or VaultSnip reads it on your device (no key, beta)
→ synthetic replica (3 privacy modes) → one self-contained HTML export
See it in action
https://github.com/user-attachments/assets/0df82dff-e0f8-49a3-b7a6-e36bdc1e8ddf
Snip → mask on your device → re-scan gate → approve the exact payload → interactive replica on synthetic data (click a country and every number changes).
Features (v0.8.0)
| Area | Status |
|---|
| Samples first on screen 1 (no key needed) | ✅ 4 samples; the first runs the full redaction demo, the last is a paginated report |
| Upload, paste (on any screen, or with the Paste button), extension snip with crop | ✅ |
| Local OCR (Tesseract.js, WASM) | ✅ normal, inverted, high-contrast and block passes; implausible "words" from chart shapes are ignored |
| Mask by default, allowlist to keep | ✅ client names, IDs, emails and unlisted text are masked; numbers are replaced with invented values of the same size (or masked, if you prefer) |
| Blur text in charts on any page (extension) | ✅ right-click → "Blur text in charts on this page" or Alt+Shift+B: charts drawn on canvas (Power BI, Tableau, ECharts…) are read on your device and sensitive text is blurred in place; run again to remove |
| On-device name check (AI) | ✅ a 19 MB PII model in a Web Worker masks safe words used as names ("May Chen", "Delta Airlines"); only adds masks; can be switched off |
| Unread-text check (AI) | ✅ two small PP-OCRv5 models (5 MB and 7 MB) find every patch of text and read it again line by line, and mask any the reader missed or could not vouch for; only adds masks; can be switched off |
| Independent re-scan gate (Pass / Review / Blocked) | ✅ six independent re-reads of the masked image, plus one-click Hide everything uncertain |
| Review: click to toggle, drag to add masks | ✅ |
| Customer comments: keep the wording of verbatims, mask the names, emails and numbers inside them | ✅ opt-in; replicas quote only words that were readable in the approved image |
| Exact-payload preview before anything is sent | ✅ |
| Bring your own key: Claude (Anthropic) or OpenAI, direct browser call | ✅ key type detected automatically; "Check key" lists the models your key can use; held in memory unless you tick "remember" |
| Replica: KPI, bar, column (clustered, stacked, 100% stacked), line, area, combo, pie, donut, treemap, funnel, waterfall, scatter, bubble, heatmap, gauge, box plot, histogram, Sankey, Gantt/timeline, table, with reference lines | ✅ Apache ECharts 6; see the Supported charts page in the app |
| Build on this device (beta) | ✅ no key, nothing sent: panels, chart types (maps, combo, waterfall, gauge, funnel, Gantt and heatmap charts included), how series sit and reference lines, shapes, titles and tables read from the masked image in a Web Worker; checks each chart against the masked image; says how sure it is, and below 90% offers "Fix it here", "Use my AI key" or "Keep this result" |
Privacy
No backend, no database, no accounts, no analytics. Images, OCR text and results live in the tab's memory. The only thing that ever leaves the device is the masked image you approved, sent straight to the AI provider you chose (Anthropic or OpenAI) with your own key, and only if you choose that over building the replica on your device. The browser stores only the OCR model (an app asset) and, if you choose, your key. See PRIVACY.md.
Feedback and support
- In the app: click Feedback (top right) or Report a problem (footer). Errors also offer Report this. Your report opens on GitHub, pre-filled with the version, browser and step, and never includes your screenshot or dashboard text. No GitHub account? Choose Email instead.
- Bugs: open a bug report · Replica problems: open a replica report
- Ideas and questions: Discussions
- Sensitive text left unmasked: report it privately, see SECURITY.md
More in SUPPORT.md.
Run it locally
cd web
python3 -m http.server 8080 # or: npx serve .
Open http://localhost:8080 and click Try with sample dashboards. Opening index.html directly as a file won't work, because the OCR engine needs http.
Load the extension (Chrome or Edge)
./build.sh --bundle-models # model packed inside the extension (local testing and store uploads)
- Open
chrome://extensions (or edge://extensions) and switch on Developer mode.
- Load unpacked → choose
dist/extension.
- Open any dashboard tab, click the VaultSnip toolbar icon, drag over the area, and go.
- To blur sensitive text inside the page's charts without leaving it, right-click → Blur text in charts on this page (or Alt+Shift+B). Run it again to remove the blur.
Use the same --bundle-models build for the Chrome Web Store and Edge Add-ons: the OCR model ships inside the extension (about 7 MB zipped), so it works offline and makes no network request until you send an approved image to your AI provider. Tagged releases attach ready-made packages automatically.
Deploy
- Web app: Cloudflare Pages, connected to this repo. Build command: none. Output directory:
web. Every push to main deploys.
- Hugging Face Space: a Static Space with the two files in
dist/hf-space (README.md and a page that shows the live web app), so it always runs the latest release. Live at https://huggingface.co/spaces/karthikvalluri/vaultsnip.
- Chrome Web Store / Edge Add-ons: run
./build.sh --bundle-models, then upload dist/vaultsnip-extension.zip; privacy disclosures in PRIVACY.md.
Project layout
web/ the app (static, no build step), published as-is
index.html screens and styles
app.js pipeline: OCR, masking, gate, review, AI call, export
llm.js AI providers (Claude, OpenAI): the only code that calls an AI service
replica.js replica engine, also inlined into every export
feedback.js in-app feedback and error reporting
samples.js bundled fictional samples
maps/ map outlines (Natural Earth, simplified)
lib/ lang/ tesseract.js + OCR model, echarts, vs-context.js (on-device AI client)
ml/ models/ on-device AI: Web Worker + ONNX runtime (npm run build:ml), PII and text-region models (npm run fetch:model)
extension/ manifest.json; background.js, canvas-ocr.js, offscreen.*, wasm/ built from src/ (npm run build:ext)
src/ TypeScript sources: name check, chart blur (background/, content/), exports (export/, exporters/), realistic names (replica/)
tools/ check.mjs, e2e.mjs, build-ml.mjs, fetch-model.mjs, maps/build_maps.py
build.sh builds dist/web, dist/extension, dist/hf-space and zips
Contributing
Contributions are welcome. Please read CONTRIBUTING.md and the code of conduct. In short: no real data anywhere, no new data flows, and npm run check plus npm run e2e must pass. Changes are listed in CHANGELOG.md. How accuracy is measured, today's figures and the plan for raising them are in ACCURACY.md.
License
Apache License 2.0 © 2026 Karthik Valluri. Third-party components are listed in THIRD_PARTY_NOTICES.md.