vccs
Vue 3용 차트 컴포넌트 모음, Recharts에서 포팅
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.