# Roadmap Ideas and planned work for **Louis**. Order is not a commitment; priorities may shift. Louis edits **playlists**. Linking a playlist to a physical Make Your Own card stays in the Yoto app. ## Planned ### [Yoto Icons](https://yotoicons.com/) integration ~~Browse and apply community 16×16 pixel icons from [yotoicons.com](https://yotoicons.com/) when editing playlists / tracks (Yoto `display.icon16x16`).~~ — **done** (Track Art Editor → Icons tab: Yoto public + yotoicons.com search). ### Pixel art editor ~~In-app 16×16 editor for custom Yoto display icons — draw or tweak pixel art, then save as the track/chapter icon alongside the playlist.~~ — **done** (Track Art Editor → Draw tab). ### Auto long-track split ~~When a YouTube source exceeds Yoto’s per-track duration cap (~1 hour), automatically split it into sequential playlist tracks (e.g. Part 1 / Part 2) on extract/save so long podcasts and albums still fit.~~ — **done**: sources over 55 minutes expand into connected playlist slats on add; save downloads once and ffmpeg-splits into MYO chapters. ### Home Assistant add-on ~~Package Louis as a [Home Assistant](https://www.home-assistant.io/) add-on so users can install and run it from their HA instance (config via add-on options, data volume for the audio work dir).~~ — **done**: see [homeassistant/louis/DOCS.md](homeassistant/louis/DOCS.md). Requires multi-arch GHCR (`amd64` + `arm64`) on `v*` releases. ### Docker Hub (and image registries) ~~Publish official images beyond GHCR — e.g. Docker Hub — so `docker pull` / compose examples work from the registries people already use. Confirm whether GHCR alone is enough or multi-registry release is worth the maintenance.~~ — **done**: each `v*` release pushes the same multi-arch image to **Docker Hub** (`stuartromanek/louis`) and **GHCR** (`ghcr.io/stuartromanek/louis`). Home Assistant add-on still pins GHCR. ### Other hosting / “one-click” images ~~Explore pre-canned deploy targets that consume container images (Railway templates, Coolify, CasaOS / Umbrel-style app stores, etc.) so self-hosters can spin Louis up without hand-rolling compose.~~ — **done**: homelab one-click via [docs/HOSTING.md](docs/HOSTING.md) — Portainer template ([`deploy/portainer/`](../deploy/portainer/)) as the supported path; Coolify docs; best-effort CasaOS bundle in [`deploy/casaos/`](../deploy/casaos/) (unmaintained). Cloud PaaS documented as poor fit; not templated. ### Horizontal Playlists scrolling ~~Investigate and fix horizontal scrolling in the Playlists carousel~~ — **done**: continuous wheel/drag pan (no snap), thin scrollbar, keyboard arrows; fan metaphor kept. ### Smartphone-centric UI ~~Phone layout for the three-panel editor~~ — **done**: below 600px, Search / Library tabs with nested playlist detail, Add to playlist drawer, phone header (Update + menu); denser YouTube rows; desktop/tablet two-column grid unchanged at `sm+`. ### “Add to Desktop” in mobile menu ~~Install / “Add to Home Screen” affordance in the phone overflow menu (uses the browser install prompt / platform instructions). Manifest + apple web-app meta already target standalone; this is the in-app entry point.~~ — **done**: phone Menu + tablet/desktop status bar; native `beforeinstallprompt` when available, otherwise a persistent toast with Share / Install steps (top on iOS so Safari’s Share control stays clear). Swan favicons + manifest icons. ### Resume pending playlist edits ~~Persist dirty playlist drafts across refresh~~ — **done**: pending (and live dirty) drafts are stored in `localStorage` and restored when the playlist is opened again. ### YouTube chapters → tracks Optional per-result toggle to expand YouTube chapters into separate playlist tracks. Must compose cleanly with auto 55-minute long-track splitting (same `split` time-range fields). ### Desktop app wrapper (Electron) ~~Package Louis as a cross-OS executable~~ — **done**: Electron host, bundled yt-dlp/ffmpeg, Settings credentials, DMG/NSIS on the same `v*` Release as GHCR. See [docs/DESKTOP.md](docs/DESKTOP.md) and [docs/DESKTOP_SHIP.md](docs/DESKTOP_SHIP.md). Stretch: Linux AppImage, auto-update, signed builds. ### Experiment with yt-dlp search backend ~~Spike replacing YouTube Data API v3 search/metadata with bundled/`PATH` yt-dlp (`ytsearch` + `--flat-playlist`) so desktop users need no Google Cloud API key. Keep the existing `/api/youtube/search` response shape; optional Data API fallback for self-host.~~ — **done**: `/api/youtube/*` uses bundled yt-dlp when `LOUIS_YOUTUBE_API_KEY` is unset; Data API remains an optional fallback. Desktop first-run no longer requires a YouTube key. ### Audio trim ~~Cut intros/outros (and similar) before save. Non-trivial UX; trim points per track in the playlist editor.~~ — **done**: scissors on a YouTube track or split group; waveform flyout/tray; keep-region re-splits when still over 55 minutes. ### YouTube URL paste ~~Paste a video, Shorts, public playlist, or channel URL in Search to load it (playlist `list=` wins over a watch URL’s `v=`). Check rows to add them as a group.~~ — **done**. ### Playlist create, rename, and delete ~~Name a new playlist before tracks can be added; confirming the name creates it on Yoto immediately (empty, or with tracks already picked in Search). Rename / Delete from the playlist header menu.~~ — **done**. ### Playlist artwork ~~Generate DiceBear covers for playlists: auto-applied on create, and Artwork in the playlist menu (generate / history / save).~~ — **done**. ## Done / shipped Tracked in git history, [CHANGELOG.md](CHANGELOG.md), and the README feature list rather than here. Recent highlights: Track Art, trim, auto-split, normalize at Update, batch Update from Menu, playlist artwork, faster open/library/Update overlay, homelab hosting (Portainer / HA / Docker Hub), Add to Home.