Windows · Linux · macOS · Edge, Chrome, Firefox

Double-click.
It just runs.

Fenestra is a tiny local server that turns any dist/index.html into a working site in your browser. No terminal, no extension, no custom browser.

~120 KB MIT license no .NET SDK one file, no installer

Any system? Compile it yourself →

The problem

The problem is the origin, not the file

Modern builds use ES modules. Under file:// the browser treats the page as an opaque origin: modules are blocked by CORS, /assets/... resolves to the root of the drive, and service workers do not exist. The file is fine. The origin is not.

file://

What happens when you double-click a build today:

  • Module scripts blocked by CORS
  • Absolute paths point at the drive root
  • No service worker, no manifest, blank page

http://127.0.0.1

What happens when Fenestra serves the same folder:

  • Modules load, exactly like production
  • SPA routes survive a refresh
  • Same tab, same profile, your browser

How it works

Three steps, none of them yours

Fenestra attaches itself to the double-click and decides what the file needs.

01

You open the file

Double-click it, drag the folder onto the executable, or pass a path on the command line.

02

Fenestra decides

It reads the HTML. Needs an HTTP origin? It starts a server on a stable port. Does not? It opens the file directly.

03

Your browser shows it

A normal tab, in your window, with your profile, your extensions and your address bar.

What is inside

Everything that is inside

The same behavior the manual explains, item by item.

Stable port per folder

The same origin every run: localStorage, cookies and the service worker survive.

SPA fallback

Extensionless routes fall back to index.html, so refresh works.

Plain HTML, no server

Files that do not need an origin open directly, without a server.

Source builds detected

An entry under /src/ serves the sibling dist/, build/ or out/.

Path confinement

Parent paths, drive tricks and hidden files are rejected or 403.

Browser picker

Edge, Chrome, Firefox, Brave, Vivaldi, Opera, Chromium and Safari.

Offline manual

Embedded in the executable, seven languages, opened with --manual.

No background daemon

Stops with the browser it started, or after 4 idle hours.

No cookies or telemetry

The only thing stored is the language you choose.

One-time update tab

A static version.json is checked once a week; one tab per version, dismissible.

Platforms

One idea, three systems

Same job everywhere: turn a folder into localhost and open it in your browser. The packaging changes because each system has its own rules.

Windows .exe

A single ~120 KB executable. No installer, no runtime — .NET Framework 4.8 already ships with Windows.

  • Download Fenestra.exe and run it, or make it the .html handler.

Every release also ships the complete source as zip and tar.gz. Nothing here is closed.

Install

One file. No installer.

Pick the package for your system. Every one of them is a single file — no installer, no runtime.

Windows

The ~120 KB .exe above runs as-is. No installer, no runtime.

The binary is not code-signed yet, so Windows SmartScreen will ask for confirmation once.

Linux

One static binary, no Wine, no runtime. Download fenestra-linux-amd64 and run it with chmod +x.

macOS

No prebuilt binary: notarization costs US$ 99/year. The macos/ folder is a build kit — install Go, run one command.

Browser

Pick the browser, once

Fenestra opens a normal tab in the browser you choose. The choice is saved and applies to every double-click from now on.

Fenestra reads the system default browser on every open (the http association), so changing it in Windows is picked up immediately. Nothing is stored unless you pin a browser in settings.

Double-click Fenestra with no file to open this screen again.

# Windows
Fenestra.exe --browser edge

# Linux / macOS
fenestra --browser edge

See what is installed with --browsers.

# Windows
Fenestra.exe --browser chrome

# Linux / macOS
fenestra --browser chrome

See what is installed with --browsers.

# Windows
Fenestra.exe --browser firefox

# Linux / macOS
fenestra --browser firefox

See what is installed with --browsers.

# Windows
Fenestra.exe --browser brave

# Linux / macOS
fenestra --browser brave

See what is installed with --browsers.

# Windows
Fenestra.exe --browser vivaldi

# Linux / macOS
fenestra --browser vivaldi

See what is installed with --browsers.

# Windows
Fenestra.exe --browser opera

# Linux / macOS
fenestra --browser opera

See what is installed with --browsers.

# Windows
Fenestra.exe --browser chromium

# Linux / macOS
fenestra --browser chromium

See what is installed with --browsers.

# macOS only
fenestra --browser safari

Safari is available on macOS only.

Use the system default

With --browser default, the operating system decides. To change what that means:

  • Windows: Settings → Apps → Default apps → choose your browser.
  • macOS: System Settings → Desktop & Dock → Default web browser.
  • Linux: xdg-settings set default-web-browser firefox.desktop

Stored in %LOCALAPPDATA%\Fenestra\browser.txt (Windows), ~/.config/fenestra/browser (Linux) and ~/Library/Application Support/Fenestra/browser (macOS).

Security

Local means local

Loopback only, no telemetry, no accounts, no remote code. It serves the folder you opened and nothing else — but every file under that folder is reachable, including dotfiles.

Do not point Fenestra at a directory that contains secrets. The full threat model is in SECURITY.md in the repository.

Honesty

What it does not do

Honest boundaries, in one place.

  • No backend or API proxy — Fenestra serves files only.
  • No source compilation — use the project's own dev server.
  • No TLS or authentication — localhost only.
  • No notarized macOS app — the build kit compiles one locally.
  • Unsigned binaries — SmartScreen and Gatekeeper may warn once.

Next

Audit, use, compile

The source archive at the tag, build scripts for every system, and checksums for every asset.

If it is useful to even one person, it was worth it.