Changelog

What’s new in FileDeck — the features, improvements and fixes we ship, newest first.

Releases go out as soon as they’re ready — sometimes several in a day, sometimes a quiet week. Every entry below shipped to production.

v2.96.0

The deactivation form asks a better question

When you deactivate a plugin, WordPress asks why. FileDeck's version of that form recorded the most common answer — “Expected something else” — as a bare count, with nowhere to say what you were expecting. That is the answer we would most like to act on, and it was arriving with nothing attached.

Fixes & improvements

  • “Expected something else” now offers an optional box for what you were hoping it would do, alongside a link to tell us directly.
  • “Great, but I need a specific feature” asks which feature, and “Didn't work as expected” asks what it did instead.
  • All three are optional, and none of them replaces an input the form already had — choosing “Found a better plugin” still asks which one, as before.
v2.95.0

A year filter, reference numbers, and one library with a section per category

Three things libraries were being bent into shape to do — filing by year with a category per year, carrying part numbers in titles, and stacking one library per category down a page — now have a control of their own.

Filter a library by year

Minutes, newsletters, accounts, annual reports: a lot of libraries are filed by year. Switch on Show a "year" filter under Documents → Settings → Features (or show_year_filter="1" on a library, or the Year filter switch on the Elementor widget) and a dropdown lists the years the library's documents span, newest first — read from each document's date, so there is no "2026" category to create every January. It only appears once the library spans more than one year, it works with every other filter, and a visitor's pick lives in the address bar like the rest.

To pin a library to one year with no control at all, year="2025" on the shortcode gives you "the 2025 minutes" as a block of its own.

Reference numbers

Every document has a new Reference number field, on its edit screen under the file: a part number, a document code, a form number, an exam paper code. It is searchable in the library and in content search, with partial matches (0208 finds DOC-0208), and it is available as a sortable Reference column in the table and folders layouts, including libraries large enough to run in server mode. The Pro CSV import reads a reference column and the export writes one.

One library, a section per category

group_by="category" renders a library as titled sections, one per category with its document count, in the same order the folders layout uses (Folder order first, then alphabetical, uncategorised last under "Other"). One search box and one set of filters cover every section; a section with nothing left after a search hides until something matches again. It works with the table, grid and gallery layouts, on the shortcode, on the Elementor widget as Group by category, and as a site-wide default under Documents → Settings → Display → Group by. A page that stacked a library per category for the sake of headings can be one library again.

Fixes & improvements

  • The date-added filter now filters correctly in every library; it could previously let older documents through.
  • Grid and gallery cards carry the document's date, so the date filters apply to them as they do to table rows.
  • Pro: a search the library matched by title, reference number, category or tag is no longer recorded as a content gap when the file text did not also match. The content-gaps report now lists only searches nothing matched.
v2.94.0

Sample documents stay backstage, and the library speaks nine more languages

The sample library is now for the people building the site, not its visitors; the starter page steps aside once you have built your own; and the front end of every library renders in Hungarian, Slovak, Spanish, German, French, Italian, Polish, Brazilian Portuguese and Simplified Chinese without a language pack.

Visitors never see the sample library

The nine sample documents exist so a new library has something to show while you set it up. From this release they show only to logged-in editors, badged Sample so you can tell them from your own files. Anyone else — a visitor, a subscriber, an embedded library on another site — never sees them, in any layout, on a document's own page, or in the REST listing. You can leave them in place as long as you like and remove them when you are done; nothing you have not written reaches the public.

If you trash or delete the last sample by hand instead of using Remove sample documents, the empty sample categories are removed with it, so *Forms*, *Policies* and *Reports* do not linger as stock categories in your library.

The starter page steps aside once you have built your own

Activation creates a Document Library page holding a plain library, so there is something to look at on day one. Most sites go on to build their own page — one per product line, one per year group, one per client — and the starter page lived on beside it, published and in the sitemap, listing every document unfiltered.

Now, the moment another published page or post renders a library, an untouched starter page is unpublished. It becomes a draft, never deleted, and a notice in wp-admin says which page superseded it, with a one-click Restore the starter page if you want it back. "Untouched" is strict: only a page still carrying exactly the title and content activation wrote qualifies. Rename it, add a sentence, change the shortcode — it is yours, and it stays.

The library speaks nine more languages

The front end of every library — the search box, the filters, "No documents match your search", "Download", "Show 25", the document count and everything else a visitor reads — now ships translated into Hungarian, Slovak, Spanish, German, French, Italian, Polish, Brazilian Portuguese and Simplified Chinese. Nothing to install: the site's language setting picks the translation, and a community language pack from wordpress.org still takes precedence where one exists. Admin screens are not covered.

Fixes & improvements

  • A folders or grid library with no documents now shows "No documents found" instead of rendering an empty frame.
  • The Document Categories screen notes how many categories hold no published documents — directly or in a sub-category — since an empty category never appears in a library.
  • The licence screen now calls the paid build "Pro version" rather than "Premium version".
  • A site five or more releases behind sees a reminder on FileDeck's own screens, with the number of releases and an update link; dismissible per version.
v2.93.0

Migrated files now behave like uploaded ones

If you brought your library over from another plugin, some of your documents may have been missing the zip checkbox, the Preview button and their thumbnail. Those come back.

Files on your own site are attached, not linked

When an importer meets a file the old plugin managed in its own folder on your site, FileDeck now registers it in the Media Library where it already sits — nothing is copied or moved. Previously that file was linked by its URL, and a URL-linked document quietly missed everything an attachment unlocks: multi-select zip downloads, the preview lightbox, PDF thumbnails and vault protection. Every importer now does this; the old plugin's protected folders are still copied in, as before, because a file there is unreachable by URL.

One click for libraries migrated earlier

Go to Documents → Settings → Health. It counts the documents that still link a local file by URL and offers Attach them now, which registers them in place in batches of 100. A large library can be done in one go from the command line with wp filedeck attach-local-files.

Fixes & improvements

  • The weekly health scan now lists those documents under their own check instead of probing each one as an external link.
v2.92.1

Hover preview cards are now opt-in

Hovering a document in a library no longer pops up a preview card unless you ask for one. The card itself also draws properly on every theme now.

Hover preview cards are off by default

The card that appeared when a visitor paused the cursor over a document — a thumbnail, the title, category, type, size and date — is now an opt-in feature rather than something every library does out of the box. It suited some libraries and got in the way on others, particularly dense tables where the card covered the rows beneath. Turn it on under Settings → Features → Hover preview cards if you want it back. Sites that already saved their settings keep whatever they chose.

Fixes & improvements

  • The hover card could render see-through on some themes, with its text overlapping the rows behind it. It now always has its own background, border and shadow, whatever the surrounding theme does.
v2.92.0

Share any document from the library

FileDeck Pro adds a Share button to every document — beside Download in the library, and on the document's own page — so a visitor can pass a document on without leaving the page or hunting for its address.

The Share menu

Click Share and a small menu opens:

  • Copy link puts the document's link on the clipboard.
  • Share… opens the device's own share sheet — AirDrop, Messages, Slack, whatever is installed — on phones, tablets, and the desktop browsers that offer one.
  • Email starts a new message with the title as the subject and the link in the body.
  • X, Facebook, LinkedIn and WhatsApp open that network's share page with the link filled in.

It is off until you switch it on: tick "Share" button on every document under Settings → Features, and untick any networks you would rather not offer — keep only Copy link and Email on a client portal, drop Facebook on an intranet. One library can differ from the rest with enable_share="1" (or "0") on the shortcode.

It shares the page, not the file

What goes on the clipboard is the document's page on your site, never the file itself. A download link can be signed and expiring, sit behind a form or terms, or be restricted to certain people — none of that survives being pasted into a group chat. The page does: whoever opens the shared link gets exactly what they would get arriving any other way. A restricted document shows its padlock, a gated one asks its question, and with supersede the link keeps resolving to the current version after you replace the file. A document a visitor cannot open gets no Share button at all.

Nothing is loaded from any network until a visitor picks one: no share scripts, no like buttons, no trackers. Each item is a plain link, opened when it is clicked.

Fixes & improvements

  • The Share menu follows the library's light or dark colour scheme, works from the keyboard (arrow keys move, Escape closes and returns focus to the button), and is never clipped by a fixed-height library.
v2.91.3

Tier labels read as labels again

Two settings on the FileDeck settings screen are marked as belonging to the AI tier. The marker was rendering as plain text run on to the setting's name, so "PDF watermarking AI tier" read as one long heading rather than a name and a badge.

Fixes & improvements

  • The "AI tier" markers beside PDF watermarking and Retention schedules render as badges on the settings screen, instead of running on to the setting name.
v2.91.2

Filter chips keep their own styling

The same fix as last release, applied to the other component it affected. A theme that defined its own chip or pill style could override the one FileDeck ships, and the active-filter chips above your library would take on its colours, shape and spacing instead.

Active-filter chips are no longer restyled by the surrounding theme

When you pick a category or tag, the filters you have applied appear as removable chips above the library. fdk-chip is a common class name, so a theme could define one without ever having heard of FileDeck — and because a theme's stylesheet loads after ours, its version won. The result was chips that looked like whatever pill the theme used elsewhere, sometimes without the affordance that shows they can be removed.

FileDeck's chip styling is now scoped to the library, so it holds regardless of the theme around it.

If you restyle the chips deliberately with your own CSS, prefix the selector with .filedeck.filedeck .fdk-chip { … } — and it will apply as it did before.

Fixes & improvements

  • Active-filter chips keep FileDeck's styling on themes that define a chip or pill style of their own.
v2.91.1

Grid cards keep their own styling

A theme that defined its own card style could override the one FileDeck ships, and the document grid would take on padding, borders and hover effects it was never designed for. The library's own styling now wins.

Your theme can no longer restyle the document grid by accident

fdk-card is a common enough class name that a theme can define one without ever having heard of FileDeck. When that happened, the theme's rule loaded after ours and the grid layout inherited it — usually as extra padding, a heavier border, or a card that lifted on hover. The fix scopes FileDeck's card styling to the library itself, so it applies regardless of what the surrounding theme does.

If you restyle grid cards deliberately with your own CSS, prefix the selector with .filedeck.filedeck .fdk-card { … } — and it will apply as it did before. Everything else about the grid, including the gallery layout and the style presets, is unchanged.

Fixes & improvements

  • The document grid keeps FileDeck's card styling on themes that define a card style of their own.
v2.91.0

Search that knows when the answer is "nothing"

Semantic search was too willing to find a match. Type something your library has no answer for and it would return most of the library anyway, ranked by a similarity score that was barely above noise. This release raises the bar a match has to clear, adds a way out of the protected vault, and warns you when something else on your site is still serving files you thought were locked away.

A nonsense search now returns nothing

The relevance floor for semantic search shipped far too low for the embedding models it runs on. Measured against a 78-document library, a query of pure gibberish scored 49 of those 78 documents above the old floor — so the results looked broken, and worse, a real search carried a long tail of documents that had nothing to do with it.

The floor is now set where the noise stops. A meaningless query returns nothing; a real one returns the documents that actually match, and stops. If your library or your embedding provider needs a different setting, the filedeck_semantic_threshold filter still overrides it.

A one-command way out of the vault

Protected files are stored outside the publicly reachable part of your uploads folder. That is the point — but until now, deciding to stop using FileDeck meant moving every one of them back by hand, editing several database fields per file.

wp filedeck release now does the whole job: every protected file goes back to the exact path it came from, with its thumbnails and previews, and WordPress is updated to match. It asks you to confirm first, because publishing files should never be something that happens quietly.

Deactivating or uninstalling still leaves your files protected rather than publishing them — switching a plugin off should not put confidential documents on the open web. Deactivating now leaves the same written explanation in the folder that uninstalling always did, so the 403s are never a mystery.

Fixes & improvements

  • FileDeck now notices when a media-offload plugin or CDN is still serving a protected document from a bucket or edge copy, and says so in the admin. Moving a file into the protected folder does not recall a copy that something else pushed elsewhere, and until now nothing pointed that out.
v2.89.0

reCAPTCHA joins Turnstile as a bot-protection option

FileDeck's bot protection has always meant Cloudflare Turnstile. That is a good default — free, cookieless, usually invisible — but it is a second vendor to onboard for a site already running Google reCAPTCHA everywhere else. Pro now offers both.

Pick a service, once

Under Documents → Settings → Submissions there is now a CAPTCHA service choice: Cloudflare Turnstile or Google reCAPTCHA v2. Paste that service's site key and secret, and it covers both places FileDeck uses a CAPTCHA — the download bot gate and the front-end submission form. One choice, not two that can disagree.

Turnstile stays the default, and an existing configuration keeps working exactly as it did.

Switching back costs nothing

Changing service keeps the other one's keys rather than deleting them, so switching back is a dropdown rather than a re-typing exercise.

And a stored value that is neither of the two reads as Turnstile, not as "no CAPTCHA". A gate that quietly stops gating because of a bad value is the wrong way for this to fail.

Fixes & improvements

  • The download gate's on/off switch now reports "needs keys" against whichever service is selected, instead of always checking the Turnstile fields.
v2.88.0

Override library markup from your theme

CSS gets you a long way, and then one day it does not: you need a different element, an extra wrapper, a column built from your own fields. Until now the answer was to fork the plugin. FileDeck now looks in your theme first.

Copy a template, edit it

Make a filedeck/ directory in your theme and drop a template in:

wp-content/themes/your-child-theme/filedeck/document-row.php

Child theme wins, then parent theme, then FileDeck's own copy. Nothing to register and no setting to turn on.

Two templates are overridable to start with — the table row and the "no documents found" state — and more will follow. The loader itself is generic; the work in adding one is deciding what a template is promised.

What you copy is what you are replacing

The files in the plugin's templates/ directory are the ones FileDeck actually renders, not example copies sitting beside a separate hard-coded implementation. A sample that nobody renders drifts from the real markup, and the person who copied it into their theme is the one who finds out.

Access rules are not in the template

Restrictions are applied before a row ever reaches a template: a document the visitor cannot see is filtered out of the query, or arrives already flagged. A customised row is therefore not a place where an access rule can be lost — which is the property that makes overriding markup safe to hand out.

The catch, stated plainly

Your copy keeps rendering after an update, because yours wins. That also means a fix we make to the built-in template will not reach it. Release notes will call out template changes; re-copy when one lands on a template you have overridden.

Full details, including the variables each template receives: template overrides.

v2.87.0

Three more page builders get native elements

FileDeck already put a Document Library element in Elementor, Bricks and Divi's own palettes. Three more builders now have one: WPBakery (Visual Composer), Avada (Fusion Builder) and Beaver Builder. Each also gets a Document Embed element for a single inline document.

Same options, same output

Layout (table, grid, folders or gallery), an optional category to narrow the library, and a colour scheme — the options people actually reach for. Everything else is a shortcode attribute away, and every element renders through the same pipeline as [filedeck], so a native element and a pasted shortcode produce the same page.

One map instead of six

The part worth mentioning: which control feeds which shortcode attribute used to be written out separately in each builder's element. Six copies of one rule is five chances for a control to quietly stop doing anything after a change lands in only one of them. That map now lives in a single place that every element reads.

Oxygen

Oxygen does not get a native element in this release. It renders shortcodes perfectly well through its own Shortcode element, and we would rather point you at that than ship an element written against an API we have no way to test.

Fixes & improvements

  • Element registration stays guarded: a builder that is absent, or that has changed the API we register through, means no element rather than an error — and the shortcode carries on working.
v2.86.0

Gate documents by membership plan

If your site already sells access, your membership plugin already knows who has paid. Until now FileDeck made you tell it again — build a matching group, then keep the two in step by hand as people joined and lapsed. Pro can now ask the membership plugin directly.

Tick a plan

Edit a document category, or a single document, and tick one or more plans. FileDeck detects whichever of these is running:

  • MemberPress
  • Paid Memberships Pro
  • WooCommerce Memberships
  • Restrict Content Pro
  • s2Member

Run two of them and plans from both appear in the same list. Plans sit alongside the client-area rules you already have — named people, groups and email domains — as another way in, not a replacement: someone gets in if any one of them matches.

Access follows the membership

The plan is checked when the page is drawn, rather than copied onto the document when you tick it. A lapsed membership takes the access with it: the document leaves that reader's library and the download stops working. Renewing brings it back with nothing to re-tick.

A reader without the plan does not see the title in a listing at all, rather than seeing a padlocked row.

Another membership plugin?

Three filters register one: what the provider is called, which plans an admin can pick, and which plans a given user holds. The documentation has the code.

Fixes & improvements

  • A plan-gated category now appears on the client portal for the people whose plan admits them, the same way a group-granted one does.
v2.85.0

Readers can keep a shortlist

On a library of any size, the problem is rarely "is it in here" — it is "which of these forty do I actually need again next week". Pro now lets a signed-in reader star documents and read the list back on one page.

How it works

With Pro active, every row a signed-in reader can see gets a star. Clicking it saves the document; clicking again unsaves it. Put the shortlist wherever suits you:

[filedeck_my_favourites]

Each reader sees their own list. There is nothing to switch on, and no setting to find.

Access is checked when the list is read, not when it was saved

A document starred last month might have been restricted since. FileDeck does not take the saved list on trust: every entry is re-checked against the rules that apply *now*, to the person looking at it, and anything they can no longer see is simply not there. A shortlist that named a restricted document would be a leak, even without a link.

The same holds in the other direction — starring is not a way to find out what exists. A document a reader cannot see answers exactly as one that never existed.

Signed-in readers only

Logged-out visitors get no star, and the shortlist page asks them to log in.

Remembering an anonymous visitor's favourites would mean either a cookie carrying document IDs on every request, or a server-side record tied to a visitor we have deliberately not identified. Those are tracking decisions, and not ones to make quietly on your behalf. A star that never remembered anything would be worse than no star, so there isn't one.

Fixes & improvements

  • The "New" marker now appears in the grid and gallery layouts, not only in the table.