Skip to content

Releases: floorianmb/prism-viz

0.8.0

Choose a tag to compare

@github-actions github-actions released this 18 Oct 09:25

New

  • What's new, live: after an update, the Prism tab opens with a page that shows the new features as live Prism charts, followed by the agent skill guide and this changelog. Prism: Show changelog opens it at the top.
  • Periods (group: day | week | month | quarter | year): dates in x are grouped into periods with sortable labels (2026-10-18, 2026-W42, 2026-10, 2026-Q4, 2026). Without aggregate the values are summed (with y) or counted. Gaps are filled (0 for count and sum, empty for avg/min/max; not with series), limit: N keeps the last N periods unless sort is set, and rows whose x is no date are left out with a warning. Details: docs/periods-goals-compute.md.
  • Reference lines (lines: [{ y, label, color }, { x, label }] and goal: N) on bar, hbar, line, area, scatter and bubble charts. The value axis grows to include them. The goal label is "Goal" ("Ziel" in German).
  • Computed columns (compute: { pace: "pages / days" }) in charts and tables: + - * / %, round, floor, ceil, abs, min, max, days(from, to) and today(). Missing values and division by zero give empty cells. Prism parses the expression itself; nothing is evaluated as code.
  • KPI tiles (type: kpi): one big number per y column or the row count. With x and group it shows the current period, the change to the previous one and a sparkline; goal adds a progress bar; format and digits set the number format.
  • Timelines (type: timeline): a Gantt chart from start and end columns (defaults: start/scheduled/date and end/due), with milestones, colors and legend by series, faded done rows, a today line and notes for rows without dates or beyond the row limit. A click opens the note.
  • Link graph (source: links and type: graph): one row per link of your notes (from, to, fromPath, toPath, folder, tags), drawn as a network with a deterministic layout. Node size by number of links, color by top-level folder, missing notes hollow, limit = most nodes (default 150, at most 500), links to attachments left out, hover highlights the neighbors, a click opens the note.
  • Sankey diagrams (type: sankey): flows from from to to sized by y. Links that would close a cycle are left out with a warning; hover highlights a flow; select works on nodes.
  • Bases: the "Prism chart" view has the chart types Calendar and Map (with the options GeoJSON file and Region property).
  • Offline check (prism-render.mjs --lint "<note>" or --lint --all [folder]): finds YAML errors, unknown keys, missing tables and columns and syntax errors in scripts without Obsidian. Same JSON as the render; exit 0 = ok, 1 = errors, 4 = file not found. It is static, so the workflow is lint first, then render for the snapshot. Details: docs/lint.md.
  • Click to source: a click on a bar, segment or day of a chart without select opens what is behind it: the table row in this note (the note scrolls to it and the row lights up briefly; the cursor stays where it is, so Live Preview does not reformat the table), the note (source: notes and links) or the note at the task's line (source: tasks). Calendars, maps and timelines from note tables jump to the row too. prism.openNote(path, newLeaf, line) takes an optional line. Details: docs/cross-filter.md.
  • Docs: docs/new-chart-types.md and example notes 22-31.

Compatibility

Existing blocks render as before. The new keys (group, lines, goal, compute, start, end, from, to, format, digits), the types and source: links were unknown before, so no existing spec uses them. One behavior changes: a click on a chart without select (and on calendar or map cells from note tables) now opens the note or table row behind it; before, it did nothing. Calendar cells from notes and tasks already opened their note; tasks now open at the task's line. Specs with their own options.onClick are not affected. The Prism tab after updates is now called "Prism: what's new, agent skill and changelog" and opens at the top instead of the skill guide; Prism: Install agent skill still opens the guide.

Agent skill

  • The skill and the reference describe the new keys and types, source: links, click to source and --lint; SKILL.md runs the offline check before the render. Run Prism: Install agent skill again to update it (it also copies prism-lint.mjs).

Internal

  • scripts/prism-lint.mjs is generated from src/lint.ts (npm run build); CI checks that it is up to date.
  • Unit tests for periods, compute, kpi, timeline, graph, sankey, trace, the Bases spec and the lint.

0.7.1

Choose a tag to compare

@github-actions github-actions released this 17 Oct 16:00

Fixes from the community directory scan of 0.7.0. Blocks look and behave as in 0.7.0.

Internal

  • Calendars and maps fade unselected days and regions with the SVG opacity attribute instead of an inline style.
  • The calendar and map legend builds its elements with the runtime's createEl helpers.
  • Series charts check for NaN with Number.isNaN, the series index is typed, and two unnecessary type assertions are gone. The output is unchanged; the tests compare it with the earlier implementation.

0.7.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 15:53

New

  • Calendar heatmaps (type: calendar): one cell per day, a row per weekday and a strip per year, like a contribution graph. Good for daily notes, habits and tasks done.
    • x is the date column (values starting with YYYY-MM-DD). With source: notes the default is the note title, so daily notes named by date need no x.
    • The value is the number of rows per day, or the sum of y (aggregate: avg | min | max to change it). true/false count as 1 and 0.
    • With source: notes or source: tasks, a click on a day opens its note and hovering shows the page preview.
    • Calendars and maps look the same in PNG/SVG exports, snapshots, baked images and the PDF export, and follow theme changes.
    • Details: docs/calendar-and-map.md.
  • Maps (type: map): colors the regions of a GeoJSON file from your data folders (geo: data/europe.geojson) by value.
    • Prism finds the feature property that matches the x values (names or codes) by itself; geoKey picks one.
    • Values without a region are listed in a warning.
    • Prism ships no map data. The example vault has the countries of Europe from Natural Earth (public domain).
  • Charts and tables from tasks (source: tasks): one row per task of your notes, narrowed with folder and tag. Columns: text, done, status, due, scheduled, start, doneDate, priority, tags, and note, path, folder, line for the note it is in. Open tasks per project or tasks done per day take a few lines of YAML now. Details: docs/frontmatter-charts.md.
  • Cross-filter without code: with select: genre on a chart, a click on a bar, pie segment, day or region sets prism.shared.genre. A second click clears it, and the other labels fade while something is selected. filter: { genre: $shared.genre } in any chart or table of the same note then shows only the matching rows; while nothing is selected, all rows show. Charts with select can also be used with the keyboard. Details: docs/cross-filter.md.
  • Export CSV in the block menu of charts and tables written as YAML: saves the numbers the block shows (after filter, search and sort) next to the note.
    • In German and other languages with a decimal comma, the file uses ; and 1,5, so Excel opens it correctly.
    • Cells that a spreadsheet would run as a formula are marked as text.
  • The render command shows what changed: when a block had a snapshot before (same theme), its result has change: how many pixels of the snapshot differ in percent, plus the size before and after. An agent can see that a layout broke even when no error was reported. --all --snapshot lists the changed blocks per note, which is useful after a Prism update.
  • Example notes 18 (calendar and tasks), 19 (cross-filter), 20 (map) and 21 (all new features in one note).

Compatibility

Existing blocks render as before. The new keys (select, geo, geoKey) and sources (tasks) were unknown before, so no existing spec uses them. Filter values written as $shared.<key> are the only new meaning of an existing key. The warning for folder/tag now also accepts source: tasks.

Agent skill

  • The skill and the reference describe source: tasks, type: calendar, type: map, cross-filters, CSV export and change in render results, with patterns and new rows in the error table. Run Prism: Install agent skill again to update it.

Internal

  • Unit tests for task rows, shared filters, calendar days, GeoJSON regions, CSV export and the snapshot comparison (121 tests).
  • Checked in Obsidian 1.14 with the example vault: every note renders without errors, and the snapshot comparison reports 0 % for unchanged blocks.

0.6.5

Choose a tag to compare

@github-actions github-actions released this 17 Oct 14:41
0573bde

Security

  • Blocks can no longer get around the network block. In a block written as a whole HTML page (<!doctype html>…) or in an .html file, some markup in front of <head> (or a <head> inside a comment) made the browser ignore Prism's Content-Security-Policy, so the block could load from and send to any server. Prism now puts the policy in front of everything the block contains. Blocks and files that load nothing from the network, or only from hosts in the network allowlist, work as before. If a block loaded scripts, images or fonts from elsewhere without being allowlisted, it now shows a CSP error like any other block: add the host under Settings → Prism → Network allowlist.
  • Exports only accept images. The image a block hands over for the PDF export, Export PNG/SVG, Copy as PNG and recordings is now checked before Obsidian uses it. An empty export shows an error instead of saving an empty file, and the PDF keeps the live block instead of a broken image.

Fixed

  • prism.edit.addRow keeps a table's block id when the id ends the table's last row (| Mon | 1 | ^habits). The id used to stay on that row, so the table lost its id: the next addRow, note.table("^habits") and charts with source: ^habits failed. The id now moves to the new last row. Tables with the id on its own line (as the docs recommend) are changed exactly as before.
  • Toggling a task with a custom status (setTask(task) without done) on [/], [-] and similar now checks it off ([x]), matching prism.note(), which reports these tasks as not done. It used to uncheck them ([ ]). [x], [ ] and calls with done: true/false behave as before.
  • modified in source: notes is the local date. It was the UTC date, so notes edited around midnight counted for the wrong day. Charts grouped by modified can move such notes to their correct day. The example notes for tasks and the habit tracker use the local date for "today" too.
  • Faster series charts: charts with series: over many rows (e.g. source: notes in a large vault) no longer freeze for seconds. The output is unchanged.

Agent skill

  • The install command in Prism: Install agent skill now installs the skill for your Prism version instead of the newest development state.
  • From this version on, the skill checks whether it matches the installed Prism and tells you when it is outdated. Skills installed before 0.6.5 cannot check this yet; update yours once. Run Prism: Install agent skill in Obsidian and copy the command shown there (your vault path is filled in), or run this in a terminal (Node.js and git needed):
    d="$(mktemp -d)" && (git clone --depth 1 --branch 0.6.5 https://github.com/floorianmb/prism-viz.git "$d" 2>/dev/null || (rm -rf "$d" && git clone --depth 1 https://github.com/floorianmb/prism-viz.git "$d")) && node "$d/scripts/install-skill.mjs" --vault '<path to your vault>' && rm -rf "$d"
    Then restart your agent.
  • The skill describes the toggle rule of setTask, the local date of modified, and how to compute "today" in a block.

Internal

  • Unit tests (npm test) for the block document, note edits, table lookup, charts, data paths and widget state; they run in CI and before every release. CI also checks that skill/reference.md was regenerated.
  • One table lookup for prism.note().table() and prism.edit, so a block always writes the table it reads.

0.6.4

Choose a tag to compare

@github-actions github-actions released this 16 Oct 14:21

New

  • Link preview delay: the page preview of a note link inside a block now waits until the pointer has rested on the link for a moment (default 0.6 s), so moving the mouse across a block no longer pops up previews. Set the time with the slider in Settings → Prism → Link preview delay (0 to 2 s; 0 opens at once). Moving away before the time is up opens nothing. This applies to links, Mermaid nodes with [[links]] and prism.hoverNote.

Fixed

  • Embedded HTML files show up again: ![[file.html]] stayed empty. The embed failed with "this._loaded is not a function", because Obsidian keeps a property of the same name on every component and it hid Prism's method. Also, Obsidian 1.14 claims .html embeds itself and shows them without scripts (also empty); Prism now takes the extension over and hands it back when it is turned off.
  • No more jumping height while a block loads: a block whose content arrives a little later (for example after prism.note() or prism.notes()) used to shrink to a few pixels and then grow again each time the note opened. A block that has been shown before now keeps its last height for a moment and only grows; if it really ends up smaller, it shrinks once its content is there.

0.6.3

Choose a tag to compare

@github-actions github-actions released this 14 Oct 15:48

Fixed

  • Blocks are see-through again: rounded corners, gaps between cards and every other transparent area of a block showed a dark rectangle in dark mode. The block's document declares the theme's color-scheme, the frame element did not, and Chromium paints an opaque background behind frames whose color scheme differs from their content's. The frame now uses the same scheme as its block.

0.6.2

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:36
fd5c637

Fixed

  • Blocks in pop-out windows get answers again (#7). prism.notes(), prism.note(), prism.data(), prism.state and the other requests failed after 20 s with "no response from Obsidian" when the note was open in a pop-out window, and blocks did not follow theme or state changes there. This also works for a tab moved to a new window.

0.6.1

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:29
28fad87

Fixes from the community directory review of 0.6.0.

Changed

  • main.js is 2.7 MB instead of 5.8 MB. Users on the Obsidian Sync Standard plan can only sync files up to 5 MB. The bundled libraries (Chart.js, D3, Mermaid, three.js, KaTeX, html-to-image) are now stored compressed and unpacked when a block first needs one, about 20 ms for Mermaid. They also no longer take up memory before they are used. The release build stays reproducible: compression uses fflate (MIT, in THIRD_PARTY_LICENSES.txt), not Node's zlib.

  • Agent skill: error messages of prism.edit and source: notes in the error table, copyable patterns for a no-code frontmatter chart and a checklist that edits its note, and what to tell the user about "Allow edits". Run Prism: Install agent skill again to update an installed skill.

  • Block menu instead of a hover toolbar: the row of five tools that appeared over the top right of a block on hover often covered its controls. It is now one small ⋯ button that opens a menu with all actions (show source, reload, fullscreen, exports, copy actions). In blocks with a title the button sits in the title row and never covers the content; in blocks without a title it is a single button in the corner. Reset zoom shows next to it while a block is zoomed.

Fixed

  • The wavy underline of errors in the editor no longer uses text-decoration styles that older Obsidian versions only partly support. It is drawn with gradients.
  • Baked images are hidden without the :has() selector, which can slow down large notes. A small Reading view post-processor marks their paragraph instead.

Internal

  • @codemirror/state and @codemirror/view are listed as dependencies. They stay external: Obsidian provides them at runtime.
  • No inline style assignment in the bake renderer, no this alias in src/editorErrors.ts, no unnecessary type assertions in src/noteEdit.ts.

0.6.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:03
6fc74a0

New

  • Widgets that edit their note (prism.edit): a block can check off tasks (setTask), set table cells (setCell), add table rows (addRow) and set frontmatter properties (setProperty) in its own note. This makes habit trackers, checklists, task boards and quick-entry forms possible, with the data kept in plain Markdown.
    • Each block asks once before its first edit (Allow edits / Don't allow) and asks again when its code changes. Other notes are never changed.
    • Edits go through the editor when the note is open there: Cmd/Ctrl+Z undoes them, and the view does not scroll.
    • Command-line renders and PDF export never edit.
    • Settings → Prism → Blocks may edit their note turns it off.
    • Example: examples/16 Habit tracker.md. Details: docs/note-edits.md.
  • Blocks follow the note as you type: prism.onNoteChange fires about 250 ms after a change in the editor, and right after a prism.edit. It no longer waits for Obsidian to save and index the note. prism.note() reads tasks and tables from the editor text while it has unsaved changes, so a task checked off by hand shows up in the block almost at once.
  • Charts from frontmatter without code: source: notes in ```viz chart and ```viz table blocks gives one row per note: title, every property, folder, path, modified and tags.
    • folder: and tag: narrow the notes.
    • New aggregate: count | sum | avg | min | max groups rows by x (and series). It also works with tables and CSV files.
    • List values such as tags count once per item, and filter matches them by containment.
    • Example: examples/17 Charts from frontmatter.md. Details: docs/frontmatter-charts.md.
  • Errors in the editor: lines that caused an error or warning are underlined (red or yellow) in Live Preview and source mode, with the message at the end of the line and all messages on hover. Errors without a line go on the block's opening fence. Settings → Prism → Errors in the editor turns it off. Details: docs/editor-errors.md.
  • Baked images for Publish, GitHub and other apps: Prism: Bake blocks as images saves a PNG of every block of the current note and links it as a plain Markdown image below the block.
    • Where Prism does not run (Obsidian Publish, GitHub, other Markdown apps, Prism switched off), readers see the image. In Obsidian with Prism it is hidden.
    • Baking again replaces the images. Prism: Remove baked images removes the lines and moves the files to the trash.
    • Details: docs/bake.md.

Fixed

  • False "This block stopped responding" after a note was in a background tab or window for a while. Chromium throttles timers of hidden frames to about once a minute, and they stay throttled for a while after the frame is shown again, so the block's heartbeat was missing. Prism now pings the block directly (messages are not throttled, while a block in a busy loop still cannot answer), starts counting again when a block becomes visible, and takes the notice back as soon as the block answers.
  • Run requests approves only the hosts it names. Before, one click on Run requests released every request of the block's current render, also to hosts that the bar had not shown. A block could name a public API in the bar and, after the click, send requests to a service on your computer or local network. Now the click approves the hosts named in the bar; a request to any other host (localhost:27124 and localhost count as different hosts) shows the bar again: This block also wants to send requests to …. Requests to several hosts at once still need just one click. See docs/online-access.md.
  • prism.state stays with its block. Blocks without id= store their state by position. Inserting a block above gave the new block the state of the old one, and every block below got its predecessor's state. Prism now records the blocks of such notes and moves the state along when blocks are inserted, removed or edited:
    • A deleted block's state is kept aside and comes back when the same block appears again (cut and paste, undo).
    • Adding id= to a block keeps its state.
    • Open blocks switch to their new state right away.
    • id= stays the reliable way to keep state; the agent skill sets it on every block that uses prism.state. Details and limits: docs/block-state.md.

Internal

  • prism.version and the version in PRISM.md come from manifest.json at build time instead of a constant in src/protocol.ts, which was forgotten once (0.4.0 reported 0.3.0).
  • npm run check-version checks that manifest.json, package.json, package-lock.json, versions.json and CHANGELOG.md agree on the version. CI and the release workflow run it.
  • New docs: docs/block-state.md, docs/online-access.md, docs/note-edits.md, docs/frontmatter-charts.md, docs/editor-errors.md, docs/bake.md; release steps in the README.

0.5.2

Choose a tag to compare

@github-actions github-actions released this 09 Oct 12:50

New

  • Pinch to zoom in every block: pinch on the trackpad (or with two fingers on a touch screen) to zoom into a chart, diagram or widget, up to 500 %. Prism zooms around the point under your fingers or the cursor.
    • Only pinching zooms. Scrolling with two fingers or the mouse wheel keeps scrolling the note, so you never get stuck in a chart while scrolling, and a chart never zooms by accident.
    • No empty space around the content: you cannot zoom out below 100 %, and a zoomed block stays flush with its edges while you move it.
    • Move around while zoomed: drag with the mouse (the cursor turns into a hand). Buttons, sliders, links, form fields and blocks with their own drag or zoom (e.g. d3.zoom) keep working as before.
    • Back to 100 %: pinch out again, or use the new Reset zoom button in the hover toolbar (only shown while zoomed). A reload of the block also resets the zoom.
    • Stays interactive: tooltips, hover, clicks and note page previews keep working while zoomed. Chart.js charts are redrawn sharp at the new size once the gesture ends.
    • Ctrl + mouse wheel zooms as well, since that is how browsers report a trackpad pinch.