Releases: MarkusNeusinger/anyplot
v3.0.0 — Julia & JavaScript, 15 libraries & the Imprint palette
anyplot 3.0 doubles the language count: Julia and JavaScript join Python and R, growing the catalog from 10 to 15 libraries — including anyplot's first browser-rendered libraries and its first React library. Every existing implementation was re-colored with the new Imprint palette, the frontend was fully restructured with CI quality gates, and the render pipeline got hard quality gates on a new, sharper canvas. One clean break earns the major version: Highcharts is now native JavaScript — its legacy Python-wrapper implementations were removed.
🟪 Julia / Makie.jl (3rd language)
- Julia 1.11 + Makie.jl (CairoMakie backend) added with full pipeline support — CI runtime via
setup-julia,Project.tomlenvironment, makie arms in every impl workflow, dedicated prompts, Julia syntax highlighting in the code viewer (#7613; fixes #7614, #7835). - 74 Makie.jl implementations at release cut, backfill continuing via bulk-generate.
🟨 JavaScript (4th language): Chart.js, D3.js, Apache ECharts
- First browser-rendered runtime: a Node 22 + Playwright headless-Chromium harness (
automation/js-render/render.mjs) renders each snippet at exact gallery pixels and emits both the PNG and a self-contained interactive HTML (#8244). - Chart.js 4.4.7, D3.js 7.9.0, Apache ECharts 5.5.1 — 30 implementations each at release cut.
- JS implementations show the Interactive toggle on the site, same model as the Python interactive libraries (#8251).
- The library registry gained a
frameworkfield (none/react/vue/svelte/angular) and per-library file-extension overrides, so future framework libraries are registry-only additions (#8244).
⚛️ MUI X Charts — first React library
- Community
@mui/x-charts7.29.1 (MIT) as the firstframework: reactand first.tsxlibrary: the render harness gained an esbuild branch that bundles React components in a theme-aware MUIThemeProvider(#8517).
⚠️ Breaking: Highcharts migrated Python → JavaScript
- Highcharts is now the native
highcharts.js12.6.0 instead of thehighcharts-corePython wrapper 1.10.0 — following the "most-used variant" rule (~1M vs ~5k weekly downloads) (#8516). - Clean break: all 322 legacy Python implementations (plus metadata) were removed; JS implementations are being regenerated via bulk-generate. Old Python deep links fall back to the spec hub.
🎨 Imprint — anyplot's new palette
- New 8-hue colorblind-safe categorical palette + 3 semantic anchors, replacing Okabe-Ito project-wide. Tuned for warm-paper rendering, validated against deuteranopia/protanopia/tritanopia, with a named API in
core/palette.pyandimprint_seq/ theme-adaptiveimprint_divcolormaps (#7692; selection process #7617; closes #5817). - All ~1,300 existing implementations migrated in a one-shot deterministic hex-swap wave across all libraries (#7776–#7798), with semantic red/amber/green restored where color carries meaning (#7777).
/paletterebuilt twice: per-pixel OKLCH color wheel, hue cards with chroma/ΔE/WCAG metrics, compare-with overlays (Okabe-Ito, Tol muted, Set2), unifiedIMPRINTcopy-paste object for Python/R/Julia/JS, and 10×10 pairwise ΔE matrices for normal + CVD vision (#7692, #8125; fixes #7997, #8005, #7713; consistent prompt naming #7892).
🖥️ Frontend modernization
- 11-PR restructure of
app/complete:routes/paths registry,layouts/+sections/split, feature folders, central API client, theme module, typed global config,src/*aliases (#8519–#8581), documented in a newapp/ARCHITECTURE.md(#8596). - Frontend CI gates: Prettier, sorted imports, unused-import lint, and full type-checking (incl. test files) now run on every PR — previously no frontend lint/type-check ran in CI at all (#8519).
- Perf: above-the-fold landing counts no longer stall up to 2 s,
/specsthumbnails lazy-load,/statsuses aggregate COUNT queries, empty-filter fast path for/plots/filter(#7694). - UI fixes: tag chips correctly filter
/plotsagain (#7516), visitors chart includes today (#7610), copy Claude-Code-ready prompts from feedback on/debug(#7611), masthead on xs (#7891), dark-mode overlay buttons (#8021), library-card blurbs for the JS libs (#8254).
📐 Render quality
- Canvas halved to 3200×1800 / 2400×2400 with proportional-sizing review rules, validated by a 540-render style experiment (#7387); typography recalibrated across all libraries (#7389, #7391–#7428).
- Hard canvas-size gate: every PNG must hit the exact target dimensions (±16 px), enforced pre-AI-review with delta-aware repair messages (#7517).
- AR-09 edge-clipping auto-reject: text touching the canvas border scores 0; altair switched to PAD-only normalization (#7528).
- Prompt guards: long titles auto-shrink (#7682), ggplot-family
geom_textmm-vs-pt warning (#7714).
🔧 Pipeline & ops
- Watchdog now rescues stale
ai-approved, attempt-lessai-rejected, and label-less impl PRs by re-dispatching the right workflow (#7687); impl-merge sweeps staleimpl:LIB:failedlabels (#7616). - daily-regen cadence rebalanced to 10× daily, default model Haiku → Sonnet (#7717, #7286).
- impl-generate can overlay
prompts/from the trigger branch — pipeline prompt experiments without merging to main first (#7385). - Fixed the dual alembic heads that had stalled the production Postgres sync (#7285); fixed silent chartjs/d3 version-lookup failures (#8248); unbroke red main from a duplicate ruff key (#7683).
/auditretooled to be goal-directed across 6 graded dimensions; first all-scope run committed: 86 findings, 1 critical (#8023, #8024).- Repo hygiene: rendered artifacts untracked + Julia Manifest committed (#7835), Serena leftovers removed (#8518), Context7 config added (#8084).
⬆️ Dependencies
21 updates: playwright 1.49→1.55, esbuild 0.24→0.25, aiohttp 3.13→3.14, idna 3.11→3.15, uvicorn ≥0.48, sqlalchemy ≥2.0.50, pyjwt ≥2.13, claude-code-action 1.0.133, plus grouped python-minor/npm-minor/MUI/react/actions bumps.
🔁 Regen & catalog
- 885 regenerations + 310 new implementations landed across the 15 libraries; 46 automated spec-polish PRs refined tags and wording.
- Catalog steady at 327 specs; R/ggplot2 coverage grew 30 → 126; the first 8 specs reached full 15/15 library coverage (pp-basic, scatter-connected-temporal, line-yield-curve, acf-pacf, recurrence-basic, funnel-meta-analysis, line-load-duration, area-elevation-profile).
Full Changelog: v2.4.0...v3.0.0
v2.4.0 — R/ggplot2, multi-language pipeline & in-app feedback
anyplot is no longer Python-only — R / ggplot2 is the 10th supported library, riding on a new multi-language pipeline that generalizes the spec → impl → review → merge flow beyond Python. Alongside that: in-app feedback, a richer /stats page, language-aware navigation across the site, and a wave of mobile/UI polish. No breaking changes.
🆕 R / ggplot2 (10th library)
- R / ggplot2 added with a full multi-language pipeline — spec, generation, review, merge, code viewer, libraries page, language counts (#6944, #6961).
- 30 ggplot2 implementations landed across foundational plot types (scatter, biplot, network variants, OHLC, frequency-polygon, voronoi, parliament, density-rug, …).
- Pipeline hardening for non-Python:
renvstdout suppression in version probe (#6948), brokenrenv.lockremoved (#6950),prism/rtype shim sotscno longer blocks Cloud Build (#7052).
💬 In-app feedback widget
- Quick-feedback widget reachable from any page (#7143).
- Dark-mode adaptation + clearer placeholder copy (#7282).
📊 Stats page
/statsnow shows the Plausible visitors chart and a daily-impl timeline (#6608).
🌐 Language across the site
- Language is now first-class in the URL and UI —
/plots?lang=filtering, cross-language carousel on plot pages, language surfaced in cards and navigation (#7142). - Plot titles include the language (#7141).
- Plausible tracks
/plots?lang=properly + test coverage (#7144). - Deep-link fix: language preserved through
/debugso R/ggplot2 deep-links work (#7066).
🎨 UI polish
- Pseudo-function styling for 404 page, footer, empty state, library card (#6436).
- Mobile: no horizontal scroll on
/statsand/mcp(#6902); breadcrumb truncation + initial FAB lift on deep links (#7283). - SEO: lowercase language in plot page title (#7206).
🔧 Pipeline & ops
- Review-retry listener + stuck-jobs watchdog added to GitHub Actions (#6084).
- Daily-regen cadence switched from 2h to hourly (#6943).
- Local style-variant experimentation script for iterating on visual styles offline (#6378).
⬆️ Dependencies
13 Dependabot bumps landed across Python (mypy 1.20→2.1, urllib3 2.6→2.7, authlib, python-minor group), npm (react, mui, npm-minor groups), and GitHub Actions.
🔁 Regen
~1200 implementation regenerations rolled across all 10 libraries during the window — quality refreshes through the daily pipeline (now hourly). ggplot2 brought 30 existing specs to 10/10 coverage; backfill continues post-release.
Full Changelog: v2.3.0...v2.4.0
v2.3.0 — 10 new plot types & end-to-end auto-merge
✨ New
/mappage — force-directed spec map clustered by tag similarity, with a teaser on the landing page (#5647, #5649, #5665).- OG images redesigned in the any.plot() visual identity — branded cards with light/dark variants (#5659).
- Mobile debug: on-device console + richer ErrorBoundary so crashes on phones are inspectable (#5808).
- Legal page gained an avatar in the operator block (#5726).
- 10 new plot types × 9 libraries:
area-stacked,bar-horizontal,bland-altman-basic,count-basic,ice-basic,radar-multi,scatter-embedding,scatter-regression-polynomial,shap-waterfall,spiral-timeseries. - Coverage filled:
horizon-basicgot seaborn (#5851).
🛠️ Fixes
- iOS Safari: polyfilled
requestIdleCallbackso the site loads on iOS (#5816). - POTD: GitHub source link now includes the language segment (#5663); letterbox strips around the preview image removed (#5943).
- Frontend lint: 32 → 0 errors. Five
react-hooks/set-state-in-effectviolations refactored to React 19's "adjust state on prop change" pattern;Math.randompurity issue extracted to a module-level helper (#5818). - Analytics safety: fire-and-forget tasks in
api/analytics.pycould be GC'd mid-flight; now held in a module-level set (#5727).
🏷️ Tag-vocabulary policy
The auto-polish step was stripping valid niche tags (bioinformatics, confidence-interval, ohlc, …) because it treated the recommended-values tables as canonical for every dimension. Vocabulary policy is now asymmetric (#5856, #5859):
plot_typeis canonical — table is authoritative; new types added via PR.data_type/domain/featuresare advisory — any well-formed, recognized data-viz term is valid; polish only moves misclassified tags or canonicalizes synonyms.
Tables expanded with legitimate tags surfaced by an audit of all 327 specs.
🔧 Pipeline
- End-to-end auto-merge: polish PRs and impl PRs squash-merge themselves once green.
gh pr merge --autois set on creation (#5955);auto-update-pr-branches.ymlkeeps behind branches in sync after every push tomain(#5957, #5958). - Autonomous spec polish + cross-library similarity audit in daily-regen pre-flight (#5714).
- Daily-regen defaults to Haiku, gained
spec_idandmodelinputs (#5706). - Resumable regen — split into single-step invocations for local-model workflows (#5650).
- Transient retry hardened across impl-generate / impl-review (#5819, #5725, #5724).
evaluate-plot.pyswitched to the canonical 6-category rubric and bumpedclaude_modeldefault toclaude-sonnet-4-6(#5818).
🗂️ Repo
- Plot implementations moved under
plots/{spec}/implementations/python/{library}.py(metadata undermetadata/python/) to make room for other languages (#5648). - 64
Optional[X]→X | Nonemodernizations via UP007/UP045 (#5727).
📚 Docs
- Library expansion roadmap (#5951).
- Plausible: FCP/TTFB Web-Vitals events documented (#5818).
/seo-proxy/maphandler so bots get a real<title>for the network map (#5818).
Full Changelog: v2.2.0...v2.3.0
v2.2.0 — Regen wave, Cloudflare Access on /debug & 4-attempt pipeline
A quality-regeneration wave (12 specs re-rolled end-to-end on Sonnet, ~3.5× throughput vs. v2.1.0), two coverage gaps filled, a 4th repair attempt added to the impl pipeline, and /debug moved behind Cloudflare Access. No breaking changes.
🔁 Regen wave
12 specs regenerated through impl-generate / review / repair / merge — same plot types, fresh code, higher quality scores. Daily-regen now runs on Claude Sonnet (#5452) and skips the 20:00–24:00 Berlin window (#5517).
✅ Coverage filled
network-basic: 8/9 → 9/9area-mountain-panorama:bokehadded (highchartsstill in-flight)
🔐 Cloudflare Access on /debug
/debug is gated behind Cloudflare Access with a service-token fallback for CI (#5522). Same-origin /api proxy fixes the cookie scope (#5551), and a hard-reload on TypeError fires the page-gate cleanly when the JWT lapses (#5552).
🔧 Pipeline
- Repair budget bumped 3 → 4 attempts with cascading thresholds (90/80/70/60/50).
ADMIN_TOKENPAT forimpl-mergeso--adminbypasses the main-branch ruleset (#5523, #5521).
🧰 Tooling
/Regencommand for unattended library regeneration./auditframework split into per-agent files; 7 new auditors added (#5413/#5451). Critical/High findings applied across multiple waves.- Mandatory PR follow-through codified in
CLAUDE.md(#5553).
⬆️ Dependencies
8 Dependabot bumps landed: uvicorn, setuptools, sqlalchemy, cloud-sql-python-connector, matplotlib, react-router-dom, plus npm-minor / python-minor / actions groups.
Full Changelog: v2.1.0...v2.2.0
v2.1.0 — Tri-state theme, pipeline resilience & 2 new plot types
Three days after the v2.0.0 relaunch: two new plot types, two coverage gaps filled, five existing specs regenerated, a tri-state theme mode, and pipeline hardening. Drop-in over v2.0.0.
🎨 New plot types
| Spec | Coverage | Notes |
|---|---|---|
venn-labeled-items |
9/9 | Venn diagram with labeled members per region |
area-mountain-panorama |
7/9 | Spec refined mid-flight to require jagged piecewise-linear ridgelines (#5411). bokeh + highcharts still in-flight. |
✅ Coverage filled
donut-basic(plotnine): 8/9 → 9/9contour-basic(pygal): 8/9 → 9/9
🔁 Regen
Five specs regenerated for quality / pipeline alignment.
🌗 Tri-state theme mode
Theme toggle gained a system / light / dark state with live OS sync — site follows the OS theme by default while still respecting an explicit user override (#5412).
🔧 Pipeline resilience
The impl-generate / review / repair pipeline is now self-healing against transient Claude Code Action failures (#5410): generate retry budget bumped 2 → 3, repair auto-retries once via marker comment, review auto-retries once via repository_dispatch. All marker counts now use --paginate --per_page=100.
📊 Analytics, polish, backend
- Tracking added for landing-page hero/libraries/palette/nav/footer interactions (#5400).
- Scroll restoration on route change (#5403/#5404), code-view paper aesthetic (#5401), mobile-search width fix (#5363).
- In-memory caching for spec lookups; review feedback from prior attempts now passed back into regeneration runs.
Full Changelog: v2.0.0...v2.1.0
v2.0.0 — anyplot.ai Relaunch
The project rebrands from pyplots.ai to anyplot.ai, ships a redesigned homepage, an Okabe-Ito color palette, and first-class dark mode for both the site and every plot preview. Major because URLs, schema, and the public domain all change.
⚠️ Breaking — bookmarks should switch tohttps://anyplot.ai. Spec URL structure changed (see below).
Highlights
- 🎨 New homepage & visual identity: hero, libraries / palette / specifications sections, MonoLisa typography, Okabe-Ito colorblind-safe palette, theme-adaptive chrome.
- 🌗 Dark mode (site + plots): backend renders dual-theme previews — every plot ships
plot-lightandplot-darkvariants. Theme tokens drive all chrome; mandatory theme-readability check in the AI quality pipeline. - 🌍 Rebrand: domain migration from
pyplots.aitoanyplot.aiwith nginx redirect-loop fixes. - 🔗 URL restructure (breaking): canonical spec URL is now
/{specId}/{language}/{library}. Hub view consolidated under/{specId}with optional?language=filter. Catalog → Plots rename. - 🗄️ Schema (breaking): multi-language path restructure with new
languagestable. Implementations exposepreview_url_light/preview_url_dark(legacypreview_urlaliases the light variant).
CI / infrastructure
- 6 workflows migrated from service-account keys to Workload Identity Federation.
- Bulk-generate moved to paced sequential dispatch with a global mutex.
- Daily cron regenerates the oldest not-recently-updated spec on a 4h cadence with a Berlin-evening blackout.
Quality
- Mandatory dual-theme rendering and readability checks in impl-generate / review.
- WCAG-AA contrast pass for dark-mode adaptive chrome.
- MUI 7 → 9, Vite 7 → 8, FastMCP v3, FastAPI 0.136, anthropic 0.97, plus security bumps for cryptography / mako / authlib / python-multipart.
Migration notes
- Bookmarks: use
https://anyplot.ai. - Deep links: update
/specs/{id}/{library}→/{specId}/{language}/{library}(e.g./scatter-basic/python/matplotlib). - MCP clients: point config at the new
anyplot.aiendpoint. - API consumers: prefer
preview_url_light/preview_url_dark; legacypreview_urlkeeps working as the light variant.
Full Changelog: v1.1.0...v2.0.0
v1.1.0 — Visual Redesign & Theme Tokenization
Visual redesign and theme tokenization pass.
Highlights
- Theme tokenization — 80+ hardcoded hex colors and font strings centralized into
app/src/theme/index.ts. New tokens forfontSize.micro/xxsandcolors.primaryDark/accentBg/codeBlock/highlight/tooltipLight. Shared style constants (headingStyle,subheadingStyle,codeBlockStyle, etc.) and a centralizedLIB_ABBREVmap. - WCAG AA — fixed 15+ contrast violations (
gray.400was 2.9:1); all text now meets 4.5:1. Keyboard-accessible zoom container with focus-visible. - Plot of the Day redesign — terminal-style frame with
$ python plots/...prompt linking to GitHub source, split layout, fade-in animation, real library + Python versions, status bar. - Responsive — mobile breadcrumb abbreviations (
pyplots.ai→pp,matplotlib→mpl), smoother RelatedSpecs grid progression (2 → 3 → 4 → 6). - Code quality — fixed pre-existing lint errors (setState in useEffect → render-time ref), AbortController fetch cleanup on unmount, full style-guide doc.
Full Changelog: v1.0.0...v1.1.0
v1.0.0
pyplots v1.0.0
First formal release of pyplots.ai — an AI-powered platform for Python data visualization examples across 9 libraries.
At launch: 309 specifications, 2,668 implementations, 439K+ lines of generated Python plotting code, 1,798 interactive HTML visualizations.
What's in it
- Browse, filter, and search plots across 11 tag categories (AND/OR logic).
- Implementations with syntax-highlighted code, AI quality reviews, and interactive previews; copy code, download PNG, open fullscreen.
- Stats Dashboard at
/stats— library quality/LOC histograms, coverage dot matrix, top-rated implementations, tag cloud, timeline. - Plot of the Day — daily featured high-quality implementation on homepage.
- Similar Specifications / Implementations via tag-based Jaccard similarity.
- MCP server for AI assistant integration.
Stack
FastAPI + async SQLAlchemy + PostgreSQL · React 19 + Vite + MUI 7 + TypeScript · 13 GitHub Actions workflows (spec creation, impl generation, AI review, auto-merge) · Google Cloud Run + Cloud SQL + GCS · 1,081 unit tests.
Links
- Website: https://pyplots.ai
- MCP:
claude mcp add pyplots --transport http https://api.pyplots.ai/mcp/