尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Privacy-first AI data analyst that runs entirely in the browser (DuckDB-WASM + LLM)
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A private AI analyst for your business data. Ask in plain English; your files never leave your device.
HushGlance is for founders, finance and accounting people, and anyone in business who wants answers from their spreadsheets without waiting on a report: open an Excel or CSV export (or Parquet, JSON, pasted cells), ask a question, and get a chart, a table and a short explanation, then pin it to a dashboard and share the results. It runs entirely in the browser. An LLM writes DuckDB SQL from your question, and DuckDB-WASM runs it on your device, so the rows stay with you. Only what the privacy mode allows (column names, and optionally a few statistics and sample values) goes to the AI provider you choose, with your own key, and every request is shown in an inspector exactly as sent.
No key? Sign in for 3 free questions with HushGlance AI (hosted models through OpenRouter, with zero data retention forced on every request; Starter adds 100 a month and Pro 300), or try demo mode with no sign-up: it answers a set of questions about two samples, with live SQL: a generated 1M-row sales dataset, and a small company's finances (invoices and bills: receivables, margins, cash flow).
flowchart LR
You([You]) -->|question| App
subgraph Browser["Your browser tab"]
App["React app<br/>prompts, guard, charts"]
DB[("DuckDB-WASM<br/>in a worker")]
Py["Pyodide<br/>(on request)"]
App -->|"guarded SQL"| DB
DB -->|"≤ 5,000 chart points, 200-row grid pages"| App
App -->|"approved code"| Py
end
App -->|"schema (+ stats/samples in Balanced)"| LLM(["LLM API<br/>your key"])
LLM -->|"SqlPlan JSON"| App
File[/"your file"/] --> DB
Every AI-written query passes an AST-based SQL guard before it runs: one read-only SELECT, only your
tables, no ATTACH, COPY, INSTALL, LOAD, SET or PRAGMA. DuckDB's extension autoloading is
switched off. Details, threading and a sequence diagram of the pipeline:
docs/ARCHITECTURE.md.
| Mode | Sent to the provider |
|---|---|
| Demo (no key) | Nothing. Answers are recorded plans; their SQL runs live in your browser. |
| Local server | The Strict or Balanced payload, to a model server on your own computer. |
| Strict (default, D122) | Table and column names and types, row counts, your notes. No values, no results. |
| Balanced (opt-in) | Strict, plus per-column statistics, up to 5 common values, 3 sample rows (text cut to 40 characters), and the answer's result (≤ 50 rows, or a digest) for the AI summary. |
Data values are treated as untrusted text: they're sent as JSON inside a delimited block the model is told never to follow. A production Content-Security-Policy limits network access to the two LLM APIs, the two CDNs (Pyodide, DuckDB extensions) and servers on your own computer, and an end-to-end test checks it on the built app.
Measured with the in-app benchmark (/app/bench) on the production build, on localhost: headless
Chrome 153, 10 cores, 1,000,000 rows (14 columns).
| Metric | Result | Budget |
|---|---|---|
| DuckDB ready after page load | 0.36 s | < 3 s |
| Generate the 1M-row sample | 0.78 s | < 5 s |
| Ingest a 102 MB CSV | 0.56 s | ≤ 15 s |
| Aggregation query, p50 / p95 | 20 ms / 23 ms | p95 < 500 ms |
| Chart render, 5,000 points | 2.7 ms | < 100 ms |
| Grid scroll through 1M rows | no long tasks | none > 50 ms |
| Initial JavaScript (gzip) | 269 KB | ≤ 350 KB |
Download time over a real network isn't included (DuckDB's wasm is about 8 MB gzipped, cached
after the first visit). Run the
benchmark on your machine at /app/bench and copy the results as Markdown.
evals/questions.jsonl holds 53 questions over the Global Sales sample and an HR dataset, each with a
reference query, including three the data can't answer. The runner sends each question through the
real pipeline (same prompts, guard and self-correction as the app), runs the generated and reference
SQL on the same data, and compares results: execution accuracy, not string match. Column names and
order don't matter, extra columns are allowed, and numbers match within 1e-6 or when rounded.
ANTHROPIC_API_KEY=sk-ant-… npm run evals # writes evals/report.md
OPENAI_API_KEY=sk-… EVAL_MODEL=gpt-6-luna npm run evals # or with OpenAI
EVAL_DRY_RUN=1 npm run evals # checks the harness itself, no key: 53/53
With GPT-6 Luna (OpenAI's smallest model) at medium effort, accuracy averages 93.7% over three
runs (49, 49 and 51 of 53), against 93.1% (50, 49, 49) before the example library and result checks.
The difference is within run-to-run noise. evals/report.md has the latest run's details. Each run
costs about $0.02 with Luna.
Requires Node 24.
npm ci
npm run dev # landing page: http://localhost:5173/ · the app: http://localhost:5173/app/
In the app, click Try sample data and ask one of the suggested questions (demo mode), or add an Anthropic or OpenAI key in Settings to ask anything about your own files. The landing page's "Try it on 1M rows" does both for you.
| Command | What it does |
|---|---|
npm run check | typecheck, lint, unit tests, build, bundle-size budget (what CI runs) |
npm test | unit tests (Vitest; real DuckDB through its Node build) |
npx playwright install chromium && npm run e2e | end-to-end tests in demo mode, no key needed |
npm run evals | NL→SQL evals (see above) |
node scripts/record-demo.mjs | re-record docs/demo.png after npm run build |
node scripts/record-og.mjs | re-record the landing page's link preview, public/og.png |
Deploying: docs/DEPLOY.md (Vercel; any static host that serves .wasm as
application/wasm works).
json_serialize_sql) instead of regexes.More in docs/PRD.md §12 (80+ recorded decisions).
React 19, TypeScript, Vite, Tailwind CSS v4 and shadcn/ui · DuckDB-WASM · LangChain.js (Anthropic, OpenAI) with Zod-validated structured output · ECharts · TanStack Table and Virtual · react-grid-layout · CodeMirror · Pyodide · SheetJS · Zustand · Vitest and Playwright.