voidly

Voidly / Widget builder

A little context.
Anywhere.

Pick a country. Shape the frame.
Bring the source along.

Full480 × 300
Compact340 × 140
Badge260 × 42

01 / Make it fit

Your frame.

Size
Theme

Preview

480 × 300

Dated snapshot · this builder preview sends no measurements.

The copied code embeds this country snapshot. The preview stays measurement-free, including when you enable measurement in the generated code.

02 / Put it in place

One small embed.

Copy an iframe, or use the script wrapper. Both point to the same published widget.

Off: generated code includes measure=false. An omitted or unrecognized measurement setting also leaves measurement off.

<iframe src="https://voidly.ai/widget/embed?country=CN&amp;theme=dark&amp;size=full&amp;measure=false" width="480" height="300" title="Voidly censorship index — CN" frameborder="0" style="border:none;"></iframe>
Snapshot, score and attribution

This widget reads the same bundled score/OONI snapshot as the published widget. It does not fetch a new score every five minutes. Snapshot fetched: 2026-09-08T02:43:50.625Z. Content first seen: 2026-09-08T02:43:50.625Z.

The upstream generation field (2026-09-08T02:43:07.763Z) is a serve-time stamp and can change without a change to the measurements. It is not the observation time.

The score uses the published 30-day window. All-time OONI volume is separate. Risk tier, trend and blocked-service examples are editorial context. Missing measurements remain unmeasured, not zero censorship.

Keep the Voidly source link. Voidly-original material is offered under CC BY 4.0; upstream material retains its own terms.

Score-source endpoint ↗Data and source licenses →Published widget builder →
What passive measurement does

When enabled on the published embed, /measure.js chooses five domains, attempts browser requests and sends reachability/timing results, a timezone-derived country and timestamp to /v1/probe/widget-results. Network requests expose ordinary connection metadata to their destinations. A failed browser request does not by itself establish censorship.

The script respects Save-Data, deduplicates within the page and uses sessionStorage to limit runs to once per five minutes per tab. If storage is unavailable that storage limit cannot be enforced. Its header mentions battery constraints, but the current implementation has no battery check. No blanket “no tracking/no PII” promise is made here.

Leave measurement off unless you intend those visitor requests and have handled the notice/consent appropriate to your site. This local design preview never loads the measurement script, including when measure=true is selected or added to its URL.

Read the published measurement script ↗
Where it fits & query reference
  • News sites: add country context to reporting.
  • VPN providers: pair a dated index with your own availability information.
  • Human rights organizations: embed source-linked context.
  • Dashboards: use badge mode in a header or status area.

GET /widget/embed?country=XX&theme=dark&size=full

Defaults: country CN, dark theme, full size. Supported sizes are full (480×300), compact (340×140), badge (260×42). Country is case-insensitive. Invalid theme/size fall back to dark/full; an unknown country has a visible not-found state. Only an explicit measure=true enables measurement. Omitting the setting, using measure=false, or an unrecognized value leaves it off.

For multiple script widgets, give each wrapper a unique ID and update its getElementById call. Keep dimensions large enough for the chosen layout.

Full API docs →

A smaller footprint

Just need a badge?

Build an SVG badge