budge
millionco/skills · Agent Skill
Use when making single-property CSS or Tailwind visual changes in Next.js App Router projects. Presents a floating control widget for live tuning before persisting.
Jump to install ↓Overview
| Publisher | |
|---|---|
| Repository | millionco/skills ↗ |
| Skill folder | budge |
| Stars | 34 |
| Forks | 2 |
| Bundled files | 2 |
| License | MIT |
| Last updated | June 30, 2026 |
| Links | Skill source ↗ · Repository ↗ |
Mozgi check
What we found in the skill files. Details come with a subscription.
Installation
A skill is a folder with a SKILL.md file. Pick your agent and run the commands in a terminal (macOS, Linux or Git Bash on Windows) from your project root.
Copy the prompt into Claude, Codex or another assistant: it will review the skill and install it for you.
Install the “budge” skill from mozgi.io (https://mozgi.io/skills/millionco-budge/) for me. 1. Download the archive: https://mozgi.io/skills/millionco-budge/download If it fails, take the skill folder from the source: https://github.com/millionco/skills/tree/main/skills/budge 2. Read SKILL.md and the other files. Check the skill is safe: no hidden commands, no sending data elsewhere, no scripts doing something other than described. If anything looks suspicious, stop and tell me. 3. Put the “budge” folder into your agent's skills folder: .claude/skills/ for Claude Code, .agents/skills/ for Codex, .cursor/skills/ for Cursor, .gemini/skills/ for Gemini CLI. Inside the project if we are in one, otherwise in the home folder (~/.claude/skills/ etc.). 4. Make sure <skills folder>/budge/SKILL.md exists. 5. Briefly tell me what this skill does and offer to try it on my task. If you cannot do a step yourself, tell me what to click or type.
git clone --depth 1 --branch main https://github.com/millionco/skills.git /tmp/skills mkdir -p .claude/skills cp -r /tmp/skills/skills/budge .claude/skills/budge
Restart Claude Code — the skill appears in the list; call it manually with /budge. For all projects use ~/.claude/skills.
git clone --depth 1 --branch main https://github.com/millionco/skills.git /tmp/skills mkdir -p .agents/skills cp -r /tmp/skills/skills/budge .agents/skills/budge
Codex looks for skills in .agents/skills from the current folder up to the repo root; call one with /skills or $budge. For all projects use ~/.agents/skills.
git clone --depth 1 --branch main https://github.com/millionco/skills.git /tmp/skills mkdir -p .cursor/skills cp -r /tmp/skills/skills/budge .cursor/skills/budge
Cursor picks the skill up on start; call it with “/” in Agent chat. Cursor also reads .claude/skills and .agents/skills. For all projects use ~/.cursor/skills.
git clone --depth 1 --branch main https://github.com/millionco/skills.git /tmp/skills mkdir -p .gemini/skills cp -r /tmp/skills/skills/budge .gemini/skills/budge
Gemini CLI offers to activate the skill when a task matches — you approve it. For all projects use ~/.gemini/skills.
Read SKILL.md and any companion files before deciding whether to install. Click a file to preview it.
SKILL.md contents
Original author text · read-onlyBudge
Proactive skill. Next.js App Router only. If a task results in a single CSS property or Tailwind class change, follow this skill automatically. The user should never need to say "use budge."
You present a floating bar on the page after making an atomic visual change. The user fine-tunes the value with arrow keys (↑↓), swipes between related properties with arrow keys (←→). With the current runtime, complete your turn immediately after making the visual change — no browser interaction, no waiting, and no manual config unless the fallback below is needed.
The runtime is a self-contained IIFE loaded from https://www.budge.design/budge.iife.js via next/script. On local/dev hosts it stays on the page, watches HMR-driven class/style DOM changes, infers the latest numeric visual property change, marks the changed element, and mounts Budge automatically. It also uses React Grab primitives for manual selection: press Cmd+E, select an element, and Budge opens. It still supports the explicit data-budge config element as a fallback. Everything is handled client-side: live preview on [data-budge-target] elements, arrow key stepping, slide navigation, audio feedback, submit (Enter — copies an edit prompt to clipboard), and cancel (Escape — reverts).
In scope: Raw CSS property values, inline styles, Tailwind utility class changes, SVG presentation attributes (fill, stroke, etc.).
Out of scope: Sass/Less variables, CSS custom property definitions (--spacing), CSS-in-JS theme tokens. Proceed normally for these.
Installation
Grep for budge.iife.js in app/layout.tsx. If found, make the requested visual change and stop. Otherwise, read references/INSTALL.md and follow its instructions.
Default Flow
For a single raw CSS value or Tailwind class token change, just make the source edit. The always-on runtime should attach Budge to the resulting DOM change after HMR. Tell the user: "I've changed X to Y. Use ↑↓ to fine-tune, ←→ to switch properties."
Use the manual steps below only if the bar does not appear or the change cannot be inferred from one numeric class/style DOM mutation.
---
Troubleshooting — bar does not appear
1. Script missing: Confirm <Script src="https://www.budge.design/budge.iife.js" strategy="afterInteractive" /> is in app/layout.tsx.
2. Auto-detect disabled: Auto-detect runs by default on local/dev hosts. Force it with data-budge-autodetect="true" on the script tag, or disable it with "false".
3. No inferable DOM change: The fallback bar only appears when a <div data-budge="..." hidden /> element with a non-empty slides array is in the DOM.
4. Target not found: The element with data-budge-target must be in the DOM after hydration.
---
Manual Fallback — Trigger Test
After making a change, apply this mechanical test. Do NOT use subjective judgment.
> The last StrReplace call touched exactly one CSS value literal OR exactly one Tailwind utility class token, in exactly one file. The change is not a variable, mixin, or theme token.
Pass: padding: 8px → padding: 16px | className="p-2 m-4" → className="p-4 m-4"
Fail: two values changed, token added/removed, Sass variable, multiple StrReplace calls, structural change.
Fail → skip budge, proceed normally. Pass → continue to Step 2. The mechanical test is the only gate.
Step 2 — Build Slides
Build a slides array. The first slide is the property you changed. Additional slides are related properties the user might want to tweak.
Each slide has this shape:
{
label: string; // display name shown above bar
property: string; // CSS property to apply to [data-budge-target]
min: number; // minimum numeric value
max: number; // maximum numeric value
value: number; // current value (the one you set)
original: number; // value before your change
unit: string; // "px", "%", "em", etc.
type?: "color"; // only set for color properties
}
Slide generation rules
1. Primary slide (index 0): the property you changed. value = new value, original = old value.
2. Related slides (index 1+): pick 2–3 related properties from the same element. Read their current computed/declared values. Use sensible min/max ranges.
Example — agent changed padding-top: 8px → padding-top: 16px:
[
{ label: "padding-top", property: "padding-top", min: 0, max: 64, value: 16, original: 8, unit: "px" },
{ label: "padding-bottom", property: "padding-bottom", min: 0, max: 64, value: 8, original: 8, unit: "px" },
{ label: "padding-left", property: "padding-left", min: 0, max: 64, value: 12, original: 12, unit: "px" },
{ label: "padding-right", property: "padding-right", min: 0, max: 64, value: 12, original: 12, unit: "px" },
]
Example — agent changed font-size: 14px → font-size: 16px:
[
{ label: "font-size", property: "font-size", min: 8, max: 72, value: 16, original: 14, unit: "px" },
{ label: "line-height", property: "line-height", min: 12, max: 80, value: 24, original: 22, unit: "px" },
{ label: "letter-spacing", property: "letter-spacing", min: -2, max: 10, value: 0, original: 0, unit: "px" },
]
Example — agent changed color: #333 → color: #1a1a1a:
Use the type: "color" slide with hue degrees:
[
{ label: "color", property: "color", min: 0, max: 360, value: 0, original: 0, unit: "°", type: "color" },
]
Related property suggestions
| Changed property | Related slides |
|---|---|
| padding-top | padding-bottom, padding-left, padding-right |
| padding | padding-top, padding-bottom |
| margin-top | margin-bottom, margin-left, margin-right |
| font-size | line-height, letter-spacing |
| gap | padding, margin-top |
| width | height, max-width |
| border-radius | padding, border-width |
| opacity | font-size |
Tailwind resolution
Resolve Tailwind classes to CSS properties and pixel values (multiply spacing scale × 4):
| Tailwind class | Primary slide property | Value |
|---|---|---|
| p-4 | padding | 16px |
| px-4 | padding-left (also set padding-right) | 16px |
| py-4 | padding-top (also set padding-bottom) | 16px |
| pt-4 | padding-top | 16px |
| mt-4 | margin-top | 16px |
| gap-4 | gap | 16px |
| text-[14px] | font-size | 14 |
| rounded-lg | border-radius | 8px |
For axis shorthands (px-*, py-*, mx-*, my-*), set the primary slide to one axis property but include both as slides.
For Tailwind classes, also add an inline style override on the target element so the runtime can manipulate the value directly:
<div data-budge-target className="py-4" style={{ paddingTop: '16px', paddingBottom: '16px' }}>
Design token snapping
If the project defines design tokens as CSS custom properties on :root or @theme (Tailwind v4, Shadcn, plain CSS vars), the runtime automatically snaps ↑/↓ stepping through them by matching property to scale:
| Property match | Discovered prefix |
|---|---|
| padding*, margin*, gap | --spacing-* |
| font-size | --text-* |
| border-radius* | --radius-* |
| color, *-color | --color-* (no snap yet — palette cycling is a follow-up) |
When a token matches the current value, the widget shows its name (e.g. 16px · md) and Enter emits Set \padding\ to \var(--spacing-md)\`` instead of a raw px value. Users can still type digits to escape to arbitrary px.
You don't need to specify scale on slides — it's auto-detected from property. Pass scale: null to disable snapping for a slide, or scale: "spacing" | "text" | "radius" | "color" to override. Pass tokens: [{ name, value, numeric }] to override discovery entirely. Use unit: "px" when relying on token snapping (the runtime applies the token's raw value so rem/em tokens resolve correctly regardless).
Step 3 — Mark Target Element
Add data-budge-target to the changed element in source:
<div data-budge-target style={{ paddingTop: '16px' }}>
Step 4 — Activate
Use StrReplace to add a config element to app/layout.tsx inside <body>, passing the slides as JSON:
<div data-budge={JSON.stringify({ slides: [
{ label: "padding-top", property: "padding-top", min: 0, max: 64, value: 16, original: 8, unit: "px" },
{ label: "padding-bottom", property: "padding-bottom", min: 0, max: 64, value: 8, original: 8, unit: "px" },
{ label: "padding-left", property: "padding-left", min: 0, max: 64, value: 12, original: 12, unit: "px" },
] })} hidden />
Step 5 — Complete
Your turn is done. Do NOT open a browser, verify the panel, or wait for the user. Next.js HMR delivers the change.
Tell the user: "I've changed X to Y. Use ↑↓ to fine-tune, ←→ to switch properties."
When the user pastes the submitted prompt, it reads as a normal edit instruction — make the edit and remove the data-budge config element.
Frequently asked questions
What does the budge skill do?
Use when making single-property CSS or Tailwind visual changes in Next.js App Router projects. Presents a floating control widget for live tuning before persisting.
How do I install budge?
Open the “Installation” block on this page and pick your agent — Claude Code, Codex, Cursor or Gemini CLI — for ready-made commands that copy the skill folder to the right place. Or copy the prompt from the “Via assistant” tab and let the assistant review and install the skill.
Which AI models work with budge?
Skills are plain Markdown instructions (the Agent Skills format), so budge works with any agent that reads SKILL.md: Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and more. The model loads the instructions only when a task matches the skill's description.
Is budge free?
The skill is published openly by millionco under the MIT license. The skill itself costs nothing — you only pay your AI provider for the tokens you use.
Is it safe to install skills?
A skill is a set of instructions your agent will follow, so read SKILL.md and its companion files before installing. Scripts in the skill folder only run if your agent runs them — keep an eye on what it does and do not grant unnecessary permissions.
How is a skill different from an MCP server or a plugin?
An MCP server or plugin gives the model new tools — code that runs and returns a result. A skill gives it knowledge and process: how to approach a task, which steps to follow and what good output looks like. It needs no server or API key.