v1.0.0 — Multi-format rendering + enterprise security hardening
New features
- Multi-format output —
render_echartnow emits SVG, PNG, and/or self-contained interactive HTML in a single call, selected via theformatsargument (default["svg"]).svg— raw vector text (zero native dependencies).png— base64 image block via the optional@napi-rs/canvasdependency.html— a self-contained interactive page (pinnedecharts@6.1.0CDN).
- URL export seam —
exportToUrlpersists a rendered artifact and returns a public URL (configure viaMCP_EXPORT_DIR+MCP_EXPORT_BASE_URL), for chat-platform targets.
Security hardening
- SSRF deny-by-default — remote
image://fetches are rejected unless hostlisted viaMCP_IMAGE_ALLOW_HOSTS/security.imageAllowHosts. - Bounded inputs — option/theme depth (≤ 64) and node count (≤ 100k) guards; pixel budget and
maxImageBytescaps. - Render timeout — per-image-load
AbortSignaltimeout. - Constant-time auth — SHA-256 +
timingSafeEqualbearer-token compare. - HTML script-breakout fix —
safeJsonescaping prevents</script>injection via the embedded option. - Non-root container —
USER nodejsin the Dockerfile.
Testing & docs
- New
test:security,test:stress,test:leak,test:enterprisesuites (42 tests). - New
SECURITY.mdthreat model with implemented controls and residual risks. - Refreshed
README.md,SKILL.md, andVERIFICATION.md.
Full changelog: v0.1.2...v1.0.0