Settings

Configure display, playback, and downloads

{#if loading}

Loading settings...

{:else}

Display

How your library and collections are laid out

Layout

Hidden Folders

Folders to leave out of music browsing and search. Useful when a music library also holds podcasts or audiobooks. Hidden folders can still be opened from a direct link, and anything already playing or downloaded is unaffected.

{#if exclusionsLoading}

Loading folders...

{:else if exclusionCandidates.length === 0}

No music folders to choose from. Connect to your server to pick folders to hide.

{:else}
{#each exclusionCandidates as candidate (candidate.id)} {/each}

Changes apply to listings loaded from now on; reopen a page to see them take effect.

{/if}

Crossfade

Fade between tracks for seamless transitions

{settings.crossfadeDuration.toFixed(1)}s
0s (Off) 12s (Max)

Gapless Playback

Eliminate silence between tracks in albums

Volume Normalization

Automatically adjust volume levels for consistent playback

{#if settings.normalizeVolume}

Target Volume Level

{/if}

Equalizer

Shape the sound with presets or custom bands (Linux)

{#if settings.equalizerEnabled}

Presets

{#each eqPresets as [name, gains] (name)} {/each} {#if activeEqPreset === null} Custom {/if}

Bands (dB)

{#each EQ_BAND_LABELS as label, i (label)}
{eqBands[i] > 0 ? "+" : ""}{eqBands[i]} handleEqBandInput(i, e)} onchange={(e) => handleEqBandChange(i, e)} class="eq-slider" aria-label="{label} Hz gain" /> {label}
{/each}
{/if}

Video Playback

Auto-play Next Episode

Automatically start the next episode when one finishes

{#if videoSettings.autoPlayNextEpisode}

Countdown Duration

Time before next episode starts automatically

{videoSettings.autoPlayCountdownSeconds}s
5s 30s

Episode Limit

Stop auto-playing after this many consecutive episodes

{#each episodeLimitOptions as option} {/each}
{/if}

Streaming Quality

Limit how much bandwidth video streams may use. Lower settings ask the server to transcode before sending, which saves data on metered or slow connections at the cost of picture quality. You can also change this for a single video from the player's quality menu.

{#each streamingQualities as [quality, label, detail]} {/each}

Applies to videos started from now on; a video already playing keeps the quality it started at.

{#if supportsNativeVideo}

Native Video Experimental

Decode video with the device's hardware decoder instead of the built-in web player, for better performance and battery life, and so picture-in-picture shows the video rather than the app. On by default. Turn it off to fall back to the built-in web player if a video misbehaves.

Takes effect the next time you start a video.

{/if}

Search

Result Group Order

Drag or use the arrows to choose the order search result groups appear in. Empty groups are hidden automatically.

Waiting to sync

Image Cache

Cache Usage

{#if cacheLoading} Loading... {:else if cacheStats} {formatBytes(cacheStats.totalSizeBytes)} / {cacheStats.limitBytes === 0 ? "Unlimited" : formatBytes(cacheStats.limitBytes)} {/if}
{#if cacheStats && cacheStats.limitBytes > 0}
{/if}

{#if cacheStats} {cacheStats.itemCount} images cached {:else} Thumbnails and artwork are cached locally for faster loading {/if}

Storage Limit

{#each cacheLimitOptions as option} {/each}

Clear Image Cache

Remove all cached thumbnails and artwork

Downloads

Storage Limit

Maximum storage for offline downloads

Smart Caching

Automatically download albums you're listening to

Queue Pre-caching

Download the next {cacheConfig.queuePrecacheCount} tracks in the queue automatically

WiFi Only

{#if networkDetectionSupported} Hold downloads unless on an unmetered network. Cellular and metered hotspots are excluded; WiFi and Ethernet are allowed. {:else} Only available on Android — this device has no metered connection to detect. {/if}

Diagnostics

Detail level

Higher detail helps diagnose a problem but writes more to disk. The setting survives a restart, so you can turn it up and then reproduce the bug.

{#each LOG_LEVELS as level (level)} {/each}

Export diagnostics

Bundles the logs and your app/OS versions into one file to attach to a bug report. Access tokens and passwords are removed; nothing is uploaded anywhere.

{#if exportedBundle}

Saved {formatBytes(exportedBundle.sizeBytes)} from {exportedBundle.fileCount} log file{exportedBundle.fileCount === 1 ? "" : "s"}.

{exportedBundle.path}

{#if canInstallUpdates} {/if}
{:else if exportError}

Couldn't export: {exportError}

{/if}
{#if diagnosticsInfo}

{diagnosticsInfo.logDir}

{formatBytes(diagnosticsInfo.totalSizeBytes)} of logs held

{/if}

Updates

{canInstallUpdates ? "Check for updates" : "Get the latest version"}

{#if canInstallUpdates} Downloads are verified against JellyTau's signing key before anything is installed. {:else} Android installs are handled by the system installer — this opens the releases page. {/if}

{#if updateState === "current"}

You're on the latest version.

{:else if updateState === "failed"}

Couldn't reach the update server. This is safe to ignore — JellyTau keeps working.

{:else if updateState === "installing"}

Downloading… {Math.round(updateProgress * 100)}%

JellyTau will restart when this finishes.

{:else if updateState === "available" && updateAction.kind === "install"}

Version {updateAction.version} is available

{#if updateAction.notes}
{updateAction.notes}
{/if}
{:else if updateState === "available" && updateAction.kind === "open-releases"} {/if}

About these settings:

  • Crossfade smoothly blends the end of one track with the beginning of the next
  • Gapless removes silence between tracks for continuous album playback
  • Normalization evens out loudness between tracks in real time, toward your selected level
{/if}