🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@tyroneross/interface-built-right

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@tyroneross/interface-built-right

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

Source
npmnpm
Version
0.4.8
Version published
Weekly downloads
24
380%
Maintainers
1
Weekly downloads
 
Created
Source

╦╔╗ ╦═╗
║╠╩╗╠╦╝
╩╚═╝╩╚═

Interface Built Right

Visual eyes for Claude Code.
Catch what changed, keep what works.

npm license node

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

Beforenpx ibr start <url>Afternpx ibr check
Baseline screenshotAfter changes

Header changed to dark, button turned purple — IBR detects the 9.3% diff and returns EXPECTED_CHANGE.

See terminal output
IBR terminal output

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:

CommandWhat it does
/ibr:snapshotCapture baseline before making changes
/ibr:compareCompare current state against baseline
/ibr:uiOpen 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

CommandDescription
npx ibr start <url>Capture baseline screenshot
npx ibr checkCompare current state against baseline
npx ibr serveOpen web UI at localhost:4200
npx ibr listList all sessions
npx ibr updateAccept current as new baseline
npx ibr clean --older-than 7dClean 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>
All interactive commands
CommandDescription
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:

VerdictMeaningAction
MATCHNothing changedYou're done
EXPECTED_CHANGEChanges look intentionalReview and continue
UNEXPECTED_CHANGESomething changed that shouldn't haveInvestigate
LAYOUT_BROKENMajor structural issuesFix 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."
Session-based workflow
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

ProblemFix
Command not found: ibrUse npx ibr --help
Playwright browsers not installednpx playwright install chromium
Auth state expirednpx ibr login <url>
Session not foundnpx ibr list to see available sessions

Requirements

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

License

MIT

Keywords

visual-regression

FAQs

Package last updated on 12 Feb 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts