Horizon Mobile β On-Device Child Safety Filter
Horizon Mobile is a lightweight (~25M parameter) binary risk classifier for on-device child safety detection. Distilled from Horizon Full v2 using knowledge distillation on 1.6M synthetic conversations. Designed to run entirely on-device as a fast first-stage filter before escalating to the full cloud API.
β οΈ License: SafeCircle Research License (SRL-1.0). Commercial use prohibited without written permission. Contact legal@safecircle.tech.
Model Details
| Property | Value |
|---|---|
| Base model | google/mobilebert-uncased |
| Architecture | MobileBERT encoder β Linear(512, 2) classifier |
| Parameters | ~25M |
| Format | ONNX |
| Input | Conversation text (max 512 tokens) |
| Output | Binary: safe (0) / risk (1) + confidence |
| Inference | ~25ms on CPU |
| Teacher model | safecircleai/horizon-full |
| Distillation data | 1.6M synthetic conversations |
Evaluation Results
| Metric | Score |
|---|---|
| F1 | 0.9562 |
| Precision | 0.9997 |
| Recall | 0.9163 |
| False Positive Rate | 0.10% (1 in 1,034 benign) |
| False Negative Rate | 8.37% (332 in 3,966 risk) |
| Accuracy | 96.8% |
The 8.4% false negative rate means ~1 in 12 risk conversations are not flagged. This model must always be paired with Horizon Full for full risk assessment. It is a speed/cost optimization, not a replacement.
Deployment Pattern
Incoming message
β
βΌ
βββββββββββββββββββββββββββ
β Horizon Mobile β On-device, ~25ms, free
β (binary filter) β MobileBERT ONNX
ββββββββββββββ¬βββββββββββββ
β
ββββββββββ΄βββββββββ
β β
safe risk
β β
βΌ βΌ
No action βββββββββββββββββββββ
β Horizon Full β Cloud API, ~500ms
β (7-category + β Llama-3.2 3B
β severity JSON) β
ββββββββββ¬βββββββββββ
β
βΌ
Human moderator review
Usage
Python β ONNX Runtime
import numpy as np
import onnxruntime as ort
from transformers import AutoTokenizer
session = ort.InferenceSession("horizon-mobile.onnx")
tokenizer = AutoTokenizer.from_pretrained("safecircleai/horizon-mobile")
conversation = "Child: Can we meet up? Don't tell your parents."
enc = tokenizer(
conversation,
return_tensors="np",
truncation=True,
max_length=512,
padding="max_length",
)
logits, = session.run(None, {
"input_ids": enc["input_ids"].astype(np.int64),
"attention_mask": enc["attention_mask"].astype(np.int64),
})
probs = np.exp(logits[0]) / np.exp(logits[0]).sum()
label = ["safe", "risk"][probs.argmax()]
confidence = float(probs.max())
print(f"{label} ({confidence:.1%})")
# risk (96.2%)
iOS / Android (ONNX Runtime Mobile)
Load horizon-mobile.onnx with the ONNX Runtime Mobile SDK. Tokenize with a WordPiece tokenizer (vocab from this repo). Input: input_ids + attention_mask as int64 tensors, shape [1, 512]. Output: logits shape [1, 2].
Limitations
- Binary only β outputs
safe/risk, no category or severity (use Horizon Full for that) - 8.4% FNR β approximately 1 in 12 risk conversations are missed at this stage
- English only β multilingual performance untested
- Not standalone β must be paired with Horizon Full and human review in production
Citation
@misc{horizon2026,
title={Horizon: Child Safety Risk Detection via Fine-tuned LLMs},
author={SafeCircle},
year={2026},
url={https://huggingface.co/safecircleai/horizon-full}
}
Model tree for safecircleai/horizon-mobile
Base model
google/mobilebert-uncased