Hello everyone,
I would like to share a thought about what happens after design tokens land in a Penpot file: nobody can tell where the system is actually applied. I’d welcome your feedback.
The problem
Once tokens exist, two questions decide whether the system holds: where is my design system not applied, and how do I fix that in one action? Nothing answers either one today, so files drift: a color typed by hand, a spacing nudged, an override left in place. The token set becomes documentation instead of a source of truth, and nobody can state a coverage figure.
What I propose
URL to install: https://plugins.unoff.dev/penpot/token-lint/manifest.json
A plugin (working name: Token Lint) that audits a scope (selection, page, document) against the active token sets, returns a coverage rate, and groups deviations by value rather than layer by layer:
- Exact matches first (a hard-coded value equal to a token’s resolved value), then near matches with their residual difference, then orphan values.
- “Apply every exact match in scope” as a single, undoable action. Anything ambiguous waits for explicit validation.
- Creating a token when nothing fits: you pick an active set, the plugin proposes a name from the type and the value (
color.3b82f6,spacing.12), and you edit it before it is applied.
One last note
It is built with Unoff, the open-source framework and CLI I maintain for Penpot and Figma plugins. Token Lint is the first plugin made with it, and I’ll come back to that story separately once there is something to show.
PS: The plugin isn’t published in the official catalog yet, but it is open to contributions on GitHub.
