Feature Request: Named Library Shelves for Home Screen Organization - Revision 1 #165
Replies: 4 comments
Developer Analysis: Named Library ShelvesNote: I'm not a developer. I fed the feature request and the Moonbase + Moonfin-Core source code into Claude (Anthropic) and asked it to analyze the implementation scope. The structural reasoning is grounded in the actual source, but a real developer should verify the details before committing to any approach. Posting this in case it's useful to the maintainers, or as a reference if I end up attempting it myself. The good news: the pluginDynamic system is already the right vehicleMoonfin already has a clean mechanism for exactly this kind of server-defined dynamic home row — it's the same system powering Collection rows, Genre rows, and Playlist rows today. Shelves would follow the identical pattern. Nothing architectural needs to change; this is an additive feature. Here's how the existing system works, using Collections as the model:
Shelves fit this exactly. The only meaningful difference is that a shelf's How shelf rows reach the client (an important design detail)One thing worth understanding upfront: Collection, Genre, and Playlist rows are not pushed from the server to clients via settings sync. They are discovered locally by The sync service only passes Shelves must follow the same local-discovery pattern: Scope breakdownMoonbase (C# backend) — 4 changes1. New model: public class LibraryShelfDefinition
{
public string Id { get; set; } = Guid.NewGuid().ToString("N");
public string Name { get; set; } = string.Empty;
public List<string> LibraryIds { get; set; } = new();
public int Order { get; set; } = 0;
}2. Add shelves list to public List<LibraryShelfDefinition> LibraryShelves { get; set; } = new();Because shelf definitions live in 3. New API endpoints
Note: 4. Add [JsonPropertyName("displayShelvesRows")]
public bool? DisplayShelvesRows { get; set; }Admin config page (
|
| File | Change | Est. lines added |
|---|---|---|
PluginConfiguration.cs |
New model + one property | ~25 |
MoonfinSettingsProfile.cs |
One nullable bool field | ~4 |
ShelvesController.cs (new file) |
CRUD + Libraries endpoints | ~150 |
configPage.html |
Shelves tab + mgmt UI + loadHomeLayoutShelves() |
~200–250 |
home_section_config.dart |
One enum value | ~5 |
row_data_source.dart |
New shelves case (~comparable to collections at 32 lines) |
~35 |
home_row_toggles_screen.dart |
One toggle block | ~26 |
user_preferences.dart |
One preference constant | ~5 |
home_sections_screen.dart |
Fetch, merge, category, visibility gate, empty-state check | ~80–100 |
home_view_model.dart |
One filter condition in visibleConfigsRaw |
~5 |
| Localization strings | Title + subtitle across locale files | ~15 |
Rough total: ~550–620 lines across 10–11 files. The admin config page UI and home_sections_screen.dart are the most substantive pieces. Everything else slots into well-established patterns with clear existing analogues in the codebase.
Caveat: this estimate is based on static analysis of the source and comparison with similar features. A developer will likely encounter additional design considerations, edge cases, or integration details not visible from the outside.
Considerations worth flagging
Library visibility per user: The client must use the user-scoped Jellyfin library API when resolving shelf libraries at runtime, not the admin virtual folder list. This ensures a user only sees libraries in a shelf that they actually have permission to access.
Empty shelf and deleted shelf handling: If all libraries in a shelf are inaccessible or deleted for a given user, the row should be silently hidden rather than rendering empty or broken. Similarly, if an admin deletes a shelf entirely, the client's next call to GET /Moonfin/LibraryShelves will simply not return it, and _mergeShelfSections() will prune the stale entry — the same way _mergeCollectionSections() handles deleted collections today.
Stale library IDs: If an admin deletes a Jellyfin library that's assigned to a shelf, the shelf definition will hold a stale ID. The client should handle missing libraries gracefully, and ideally the admin UI would flag orphaned assignments so the admin knows to clean them up.
Two distinct order concepts: Library order within a shelf (which libraries appear in what sequence inside the row) is separate from where the shelf row appears on the home screen (controlled by HomeSections order as usual). Worth keeping these clearly separated in the data model.
Backward compatibility with older clients: Because shelves use the existing pluginDynamic / HomeSections mechanism, clients that don't implement the shelves pluginSource will silently skip those rows — the same way any unrecognized pluginSource is handled today. No breakage.
Multi-server setups: Moonfin supports connecting to multiple Jellyfin/Emby servers simultaneously. Shelves are defined per-server in PluginConfiguration, so a user with two servers would get independent shelf sets from each. The HomeSectionConfig already has a serverId field for exactly this reason — it just needs to be populated correctly when shelf rows are discovered and merged into the local layout.
Cross-client parity: The Moonfin-Core changes cover mobile, desktop, Android TV, Apple TV, and web. Full parity would eventually require the Roku and Smart TV (Tizen/webOS) repos to also implement the shelves pluginSource. Those clients would silently skip shelf rows until then, which is acceptable but worth noting.
Happy to elaborate on any part of this. And again — I'm not a developer, so treat this as a starting point for a developer to validate rather than a finished spec.
|
Simplifying
|



Uh oh!
There was an error while loading. Please reload this page.
Feature Request: Named Library Shelves for Home Screen Organization - Revision 1
Revised Request #159 into a new topic to provide a clear request based on moonfin features I was not aware of at the time of submission. Apologies if that (closing old-active topic, creating new) is not proper message forum etiquette.Summary
Add support for admin-defined Library Shelves — named home screen rows that group existing Jellyfin libraries together.
A Library Shelf would be a home screen row whose tiles are libraries, not individual media items, genres, or collections.
Problem
Jellyfin servers with many libraries can become difficult to navigate on a TV interface, especially with a remote.
Today, libraries are typically shown together under My Media. This works for smaller setups, but it becomes crowded when a server has many separate libraries, such as:
Moonfin already supports useful home screen organization through Collections and Genres, but those solve a different problem.
Clarifying the Difference
I want to clarify the distinction between Shelves, Genres, Collections, and Media Items.
Library Shelves
A Shelf would be a named row made up of existing Jellyfin libraries.
Example:
Movies
Classic Movies
Documentaries
TV Shows
Animation
Home Videos
In this model, each tile is still an existing Jellyfin library.
Genres
A Genre row groups content based on genre metadata.
Example:
Genres
Opening or displaying a genre then shows individual media items that match that genre.
Collections
A Collection row groups curated sets of media items.
Example:
Collections
Collections are useful, but they are still media-level groupings, not library-level organization.
Media Items
Media items are the actual movies, shows, episodes, or videos.
Example:
Action / Adventure
Proposed Solution
Allow admins to create named Library Shelves and assign existing Jellyfin libraries to them.
Each shelf would appear as a separate labeled row on the Moonfin home screen.
Example configuration:
Shelf Name | Libraries -- | -- Movies | Action / Adventure, Sci-Fi / Fantasy, Drama, Comedy, Romance, Horror / Thriller Classic Movies | Westerns, Musicals, Cult Classics, Golden Era, Black & White Documentaries | Nature / Science, Sports, True Crime, History / War, Music TV Shows | Drama, Comedy, Sci-Fi / Fantasy, Action / Adventure, Reality Animation | Anime, Cartoons, Feature Films Home Videos | Birthdays, Vacations, Special Events, Sports, Family ClipsDesired Home Screen Behavior
Instead of all libraries appearing together in one large My Media row, the home screen could show:
Movies
Action / Adventure, Sci-Fi / Fantasy, Drama, Comedy, Romance, Horror / Thriller
Classic Movies
Westerns, Musicals, Cult Classics, Golden Era, Black & White
Documentaries
Nature / Science, Sports, True Crime, History / War, Music
TV Shows
Drama, Comedy, Sci-Fi / Fantasy, Action / Adventure, Reality
Animation
Anime, Cartoons, Feature Films
Home Videos
Birthdays, Vacations, Special Events, Sports, Family Clips
Each tile would open the existing Jellyfin library exactly as it does today.
Why Genres and Collections Are Not the Same Thing
Moonfin’s existing Genre and Collection rows are useful and may help approximate this behavior in some cases.
However, they are not the same as Library Shelves:
The key difference is the level of organization:
Genres and Collections = media-level grouping
Shelves = library-level grouping
Why Library Shelves Would Be Easier to Maintain
Another reason I’m interested in Library Shelves is that they would make curation much simpler, at least for my use case.
Collections are powerful, but they generally require manual curation. Each collection has to be created and maintained by hand.
Genres can also work, but they depend on metadata being accurate and consistent. That can mean editing metadata, correcting spelling, standardizing genre names, and making judgment calls about overlapping categories.
For example, Comedy can mean very different things depending on context:
Using genres for home screen organization can require cleanup and ongoing metadata maintenance to keep those distinctions clear.
Library Shelves would be simpler because the organization is based on the existing Jellyfin library structure. If the files are already stored in the right folders and the libraries are already built correctly, then the shelf organization naturally follows that structure.
For example:
So the curation model becomes folder/library-based instead of metadata-based or collection-based.
That would make it much easier for admins who already organize their media by folders and libraries.
Design Principles
Why This Would Be Useful
This would be especially useful for servers that intentionally use many separate libraries for organization.
For example, instead of one huge Movies library with many genres, an admin may prefer separate libraries for Action, Classic Movies, Documentaries, Anime, Home Videos, and so on.
A Library Shelf feature would allow those libraries to stay separate while still presenting them in clean, Netflix-style rows on the Moonfin home screen.
It would also reduce the need to use genres or collections as a workaround for library organization.
Revised Request
Please consider adding Named Library Shelves: admin-defined home screen rows that group existing Jellyfin libraries together.
This would complement the existing My Media, Collections, and Genre rows, while solving a different organization problem: grouping libraries themselves into meaningful, TV-friendly rows.
In short:
Genres group media by metadata.
Collections group media by curation.
Shelves would group libraries by admin-defined home screen organization.
All reactions