DEV Community

Cover image for Introduction to ProvChart — Charts Without the JavaScript Tax
FSCSS for ProvChart

Posted on Originally published at chart.devtem.org

Introduction to ProvChart — Charts Without the JavaScript Tax

Introduction to ProvChart

Most charting libraries ask you to ship 40–150 kb of JavaScript, wait for hydration, and hope crawlers eventually see the chart.

ProvChart takes a different path.

It turns your data into CSS custom properties. The browser paints the chart with native CSS (clip-path, gradients, and a few carefully chosen rules). The result is a chart that:

  • Loads with the first paint
  • Ships zero chart library to the page
  • Is fully visible to search engines on the first crawl
  • Can still be updated by changing CSS variables

No canvas. No SVG charting runtime. No “wait for JS.”


The idea in one sentence

Data → CSS variables → browser paints the shape.

You (or the API) compile points into variables like --p1, --p2, ….

A pure CSS structure uses those variables to draw lines, areas, bars, or gauges.

After that, the page doesn’t need a charting library at all.


What you get

Feature Detail
Output Self-contained HTML + CSS
Runtime on the page None for the chart itself
Types Line, area, bar, stacked bar, horizontal bar, scatter, combo, gauge
Themes Dark, light, midnight, or fully custom
SEO Chart markup is in the first HTML response
Updates Change CSS variables (or regenerate) — no virtual DOM chart layer

There is also a Developer API: send JSON, get back { html, css }, inject into any page or pipeline.


Who it’s for

  • Teams that care about LCP, TTI, and bundle size
  • Marketing and docs sites that need crawlable charts
  • Static or mostly-static pages that still need real data viz
  • Backends that want to generate charts for emails, reports, or static builds without shipping a client-side chart library

If you need heavy interaction, streaming of thousands of points, or complex JS-driven animations, a traditional library may still fit better. ProvChart optimizes for performance, simplicity, and SEO.


Quick taste (API)

const res = await fetch("https://provchart-api.devtem.org/api/v1/generate", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "YOUR_API_KEY"
  },
  body: JSON.stringify({
    type: "line",
    series: [
      { name: "Revenue", color: "#8b7bff", points: [20, 35, 48, 66] },
      { name: "Users", color: "#4fd8c4", points: [12, 28, 41, 55] }
    ],
    axisX: ["Jan", "Feb", "Mar", "Apr"]
  })
});

const data = await res.json();
// data.html + data.css → inject into the page
Enter fullscreen mode Exit fullscreen mode

ProvChart chart example

Free accounts get a few test generations so you can try the full flow.

Pro and Business unlock higher monthly limits for production use.


Open source core + hosted product

  • Rendering core: st-core.fscss (MIT) — pure CSS chart primitives for the FSCSS ecosystem
  • Hosted product: ProvChart — visual builder, dashboard, Developer API, billing (by DevTemple)

You can use the open-source core on its own, or the hosted API when you want keys, limits, and multi-series generation without maintaining the engine yourself.


Try it

Link What
chart.devtem.org Product home
Get started Free visual builder (no signup for single-series)
Docs Core + Developer API
Pricing Free / Pro / Business

What’s next from this org

We’ll publish short, practical posts on:

  • Building a small chart generator with the API
  • Using ProvChart in email digests (server-side → image/snapshot)
  • Performance and SEO notes vs typical JS chart stacks
  • Themes, multi-series patterns, and real dashboard layouts

If you care about charts that stay fast and crawlable, you’re in the right place.

ProvChart — charts without the JavaScript tax.

Top comments (1)

Collapse
 
alexshev profile image
Alex Shev

This is the right implementation lens. For a local-service site, I would make the underlying fact explicit in the content model, render it in the initial HTML, and keep the same value in JSON-LD rather than maintaining a second SEO-only field.