{"id":49214439,"url":"https://github.com/markusneusinger/anyplot","last_synced_at":"2026-04-29T22:05:30.296Z","repository":{"id":327312891,"uuid":"1099222481","full_name":"MarkusNeusinger/anyplot","owner":"MarkusNeusinger","description":"AI-powered plotting gallery. One spec, nine libraries — matplotlib, plotly, seaborn, bokeh, altair \u0026 more. Compare and copy working code.","archived":false,"fork":false,"pushed_at":"2026-04-23T22:10:14.000Z","size":39535,"stargazers_count":7,"open_issues_count":27,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T23:33:53.478Z","etag":null,"topics":["ai-generated","altair","bokeh","code-examples","data-visualization","gallery","highcharts","letsplot","matplotlib","plotly","plotnine","plotting-library","pygal","python","seaborn"],"latest_commit_sha":null,"homepage":"https://anyplot.ai","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MarkusNeusinger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-18T18:15:06.000Z","updated_at":"2026-04-23T22:10:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"32cbe12e-54d2-4fe9-ae39-8818d6ff726a","html_url":"https://github.com/MarkusNeusinger/anyplot","commit_stats":null,"previous_names":["markusneusinger/pyplots","markusneusinger/anyplot"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/MarkusNeusinger/anyplot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarkusNeusinger%2Fanyplot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarkusNeusinger%2Fanyplot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarkusNeusinger%2Fanyplot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarkusNeusinger%2Fanyplot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MarkusNeusinger","download_url":"https://codeload.github.com/MarkusNeusinger/anyplot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarkusNeusinger%2Fanyplot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32445609,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T20:22:27.477Z","status":"ssl_error","status_checked_at":"2026-04-29T20:22:26.507Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-generated","altair","bokeh","code-examples","data-visualization","gallery","highcharts","letsplot","matplotlib","plotly","plotnine","plotting-library","pygal","python","seaborn"],"created_at":"2026-04-23T23:05:31.968Z","updated_at":"2026-04-29T22:05:30.290Z","avatar_url":"https://github.com/MarkusNeusinger.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"app/public/logo.svg\" alt=\"anyplot.ai\" width=\"250\"\u003e\n\n**→ [anyplot.ai](https://anyplot.ai)**\n\n[![Python 3.14+](https://img.shields.io/badge/python-3.14+-blue.svg)](https://www.python.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![Tests](https://github.com/MarkusNeusinger/anyplot/actions/workflows/ci-tests.yml/badge.svg?branch=main)](https://github.com/MarkusNeusinger/anyplot/actions/workflows/ci-tests.yml)\n[![Ruff](https://github.com/MarkusNeusinger/anyplot/actions/workflows/ci-lint.yml/badge.svg?branch=main)](https://github.com/MarkusNeusinger/anyplot/actions/workflows/ci-lint.yml)\n[![codecov](https://codecov.io/github/MarkusNeusinger/anyplot/graph/badge.svg?token=4EGPSHH0H0)](https://codecov.io/github/MarkusNeusinger/anyplot)\n\n\u003e library-agnostic, ai-powered plotting examples.\n\n---\n\n## What is anyplot?\n\n**anyplot** is an AI-powered platform for data visualization that automatically discovers, generates, tests, and\nmaintains plotting examples. Browse hundreds of plots across major visualization libraries — matplotlib, seaborn,\nplotly, bokeh, altair, plotnine, pygal, highcharts, and lets-plot — with an architecture ready to welcome additional\necosystems over time.\n\n**Community-driven, AI-maintained** - Propose plot ideas via GitHub Issues, AI generates the code, automated quality\nchecks ensure excellence. Zero manual coding required.\n\n---\n\n## Features\n\n- **AI-generated code** - All implementations automatically generated and maintained by AI\n- **Compare libraries** - View matplotlib, seaborn, plotly side-by-side for the same plot\n- **Always current** - AI agents continuously update examples with latest library versions\n- **Natural language search** - Find plots by asking \"show correlation between variables\"\n- **AI quality review** - Claude evaluates every plot against quality standards (score ≥ 50 required)\n- **Open source** - Community proposes ideas via Issues, AI generates the code\n\n---\n\n## Architecture\n\n**Specification-first design**: Every plot starts as a Markdown spec (library-agnostic), then AI generates\nimplementations for all 9 supported libraries.\n\n```\nplots/scatter-basic/\n├── specification.md     # Library-agnostic specification\n├── specification.yaml   # Tags, created, issue, suggested\n├── metadata/            # Per-library metadata (quality scores, preview URLs)\n│   ├── matplotlib.yaml\n│   └── ...\n└── implementations/\n    ├── matplotlib.py\n    ├── seaborn.py\n    ├── plotly.py\n    └── ... (6 more)\n```\n\n**Issue-based workflow**: GitHub Issues as state machine for plot lifecycle. Status tracked via live-updating table (no sub-issues). Each library generates in parallel, creating PRs to a feature branch.\n\n**AI quality review**: Claude evaluates generated plots using cascading thresholds (90/80/70/60/50) over 4 repair attempts. Final score ≥ 50 required for merge.\n\nSee [docs/reference/](docs/reference/) for details.\n\n---\n\n## Tech Stack\n\n**Backend**: FastAPI • PostgreSQL • SQLAlchemy • Python 3.14+\n\n**Frontend**: React 19 • Vite • TypeScript • MUI\n\n**Plotting**: matplotlib • seaborn • plotly • bokeh • altair • plotnine • pygal • highcharts • lets-plot\n\n**Infrastructure**: Google Cloud Run • Cloud SQL • Cloud Storage\n\n**Automation**: GitHub Actions\n\n**AI**: Claude (code generation + quality review)\n\n---\n\n## MCP Server\n\nanyplot provides an [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server for AI assistants to search plot specifications and fetch implementation code.\n\n**Available Tools:**\n- `list_specs` - List all plot specifications\n- `search_specs_by_tags` - Search by plot type, domain, features, library\n- `get_spec_detail` - Get full specification with all implementations\n- `get_implementation` - Get code for a specific library\n- `list_libraries` - List supported plotting libraries\n- `get_tag_values` - Get available tag values by category\n\n### Configuration\n\nAdd to your MCP client configuration (e.g., Claude Code `.mcp.json`):\n\n**SSE Transport** (recommended, wider compatibility):\n```json\n{\n  \"mcpServers\": {\n    \"anyplot\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"https://api.anyplot.ai/sse/\"]\n    }\n  }\n}\n```\n\n**Streamable HTTP Transport** (modern, bidirectional):\n```json\n{\n  \"mcpServers\": {\n    \"anyplot\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"https://api.anyplot.ai/mcp/\"]\n    }\n  }\n}\n```\n\n---\n\n## License Notes\n\nMost plotting libraries are fully open source. Note these exceptions:\n\n- **Highcharts**: Free for non-commercial use. Commercial use requires a license from [highcharts.com](https://www.highcharts.com/license)\n\n---\n\n## Project Structure\n\n```\nanyplot/\n├── plots/              # Plot specs + metadata + implementations\n├── prompts/            # AI agent prompts\n├── api/                # FastAPI backend\n├── app/                # React frontend\n├── core/               # Shared business logic\n├── automation/         # Workflow scripts (sync, labels)\n├── tests/              # Test suite (unit, integration, e2e)\n├── alembic/            # Database migrations\n├── docs/               # Documentation\n└── .github/workflows/  # GitHub Actions\n```\n\n**For details**, see [Repository Structure](docs/reference/repository.md)\n\n---\n\n## Documentation\n\n- **[Vision](docs/concepts/vision.md)** - Product vision and mission\n- **[Contributing](docs/contributing.md)** - How to add/improve specs and implementations\n- **[Workflows](docs/workflows/overview.md)** - Automation flows and label system\n- **[Reference](docs/reference/)** - API, database, repository structure\n\n---\n\n## Contributing\n\nWe welcome contributions! **All code is AI-generated** - you propose ideas, AI implements them.\n\n**Three ways to contribute** (from [anyplot.ai](https://anyplot.ai) or GitHub):\n\n| Action | When to Use | From anyplot.ai |\n|--------|-------------|-----------------|\n| **Suggest Spec** | Propose a new plot type | \"suggest spec\" link in catalog |\n| **Report Spec Issue** | Problem with a specification | \"report issue\" link on spec page |\n| **Report Impl Issue** | Problem with a library implementation | \"report issue\" link on impl page |\n\n**How it works**:\n\n1. You create Issue (or click link on anyplot.ai)\n2. AI validates and processes your input\n3. Maintainer reviews and approves\n4. AI generates/fixes the code\n5. Automated quality review ensures excellence\n\n**Important**: Don't submit code directly! If a plot has quality issues, it means the spec needs improvement, not the code.\n\nSee [contributing.md](docs/contributing.md) for details.\n\n---\n\n## Development\n\nSee **[Development Guide](docs/development.md)** for local setup instructions.\n\n---\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n---\n\n## Links\n\n- **Website**: [anyplot.ai](https://anyplot.ai)\n- **Documentation**: [docs/](docs/)\n- **Issues**: [GitHub Issues](https://github.com/MarkusNeusinger/anyplot/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/MarkusNeusinger/anyplot/discussions)\n- **Stats**: [Public Analytics](https://plausible.io/anyplot.ai)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Built by [Markus Neusinger](https://linkedin.com/in/markus-neusinger/)**\n\n[⭐ Star us on GitHub](https://github.com/MarkusNeusinger/anyplot) • [💡 Request New Plot](https://github.com/MarkusNeusinger/anyplot/issues/new?template=request-new-plot.yml)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkusneusinger%2Fanyplot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkusneusinger%2Fanyplot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkusneusinger%2Fanyplot/lists"}