vega-lite, a grammar whose package ships its own source and four CLI converters
A concise grammar of interactive graphics, built on Vega.
At a glance
- What is it?
- Vega-Lite is the declarative layer above Vega, and most of what is interesting about the repository is in the packaging rather than the grammar. The exports map points at a build directory that is committed to the tree, the published files include src, four converter binaries come with the package, and the examples directory carries a schema test next to the specs.
- Who is it for?
- Vega-Lite fits anyone generating charts from data in JavaScript or Python who wants a spec an editor can validate and a compiler that emits Vega rather than drawing code. Check three things before you depend on it.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- vega/vega-lite5,556 ★ · +61
| Repository | 2026-09-23 | 2026-11-14 |
|---|---|---|
| vega/vega-lite | 5.5k | 5.6k |
61 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The title line is an anchor tag closed by a stray img tag
The page opens with the project name as a heading linked to the project site, followed by five badges for the npm package, the GitHub actions run, codecov, prettier, and jsdelivr. The rest of the README is short by design: a paragraph on what the grammar does, five links to the documentation site, an invitation to try the online editor, and pointers to the contributing guide, the code of conduct, and the roadmap.
The exports map points into build/, and build/ is committed
The package is `"type": "module"` and its exports map sends the root import to `./build/index.d.ts` for types and `./build/index.js` for the default condition. There are two more entries. One exposes the JSON schema itself at `./vega-lite-schema.json`, which is what makes editor completion and spec validation possible from the installed package. The other is a subpath, `./types_unstable/*`, mapped to `./build/*`, whose name marks the types reached through it as unstable. Meanwhile `build/` appears in the repository's own top level listing, so the directory the exports point at is checked in rather than produced by your install, and the published `files` array carries `bin`, `build`, `src`, `vega-lite*`, and `tsconfig.json`. Shipping `src` next to `build` is the unusual part.
Four converter binaries come with the library
The manifest declares a `bin` block with four names:
"bin": {
"vl2pdf": "./bin/vl2pdf",
"vl2png": "./bin/vl2png",
"vl2svg": "./bin/vl2svg",
"vl2vg": "./bin/vl2vg"
},Three of them are the obvious image formats, and the fourth, `vl2vg`, does not follow the same pattern, exporting to Vega's own JSON rather than to a picture. So installing the package as a library dependency also puts four executables on your path, which matters in a container image or anywhere the install is not a human at a terminal. The scripts behind them live in the `bin/` directory in the tree, separate from the `scripts/` directory that holds build tooling, and the two CDN entry points, `unpkg` and `jsdelivr`, both point at `build/vega-lite.min.js`.
Every example spec is checked against the schema the package ships
The examples directory is not a folder of loose snippets. It holds `specs/`, a `compiled/` directory for the output, and two test files, `examples.test.ts` and `schema.test.ts`. The second one, by its name, tests the examples against the schema. Building them is a separate script from building the library, though `prebuild:examples` runs the library build (`build:only`) first.
Example images are built with the timezone pinned to one city
Two scripts build the examples, and both set the timezone inline rather than relying on the machine:
"build:examples": "npm run data && TZ=America/Los_Angeles scripts/build-examples.sh",
"build:examples-full": "TZ=America/Los_Angeles scripts/build-examples.sh 1",The single file variant does the same thing through `build:example` with `scripts/build-example.sh`. Pinning `TZ` to `America/Los_Angeles` is the kind of fix that only gets added after a diff shows a timestamp moving between machines, and it means the committed example images are only reproducible if you keep that environment variable. The full variant passes an argument of `1` to the shell script, and nothing in the README explains what that argument selects, so the difference between a quick examples build and a full one is only visible in the scripts directory. A separate target builds the documentation table of contents, which runs a Jekyll build and then a generator.
Angular commit conventions, prettier for formatting, release-it for tags
The tooling tells you how the project is run day to day. Formatting is prettier, with `prettier.config.js` at the root and a `.prettierignore`, and one of the five badges links to the prettier project. Linting is ESLint through the flat config file `eslint.config.js`. Git hooks live in `.husky/`, and releases are configured in `.release-it.json`, and the tag history and the manifest version agree: both currently read 6.5.0. Tests run on vitest, with a config file and a separate global setup file. Two TypeScript configs exist, one for the build and one for everything else.
Every named lead is listed with where they are now
The team section says development is led by alumni and members of the University of Washington Interactive Data Lab, then names four people with their current positions rather than their roles in the project. Kanit Wongsuphasawat is listed as now at Databricks, Dominik Moritz as now at CMU and Apple, Arvind Satyanarayan as now at MIT, and Jeffrey Heer as still at UW IDL. Three of the four links for those people point at Bluesky profiles rather than at a lab or company page, so the section reads as a record of where the maintainers ended up rather than as a statement of who owns what. The section closes by pointing at the contributors graph for the full list. The citation block below it names the same four authors in a different order, with Satyanarayan, Moritz, Wongsuphasawat and Heer, a 2017 journal article, and a DOI registered a year earlier.
Editorial conclusion
Vega-Lite fits anyone generating charts from data in JavaScript or Python who wants a spec an editor can validate and a compiler that emits Vega rather than drawing code. Check three things before you depend on it. The exports map exposes a `types_unstable` subpath, so anything you import through it carries no stability promise. The build output is committed, which means the tree you clone is not the same as a fresh build. And the example build pins the timezone to America/Los_Angeles, so example output is only reproducible with that setting.
Frequently asked questions
What is Vega-Lite?
It is a higher-level grammar for visual analysis that generates complete Vega specifications, described as a concise grammar of interactive graphics built on Vega. The package description puts it as a concise high-level language for interactive visualization, and it is `"type": "module"` and licensed BSD-3-Clause.
Is Vega-Lite open source?
Yes. The manifest declares `"license": "BSD-3-Clause"` and the repository root carries a `LICENSE` file. The citation block in the README points at a 2017 journal article by four authors from the University of Washington Interactive Data Lab, with a DOI registered the year before.
How do I validate a Vega-Lite spec in my editor?
The package exports the schema itself at `./vega-lite-schema.json`, so an editor can validate against the schema that ships with the installed package. The repository also carries an `examples/schema.test.ts` test file next to the example specs.
Does installing vega-lite put command line tools on my path?
Yes. The manifest declares four binaries, `vl2pdf`, `vl2png`, `vl2svg`, and `vl2vg`, pointing into the package's `bin` directory. `vl2vg` is the odd one out, since it emits Vega's own JSON rather than an image format. The two CDN entry points both serve `build/vega-lite.min.js`.
Is the types_unstable export path safe to depend on?
The name says it is not. The exports map has a `./types_unstable/*` entry pointing at `./build/*`, separate from the root entry, and the package also ships `src`, `build`, `bin` and `tsconfig.json` in its files list. The build directory is committed in the repository as well as published, so the tree you clone is not the same as a fresh build.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/vega-vega-lite)Star history chart for your README
[](https://hysenlabs.com/projects/vega-vega-lite)Was this useful?