From e5450d9f8932f2f98c2574f2416aa8c7196a6439 Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Tue, 10 Mar 2026 23:50:21 -0700 Subject: [PATCH] Help Docs Overhaul & Settings Fixes --- web_server.py | 4 +- webui/static/docs.js | 105 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/web_server.py b/web_server.py index 506d50e7..801e7137 100644 --- a/web_server.py +++ b/web_server.py @@ -3950,7 +3950,7 @@ def handle_settings(): if 'active_media_server' in new_settings: config_manager.set_active_media_server(new_settings['active_media_server']) - for service in ['spotify', 'plex', 'jellyfin', 'navidrome', 'soulseek', 'download_source', 'settings', 'database', 'metadata_enhancement', 'file_organization', 'playlist_sync', 'tidal', 'tidal_download', 'listenbrainz', 'acoustid', 'lastfm', 'genius', 'import', 'lossy_copy', 'ui_appearance', 'youtube', 'content_filter', 'itunes']: + for service in ['spotify', 'plex', 'jellyfin', 'navidrome', 'soulseek', 'download_source', 'settings', 'database', 'metadata_enhancement', 'file_organization', 'playlist_sync', 'tidal', 'tidal_download', 'listenbrainz', 'acoustid', 'lastfm', 'genius', 'import', 'lossy_copy', 'ui_appearance', 'youtube', 'content_filter', 'itunes', 'm3u_export']: if service in new_settings: for key, value in new_settings[service].items(): config_manager.set(f'{service}.{key}', value) @@ -15073,7 +15073,7 @@ def get_version_info(): }, { "title": "🤖 Automation Engine", - "description": "Visual drag-and-drop automation builder with 20+ triggers and 14 actions", + "description": "Visual drag-and-drop automation builder with 22 triggers and 19 actions", "features": [ "• Drag-and-drop builder: connect WHEN triggers → DO actions → THEN notifications/signals", "• Timer triggers: Schedule (interval), Daily Time, Weekly Schedule", diff --git a/webui/static/docs.js b/webui/static/docs.js index 8222bb26..9c1a2ab5 100644 --- a/webui/static/docs.js +++ b/webui/static/docs.js @@ -11,7 +11,8 @@ const DOCS_SECTIONS = [ { id: 'gs-overview', title: 'Overview' }, { id: 'gs-first-setup', title: 'First-Time Setup' }, { id: 'gs-connecting', title: 'Connecting Services' }, - { id: 'gs-interface', title: 'Understanding the Interface' } + { id: 'gs-interface', title: 'Understanding the Interface' }, + { id: 'gs-docker', title: 'Docker & Deployment' } ], content: () => `
@@ -72,6 +73,23 @@ const DOCS_SECTIONS = [
  • Import — Import music files from a staging folder with album/track matching
  • Settings — Configure services, download preferences, quality profiles, and more
  • +

    Version & Updates: Click the version number in the sidebar footer to open the What's New modal, which shows detailed release notes for every feature and fix. SoulSync automatically checks for updates by comparing your running version against the latest GitHub commit. If an update is available, a banner appears in the modal. Docker users are notified when a new image has been pushed to the repo.

    +
    +
    +

    Docker & Deployment

    +

    SoulSync runs in Docker with the following environment variables:

    + + + + + + + +
    VariableDefaultDescription
    DATABASE_PATH./databaseDirectory where the SQLite database is stored. Mount a volume here to persist data across container restarts.
    SOULSYNC_CONFIG_PATH./configDirectory where config.json and the encryption key are stored. Mount a volume here to persist settings.
    SOULSYNC_COMMIT_SHA(auto)Baked in at Docker build time. Used for update detection — compares against GitHub's latest commit.
    +

    Key volume mounts: Map your download path, transfer path (media server's monitored folder), and staging path to host directories. Ensure the paths configured in SoulSync Settings match the container-side mount points.

    +
    ⚠️
    If using slskd in a separate container, make sure both containers can access the same download directory. A common issue is slskd writing to a path that SoulSync can't read because the volume mounts don't align. Both containers must see the same files at the same internal path.
    +

    Podman / Rootless Docker: SoulSync supports Podman rootless (keep-id) and rootless Docker setups. The entrypoint handles permission alignment automatically.

    +

    Config migration: When upgrading from older versions, SoulSync automatically migrates settings from config.json to the database on first startup. No manual migration is needed.

    ` }, @@ -108,7 +126,8 @@ const DOCS_SECTIONS = [

    Genius

    Lyrics, descriptions, alternate names, song artwork

    ℹ️
    Workers retry "not found" items every 30 days and errored items every 7 days. You can pause/resume any worker from the dashboard.
    -

    Rate Limit Protection: Workers include smart rate limiting for all APIs. If Spotify returns a rate limit (429), a global ban activates — all Spotify calls are suppressed and searches automatically fall back to iTunes. A countdown modal appears showing ban duration, and the worker auto-resumes when the ban expires. You can manually disconnect Spotify from the modal to clear the ban immediately.

    +

    Rate Limit Protection: Workers include smart rate limiting for all APIs. If Spotify returns a rate limit with a Retry-After greater than 60 seconds, a global ban activates — all Spotify API calls are suppressed before they're made, and searches automatically fall back to iTunes/Apple Music. A countdown modal appears showing the ban duration, triggering endpoint, and remaining time. The enrichment worker auto-pauses during the ban and resumes when it expires.

    +

    The rate limit modal provides a Disconnect Spotify button that immediately clears the ban, pauses the Spotify enrichment worker, and deletes the local Spotify cache. This lets you switch to Apple Music as your primary metadata source without waiting for the ban to expire.

    Tool Cards

    @@ -155,10 +174,11 @@ const DOCS_SECTIONS = [

    Repair & Maintenance

    Additional maintenance tools accessible from the dashboard:

    @@ -246,7 +266,8 @@ const DOCS_SECTIONS = [

    M3U Export

    Export any mirrored playlist as an M3U file for use in external media players or media servers. Enable M3U export in Settings and use the export button on any playlist card.

    -

    M3U files reference the actual file paths in your library, so they work with any M3U-compatible player. Auto-save can be enabled to regenerate M3U files automatically when playlists are updated.

    +

    M3U files reference the actual file paths in your library, so they work with any M3U-compatible player.

    +

    Auto-Save — When enabled in Settings, M3U files are automatically regenerated every time a playlist is synced or updated. Manual Export — The export button on any playlist modal creates an M3U file on demand, even when auto-save is disabled.

    Discovery Pipeline

    @@ -282,6 +303,7 @@ const DOCS_SECTIONS = [
  • Click an artist to view their full discography with download buttons on each release
  • Click an album to open the download modal with track selection
  • Click a track to search Soulseek for that specific song
  • +
  • Preview tracks — Play button on search result tracks lets you stream a preview directly from your download source before committing to a download
  • @@ -313,6 +335,7 @@ const DOCS_SECTIONS = [
  • Download progress with per-track status indicators (searching, downloading, processing, complete, failed)
  • Downloads can be started from multiple places: Enhanced Search results, artist discography, Download Missing modal, wishlist auto-processing, and playlist sync.

    +

    Download Candidate Selection: If a download fails or no suitable source is found, you can view the cached search candidates and manually pick an alternative file from a different user. This lets you recover failed downloads without restarting the entire search.

    Post-Processing Pipeline

    @@ -386,7 +409,9 @@ const DOCS_SECTIONS = [ Familiar FavoritesLibraryWell-known tracks from artists you follow -

    Each playlist can be played in the media player, downloaded, or synced to your media server. Genre browsers let you filter discovery pool content by specific genres.

    +

    Each playlist can be played in the media player, downloaded, or synced to your media server.

    +

    Genre Browser — Filter discovery pool content by specific genres. Browse available genres and view top tracks within each genre category.

    +

    ListenBrainz Playlists — If ListenBrainz is configured, the Discover page also shows personalized playlists generated from your listening history: Created For You, Your Playlists, and Collaborative playlists.

    Build Custom Playlist

    @@ -444,6 +469,7 @@ const DOCS_SECTIONS = [
  • Remove artists individually or in bulk
  • Filter your library by Watched / Unwatched status
  • Use Watch All to add all recommended artists at once
  • +
  • Watch All Unwatched — Bulk-add every library artist that isn't already on your watchlist
  • @@ -464,7 +490,7 @@ const DOCS_SECTIONS = [
  • Playlist sync — Tracks from mirrored playlists that aren't in your library
  • Manual — Individual track or album downloads go through the wishlist
  • -

    Auto-Processing: The system automation runs every 30 minutes, picking up wishlist items and attempting to download them from your configured source. Failed items are retried with increasing backoff.

    +

    Auto-Processing: The system automation runs every 30 minutes, picking up wishlist items and attempting to download them from your configured source. Processing alternates between album and singles cycles — one run processes albums, the next run processes singles. If one category is empty, it automatically switches to the other. Failed items are retried with increasing backoff.

    Manual Processing: Use the Process Wishlist automation action to trigger processing on demand. Options include processing all items, albums only, or singles only.

    Cleanup: The Cleanup Wishlist action removes duplicates (same track added multiple times) and items you already own in your library.

    ℹ️
    Each wishlist item tracks its source (watchlist scan, playlist sync, manual), number of retry attempts, last error message, and status (pending, downloading, failed, complete).
    @@ -528,8 +554,10 @@ const DOCS_SECTIONS = [ Discovery CompleteWhen playlist track discovery finishes Library Scan DoneWhen a media library scan finishes Database UpdatedWhen a library database refresh finishes - Quality/Duplicate Scan DoneWhen quality or duplicate scanning finishes + Quality Scan DoneWhen quality scan finishes (with counts of quality met vs low quality) + Duplicate Scan DoneWhen duplicate cleaner finishes (with files scanned, duplicates found, space freed) Import CompleteWhen an album/track import finishes + Playlist MirroredWhen a new playlist is mirrored for the first time Signal ReceivedCustom signal fired by another automation @@ -553,7 +581,10 @@ const DOCS_SECTIONS = [ Clear QuarantineDelete all quarantined files Update DiscoveryRefresh the discovery artist pool Backup DatabaseCreate a timestamped database backup - Full CleanupClear quarantine, queue, staging, and search history + Refresh Beatport CacheScrape Beatport homepage and warm the data cache + Clean Search HistoryRemove old searches from Soulseek (keeps 50 most recent) + Clean Completed DownloadsClear completed downloads and empty directories from the download folder + Full CleanupClear quarantine, download queue, staging folder, and search history in one sweep Notify OnlyNo action — just trigger notifications @@ -574,7 +605,8 @@ const DOCS_SECTIONS = [

    Execution History

    Each automation card shows its last run time and run count. For scheduled automations, a countdown timer shows when the next run will occur.

    -

    Use the Run Now button on any automation card to execute it immediately, regardless of its schedule. The result (success/failure) updates in real-time on the card.

    +

    Use the Run Now button on any automation card to execute it immediately, regardless of its schedule. The result (success/failure) updates in real-time on the card. Running automations display a glow effect on their card.

    +

    Stall detection: If an automation action runs for more than 2 hours without completing, it is automatically flagged as stalled and terminated to prevent resource leaks.

    The Dashboard activity feed also logs every automation execution with timestamps, so you can review the full history of what ran and when.

    @@ -619,7 +651,7 @@ const DOCS_SECTIONS = [

    Enhanced Library Manager

    -

    Toggle Enhanced on any artist's detail page to access the professional library management tool:

    +

    Toggle Enhanced on any artist's detail page to access the professional library management tool. This view is admin-only — non-admin profiles see the Standard view only.

    • Accordion layout — Albums as expandable rows showing full track tables
    • Inline editing — Click any track title, track number, or BPM to edit in place (Enter saves, Escape cancels)
    • @@ -752,11 +784,12 @@ const DOCS_SECTIONS = [ KeyAction SpacePlay / Pause - Next track - Previous track + Seek forward / Next track + Seek backward / Previous track Volume up Volume down MMute / Unmute + EscapeClose Now Playing modal

      Media Session API — SoulSync integrates with your OS media controls (lock screen, system tray) for play/pause, next/previous, and seek.

      @@ -778,7 +811,7 @@ const DOCS_SECTIONS = [ content: () => `

      Service Credentials

      -

      Configure credentials for each external service. All fields are saved to your local config — nothing is sent to external servers except during actual API calls. Each service has a Test Connection button to verify your credentials are working.

      +

      Configure credentials for each external service. All fields are saved to your local database and encrypted at rest using a Fernet key generated on first launch. Nothing is sent to external servers except during actual API calls. Each service has a Test Connection button to verify your credentials are working.

      • Spotify — Client ID + Secret from developer.spotify.com, then click Authenticate to complete OAuth flow
      • Soulseek (slskd) — Your slskd instance URL + API key
      • @@ -801,6 +834,7 @@ const DOCS_SECTIONS = [

        The media player streams audio directly from your connected server — tracks play through your Plex, Jellyfin, or Navidrome instance without needing local file access.

        +
        💡
        Navidrome users: If artist images are broken after upgrading, use the Fix Navidrome URLs tool in Settings to convert old image URL formats to the correct Subsonic API format.

      Download Settings

      @@ -809,8 +843,8 @@ const DOCS_SECTIONS = [
    • Download Path — Where files are initially downloaded and processed
    • Transfer Path — Where processed files are moved after tagging and organization. Should point to your media server's monitored folder.
    • Staging Path — Folder for the Import feature (files placed here appear on the Import page)
    • -
    • iTunes Country — Storefront region for iTunes/Apple Music lookups (US, GB, FR, JP, etc.). Changes apply immediately to all searches without restarting.
    • -
    • Lossy Copy — When enabled, creates a lower-bitrate copy (MP3) of every downloaded file alongside the original. Useful for syncing to mobile devices or streaming servers with bandwidth constraints. The copy is placed in a configurable output folder.
    • +
    • iTunes Country — Storefront region for iTunes/Apple Music lookups (US, GB, FR, JP, etc.). Changes apply immediately to all searches without restarting. ID-based lookups automatically try up to 10 regional storefronts as fallback when the primary country returns no results.
    • +
    • Lossy Copy — When enabled, creates a lower-bitrate MP3 copy of every downloaded file. Configure the output bitrate (default 320kbps) and output folder. Optionally delete the original lossless file after creating the lossy copy. Useful for syncing to mobile devices or streaming servers with bandwidth constraints.
    • Content Filtering — Toggle explicit content filtering to control whether explicit tracks appear in search results and downloads.
    @@ -836,9 +870,10 @@ const DOCS_SECTIONS = [

    Other Settings

    @@ -850,7 +885,9 @@ const DOCS_SECTIONS = [ icon: '/static/settings.png', children: [ { id: 'prof-overview', title: 'How Profiles Work' }, - { id: 'prof-manage', title: 'Managing Profiles' } + { id: 'prof-manage', title: 'Managing Profiles' }, + { id: 'prof-permissions', title: 'Permissions & Page Access' }, + { id: 'prof-home', title: 'Home Page & Preferences' } ], content: () => `
    @@ -862,6 +899,8 @@ const DOCS_SECTIONS = [
  • Discovery pool and similar artists
  • Mirrored playlists
  • Queue and listening state
  • +
  • Home page preference
  • +
  • Page access permissions (admin-controlled)
  • Shared across all profiles: Music library (files and metadata), service credentials, settings, and automations.

    💡
    Single-user installs see no changes until a second profile is created. The first profile is automatically the admin.
    @@ -869,13 +908,35 @@ const DOCS_SECTIONS = [

    Managing Profiles

      -
    • Open the profile picker from the sidebar indicator
    • -
    • Click Manage Profiles to create, edit, or delete profiles
    • +
    • Open the profile picker by clicking the profile avatar in the sidebar header
    • +
    • Admin users see Manage Profiles to create, edit, or delete profiles
    • +
    • Non-admin users see My Profile to edit their own name and home page
    • Each profile can have a custom name, avatar (image URL or color), and optional 6-digit PIN
    • -
    • Set an Admin PIN when multiple profiles exist to protect management
    • +
    • Set an Admin PIN when multiple profiles exist to protect the admin account
    • Profile 1 (admin) cannot be deleted
    +
    +

    Permissions & Page Access

    +

    Admins can control what each profile has access to. When creating or editing a non-admin profile:

    +
      +
    • Page Access — Check or uncheck which sidebar pages the profile can see (Dashboard, Sync, Search, Discover, Artists, Automations, Library, Import). Help & Docs is always accessible. Settings is admin-only.
    • +
    • Can Download Music — Toggle whether the profile can initiate downloads. When disabled, all download buttons are hidden and the backend blocks download API calls with a 403 error.
    • +
    • Enhanced Library Manager — The Enhanced view toggle on artist detail pages is only available to admin profiles. Non-admin users see the Standard view only.
    • +
    +

    If the admin removes a page that was set as a user's home page, the home page automatically resets. Navigation guards prevent users from accessing restricted pages even via direct URL or browser history.

    +
    ℹ️
    Existing profiles created before permissions were added have full access to all pages by default. The admin must explicitly restrict access per profile.
    +
    +
    +

    Home Page & Preferences

    +

    Each user can choose which page they land on when they log in:

    +
      +
    • Admin profiles default to the Dashboard
    • +
    • Non-admin profiles default to the Discover page — a friendlier landing page for non-technical users
    • +
    • Any user can change their home page from their profile settings (click profile avatar → My Profile)
    • +
    • The home page selector only shows pages the user has access to
    • +
    +
    ` }, { @@ -914,7 +975,7 @@ const DOCS_SECTIONS = [ POST /api/database/backupCreate a backup -

    The full API has 90+ endpoints covering library, downloads, playlists, automations, settings, and more. Use a reverse proxy (Nginx, Caddy, Traefik) for external access with HTTPS.

    +

    The full API has 200+ endpoints covering library, downloads, playlists, automations, profiles, settings, and more. Use a reverse proxy (Nginx, Caddy, Traefik) for external access with HTTPS.

    WebSocket Events