SumaFile is a native Windows file manager for people who work across several folders at once and need more than a basic file list. It pairs a WinUI 3 desktop shell with a Rust filesystem service so browsing, transfers, search, previews, archives, checksums, cleanup tools and, through bundled plugins, Git status and remote FTP/SFTP profiles can stay responsive in one local-first app.
Repository topics: windows, file-manager, winui-3, rust,
named-pipe-ipc, dual-pane, tabs, file-preview, advanced-rename,
archive-manager, checksum, git-status, windows-installer,
local-first.
- Screenshots
- Status
- Highlights
- Install
- Use SumaFile
- Feature Reference
- Settings and State
- Plugins
- Transfer tuning
- Development
- Architecture
- Testing and Verification
- Release and Tags
- Documentation Map
- Security
- Known Limitations
- Support
- License
Dual-pane workspace. The left pane filters 10,000 sample files down to 100 and shows the filter banner with its Clear filter action. The right pane is marked active, keeps its own selection, and the pinned preview shows the selected text file while both panes stay open.
Copy conflict. The dialog compares the incoming and existing files, marks
which one is larger and which is newer, and offers Replace, Skip and Keep both
as one choice. Skip is selected by default, Continue confirms, and the
Keep both option previews report (1).txt.
Advanced Rename. The {base}_reviewed template adds a suffix while preserving
the extension. The Before and After columns show both proposed names before you
apply them, and the Tokens button explains each placeholder.
These captures come from the running v1.0.4 WinUI app on a GitHub-hosted Windows runner. All visible files and paths belong to its generated test workspace.
| Area | Current state |
|---|---|
| Product version | 1.1.0 |
| Platform | Windows 10 2004+ / Windows 11, x64 |
| UI | Unpackaged WinUI 3 desktop app |
| Backend | Rust simplefile-service over named-pipe JSON-RPC |
| Release artifacts | NSIS setup, MSI, portable ZIP, updater manifest |
| Storage scope | Local folders, local drives, removable media, mapped network shares, archives, and an FTP/FTPS/SFTP profile browser from the bundled FTP/SFTP plugin |
| License | MIT |
The active application is the WinUI host under src-winui/ plus the Rust crates
under crates/. Historical migration notes remain in docs/winui-migration/,
but the Svelte/Tauri surface is not the shipping UI for this branch.
The plugin system, and the move of Git, FTP/SFTP and 7-Zip into three bundled plugins, are new in 1.1.0: 1.0.4 has those features built into SumaFile itself. See Plugins, the v1.1.0 release notes and the changelog.
Git, FTP/SFTP and 7-Zip are now three plugins that ship with SumaFile, on a new plugin system that third parties can build on. Settings -> Plugins has an overview and one page per plugin. Uninstalling now also removes plugin data, including FTP/SFTP profiles. The item count sits beside the folder address, Properties is grouped and can count a folder through every subfolder, and automatic transfer tuning decides sooner.
See the v1.1.0 release notes for the changes since v1.0.4, upgrade instructions and known limitations.
Menus grey out what is unavailable instead of hiding it, Delete is a direct menu item, and the omnibar returns to Path mode when a search or filter ends. The conflict dialog uses one choice list with Continue as the default, the Transfers window no longer steals focus, and transfer options show three settings with the rest under Advanced. Git controls appear only inside a repository, FTP/SFTP profiles get a trust prompt for new server keys, and labels, the sidebar, profiles and connections each have one name everywhere.
See the v1.0.4 release notes for the changes since v1.0.3, upgrade instructions and known limitations.
| Need | SumaFile capability |
|---|---|
| Work in two locations | Dual-pane browsing with independent pane history, tabs, sort, view, and selection |
| Keep workspace context | Saved layouts for panes, tabs, columns, preview width, sidebar state, and pane split |
| Move files confidently | Copy/move progress, cancellation, conflict choices, Recycle Bin delete, and undo/redo |
| Inspect before opening | Persistent preview pane, Quick Look, metadata, checksums, properties, and compare |
| Organize messy folders | Tags, bookmarks, recents, smart folders, duplicate finder, cleanup, and Advanced Rename |
| Work with archives | Create, list, view, extract, pack, and unpack supported archives |
| Handle developer folders | Git status column and dockable Git workbench (bundled Git plugin), terminal launch, and Open With preferences |
| Reach remote servers | FTP, FTPS, and SFTP profile manager from the bundled FTP/SFTP plugin, with test, browse, upload, download, rename, and delete actions |
| Stay Windows-native | Drive labels, network-share status, shell icons, Windows installers, and Windows shortcuts |
Download the latest Windows release from GitHub Releases.
| v1.1.0 artifact | Recommended use |
|---|---|
SumaFile_1.1.0_x64-winui-setup.exe |
Normal per-user installation |
SumaFile_1.1.0_x64-winui.msi |
MSI deployment or installer validation |
SumaFile_1.1.0_x64-winui-portable.zip |
Portable, extracted-folder usage |
latest-winui.json |
Signed updater metadata for published releases |
Requirements:
- Windows 10 version 2004 or newer, or Windows 11
- x64 Windows
- Git for Windows with
git.exeonPATH, for Git status and the Git workbench - Built-in RAR listing and extraction; RAR creation is not supported
.7z support (with the bundled 7-Zip), FTP/FTPS/SFTP connections and Git
come with SumaFile. In 1.0.4 they are part of the app; from 1.1.0 they
are three bundled plugins that install with SumaFile: com.sumafile.sevenzip, com.sumafile.remote and
com.sumafile.git.
After installing, open Settings -> Updates to check published releases. Builds with trusted updater metadata can download and launch the NSIS setup from inside the app. Builds without complete trusted metadata fall back to the release page.
Uninstalling (Windows Settings -> Apps, or removing the MSI) deletes the
installation folder. From 1.1.0 that includes every plugin file
SumaFile keeps there: plugins you installed, plugins-data (with the FTP/SFTP
connection profiles), plugin-approvals.json and plugins.log; an upgrade or
reinstall keeps them. Saved FTP/SFTP passwords and passphrases stay in Windows
Credential Manager under SumaFile.Remote.* targets: delete the connections in
SumaFile before uninstalling, or remove those entries in Credential Manager.
Settings in %APPDATA%\com.simplefile.desktop are not removed.
- Open SumaFile.
- Choose a location from Quick Access, drives, bookmarks, recents, smart folders, the optional folder tree, or type a path in the omnibar.
- Press
F6to open or close the second pane. - Press
Ctrl+TorCtrl+Nto open a tab in the active pane. - Leave Preview open for continuous inspection, or press
Spacefor Quick Look on the selected item. - Use right-click menus, toolbar buttons, or
Ctrl+Shift+Pfor command palette access. Right-click blank pane space for New (folder, text document, blank file, shortcut), Paste, Refresh, and the current folder's Properties. Right-click an item for Create shortcut, which pre-fills the shortcut target. Unavailable commands stay visible but greyed out. - Run FTP/SFTP manager from the command palette or the toolbar overflow when you need a saved FTP, FTPS, or SFTP connection. The bundled FTP/SFTP plugin provides it, and lists saved connections under Connections, below the built-in sidebar sections.
- Save repeatable pane/tab/column setups from the Profiles button on the toolbar.
- Dual-pane browsing with independent active-pane state
- Pane-local tabs with history, close, switch, and direct tab shortcuts
- Breadcrumbs and a single omnibar for paths, commands, search, and filtering
- Quick Access, drives, bookmarks, recent locations, smart folders, and folder tree sections
- Details, list, tiles, and content views
- Per-pane view style, icon size, sort column, and sort direction
- Column presets: default, details, media, developer, and photo
- Explorer-style column resizing, size-to-fit, and horizontal scrolling
- Details stays selected in narrow panes, with compact leading columns and horizontal access to the remaining columns
- Persistent pane-local filter counts, Clear filter, and search result banners with Return to folder
- Marquee selection, multi-selection, type-ahead selection, and live directory refresh
- Recycle Bin as a browsable location with restore, permanent delete, and empty actions
- Status bar with the item count and the selection's count and size, shown beside the folder address
- Create file and folder
- Rename and Advanced Rename
- Copy, cut, paste, drag, drop, copy to other pane, and move to other pane
- Transfer progress with bytes, totals, rate, ETA, cancellation, and operation history
- Per-file conflict handling for skip, replace, keep both, or fail. Retry uses each failed file’s original destination, including files nested inside merged folders.
- Overwrite comparisons show incoming/existing paths, sizes, modification dates, and a preview of the Keep both filename
- Recycle Bin delete and permanent delete
- Undo/redo for create, rename, copy, move, and Recycle Bin delete flows
- Clipboard history for recent copy/cut sets
- Operation journal written to
%LOCALAPPDATA%\SumaFile\operations.jsonl
| Kind | Support |
|---|---|
| Images | PNG, JPG/JPEG, GIF, SVG, WebP, BMP, ICO, TIFF |
| Path-backed PDF preview and metadata | |
| Video | MP4, WebM, AVI, MOV, MKV, FLV, WMV, OGG |
| Audio | MP3, WAV, FLAC, OGG, AAC, WMA, M4A, AIFF |
| Text and code | Plain text, source files, scripts, config, logs |
| Markdown | Raw text or rendered Markdown with GitHub-flavored tables and task lists |
| Data text | Rendered HTML, JSON/JSONL, CSV/TSV, XML/XAML, YAML, TOML, AsciiDoc, and reStructuredText views |
| Fonts | TTF, OTF, WOFF, WOFF2 |
| Other files | Shell icon and basic metadata fallback |
Inspection tools include:
- Preview pane with Open, Open With, Reveal in folder, Compare, and Checksum actions
- Pin preview open, or let unpinned preview collapse when empty or panes are cramped; automatic collapsing can be disabled in Settings -> Behavior
- Quick Look for focused inspection
- Properties dialog grouped into General, Attributes, and the file's metadata, with values you can select and copy
- Calculate totals in a folder's Properties counts every file and folder inside it, including subfolders, and adds up their size
- Image dimensions and EXIF where available
- Office/PDF/media metadata where available
- MD5, SHA-1, and SHA-256 checksums
- Text diff for two small UTF-8 files
- Binary comparison with hex/ASCII rows for images, executables, oversized text, invalid UTF-8, or other binary content
- A persisted Rendered toggle for Markdown and data files. Markdown task-list checkboxes are preview-only controls; change the source file to update task state.
- Filter the active pane as you type in the omnibar’s Filter mode
- Recursive filename search
- Optional content search in the omnibar’s Search mode
- Filters for size, date, depth, and hidden-file inclusion
- Batched, cancellable search results for large trees
- Smart folders saved from reusable search criteria
| Format | Extension(s) | Support |
|---|---|---|
| ZIP | .zip |
Built in |
| TAR | .tar |
Built in |
| TAR.GZ | .tar.gz, .tgz |
Built in |
| RAR | .rar |
Built-in list/extract only |
| 7-Zip | .7z |
SumaFile 7-Zip plugin (com.sumafile.sevenzip), installed with SumaFile |
Archive commands can list contents, view archives, extract here, extract to a folder, extract to a chosen destination, create archives, pack selections into a folder, and unpack folders in place. RAR archives can be browsed and extracted, but SumaFile does not create or rewrite RAR archives.
Extraction validates final output paths before writing. TAR extraction skips links and special entries that could escape the destination.
- Labels for files and folders, shown under Labels in the sidebar
- Bookmarks and recent locations
- Smart folders
- Folder metrics: files, folders, total items and total size through every subfolder
- Duplicate finder
- Advanced Rename with live preview and collision checks
- Rename preview shows full Before/After names, highlights changes, and labels each target Ready, Unchanged, or Conflict
- Settings-controlled hidden/system file visibility
- Keep-folders-on-top sorting mode
- Git comes from the bundled Git plugin (
com.sumafile.git), which needs Git for Windows withgit.exeonPATH - Developer column preset with a Status column of Git status labels
- Dockable Git workbench with branch/upstream summary, changed paths, resizable diff preview, stage, unstage, discard, fetch, pull, push, and commit actions; fetch, pull and push run as Transfers rows with Cancel
- Settings -> Plugins -> Git can completely disable Git integration, hiding Git UI and preventing Git status/command calls; the Git commands stay listed and explain that Git is turned off
- Git hooks and filters still run for your own stage, commit, fetch, pull and push, as they do with the git command line; the read-only views (the Status column, the workbench's status and the diff preview) run none
- Open terminal here with
Ctrl+` - Elevated PowerShell launch
- Open With menu and chooser
- Pinned and recent Open With apps per extension
- Command palette with searchable app commands
FTP, FTPS and SFTP come from the bundled plugin com.sumafile.remote ("FTP/SFTP
connections"), which installs and is trusted with SumaFile. It contributes the
FTP/SFTP manager window and command, the Connections sidebar section (below the
built-in sections) and its own page under Settings -> Plugins. Without the
plugin, SumaFile shows no FTP/SFTP UI.
- Saved FTP, FTPS, and SFTP profiles
- Password, anonymous, SSH agent, and private-key authentication modes
- Optional Windows Credential Manager storage for passwords and passphrases
- Profile test before save
- Remote folder browsing with create folder, upload, download, rename, delete, refresh, and disconnect actions
- Recursive folder uploads and downloads, including empty folders
- Streamed transfers with byte progress, per-item outcomes, and retry of incomplete selections; existing files are preserved until transfer completion using temporary files and replacement backups. Each transfer is also a row in the Transfers window, with Cancel
- File conflict choices: report, skip, replace, or keep both. Existing folders merge; the selected policy applies to files inside them. When retrying a partially completed folder, choose skip to keep files already transferred
- Retry remains available after reconnecting to the same profile; transfers restart incomplete files from the beginning
- Symbolic links are reported as unsupported during folder transfers
- Plain FTP requires an explicit insecure-connection acknowledgement and is marked Insecure in the manager and under Connections in the sidebar
- Remote transfer settings (bandwidth limit, up-to-date check, direct writes, pre-allocation, flushing and retries) are the plugin's settings, under Settings -> Plugins -> FTP/SFTP connections and in the manager's Transfer options dialog
The plugin's backend keeps profiles in
<install folder>\plugins-data\com.sumafile.remote\remote-profiles.db: every
plugin file, its data included, stays in SumaFile's installation folder.
On first use after an upgrade from 1.0.4 it imports, read-only, the profiles the
1.0.4 service saved in its metadata.db; saved passwords and passphrases stay
in Windows Credential Manager under their SumaFile.Remote. targets and keep
working without being entered again. Remote sessions end with the plugin's
backend, not with the file service.
Filesystem file/folder copies and moves (including mounted cloud drives, mapped shares, removable drives, and cross-volume moves) share the same transfer engine. FTP, FTPS, and SFTP uploads/downloads in the FTP/SFTP plugin use the same staging and retry code with the plugin's own settings (Settings -> Plugins). Remote sessions copy one file at a time. Same-volume moves can use a direct rename.
- Custom keeps the selected concurrency, subject to the chosen buffer budget, shared process resource bounds and provider capabilities. Slow I/O and errors never replace it with a smaller learned value.
- Zero bandwidth means unlimited in every mode. There is no additional safety rate. Successful cloud reads, NAS writes, metadata gaps and durability flushes cannot impose a hidden limit. Native streams charge actual payload bytes, including short reads and small files, rather than reserving full buffers at EOF.
- Automatic modes start from the kind of drives involved (fewer files at once for a hard disk, more between solid-state drives), schedule small and large files in two lanes that share the file limit, and treat a sustained rise in write latency as an early sign of a saturated drive (see Transfer tuning).
- Automatic modes compare sustained aggregate throughput while work is queued. They can test more/fewer workers and back off after actual I/O failures. A quiet window alone is not a failure. Settings learned by the former latency-based controller are not reused.
- A failing file or finalization step uses configurable retry limits. New-policy defaults are ten low-level attempts and three file passes, with cancellable exponential waits starting at one second. Retrying failed I/O identifies the actual failing phase/path. The affected file waits; healthy workers and new files continue within their configured limits. Permission, conflict, missing-file, invalid-data, authentication, and certificate/host-key errors fail promptly.
- Empty and partially written operation-owned filesystem temporary files resume correctly. FTP/SFTP plugin retries reconnect and restart the incomplete staged file from byte zero. Completed files are retained; failed moves retain sources. The first error is preserved alongside any later failure. Buffered writes and durability checks still complete before a filesystem destination is promoted.
- Write directly to the destination (Advanced transfer options) skips the hidden temporary files. New files and folders are created under their final names, and replaced files are overwritten in place; the FTP/SFTP plugin's own "Write downloads directly to the destination" setting does the same for remote downloads. A cancelled or failed transfer then leaves partial files and folders behind instead of the untouched original.
- SumaFile does not read or control pCloud Drive's cache occupancy. Its buffer budget is RAM, and temporary files are on the destination. A synchronous OS filesystem call may remain blocked until its driver returns. Archive creation/ extraction retains its separate format-specific engine.
Settings is organized into:
| Section | Controls |
|---|---|
| Appearance | Theme (Windows default, Dark, Light), default display style, default icon size, default file list columns, hidden files |
| Navigation | Start location (Home folder, Restore last session, Custom folder), new-tab behavior, sidebar sections, recent history |
| Behavior | Recycle Bin prompt, folders on top, folder sizes, rendered previews, video playback, preview collapse, and transfer options |
| Storage & cache | Thumbnail cache enablement, cache size, and cache location |
| Shortcuts | Searchable shortcut list with edit, reset, import, and export |
| Toolbar | Button labels, command order, separators, removed commands, and reset |
| Tools | Archive support summary |
| Plugins | Installed plugins with their state, Install from file, Rescan, Open plugins folder, and each plugin's enable switch, settings and page, such as the FTP/SFTP plugin's page (opens the FTP/SFTP manager) below its declared settings and the Git plugin's on/off setting; see Plugins |
| Updates | Version, update check, install action |
| About | Product, version, repository, and build metadata |
Startup can open Home, the last used workspace, or a custom path. Last-used state persists panes, active pane, tabs, view mode, icon size, sort, and filter context. Named profiles are separate snapshots available from the Profiles button on the toolbar; applying a profile does not change the folders-on-top setting or the Git plugin's settings.
Persistent compatibility data stays at:
%APPDATA%\com.simplefile.desktop
No manual import is needed for normal SimpleFile-to-SumaFile use. SumaFile
keeps this path for compatibility with earlier SimpleFile builds and also falls
back to legacy SimpleFile / SumaFile app-data folders when an existing
metadata database is found there.
Runtime diagnostics are written under:
%LOCALAPPDATA%\SumaFile\startup.log
%LOCALAPPDATA%\SumaFile\operations.jsonl
The plugin system is new in 1.1.0; 1.0.4 does not have it.
Plugins add commands, menus, toolbar buttons, sidebar sections, panels, file
row decorations, settings and archive formats to SumaFile. Three plugins install
with SumaFile and are trusted without a prompt, because the release lists them
in plugins\bundled.json:
| Plugin | Id | Adds |
|---|---|---|
| 7-Zip archives | com.sumafile.sevenzip |
.7z browsing, extraction, creation and in-place changes, with the bundled 7-Zip |
| FTP/SFTP connections | com.sumafile.remote |
The FTP/SFTP manager, the Connections sidebar section and the remote transfer settings |
| Git | com.sumafile.git |
Git status in file rows, Git menu items, the Git toolbar button and the Git workbench panel (needs Git for Windows) |
A bundled plugin can be disabled in Settings -> Plugins, but not removed.
Settings -> Plugins is an overview: it lists every plugin SumaFile found with its state, and each plugin has its own page under Plugins in the Settings navigation (also reached with the plugin's Open button). A plugin that needs your attention, such as one waiting for approval, carries a mark there.
On the overview:
- Install from file… installs a
.sfpluginpackage (a zip of a plugin folder) into the plugins folder. A package that would replace a bundled plugin is refused. - Rescan reads the plugins folder again, for example after you copied a plugin folder into it.
- Open plugins folder opens
<install folder>\plugins.
On a plugin's own page:
- Its publisher, version, state and signature state.
- An Enabled switch, or Review… while it waits for your approval.
- Its declared settings, and its own settings page if it has one. Settings save as soon as you change them. Settings search covers every plugin's declared settings and opens the page of the plugin that matches.
- Remove appears only on plugins you installed. It asks first, then deletes
the plugin's folder and its stored approval; the plugin's settings and its
plugins-datafolder are kept (uninstalling SumaFile deletesplugins-data).
Consent. Plugins run with your permissions; there is no sandbox. The first
time SumaFile finds a plugin it did not ship, it asks Enable plugin? and
shows the plugin's name, publisher, version, signature state (Signed · key
, Unsigned or Invalid signature), the permissions it declares and
whether it runs a background process. Keep disabled leaves it off until you
choose Review…. SumaFile asks again when the plugin's plugin.json, its
signature state or its folder changes, and after you install it from a file or
remove it.
Signatures. "Signed · key " means the plugin's files are
unchanged since they were signed with that key. It does not identify the
publisher: the key comes from the plugin's own plugin.json. A file in the
plugin's folder that its signature.json does not list makes the signature
invalid. SumaFile checks signatures when it scans the plugins folder (at
startup and on Rescan), not each time a plugin loads.
Where plugin files live. Every plugin file stays in SumaFile's installation folder:
<install folder>\plugins\<plugin id>\ the plugins, bundled and installed
<install folder>\plugins-data\<plugin id>\ each plugin backend's data and temporary files
<install folder>\plugin-approvals.json your Enable and Disable decisions
<install folder>\plugins.log plugin errors and log lines
Upgrades and reinstalls keep them; uninstalling SumaFile deletes them (see Install). Saved FTP/SFTP passwords are not in these files: they stay in Windows Credential Manager.
A plugin whose background process stops is listed as Stopped, and the status
center offers Restart. plugins.log has the details.
To write a plugin, start from the guide, docs/PLUGINS.md,
and the template in templates/sumafile-plugin.
Press F1 or Ctrl+/ in SumaFile for the live shortcut list.
| Shortcut | Action |
|---|---|
Ctrl+L / Alt+D |
Focus path bar |
Enter |
Open selected item |
Ctrl+Enter |
Open folder in new tab |
Alt+Enter |
Properties |
Alt+Home |
Go home |
Alt+Up |
Parent folder |
Alt+Left / Alt+Right |
Back / forward |
Backspace |
Back (when a file list has focus) |
F5 |
Refresh |
F6 |
Open or close second pane |
Tab |
Switch active pane when a file list has focus and dual pane is open |
Alt+1 / Alt+2 |
Focus left / right pane |
Ctrl+Shift+Left / Ctrl+Shift+Right |
Focus left / right pane |
Ctrl+T or Ctrl+N / Ctrl+W |
New tab / close tab |
Ctrl+Tab / Ctrl+Shift+Tab |
Next / previous tab |
Ctrl+1-Ctrl+9 |
Jump to tab; 9 means last tab |
F2 |
Rename |
Delete / Shift+Delete |
Recycle Bin delete / permanent delete |
Ctrl+C / Ctrl+X / Ctrl+V |
Copy / cut / paste |
Ctrl+Shift+C |
Copy path |
Ctrl+Shift+V |
Clipboard history |
Ctrl+A |
Select all |
Ctrl+Shift+N |
New folder (New text document is in the New menu) |
Ctrl+Z |
Undo |
Ctrl+Y / Ctrl+Shift+Z |
Redo |
Ctrl+Alt+C / Ctrl+Alt+M |
Copy / move to other pane |
Space |
Quick Look (when a file list has focus) |
Alt+P |
Show or hide the preview pane |
Ctrl+H |
Show or hide hidden/system files |
Ctrl+B |
Bookmark current folder |
Ctrl+Mouse wheel |
Change icon size |
Ctrl+F / F3 |
Focus the omnibar in Search mode |
Ctrl+Shift+P |
Command palette |
Ctrl+` |
Open terminal here |
Ctrl+, |
Settings |
Escape |
Close transient UI, clear filter, or clear selection |
| Tool | Version | Purpose |
|---|---|---|
| Windows | Windows 10 2004+ or Windows 11 x64 | Target platform |
| Node.js | Exact version in .node-version |
Root scripts and checks; run npm ci --ignore-scripts |
| Rust | Exact MSVC toolchain in rust-toolchain.toml |
simplefile-core, simplefile-ipc, simplefile-service |
| .NET SDK | Exact version in global.json |
WinUI solution and tests |
| Windows SDK | 10.0.19041+ | WinUI target platform |
| NSIS | Optional | NSIS setup executable |
| WiX v3 | Optional | MSI package |
| Bundled 7-Zip files | In repo (third_party/7zip/win-x64) |
Staged into the 7-Zip plugin folder for .7z archive operations and packaged payload checks |
git clone https://github.com/conniecombs/SumaFile.git
cd SumaFile
npm run devnpm run dev builds the Rust service and starts the WinUI app. To run the UI
against a specific service binary:
$env:SIMPLEFILE_SERVICE_PATH = "R:\path\to\simplefile-service.exe"
npm run dev:winuiUseful local-only overrides:
| Variable | Purpose |
|---|---|
SIMPLEFILE_SERVICE_PATH |
Use a specific simplefile-service.exe |
SIMPLEFILE_APP_DATA_DIR |
Redirect app data for fixtures or tests |
SIMPLEFILE_METADATA_DB |
Point settings/tags to a specific metadata database |
| Settings -> Plugins -> 7-Zip archives -> 7-Zip executable override | Use a specific 7-Zip executable (a file, or a folder holding 7zz.exe, 7z.exe or 7za.exe) instead of the plugin's bundled 7za.exe |
SUMAFILE_PLUGIN_ROOTS |
Semicolon-separated plugin roots that replace <install folder>\plugins (development and smokes; see docs/PLUGINS.md) |
SUMAFILE_PLUGIN_DATA_ROOT, SUMAFILE_PLUGIN_APPROVALS_PATH, SUMAFILE_PLUGIN_LOG_PATH |
Redirect the plugin data folders, the approvals file and plugins.log (smokes) |
SIMPLEFILE_UPDATE_MANIFEST_PATH |
Test updater metadata from a local file |
SIMPLEFILE_UPDATE_MANIFEST_JSON |
Test updater metadata from inline JSON |
SIMPLEFILE_7Z is no longer read. While it is set and the override is empty,
the 7-Zip plugin's backend logs a one-time warning that names the setting.
Run these from the repository root.
| Command | Purpose |
|---|---|
npm run dev |
Build service and run the WinUI app |
npm run build:winui |
Build the WinUI solution in Debug |
npm run check:winui |
Run the WinUI xUnit suite |
npm run check:winui-release-hash |
Verify production release artifact hashing |
npm run check:rust |
Rust format check, tests, and Clippy with warnings denied |
npm run check |
Repo guard scripts for IPC, identity, updater, workflows, packaging, and parity |
npm run check:release |
check + Rust checks + dependency audit |
npm run test:maintenance |
Failure classification, required gates, update/merge policy, and mocked PR recovery |
npm run maintenance:plan |
Offline preview of GitHub protection/settings; applies nothing |
npm run maintenance:toolchains |
Read-only preview from official toolchain release feeds |
npm run release:prepare -- VERSION |
Preview a coordinated release-version change; add --write to apply locally |
npm run build |
Build release payload/installers through the WinUI release script |
npm run release:build |
Local release pipeline alias |
npm run generate:ipc-bindings |
Regenerate schema-derived Rust/C# IPC bindings |
npm run smoke:winui |
Launch smoke for built payload |
npm run smoke:winui-ui |
Real WinUI rendering, large-folder measurements, layout, navigation, and cancellation checks |
npm run smoke:winui-file-ops |
File operation smoke |
npm run smoke:winui-msi |
MSI extraction/launch smoke |
npm run smoke:winui-installer |
NSIS install/launch/uninstall smoke |
npm run smoke:winui-upgrade |
Previous release to local installer upgrade smoke |
npm run smoke:winui-upgrade-from-ref |
Upgrade smoke from a specific Git ref |
SumaFile.exe
WinUI 3 desktop shell
panes, tabs, sidebar, dialogs, preview, transfers, settings
|
| length-prefixed named-pipe JSON-RPC
v
simplefile-service.exe
dispatcher, watcher, search, progress, cancellation, plugin archive engines
|
v
simplefile-core
file ops, archive, preview data, metadata, checksum, compare,
drives, tags, smart folders, updater, shell helpers
Important contracts:
- The app owns one service process per UI process.
- The service is tied to the UI process with a Windows job object, while files opened through the shell can outlive SumaFile.
- IPC contracts live in
ipc/schema/v1; generated Rust and C# bindings must remain synchronized. - Windows packaging must ship
SumaFile.exe,simplefile-service.exe,resources.pri, XBF files, and Windows App SDK dependencies together. - Runtime identity is SumaFile, while selected internal namespaces and compatibility paths intentionally keep the SimpleFile name.
SumaFile/
|-- src-winui/
| |-- SimpleFile.App/ WinUI window, dialogs, preview, toolbar, panes
| |-- SimpleFile.Core/ Workspace, settings, menus, transfers, preview helpers, layout state
| |-- SimpleFile.Ipc/ Named-pipe JSON-RPC client and generated bindings
| `-- SimpleFile.Tests/ xUnit tests for WinUI/core/IPC behavior
|-- crates/
| |-- simplefile-core/ Filesystem, archive, preview, metadata logic
| |-- simplefile-ipc/ Protocol constants, framing, schema tests
| `-- simplefile-service/ Rust named-pipe service process
|-- ipc/schema/v1/ JSON-RPC command, type, event, and golden files
|-- packaging/winui/ NSIS, WiX, and Windows assets
|-- scripts/ Checks, release scripts, smoke tests, codegen
|-- docs/ Roadmap, support, updater, release, migration docs
|-- build_notes/ Maintainer notes from hardening and migration work
|-- .github/workflows/ CI, release, release-build, installer smoke
|-- package.json Root command runner
|-- Cargo.toml Rust workspace
`-- LICENSE MIT License
Recommended local development gate:
npm run build:winui
npm run check:winui
npm run check:winui-release-hash
npm run smoke:winui-ui
npm run check
npm run check:rust
git diff --checkRelease-quality gate:
npm run check:release
npm run release:build
npm run smoke:winui
npm run smoke:winui-file-ops
npm run smoke:winui-msi
npm run smoke:winui-installer
npm run smoke:winui-upgrade| Gate | Coverage |
|---|---|
check:ipc-generated |
Generated Rust/C# IPC bindings match schema |
check:ipc-schema |
Schema, service dispatcher, and C# client stay aligned |
check:identity |
Current-facing files use SumaFile repository identity |
check:updater |
Updater URL, signature, and manifest wiring |
check:workflows |
GitHub Actions workflow surface |
check:provider-surface |
External account-backed storage surfaces remain out of scope |
check:windows-assets |
Windows app and packaging assets |
check:winui-packaging |
NSIS/MSI/release-script contracts |
check:winui-parity-gate |
WinUI parity rows remain PASS/WAIVED |
check:winui |
xUnit app/core/IPC tests |
check:winui-release-hash |
Production SHA-256 known vectors and artifact access/error behavior |
smoke:winui-ui |
Real Debug host/service rendering, virtualization, layout, selection, navigation, and cancellation; see runtime verification |
check:rust |
Rust fmt, tests, and Clippy |
check:security |
Rust dependency audit |
Installer and upgrade smokes are slower by design. Use them before shipping release assets or changing packaging/update behavior.
Release outputs are written under dist/winui/ by
scripts/build-winui-release.ps1.
| Output | Contents |
|---|---|
payload/ |
Runnable unpackaged app folder |
SumaFile_<version>_x64-winui-portable.zip |
Portable package |
SumaFile_<version>_x64-winui-setup.exe |
NSIS per-user installer |
SumaFile_<version>_x64-winui.msi |
MSI package |
latest-winui.json |
Signed updater manifest |
Version fields that must stay synchronized:
src-winui/Directory.Build.props:<Version>and<InformationalVersion>crates/simplefile-core/src/lib.rs:APP_DISPLAY_VERSIONcrates/simplefile-core/Cargo.tomlcrates/simplefile-ipc/Cargo.tomlcrates/simplefile-service/Cargo.tomlCargo.lockand NuGet project-reference lock entriessrc-winui/SimpleFile.App/app.manifestand the NSIS numeric fallback- README badges and install artifact names
docs/CHANGELOG.md
Git release tags use vMAJOR.MINOR.PATCH, for example v1.0.3.
Before creating a release tag:
- Confirm the version fields above match.
- Run
npm run check:release. - Run the WinUI smoke commands required by
docs/RELEASE_1.1.0.md. - Confirm the Installer Smoke workflow succeeds on the release commit.
- Merge the version bump, then tag the merged commit or start a new Release run from the updated
main.
More detail lives in .github/RELEASE.md and docs/UPDATER_RELEASE.md.
| Document | Use it for |
|---|---|
| docs/CHANGELOG.md | Current and historical changes |
| docs/ROADMAP.md | Near-term priorities and branch scope |
| docs/FEATURE_OPPORTUNITIES.md | Candidate product gaps and recently closed gaps |
| docs/CONTRIBUTING.md | Contributor workflow and expectations |
| docs/PLUGINS.md | Writing SumaFile plugins: plugin.json, contributions, the SDK, the backend protocol, signing and packaging |
| docs/CI_MAINTENANCE.md | Pinned toolchains, bounded repair, update PRs, merge gates, and separate activation steps |
| docs/SUPPORT.md | Useful details for reports |
| docs/SECURITY.md | Vulnerability reporting and sensitive-file rules |
| docs/UPDATER_RELEASE.md | Signed updater releases |
| docs/RELEASE_1.1.0.md | Changes since v1.0.4: the plugin system, what changed for Git, FTP/SFTP and 7-Zip, upgrading and known limitations |
| docs/RELEASE_1.0.4.md | Changes since v1.0.3, upgrade instructions and release checklist |
| docs/RELEASE_1.0.3.md | Changes since v1.0.2, upgrade instructions and release checklist |
| docs/RELEASE_1.0.2.md | Complete 1.0.1 → 1.0.2 release notes, upgrade guidance and checklist |
| docs/RELEASE_1.0.1.md | Historical 1.0.1 release checklist |
| docs/RELEASE_1.0.0.md | Historical 1.0.0 release checklist and dogfood plan |
| .github/RELEASE.md | Release process |
| src-winui/README.md | WinUI host build/run notes |
| docs/winui-migration/ | Historical migration architecture and parity records |
- Do not commit updater private keys, signing keys (including plugin signing
keys,
*.pem),.envfiles, local secrets, personal settings exports, or logs containing private paths. - Plugins run with your permissions and without a sandbox; see Plugins in docs/SECURITY.md.
- Gitignored sensitive locations include
.secrets/,*.key,.env, and.env.*. - Archive extraction validates destination paths before writing.
- TAR extraction skips links and special entries.
- Open With refuses executable/script payload files as launch targets.
- Report vulnerabilities through docs/SECURITY.md.
- SumaFile 1.1.0 is Windows-only.
- Installing SumaFile for the first time is manual; in-app update installation requires a
newer published release with signed
latest-winui.jsonmetadata. - RAR archives can be listed and extracted, but RAR creation and in-place RAR rewrites are not supported.
- Account-backed storage integrations are intentionally out of scope for this branch. FTP/FTPS/SFTP profiles are available in the FTP/SFTP plugin's separate manager window, not mounted into the main panes.
- Rendered Markdown task-list checkboxes are read-only preview controls; editing task state requires editing the Markdown source.
- Some Windows-reserved shortcuts may not be assignable; shortcut remapping, import, and export live in Settings -> Shortcuts.
- Inline rename is available in the Details view; List, Tiles and Content views still open the rename dialog.
When reporting an issue, include:
- Windows version
- SumaFile version from Settings -> About or the About dialog
- Whether you used the setup executable, MSI, portable ZIP, or a dev run
- The exact path/workflow where the issue happened, with private path segments redacted if needed
- Relevant snippets from
%LOCALAPPDATA%\SumaFile\startup.log - Relevant snippets from
%LOCALAPPDATA%\SumaFile\operations.jsonl - Whether
npm run smoke:winui,npm run smoke:winui-file-ops,npm run smoke:winui-msi, andnpm run smoke:winui-installerpass locally when the issue involves install, startup, updates, or filesystem operations
See docs/SUPPORT.md for the full support checklist.
SumaFile is open-source software licensed under the MIT License.
Copyright (c) 2024-2026 conniecombs.
Third-party libraries remain governed by their own license terms. Bundled 7-Zip
console files are distributed with their upstream license in
third_party/7zip/win-x64/License.txt.
An installed SumaFile ships that License.txt beside the 7-Zip files in
plugins\com.sumafile.sevenzip.


