github Kyonew/DVinyl v4.0.0
v4.0.0 - One File, Your Look, and a Collection That Talks Back

47 minutes ago

Important

⚠️ As always, export your database before upgrading (Instance admin page, Backup → Export). Safety first!

🚚 4.0 moves DVinyl from MongoDB to SQLite. Nothing breaks on update: an install from 3.x keeps running on its MongoDB until you mount a data folder, then moves itself over. Read Moving to SQLite when it suits you.

Hi everyone! Here is DVinyl v4.0.0, the biggest release so far. Your whole collection now lives in one SQLite file, with no database container to run. Each collection can pick its own look, from the navigation to the colours, the home page and the background. Members can send each other requests (a loan, a gift, anything you make up) with notifications on their phone. And a very long list of things you asked for is in: purchase prices, record formats and runouts, film casts, Open Library as a full source, consoles beside games, boxsets holding their contents, invite links, automatic backups and much more.

A huge thank you to @Siebe-Uy for the eight trading card game plugins, to @ArtwoXYZ for the local image copies (#136) and the work on custom field overlaps (#151), to @alexeyseo for the whole Russian translation (#220, #221, #222, #230), and to @teaboyteaboy for the back-link fix (#201). Thanks as well to @vic1707 and @Patricol for pushing the move off MongoDB, and to @jcompiet, @Mellow1238, @luqqaa, @mikeycp, @HalbridiousBall, @abr8838-crypto, @KevinCorcor, @lebeanshoe, @reneald, @driph, @theothermillion and everyone in the discussions for the ideas, reports and testing behind this release!


🗄️ SQLite: Your Collection in One File (#199)

DVinyl no longer needs a MongoDB server. Everything (items, accounts, collections, lists, shelves, settings) is kept in a single data/dvinyl.sqlite file.

  • Simpler to run: one container, no database to keep up, no AVX requirement, and noticeably less memory.
  • Simpler to back up: one folder holds the whole collection.
  • Built for small hosts: exports are now streamed item by item, so even a 20,000-item instance exports within a small memory budget.
  • Safe by design: a container whose data folder is not mounted refuses to start (instead of losing everything at the next update), and a second DVinyl pointed at the same folder is refused too.

Coming from 3.x

You do not have to change your configuration on update day:

  • As long as no data folder is mounted, DVinyl keeps running on your MongoDB exactly as before, with a notice on the Instance admin page.
  • The first time it starts with a data folder mounted, it copies everything into SQLite by itself, ids included, so links, lists and share links keep working. MongoDB is only read; a small marker is left on it so the same data is never used or copied twice by mistake.
  • Then retire MongoDB whenever you like.

Step-by-step guides for Docker Compose, Unraid, docker run and installs from source are in Moving to SQLite, including what each log line means.

Note

One more reason to move: on recent Linux kernels (6.19 and later), the mongo:8 images refuse to start, and mongo:latest can crash under load. SQLite has no such issue.


🎨 Make Each Collection Your Own

The whole look of a collection is now gathered in one studio (Personalisation), with the live app in a preview frame (any page, desktop, tablet or phone, light or dark) and every choice beside it.

  • Navigation: a top bar (full width or floating, optionally sticky), a left or right sidebar (expanded or as an icon rail), or a bottom dock.
  • Ready-made styles and layouts: classic, sidebar, dock, minimal, dense, editorial, previewed and applied in one click.
  • Colours: a palette worked out from a single colour (neutral, tinted or vivid), adjustable colour by colour with readability warnings, and up to twelve named palettes per collection.
  • Ambience: the collection's own logo (navigation and favicon) and a page background (plain, gradient, pattern, or your own picture with blur and veil).
  • Details: density, corners, interface size, fonts, card shape.
  • Look packs: export a collection's layout, colours, cards and home page, and apply them to another one.
  • Home page as a widget grid: arrange the dashboard in place, drag widgets by their grip or with the arrow keys, four sizes, per-widget options, phone-only or desktop-only widgets.

The studio works on phones too, in a bottom sheet you drag between three heights.


📨 Requests Between Members, With Notifications

Members of a collection can now send each other requests about any item.

  • Types the admin makes up: each with its own questions, steps and who holds the item meanwhile. Borrowing and gifts come as templates you can change like any other.
  • An inbox with received and sent requests, due dates and reminders once a due date passes.
  • Push notifications on your devices, as an installed app (PWA): turned on per device, with the events you choose, in your own language, using the instance's own keys (no third-party service to set up).
  • Other notifications: a sign-in from a new browser or country, a locked account, a new wish in your collection, and (once an admin opts in) a new DVinyl release.

💰 Purchase Price (#190)

Every item of every type can now record what you paid for it, in the currency you entered it in. It is kept out of share links and copies, and set against the estimate on the item page and for the whole collection when both are in the same currency.

Requested by @lebeanshoe.


🎵 Records: Formats, Pressings and Runouts (#215, #216, #224)

  • Size, speed, release type and disc count are now fields of their own, filled from Discogs (and from what your older records already say), and offered as filters from the start.
  • Saved views: save a combination of filters ("7-inch singles", "45 RPM") and get back to it in one click.
  • Pressing details: pressing plant, mastering studio and engineer, rights society and cutting method (DMM, lacquer), filled from Discogs, searchable and filterable, plus pressing notes kept apart from your own notes.
  • Runouts, side by side: each side's inscription, matrix, cutter initials, plant mark and stamper, in a table you can edit.
  • Discogs import brings your own data: the custom fields of your Discogs collection become DVinyl fields, created automatically, along with your rating and the date added. Nothing you filled in is replaced, and nothing you emptied comes back.
  • Label and country are now filters too.

Requested by @jcompiet and @HalbridiousBall.


💿 Several Formats per Edition (#207)

One edition can now hold several formats, such as a 4K UHD with its Blu-ray or a vinyl with its CD. It is shown on the card and the item page, found under each format by the filter, counted in each, and filled from Discogs.


🎬 Films: Cast, Original Title and Metadata Language (#206, #207)

  • Cast: kept from TMDB, searchable ("every film with Morgan Freeman"), and shown on the item page as portraits with the part each actor plays.
  • Original title: kept beside the localized one, and searchable too.
  • Metadata language per collection: fetch film information in Polish while using the interface in English, for example.

Requested by @luqqaa.


📚 Books: Open Library as a Full Source (#198)

Open Library is now a search source of its own, refreshable and linked from the books it fills in. And when one source does not know an exact code such as an ISBN, DVinyl now asks the plugin's other sources, with a notice saying so.

Reported by @KevinCorcor.


🎮 Consoles and Accessories (#195)

Games can now sit beside the consoles and accessories you own, with their manufacturer and serial number (handy for insurance). Consoles are found model by model on IGDB, and fields can now show only for some values of another one, so a console does not show game-only fields.

Requested by @mikeycp.


🃏 Eight Trading Card Game Plugins (#134)

Built by @Siebe-Uy: Pokémon TCG, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Lorcana, Star Wars: Unlimited, Digimon and Flesh and Blood, each with its own card source, rarities in the results, price estimates, a fuzzy search that forgives typos, and an AI Scan card button (with the optional AI assist) that identifies a photographed card. Alternate printings and conditions are kept apart.


📦 Items Inside Other Items

Keep a film inside its boxset, a season under its show and in a box at the same time: the box shows as one card on the shelf and lists what it holds, the item says where it is kept, a search still finds it, and deleting the box puts everything back on the shelf.

From @ArtwoXYZ's discussion on physical items and boxsets.


✍️ Your Edits Stay Yours (#210)

  • The summary is editable for every type that has one.
  • Whatever you rewrite by hand is kept across metadata refreshes, single or bulk, and the edit form lets you hand a field back to its source when you change your mind.
  • Items typed in by hand now say clearly why they cannot be refreshed, and how to link them.

Requested by @jcompiet.


🔤 Sorting That Knows Its Articles (#181, #229)

  • Each collection chooses the articles ignored when sorting (English ones by default, elided ones like "l'" included).
  • Sort by artist, author or director skips them too, so "The Beatles" files under B, case and accents do not count, and one artist's albums follow by title.

Requested by @reneald and @Mellow1238. Choosing which artists file under their last name may come later.


📋 Faster Editing

  • Edit a field on a selection: set one field to the same value on every selected item, with tags added, removed or replaced.
  • Save and next: go straight on to the edit form of the next item in the list you came from, across pages and types.
  • Default values for the fields you create, so a new item's form starts on them.
  • Table columns per type (#202): each field in a column of its own, no more location shown twice.
  • Choose where each field shows on the item page: shown, folded into "More details", or hidden.
  • Any word field can be a filter, over the values your collection actually holds.

Requested by @abr8838-crypto and @teaboyteaboy.


🧩 Custom Fields and Built-in Fields (#151)

When a collection field you created duplicates a built-in one (your own "Size" next to the new record size, for instance), the admin page now offers to move its values into the built-in field, never overwriting a different value, or to keep both on purpose. It also says how many items hold a value before a field is removed. The new repeating rows field type is available to custom fields and no-code plugins too.

Part 1 by @ArtwoXYZ (#152), part 2 based on his design.


🖼️ Keep a Copy of Every Image (#136)

Optionally, DVinyl can download the images that are only links (from a provider or a URL you pasted) so they never disappear and travel in your ZIP backups. It is an instance setting, with a per-collection override, a progress view, a minimum free disk space, and a list of addresses that no longer answer so you can try them again. Downloads are guarded so they can never reach your own network. Images you upload from the browser are now stored as WebP.

Designed with @ArtwoXYZ.


💚 Wishes You Can See (#219)

When you search or scan a record, results now show who among the members of your collections wishes for it: the very release when the wish names one, or the same title when the wish was typed in by hand.

Requested by @Mellow1238.


🗄️ Shelves (#211)

  • Removing a shelf or a piece of furniture can now take its items off it too.
  • Places your items still name but no furniture holds are listed under the reserve, each with a way to forget it.
  • A Manage locations link beside the location field opens the furniture editor directly.

Requested by @jcompiet.


👥 Accounts and Members

  • Invite links (#225): a collection admin creates a single-use link that expires (1, 7 or 30 days) with a chosen role. The person picks their own username and password and lands straight in the collection, or joins with the account they already have.
  • SETUP_TOKEN (#225): protects the first-run setup page (and the restore of a backup on an empty instance) so nobody else can claim a fresh instance first.
  • Main collection can move (#213): hand the instance's main collection role to another collection, so the original one can be deleted. It is now called the main collection, so it is no longer mistaken for the collection you open on.
  • Usernames ignore case when you sign in, while staying distinct.
  • New accounts start in the language of whoever created them.

Requested by @Mellow1238, @jcompiet and @mikeycp.


💾 Automatic Backups

Whole-instance backups can now be written on a schedule (daily or weekly, ZIP or JSON) to a folder chosen on the Instance admin page, keeping the latest ones, with a manual run and downloads. BACKUP_DIR sets and locks the folder. By default they go into the data folder, so they are part of what you already mount.

Requested by @driph.


🌍 Languages (#214)

  • Russian joins the interface languages, translated by @alexeyseo.
  • A browser asking only for languages DVinyl does not have now gets English instead of French.
  • Share links and the sign-in page have a language picker.
  • Money and decades are written the way each language writes them.

Reported by @jcompiet.


🤖 AI Assist Is Steadier (#223)

  • An import no longer gets stuck on "Import started", and a second one cannot start while the first is still running (no more duplicates).
  • When the AI answers with nothing usable (empty, or a blank template), DVinyl asks once more by itself, then says clearly that nothing was found instead of showing an empty row.
  • A reply cut by a reverse proxy is now explained as such.
  • The title column of the review table is wide enough to read.

Reported by @abr8838-crypto.


🛠️ Fixes, Security & Maintenance

  • The back link no longer loops between an item and its Copy or Edit page (#200, fixed by @teaboyteaboy in #201).
  • Node 24 in the Docker image, run as a single process (about 60 MB less per container).
  • A Proxmox LXC guide for installs from source, with a systemd service (thanks @theothermillion).
  • Hardened escaping across every page script, share links kept to their scope, passwords hashed before they are ever stored, backups checked before a restore wipes anything, and push notifications restricted to public addresses.
  • Updated dependencies: no known vulnerability in the production dependencies.
  • About two hundred new black-box tests covering the whole app, run against both SQLite and MongoDB.

⚠️ Good to Know

  • Plugin authors: the plugin contract changed with the move off MongoDB. Plugins now declare their fields with storedFields and query through the core's items store instead of Mongoose. The built-in plugins and no-code plugins are already converted. See the plugin development guide.
  • Installing from source: npm install always compiles the SQLite module, so build tools (make, g++, Python) are needed. Do not use npm install --omit=dev.
  • Going back to 3.x after the move returns to your MongoDB as it was on the day of the move, without what you changed in 4.0. See Rolling back.
  • Staying on MongoDB on purpose is possible with DB_DRIVER=mongodb, supported throughout 4.x.
  • Third-party installers (ZimaOS store, RepoCloud...): the template needs a volume for /app/data; MongoDB is only needed to upgrade from 3.x.

Thank you so much for contributing to the app, whether with your ideas, bug reports, translations or pull requests. This one took a while, and a lot of it comes straight from your requests. Please let me know what you think, and tell me if anything looks off after the move to SQLite!
Thanks <3

Don't miss a new DVinyl release

NewReleases is sending notifications on new releases.