English | 简体中文
A Windows file viewer built around one fairly ordinary annoyance: there is always some file on your machine — a PDF, a DOCX, an Excel sheet, a PSD, an archive, a video — and opening it means installing yet another suite of software first.
OmniView is my attempt to make that part simpler. One native window, a small core, and optional plugins for the formats that need more than the core can reasonably carry.
It is not a replacement for Office, Photoshop, or AutoCAD. It is a viewer: open the file, look at it, check the contents, move on. For real editing, use the tool that is actually good at editing.
The latest build is on the Releases page.
Download OmniView-Setup.exe and run it. It extracts the core to:
%LOCALAPPDATA%\OmniView\0.3
and starts the app.
The first launch asks you to pick an interface language. Your files are always displayed in their original language; only the UI is translated.
The core handles PDF, plain text, code, images, audio/video, archives, and SQLite. If that is all you need, you can stop here.
The release also contains separate .ovp packages:
office.ovp DOCX / XLSX / PPTX / ODT / ODP / RTF
ebook.ovp EPUB / MOBI / AZW3
data.ovp Access / DBF / HDF5 / ONNX / PT / PKL / TFLite / mail stores
pro.ovp STL / OBJ / GLB / DXF / SHP / KML / GPX / EXE / ELF / fonts
raw.ovp PSD / AI / camera RAW
hello.ovp a small example of a user-made plugin
The easiest path is to double-click Install-All-Plugins.cmd. It closes any running OmniView instance, installs the plugins next to it into:
%LOCALAPPDATA%\OmniView\plugins\
and starts OmniView again.
You can also install one plugin at a time:
- Open a file that needs it and click Install from .ovp file…
- Or open Help → Plugin Manager… → Install .ovp…
- Or drag an
.ovpfile into the OmniView window
A few practical notes:
- Installing/updating closes the running OmniView. Save any edited text first.
- The build is not code-signed, so Windows SmartScreen may say “Unknown publisher”. Use More info → Run anyway.
- Do not install plugins you do not need.
The core does not rely on Office, WPS, Photoshop, AutoCAD, 7-Zip, or FFmpeg being installed on the machine.
- PDF: native PDFium rendering, page navigation, zoom, fit-to-width
- Text/code: encoding detection, syntax highlighting, editing for ordinary text files
- Images: PNG, JPEG, GIF, WebP, TIFF, BMP, ICO, SVG, and more
- Audio/video: decoding through Qt's bundled FFmpeg
- Archives: ZIP, 7Z, RAR, TAR, ISO, and others via a bundled 7-Zip
- SQLite: open a database and inspect tables and rows
Plugins add:
- Office documents: DOCX, ODT, RTF, XLSX, PPTX, ODP
- E-books: EPUB, MOBI, AZW3
- Data and models: Access, DBF, HDF5, ONNX, PT, PKL, TFLite
- 3D/CAD/GIS: STL, OBJ, GLB, DXF, SHP, KML, GPX
- RAW/PSD: camera RAW, Photoshop PSD, AI
The honest part:
- DOCX and PPTX are reflowed natively. They are not pixel-identical to Word or PowerPoint page layout.
- DWG currently exposes headers, version, and embedded strings. DXF is rendered properly.
- STEP, BLEND, SKP, and PST are structural/metadata views, not full professional kernels.
- Video seeking depends on the file's index. A damaged or index-less stream may only play sequentially.
The first version was a 105 MB single executable with everything inside.
It worked, but it had two problems:
- every user paid the size cost for formats they never opened;
- changing one dependency meant shipping the whole thing again.
The current version is split into three layers:
- Core: native window, PDF, text, images, audio/video, archives, SQLite
- Plugins: Office, e-books, data, 3D, RAW — independent packages
- Setup: a self-extracting launcher that unpacks the core on first run
The extracted core is about 186 MB; the setup is about 62 MB. Plugins range from roughly 1 MB to 25 MB, and you only install the ones you want.
This is where most of the engineering time went.
Text files over 8 MB are no longer loaded into the editor as one string. OmniView uses mmap and decodes a window of roughly 2 MB at a time.
Previous/next chunk and percentage jumps are available. Only the current window lives in the editor.
A 30 MB log may hold 1–2 MB of characters in the widget; a 500 MB file does not become one giant Python string.
A normal .xlsx goes through openpyxl. If the file is over 8 MB, or the active sheet has more than 20,000 rows, OmniView switches to a streaming viewer instead.
The streaming path reads the worksheet XML in row windows (300 rows at a time), keeps shared strings in a disk-backed SQLite index, and never builds a QTableWidgetItem for the whole workbook. It shows values, not the full cell styling.
Jumping to a distant row still has to scan from the start of the sheet XML. It is slower than a normal workbook, but it should not consume gigabytes of RAM.
Playback uses Qt's QMediaPlayer as a stream. Nothing is transcoded and the whole video is not cached in memory.
Whether a very long video seeks well depends on the container and its index, not just the duration. A damaged stream without an index can only play in order.
Only pages near the current viewport are rendered. The whole document is not rasterized on open.
The listing comes from 7-Zip; an entry is extracted to cache only when you open it.
The first launch asks which interface language you want.
The list includes the six UN official languages plus languages with more than 30 million speakers — 58 entries in total.
The translation status is uneven, and I would rather say so:
- Complete catalogs:
en / zh / fr / es / ru / ar - The rest currently fall back to English and are marked
English fallbackin the picker
Catalogs are plain JSON:
omniview/locales/<code>.json
You can contribute through a PR, or drop a file into:
%LOCALAPPDATA%\OmniView\locales\<code>.json
Only the interface is translated. File contents are never translated.
An .ovp is just a zip:
myplugin.ovp
plugin.json
plugin.py # optional custom viewer
site-packages/ # optional dependencies
plugin.json:
{
"id": "hello",
"name": "Hello Viewer",
"version": "1.0.0",
"formats": ["hello"],
"entry": "plugin.py",
"factory": "create_viewer"
}plugin.py returns a ViewerBase:
from omniview.ui.common import ViewerBase
class HelloViewer(ViewerBase):
...
def create_viewer(path, parent=None):
return HelloViewer(path, parent)A working template is in the repo:
python build_ovp.py --template plugins/hello
python build_ovp.py --source plugins/hello --out plugins/hello.ovpInstall hello.ovp, then open a .hello file to see it in action.
The full format reference is in docs/PLUGIN_FORMAT.md.
OmniView does not exit silently, and it does not just show a modal and forget about it.
It opens a red Unable to parse this file tab with:
- the file path
- the plugin id
- the full traceback
- Copy error
- Open Plugin Manager
- Open file location
If the plugin is missing, you get a separate page with the plugin size, an install button, and Install from .ovp file….
pip install -r requirements.txt
python app.pyThe core does not need the plugin dependencies.
pip install -r requirements.txt -r plugin_requirements.txt -r dev-requirements.txt
python build_office_plugin.py
python build_plugins.py
.\build_core.ps1
.\build_setup.ps1Output:
release\OmniView-Setup.exe
plugins\*.ovp
Building the setup requires 7-Zip on the machine, or:
$env:SEVENZIP = "C:\path\to\7z.exe"Pushing a v* tag lets GitHub Actions build and publish the release.
Run packaging\Uninstall.cmd, or delete:
%LOCALAPPDATA%\OmniView\0.3
Plugins are kept by default in:
%LOCALAPPDATA%\OmniView\plugins
Delete that directory too if you want a clean removal.
- DOCX/PPTX will not match Office page-for-page.
- DWG is still a metadata view; full DWG needs a LibreDWG plugin.
- STEP/BLEND/SKP/PST are structural views.
- Video seek depends on the file index.
- Very large text is read-only chunked mode; it does not edit the original file in place.
- Plugins are not signed or sandboxed.
.ovpfiles execute Python code; only install ones you trust. - Plugin checksums, delta updates, and crash reporting are still on the list.
- Core and original plugin code: FSL-1.1-ALv2, converting to Apache-2.0 after two years. Full text in LICENSE.
ebook.ovpcontains GPL-3.0mobi/KindleUnpack and GPL-2.0unidecode; the plugin package as a whole is distributed under GPL-3.0-compatible terms.data.ovpcontains GPL-3.0extract-msgandRTFDE; the plugin package as a whole is distributed under GPL-3.0-compatible terms.office.ovp,pro.ovp, andraw.ovpuse mostly MIT/BSD/Apache dependencies. Qt/PySide6 is LGPLv3; 7-Zip is LGPL.- Full third-party notices and bundled plugin licenses: THIRD_PARTY_NOTICES.md.
The FSL core and the GPL plugins are separate components. Do not describe the whole release as FSL or MIT.


