I-Soft File Manager: Foundation is a modular download manager built for modern WordPress.
Unlike standard media plugins that dump every upload into a single dated folder, Foundation is designed for municipalities, universities, libraries, and any team that needs to manage thousands of public documents, maintain a strict category tree, and give different departments their own secure upload spaces.
What's new in 0.12.0
The entire admin is rebuilt on React and a public REST API. Statistics, Download Log, Broken Links, Licenses, and Settings load as Gutenberg-native single-page apps under a redesigned
Downloads → Tools menu; navigating between them is instant after the first load. The download post-edit screen now runs on the block editor with a right-hand sidebar for version, license, agreement, and access role. The Broken Links recovery flow has been rebuilt around a per-row modal. Existing data is preserved on upgrade — see the changelog for full details.
Key features
- True folder organization. Every category you create maps 1:1 to a real folder on disk under
wp-content/uploads/isoft-fmf-files/. Rename a category and the folder renames itself; every file path in the database updates instantly.
- Department-level access control. Restrict editors to specific categories so HR uploads only land in the HR folder, IT uploads only in the IT folder, and so on. Restricted users cannot see drafts from other departments either.
- External file sync and "From Folder" browser. Because categories are real folders, drop files into them via SFTP, rclone, or any external sync tool. The From Folder browser detects untracked files instantly so you can link them to a download with one click.
- One-click multi-file downloads. Upload multiple files to a single entry via drag-and-drop. Visitors can grab individual files or everything at once as an automatically generated ZIP bundle.
- Built-in analytics and audit log. Statistics dashboard tracks per-file and aggregate counts, recalculates HOT badges nightly, and the optional audit log records timestamps, IP addresses, and user agents with configurable retention.
- Secure download handler. Files live behind an
.htaccess-protected directory; every download routes through PHP with nonce verification, role checks, rate limiting, and hotlink protection. X-Sendfile and X-Accel-Redirect supported for high-traffic hosts.
- Cyrillic transliteration. Uploaded filenames and category slugs are automatically transliterated from Serbian Cyrillic to Latin for safe disk storage; display titles keep their original characters.
- Native builder support. Gutenberg blocks ship out of the box. Eight shortcodes work in Elementor, WPBakery, Divi, Beaver Builder, and Bricks — see the full shortcode reference below.
- Themeable via CSS variables. Recolor every card, badge, and icon from Appearance → Customize → Additional CSS without writing complex selectors — see customizing appearance below.
Architecture in one line
The filesystem
is the source of truth. Moving a download to a different category auto-moves its files on disk; deleting a category is blocked if any download still references it. This is what lets external automation tools sync files in and out without having to understand WordPress internals.
Extensions (coming soon)
- I-Soft File Manager: Sentinel — server-side automation. Monitors category folders for new files, creates draft download entries, and supports rclone mirroring, SFTP bulk upload, and scheduled folder scans.
- I-Soft File Manager: Orbit — Google Shared Drive sync. Departments drop files into shared folders; Orbit imports them as drafts for review.
- I-Soft File Manager: Nomad — one-shot importer from jDownloads. Rebuilds your categories, downloads, files, and counters in Foundation, preserving slug paths so existing URLs keep working.
- I-Soft File Manager: Arbiter — extended licensing and enforcement. Per-license acceptance gates (read-and-confirm checkbox, scroll-through, read timer), signed download receipts that bundle a verifiable rider PDF with the file, and custom rider templates with your institution's branding — logos, fonts, colors, per-department layouts.
0.12.0
The React admin rewrite.
- Rebuilt admin. Every I-Soft File Manager: Foundation admin screen — Statistics, Download Log, Broken Links, Licenses, Settings — now runs as a Gutenberg-native React app on a shared REST API. Navigation between them is instant after the first page load.
- Reorganised Downloads menu. The sidebar collapses to All Downloads, Add New, Categories, Tags, Licenses, Tools, Settings. Statistics, Download Log, and Broken Links move under one Tools page with horizontal sub-tabs. Old direct URLs still resolve so bookmarks keep working.
- Editor sidebar for downloads. The download post-edit screen runs on the block editor. Version, license, changelog, author, agreement gate, and access role live in a right-hand sidebar. The classic multi-category checkbox picker is replaced by a single-select dropdown that matches the one-folder-per-download filesystem model.
- DataViews-powered Download Log and Broken Links. Server-side pagination, per-download filter, live search, sortable columns, and debounced typing so the table stays responsive under load.
- Rebuilt Broken Links recovery. Per-row Recover action opens a modal that shows where the file was found vs. where it was expected, with the same seven recovery paths (relink, move back, reassign, split, reupload, detach) but a clearer flow.
- Statistics dashboard rewrite. Same KPI cards, 30-day bar chart, and Top-N tables — now with a Refresh button and a five-minute cached backend.
- Schema-driven Settings. Six sub-tabs (General, Display, Security, Advanced, Maintenance, Extensions) on a horizontal tab strip, with per-tab Save Changes and only-changed-fields writes.
- Category icons. Category admin gets a small icon picker (dashicon, image URL, or shortcode).
- Public REST API. Every admin surface reads and writes through
/isoft-fm-foundation/v1/*.
- Faster page loads. Single admin JavaScript bundle instead of five, initial data ships inline (no extra REST fetch on page render), lazy per-section hydration, batched log-retention purge, and lighter frontend load (REST controllers, admin classes, and legacy handlers only load when needed).
- Category assignment is single-select. The 0.11.0 known issue where the checkbox UI let admins pick multiple categories but the filesystem only honoured the first is resolved. Existing multi-category downloads are migrated to their oldest assignment on upgrade (idempotent, logged, visible on the Maintenance tab).
- Removed: legacy admin AJAX handlers, the classic-editor TinyMCE shortcode inserter, two
WP_List_Table subclasses, and the pre-React PHP fallback forms. Everything flows through REST now.
Existing data (downloads, categories, files, licenses, logs, per-user category permissions) is preserved. Please back up before upgrading and test on staging when possible — this is a large rework of the admin layer.
0.11.0
- New: category-level default license with file inheritance. Each category now has a "Default License" dropdown on its Add/Edit screen. Downloads in a category that have their License field set to "— Inherit from category —" pick up the category's default automatically. Per-file overrides still win. Set Public Domain on your "Budget" and "Assembly decisions" categories, set CC BY-SA 4.0 on your "PR archive" — every file in each category inherits the right license without per-file fiddling.
- New: two more seeded licenses out of the box. Public Domain — Serbian Law (Art. 6 ЗАСП) for official municipal acts that are public domain by operation of law (different mechanism than CC0's author-release PD). Creative Commons BY-SA 4.0 with the standard summary and URL. Both ship alongside the existing four defaults.
- New: "Restore seeded licenses" button on Downloads → Licenses. Adds any default licenses missing from your install. Add-only — existing licenses with the same slug are never overwritten. Use this after a plugin update that ships new default licenses to pull them in with one click.
- New: download log now records which license governed each download. A new column on the download log preserves the legal trail. Even if you change a file's license later, you can still answer "what license was on this file when User X downloaded it on date Y?" — important for Creative Commons compliance (CC licenses are irrevocable for already-distributed copies).
- New: license chip on download cards. When a download has a license set (or inherits one from its category), the title now appears as a chip in the meta row. If the license has a URL, the chip links out to the canonical source (creativecommons.org, etc.).
- Improved: lock icon on download cards now shows the required role ("Subscriber+", "Editor+", etc.) next to the icon, so visitors know what login level they'd need.
- Improved: license change warning. When you change a file's license in the editor, a warning appears if anyone has already downloaded that file. Reminds you that Creative Commons and most permissive licenses are irrevocable for already-distributed copies — the change only affects new downloads.
- Heads up — known issue with a quick fix on the way. WordPress's standard category picker on the post edit screen still lets you check multiple categories, but Foundation stores every file in exactly one folder on disk (categories are physical folders, not labels) — only the first checked category actually drives where the file lives. For now, please assign each download to a single category. The next patch swaps the picker for a proper single-select dropdown so this can't happen by accident.
0.10.21
- Fixed: download cards no longer show a lock icon on publicly accessible files. Files set to "Inherit from category" whose categories had no access role configured were cascading correctly to the site-wide default (Public) — but the card was reading the literal "inherit" value when deciding whether to show the lock, so visitors saw a lock chip on files they could actually download without logging in. The card now reads the cascade-resolved role and only shows the lock when the visitor really does need to authenticate.
0.10.20
- HOT badge and Top Downloads panel now work on new and quiet sites. The HOT recalculation was looking at the last 7 days only — fine for busy sites but it left brand-new installs and low-traffic sites with an empty Top Downloads panel forever, because there simply wasn't enough recent data. The cron now tries 7 days first, widens to 30 if that's empty, and last-resort falls back to all-time download counts. The Top Downloads dashboard panel labels itself honestly so you can see when it's showing all-time vs recent data.
- Fixed: the Top Downloads (Last 30 Days) panel was silently showing 8 days at most, because the daily aggregate table was being purged too aggressively. The retention is now 32 days, so the panel and the 30-day chart actually show 30 days of data.
0.10.19
- Database setup failures are now visible. When the plugin can't create its required tables (usually because the WordPress database user lacks
CREATE privilege — common on locked-down shared hosts), every admin page now shows a clear warning with the exact MySQL error and a ready-to-paste GRANT statement to fix it. Previously the install appeared to succeed but every upload silently failed with "Could not save file record" and the admin had no clue why.
- More helpful upload and save errors. Failed file uploads now report the specific reason (file too large, server out of temp space, security plugin blocked it, etc.) instead of a generic "upload error." Failed database saves include the underlying MySQL error so you can see whether a column is missing, the disk is full, or something else.
0.10.18
- New: External Link Target setting under Settings → Display. Choose whether external-URL download buttons (Google Drive, Dropbox, etc.) open in a new tab or the same window. Defaults to new tab — the modern web convention and what visitors usually expect for off-site links. Local-file downloads are unaffected.
- Fixed: downloads failed to start on Nginx and similar hosts where auto-mode picked a serve method the server couldn't actually fulfill. Auto-mode now safely streams via PHP; admins who have X-Sendfile or X-Accel-Redirect properly configured can opt in via Settings → Security → File Serving Method.
- Fixed: PHP-streamed downloads hung on hosts with output gzip, nested output buffers, or aggressive FastCGI buffering. The stream now drains every level of output buffering, disables on-the-fly compression, and pushes data in 8 KB chunks so the file starts arriving immediately instead of waiting for the whole response to assemble.
- Fixed: Cyrillic-titled downloads kept the locale's auto-draft slug (for example
automatski-nacrt under Serbian Latin, auto-draft under English) instead of transliterating the title. User-customized slugs are still preserved as before.
- Fixed: download links silently failed on themes using AJAX page navigation (djax, pjax, swup, hotwire-turbo, instantclick). Those libraries intercept every link click and try to swap the response into the page as HTML — which explodes when the response is a binary file. Download buttons now ship with the HTML5
download attribute and the plugin's own click handler runs first so the theme can't hijack the request.
0.10.17
- Smart ZIP bundle cache expiry. Bundle cache now expires on idle time (last access), not build age — so a bundle being downloaded daily no longer gets rebuilt on a schedule. A hard ceiling at 3× the configured duration guarantees an eventual refresh regardless.
0.10.13 — 0.10.16
- Faster statistics dashboard. Now reads from a daily aggregate table instead of scanning the full per-event log; refreshes immediately on every download instead of after a 5-minute cache.
- ZIP bundle self-cleanup. A daily sweep removes stale or orphaned bundles from disk; deleting a download immediately clears its cache. A "Clear bundle cache now" button covers manual cleanup.
- Broken-link recovery on Windows hosts. Renamed or moved files are now relinked via SHA-256 content matching, not just POSIX inode (Linux/POSIX still uses the faster inode path).
- Manual "Run integrity check now" button on the Broken Links screen, with overlap protection and auto-recovery if the scan crashes mid-flight.
- Realistic demo content that models a real document lifecycle (release-day spike, decay, weekend dampening) so first-impression screenshots look like a live site.
0.10.0 — 0.10.12
- Category-level access roles. Categories can declare their own minimum role (Public, Subscriber+, Editor+, etc.). Downloads can be set to inherit the strictest permission across their assigned categories.
- One-click ZIP bundles for multi-file downloads. Visitors can grab everything as a single archive; optional on-disk cache via Settings → Display.
- Multi-file summary tiles. In listings, multi-file downloads now render as a single summary card (file count, distinct types, total size, single "Download all" button) instead of one row per file.
- User-agent blocklist under Settings → Security for blocking specific scrapers or bots.
- Featured-first listings. Downloads marked Featured pin to the top of any list regardless of sort order.
- External-only flag for downloads where the external URL is canonical and the local file is just a backup.
- Plus a bundle of fixes for the Category Grid block and a settings-tab regression where saving one tab wiped checkboxes on the others.
0.8.0 — 0.9.1
- WordPress.org review preparation. Full Coding Standards compliance pass, escape and nonce audits, REST capability hardening, and the official rename to I-Soft File Manager: Foundation (slug
isoft-fm-foundation).
0.7.0 — 0.7.2
- Themeable via CSS custom properties. Every color in the public stylesheet is exposed as a
--isoft-fmf-* variable on :root — recolor anything by overriding a single variable in Customizer → Additional CSS.
- Demo content creates a showcase page automatically so new users can see all three embed patterns side-by-side.
0.5.0 — 0.6.1
- Rate limiting and hotlink protection fully enforced (configurable per IP/hour, configurable referer check).
- Lighter PDF thumbnail backend — Imagick-only; removed every
exec() call from the codebase.
0.4.0 — 0.4.9
- Broken-link recovery. Daily scheduled scan detects missing files. Visitors hitting a missing file see a friendly "temporarily unavailable" page instead of an error.
- Object cache layer for hot-path reads, and the Broken Links admin screen with per-row recovery options (Move back, Reassign, Split, Reupload, Detach).
- Container-query grid that adapts to any sidebar or column width.
0.3.0 — 0.3.9
- Per-user category access control with subtree inheritance.
- Grid view redesign with colored file-type badges and clean layout bands.
0.2.1 — 0.2.9
- Category-as-folder architecture introduced. Creating a category creates a real physical folder on the server.
- From Folder browser for files dropped in via external tools.
- Cyrillic-to-Latin transliteration for safe filesystem storage.
- Inline metadata editing directly from the file list.