Dameview
A fast, modern image viewer for Windows.
A single <4 MB executable that starts in ~100 ms.
Install
Features
- Tabs
- Split view with any number of panes
- Command palette (Ctrl + Shift + P)
- Gallery panel for the open folder
- Animations
- Color themes
- Built-in installer and updater
- Tiled rendering for large images
Tech stack
- .NET 10
- Native AOT for Windows x64
- Raw Win32 window and message loop
- Direct2D through Vortice.Windows
- WIC for image decoding
- Custom-drawn UI
More in ARCHITECTURE.md.
Preview
https://github.com/user-attachments/assets/677feaf6-f3dd-442b-a480-fc2a9d779cc4
Motivation
I was struggling to find an image viewer that is both fast and has a nice, modern UI. Upon trying a 3rd party file manager File Pilot, I realized that modern software does not have to feel like shit. So I wanted to achieve a similar feeling in an image viewer, which is a piece of software I use a lot.
This project started only as an experiment out of curiosity. Pretty much all of the code is AI-generated, with me driving the architecture, but letting the agent generate the actual implementation. It's {{current_year}}, after all.
My main constraint is having a single executable that's at most 5 MB. Choosing .NET for this might not be smartest, but since C# is the language I know best, and it supports compiling into a native binary via Native AOT, it seemed like the best choice for me. Ideally, the app would be cross-platform, but the binary would likely have to grow quite a bit because I am "cheating" a bit by using WIC for decoding images, not requiring libraries like ImageSharp. For the rendering I initially wanted to go with Raylib, but ended up going with Direct2D because Raylib has some quirks I am not a fan of, and it is not as easy to compile into a single binary. The remaining functionality like window management is done via Win32 APIs, even including the HTTP calls for the built-in updater because referencing System.Net.Http adds like 2 MB.
This is an app made specifically for me, no one else. However, I open-source my personal projects because there might be people who might find them useful.
Run
dotnet run --project src/Dameview
Command line
Dameview.exe [path]
Dameview.exe --install [--silent]
Dameview.exe --uninstall [--silent]
path opens an image or folder.
--install opens the installer, which installs to %LOCALAPPDATA%\Programs\Dameview. Running a non-installed executable without arguments does the same.
--uninstall opens the uninstaller.
--silent installs or uninstalls without UI.
With dotnet run, pass arguments after --:
dotnet run --project src/Dameview -- "C:\path\to\image.jpg"
Publish
dotnet publish src/Dameview -c Release
Code style is defined in .editorconfig and enforced by the built-in .NET analyzers. Use dotnet format to apply it.