Voidly / Widget builder
A little context.
Anywhere.
Pick a country. Shape the frame.
Bring the source along.
01 / Make it fit
Your frame.
Preview
480 × 300Dated 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&theme=dark&size=full&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.
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.
A smaller footprint