npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@tyroneross/interface-built-right

v0.4.9

Published

Visual eyes for Claude Code. Screenshot your UI, make changes, see exactly what moved — two commands, zero config.

Readme


IBR is a Claude Code plugin that screenshots your UI before and after changes, diffs them pixel-by-pixel, and tells you exactly what moved. No more "does this look right?" — you get a verdict: MATCH, EXPECTED_CHANGE, UNEXPECTED_CHANGE, or LAYOUT_BROKEN.

It works from the terminal, from Claude Code slash commands, or from code. Two commands to learn. Zero config required.

How It Works

Quick Start

npm install @tyroneross/interface-built-right

That's it. .ibr/ is auto-added to your .gitignore on install.

Two commands:

npx ibr start http://localhost:3000    # screenshot your app
# ... edit your code ...
npx ibr check                          # see what changed

Setup as Claude Code Plugin

IBR works standalone, but it's built for Claude Code. As a plugin, it automatically nudges Claude to verify UI changes and suggests IBR over manual screenshots.

1. Add to your project's .claude/settings.json:

{
  "plugins": ["node_modules/@tyroneross/interface-built-right/plugin"]
}

2. Restart Claude Code. You now have:

| Command | What it does | |---------|-------------| | /ibr:snapshot | Capture baseline before making changes | | /ibr:compare | Compare current state against baseline | | /ibr:ui | Open the web dashboard at localhost:4200 |

3. Use in conversation:

"Redesign the header" → Claude captures baseline → makes changes → runs ibr check → iterates if LAYOUT_BROKEN

The plugin hooks handle the rest — reminding Claude to capture baselines before UI work and verify after.

What IBR Does For You (Plugin Hooks)

When installed as a Claude Code plugin, IBR silently provides:

  • Bash safety — blocks destructive commands (rm -rf /, git push --force, DROP TABLE, etc.)
  • Sensitive path protection — prevents writes to ~/.ssh, ~/.aws, /etc/
  • UI change detection — detects when .tsx, .jsx, .vue, .svelte, .css files are edited
  • Verification reminders — nudges to run npx ibr check after UI changes
  • Session end check — reminds if UI work was done but IBR wasn't run

All hooks use prompt-based evaluation (not shell scripts), so they never crash or show error messages.

CLI Reference

Core Commands

| Command | Description | |---------|-------------| | npx ibr start <url> | Capture baseline screenshot | | npx ibr check | Compare current state against baseline | | npx ibr serve | Open web UI at localhost:4200 | | npx ibr list | List all sessions | | npx ibr update | Accept current as new baseline | | npx ibr clean --older-than 7d | Clean old sessions |

Interactive Sessions

For pages that need clicks, typing, or navigation before capturing:

# Start a persistent browser session
npx ibr session:start http://localhost:3000 --name "search-test"

# Interact with it
npx ibr session:type <id> "input[name=search]" "quantum computing"
npx ibr session:click <id> "button[type=submit]"
npx ibr session:wait <id> ".search-results"
npx ibr session:screenshot <id>

| Command | Description | |---------|-------------| | session:start <url> | Start browser session | | session:click <id> <selector> | Click an element | | session:type <id> <selector> <text> | Type into an element | | session:press <id> <key> | Press keyboard key | | session:scroll <id> <direction> | Scroll page | | session:screenshot <id> | Capture screenshot | | session:wait <id> <selector> | Wait for element | | session:navigate <id> <url> | Navigate to URL | | session:html <id> | Get page HTML | | session:text <id> <selector> | Extract text content | | session:close <id\|all> | Close session |

Memory (UI Preferences)

Store UI expectations that IBR enforces during scans:

# Remember that buttons should be blue
npx ibr memory add "Primary buttons are blue" --category color --property background-color --value "#3b82f6"

# List stored preferences
npx ibr memory list

# IBR checks these during every scan

Authenticated Pages

npx ibr login http://localhost:3000/login   # opens browser, log in manually
npx ibr start http://localhost:3000/dashboard  # captures with your auth
npx ibr logout                                 # clear saved auth

Verdicts

After ibr check, you get one of four results:

| Verdict | Meaning | Action | |---------|---------|--------| | MATCH | Nothing changed | You're done | | EXPECTED_CHANGE | Changes look intentional | Review and continue | | UNEXPECTED_CHANGE | Something changed that shouldn't have | Investigate | | LAYOUT_BROKEN | Major structural issues | Fix before continuing |

Programmatic API

import { compare } from '@tyroneross/interface-built-right';

const result = await compare({
  url: 'http://localhost:3000/dashboard',
  baselinePath: './baselines/dashboard.png',
});

console.log(result.verdict);     // "MATCH" | "EXPECTED_CHANGE" | ...
console.log(result.diffPercent); // 2.5
console.log(result.summary);    // "Header background changed. Layout intact."
import { InterfaceBuiltRight } from '@tyroneross/interface-built-right';

const ibr = new InterfaceBuiltRight({
  baseUrl: 'http://localhost:3000',
  outputDir: './.ibr',
  threshold: 1.0,
});

const { sessionId } = await ibr.startSession('/dashboard', {
  name: 'dashboard-update',
});

// After changes
const report = await ibr.check(sessionId);
console.log(report.analysis.verdict);

await ibr.close();

Configuration

Optional — create .ibrrc.json in your project root:

{
  "baseUrl": "http://localhost:3000",
  "outputDir": "./.ibr",
  "viewport": "desktop",
  "threshold": 1.0,
  "fullPage": true
}

Available viewports: desktop, laptop, tablet, mobile, iphone-14, iphone-14-pro-max

Troubleshooting

| Problem | Fix | |---------|-----| | Command not found: ibr | Use npx ibr --help | | Playwright browsers not installed | npx playwright install chromium | | Auth state expired | npx ibr login <url> | | Session not found | npx ibr list to see available sessions |

Requirements

  • Node.js 18+
  • Playwright (installed automatically with IBR)

License

MIT