Important
⚠️ As always, export your database before upgrading. Safety first!
Hi everyone! Here is DVinyl v3.3.0, a big one. DVinyl now feels like a real app on your phone, can lend you an AI hand when you add items (bring your own key, completely optional), and picks up a long list of small comforts asked for by the community: copying an item into a new entry, counting distinct titles, choosing your filters, searching your own fields, and coming back exactly where you were in a long list.
A big thank you to @Siebe-Uy for the whole AI assist, and to @teaboyteaboy for the copy, distinct-titles and scroll-restore features. Thanks as well to @reneald, @nagarrido, @spencerjohnson272, @svergin, @lucbpz and @FoxXxHater for the ideas and reports behind this release!
📱 A Real App on Your Phone
DVinyl has been redesigned for phones, especially when installed on your home screen.
- Bottom tab bar: Home, Collection, Add, Lists and Account are always one tap away. It shrinks to its icons while you scroll down and comes back on the way up.
- Account page: your collections, administration, appearance, settings and logout gathered in grouped cards, opened from the Account tab or by tapping the collection title.
- Dashboard: a greeting, wishlist and list tiles, a sideways row of your latest additions, your shortcuts as chips and compact stats.
- Collection page: the collection name as a large title that switches collection, search, sort and views always in sight, the other filters folded away, and frameless cards.
- Item page laid out for a collector: a thumbnail header, an ownership chip, four main actions with a sheet for the rest, your copy before the edition details, every image of the item in a swipeable row, and the plugin content at the end.
- Add sheet: pick the module from a tile grid, then the method (barcode scan first, then search, photo search and manual entry). It opens on the module the page is about, or the last one you picked.
- Admin, instance and personalisation pages open on a menu of their sections, each section opening on its own with back returning to the menu.
- Smoother feel: sheets, dialogs, lightboxes and toasts now animate in and out, with touch feedback on rows and tab bar icons.
- Installed app polish: content stays clear of the notch and the home indicator, the status bar follows your theme, the app icon is fixed and maskable, and the portrait lock is gone.
The desktop layout keeps its navbar, and gets the module picker back in the add hub.
🤖 AI Assist (Bring Your Own Key)
An optional AI assist, built by @Siebe-Uy, helps you add items when the usual providers are not enough. It is off by default and changes nothing until an instance admin sets it up.
- Any OpenAI-compatible provider: OpenRouter, OpenAI, Anthropic, Google Gemini, or a local endpoint such as Ollama or LM Studio. OpenRouter also offers free models, so you can try it without paying anything.
- Photo search: on any add page, take or pick a photo of a cover, a spine or a box. The AI reads what it is and the normal search runs on that title in your module's own provider, so you still pick from real results.
- Barcode fallback: for movies and video games, when a scanned barcode is not recognized, the AI turns the digits into a better search instead of giving up.
- Import from text or photos: paste a list of what you own, or photograph a shelf, and get a table to review and correct before anything is saved. The rows then go through the usual import, with duplicate checks and enrichment from your module's provider.
- Plugin drafting: in the no-code plugin editor, describe a collection in one sentence ("old glass Coca-Cola bottles") and get the whole form pre-filled to review and edit.
The AI never saves anything on its own: every path ends with you reviewing the result. Configure it from Instance administration > AI assist, or through the AI_PROVIDER, AI_API_KEY, AI_BASE_URL and AI_MODEL environment variables. The key is stored encrypted and never sent back to the browser. Everything is explained in the AI Assist guide.
📋 Copy to a New Entry
Own the same film on Blu-ray and 4K, or a book in two editions? The item page now has a Copy to a new entry button, for every type including your own custom plugins. It opens the add form pre-filled from the item, minus what belongs to that one copy: the barcode, the ids that name a specific edition (the Discogs release, the ISBN) and the quantity. Tracklists come along with fresh ids, so your lists keep pointing at the right copy. The duplicate banner lights up straight away until you change the field that tells the two copies apart, usually the format.
Requested and built by @teaboyteaboy.
🔢 Distinct Titles Count
Next to the item count, the collection and the wishlist now show how many distinct works you own, for example "412 items · 337 unique titles". Editions of the same work fold together (title plus creator within each type), while a remake stays apart through its different director. The count follows your filters and the live search, and hides when it equals the item count.
Requested and built by @teaboyteaboy.
↩️ Back Where You Were
Coming back from an item through the in-app back link now returns you to the exact scroll position you left, like the browser's own back button. It works in the grid, table and shelf views, on the collection and the wishlist, and on every item type.
Requested and built by @teaboyteaboy.
🎛️ Choose Your Filters, Per Type
In the Customize panel of each type, you can now choose which filters the collection page shows once that type is selected. Hide the ones you never use (a messy genre list, for instance) and switch on the plugin's own status fields, such as the reading status of your books, the watch status of your movies or the play status of your games. Your own custom fields can be shown or hidden too.
Requested by @nagarrido.
🔎 Search Your Own Fields
The search box now also looks into the custom fields you added to a collection (screen ratio, audio tracks, shop, label...). For a field with a list of choices, it matches the label you read rather than the value stored behind it.
Requested by @svergin.
🗄️ A Better Looking Shelf
The shelf view has been redesigned: spines are tinted and shaped after the object they belong to (a record sleeve, a jewel case, a DVD case, a bound book, a box), items lean and pile up like on a real shelf, a hover shows a peek of the item, and phones get a map of the furniture with a sheet for each compartment. When you filter or search, the furniture now keeps its shape and simply dims what does not match, instead of rearranging itself under your eyes.
🔗 Share Links Get Their Own Page
Share links now live on a page of their own, with a card per link, a switch to turn it on or off, copy, share and QR code actions, and a sheet to name it and choose what it shares. The collection's share sheet shows what each link opens to, and the barcode label choice is always offered, with an explanation when it is not available.
📚 Hardcover: Books Linked by Their Stable Id
Book slugs on Hardcover change whenever a title gets corrected, which could break the refresh of a book. DVinyl now refreshes books through Hardcover's numeric id, which never changes. Books saved before this are found by their slug once more and get their id recorded on the way, and a renamed book has its link healed automatically.
Requested by @reneald.
🎵 Music: Any Discogs Format
The advanced filters of the music search now have a Format field that takes any Discogs format name, with suggestions for the ones the buttons do not cover: 8-Track Cartridge, Reel-To-Reel, Minidisc, Shellac, DAT, Flexi-disc and more. It replaces the button's format in the Discogs query, so you get exactly the 8-tracks you are looking for. All the advanced filters now stay filled after a search, and the Discogs format is shown on the item page.
Requested by @spencerjohnson272.
🎬 TMDB: Both Kinds of Credentials Work
TMDB's settings page offers two credentials, the short API Key and the long API Read Access Token (starting with eyJ). DVinyl now accepts either one in TMDB_API_KEY, so pasting the token no longer ends in a 401 error.
Reported by @FoxXxHater.
🛠️ Fixes, Security & Maintenance
- Item action buttons keep their labels on one line on desktop and wrap the row instead of squeezing it.
- Imports enriched through the AI or a pasted list are checked again for duplicates once the provider has filled them in, so a thin row cannot add a second copy of something you already own.
- Hardened the escaping of item titles on the item page, and an AI key now only ever goes to the endpoint it was saved for.
- Updated dependencies with security fixes (proxy-addr, engine.io).
- New automated tests covering the AI assist, the copy, the distinct-titles count, the filters, Hardcover refreshes and template escaping.
⚠️ Good to Know
- Restoring a whole-instance backup made before 3.3.0 also clears the AI assist settings, since that backup does not carry them. Just set the AI up again afterwards.
- While any
AI_*environment variable is set, the admin panel can only switch the AI assist on or off: the provider, model and key come from the environment. - Saving another AI provider or base URL without typing a key removes the saved key, so it never reaches the new endpoint.
Thank you so much for contributing to the app, whether with your ideas, bug reports, or pull requests. I really hope you like this new mobile layout. Please feel free to let me know what you think!
Thanks <3