diff --git a/README.md b/README.md index 8e19b8a..22f501a 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,9 @@ npm test # Vitest - **Theming & fonts** — custom chart themes with a visual Theme Builder, a curated font roster, and your own uploaded font faces. - **Local-first** — your library lives in the browser (IndexedDB); offline-capable and installable - (PWA), with import/export for backup and transfer. No account, no server. + (PWA), with import/export for backup and transfer. No account, no server, no AI — with no + backend to send it to, your library stays on your device, so it's safe for confidential work + from the first chart. ## Status diff --git a/SOUL.md b/SOUL.md index 2eae5a2..388e957 100644 --- a/SOUL.md +++ b/SOUL.md @@ -28,8 +28,10 @@ data lives in one place and the specs stay lean. ### 1. Local-Only by Default Everything runs in the browser. Snippets, datasets, and settings never leave the machine. -No accounts, no uploads, no tracking. The only outbound requests are user-created -URL-dataset fetches. +No accounts, no uploads, no tracking, and the app contacts no third party on its own — +including an AI model. The only outbound requests are user-created URL-dataset fetches. +Because your work stays on the machine, confidential and work data are safe in Astrolabe +from the first chart. ### 2. Vega-Lite Native, Not Vega-Lite Hidden @@ -71,6 +73,9 @@ clever. - **Not a collaboration platform.** No multi-user, no sync, no comments. Import/export moves data between machines. - **Not a server app.** No backend, no rendering service, no account system. +- **Not an AI tool.** No model authors, edits, or critiques charts, and nothing is sent to + one. The chart builder's recommendations are deterministic and rule-based, computed + locally — chosen over an LLM so results are explainable and nothing leaves the machine. ## Technical Philosophy diff --git a/docs/exploration/README.md b/docs/exploration/README.md index 6fe272f..5575452 100644 --- a/docs/exploration/README.md +++ b/docs/exploration/README.md @@ -15,3 +15,4 @@ snapshots, not live numbers. - `chart-builder-enhancement-scope.md` — consolidated Tier-B → Tier-C forward plan for the Chart Builder. - `chart-theming-scope.md` — chart theming plan and slice breakdown. - `monetization-and-sync-exploration.md` — monetization + BYO-cloud-sync direction memo. +- `ai-augmentation-exploration.md` — why Astrolabe stays AI-free, and the key-storage security analysis behind it. diff --git a/docs/exploration/ai-augmentation-exploration.md b/docs/exploration/ai-augmentation-exploration.md new file mode 100644 index 0000000..6ce8d2b --- /dev/null +++ b/docs/exploration/ai-augmentation-exploration.md @@ -0,0 +1,53 @@ +# AI Augmentation — Exploration + +> **Status:** Exploration, not a commitment. Captured 2026-06-27 from a strategy +> conversation. The conclusion is folded into [`SOUL.md`](../../SOUL.md) (_Local-Only by +> Default_ and _Not an AI tool_); this memo keeps the _reasoning_ — including the security +> analysis behind rejecting browser-stored keys — so a future "should we add AI?" session +> doesn't re-derive it. +> +> **Question:** Most tools shipping in 2026 carry some AI/LLM augmentation. Should +> Astrolabe? +> +> **Short answer:** No — and the user benefit, not purity, is the reason. With no server, +> no account, and no AI, nothing the user makes is handled by a third party, so Astrolabe +> is safe for confidential and work data from the first chart. "Everyone ships AI in 2026" +> is the weakest possible reason to add it: ubiquity makes AI table-stakes noise, not +> differentiation, and a tool that demonstrably keeps your data on your machine is +> differentiated _because_ it resists the trend. + +--- + +## 1. Where AI would genuinely fit, if ever + +Two spots where Vega-Lite is actually painful and rules can't help but a model could: +natural-language authoring (NL → spec) and explaining/decoding the editor's opaque +validation errors. The obvious third — "recommend a chart from my data" — is **already +solved deterministically** by the Chart Builder's rule-based inference, and the rule-based +version is better here because it's explainable and runs locally. So the genuine surface is +narrow. + +## 2. Why browser-stored BYO keys were rejected + +The only AI model consistent with "no server, no account" is bring-your-own-key, called +direct browser → provider (never proxied through a server we run, which would put us back in +the data-custody business). The blocker is key storage: + +- A browser has **no secure vault for a secret you must read back**. localStorage, + IndexedDB, cookies — all readable by any same-origin JS, devtools, and extensions. Client + encryption only helps if the unlock secret isn't _also_ stored, i.e. a passphrase typed + each session; a key kept beside its ciphertext is theater. +- The dominant threat is therefore **same-origin script execution (XSS)**, and Astrolabe is + unusually exposed to it: it renders arbitrary user specs through vega-embed, whose + expression evaluator and data loader are a real script-execution / exfiltration surface. + Holding a secret in that origin upgrades any spec-driven bug from "annoying" to "steals + the user's key." **Introducing a stored secret raises the threat level of the whole app, + the chart renderer included** — the opposite of what the privacy posture exists to do. +- The one mitigant: LLM keys are revocable and spend-cappable, so the blast radius is "bill + abuse until you rotate it," not data loss. That's why the industry tolerates browser BYOK + at all — but it doesn't undo the origin-coupling above. + +**If AI is ever revisited:** the only acceptable form is a **session-only** key (held in +memory, never persisted, re-entered each session) called browser → provider direct, with the +core staying fully functional and offline for anyone who never engages it. Persisting the +key is the specific part that compromises the posture. diff --git a/index.html b/index.html index a598cb9..4d4e95a 100644 --- a/index.html +++ b/index.html @@ -6,6 +6,10 @@ +
Astrolabe runs in your browser. Your snippets, datasets, and settings are stored locally - on your device — there’s no server to send them to. + on your device — there’s no server to send them to. Work that has to stay + confidential is safe here.
- Astrolabe runs in your browser, and what it makes is ordinary Vega-Lite JSON — read it, - edit it in other tools, or take it elsewhere whenever you want. + Astrolabe runs in your browser, and your charts and data stay there — no account, no + server, no AI behind it to send them to — so work that has to stay confidential is safe + here from the first chart. And what it makes is ordinary Vega-Lite JSON: read it, edit + it in other tools, or take it elsewhere whenever you want.
- Charts, data, and themes are saved in this browser, and it keeps working offline - once installed. + Charts, data, and themes are saved in this browser and nowhere else — there is no + server behind Astrolabe to receive them. It keeps working offline once installed.