Skip to content

Releases: MarkusNeusinger/anyplot

v3.0.0 — Julia & JavaScript, 15 libraries & the Imprint palette

10 Jun 19:06
d05e1f2

Choose a tag to compare

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.toml environment, 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 framework field (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-charts 7.29.1 (MIT) as the first framework: react and first .tsx library: the render harness gained an esbuild branch that bundles React components in a theme-aware MUI ThemeProvider (#8517).

⚠️ Breaking: Highcharts migrated Python → JavaScript

  • Highcharts is now the native highcharts.js 12.6.0 instead of the highcharts-core Python 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.py and imprint_seq / theme-adaptive imprint_div colormaps (#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).
  • /palette rebuilt twice: per-pixel OKLCH color wheel, hue cards with chroma/ΔE/WCAG metrics, compare-with overlays (Okabe-Ito, Tol muted, Set2), unified IMPRINT copy-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 new app/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, /specs thumbnails lazy-load, /stats uses aggregate COUNT queries, empty-filter fast path for /plots/filter (#7694).
  • UI fixes: tag chips correctly filter /plots again (#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_text mm-vs-pt warning (#7714).

🔧 Pipeline & ops

  • Watchdog now rescues stale ai-approved, attempt-less ai-rejected, and label-less impl PRs by re-dispatching the right workflow (#7687); impl-merge sweeps stale impl:LIB:failed labels (#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).
  • /audit retooled 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

18 May 21:16
0f3bbab

Choose a tag to compare

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: renv stdout suppression in version probe (#6948), broken renv.lock removed (#6950), prism/r type shim so tsc no 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

  • /stats now 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 /debug so 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 /stats and /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

07 May 20:36
62c9883

Choose a tag to compare

✨ New

  • /map page — 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-basic got seaborn (#5851).

🛠️ Fixes

  • iOS Safari: polyfilled requestIdleCallback so 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-effect violations refactored to React 19's "adjust state on prop change" pattern; Math.random purity issue extracted to a module-level helper (#5818).
  • Analytics safety: fire-and-forget tasks in api/analytics.py could 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_type is canonical — table is authoritative; new types added via PR.
  • data_type / domain / features are 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 --auto is set on creation (#5955); auto-update-pr-branches.yml keeps behind branches in sync after every push to main (#5957, #5958).
  • Autonomous spec polish + cross-library similarity audit in daily-regen pre-flight (#5714).
  • Daily-regen defaults to Haiku, gained spec_id and model inputs (#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.py switched to the canonical 6-category rubric and bumped claude_model default to claude-sonnet-4-6 (#5818).

🗂️ Repo

  • Plot implementations moved under plots/{spec}/implementations/python/{library}.py (metadata under metadata/python/) to make room for other languages (#5648).
  • 64 Optional[X]X | None modernizations via UP007/UP045 (#5727).

📚 Docs

  • Library expansion roadmap (#5951).
  • Plausible: FCP/TTFB Web-Vitals events documented (#5818).
  • /seo-proxy/map handler 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

29 Apr 20:52
ad387aa

Choose a tag to compare

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/9
  • area-mountain-panorama: bokeh added (highcharts still 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_TOKEN PAT for impl-merge so --admin bypasses the main-branch ruleset (#5523, #5521).

🧰 Tooling

  • /Regen command for unattended library regeneration.
  • /audit framework 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

25 Apr 22:08
048f38f

Choose a tag to compare

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/9
  • contour-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

23 Apr 21:49

Choose a tag to compare

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 to https://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-light and plot-dark variants. Theme tokens drive all chrome; mandatory theme-readability check in the AI quality pipeline.
  • 🌍 Rebrand: domain migration from pyplots.ai to anyplot.ai with 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 languages table. Implementations expose preview_url_light / preview_url_dark (legacy preview_url aliases 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.ai endpoint.
  • API consumers: prefer preview_url_light / preview_url_dark; legacy preview_url keeps working as the light variant.

Full Changelog: v1.1.0...v2.0.0

v1.1.0 — Visual Redesign & Theme Tokenization

10 Apr 22:27

Choose a tag to compare

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 for fontSize.micro/xxs and colors.primaryDark/accentBg/codeBlock/highlight/tooltipLight. Shared style constants (headingStyle, subheadingStyle, codeBlockStyle, etc.) and a centralized LIB_ABBREV map.
  • WCAG AA — fixed 15+ contrast violations (gray.400 was 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.aipp, matplotlibmpl), 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

07 Apr 21:41

Choose a tag to compare

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/