One open fingerprint on every piece of digital media
Every web page, website, app, video and chatbot carries a small signed label: who it suits (age band) and what it does to the viewer (influence profile). Creators attach it, independent raters sign it, and platforms, parents and regulators read it.
Nobody has to send viewing data anywhere. Each label is public and machine-readable, so a regulator can measure a whole market from the labels themselves. ShiniFrontiers is one rater under an open spec, not the measuring body.
A label, a binding and a signature
The fingerprint has three parts. Together they say what was rated, how it was rated and who stands behind the rating.
| Part | What it holds | Why it matters |
|---|---|---|
| Label | Age band (all_ages, mild, teen, older_teen, adult), shown on local scales; 12 influence categories scored 0–3; flags such as undisclosed_ad; rating date and expiry. | One vocabulary for every medium and every country. Local scales are a display choice, not a separate rating. |
| Binding | What the label is about: a URL scope for web pages and sites, package ID and signing certificate for apps, a file hash for videos, checked by the platform at upload, an endpoint and version for chatbots. | A label copied onto different content does not match, so an uploader cannot borrow another video's rating. |
| Signature | The rater signs label and binding together (Ed25519). Raters publish their public keys at /.well-known/ocl-keys.json. | Anyone can check who rated an item without asking a central server, and a forged or edited label fails the check. |
{
"spec_version": "0.1",
"label_id": "7Q2M9K4T",
"subject": { "kind": "web_page", "scope": "https://example.org/games/*" },
"age_band": "teen",
"influence": { "fun": 2, "education": 1, "inspiration": 1, "fight": 1,
"threat_fear": 0, "sexual": 0, "substances": 0, "risky_stunts": 2,
"commercial_push": 3, "political": 0, "body_pressure": 1, "hate": 0 },
"flags": ["undisclosed_ad", "imitation_risk"],
"rater": "rate.shinifrontiers.com",
"method": "independent",
"confidence": "high",
"rated_at": "2026-10-31",
"expires_on": "2027-01-29",
"signature": "eyJhbGciOiJFZERTQSJ9..."
}
Four roles, no central tracker
Attaches the label
Adds one tag, file or metadata field to the item. Free to self-declare a label; an independent rating is optional.
Rates and signs
Any rater following the open spec. Self-declared labels say "method": "self". Independent raters such as ShiniFrontiers sign with their own key.
Reads and acts
Uses the label to gate by age, tune recommendations or filter on a child's device. Keeps the label when content is re-uploaded.
Measures and audits
Reads public labels to measure coverage and risk across a market, spot-checks ratings by re-rating samples, and holds raters to account.
One method per medium, nothing re-encoded
Two lines in the page head
- The link points readers to the full label record.
- The optional meta tag carries the signed label itself, so it can be checked offline.
- A page label overrides the site label for that page.
<link rel="ocl-label"
href="https://rate.shinifrontiers.com/label/7Q2M9K4T">
<meta name="ocl" content="eyJhbGciOiJFZERTQSJ9...signed-label">
One file for the whole site
- Publish
/.well-known/ocl.jsonon the site's domain. - Map path patterns to labels; the most specific match wins.
- Crawlers, browsers and regulators find it at the same address on every site.
{
"ocl": "0.1",
"site": "https://example.org",
"labels": [
{ "paths": ["/*"], "label": "https://rate.shinifrontiers.com/label/7Q2M9K4T" },
{ "paths": ["/forum/*"], "label": "https://rate.shinifrontiers.com/label/3HX8PL2D" }
]
}
In the app, the store listing and the developer's site
- An app metadata entry in the Android manifest or iOS Info.plist.
- The label link in the store listing until stores offer a field for it.
- The developer's
/.well-known/ocl.jsonlists package IDs, so the label is tied to the publisher's domain. - The binding names the package ID and signing certificate, so a cloned app does not match.
<!-- AndroidManifest.xml -->
<meta-data android:name="org.ocl.label"
android:value="https://rate.shinifrontiers.com/label/A5R9TW1C" />
<!-- Info.plist -->
<key>OCLLabel</key>
<string>https://rate.shinifrontiers.com/label/A5R9TW1C</string>
In the file's metadata, plus a perceptual fingerprint
- The label goes into the file's metadata with a stream copy. Picture and sound are not touched, so quality is identical.
- The target format is a C2PA manifest with an OCL assertion, the same container already used for content credentials.
- The platform reads the label at upload, checks its signature and file hash, and keeps it with the post as data. Stripping or re-encoding the file afterwards does not lose it.
- A tag in the description (
#OCLplus the label link) helps where metadata is missing. A plain tag is unsigned, so it counts as self-declared. - No label at upload means the video is unrated.
# copies the streams as they are; no re-encode
ffmpeg -i reel.mp4 -c copy -movflags use_metadata_tags \
-metadata ocl_label="https://rate.shinifrontiers.com/label/V8K2QM7X" \
reel-labelled.mp4
# description tag
#OCL rate.shinifrontiers.com/label/V8K2QM7X
A response header and a well-known file
- Every chat API response and chat page carries an
OCL-Labelheader. - The site's
/.well-known/ocl.jsonlists the chatbot endpoint and version. - A new model version means a new rating, because behaviour changes with it.
HTTP/1.1 200 OK
Content-Type: application/json
OCL-Label: https://rate.shinifrontiers.com/label/C3N7WD5B
Rating reads the item and never changes it
| Medium | What the rater looks at | What it keeps |
|---|---|---|
| Web page or website | Public pages, as a visitor sees them: text, screenshots, trackers, permission requests, autoplay, age gates. | Label and report. |
| App or game | Store listing first; full check runs the app. | Label, report, package binding. |
| Video | Frames and audio, processed in memory. | Label and fingerprint. The video itself is never stored. |
| Chatbot | A scripted set of child-risk conversations. | Label and report. |
How a regulator measures from labels
Because every label is public, signed and found at a known address, a regulator can measure without collecting anything about viewers:
- Coverage. Share of services, apps and top videos that carry a valid, unexpired label.
- Risk across a market. Age bands and influence scores per platform, per category, over time.
- Rater accuracy. Re-rate a random sample; raters whose labels drift lose standing.
- Platform behaviour. Whether platforms keep labels on upload and act on them (age gates, recommendations).
Earlier labels and what is different here
| Earlier scheme | What happened | OCL |
|---|---|---|
| PICS / ICRA web labels (1990s–2010) | Voluntary, and few browsers or platforms read them. Abandoned. | Proposed as a regulatory requirement, read by platforms. |
| IARC / PEGI app ratings | Age only, apps and games only. | Age plus influence, across all media. |
| C2PA content credentials | Says where content came from, not who it suits. | Travels inside C2PA as one more assertion. |
Suggestions for the EU KIDS Act
Our feedback to the EU KIDS Act proposal:
- Services in scope carry a machine-readable label in an open format such as OCL, at a known address per medium.
- Labels are signed, bound to the content and expire, so they can be checked without a central server.
- Platforms read the label when content is uploaded, keep it with the post as data, show it to viewers and expose it to the regulator through a machine-readable interface. The rule is about the label, not the file, so re-encoding does not matter.
- Content without a valid label counts as unrated and is not shown to child accounts by default. This gives every creator who wants a young audience a reason to label, and covers re-uploads that drop the label.
- Labels are trusted in order: independently signed, then self-declared signed, then unsigned tags. A false self-declared label is a breach, found by regulator sampling.
- Any rater may sign labels under the open spec; the regulator audits raters by sampling.
- Labels hold ratings only, never personal data.
This page describes a draft. Field names, file locations and the signature format are open for comment and will be fixed in OCL spec v0.1.