All systems nominal

Mission control for everything you watch.

FLIGHT DECK is a dashboard framework where every widget is a folder. Drop one in, drag it where you want it, and it stays live — weather, markets, servers, feeds, your whole homelab. No build step. No dependencies. Nothing between you and the code.

Vanilla ES modulesNode 18+Self-hosted

48modules in the box
0dependencies. Not one.
6preset decks, one click each
5breakpoints, phone to wall

Features

Built like an instrument panel. Light enough to carry.

Everything you'd expect from a polished dashboard, with none of the weight. Open the source and every line is readable — because there's nothing compiled, bundled or hidden.

No build step. No dependencies.

Vanilla ES modules served by a zero-dependency Node server. Clone it, start it, done. There is no node_modules — and there never will be.

$ npm run dev
  ╭───────────────╮
  │  FLIGHT DECK  │
  ╰───────────────╯
     http://127.0.0.1:5173/?dev=1
     presets   6 available
     dev mode  on — modules hot-reload on save
$ ls node_modules
  ls: cannot access 'node_modules': No such file or directory
$ 

Every widget is a folder.

A manifest and a script. Copy one, rename it, share it.

modules/
├─ weather/
├─ markets/
├─ your-idea/
│  ├─ module.json
│  └─ module.js

A grid that thinks.

Drag, resize, collide, reflow. Phone layouts are stored separately, so a quick check on mobile never wrecks your desktop.

⌘K to anything.

Modules, profiles, presets, widgets, themes — type a few letters and go. Try it on this page.

Whole decks, one click.

Six presets ship in the box. Applying one makes a new profile — nothing you built gets overwritten.

◆Morning◆Mission Control◆Developer ◆Markets◆Focus◆Wall Display

Secrets never touch the browser.

Modules ask for {{secret.NAME}}. The server fills it in on the way out, so your keys stay on the machine that holds them.

Bearer {{secret.GITHUB_TOKEN}} Bearer ghp_•••••••• BROWSER · SERVER-SIDE SUBSTITUTION · UPSTREAM

Failures that explain themselves.

When something breaks, the widget says what, why and how to fix it — with a code you can copy. The rest of the deck keeps flying.

FD-SYSTEM-STATUS-AUTH This browser is not signed in to the deck

HTTP 401 wrong-token

The token changed while this page was open. Open the new ?k= link, or set FD_AUTH_TOKEN to keep one.

Runs where you need it.

Same deck, three ways to fly it.

On your machineOne double-click on Windows, one command on macOS and Linux.
On a serverDocker Compose for Linux hosts, with token auth when it's exposed beyond localhost.
On the wallA display mode with big type and no chrome, readable from across the room.

The hangar

Off-the-shelf modules, ready to fly.

A curated dozen from the box. Most need no API key at all — add them and they light up.

☁Environment

Weather

Current conditions and a short forecast from Open-Meteo, for your deck's location or anywhere else.

  • no key
◉Environment

Weather Radar

Animated precipitation radar over a slippy map. Watch the storm before it reaches you.

  • no key
◍Environment

Aurora

Geomagnetic activity from NOAA — Kp now, the three-day forecast, and the odds where you are.

  • no key
◴Time

World Clocks

Every timezone you care about at a glance, with day and night and the offset from you.

  • offline
▦Time

Calendar

Agenda and month views from any .ics feed — Google, Outlook, Fastmail, Nextcloud.

  • any .ics
◪Finance

Markets

Shares, indices, currency pairs and crypto in one watchlist, with intraday sparklines.

  • watchlist
≋Feeds

Feed Reader

RSS and Atom merged into one timeline, with read tracking. Your news, your sources.

  • no key
◐Development

GitHub

Repo stats, recent commits, open issues and PRs, and CI status — the pulse of a project.

  • token optional
◈Development

Service Status

Live status of the services you depend on, read straight from their own status pages.

  • no key
▤System

Docker

Containers on the host: state, ports, CPU and memory. Read-only, through a socket proxy.

  • needs server
⠿Homelab

Tailscale

Your tailnet at a glance: keys about to expire, routes nobody approved, and who's online.

  • API key
▩Productivity

Habits

Contribution-style squares for anything you tick off daily. Entirely local, entirely yours.

  • offline
+36

More in the box — Pi-hole, Home Assistant, Jellyfin, Sonarr & Radarr, uptime monitoring, Hacker News, YouTube and more.

Build your own

A new widget is two files.

The module API hands you everything: data sources with caching and polling, settings forms generated from your manifest, a shared context, and lifecycle helpers that clean up after themselves.

  1. Copy the template. modules/_template is annotated end to end.
  2. Describe it in module.json. Size, settings and data sources — the deck builds the UI.
  3. Render it in module.js. Save the file and hot reload puts it on the deck.
// A working clock. This is the whole module.
export default {
  setup(ctx) {
    ctx.interval(() => this.paint(), 1000);  // pauses when hidden
  },
  render(ctx) {
    ctx.el.replaceChildren(this.out = ctx.h('div.fd-stat-value'));
    this.paint();
  },
  paint() {
    if (this.out) this.out.textContent = new Date().toLocaleTimeString();
  },
};

Quick start

Cleared for takeoff soon.

FLIGHT DECK isn't public yet. When it ships, starting it is one command — it needs Node 18 or newer and nothing else.

Windows PowerShell

> .\start.cmd

macOS & Linux bash / zsh

$ ./start.sh

Your browser opens on http://localhost:5173. Pick a preset and you're flying. Running it on a Linux server instead? It ships with a Docker Compose setup.

Flight plan

Where it's headed.

Shipped

  • Docker deploymentA long-lived service on any Linux host, with nightly backups.
  • Token authExpose a deck beyond localhost without opening it to everyone.
  • Credential healthSee which keys are set, verified, or about to bite.

Next

  • Credential vaultRotate a key from any browser, not just the machine that holds it.

Later

  • OAuth in the proxyTokens minted server-side, scoped to what each request actually does.
  • Smarter catalogueKnow what a module needs before you add it.

Exploring

  • Wall display pairingPut a deck on a TV without a keyboard.
  • Probe → scaffoldPoint at a live API, get a starter module.

// Intent, not promise. Priorities move as the deck does.

Take the controls.

Your data, your layout, your machine.

esc
↑ ↓ move↵ goT theme