Observable Framework
An open-source static site generator for dashboards and reports: data loaders in any language run at build time and save data snapshots that the pages load as static files.
- What it is
- Static read models (data apps built ahead of time)
- Type
- Open source
- Made by
- Observable, Inc.
- License
- ISC
- Facts checked
- 9 October 2026
What it is
A Framework project is a folder of Markdown pages with reactive JavaScript code blocks, plus data loaders. A data loader is a script named for the file it produces: daily-orders.csv.py runs Python and whatever it prints to stdout becomes daily-orders.csv. JavaScript, TypeScript, Python and R are built in, shell scripts and executables work too, and more interpreters can be configured. Loaders run when observable build needs their output, which is saved to a cache in .observablehq/cache; the build only reruns a loader whose output isn’t cached. Pages load the snapshots with FileAttachment("data/daily-orders.csv"), and because those calls are found by static analysis, only referenced files are copied to dist, each with a content hash in its name so caches never serve an old version under a new page.
The result is plain HTML, JavaScript and data files that any static host or CDN can serve. Its docs make the case for that shape: data is precomputed so pages load instantly, snapshots can be aggregated and anonymized before they leave, and viewers never need access to the warehouse. Freshness comes from rebuilding; the deploy guide’s GitHub Actions workflow builds once a day and on every push. Interactivity happens in the browser: inputs re-run the reactive code, and SQL code blocks query CSV, JSON, Arrow or Parquet snapshots with DuckDB-Wasm. Parameterized routes let one page or loader generate many, such as one page per product.
Why teams pick it
- Polyglot data loaders: query the warehouse in SQL, model in Python or R, and chart in JavaScript, in one project
- Precomputed snapshots load instantly and keep warehouse credentials and raw data out of the browser
- Plain files and git: any editor, code review, CI, and hosting on GitHub Pages, S3 behind a CDN or any static host
- A large library set out of the box, including Observable Plot, D3, Mosaic, Vega-Lite and client-side DuckDB
Watch out for
- Data is only as fresh as the last build: hourly or daily rebuilds are fine for reports, not for live operations
- Everyone gets the same snapshot; per-user data needs runtime fetches to an API or access control in front of the site
- Snapshots are shipped to the browser, so they must be small and pre-aggregated, and nothing in them is secret from viewers
- Development has slowed: since January 2025 there have been two releases, a deprecation notice for deploying to Observable Cloud (April 2025) and dependency upgrades (1.13.4, March 2026), so hosting is now up to you
Alternatives
What all data apps built ahead of time have in common →How it fits with other technologies
src/data/daily-orders.csv.py: runs during `observable build`; pages load the result with `FileAttachment("data/daily-orders.csv")` · python
# Runs once per build; Framework saves stdout as data/daily-orders.csv
import csv, sqlite3, sys
db = sqlite3.connect(":memory:") # stands in for your warehouse connection
db.executescript("""
CREATE TABLE orders (day TEXT, amount REAL);
INSERT INTO orders VALUES ('2026-10-01', 40), ('2026-10-01', 25), ('2026-10-02', 90);
""")
rows = db.execute("SELECT day, COUNT(*) AS orders, SUM(amount) AS revenue FROM orders GROUP BY day ORDER BY day")
out = csv.writer(sys.stdout)
out.writerow(["day", "orders", "revenue"])
out.writerows(rows)
# After the build: dist/_file/data/daily-orders.<hash>.csv contains
# day,orders,revenue
# 2026-10-01,2,65.0
# 2026-10-02,1,90.0See it in a real stack
No architecture uses Observable Framework yet. Drop it into the playground and wire it up yourself.Open playground →Where it came from2023–2026
Before Framework, Observable was known for its hosted notebooks: reactive JavaScript documents for exploring and sharing data, written in a dialect of JavaScript of their own. Framework kept the reactive runtime but moved the work into local files, so data teams could use their own editor, source control, code review and CI, and host the result anywhere.
In February 2024 the company released Observable Framework 1.0 and billed it as Observable 2.0. Mike Bostock introduced it on Hacker News as a new open-source tool for developing data apps, written in 100% vanilla JavaScript syntax so it keeps the reactive runtime without the notebook dialect. Instead of a hosted document, a project is local files compiled to a static site, and data loaders take snapshots at build time, so dashboards load instantly without querying a database per visitor.
Releases through 2024 filled in the model: client-side SQL on DuckDB in March, parameterized routes and page loaders in September, and DuckDB-Wasm 1.29 with self-hosted extensions in November. Since then releases have been rare. In April 2025 Observable deprecated deploying data apps to Observable Cloud and pointed users to GitHub Pages, Render, Cloudflare Pages, Vercel or Netlify instead.
Why it’s built this way
- A static site, not a server
- Dashboards only create value if people look at them, and people don’t wait. Precomputing data at build time makes pages fast by construction and removes the need for viewers to reach the data source.
- Data loaders in any language
- Data teams already work in SQL, Python or R. Letting any executable produce a data file means they keep their tools for analysis and use JavaScript only for the interactive display.
- Vanilla JavaScript, not the notebook dialect
- Standard syntax with static imports from npm improves interoperability with editors, linters and other code, while keeping notebook-style reactivity.
- Static analysis of file references
- Because
FileAttachmenttakes only literal paths, the build knows which loaders to run and which files to ship, and can give each file a content hash for cache busting on deploy.
Timeline
- 2023
First preview releases on GitHub in October
- 2024
Observable Framework 1.0 released in February as “Observable 2.0”
- 2024
Client-side SQL powered by DuckDB arrives in 1.2 (March)
- 2024
Parameterized routes and page loaders in 1.11 (September)
- 2025
Deploying to Observable Cloud deprecated in April; apps move to other static hosts
- 2026
1.13.4 in March, a dependency-upgrade release
- Hacker News: Observable 2.0, a static site generator for data apps, with Mike Bostock’s comments (Feb 2024)
- GitHub: Observable Framework v1.0.0 release (Feb 2024)
- GitHub: Observable Framework v1.2.0 release (SQL code blocks powered by DuckDB, Mar 2024)
- GitHub: Observable Framework v1.11.0 release (parameterized routes, page loaders, Sept 2024)
- GitHub: Observable Framework v1.13.0 release (DuckDB-Wasm 1.29.0, Nov 2024)
- GitHub: Observable Framework releases (0.0.5 in October 2023 to 1.13.4 in March 2026)
- GitHub: observablehq/framework pull request 1972, deploy deprecation notice (Apr 2025)
- Observable Framework docs: What is Framework?
Sources13 · facts checked 9 October 2026
- GitHub: observablehq/framework README (static site generator, data loaders, ISC licence)
- Observable Framework docs: What is Framework? (static-site architecture, polyglot)
- Observable Framework docs: Data loaders (languages, caching, build behaviour)
- Observable Framework docs: Files (static analysis, content hashes)
- Observable Framework docs: SQL (client-side DuckDB over CSV, JSON, Arrow and Parquet)
- Observable Framework docs: Parameterized routes
- Observable Framework docs: Deploying (static hosting, daily GitHub Actions build)
- Observable Framework docs: home page (libraries: Plot, D3, Mosaic, Vega-Lite, DuckDB)
- GitHub: Observable Framework v1.13.0 release (DuckDB-Wasm, S3-like hosting options)
- GitHub: Observable Framework v1.13.3 release (deploy command deprecation notice, Apr 2025)
- GitHub: observablehq/framework pull request 1972 (Observable Cloud deploys deprecated)
- GitHub: Observable Framework v1.13.4 release (dependency upgrades, Mar 2026)
- GitHub: observablehq/framework LICENSE (ISC, Observable, Inc.)