An experimental type foundry. Expose letters to imaginary weather. Keep the font that survives.
Turn a source alphabet into an installable OpenType font in your browser. Let ink bloom, erode the edges, grow tendrils, or break the signal; then take the resulting typeface into posters, record sleeves, and whatever comes next.
Open Typeweather → · Explore eight recipes in the gallery
No accounts, no uploads, no AI calls. Font processing runs locally in your browser.
Wet newspaper — ink bloom, exposure 72, seed 2401. View the vector specimen, download the OTF, or inspect its license and recipe.
- Pick a material — three bundled open-source fonts, or import your own TTF/OTF (stays on your device).
- Set the conditions — weather process, exposure 0–100, world seed (or roll a new one).
- Type your words — the specimen renders from the compiled font itself.
- Download font ↓ OTF — install it and type with it anywhere. Bundled-source exports include their OFL license.
- Exposure collection ↓ ZIP — four installable fonts at exposures 0 / 30 / 65 / 100, each a distinct family name, plus license and recipe.
- Save specimen ↗ SVG — a portable vector poster of your words.
- Copy recipe ↗ URL — the URL encodes your exact conditions; open it to reproduce the accident.
The gallery curates eight recipes; every preview there uses the same engine and weather, rendered live on your device. The committed examples include four specimen screenshots, vector posters, installable fonts, licenses, and their recipes.
- Ink bloom — letters swell in a noise field, like ink soaking through wet paper.
- Erosion — edges pit and crumble; grains of the letter wash away.
- Overgrowth — tendrils root and branch outward from letterforms.
- Signal loss — scan lines shift and drop out, like a transmission from somewhere else.
Each glyph is sampled at 180 px/em, weathered, traced into closed contours, and compiled into an OpenType font with CFF outlines. The specimen is drawn with glyph paths from that compiled font, and the file you download is byte-identical to the one the preview came from. Source pair kerning is preserved through a custom SFNT/GPOS writer, verified independently with fontTools.
220 characters per font: printable ASCII plus Latin-1, punctuation, and symbols (curly quotes, dashes, arrows, €, ™, −, ≈…). Deterministic: same source + exposure + seed = same outlines, every time.
Clone the repository and install its dependencies. CI uses Node 22.
git clone https://github.com/parttimediarybehavior/typeweather.git
cd typeweather
npm install
npm run dev # → http://127.0.0.1:5173For a production build and local preview:
npm run build
npm run previewnpx playwright install chromium # once, for the browser suites
npm test # geometry, font serialization, kerning, recipe notebook, ZIP packaging
npm run build
npm run test:browser # 8 suites against a managed production preview server (self-contained)
KERNING_FONTTOOLS_PYTHON=python npm test # optional: adds the fontTools cross-check to npm test
python -m pip install -r requirements-dev.txt
python scripts/validate-font.py # fontTools + Pillow independently decode/verify the exported font
npm run lint && npm run typechecktest:browser starts its own production preview server on a strict loopback port, runs every suite (core export, mobile layout, composition fit, hint copy, 32 interaction scenarios, example generation, gallery, collection ZIP), and cleans up. BASE_URL selects a different port or subpath. KERNING_FONTTOOLS_PYTHON=/path/to/python unlocks the optional fontTools cross-check inside npm test.
Browser tests write generated examples only to ignored artifacts/examples/. They compare OTFs, license text, SVGs, and recipes.json byte-for-byte with the reviewed snapshots in examples/; screenshots are evidence, not cross-platform pixel baselines. To deliberately update those snapshots, run npm run examples:refresh, inspect the changes, and commit them with the corresponding source changes. Ordinary tests never refresh snapshots. Exported fonts use fixed 1970-01-01 creation/modification timestamps with recalculated SFNT checksums, so export time does not change their bytes.
CI runs the same sequence on GitHub Actions (Node 22, Python 3.12), rejects a dirty checkout after verification, and uploads only artifacts/ — see .github/workflows/ci.yml.
- Application code: MIT (see
LICENSE). - Bundled source fonts (Bungee, DM Serif Display, Space Mono) and generated derivatives: SIL Open Font License 1.1 — see
LICENSES.mdandpublic/fonts/*-OFL.txt.
Generated derivative fonts are renamed (family name includes a content fingerprint) and must be redistributed under the OFL with the original notices; exports embed the license and download a companion copy. If you import your own font, you are responsible for its modification license.
The live app is at typeweather.vercel.app. To host your own copy, run npm run build and deploy the generated dist/ directory to a static host. The build uses relative paths by default, so it works at a domain root or in a subdirectory. To set an explicit base path, use BASE_PATH=/typeweather/ npm run build.
The repository is self-contained and portable, with no machine-specific configuration or external runtime services. CI runs verification on pushes and pull requests; it does not deploy the site.
