A Native Client's Promise: Boundaries and Trade-offs

Fastpotify's native promise can now be stated more precisely. It is not that a Rust binary makes Spotify simple, nor that a polished interface can replace the service's missing capabilities. Fastpotify feels native when it coordinates distinct capability surfaces, binds each action to the right identity and authority, keeps waiting away from the UI, and lets fresh external evidence correct local intent without making every interaction feel delayed. The final judgment in this series is therefore a question of boundaries: where does Fastpotify have control, where does it only observe, and where must it stop?

A native client is a chain of bounded authorities

The unified model is easier to see if the system is treated as a chain of decisions rather than a stack of components. A user action begins with a capability question. Is it a library read, a playlist mutation, a local playback command, a remote-device command, a desktop action, or a cache lookup? That classification determines which surface can answer it. The Web API, the librespot session, the local playback engine, the host desktop, and Spotify Connect devices are related, but none of them is the whole product.

The next question is identity. A shared Web API grant, a personal Web API grant, and a playback grant have different jobs. PKCE and the loopback callback keep password entry in Spotify's browser flow. Account verification prevents a personal or playback grant for one account from being attached to another account's library. Protected storage separates durable authority from readable settings and caches. A sign-out generation makes a late refresh or browser result too old to change the replacement session. These are not isolated security features. They are the conditions under which a later request is allowed to exist.

Then comes execution. The egui interface does not wait synchronously for Spotify, a keyring, an mDNS browse, artwork, or an update archive. A command enters the backend, a worker performs the slow operation, and a typed event returns through a central path that can check session generations, authorization attempts, leases, or query serials. The same model lets MPRIS and the single-instance control channel remain outside the UI's critical path. Responsiveness is not the absence of waiting. It is the placement and ownership of waiting.

Finally, the client must decide what to show while the authority is catching up. Fastpotify's queue and playlist behavior make the answer concrete. User intent can appear immediately. The local engine can settle local playback. A remote poll must be fresh enough to settle remote intent. A playlist snapshot must match the edit before an optimistic cache is trusted. This hierarchy gives the interface speed without pretending that local state is already external truth.

These relationships can be read as one operating model:

classDiagram class Fastpotify { native coordinator UI and local state } class CapabilitySurfaces { Web API librespot session playback and Connect } class IdentityBoundary { separate grants account binding protected storage } class AsyncBoundary { commands and events cancellation and generations } class AuthorityModel { local engine state remote snapshots playlist snapshots } class DesktopExtensions { tray and MPRIS links and receiver handoff verified updates } class ExplicitLimits { Premium and DRM API and upstream scope } Fastpotify --> CapabilitySurfaces : selects a surface Fastpotify --> IdentityBoundary : authorizes and persists Fastpotify --> AsyncBoundary : moves slow work Fastpotify --> AuthorityModel : reconciles evidence Fastpotify --> DesktopExtensions : extends the native boundary CapabilitySurfaces --> ExplicitLimits : inherits IdentityBoundary --> AuthorityModel : binds ownership AsyncBoundary --> AuthorityModel : rejects stale work

The important connection is between boundaries. Capability routing without identity checks could send a valid request for the wrong account. Protected credentials without generation checks could be restored by an old asynchronous write. An event-driven runtime without an authority model could display a stale queue response simply because it arrived last. Optimistic UI without explicit stopping conditions could become a local fiction. Fastpotify's design is credible because these mechanisms reinforce one another.