4 widgets · up to 10 languages · no API key

Embed a controller tester on your site. Build the iframe below, copy it, done.

Every JoyCheck instrument runs on your own pages: the input analysis console in full or compact form, the polling rate test and the steering wheel tester. Configure it, watch the live preview change, copy one iframe. No SDK, no API key, no account, and no tracking code in your readers' browsers.

  • free to embed
  • no API key
  • no tracking

Keep allow="gamepad" in the tag, or the browser blocks controller access inside the frame.

EMBED BUILDER

Build your embed code

Pick a widget, set the language and height, copy the iframe. The panel on the right is the real embed route running live, not a screenshot — if it works here it works on your page.

Configure

Widget

10 languages ship inside this widget.

px

3,280px suits a 900px-wide column. A phone-width column needs about 5,170px — switch on auto-fit and the widget reports its own height instead.

Options

Every snippet keeps allow="gamepad". A cross-origin iframe cannot read a controller unless your page delegates the permission, so removing it loads the widget and then leaves it blind.

Live preview

Open

Input analysis console · 3,280px frame · scroll inside to see all of it

Embed code

<iframe
  src="https://joycheck.io/embed/console/"
  title="Input analysis console by JoyCheck"
  width="100%"
  height="3280"
  style="border:0"
  allow="gamepad"
  loading="lazy"></iframe>

Paste it into any HTML block: WordPress custom HTML, a Ghost or Webflow embed, an MDX page, a plain template. Adjust the height freely — width stays at 100% so the widget follows your column.

WHY EMBED IT

Built for people who publish

The widgets are the same instruments JoyCheck runs on its own tool pages, served from a stripped-down route with no navigation, no footer and no analytics.

  • Nothing to install

    One iframe. No SDK, no script tag, no API key, no account, no rate limit. Paste it into a WordPress HTML block or a Webflow embed and it runs.

  • Up to 10 languages

    Both sizes of the console translate into ten languages, the wheel tester into seven. One URL parameter switches them, and Arabic flips to a right-to-left layout on its own.

  • It fits your column

    Width stays at 100% so the widget follows your layout. Turn on auto-fit and it reports its own height to the frame, so a phone column stops cutting the tool in half.

  • No tags in your page

    The embed routes load no analytics, no tag manager and no ad code, and set no cookies of their own. Controller input is read through the W3C Gamepad API and never leaves the reader's device.

USE CASES

Where an embedded tester earns its place

A controller test is one of the few interactive things a reader will genuinely stop and use. It works best where the page already asks them to check something.

  • Hardware reviews

    Drop the console into a controller review and the reader can check their own pad against your verdict while they read. That is the difference between a review they skim and a page they bookmark.

  • Support and troubleshooting

    A drift or deadzone article that ends in "test it yourself" is a dead end. An embedded tester turns the same page into the place the reader actually diagnoses the fault.

  • Storefronts and communities

    Product pages let buyers confirm a new controller works the day it arrives. Forums and Discord-adjacent wikis get a shared reference point instead of ten different screenshots.

A laptop showing a web page with a JoyCheck tester panel embedded inside it, outlined in red, beside a game controller on a dark desk

Four JoyCheck instruments can run on your own site with a single iframe. No API key, no account, no script tag, and no tracking code. Build the snippet in the embed builder above, copy it, paste it into any HTML block.

4 widgets · up to 10 languages · zero dependencies · 4 min read

These are the same instruments that run on JoyCheck itself, served from a stripped-down route with no navigation, no footer, and no analytics. An embed runs inside your page, so it fires no tags and sets no cookies of its own in your readers’ context.

◆ VERIFIED

A cross-origin iframe cannot use the Gamepad API unless the embedding page explicitly grants it. Permissions Policy governs this: the browser blocks the feature in a nested document unless the parent delegates it through the iframe’s allow attribute[1]. Every snippet the builder produces therefore carries allow="gamepad". Drop that attribute and the widget loads but never sees a controller.

Source: MDN, Permissions Policy

Updated on 2026-08-10 by Taimoor Bamazai, founder of Elites Algorithm (Dublin, Ireland and Pakistan), and the builder behind JoyCheck.

Key takeaways

  • One iframe per widget. There is no SDK, no API key, and nothing to install.
  • Keep allow="gamepad" in the tag, or the browser blocks controller access inside the frame.
  • The console comes in two sizes. Both are the same instrument; the compact one drops the stacked readout blocks.
  • Both console sizes ship 10 languages, the wheel tester 7, the polling rate test English only.
  • Heights differ enormously between widgets. Switch on auto-fit rather than guessing.
  • The embed routes carry no analytics and set no cookies of their own, unlike the main site.
  • Leaving the “Powered by JoyCheck” link in place is what keeps these tools free.

Which widget do you need?

Three instruments, offered as four choices, because the console comes in two sizes. The five stick-and-button tool pages on JoyCheck all run one engine, and the input analysis console is its face; the polling rate test and the wheel tester are separate instruments with their own layouts.

WidgetWhat it showsHeight at a 900px columnLanguages
Input analysis consoleRadar dial, stick pods, face buttons, D-pad, triggers, drift and deadzone, vibration, device and browser readout, advanced diagnostics3,280px, or 2,080px with diagnostics collapsed10
Console compactThe same instrument, health and drift verdict, calibrate and rumble controls — without the readout panels or the advanced grid1,460px10
Polling rate testObserved update rate in Hz with the interval statistics behind it800pxEnglish only
Steering wheel testerRotation range, centre offset, pedal travel and linearity, shifter and paddle map1,260px7

Every height above was measured in a browser, not estimated. They are starting points: a narrower column makes each instrument taller, because the panels reflow into fewer columns. At phone width the full console runs past 5,000 pixels, while the compact one settles near 1,780.

Full or compact?

They are one widget at two sizes — the same route, the same design, the same behaviour. ?layout=compact hides the two stacked readout blocks underneath the instrument: the diagnostic panel cards and the advanced diagnostics grid.

That choice is about the page, not the reader. Give a hardware review or a drift troubleshooting guide the full console: the tester is the page, and the numeric panels are what the reader came to read. Give a buying guide or a how-to the compact one, where a 3,000-pixel instrument would bury the writing.

Nothing becomes untestable in compact form. Sticks, triggers, D-pad and face buttons are all live on the instrument; vibration is driven from the toolbar; calibration, the health score and the drift verdict all stay. What goes is the numeric readout beside them. The advanced-diagnostics button is hidden along with the section it opens, rather than left on screen doing nothing.

Letting the widget size itself

Guessing a pixel height is the single most common way an embed ends up looking broken, because the right number changes with your column width, and your column width changes with the reader’s screen.

Tick auto-fit height in the builder and the snippet gains a short listener. The embed then reports its own height to your page whenever it changes, and the frame follows:

<script>
  window.addEventListener('message', function (e) {
    if (e.origin !== 'https://joycheck.io') return;
    if (!e.data || e.data.type !== 'joycheck:height') return;
    var f = document.querySelectorAll('iframe[src*="/embed/"]');
    for (var i = 0; i < f.length; i++) {
      if (f[i].contentWindow === e.source) f[i].style.height = e.data.height + 'px';
    }
  });
</script>

Three things are worth knowing about it. It matches frames by contentWindow rather than by id, so one copy of the listener drives however many JoyCheck widgets a page carries. The traffic is one-way: the embed registers no message listener of its own, so nothing on your page can drive the widget, and the only thing that crosses the frame boundary is an integer. And it is strictly opt-in, because the auto-fit URL carries ?fit=1 — every snippet copied before this existed keeps behaving exactly as it did.

Loading a widget in another language

Append ?lang= and a two-letter code. English is the default, so no parameter is needed for English, and the builder writes the parameter for you.

Both sizes of the input analysis console ship ar, de, es, fr, id, ja, pt, ru and tr alongside English. The steering wheel tester ships ar, de, es, fr, pt and tr. The polling rate test ships none: it carries no translation dictionary, so a language parameter on it would change nothing, and the builder disables the control rather than pretend otherwise.

Arabic switches the widget to a right-to-left layout on its own.

What these embeds deliberately do not do

Four limits, stated plainly rather than discovered later.

No analytics, no cookies of our own. The embed routes load no tag manager, no analytics, and no advertising code, and set nothing themselves. This differs from the main JoyCheck site on purpose: your page is not ours to instrument. The one caveat worth stating: a reader who has used joycheck.io directly already has that domain’s analytics cookies, and those ride along with the embed request unless their browser blocks third-party cookies. Nothing new is set and nothing reads them.

No theme switching. The instruments render in JoyCheck’s dark palette regardless of your site’s theme — and regardless of JoyCheck’s own, since the site has a light mode and the instruments stay dark there too. On a light page they read as a self-contained panel, the way an embedded video player does. That is why the builder has no theme control: a switch that changed nothing would be worse than the limitation.

No force feedback in the wheel widget. Most wheels expose no rumble actuator to the browser at all, so the steering wheel tester reports that capability honestly instead of simulating a test. The same limit applies embedded.

No link equity. An iframe is not a link, so embedding JoyCheck passes no ranking signal in either direction. What it does give you is a working tool on your page, and what it gives us is the attribution link in the corner. Both sides should embed for that reason and no other.

If you already embedded the older tester

The route at https://joycheck.io/embed/gamepad-tester/ carries the previous tester skin. It is still built, still served, and renders exactly what it always did — an embed already on your page will not change under you, and there is no date on which it stops working.

It is simply no longer what the builder hands out. That skin is a design generation behind the console, so offering both made the picker look like two different products rather than two sizes of one. If you would like the newer look, the compact console is the closest replacement, and swapping is a one-line change to the src.

Sources

  1. MDN Web Docs. “Permissions Policy.” developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Permissions_Policy

Frequently asked questions about embedding JoyCheck

Are the JoyCheck widgets free to embed?

Yes. There is no API key, no account, no registration, and no usage limit. Copy the iframe and it works. The only request is that you leave the small Powered by JoyCheck link in place, since that link is the entire business model behind keeping the tools free.

What is the difference between the full console and the compact one?

They are the same instrument on the same route, so they look identical and behave identically. The compact one drops two stacked readout blocks: the diagnostic panel cards and the advanced diagnostics grid. That takes it from roughly 3280 pixels to roughly 1460 pixels at a 900 pixel wide column. Nothing becomes untestable, because vibration is still driven from the toolbar and the sticks, triggers, D-pad and face buttons are all live on the instrument itself. What goes is the numeric readout beside them. Use the full console when the tester is the point of the page and the compact one when it supports the writing.

Do the widgets track my visitors?

No. The embed pages load no analytics, no tag manager, and no advertising code, and they set no cookies of their own. That is a deliberate difference from the main JoyCheck site, which does use analytics with consent: an embed runs inside someone else's page, so it must not fire tags there. One precise caveat: if a visitor has used joycheck.io directly before, that domain's existing analytics cookies still live in their browser and, unless their browser blocks third-party cookies, ride along with the embed request. The embed neither creates nor reads them. Controller input is read through the W3C Gamepad API and never leaves the visitor's browser.

Why does the widget say no controller detected inside my page?

Almost always a missing permission attribute. A cross-origin iframe cannot use the Gamepad API unless the parent page grants it, so the iframe tag must include allow set to gamepad. Copy the snippet exactly as the builder gives it. After that, the visitor still has to press a button on the controller, because the Gamepad API keeps a device invisible until it produces input.

Can I change the widget language?

Yes, with a URL parameter, and the builder writes it for you. Both sizes of the input analysis console ship ten languages: English, Arabic, German, Spanish, French, Indonesian, Japanese, Portuguese, Russian and Turkish. The steering wheel tester ships seven, dropping Indonesian, Japanese and Russian. The polling rate test carries no translation dictionary at all and is English only. Arabic switches the widget to a right-to-left layout automatically.

How tall should the iframe be?

Measured in a browser at a 900 pixel wide column: about 3280 pixels for the full input analysis console, 2080 with its advanced diagnostics collapsed, 1460 for the compact console, 800 for the polling rate test and 1260 for the steering wheel tester. Narrower columns are taller, because the instruments reflow into fewer columns. Rather than guess, switch on auto-fit in the builder: the widget then reports its own height to your page and the frame resizes to match.

Can the widget match my site's light theme?

No, and that is a design decision rather than a gap. The instruments render dark on JoyCheck's own light theme too, the way a code editor or an embedded video player stays dark inside a light page. Nothing in the builder offers a theme switch, because shipping a control that changed nothing would be worse than the honest limitation.

I already embedded the older gamepad tester. Does it still work?

Yes. The route at joycheck.io/embed/gamepad-tester/ is still built and still served, and nothing about what it renders has changed. It carries the previous tester skin, which is a design generation behind the console, so the builder no longer hands it out to new embedders. There is no need to swap it, and no date on which it stops working. If you would like the newer look, the compact console is the closest match in size.

Try the instruments before you embed them

No install, no account. Your inputs never leave your device.