Skip to content
Shiny.NET
Commercial SupportGuaranteed response times on Shiny bug fixes, straight from the maintainers. Plans from US$1,500 a year.See the plans

Device Data

Your users already keep their music, health records, contacts and calendars on the device. These libraries put each store behind one cross-platform API, handle the permission dance, and — where it helps — expose it to an AI agent.

Music

Query, browse and play the device music library

Get started

Query tracks, browse by genre, decade or playlist, and play music from the device library. Mobile-only: there is no equivalent of iOS MediaPlayer or Android MediaStore elsewhere.

  • Browse by genre, decade and playlist
  • Playback and audio output selection
  • Lyrics, album art and audio analysis
  • AI tools for search, playback and playlists

Health

Apple HealthKit and Android Health Connect behind one API

Get started

Unified access to HealthKit and Health Connect — read, write and observe twelve metrics including steps, heart rate, blood pressure and sleep.

  • 12 metrics including steps, heart rate, blood pressure and sleep
  • Read, write and observe data
  • AI tools with opt-in, read-only-by-default capabilities

App Store

Store version checks, store and review deep links, and the in-app review prompt

Get started

Ask the App Store, Google Play, the Microsoft Store or Flatpak/Snap whether a newer version of the running app is published, open its store or review page, and request the native in-app review prompt - all from one IAppStore.

  • Apple App Store and Mac App Store, Google Play, Microsoft Store
  • Flatpak and Snap on Linux, with appstream:// software centre links
  • StoreKit, Play in-app review and StoreContext review prompts

Age Signals

The store-shared age range for Texas SB 2420 and other app store age laws

Get started

Read the user's age range as the app store shares it - Apple Declared Age Range and Google Play Age Signals - from one IAgeSignals, with nullable age checks that never mistake "unknown" for "no".

  • Apple Declared Age Range on iOS and macOS 26+
  • Google Play Age Signals with verification tiers
  • Eligibility, regulatory flags and significant-change approval

In-App Purchases

StoreKit 2 and Google Play Billing 9 behind one API, with the backend included

Get started

Sell consumables, non-consumables and subscriptions through the App Store and Google Play from one IInAppPurchaseManager. The server package verifies purchases and turns App Store Server Notifications and Google Play RTDN into one stream of purchase events.

  • StoreKit 2 on iOS, Play Billing 9 on Android
  • Subscriptions, offers, free trials and pending purchases
  • ASP.NET Core webhooks for renewals, refunds and cancellations

Contact Store

Device contacts with full CRUD and LINQ queries

Get started

Access device contacts with full CRUD, a fluent async query builder with native translation, and Shiny's AccessState permission model. Runs in any Shiny host, with or without .NET MAUI.

  • Full create, read, update and delete
  • LINQ queries translated to the native store
  • Photos and thumbnails
  • AI tools, read-only by default

Calendar Store

Device calendars and events with CRUD and LINQ queries

Get started

Full CRUD on device calendars and events on iOS, Mac Catalyst, macOS, Android and Windows, with a LINQ query that pushes the calendar id and date window down to the native fetch.

  • CRUD on calendars and events
  • Attendees, reminders and availability
  • iOS 17 write-only access support
  • AI tools with per-operation write opt-in

Call Directory

Block and identify incoming calls on iOS and Android from a list your app owns

Get started

Your app keeps a list of numbers to block or label, and the phone applies it to every incoming call even when the app is not running — through a Call Directory extension on iOS (built during dotnet build, no Xcode project) and the call screening role on Android.

  • Call blocking and caller ID labels
  • Call Directory extension built for you — no Xcode project
  • Android call screening with an allow list and block-unlisted mode
  • Phone number normalization helper