npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

markvis

v2.2.1

Published

Charts as text in Markdown. Write a short chart block; markvis draws it as SVG from a script tag, JavaScript, React, or any Markdown renderer. Where it cannot draw, the numbers stay as a table.

Readme

markvis

check npm

Charts in Markdown. The numbers are the picture.

Write a short chart block in Markdown. markvis draws it wherever the Markdown is shown: a page, a note, a chat reply, a docs site. Where it cannot draw, the numbers stay as a table.

type: bar
title: Visits by day
x: day
y: visits

day,visits
Mon,3
Tue,5
Wed,4
Thu,6
Fri,8

Visits by day

58 kB gzip · 0 dependencies · under 1 ms a chart · plain SVG

One script tag, in a page or a Markdown file. Every chart block on it draws.

<script src="https://cdn.jsdelivr.net/npm/markvis@2/dist/markvis.min.js"></script>

JavaScript. One call. It never throws: a wrong block comes back as its rows and one error line.

import { render } from "markvis";

element.innerHTML = render(blockText).html;

React. Follows its container, and draws while a reply streams.

import { Markvis } from "markvis/react";

<Markvis source={blockText} />

GitHub. github.com runs no scripts, so bake a picture next to the block. A workflow step can do it on every push.

npx markvis bake README.md

Tell your model. Put the 250-token instruction in a system prompt and it writes this block instead of an image or JSON. The same text opens llms.txt.

Your colors. A chart drawn in your page reads your CSS variables (--markvis-ink, --markvis-grid, --markvis-series-1 …), so it follows light, dark, and brand colors. Each color keeps a fixed fallback, and bake writes fixed colors by default.

Play · Examples · Integrate · Theming · Chart types

Why markvis

  • The chart is a table of text. Readable in raw Markdown, changed by editing one number, and a model can read the numbers back.
  • The data never disappears. Without markvis the block is readable text, and the comment form (a one-line comment above a Markdown table) shows as a plain table, on github.com too. A block that cannot draw keeps its rows and shows one error line with a stable code.
  • Models write it from a short instruction. A 250-token model instruction for a system prompt; the same text opens llms.txt.
  • Safe by design. A block holds data only: no HTML, no scripts. Every title, label, and cell is escaped in the SVG and the table.
  • Seventeen chart types with readable defaults, and no d3.

What you can write

| | | | --- | --- | | Code block tags | chart markvis vis | | Chart kinds | bar line area scatter pie hist heatmap funnel waterfall radar gauge sankey treemap dumbbell bullet boxplot calendar | | Fields | markvis type title unit x y series plus theme palette surface. Type-local: layout innerRadius min max orient role target | | Numbers | Comma-separated rows, or one Markdown table. Not JSON as the default. No JavaScript in the block. |

theme: how it is drawn: folio (default) highcharts shadcn docs ant recharts graphite. palette: colors only: ink porcelain warm cool vivid. Unknown look → table + error, never a silent swap. Pie slices are not forced to 100. Rows stay in the order you wrote them.

Install and bake

2.x replaces 0.0.13 (the old d3 renderer stays in legacy/).

npm install markvis
npx markvis bake README.md

bake writes a picture next to the file and adds a Markdown image so GitHub can show it. The code block stays. Running bake again does nothing if nothing changed. npx markvis check notes.md checks every chart block in the file and exits non-zero if any block is invalid.

On GitHub, a workflow step bakes the pictures on every push (full workflow):

- uses: geekplux/markvis@master

A blank measure cell is missing, not zero. Text such as N/A is an error (E_BAD_NUMBER) and the table stays. Omit markvis for version 2; any other version is rejected.

To parse without drawing, parseBlock(text) returns the chart or a stable error code with the rows. To read every chart in a document, parseDocument(markdown).

In a Markdown site — markdown-it, remark, or rehype. Each returns the picture and the data table:

import markdownItMarkvis from "markvis/markdown-it"; // md.use(markdownItMarkvis)
import remarkMarkvis from "markvis/remark";          // remark().use(remarkMarkvis)
import rehypeMarkvis from "markvis/rehype";          // MDX, Docusaurus: rehypePlugins: [rehypeMarkvis]

With an AI: put docs/prompt.md in the system prompt, or point a model at llms.txt or skills/markvis/SKILL.md. It should write only the fields listed there, not a PNG, and never invent a type id.

Docs

Get started · Integrate · SPEC.md · Themes · Architecture · Contributing · Changelog

In 2017 this project was a renderer (GitHub Trending). This is the rewrite: the same name, for people and for AI. 0.0.13 (the old d3 renderer): legacy/.