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