DEV Community

Leandro Benedet
Leandro Benedet

Posted on

Show HN: Fenestra – double-click a local dist/index.html and it opens over localhost

I built Fenestra because I kept opening a terminal just to serve a static build.

Modern builds use ES modules. Under file:// the browser blocks modules by CORS,
absolute paths point at the drive root, and service workers do not exist. The
usual fix is a terminal and a static server. Fenestra removes that step: it is
the static server, attached to the double-click.

Double-click an index.html (or drag a folder onto the executable) and Fenestra
serves that folder on 127.0.0.1, on a stable port, and opens a normal tab in
your browser. No Electron, no Node, no extension, no custom browser window.

What it does:

  • Windows: a ~120 KB .exe, .NET Framework only, no installer.
  • Linux/macOS: a single static Go binary; Homebrew for the macOS CLI.
  • Stable port per folder, so localStorage, cookies and service workers survive.
  • SPA fallback for extensionless routes.
  • Path confinement: parent paths, drive tricks and hidden files are rejected.
  • Browser picker: Edge, Chrome, Firefox, Brave, Vivaldi, Opera, Chromium, Safari.
  • Offline manual embedded in the executable, in seven languages.
  • No cookies, no analytics, no telemetry.
  • A static version.json is checked once a week; if there is an update, it opens one dismissible tab per version.

Status: 1.1.0. It is functional, but I will not pretend it is finished. Honest
rough edges:

  • The binaries are not code-signed; SmartScreen/Gatekeeper will ask once.
  • macOS has no notarized app; the build kit compiles one locally.
  • It serves static files only: no backend, no API proxy, no TLS/auth.
  • Some translations are community-made and not yet reviewed by native speakers.
  • There are still a few bugs I am fixing as they are reported.

Links:

I would really appreciate feedback on:

  1. The Windows "set as default" flow – is it clear enough?
  2. The macOS build kit – does it work for you?
  3. Anything that broke or confused you in the first five minutes.

If this is useful to even one person, it was worth building. Thanks for reading.

Top comments (0)