Showcase: New Advanced Charts — a no‑code dashboard widget for Grist by Anupress

Hello everyone :waving_hand:

Sharing a custom widget I’ve been building: Advanced Charts — a free, open‑source
widget that turns any Grist table into a website‑style dashboard you can edit in place,
like a page builder.

Live demo (no install, no Grist needed):

Use it in Grist → add a Custom widget and paste this URL:
https://anupress.github.io/grist-advanced-charts/

What it does

  • Header + tabbed body + footer, switched in‑page (no reload).
  • Stat cards (KPI + delta + sparkline), with custom icon uploads.
  • Charts — column, bar, line, area, pie, doughnut, treemap, funnel, radar,
    scatter, gauge (Apache ECharts). Pick any columns; incompatible types are
    greyed and the best one is starred ★.
  • Breakdown blocks — group‑wise counts with dots/percent, or shown as a
    donut/pie/bar/column chart.
  • Maps — Leaflet with marker clustering, lat/long auto‑detected, up to 4
    tooltip fields per pin.
  • Editable hero / image slider per page (WordPress‑style: alignment,
    size, font, colour).
  • Dark/light with a header toggle, 10 palettes, a global Design
    panel (corners, density, width, shadows, text size), and dynamic
    subtitles with placeholders (%count, %missing, %groups…).

Privacy

No ANUPRESS server. Everything runs in your browser; data stays in your Grist
document. The widget creates exactly one table — ANUPRESS_Config — to save
your design. Map tiles are the only third‑party request, and only if you add a
map. Delete ANUPRESS_Config and it falls back to the demo.

Repo

GitHub - anupress/grist-advanced-charts: Turn Grist data into interactive dashboards with Advanced Charts for Grist by ANUPRESS. Features a drag-and-drop builder, custom color palettes, and Excel-like charts (bar, pie, stats). Secure and fully private—your data never leaves your Grist instance. Includes seamless layout editing, pre-made templates, and zero external tracking. · GitHub (MIT)

What I’d love feedback on

  1. Anything broken in your Grist? (self‑hosted especially — I’ve only tested on
    the hosted service.)
  2. Is the consent + full‑access flow clear enough on the first click of Edit?
  3. Most‑wanted next chart type (sankey, heatmap, boxplot, candlestick…)?
  4. Would per‑industry starter templates (Sales / HR / Inventory / Research)
    be useful to you?

Thanks for taking a look — happy to answer questions or take PRs.
— Anupress Team

10 Likes

Updated: V2.0.0

  • Fixed critical crash on self-hosted Grist — “Add a block” silently failed after clicking a tile. Obfuscator was mangling internal object keys; disabled the offending options and hardened the DOM helper.

  • New: Guided chart wizard — “Not sure? Let me help” opens a 3-step plain-language flow (which table → what to compare → what to measure), suggests the best chart type, adds it to your page.

Feel free to share your suggestions/opinions.

Thank you!

1 Like

Update: v3.0.0. This one grew a lot since the wizard shipped in 2.0 — the widget has gone from charts on a page to something closer to a page builder that happens to live inside Grist.

22 block types now (up from 5). The ones this forum will probably care about most: a data table with search, click-to-sort and paging; an invoice block that renders a row as a printable document (line items from a linked table, or a single amount column); and a calendar where dragging an event to another day writes the new date back to your table. There are also progress bars, image blocks that read Grist attachments, testimonials, timelines, pricing tables, countdowns, QR codes and a sandboxed HTML embed.

10 starter templates. Each installs a complete multi-page dashboard plus sample tables with real-looking data. Any of its tables can instead be pointed at one of your own — there’s a column-matching step, and it only ever reads from yours. Switching templates offers to clean up the sample tables the widget created earlier; tables you made yourself are never on that list. You can preview them without Grist by URL: finance, research labs, developers — or swap in any of: nonprofits, legal, higher-education, marketing, small-business, sports-facility.

Print and PDF. Every block has an “Add to printout” button in view mode. Collect blocks from any pages, arrange them on an A4 or US Letter sheet with page-break guides that match where the printer will really break, and print or save as PDF. Data tables print as clean reports; an invoice prints alone.

Edit data from the dashboard. On a live document, every data block’s editor has an “Edit the data in …” button: fix a value or add rows, written to Grist as one undoable step. Formula columns show read-only. There’s also a Refresh button that re-reads every table the page uses.

Smaller things worth knowing: 16 palettes and 7 font pairings, a 509-icon searchable library, every control works from the keyboard, and dates are read and written in the column’s own timezone, so nothing drifts a day between regions.

Privacy hasn’t changed: no server, everything runs in the viewer’s browser, and the design saves into your own document.

Demo: Advanced Charts — by ANUPRESS
Docs if you want the long version: the setup guide, a tour of all ten templates, and a block-by-block tutorial. Full changelog is on GitHub.

If your industry is missing from the templates, tell me what tables you keep and I’ll look at building it.

3 Likes

Thank you, it’s brilliant!
You have a lot of competitors, but your approach and integration with Grist is impressive!

  • Please consider the possibility of barcode generation (EAN 13) and DataMatrix in addition to the QR code.
  • Are there any further plans to create integrated forms to receive feedback and fill in the tabular data of the Grist target table? (I understand that Grist has its own forms, but form in page block is candy).
  • Customizable page sizes for Print&PDF, I think in the future it will allow, in addition to invoices, to create and model labels (labeling products, creating price tags, labeling documents and inventory, branded business cards, printing on any roll thermal transfer printer).
  • And most importantly, it’s a ready-made nocode website builder!
    Obviously, you plan to publish the created pages using the SaaS model in your cloud, it seems logical to me. If I guessed correctly, I ask you not to forget about paranoids like me and applications limited by the laws of the country on personal data and give the opportunity to Deploy the app to self-host server.
1 Like

Thank you, that’s good to hear.

  • Barcodes, yes. Closer than it looks, too: I wrote the QR encoder by hand instead of pulling
    in a library, and DataMatrix needs the same Reed-Solomon maths that’s already in that file.
    EAN-13 is easier still, thirteen digits and a check digit. Both are on the list now.

  • Page sizes might be the easiest thing you’ve listed. The print layout already sets a real
    page size; it only offers A4 and Letter. Open that up to any width, height, and margin,
    and labels and price tags mostly fall out of it. Thermal roll printers hadn’t crossed my
    mind, so thanks for that.

  • Forms I want too, though I should be honest about what it could be. The widget runs inside
    your document with your own access, so a form block is good for adding rows from the
    dashboard itself, a quick-entry panel next to the numbers it feeds. It can’t be a public
    form for people outside the document, because there’s no page out there for a stranger to
    open. Grist’s forms handle that case properly. Two different problems, and I’d rather do
    the small one properly than half-do the big one.

  • Your last point I can answer today rather than someday. There’s no ANUPRESS server, and
    there won’t be one sitting between you and your data. It’s MIT licensed, runs entirely in
    your browser, and writes its design into a table in your own document. Host the files
    yourself and point Grist at your copy, self-hosted Grist included. No account, no sign-up,
    nothing phoning home. I built it that way because I’m one of the paranoid ones.

If publishing outside the document ever happens, it’ll be optional, and self-hosting won’t
be the second-class version.

1 Like

Hi @anupress

Thanks for this amazing work! Would it be possible to add a “slicer” component allowing you to filter other components based on user selection inside the component? This would create something closer to a BI tool, but I guess it might be difficult to implement (especially because you’d have to let the page editor define which components will be filtered by this or that slicer; the filter column should be linked to a column in the tables behind every other component on the page, except if the slicer is configured to only filter components linked to tables that have a column with the same name as the one used in the filter; and handling filters from multiple slicers could be tricky). Maybe another possibility would be to somehow mimic Grist’s native possibility to select data in a table by data in another table thanks to reference columns?

1 Like

Hi Anthony,

Built it. It went out in 3.2.0 as a Slicer block.

The chips were the easy part. What took thinking was the thing you flagged: which blocks is a slicer allowed to touch? I ended up using both of your ideas. A block gets filtered if it reads the slicer’s table, if its table has a column with the same name, or if the two tables are joined by a reference column in either direction. So a slicer on Clients narrows the invoices that point at those clients, which is what “select by” does in Grist. Anything the rules can’t connect gets left alone. Two slicers on a page combine with AND; two values inside one slicer, with OR.

Funny timing, actually. The reference-following only became possible last week, when I was fixing how reference columns display and ended up with the metadata for it sitting right there.

The editor shows you what a slicer will reach before you save it, something like “Filters 9 blocks on this page: Total Revenue, Units Sold, …” If the automatic rules grab the wrong blocks you can tick the ones you want instead.

The part I’m pleased with is that I didn’t have to change a single block. They all already read rows through one provider call, so the slicer just hands each one a provider that returns fewer rows and they don’t know the difference.

I should say the reference rules are only tested against a made-up document so far, since the demo data has no reference columns in it. If you try it on something real and it does something odd, tell me.

It’s on the first page of the demo if you want to poke at it.

I’m trying to figure out the new slicer block but it seems to be reverting to a new chart when I select the slicer in the editor.

1 Like

Hello @Joseph_S,

You weren’t doing anything wrong. Clicking Slicer really did open the chart editor. It’s fixed in 3.2.3, live now. One thing to know: your browser keeps the previous copy of the widget for about ten minutes, so if you still see “Add chart”, hard-refresh the tab (Ctrl+Shift+R). A fresh slicer picks your table’s first Choice column and the panel lists which blocks it will filter. Thanks for reporting it within a day of the release, that was useful.

Thanks, it’s working as intended now.

Next is a separate ask if it would be possible to create multiple dashboards per document? I’ve tried this with the current setup but the back end config table being referred by different widgets just point to the same reference (meaning any changes I make on one dashboard is just mirrored on the other). Perhaps subsequent dashboard widgets can be pointed to a custom table (so we can rename this as well). Use case being I’d like to compartmentalize Operations dashboards from Finance and perhaps project-specific dashboards later on.

1 Like

Hi @Joseph_S,

Good to hear it’s working. And yes, your second ask was a fair one, so it’s in.

Both widgets were reading the same row of the config table, which is why they could only mirror each other. As of 3.7, each widget remembers which dashboard it shows. Open Settings → Dashboards in any widget: make a new one, either blank or as a copy of the current design, point that widget at it, and the other widget keeps what it had. Operations on one page, Finance on another, a project of its own later on. They all stay in the one config table, one row each, so nothing else about saving or templates changes.

I went with rows in the existing table rather than a table per dashboard. Renaming stays a rename instead of a table rename, and the start-from-scratch safety rules stay simple.

A few things are there to keep dashboards from stepping on each other. A widget that has never chosen a dashboard asks on its first Edit whether to show an existing one or start its own. A template installed into a dashboard that already has a design goes into a new dashboard by default, named after the template. And the table clean-up never lists a table another dashboard reads.

The guide has a short section on it: Advanced Charts: Free Grist Custom Widget Guide (2026)

Reload the widget to pick up the latest build. If two widgets on two pages behave any differently from what you expect, tell me.

Hi again, I’ve configured the dashboard to aggregate information for one of our training programs from our non-profit. This takes the master list table information and functions fairly well save for a few areas for improvement:

  • Pre-selection of slicer choices; Our master list contains records of all applicants to the program, which may be useful for overall program analytics, but is overkill for our day-to-day. The current setup requires slicer selection each time the dashboard is opened.
  • Custom sorting of chart groups; I have an age group series that seems to go out of sequence unless I force it to sort by value (still not ideal)
  • Custom renaming/override of chart groups; less of an issue but we currently have a workaround to do this by making a new column to present the desired display names and pulling data from that.

Thanks for the work on this widget!

Just noting that the above items have been implemented as of October 9, our team is using these on the dashboards. Much appreciated!

1 Like