Lovable for your terminal.
squint is a frontend harness for the coding agents you already have. It wraps Claude Code, Codex, and six friends in the loop that made Lovable work: a design brief on every ask, build and runtime errors fed straight back, screenshots the agent reviews itself. Local, on any repo, keys stay where they are.
The loop, played straight
Coding agents are already good at writing frontend code. What they lack is taste held constant and a feedback loop that never sleeps. squint supplies both.
❯ make the pricing page feel premium
Every ask ships inside a design brief. Direction before code, design tokens over one-off styles, and a ban list of the patterns that make pages read as machine-made. Seven committable aesthetic directions, or write your own.
✗ error TS2304 → auto-fix 1/2
The dev server is watched. Fresh build errors go back to the engine with the surrounding output and a root-cause instruction, capped at two attempts.
· runtime clean · probe after every turn
The page itself is checked. After each clean turn squint loads the app headlessly and catches what the server never prints: blank pages, exceptions, hallucinated CSS classes, invisible focus, text that vanishes in high-contrast mode, buttons real translations will truncate, retained DOM after journeys, dark-pattern tells, and janky frames — attributed by function.
/review · 390 / 768 / 1440
The agent looks at its own work. Screenshots at phone, tablet, and desktop widths, then a critique of what it can actually see, ranked by visual impact, then fixes.
· visual pulse · <nav.top-nav> region changed
Drift gets named. Every clean turn is screenshotted, compared with the last, and the changed regions hit-tested against the live page — the pulse says which element moved, not just a percentage. On kitty, Ghostty, WezTerm, or iTerm2 the screenshot renders as real pixels inside the transcript. LCP deltas and long-frame jank ride along, attributed by function.
⚠ sentinel · test deleted this turn
Evasion gets caught. Deleted tests, added skips, suppression comments, watered-down checks, touched locks — detected deterministically each turn and reported to you, never sent back to the engine that did it. Decisions live in a committed ledger the engine cannot silently undo; contested changes pause for your /yes or /no.
❯ squint serve · attach from anywhere
The session outlives the terminal. The daemon owns the run on a unix socket; attach the full TUI from any terminal or over ssh. Teammates get observer seats; the driver seat passes on detach. A dropped connection no longer kills the work.
/lane on · /goal · squint as the evaluator
A second reviewer, a standing goal. The review lane reads each turn's diff in fresh context — blind spots don't inherit. /goal arms a machine-checked objective: auto-fix presses until squint's gates come back clean, because the engine doesn't get to decide when it's done.
❯ squint ci · squint mcp
Two more doors in. squint ci runs the whole loop headlessly in a pipeline — gates, page audit, flow replay, JSON report, honest exit code, and a digest-sealed receipt tying green to the exact pixels. squint mcp serves the gates as MCP tools, so agents that speak MCP call squint instead of squint wrapping them.
/undo · /variants · Alt+S
Reversible and explorable. Every ask records a checkpoint, so undo and rewind are one command. Sandbox mode stages whole sessions in a shadow worktree until you apply. Variants build the same ask three ways in parallel. Alt+S pins elements with notes and compiles them into one annotated ask.
What gets checked, deterministically
Every one of these runs without a judgment call — findings name the element and carry the fix. The engine critiques taste; squint measures everything else.
- typecheck + lint gates per turn
- dev-server build errors, swept
- runtime exceptions and 404s
- phantom CSS classes
- Tailwind v4 / Vite rule-packs
- pixel drift, element-attributed
- LCP deltas and transfer weight
- long-frame jank, by function
- soft-nav ICP per SPA transition
- detached-DOM leaks after journeys
- alt text, labels, headings, tap targets
- keyboard journeys and focus visibility
- fake buttons (div-onclick)
- APCA contrast on body text
- forced-colors invisibility
- print output sanity
- pseudo-locale truncation (+40%)
- RTL hardcodes and overflow
- view-transition breakage
- container-query disconnects
- anchor-positioning orphans
- speculation-rules failures
- dark-pattern tripwires
- phantom IDREFs (dangling aria)
- form-error announcement gaps
- autofill grammar + WCAG 1.3.5
- hand-rolled div modals
- font-loading FOIT/FOUT
- secrets in the served bundle
- client-side-only auth gates
- WebMCP tool parity
- per-transition CLS attribution
- meta / OpenGraph / JSON-LD
- zoom-blocking viewports
- responsive-image correctness
- target spacing (WCAG 2.5.8)
- mixed content & CSP gaps
- the semantic a11y gap
- gate evasion (the sentinel)
- declared user journeys (.flow)
- your own page checks, every turn
Bring your own agent
squint drives whichever of these is on your PATH, through one normalized event stream. Streaming, session resume, and cost tracking wherever the engine supports it.
claude· codex· codex-app· gemini· antigravity· opencode· amp· cursor· copilot· aider
Install
Start from nothing
❯ npx @aayambansal/squint init my-app # Vite + React + Tailwind, tokens first ❯ cd my-app && squint
Or on any existing repo
❯ npm i -g @aayambansal/squint ❯ cd your-project && squint # /dev · /review · /check · /undo