Releases: MarkusNeusinger/anyplot
Releases · MarkusNeusinger/anyplot
v2.0.0 — anyplot.ai Relaunch
The project rebrands from pyplots.ai to anyplot.ai, ships a redesigned homepage, a new Okabe-Ito color palette, and first-class dark mode for both the site and every plot preview. This is a major release because URLs, the database schema, and the public domain all change.
⚠️ Breaking changes — Update bookmarks tohttps://anyplot.ai. The oldpyplots.aidomain now redirects, but the spec URL structure changed: see "URL restructure" below.
Highlights
🎨 New homepage & visual identity
- Full landing-page redesign: hero, libraries section, palette section, specifications/featured-examples grid, palette swatches, masthead rule, science note (#1ecf700b, #f12d08ce, #d439ebe6, #f095287c, #d7ea3d00, #db013c7d).
- Clickable Plot of the Day with GitHub source link and tagline (#fed6fec4).
- All pages unified under the landing-page style with mobile overhaul (#49119d96, #b3df441f).
- New typography doctrine: MonoLisa-only across the site (#1ecf700b, #7cfd7fc6).
- New Okabe-Ito colorblind-safe palette with theme-adaptive chrome (#1d46297b).
🌗 Dark mode (site + plots)
- Theme toggle with
prefers-color-schemedetection and persistence. - Backend renders dual-theme previews — every plot ships
plot-light.pngandplot-dark.png(plot-light.html/plot-dark.htmlfor interactive libraries) (#0f1a9946). - Theme-aware preview selection across the API and frontend (#e5bb5a81), with mandatory theme-readability review in the AI quality pipeline.
- Theme tokens (
--ink,--rule,--bg-*) drive all chrome; CSS code-block colors fixed for both modes (#edc93f52, #c3463e43).
🌍 Rebrand: pyplots.ai → anyplot.ai
- Domain migration with nginx fixes for redirect loops (#bd4cee15, #1a20d1c5, #13a52c32, #ee32a0dc, #fec16a78, #32a933d1).
- Repository, MCP server, READMEs, and all in-app references updated.
🔗 URL restructure (breaking)
- New canonical spec URL:
/{specId}/{language}/{library}(#e24a7cd7, PR #5289). - Hub view consolidated:
/{specId}with optional?language=filter (#129e10cf, PR #5297). - Catalog → Plots rename (#4be4cc0f, #2ad0d725).
- Old paths return a
NotFoundPageinstead of looping redirects (#fec16a78, #32a933d1).
🗄️ Schema changes (breaking)
- Multi-language path restructure with new
languagestable (#306d5ba1). - Implementations now expose
preview_url_light/preview_url_dark; the legacypreview_urlis a synonym for the light variant (#0f1a9946, #e5bb5a81, #3b51f66d). - Related-specs endpoint also returns themed URLs (#3b51f66d).
Frontend
- New components:
NavBar,HeroSection,LibrariesSection,LibraryCard,PaletteStrip,NumbersStrip,MastheadRule,ScienceNote,SectionHeader,PlotOfTheDayTerminal,ThemeToggle,RootLayout,BareLayout,RouteErrorBoundary,TypewriterText(#74d98414, #d7e46ead, #fed6fec4, #4be4cc0f). - New pages:
LandingPage,LibrariesPage,PalettePage,AboutPage,NotFoundPage,SpecsListPage(#d439ebe6, #f095287c). - Route-level error boundary with chunk-reload recovery for stale deploys (#f52e97c8, PR #5298).
- ImageCard and grid now respect dark mode (last two patches in this branch —
8e9a8cf3,3b51f66d). - Pseudo-function style applied consistently across the frontend (#28e94693, PR #5293).
- MUI bumped from v7 to v9, with FilterBar breaking-change fixes (#66a3fe94, #3dd2acaf).
Backend / API
- Theme-aware preview selection in spec, implementation, related-specs, and POTD endpoints (#e5bb5a81, #3b51f66d).
- API in-memory cache invalidation after
sync-postgres(#ef0512be). - Sync triggers now include
alembic versions/(#6101bd4a). - Cloudflare bypass on cache-invalidate;
createdtimestamps preserved across regenerations (#c8921b95, #7a33c0db). - Preview URL migration to the
anyplot-imagesGCS bucket (#f37ebbdc).
CI / infrastructure
- 6 workflows migrated from service-account keys to Workload Identity Federation (#1cdb8b94).
- Bulk-generate moved to paced sequential dispatch with a global mutex (#407d34ab, #5e40a57f).
- Daily cron regenerates the oldest not-recently-updated spec (#a3af50c4); shifted to a 4h cadence with a Berlin-evening blackout (#94ad42b2).
- Mandatory dual-theme rendering and readability checks in the impl-generate / impl-review pipeline (#0f1a9946).
allowed_bots='*'set on the Claude action (#62c8c80a).nginx: stop caching/publicstatic files as 1y immutable (#ea0b1015).
Plots
- New specs added:
scatter-lag,upset-basic,bar-spine,bar-3d-categorical,network-bipartite,map-tilegrid,dendrogram-radial,heatmap-polar,spiral-timeseries,diagnostic-regression-panel,dot-matrix-proportional,heatmap-adjacency,area-cumulative-flow,ice-basic,shap-waterfall,scatter-embedding. - Implementations across all 9 libraries for
scatter-lagandscatter-basicregenerated under the new dual-theme pipeline (#5268–#5276, #5300, #5308–#5315, #5318).
Quality / tooling
- Comprehensive frontend & backend test suite expansion (#3b18c56e, PR #5277).
- WCAG-AA contrast pass for dark-mode adaptive chrome (#c3463e43).
- Style-guide synced with the landing-page rollout and mobile patterns (#9fc72a27, #966bc650, #3e73e450).
- Dependency bumps: MUI 7→9, React group, Vite 7→8, FastMCP v3, FastAPI 0.136, anthropic 0.97, SQLAlchemy 2.0.49, uvicorn 0.44, plus minor security bumps for cryptography/mako/authlib/python-multipart (#66a3fe94, #46cbe725, #44f47013, #6e2e82db, #eaf03fbe, #132a0ebe, #5bda5bb2, #76837a9f, #a3c5e059, #d438ff53, #77d1b824).
Migration notes
- Bookmarks:
https://pyplots.ai/...is gone; usehttps://anyplot.ai/.... - Spec URLs: deep links to old
/specs/{id}/{library}paths should be updated to/{specId}/{language}/{library}(e.g./scatter-basic/python/matplotlib). - MCP clients: point your config at the new
anyplot.aiendpoint. - API consumers: prefer the new
preview_url_light/preview_url_darkfields; the legacypreview_urlkeeps working as the light variant.
Full Changelog: v1.1.0...v2.0.0
v1.1.0 — Visual Redesign & Theme Tokenization
What's New
Design System & Theme Tokenization
- Centralized all 80+ hardcoded hex colors and font strings into
app/src/theme/index.ts - New theme tokens:
fontSize.micro/xxs,colors.primaryDark/accentBg/codeBlock/highlight/tooltipLight - Shared style constants:
headingStyle,subheadingStyle,textStyle,codeBlockStyle,tableStyle LIB_ABBREVmap centralized in constants
WCAG AA Accessibility
- Fixed 15+ contrast violations where
gray.400(#9ca3af, 2.9:1 ratio) was used for text - All text now meets 4.5:1 minimum contrast ratio
- Added keyboard accessibility to zoom container (role, tabIndex, Enter/Space, focus-visible)
- Added aria-labels to interactive elements
Plot of the Day Redesign
- Terminal-style frame with
$ python plots/…prompt (links to GitHub source) - Split layout: image left, info panel right
- Fade-in animation on load
- Real library and Python versions from API
>>> plot.png saved │ Library · Python 3.x.xstatus bar
Responsive Improvements
- Breadcrumb abbreviations on mobile:
pyplots.ai→pp,matplotlib→mpl - RelatedSpecs grid: smoother column progression (2→3→4→6)
- Better icon spacing in mobile breadcrumb
Code Quality
- Fixed 3 pre-existing lint errors (setState in useEffect → render-time ref pattern)
- Fixed useCallback missing dependency warning
- Added AbortController for fetch cleanup on unmount
- Added setTimeout cleanup via ref on unmount
- Removed unused ImageLightbox component
- Updated test suite for new API fields and endpoints
- Complete style guide documentation (
docs/reference/style-guide.md)
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.
Platform
- 309 specifications with 2,668 implementations across 9 libraries (Altair, Bokeh, Highcharts, lets-plot, Matplotlib, Plotly, plotnine, Pygal, Seaborn)
- 439K+ lines of generated Python plotting code
- 1,798 interactive HTML visualizations
- Fully automated pipeline: community proposes via GitHub Issues → AI generates, tests, reviews → deployed
Features
Core
- Browse, filter, and search plots across 11 tag categories (AND/OR logic)
- View implementations with syntax-highlighted code, quality reviews, and interactive previews
- Copy code, download PNGs, open fullscreen interactive views
- Responsive images (WebP + PNG, multiple sizes)
- MCP server for AI assistant integration
New in v1.0.0
- Stats Dashboard (
/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 — tag-based Jaccard similarity with hover-highlighting of shared tags
- Deferred DB loading — heavy fields (code, review data) loaded on demand, ~25MB saved per query
- Lazy code loading —
/specs/{id}/{lib}/codeendpoint, frontend prefetch
Infrastructure
- 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
- Analytics: https://plausible.io/pyplots.ai
- MCP:
claude mcp add pyplots --transport http https://api.pyplots.ai/mcp/