Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/calmerism/Tamed/llms.txt

Use this file to discover all available pages before exploring further.

Tamed treats the visual experience as a first-class feature. The player screen can display live animated canvases sourced from Apple Music or ViviMusic, a suite of dynamic background styles drawn from album art colours, and seven player UI design styles. Every visual element from blur radius to thumbnail corner rounding is tunable through a dedicated set of preference keys.

Canvas Providers

A “canvas” is a short looping video or animated artwork that plays behind the album art during playback. Tamed queries multiple independent canvas sources and picks the first hit.

Apple Music Canvas (AppleMusicCanvasProvider)

AppleMusicCanvasProvider queries the Apple Music API (amp-api.music.apple.com) for HLS motion artwork. It supports two lookup paths:
  1. editorialVideo — present on albums with Apple Motion artwork, accessed via ?extend=editorialVideo.
  2. Music-video tracks — some albums embed a full-length music video as a track, accessed via ?include=tracks.
Entry points:
// Look up by album name + artist
AppleMusicCanvasProvider.getByAlbumArtist(album, artist, storefront)

// Look up by song name + artist, optionally with album context
AppleMusicCanvasProvider.getBySongArtist(song, artist, album, storefront)

// Direct lookup by Apple Music album ID
AppleMusicCanvasProvider.getByAlbumId(albumId, storefront)
Results are cached in a ConcurrentHashMap with a 24-hour TTL. The provider auto-refreshes its JWT developer token from the Apple Music web player when the cached token expires or returns a 401 Unauthorized.

Monochrome API Canvas (MonochromeApiCanvas)

MonochromeApiCanvas calls the canvas.monochrome.workers.dev Cloudflare Worker endpoint. It searches by "$title $artist $album" and validates the result against both song title and artist name before returning a CanvasArtwork.

ViviMusic Canvas (ViviMusicCanvasProvider)

ViviMusicCanvasProvider fetches a community-maintained JSON manifest from jsDelivr (vivizzz007/vivimusicanvas). The manifest contains a list of ViviMusicCanvasItem objects, each with song, artist, and url fields. The manifest is cached in memory.

Canvas Go Provider (CanvasGoProvider)

CanvasGoProvider calls the embedded Go backend (when the optional AAR is present) via reflection (gobackend.Gobackend.FetchCanvasBySongArtist). It fetches Apple Music trickplay motion artwork using the device’s locale storefront and parses the returned JSON to a CanvasArtwork.

Artist Background (AppleMusicArtistBackgroundProvider)

AppleMusicArtistBackgroundProvider fetches an artist’s motion background from the Apple Music API. It searches for the artist, scores candidates by name similarity, then fetches editorialVideo and editorialArtwork fields from the artist profile. Results are cached for 24 hours.
The TamedCanvas feature toggle (TamedCanvasKey) must be enabled for canvas providers to be queried during playback. The maximum canvas cache size is configured via MaxCanvasCacheSizeKey.

Background Styles

PlayerBackgroundStyle

The PlayerBackgroundStyle enum controls what is rendered behind the player UI:
StyleDescription
DEFAULTSimple flat background using the system theme colour
GRADIENTSoft gradient derived from album art palette
CUSTOMA user-supplied static image with adjustable blur, contrast, and brightness
BLURBlurred album art fill
COLORINGVivid palette colouring extracted from album art
BLUR_GRADIENTBlurred art combined with a gradient overlay
GLOWColour glow emanating from the album art edges
GLOW_ANIMATEDAnimated version of GLOW with shifting colour transitions
APPLE_MUSICReplicates the Apple Music ambient colour wash
LIVE_MESHAnimated particle mesh with palette colours
BACKDROPFull-bleed canvas video used as the player background
For CUSTOM, three additional keys fine-tune the image:
val PlayerCustomImageUriKey  = stringPreferencesKey("playerCustomImageUri")
val PlayerCustomBlurKey      = floatPreferencesKey("playerCustomBlur")
val PlayerCustomContrastKey  = floatPreferencesKey("playerCustomContrast")
val PlayerCustomBrightnessKey = floatPreferencesKey("playerCustomBrightness")

HomeBackgroundStyle

The home screen has its own background style selector:
enum class HomeBackgroundStyle {
    DEFAULT,   // Standard Material surface
    BACKDROP,  // Canvas video backdrop
    LIVE_MESH, // Animated mesh using palette colours
}

Player Design Styles

PlayerDesignStyle defines seven player UI layout options:
enum class PlayerDesignStyle {
    V1, V2, V3, V4, V5, V6, V7,
}
V4 and V7 are reserved but not independently implemented — both fall back to V3 at runtime via asSupportedPlayerDesignStyle(). Only V1, V2, V3, V5, and V6 render distinct layouts.

Thumbnail Settings

KeyTypeDescription
ThumbnailCornerRadiusKeyFloatCorner rounding radius for album art thumbnails
CropThumbnailToSquareKeyBooleanForce-crop non-square artwork to 1:1 ratio
HidePlayerThumbnailKeyBooleanHide the thumbnail entirely in the player view

Blur Settings

KeyTypeDescription
DisableBlurKeyBooleanGlobally disable all blur effects (useful on low-end devices)
BlurRadiusKeyFloatRadius for background blur in blur-mode backgrounds

Dynamic Theming

Tamed’s colour system adapts to album art using the Android Palette library:
KeyTypeDescription
DynamicThemeKeyBooleanExtract palette colours from current album art
CustomThemeColorKeyStringFixed hex seed colour when dynamic theme is off
RandomThemeOnStartupKeyBooleanPick a random accent colour on each app launch
DarkModeKeyStringDark mode preference (SYSTEM, ON, OFF)
PureBlackKeyBooleanUse true #000000 black for AMOLED savings

Fonts

AppFont defines the typeface used across the entire application UI:
enum class AppFont(val value: String) {
    SYSTEM("system"),
    GOOGLE_SANS("google_sans"),
    SANS_FLEX("sans_flex"),
    OUTFIT("outfit"),
    PLUS_JAKARTA_SANS("plus_jakarta_sans"),
}
The selected font is stored in SelectedFontKey. AppFont.fromValue() deserialises the stored string back to the enum, defaulting to SYSTEM if unrecognised.

Swipe Gestures

KeyTypeDescription
SwipeToSongKeyBooleanSwipe left/right on the player to skip tracks
SwipeThumbnailKeyBooleanSwipe on the album art thumbnail specifically
SwipeSensitivityKeyFloatDistance threshold before a swipe is registered

Slider Styles

The seek/progress bar can be rendered in five styles:
enum class SliderStyle {
    Standard,
    Wavy,
    Thick,
    Circular,
    Simple,
}
The active style is stored in SliderStyleKey.

Build docs developers (and LLMs) love