Build 92 · iOS 18 · macOS 15
Native widgets across every Apple surface.
Tap a widget to deep-link straight into the album. Use the transport buttons without unlocking. Glance at the Dynamic Island while you scroll, or pin the Mac Desktop widget to your wallpaper. All five surfaces share the same App Intents, so play / pause / next / previous always do the same thing across iPhone, iPad, and Mac.
NaviBeat widgets: four guardrails
App Group only
Every widget reads from a sandboxed App Group container the host app writes to. No network calls, no background fetches, no analytics SDK. The widget binary itself never opens a socket.
In-process App Intents
Tapping Play / Next / Previous inside a widget runs inside the host app process (AudioPlaybackIntent). No re-launch, no animation jank, no surprise modal: the widget glyph just flips.
Cross-platform shared engine
iPhone and Mac widgets share the same NaviBeatWidgets library so the App Group layout, snapshot wire format, and intent shapes match across platforms. Behaviour you learn on iPhone holds on the Mac.
Reload budget respected
Widgets only refresh on real state changes (track flip or play/pause), not on every tick. That keeps you well under Apple's daily refresh budget so the widget never freezes mid-day.
Five surfaces
Every widget NaviBeat ships in build 92.
Each surface has a single, opinionated job. None of them try to mirror the whole player: they show what you need at a glance, and they hand you back to the app the moment you want depth.
Home Screen: Now Playing
- Small + Medium sizes
- Cover art ambient backdrop
- Transport row (Medium): Prev / Play-Pause / Next
- Tap to deep-link to Now Playing
Home Screen: Recently Played
- Small: top recent track tile
- Medium: three-row list with cover thumbs
- Per-row deep link to the album
- Deduplicated by track id, max 12 entries
Lock Screen + StandBy
- Accessory Circular: play-state + title initial
- Accessory Rectangular: glyph + title + artist
- Accessory Inline: single-line status row
- StandBy + Always-On render via .vibrant mode
Live Activity + Dynamic Island
- Lock Screen long-form: cover + scrubber + transport
- Dynamic Island expanded (4 regions)
- Compact + minimal play-state glyph
- Auto-ends when the queue empties
Mac Desktop
- Small + Medium + Large sizes
- Cover art backdrop, full transport row
- Large: Up Next peek (next 3 queued tracks)
- Same App Intents shape as the iPhone widget
How widgets stay private
Sandboxed by design.
The host app writes a small JSON snapshot of "what is playing" into a per-platform App Group container. The widget process reads that snapshot on every timeline regeneration. There is no IPC layer, no network call, no analytics framework. If you turn airplane mode on, the widgets keep updating on every track flip.
- App Group identifiers:
group.app.navibeat.NaviBeatApp.iosandgroup.app.navibeat.NaviBeatApp.macos. Per-platform on purpose so a misconfigured iPad cannot read the Mac's container or vice versa. - Cover art bytes live as JPEG files inside the container, never embedded in the snapshot JSON (the snapshot stays under a few KB so UserDefaults reads are quick).
- Widget reloads only fire on real track changes or play / pause flips. Tick-by-tick "elapsed seconds" updates persist to the container but do not refresh the widget UI, which keeps NaviBeat well under Apple's daily reload budget.
- The Live Activity ends automatically when the queue empties, the user stops playback, or the stale window expires (set to remaining-track-duration + 30s grace, capped at the ActivityKit 8-hour ceiling).
One $5.99 buy. Every widget ships with build 92.
Universal Purchase on the App Store: iPhone, iPad, Mac, Apple TV, and Apple Watch. Widgets land on iPhone and Mac as soon as you update to build 92.