# wavefont

> Typeface for visualizing waveform data

Latest version **3.8.2** (published 2026-09-27) · (MIT AND OFL-1.1) license · 0 weekly downloads

## Install

```sh
npm install wavefont
pnpm add wavefont
yarn add wavefont
bun add wavefont
```

## Health

**Score 70/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; recently updated; high maintenance score; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 3.8.2 |
| Published | 2026-09-27 |
| First published | 2016-08-23 |
| Weekly downloads | 0 |
| License | (MIT AND OFL-1.1) |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 617.7 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 469 |
| Author | Dmitry Iv |
| Maintainers | dfcreative, dy |
| Keywords | sound, audio, datavis, opentype, waveform, spectrum, fft |

## Links

- npm: https://www.npmjs.com/package/wavefont
- Repository: https://github.com/dy/wavefont
- Homepage: https://github.com/dy/wavefont#readme
- Issues: https://github.com/dy/wavefont/issues
- npm.io page: https://npm.io/package/wavefont

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 3.8.2 (latest) — 2026-09-27
- 3.8.1 — 2026-09-26
- 3.8.0 — 2026-09-26
- 3.7.0 — 2026-09-26
- 3.6.0 — 2026-07-10
- 3.5.0 — 2023-09-14
- 3.4.0 — 2023-09-08
- 4.0.0 — 2023-09-07
- 3.3.1 — 2023-03-05
- 3.3.0 — 2023-03-02
- 3.2.0 — 2022-12-19
- 3.1.1 — 2022-12-16
- 3.1.0 — 2022-12-15
- 3.0.0 — 2022-11-02
- 1.2.2 — 2016-08-26
- … 10 more at https://npm.io/package/wavefont/versions

## README

# wavefont [![build](https://github.com/dy/wavefont/actions/workflows/build.yaml/badge.svg)](https://github.com/dy/wavefont/actions/workflows/build.yaml)

A typeface for rendering vertical bars data: waveforms, spectrums, diagrams, histograms, columns etc.

<a href="https://dy.github.io/wavefont"><img src="./preview.png" width="640" alt="Text set in Wavefont: a title and two paragraphs of bars, one word selected and set bold, a toolbar of weights"></a>

[**Playground**](https://dy.github.io/wavefont/scripts)&nbsp;&nbsp;•&nbsp;&nbsp;[**Google fonts**](https://fonts.google.com/specimen/Wavefont)&nbsp;&nbsp;•&nbsp;&nbsp;[**V-fonts**](https://v-fonts.com/fonts/wavefont)&nbsp;&nbsp;•&nbsp;&nbsp;
[**Wavearea**](https://dy.github.io/wavearea?src=https://cdn.freesound.org/previews/147/147582_1728127-lq.mp3)

## Usage

Place [_Wavefont[ROND,YELA,wght].woff2_](./fonts/variable/Wavefont[ROND,YELA,wght].woff2) into your project directory and use this code:

```html
<style>
@font-face {
	font-family: wavefont;
	font-display: block;
	src: url(./Wavefont[ROND,YELA,wght].woff2) format('woff2');
}
.wavefont {
	--wght: 400;
	font-family: wavefont;
	font-variation-settings: 'wght' var(--wght), 'ROND' 30, 'YELA' 0;
}
</style>

<!-- Set values manually -->
<textarea id="waveform" class="wavefont" cols="100">
abcdefghijklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
</textarea>

<script>
// Set values programmatically (more precise)
waveform.textContent = Array.from({length: 100}, (_,i) => String.fromCharCode(0x100 + i)).join('')
</script>
```

## Ranges

Wavefont bars correspond to values from 0 to 100, assigned to different characters:

* <kbd>0-9</kbd> chars are for simplified manual input with step 10 (bar height = number).
* <kbd>a-zA-Z</kbd> for manual input with step 2, softened at edges <kbd>a</kbd> and <kbd>Z</kbd> (bar height = number of letter).
* <kbd>U+0100-017F</kbd> for 0..127 values with step 1 (`char = String.fromCharCode(0x100 + value)`). <kbd>U+0180</kbd> renders as max bar (off-by-one clamp guard), higher codepoints render blank — clamp values to _127_.

## Variable axes

Tag | Range | Default | Meaning
---|---|---|---
`wght` | _4_-_1000_ | 100 | Bar width, or boldness. Advance width scales with it: _100_ ≙ 0.025em, _400_ ≙ 0.1em, _1000_ ≙ 0.25em.
`ROND` | _0_-_100_ | 100 | Border radius, or roundness (percent).
`YELA` | _-100_-_100_ | -100 | Alignment: bottom (_-100_), center (_0_) or top (_100_).

To adjust axes via CSS:
```css
.wavefont {
  font-variation-settings: 'wght' var(--wght, 40), 'ROND' var(--rond, 0), 'YELA' var(--align, 0);
  letter-spacing: 1ch; /* 1ch unit === 1 bar width */
}
```

## Features

* Ranges, values and width is compatible with [linefont](https://github.com/dy/linefont), so fonts can be switched preserving visual coherency.
* Visible charcodes fall under _marking characters_ unicode category, ie. recognized as word by regexp and can be selected with <kbd>Ctrl</kbd> + <kbd>→</kbd> or double click. Eg. waveform segments separated by ` ` or `-` are selectable by double click.
* Characters outside of visible ranges are clipped to _0_, eg. ` `, `\t` etc.
* `-–._*` map to _1_ value, `|` maps to max value, `▁▂▃▄▅▆▇█` map to corresponding bars.
* Accent acute <kbd>&nbsp;&#x0301;</kbd> (U+0301) shifts bar 1-step up, circumflex accent <kbd>&nbsp;&#x0302;</kbd> (U+0302) 10-steps up. Eg. `\u0101\u0302\u0302\u0301\u0301\u0301` shifts 23 steps up.
* Accent grave <kbd>&nbsp;&#x0300;</kbd> (U+0300) shifts bar 1-step down, caron <kbd>&nbsp;&#x030c;</kbd> (U+030C) shifts 10 steps down, eg. `\u0101\u030c\u0300\u0300\u0300` shifts 13 steps down.
* Mark order is canonical: 10-step marks first, then up to nine 1-step marks, ±100 steps max. Runs of 11+ same 1-step marks are recognized only up to the 10th — use `shift()` from the JS package to encode correctly.
* Caret span is -30..130 (covers full ink incl. value 127 bars), so line-height = 1.6 is minimal non-overlapping selection.
<!-- * Anti-[FOUT](https://css-tricks.com/fout-foit-foft/): any character out of visible range is mapped to blank (similar to [Adobe Blank](https://github.com/adobe-fonts/adobe-blank-vf)). -->

## JS package

Optional wavefont package exposes a function that calculates string from values for your convenience. Types included.

```js
import wf, { char, shift } from 'wavefont'

// characters for values from 0..127 range (clamped & rounded)
wf(0, 1, 50, 99, 127) // 'ĀāĲţſ'

// arrays or typed arrays of any length
wf(new Float32Array([0, 64, 127])) // 'Āŀſ'

// single value char + canonical shift marks (10-step first, then 1-step)
char(64) + shift(23)  // bar 64 shifted 23 steps up
char(64) + shift(-13) // bar 64 shifted 13 steps down
```


## Building

`make build`

* [Tests](https://dy.github.io/wavefont/out/fontbakery/fontbakery-report)
* [Glyphs](https://dy.github.io/wavefont/out/proof/glyphs)
* [Text](https://dy.github.io/wavefont/out/proof/text)
* [Waterfall](https://dy.github.io/wavefont/out/proof/waterfall)

## See also

* [linefont](https://github.com/dy/linefont) − font-face for rendering linear data.

## References

* [Google Fonts guide](https://googlefonts.github.io/gf-guide/variable.html#most-common-axes).
* [Unified font object spec](https://unifiedfontobject.org/versions/ufo3) − unified human-readable format for storing font data.
* [Feature file spec](https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#6.h) − defining opentype font features.
* [Adobe-variable-font-prototype](https://github.com/adobe-fonts/adobe-variable-font-prototype) − example variable font.
* [Designspace XML spec](https://github.com/fonttools/fonttools/tree/main/Doc/source/designspaceLib#document-xml-structure) − human-readable format for describing variable fonts.
* [Adobe Blank](https://github.com/adobe-fonts/adobe-blank-vf) − blank characters variable font.
* [Sparks](https://github.com/aftertheflood/sparks) – alternative font with similar purpose.
<!-- * [Unicode-table](https://symbl.cc/) − convenient unicode table.-->

## Alternatives

- **[Linefont](https://github.com/dy/linefont)** — Closest companion to Wavefont. Uses the same `0–127` character encoding but renders connected line charts instead of bars.
- **[Datatype](https://github.com/franktisellano/datatype)** — Inline bar, line and pie charts with readable syntax such as `{b:30,70}`. Supports up to 20 values.
- **[Sparks](https://github.com/aftertheflood/sparks)** — Compact inline sparklines using normalized `0–100` values. Includes bars, dots and connected-dot styles.
- **[FF Chartwell](https://www.typeface.com/fonts/chartwell)** — Commercial chart-font family for pie, bar, line, area, ring, radar, scatter and other chart types.
- **Unicode block elements** — Characters such as `▁▂▃▄▅▆▇█`. Dependency-free and widely supported, but limited to eight height levels.

<p align="center"><a href="https://github.com/krishnized/license/">🕉</a><p>

---
_Source: https://npm.io/package/wavefont · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
