chrome extension · responsive testing

Every breakpoint, one screen, your own browser.

Check a layout across four, six, ten viewports at once — synced scroll, clicks and input — without opening a separate desktop app or paying a monthly seat.

375
768
1024
1440
↓ Download ResponsiveX v0.4.0 .zip · unpacked install below
the alternative is a separate app

Same browser, same session, no seat

The strong competitors in this space are standalone desktop apps — which means a second cookie jar, a second login, a second window to keep in sync with what you're actually building. ResponsiveX runs where the work already is.

Tool
Runs in
Cost
Polypane
Desktop app
$12/mo
Sizzy
Desktop app
$249
ResponsiveX
Your Chrome
Free
what's actually new

Fork, then fix the real complaints

Built on the domain logic of the open-source Responsive Viewer, with the platform layer rebuilt for Manifest V3 and three gaps closed that its users kept filing issues about.

01
Localhost mode
Dev servers get a real reason when a frame stays blank, instead of silence.
02
Accurate screenshots
Choose the DPR, auto-crop empty margins — no more warped captures.
03
Preset export / import
Share a team's exact breakpoint set as JSON, not a screenshot of settings.
04
MV3 platform layer
declarativeNetRequest instead of the deprecated blocking webRequest API.
install

Not on the Web Store yet

ResponsiveX is distributed directly for now — Chrome won't install a downloaded .zip in one click, so it's a short manual load:

Download the .zip above and unzip it anywhere on disk.

Open chrome://extensions in a new tab.

Turn on Developer mode (top-right toggle).

Click Load unpacked and select the unzipped folder.

changelog

What changed

Newest first. Every fix below is covered by a test in the repo, so a regression cannot slip back in quietly.

v0.4.0 2026-09-28 current
  • fixThe device list now shows one screen instead of adding another. Picking from “Device…” used to append a screen to a row that scrolls sideways, so from the fourth or fifth pick on the new screen arrived outside the visible area and the click looked ignored. It now replaces what is on screen: pick a device, see that device. The screens that step aside are hidden, not deleted — untick them back in, and presets that reference them still work.
  • fixAn added screen scrolls itself into view. “Add screen”, a breakpoint chip and “Add all” still add — that is how you compare several widths at once — and the new screen is brought into view and outlined for a moment, so the click visibly did something.
v0.3.0 2026-08-20
  • newPopular device picker. A device list sits right of the Zoom slider — recent iPhones, Samsung Galaxy, Pixel, iPad and a laptop width. Picking one gives you a screen at that device's real CSS size, so you no longer type numbers you had to look up first. (In 0.3.0 it added a screen; since 0.4.0 it replaces — see above.)
  • fixSynced frames no longer jitter while scrolling. A replayed scroll echoed back into the broadcast and every hop re-rounded the position, so screens drifted against each other for as long as you kept scrolling.
  • fixThe breakpoints bar says what it found and where. “Found N breakpoints in this page's CSS” instead of a bare list — one hit used to look like a broken “Add all”. The button now disables once every width is already on screen.
  • fixClosing the breakpoints bar is reversible. The ✕ hides it behind a “Show N CSS breakpoints” strip; previously the findings were destroyed and only a reload brought them back.
  • fixDeleting the last screen no longer dead-ends. An empty viewer now offers “Restore default screens” instead of a blank page with nothing to click.
  • newKnown limitations covers the sandbox warning. Chrome files an “iframe … can escape its sandboxing” notice under the red Errors button; the page explains why both sandbox flags stay and why it is harmless here.
v0.2.0 2026-08-07
  • newCSS breakpoint detection. Reads the framed page's own stylesheets and offers a screen at each width it finds.
  • newOffscreen frames render lazily past six screens, so a wide set stays responsive.
  • newPer-screen User-Agent override (client-side) and full-page capture of pages taller than the viewport.
for testers

Test plan

Run these against the build above. Cases marked was reported are fixes from the last round — they matter most. Note the exact URL you tested on: behaviour depends on the site inside the frame.

T1Install and launch

Unzip, load unpacked at chrome://extensions, then click the toolbar icon on any site.

a viewer tab opens with two screens (Mobile 390×844, Desktop 1280×800), both showing the site, and the toolbar reads headers modified · session-scoped.

T2Pick a device from the dropdownwas reported

Open “Device…” right of the Zoom slider and pick several in a row — an iPhone, a Galaxy, the iPad — then pick the first one again.

each pick leaves exactly one screen on the page, captioned with the device name and its size (e.g. iPhone 17 Pro · 402×874); the list snaps back to “Device…”; returning to an earlier device shows the same screen again rather than a second copy of it.

T2aHidden screens are not lostwas reported

After T2, export presets (or just look at the screen list) — the earlier screens should still exist, only hidden. Add a screen manually via “Add screen” with width 1400.

“Add screen”, breakpoint chips and “Add all” still add, and the new screen is scrolled into view and briefly outlined — it never lands off the right edge unseen. The toolbar stays visible while that happens.

T3Synced scroll stays stillwas reported

With Sync on and 3+ screens open, scroll one frame down a long page, then stop and watch for five seconds. Repeat with screens of clearly different heights.

the others follow while you scroll and freeze the moment you stop — no twitching, creeping or bouncing afterwards.

T4Breakpoint bar reads honestlywas reported

Open a site with several media queries, wait ~2s for the bar, then press “Add all”.

the caption states a count and its source, and “Add all” adds exactly that many screens, then greys out. A page with one breakpoint showing one button is correct, not a bug — cross-origin and em/rem-based queries are not readable, as the bar notes.

T5Hiding the breakpoint bar is undoablewas reported

Press the ✕ at the right of the bar, then look at the strip that replaces it.

“Show N CSS breakpoints” appears and brings the same widths back — without reloading the viewer.

T6Deleting every screenwas reported

Remove all screens with the ✕ on each card. Then reload the viewer tab and check the state again.

“No screens to show” with a working “Restore default screens” button — before and after the reload. Never a blank page.

T7The Errors button on the extension cardwas reported

Open chrome://extensions after using the viewer and read what the red Errors button lists.

only “An iframe which has both allow-scripts and allow-same-origin…”, one entry per frame. That one is expected and explained in Known limitations. Anything else is a real finding — copy the full text and stack trace.

T8Screenshots

Capture a single screen (📷 on a card) and then “Screenshot all”, at 1× and at 2×. Include a page taller than the viewport.

the PNG is the full frame at the chosen scale, the long page comes out whole rather than one viewport, and “all” downloads a zip named for the scale. Open the files and look — no white bands, no cut-off bottom.

T9Presets survive a round trip

Build a set of screens, “Export presets”, remove a few screens, then “Import presets” with that file. Also try importing a deliberately corrupted file.

the export is readable JSON, the import restores the set and reports how much it added; a corrupt file is refused with a message and changes nothing.

T10Localhost and blank frames

Point the viewer at a local dev server, and separately at a site that refuses to be framed. Stop the dev server and reload.

a working dev server renders in every screen; a frame that cannot load shows a named reason and a link to Known limitations — never a silent white rectangle.

T11State survives a restart

Set up screens, layout and zoom, then close and reopen Chrome and launch the viewer again.

your screens and settings come back as you left them.

When something looks wrong: say which URL was in the frame, how many screens were open, and what you expected instead. A short screen recording beats a description for anything that moves — and if chrome://extensions shows an error, paste its text, not a photo of the button.