Commercial SupportGuaranteed response times on Shiny bug fixes, straight from the maintainers. Plans from US$1,500 a year.Guaranteed response times on Shiny bug fixes, straight from the maintainers. Plans from US$1,500 a year.See the plans
BLE Hubs 1.0Think SignalR for BLE!Think SignalR for BLE!Hub it up!
UniHub 1.0Universal Hubs - SignalR Styled Hub BLE or HTTP - Why not both!?Universal Hubs - SignalR Styled Hub BLE or HTTP - Why not both!?YES PLEASE!
Age Signals
The age signals bridge asks the app store for the user’s age range, for app store accountability laws such as Texas
SB 2420, and for any app that gates features by age. It’s built on Shiny.AgeSignals: one API over
Apple’s Declared Age Range and Google Play Age Signals.
On Apple, add the com.apple.developer.declared-age-range entitlement and enable the capability for the App ID. Without
it, the request never returns. On Android, the app must be installed from Google Play; a sideloaded build answers
403 app_not_owned. See Shiny.AgeSignals.
if (signal.status ==="Shared"&& signal.lowerBound !==null&& signal.lowerBound >=18)
showAdultContent();
elseif (signal.status ==="VerificationRequired")
askToVerifyInPlayStore();
In Blazor, register AddAgeSignalsBridgeClient() and inject IAgeSignalsBridge. The C# AgeSignal also has
IsAtLeast(age), which answers true or false when the store is sure, and null when it can’t tell (nothing shared,
or a range that straddles the age), so treat null as “not verified”.
POST agesignals/request takes one to three ascending ages, the gates the returned range is bounded by. Apple may present
a sheet. Google Play ignores the gates and uses the bands set in Play Console (0–12, 13–15, 16–17 and 18+ by default), so
configure the same ages there.
status
Meaning
Shared
An age range was shared: lowerBound and upperBound (inclusive; upperBound is null for the highest band)
Declined
The user, or their guardian, declined to share. It’s a result, not an error
VerificationRequired
Google Play: the user is where verification is mandatory and their age is unknown. Send them to the Play Store
NotSupported
The OS version has no store age API
source says how the range was established, weakest first: SelfDeclared, GuardianDeclared (a supervised account),
Confirmed (a payment card, ID or age estimation) and IdVerified (Google Play only; Apple reports these as
Confirmed). An app can require a minimum. communicationLimits is Apple’s flag for a child whose guardian turned on
communication limits.
Nothing is cached: consent can be revoked and a birthday crosses a band, so ask at the moments the law cares about —
first launch, before a gated feature, and after an update.
GET agesignals reports, with no UI, whether the OS has the API and what Apple says applies to this user: isEligible
(26.2+), and ageRangeRequired and the significant-change flags (26.4+). They are null on Android.
When a significant change to the app needs a guardian’s acknowledgment, POST agesignals/significant-update with
{ description } shows Apple’s sheet (iOS 26.4+). It answers { shown: false } on Android: declare the change in Play
Console instead, and read the guardian’s approval from the signal’s significantChange,
significantChangeApprovedThrough and installId.
Asks the store for the user's age range. Apple may present a sheet; Google Play shows its sharing prompt only outside the US law states. Declining is a result (Declined), not an error. Fails with 400 when the gates are not one to three positive, ascending ages, and with the store's reason (503 network, 403 app_not_owned, …) when it cannot answer.
One to three ascending ages the returned range is bounded by, such as [13, 16, 18]. Google Play ignores these and uses the bands set in Play Console, so configure the same ages there.
Shows Apple's significant-update acknowledgment (iOS 26.4+), which tells a supervised child's guardian about a significant change to the app. shown is false where there is no such sheet: on Google Play, declare the change in Play Console and read significantChange instead.
One to three ascending ages the returned range is bounded by, such as [13, 16, 18]. Google Play ignores these and uses the bands set in Play Console, so configure the same ages there.