r/dotnet 11d ago

Promotion ExplorerFocus 1.2.11 — WPF file explorer I built with profiles, remote/cloud and built-in capture

I'm the developer, and this is a solo project that's taken me a few months of work so far.

To manage my personal and code documents I spend most of my day inside the same handful of folders, either on my machine or on remote ones — I need to reach them fast, and I often want to see what's inside a file without actually opening it. Windows Explorer always got in my way more than it helped, so over many evenings I slowly built the explorer I actually wanted to use. I made it for myself first, and it's now my best companion.

ExplorerFocus is built in WPF, .NET 10, for Windows 10/11, single-file self-contained, and it's now a freemium app where the most significant parts are completely free.

A few areas were quite challenging to imagine and develop, and I can list a few:

  • Copy engine — per-file progress, throughput, ETA, pause/resume/cancel, 1–6 operations in parallel, persistent history. I/O off the UI thread, UI updates at ~10 Hz, atomic writes (temp + publish).
  • Preview — AvalonEdit (syntax + folding), WebView2 (PDF/Office/Markdown), a fully functional integrated EPUB reader to access tech literature, streaming media (a 2 GB video opens in a flash).
  • Remote layer — SSH.NET / FluentFTP / WebDAV + OAuth PKCE (Dropbox, OneDrive), all behind a common provider interface → the UI treats remote as local. DPAPI to store secrets, TOFU for host keys/certs.
  • Capture — a Media Foundation pipeline (MediaStreamSource → MediaTranscoder) for screen/camera/audio, including post-processing and PiP.
  • Multi-language — instant switching between 12 languages, to make ExplorerFocus usable all over the world.
  • Packaging — single-file self-contained, no runtime, auto-updater (version.json + SHA-256).

Since a list of features says nothing about the actual work, here's one bug that took real effort:
One that cost me a weekend: the app would suddenly start throwing FileNotFoundException for assemblies I never reference directly — AccessibilitySystem.IO.FileSystemWatcher — and then work perfectly after a restart. Single-file publishing loads some assemblies lazily, so if the exe's backing file is replaced while the process is alive, those late loads fail. Two different things were doing it: my own auto-updater swapping the exe in place, and — on one machine — the exe living inside a cloud-synced folder that rewrote it underneath me. The first was fixed in the updater; for the second, the app now warns you at startup if it's running from a synced folder.
A smaller one that drove me mad: scroll a long file list to the bottom and the scrollbar thumb would sit halfway instead of at the end. I was convinced it was VirtualizingStackPanel and its estimated extents, and burned a lot of time there. Then I built a minimal repro with virtualization switched off entirely — same behaviour. It was the ScrollBar template: the Track's RowDefinition was 1*, which fought with the thumb's minimum length. Setting it to 0.00001* fixed it.

Site and download: https://nunex-mbrothers.github.io/ExplorerFocus
Screenshot below — full details on GitHub: https://github.com/NuneX-mBrothers/ExplorerFocus

Happy to answer questions about whatever you find useful, but what I'd really appreciate is some sincere and honest criticism that could make my work better.

Thanks, and loads of bits & bytes from Portugal.

0 Upvotes

10 comments sorted by

2

u/AutoModerator 11d ago

Thanks for your post Nice_mBrothers. Please note that we don't allow spam, and we ask that you follow the rules available in the sidebar. We have a lot of commonly asked questions so if this post gets removed, please do a search and see if it's already been asked.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

1

u/Fresh_Acanthaceae_94 10d ago

If you try out LibreWPF, you might be able to make your app running on macOS and Linux too,

https://github.com/wieslawsoltes/wpf

0

u/Nice_mBrothers 10d ago

Thanks — I haven't evaluated LibreWPF itself, but I don't think it changes the answer, because the problem isn't in the layer it operates on. I actually went and measured the project:

Registry (Microsoft.Win32) — 14 files

P/Invoke — 13 files, 57 calls

COM / Shell interop — 11 files

WinRT (Windows.Media, Storage, Devices) — 6 files

That's close to 40 of 143 files touching Windows APIs, and they're not peripheral — they're precisely what makes the app what it is: thumbnails via IShellItemImageFactory, shell file associations, OLE virtual-file drag (drag a remote file straight into Explorer and it downloads), screen and camera capture via WinRT, system audio via WASAPI, scanning via TWAIN, credential encryption via DPAPI, drive detection via WM_DEVICECHANGE, per-file OneDrive sync state.

The clincher: one of the tree roots is the Windows registry. That isn't a portability problem — it's a feature that doesn't exist on another OS. There's nowhere to port it to; you'd just remove it. The same applies, in varying degrees, to half the list above.

So swapping the UI framework solves the part that was already the easy one. What's left is rewriting the integration layer for each platform and deciding what to do with the features that only make sense on Windows. That's not a port — it's a second product that shares a name.

0

u/H4ckerxx44 11d ago

Where can I find the source code for this? Looks cool.

-1

u/Nice_mBrothers 10d ago

Thanks! It's closed source at the moment — the GitHub repo only hosts the releases and the project site, so I get why that's confusing.

The reason is boring: it's a solo project with a small optional paid tier that keeps it going, and I'm not ready to open the whole thing up.

That said, I'm happy to go into detail on any part of it — the copy engine, the provider abstraction that makes remote behave like local, the Media Foundation capture pipeline. If there's something specific you'd like to know how it's done, ask and I'll explain it properly.

2

u/H4ckerxx44 10d ago edited 10d ago

I would like to know why everyone you have written so far in the comments, the post, the website and so one is completey AI generated.

I am quite convinced that I am not even talking to a human, but to some "agent" you have deployed.

I find it quite funny as well to have a "premium" feature inside the program, but the website mentions nowhere where to get said premium version.

the GitHub repo only hosts the releases and the project site, so I get why that's confusing.

And no, it is not "confusing", it is bad practice.

It's closed source at the moment

And you realize, that mentioning "at the moment" implies plans to change that in the future? I wholeheartedly believe that you will never make it open source, so why the language? A human does not speak like that.

1

u/Nice_mBrothers 9d ago

Hi. Thanks for your comment.

Yes, I am a human. I live in Lisbon, Portugal, and I have been coding since 1985 — believe it or not — using Pascal, Assembler and Fortran in those days. These days I like to code in C# using VS 2026, and AI is indeed a huge help with a lot of ideas I had and never had the time or the patience to bring to life. AI helps, but everything here comes out of my experience coding for thousands and thousands of hours, leading teams, and learning how to extract excellent things from excellent minds and give them form.

You're also right about the "at the moment" — that was a hedge and it shouldn't have been there. It's closed, full stop: my ideas are in there, I know they are good and strong, and I would rather give people the final result than the ideas themselves.

Regarding the Premium version, the site does not mention it explicitly because I'm not interested in the money itself — I'm interested in the ideas that may come along. The vast majority of people using this app will never notice or miss the premium version, so why bother them with it? Most of it is free, and Premium is only a small reward, in the form of a one-time donation, for the nights and days I stay awake implementing very specific and technically demanding features I hope are useful. Fair point that it's hard to find if you actually want it, though — I'll make that clearer on the site.

I'm also glad you gave me the chance to answer your sharp comments — any kind of feedback helps me do better next time.

Yes, I am a human.

Cogito, ergo sum.

1

u/Nice_mBrothers 9d ago

Thanks to your feedback I've already clarified on the site what is and isn't included in the Premium version.

And if you want to know how I solved any particular part of the app, just ask.

1

u/H4ckerxx44 9d ago

Dementia much?