Releases: Kyonew/DVinyl
Release list
v3.1.4 - Find, Shape, Export
Important
Two people sent code this cycle, four pull requests between them, and one of the two is new
around here. Thank you @Siebe-Uy, and welcome @Kianuss :D
🔍 Search Across Every Collection
The magnifying glass in the header searches all the collections you belong to at once,
not just the one you have open. Type two letters, get every match by title or artist, each
card telling you which collection it lives in. Click one and DVinyl switches to that
collection and opens the item, so finding something no longer starts with remembering where
you filed it.
- It only ever searches what's yours. A collection you're not a member of is not searched, not counted, and not hinted at.
- Each collection keeps its own rules. Modules you turned off there stay off here, and items you hide with the Visibility settings stay hidden. Wishlist entries and the seasons held inside a show stay out, exactly like every other shelf view.
thanks @Siebe-Uy for the help on this one.
🖼 Choose the Shape of Your Cards
Sleeves are square, posters are not, and until now the grid pretended otherwise. There's a new Card aspect ratio setting in Personalization: square, poster (2/3) or screen (16/9), and the whole grid follows it, collection, home and wishlist alike.
A cover that doesn't match the shape you picked is never cropped: it sits whole inside the
tile over a blurred copy of itself. And each module keeps its own proportions where they
belong, on the item page and in its forms, so a film's page is poster-shaped and an album's
is square, whatever the grid looks like.
Built by @Kianuss, their first contribution to DVinyl!
📄 Export a Collection as a Spreadsheet
Next to the JSON backup, a CSV export: one row per item, one column per field, ready to
open in Excel, Numbers or Sheets. A collection holding several modules simply carries more
columns, each named after the module it belongs to so a "Format" column from your films is
never confused with one from your records. Select values come out as the labels you read in
the interface, not as internal codes.
thanks @Siebe-Uy too :)
🛠 Fixes
-
Share links now say https when you're on https. DVinyl was reading the protocol from the request, which a reverse proxy in front of it can silently downgrade, so links and QR codes came out in
httpon a perfectly secure instance. It now trusts yourPROD=truesetting instead. reported by @jws5406. -
Some share links couldn't be deleted, and their QR code was a broken image. A share link gets a random code, and about one in seven of those happened to contain two letters DVinyl read as one of its own sections. If that section was turned off in the collection, the QR image and the delete button both hit a 404, permanently, for that link. Same cause, rarer draw: roughly one collection in eleven could not be deleted either. Paths are now read section by section instead of by chance. Reported by @jws5406 (thanks a lot, you're always quick to find new bugs!)
-
Barcode lookups stop giving up on a noisy product name. Sellers pad titles with things
like "Disney N 17 Blister Pack", and no catalogue matches that. A scan that finds nothing now retries on a shorter version of the name, which is enough to find the film. When even that fails, the product name it found is put in the search box for you to correct, instead of the bare digits you scanned. And the scanned barcode is no longer lost when you edit the search by hand, which it silently was. Reported by @ArtwoXYZ, with a repro so precise it was fixed the same day xD
Same as always: nearly every line started as one of your issues, and this time most of them
arrived with the code attached. Thank you @jws5406 and @ArtwoXYZ for the reports, @Siebe-Uy
for your PRs, and @Kianuss for a first one that turned into a real setting.
Love u all <3
v3.1.3 - Hotfix for 3.1.2
Warning
If you're on 3.1.2, update. Item pages are broken there, and this release is the fix.
Nothing else changed, and no data was affected.
🐛 What happened
A comment in the item page template contained a literal closing script tag. A browser ends a script block at the first one it reads, whether or not it means anything to the JavaScript around it, so the block was cut in half. Everything after it was printed on the page as raw code, and every button on an item page stopped working: delete, refresh, price estimate, move to wishlist, the lot.
The comment was there to warn about exactly that. It now describes the tag instead of
spelling it out, and says why.
Thanks to @jws5406 for reporting it within the hour, screenshot and all.
🙃 Second time in three releases
3.1.1 fixed the same family of bug from the other end: a line break inside a translated
string ending the script block it landed in. Same failure, different cause. That one came
from data, this one from a comment I wrote myself.
Sorry for the bad afternoon if you updated early.
Love u all <3
v3.1.2 - Share Your Shelf, Season by Season
v3.1.2 - Share Your Shelf, Season by Season
Important
This one had help. Two people sent code this cycle instead of just issues! Thank you @Siebe-Uy and @minchetas.
🔗 Public Share Links
Generate a read-only link, and a QR code, that lets anyone browse a collection without an
account. The use case @aarondixon described when opening the issue is exactly the one that
shipped: a QR code taped next to your shelf, so guests scan it and browse on their own phone,
and you never maintain an account for anybody.
- Several links at once, each independent. Disabling, regenerating or deleting one never
touches the others. - Scoped links. A link can show the whole collection, or only some types and formats,
"Vinyls only", "CDs and Vinyls but not Cassettes". The nav bar and the filters follow suit,
so a visitor is never offered a control that names something the link hides. - The QR code is generated by your own instance. The token never goes to a third-party
QR service. - Read-only, enforced at the route. A share visitor cannot add, edit, delete, refresh or
annotate anything, cannot reach the wishlist, the dashboard, the admin panel, settings or
backups, and cannot see another collection. - Two things a signed-in viewer sees are kept from a link, because a public link travels
further than a member ever does: where items are kept (the Location field disappears
from the item page, the cards and the filters, and its values are never even read), and
who is behind the collection ("Added by" and "Last modified" are not shown). - Items you already hide from viewers with the Visibility settings stay hidden from share
links too, including by direct URL.
Built by @Siebe-Uy, from @aarondixon's issue. Full guide in
docs/sharing.md.
📺 TV Shows, Season by Season
A show can now hold its seasons, each a full item of its own: its own cover, its own year,
its own episode list, its own comments. Asked for by @LordChabelo.
- When you add a show, a checklist says which seasons you own. Seasons already in your
collection are ticked and locked, so the list states what you have instead of inviting you
to add it twice. - Ticking a season you're missing attaches it to the show you already have. No duplicate
cover, no second entry for the same series. - Tick nothing and the show is added as a single item, which is what every existing item
has always been. That's not an option to find, it's the default. - On the shelf, a show holding several seasons shows itself and says "Seasons 1 to 4". A show
holding exactly one shows that season, its artwork, its title, because that box is what
you actually own. - Episodes, per season: seen or not, a rating, and your own notes. A metadata refresh
merges instead of replacing, so correcting an air date never wipes what you wrote.
Note
This is not retroactive. A series already in your collection keeps being one item until you
convert it by hand: search for the show, tick the seasons you own, save. Your existing
item becomes the show's entry and the seasons attach to it and the confirmation page now
tells you that's about to happen before you save.
🏷 A Second Badge, In the Free Corner
The cover badge told you vinyl but not whether it was an LP, a 12" or a 7", and said nothing
about the sleeve. You can now put any field of any module in the free corner of the cover,
chosen per module and per collection in the Customize panel, and pick which corner it sits in
from a picker that shows you the result. Sleeve condition reads "VG+", not "Very Good Plus
(VG+)", a corner is narrow. Thanks to @jws5406 for both halves of this (#87 and #88).
Along the way the badge overlay stopped existing in four slightly different copies that
disagreed on where it sat, which is why there was no free corner to put anything in before.
🧭 Getting Back Where You Were
- Editing an item returns you to it, and from there the back arrow goes to the page you
actually came from, page 35 of 70, with your filters and your sort still on it. Deleting
goes to the same place. Thanks to @jws5406! - Jump to any page. Long collections only offered next/prev and a couple of numbered
buttons, so a page far from either end was unreachable. The pagination now has a number
input where the...gap was: type a page, press Enter. Built by @Siebe-Uy.
✨ Smaller Things That Matter
- Modified by. Item pages now show who last changed an item by hand, next to who added it.
A provider filling in a cover is nobody's edit, so it has a date of its own, shown as a
caption under the Refresh button, and never erases the name of the last person who really
touched the item. This closes the half of @chibashr's request that 3.1.1 left open. - Titles sort the way a shelf does. "The Wall" files under W, "Ámbar" sits next to
"Amber", and case no longer splits a list in two. Thanks to @LordChabelo! - CSV imports stop giving up silently. When a provider said "too many requests", the row
was counted as a miss and the item came in bare, and no refresh tool could rescue it,
because it was never linked to the provider at all. The import now waits the provider out
and retries, slows the whole run down after a rate limit instead of walking into the same
wall, and tells you at the end how many items came in without data. Thanks to @code-sterling
for a report that pinned the cause exactly! - Translations. A pass over Spanish and Italian where "Show" (the verb) had been
translated as "a show, a performance", plus a nav link that was hardcoded in French and
showed up that way in every language. Thanks to @minchetas, who sent the fix!
🛠 Fixes
- Fixed external IDs being rewritten as text on every save. The edit form went through the
base model, sotmdb_idbecame"1396"instead of1396. Nothing looked broken, the item
still displayed, but every lookup comparing the ID as a number missed it, starting with
duplicate detection, so the same record could be added twice. Every module was affected. The
write path is fixed and a migration repairs what it left behind on your instance at startup. - Fixed a show and its seasons being separated by a collection restore, a move to the wishlist
or the duplicate warning. - Fixed the QR code of a share link still being served after the link was switched off.
- Fixed the Personalization link in the nav showing in French whatever your language.
- Fixed the Spanish cassette label and a handful of labels left lowercase.
Same as always: nearly every line came from one of your issues. Thank you @aarondixon,
@jws5406, @LordChabelo, @chibashr and @code-sterling for the reports, and a special one this
time to @Siebe-Uy and @minchetas, who turned up with working code.
Love u all <3
v3.1.1 - Polish, Fixes & Fewer Frozen Lists
Important
🌍 Pages Were Breaking In German, Spanish & Italian
A line break inside a translated string could end the script block it landed in, taking every button on the page down with it. On the wishlist, "I received it!" simply did nothing. Every translation that reaches JavaScript is now serialised properly, so a line break in a future translation can never break a page again. Thanks to @robschw123 for a report that was practically a patch!
The same fix quietly repaired two confirmations that were skipping their prompt entirely, in all languages: blocking an IP, and deleting a collection whose name contained an apostrophe.
🎨 The Theme Colour Now Actually Works
Hundreds of hover, focus and toggle states referenced the theme colour without ever doing anything, because the colour was never declared to Tailwind. Focus rings, accent borders and switch states are back everywhere at once, and keyboard navigation is visible again. Thanks to @jws5406 for spotting it on the merge-duplicates toggle!
📦 Import & Metadata
- CSV enrichment finds your rows now. Covers and metadata were looked up with the title and the creator glued together, which matches almost nothing on TMDB. The lookup now uses the title alone and picks the result matching your row's year instead of blindly taking the first hit. Thanks to @penpalstu-sys!
- Movies vs TV shows. A first match can now overwrite a schema default, so an imported series is no longer stuck as a movie.
- Barcode scanning for movies and games. A scanned barcode came back as a shop listing ("Nightlife [blu-ray] By Verhoeven, Simon | Dvd"), which no movie database can match, and when the lookup failed the app silently searched for the digits and showed you nothing. Titles are cleaned up properly now, and an unrecognised barcode says so instead of pretending it found nothing. Thanks to @pintapass!
- Bulk refresh stops spinning. Items that can never be refreshed (no external ID, missing API key) are skipped instead of being retried three times with a wait between each.
✨ Smaller Things That Matter
- Any console, ever. The platform field on games is no longer a short fixed list you couldn't add to. Type what you own; DVinyl suggests the platforms IGDB knows for that game and the ones already in your collection. Thanks to @LordChabelo!
- Sort formats alphabetically. A per-module option in the Customize panel, applied to both the dropdown and the collection filter bar. Thanks to @jws5406!
- Items per page is remembered, like the sort already was. Thanks to @LordChabelo!
- Added by. Item pages now show who added the item, with their picture. Thanks to @chibashr!
- SSO-only instances. With
OIDC_DISABLE_LOCAL_LOGIN=true, the password form is gone and /login goes straight to your provider, so nobody wastes time on credentials the instance will never accept. It is ignored unless OIDC is properly configured, so a typo can't lock you out. Thanks to @chibashr! - Add from the wishlist. The wishlist gets the same add button as the collection, opening the module picker.
- Long text fields breathe. Notes, synopsis and other long fields now take a full-width row of their own, and are twice as tall.
🛠 Fixes
- Fixed the "Search for an album" link on an empty wishlist leading to a 404 on instances without the music module. Thanks to @jws5406!
- Fixed checkbox fields printing their name twice on cards ("Original box: Original box"). Thanks to @jws5406!
- Fixed a custom plugin's Description field being shown a second time as a "Summary" block. Thanks to @jws5406!
- Fixed the plugin builder silently dropping formats past the 12th. The limits are now far higher, and going over tells you instead of discarding your work. Thanks to @jws5406!
- Fixed hand-added records showing a redundant "Vinyl" line under a badge already saying vinyl. Thanks to @jws5406!
- Fixed a TV show's season count being written in French whatever your language.
Same as last time: nearly every line came from one of your issues. Thank you @jws5406, @robschw123, @chibashr, @LordChabelo, @penpalstu-sys and @pintapass, and everyone who takes the time to write things up properly.
Love u all <3
v3.1.0 - Import Everything, Custom Fields & Plugin Polish
Important
📥 Import From (Almost) Anywhere
- Libib CSV Import: Import your Libib exports directly, with a dedicated importer per media type (music, books, movies/TV, games). Thanks to @reneald for the request!
- Universal CSV Import: A new import screen lets you upload any CSV into any module and map the columns to the fields by hand, no template required. (hello @penpalstu-sys)
Optional Cover & Metadata Enrichment: During an import you can let DVinyl look each row up on the usual providers (Discogs, TMDB, IGDB, Hardcover) to fetch covers and missing metadata, or keep your rows exactly as they are. The format read from your file is passed to the provider, so a CD import no longer comes back full of vinyl pressings.
🏷️ Your Fields, Your Cards
- User-Defined Fields: Add your own custom fields to any plugin, per collection, including the built-in ones. Text, number, checkbox, dropdown or date, and they behave like real fields: they show on the item page, they can be filtered on, and they can be sorted on.
- Choose What Cards Show: Pick which fields appear on your collection and wishlist cards, per plugin and per collection. Thanks to @jws5406!
- Optional Dropdowns Stay Empty: A non-required dropdown now starts on a blank entry instead of silently selecting its first option, so a value only ends up in your data if you actually chose it.
🧩 Plugin Builder Polish
An entire round of improvements to custom plugins, all from @jws5406's excellent feature list:
- Custom Default Image: Replace the default styled "D" placeholder with your own image.
- Empty or Preset Format: The format picker now starts empty on custom plugins, so you can't forget to change it, and you can define a preselected format per plugin if you prefer.
- Live Color Preview: The color picker in the plugin editor now shows the actual selected color, which makes building a coherent palette a lot easier.
- Main Cover, Pre-Checked: "Replace main cover" is now enabled by default on manual and custom items, since that's what you want nearly every time.
- Neutral Wording: Plugins that don't ship their own strings no longer borrow the vinyl vocabulary ("cover", "disc"...), and genre/location blocks no longer show up on plugins that never declared them.
- Cleaner Filters: The filter row is now scoped to the selected type and drops the filters with nothing behind them, so no more empty "artists" dropdown on your coffee mug collection.
👥 Collections For Your Users
- Self-Service Collections: A new instance-wide toggle lets ordinary members create their own collection, with a per-user quota you control. Invite (or SSO-enroll) a friend, send them the link, and they can start their own library without you touching the admin panel. Thanks to @jhuesser for the idea!
✨ Smaller Things That Matter
- Fullscreen Cover: Click the cover on an item page to open it fullscreen. Thanks to @jws5406!
- Back to Wishlist: Move an item from your collection back to the wishlist, for the ones that turned out broken, sold or wrongly added.
- Optional Duplicate Merging: A per-collection toggle to stop merging duplicate adds into one entry with a quantity, for collections where two similar items really are two items. Thanks to @jws5406!
🛠 Fixes
- Fixed the setup being blocked when the browser reported a regional language tag (
fr-CA,en-GB...), which is now resolved to the closest supported language. - Fixed a 2.6.0 restore leaving every account but the seeding admin without any collection membership. The legacy merge is now detected from the data itself instead of from the user documents, which a restore rewrites.
- Fixed the membership backfill applying to modern accounts that an admin had deliberately left out of every collection.
- Fixed the creator field showing "Unknown" on wishlist cards. Thanks to @jws5406 for the report!
- Fixed date fields showing the previous day on cards for instances running east of Greenwich.
- Fixed
.env.examplebreaking the MongoDB connection under Podman quadlets, which read the trailing comment as part of the value. Thanks @reneald for the fix!
Almost every line of this release came from an issue one of you opened. A huge thank you to @jws5406, @reneald, @jhuesser and @penpalstu-sys for the suggestions, the reports and the patience, and to everyone who takes the time to open an issue.
Love u all <3
v3.0.1 - SSO Auto-Provisioning & Admin Safeguards
Note
Small patch release on top of 3.0.0. No migration surprises, purely additive.
🔐 OIDC Auto-Provisioning
- Automatic account creation from your IdP: with
OIDC_ALLOW_SIGNUP=true, a successful SSO login for an unknown identity now provisions a DVinyl account on the fly (SSO-only, no local password) instead of being rejected. - Group-based access control:
OIDC_ALLOWED_GROUPrestricts signup and every subsequent login to members of an IdP group. Membership is re-checked on every login, so removing someone from the group in your IdP revokes their DVinyl access immediately. - Group-based admin mapping:
OIDC_ADMIN_GROUPautomatically grants instance admin rights to members of that group. - Safe account linking: auto-provisioning only links to an existing local account sharing the same email when the IdP has verified that email, to prevent account takeover.
🛡️ Instance Admin Safeguards
- Instance admins are now peers: none of them can reset another instance admin's password or delete another instance admin's account, only their own.
🛠 Fixes
- Fixed disabling the music module, which was silently failing.
- Fixed a couple of admin error messages (deleting/resetting another admin) that showed a raw translation key instead of the localized text.
- Footer/login/setup wording updated from "for music" to "for the collection", consistent with multi-collection support.
v3.0.0 - The Great Rebuild: Plugins, Collections & More
Important
This is a major release. The entire app was rebuilt from the ground up and your data will be automatically migrated on first launch. I'm a solo maintainer testing this alone, so please export a backup before updating. If something doesn't work right away on your setup, open an issue and I'll fix it fast. 🙏
This is the biggest release DVinyl has ever had. The app has been fully rewritten in TypeScript on a brand-new plugin architecture, opening the door to multi-collection support, single sign-on, custom item types, and a whole family of new and improved plugins.
👉 Want to see the new multi-collection experience before updating? Take a look at the live demo.
🧩 A Brand-New Foundation
- Full TypeScript Rewrite: The entire codebase has been migrated to TypeScript with modernized runtime dependencies for better stability, safety, and maintainability.
- Plugin Architecture: DVinyl is now built as a lean core + independent plugins. Every media type (vinyl, music, movies, books, games...) is a self-contained plugin, making the app far easier to extend and customize.
📚 Multi-Collection Support
- Multiple Collections: Create and manage several independent collections, each with its own settings and enabled plugins.
- Roles & Permissions (RBAC): Fine-grained per-collection access control so you can decide who sees and edits what.
- Instance Admin Panel: A new instance-level admin area to manage collections, users, and global settings from one place.
🔐 Authentication
- OIDC / SSO Login: Optional Single Sign-On with automatic account linking, compatible with Authentik, Keycloak, Authelia, and other identity providers. Keep just one login for all your self-hosted services.
Big thanks to @jhuesser for suggesting OIDC integration!
🔌 New & Improved Plugins
- LEGO Plugin: Track your LEGO sets with data pulled from the Rebrickable API. Thanks to @Gandalf-the-Blue for the idea!
- Music, Per-Track Details: Add per-track ratings, tags, notes, BPM and key, plus lyrics (via lyrics.ovh or entered manually). Suggested by @raorm88.
- Games, Favorite Console Widget: A new widget highlighting your favorite/most-owned console, along with a platform filter for the games collection. Thanks to @LordChabelo for the suggestion!
- New "Digital" Format: Added a
digitalformat for items you own digitally while hunting for the physical copy. Also suggested by @LordChabelo. - Synopsis on Detail Pages: Books, movies/TV shows and video games now show their summary right on the item detail page (book overview via Hardcover, movie overview via TMDB, game summary via IGDB).
🎨 Build Your Own
- Plugin Builder (No-Code): A new plugin editor hub lets you create your own manual-entry item types, no coding required.
- Per-Collection Customization: Customize plugin icons and badge colors on a per-collection basis.
👤 Profile & Personalization
- Gravatar Import: Import your avatar directly from Gravatar.
- Avatar Removal: Easily remove your avatar from settings.
🛠 Other Improvements
- Hardened Migration: Extensive work to make the 2.6.0 → 3.0.0 migration safe and idempotent, including handling of malformed theme presets, native-driver backfills, and duplicate-warning edge cases.
- Safer Deployment: Updated Docker Compose configuration, TypeScript type-safety improvements across route handlers, and various build and documentation updates.
- Makefile Shortcuts: A new Makefile wraps the common commands (
make setup,make dev,make docker-up,make docker-update,make docker-logs...) so you can spin up, update, and manage your instance without memorizing long commands. Runmake helpto see them all. - More Debug Logging: Added extra logging across authentication, database, and admin routes to make troubleshooting and bug reports easier.
📖 Documentation & Wiki
- Expanded Docs: More thorough documentation covering installation, Docker deployment, API keys, and plugin development.
- New Wiki: A brand-new Wiki full of friendly, no-jargon tutorials to help you get started, including getting around DVinyl, importing your collection, using it on your phone, customizing your instance, users & sharing, backups & restore, and building your own no-code plugin.
I hope you like this version. A big thank you to @jhuesser, @Gandalf-the-Blue, @raorm88 and @LordChabelo for the great suggestions in this release, and a big thank you to everyone who opens issues to suggest improvements or report bugs.
Love u all <3
v2.6.0 - Manual Music Additions, Smart Duplicate Management & Enhanced Search
v2.6.0 - Manual Music Additions, Smart Duplicate Management & Enhanced Search
Important
Hi everyone, it's been a while! I've been really busy lately, but now I have more time to devote to DVinyl
Here's the last “major” update before 3.0 (I hope!). Here are the new features:
🎵 Music Manual Addition
Big thanks to @refactomiguel & @minchetas for this massive contribution!
- Discogs-Free Entry: Full manual entry support for music items without needing a Discogs search.
- Tracklist Editor: Added a manual tracklist editor featuring strict validation for track duration formatting.
- Total Duration Badge: Automatic calculation and display of the total album runtime as a clean visual badge.
- Smart Fields & Suggestions: Mandatory Title/Artist fields, support for Label and Catalog reference numbers, and automatic genre suggestions.
🧠 Smart Duplicate & Variant Management
- Duplicate Warning: Smart alerts if an item being added already exists anywhere in your collection, across all categories.
- Auto-Increment Quantity: Intelligent logic to automatically increment the quantity counter for an existing item instead of creating a duplicate.
- Item Variants: Display all other editions or variants of the same title/author at the bottom of detail pages (supports Books, Games, DVDs, and Music).
🔍 Advanced Search Improvements
- Track Name Search: You can now search for music items directly by track or song name within the tracklist.
- Database ID Search: Added the ability to search for specific entries using their unique database identifier (
_id). - Auto-Trim Input: Improved tolerance for accidental spaces with automatic text trimming on search inputs.
🛡️ Translations & Security
- Discogs Value Translation: Localization support added for Discogs sales and value estimations.
- Secure JS Injections: Secured translation injections within JavaScript to eliminate layout bugs and reinforce overall system security.
I hope you like this version. A big thank you to @refactomiguel and @minchetas who made the whole manual add system.
Love u all <3
v2.5.2 - Enhanced Customization, Music Style Filtering, and Music-Sammler Import
v2.5.2 - Enhanced Customization, Music Style Filtering, and Music-Sammler Import
🎵 Vinyl Management & Customization
- Sleeve Condition: Added a dedicated sleeve condition field to vinyl management, accompanied by an enhanced format display for better collection tracking. (hi @jws5406)
- Music Style Filtering: Introduced advanced filtering options for music styles, featuring an interactive search, multi-select capabilities, and easily clearable inputs. (just for you @derekdino123)
⚙️ System, Deployment & Admin Tools
- Setup View Language Selector: Added an interactive language selector directly into the setup view, which now persists user registration language preferences seamlessly.
- Musik-Sammler Import: Integrated a new Musik-Sammler CSV import functionality into the admin panel to ease transition from other platforms. (hope you'll like it @Wuff-Bellmann)
- Discogs Import Fix: Fixed an issue during Discogs mass imports to ensure variant colors are properly populated from the format text. (thanks for the issue @pelleplutt86)
🛠 Stability & Security Improvements
- Discogs API Logging: Enhanced Discogs API error logging and refined error handling redirects within album routes for a more resilient integration.
- Search Query Sanitization: Fixed and hardened admin and album routes by properly escaping special regex characters to sanitize incoming search queries.
I hope you like this version. A big thank you to everyone who opens issues to suggest improvements or report bugs.
Love u all <3
v2.5.1 - Persistent sorting, Unraid template & Better search
v2.5.1 - Persistent sorting, Unraid template & Better search
🔍 Advanced Search & Collection Enhancements
-
Persistent Sorting: Your chosen sorting preference in the collection is now saved, so you don't have to re-select it every time you open your library. (thank you @y-nicolas329 for the idea!)
-
Barcode Search: Added the ability to search your collection directly using barcodes. (ty @oliverjunker)
-
Localized TMDB Search: TMDB searches now dynamically adapt to your selected language instead of being hardcoded to French.
Huge thanks to @tonymarsh for this contribution!
⚙️ System & Deployment
- Unraid Template: DVinyl is now officially easier to deploy on Unraid thanks to the addition of a dedicated template.
I hope you like this version. A big thank you to @tonymarsh for their collaboration, and a big thank you to everyone who opens issues to suggest improvements or report bugs.
Love u all <3