Reference implementation of the proposed org.freedesktop.AgeVerification1 D-Bus interface for Linux distributions.
Provides OS-level age bracket storage and retrieval for compliance with California AB-1043 and New York S8102-A. Applications and app stores query a single system daemon instead of each performing their own age verification.
This is a skeleton implementation — a starting point for the Linux desktop ecosystem, not a finished enforcement tool. The goal is to have the plumbing ready before legislation forces rushed, fragmented solutions.
This reference impl is intentionally minimal and open to iteration. If you're a distro maintainer, desktop environment developer, or app developer, the interface is designed for you to poke holes in, improve, and build on. File issues, propose spec changes, and help shape what this becomes.
- A proposed D-Bus interface that any app can query for age brackets
- A working daemon + CLI + packaging to prove the concept end to end
- A starting point for discussion on how Linux desktops should handle age compliance
- A bulletproof enforcement mechanism (it's self-reported, like most age gates)
- A finished XDG specification (that requires community consensus)
- A solution for web platforms or mobile (this targets Linux desktop specifically)
The daemon runs on the system D-Bus and exposes three methods:
| Method | Description |
|---|---|
SetAge |
Store a bracket derived from a stated age |
SetDateOfBirth |
Store a bracket derived from a date of birth |
GetAgeBracket |
Retrieve the stored bracket (1-4) for a user |
Age brackets (identical under both laws):
| Bracket | Meaning |
|---|---|
| 1 | Under 13 |
| 2 | 13 to 15 |
| 3 | 16 to 17 |
| 4 | 18 or older |
Only the bracket integer is persisted when using SetAge -- the exact age is discarded immediately. When using SetDateOfBirth, the DOB is stored so the bracket auto-updates as the user ages.
pip install .System files (D-Bus policy, systemd unit) are in data/ and need to be installed to the appropriate system paths. See packaging/ for distro-specific packaging (Debian, Arch, RPM).
The ageverify CLI can talk to the running daemon or write directly to storage:
# Via D-Bus (daemon must be running)
ageverify set-age alice 25
ageverify set-dob bob 1995-06-15
ageverify get-bracket alice
# Direct mode (bypasses D-Bus, requires root)
sudo ageverify --direct set-age alice 25# Manually
sudo ageverifyd
# Via systemd
sudo systemctl enable --now ageverifydpip install -e .
pip install pytest ruff
pytest tests/ -v
ruff check src/ tests/These are known and intentional for a v0.1 reference implementation:
- Self-reported ages: Like all age gates, this trusts user input. Stronger verification (identity providers, hardware attestation) can layer on top later.
- Plaintext DOB storage: The auto-update feature requires persisting the date of birth. A production hardening pass should consider encryption at rest.
- No app-side enforcement: The daemon provides data; apps must opt in to checking it. Adoption depends on distro and DE buy-in.
- Local root can override: A user with
sudocan change their own bracket. This is inherent to any local-first system without remote attestation.
This is early-stage and actively looking for feedback from distro packagers, DE developers, and app developers. Open an issue to discuss the interface design, security model, or integration strategy.
LGPL-2.1-or-later