Pixzlo: How I improved UI QA by building an internal tool end to end

Pixzlo extension popup showing element selection on a live web page

Project overview

Pixzlo is a design QA workflow built around one idea: a page isn't a design — it's a hub for many designs. It captures UI issues on the live page, compares them against the right Figma frame, and pushes structured tickets into Linear.

The product has two parts. A Chrome extension that captures issues in context on the live site, and a web dashboard that manages issues, owns the page-to-Figma mapping, and shares links.

My role

Solo designer and builder. Product, UX, UI, and the frontend (Next.js, Supabase). Started as an internal tool for my team at MindsDB.

Pixzlo dashboard — sites, pages, and Figma frame hierarchy

The problem

For months, I watched my team file the same kind of broken QA tickets. Engineers got screenshots without specs. Designers got bug reports without context. Everyone ended up in a Slack thread asking which Figma file was the real one.

There's a deeper issue: source of truth. Most pages render multiple states, each one living in its own Figma frame, and there's no convention for which frame is the spec for the thing you're looking at right now.

Low-signal feedback

Issues are reported as screenshots with vague comments ("this looks off") rather than actionable, structured inputs.

Low-signal feedback card

Missing context

Reports frequently lack the exact element reference, page state, environment, and steps to reproduce.

Missing context card

Slow resolution cycles

The team spends time in back-and-forth clarifications instead of fixing the issue immediately.

Slow resolution cycles card

Poor traceability

Feedback gets scattered across tools making it hard to track status and ownership.

Poor traceability card

The insight

A page is not a design. A page is a hub for many designs, one per state.

Most QA tools assume one page equals one design. Pixzlo is built around the reality that one page equals many states.

Three decisions that shaped Pixzlo

The Mapping system

The dashboard organizes work as Sites, then Pages, then Figma frames per page. When a user reports an issue, Pixzlo asks which state they're looking at and pulls the matching spec.

Pages view — site, page and Figma frame hierarchy

Annotation and spec diff in one surface

The Create Issue modal merges two things most tools split: annotation and inspection. Mismatches render in red. Matches stay neutral.

Create Issue modal — annotation and spec diff side by side

Linear as a first-class output

Pixzlo isn't trying to replace Linear. The Share in Linear toggle is on by default at the issue level, not the workspace level.

Linear share dialog — structured ticket preview

Small details worth showing

Limited browser support tooltip

When a CSS property has limited browser support (like overlay), Pixzlo shows an inline tooltip linking to MDN. The tool teaches instead of just complaining.

Limited browser support tooltip linking to MDN

Pin-extension onboarding

Chrome extensions hide behind a puzzle icon by default. Pixzlo's first-run flow mocks the browser chrome and points to where the pin is, because no native UI lets you teach this otherwise.

Pin extension onboarding — mocked browser chrome with pointer

Severity dropdown with progress-bar icons

Urgent, High, Medium, Low, No priority. Each visually weighted so a long issues list reads at a glance.

Severity dropdown — progress-bar icons for each priority level

What internal use taught me

Four mapping models before one that worked

A flat list broke on modal states. Tags failed because no two people agreed on naming. URL-pattern matching pushed taxonomy onto users who just wanted to file a bug. The model that shipped treats pages as containers and Figma frames as named children. Barely any structure. That is exactly why it scales.

The complete inspector was the wrong product

The first panel showed every computed CSS property the browser exposes, around 200 rows. Users stopped reading at row eight. The version that shipped curates twelve groups: font, color, spacing, sizing, radius, shadow. The ones that actually cause QA bugs. Curation made it usable.

Filing speed determines adoption

If capturing a bug takes more than two clicks, people stop capturing bugs. Every field we added to the creation form cost us reports. The final flow is capture, pick a frame, write one line. Everything else is optional and pre-filled.