Skip to content

Discoprint

Classifies an artist's discography by theme, mood and lyrical complexity with Jev, then renders it as an Ink terminal dashboard. MusicBrainz supplies the discography, lrclib.net the lyrics, one batched call per track.

Stars
3
Language
JavaScript
License
APACHE-2.0
Published by
Community
Author
lirantal
Last verified
Oct 2026

lirantal/discoprint

User repository on GitHub

View on GitHub

Classify an artist's discography by theme, mood, and lyrical complexity with Jev (TypeSafe AI), and view it as a colorful terminal dashboard

Forks
0
Last pushed
Updated Oct 2026

Repo stats from the GitHub API, cached Oct 2026.

About this project

Classify an artist's discography by theme, mood, and lyrical complexity with Jev (TypeSafe AI), and view it as a colorful terminal dashboard. Classifying needs a TypeSafe API key (Jev). If TYPESAFEAPIKEY isn't set — in your shell, a .env in the current directory, or wherever else your environment normally sources it from — the CLI prompts for it interactively (masked, like a password) and uses it for that run only; it's never written to disk. To skip the prompt every time, either export it in your shell profile:

Quoted from the project's README. Read the full README.

Highlights

  • Five atomic classifiers go in a single systemOne call per track, with artist, track and lyrics as state, per the parallel questions pattern.
  • Every stage is cached under the data dir, so a rerun with a raised --limit makes exactly one real network call, the artist lookup, and no Jev calls at all.
  • In a real terminal it is one continuous Ink app: status header, scrolling log, a spotlight panel per result and a running legend.
  • No key needs to live on disk: with TYPESAFE_API_KEY unset the CLI prompts masked for that run only and never writes it, or reads .env in the working directory.

Watch out

Two data sources bound what you can classify. MusicBrainz is rate limited to one request per second, so a large discography takes minutes before any Jev call happens, and lrclib.net is a community lyrics database where unmatched tracks are skipped outright and recorded in a -skipped.json file next to the output, which means the dashboard can quietly cover less of the discography than you asked for. Because lyrics are already on disk when classification starts, lyrics go to the Jev API as part of state, so the cache and your key configuration are the privacy surface here. The --limit default of 100 applies only when the CLI prompts interactively; otherwise it is unbounded, so a scripted run over a big catalogue can be much larger than it looks. There is no lyric cache invalidation, since lyrics do not change: deleting the file is the only way to retry one track, and --force re-fetches the discography and re-classifies but still reuses cached lyrics. The data directory defaults to $XDG_CONFIG_HOME/discoprint rather than your working directory. The classifier definitions and their rubrics live in src/jev.ts and the README states that file is the source of truth. Copy reviewed against the repository README on 2026-10-04, not from running it.

Questions about this entry

Short answers drawn from the linked project or page.

More Jev resources like this

46GitHub stars
Browser app for systematic-review extraction that opens a trial report with supplements and returns verbatim quotes with file and place, stored locally as projects holding studies.
Jev Tools & CLIs#community#jevbest#catalog-import
Self-hosted Google Apps Script that classifies Gmail by meaning with Jev Choice over your own dozen-label taxonomy, checking metadata first and full content only when confidence demands it.
Jev Tools & CLIs#community#jevbest#catalog-import
2GitHub stars
Chrome extension that labels Bluesky posts and drafts with tone classifiers as you read or type, hiding results the model is not confident about.
Jev Tools & CLIs#community#jevbest#catalog-import
0GitHub stars
A pre-install gate for npm lifecycle scripts: pkgGate() pulls the preinstall, install and postinstall hooks from a package name, a path or a raw command, judges them with System One, and returns allow, warn or block.
Jev Tools & CLIs#community#jevbest#catalog-import
38GitHub stars
Python memory filter that judges every stored memory against the current request with one calibrated yes/no per memory in a single Jev request, keeping everything above a threshold.
Jev Tools & CLIs#community#jevbest#catalog-import
39GitHub stars
Video tool where Jev scores subtitle segments and code assembles a short highlights cut plus a de-watered full cut with timestamped summaries.
Jev Tools & CLIs#community#jevbest#catalog-import

From the Jev guides

Original write-ups on what this entry is for.

The request shape barely changes across surfaces; the surrounding contract does. When to call the API directly and when a gateway, a Worker binding, or a router entry earns its extra hop.
Jev Tools & CLIs#gateway#vercel#cloudflare
Read article
Taking a decision checkpoint out of Python: what the GGUF and browser WebGPU exports preserve, what they change, and the parity evidence the model cards publish.
Jev Tools & CLIs#open-models#local#onnx
Read article
Jev labels a record that already exists. Code moves, flags, or holds it. How the document, mail, and transfer tools keep the action out of the model.
Jev Tools & CLIs#classification#email#security
Read article
Back to all resources

From the Jev community

Posts from builders shipping with Jev right now.

Follow @typesafeai