← News  //  2026-08-01  //  v0.9.0

v0.9.0 - Cockpit and command

For eight releases Nova Protocol built outward: more ships, more combat rules, more scenarios, more ways for a mod to turn those pieces into a campaign. v0.9.0 turns inward and asks what all of that should feel like from the pilot's seat. The answer is a cockpit that behaves like a working place instead of a layer of permanent gauges.

The old Tab drawer started as two panels for objectives and messages. It ships as NOVA OS, a complete ship computer built around one inset CRT monitor. It pauses flight, frees the cursor, accepts shell commands, runs a local-space map and a ship schematic, reports live ship and mission state, and gives the cockpit a single surface for information that used to compete with the flight view.

The rest of the interface follows that decision. The HUD stays quiet until the situation calls for it. Objectives and comms arrive as notifications instead of permanent furniture. Friend, threat and neutral ships identify themselves at a glance. A beaten ship can become a drifting neutralized wreck instead of needing one last round poured into an empty hull. Campaign chapters finally browse as campaigns. Menus, editor and website all adopt the same phosphor language.

This is the largest interface release Nova Protocol has had. Here is the whole of it.

NOVA OS arrives in the cockpit

Press Tab in flight and the world yields to the ship computer. Flight pauses, the cursor returns, the ordinary HUD clears away and the monitor opens over the dimmed cockpit view. The same key that opens the computer becomes terminal completion while it is active; Esc closes it and resumes flight after the screen finishes its shutdown.

There is no dashboard of little permanent panes. NOVA OS is one screen with one prompt, and every piece of information earns its place as either terminal output or a full-screen app. The topbar carries the live ship name. The footer changes its hints for the surface currently in control. The terminal keeps its own scrollback, and an app takes over the monitor until you exit back to the prompt.

A shell with useful answers

The command line behaves like a small real shell. It supports command history, cursor editing, fish-style inline completion, Tab match cycling and close-match suggestions. help prints a proper usage synopsis and aligned command list; map help or ship help drills into the command tree; a wrong subcommand names what failed and prints the relevant usage instead of dropping a generic error. Page Up and Page Down move through long output, and clear restores the welcome block rather than leaving a dead empty tube.

The core commands expose live game state:

  • log prints one combined history of comms, objectives and important flight events, including the messages that have already left the HUD.
  • objectives prints the standing mission list. The HUD can stay temporary because the complete record is always here.
  • ship view prints each live section of the player ship: hull, weapons, thrusters, ammunition where present, and critical or neutralized state.
  • map view prints local-space contacts in a fixed-width table with kind, label, range and bearing.
  • clear resets the terminal surface, and exit suspends the computer.

The output is the point. Objectives and messages were not removed from the cockpit; they were moved into the cockpit's memory, where they can be recalled without occupying every frame of flight.

The map is both command and app

Bare map launches the local-space map. The terminal disappears and the same monitor becomes a green schematic of nearby space: your ship at SELF, then hostiles, allies, objectives and bodies under short stable labels such as HOST-1, ALLY-1, OBJ-1 and AST-1. Labels ride with their contact blips, a selected contact gets detail, and G engages GOTO on it.

The terminal version uses the same contact model. map view gives the table; map goto <label> engages the flight autopilot without opening the app. Tab completes the label from the contacts that actually exist. The visual tool and the CLI are two views of one local-space system, not separate features that can drift apart.

The ship becomes a schematic you can operate

Bare ship turns the monitor into an orbitable 3D phosphor schematic of the player ship. Every section receives a short cockpit code such as HULL-1, PDC-1 or TRB-1. Click a section block, or cycle with [ and ], to inspect its status. The labels and schematic stay tied to the live modular ship, so an editor-built craft gets the same computer as a stock one.

Those codes also make the ship operable from the prompt. ship section <id> prints one section's detail. ship reload <id> and ship repair <id> act on that section, with Tab completing valid codes. The app offers the same actions on L and P. The computer is not a separate configuration screen; it is a cockpit surface over the ship you are currently flying.

Image needed assets/news-090-nova-os-terminal.png NOVA OS open in flight with the phosphor terminal, command history, inline completion and contextual footer hints visible.
NOVA OS is now the cockpit's command surface, not a placeholder drawer.

The screen is a real CRT

The monitor is not flat Bevy UI with scanline decoration laid over it. NOVA OS renders its complete screen into an offscreen image, then displays that image through one sampling shader. Bright glyphs bloom into a soft phosphor halo. The raster bows with barrel curvature while the text stays crisp. Scanlines, square grain, vignette and brightness live in the same pass instead of filming a dark overlay across the terminal.

That rendering path also preserves interaction. Mouse coordinates are mapped back through the tube's barrel curve and overscan before being forwarded to the offscreen UI, so a contact at the edge of the map or a section away from the centre of the ship schematic clicks where its picture says it should. Scrolling and app input pass through the same surface.

The tube has a beginning and an end. Opening the drawer blooms the raster out from one horizontal scan line. Closing collapses it back through a line to a dying centre dot, then hands control to flight. A degauss sweep briefly distorts the screen. The power button suspends and wakes the computer instead of serving as painted-on chrome.

The casing carries the same level of attention: a dark blue-black shell, rounded tube corners, recessed glass, edge sheen, vents and fasteners, a heavy chin bar and a NovaCRT 9000 plate. BRIGHT and SCAN controls alter the sampled screen. SND controls the terminal audio. Key taps, enter, errors, boot tones, power sweeps and a low CRT bed all run through the game's UI sound path, so the monitor sounds like part of the cockpit rather than a web mockup pasted over it.

Image needed assets/news-090-nova-os-apps.png Split capture or ship schematic view: the NOVA OS map or ship app filling the curved CRT, with labelled contacts or ship sections and the physical chin controls below.
Apps take over the same tube, then hand it back to the terminal.

The HUD learns when to get out of the way

The old flight HUD asked the player to manage its detail level manually. All, Minimal and None decided how much chrome stayed on screen whether it mattered or not. v0.9.0 replaces that dial with context. The grave key now switches between On and Cinematic: On lets the HUD decide what the current situation needs; Cinematic clears it.

Idle cruise is close to empty. The important surfaces return when they become important:

  • During an autopilot burn, the mode, destination and speed chips come up, and the speed readout grows because it is the number you are flying by.
  • With a combat lock, the reticle, distance and closing-speed readout, and target viewfinder return. The RADAR action in the dock inverts because that is the lock you would change.
  • When weapons are hot, ammo gauges appear and lock information grows. Hold the trigger and the reticle pulses. A nearly dry group forces itself visible and warns in amber even with the safety on.
  • While a ship action is active, its dock chip inverts and grows. A scenario can still spotlight an action in gold, including one that is not currently available.
  • Fresh comms and objectives arrive large, settle, breathe, then leave. The standing record stays in NOVA OS.

The result is not fewer instruments. It is instruments with timing.

Objectives arrive like messages

An objective now posts as an amber notification chip at the top of the flight view, carrying the objective text itself behind a diamond. It pops on the exact posting frame, settles into a slow breath, then leaves after its reading dwell or the moment NOVA OS opens. Several new objectives can stack without becoming a new permanent panel. A completed objective still ghosts green as it clears.

The gold world marker remains on the actual target, so the lasting in-flight cue is where to go. The full standing list lives behind objectives, and the event history behind log. The cockpit can go quiet without losing information.

Comms follow the same rule. Story lines now stack from the bottom-left like a chat transcript, with an optional authored speaker icon, newest at the bottom and older lines rising and fading. V dismisses the oldest visible card; B pulls the next queued line into view. A transmission is readable when it arrives and recoverable later without pinning a message box to the screen forever.

Keys become an action dock

The lower-left seven-row [KEY] VERB list is gone. A bottom-centre icon dock shows only the flight verbs that can do something right now. The real keycap art sits beside the verb, and the active maneuver inverts. ORBIT, GOTO and the objective stack's Tab affordance use the same keycap system.

The glyphs keep the proportions of their art: Tab, Shift, Ctrl and Space remain wide instead of being crushed into square slots. A command that would do nothing is absent rather than greyed out. At a glance, the dock answers one question: what can this ship do in this situation?

Every player-facing distance also moves to real display units. One world unit is shown as ten metres, with metres below a kilometre and kilometres above it; speed and closing speed use m/s. This is display-only. Physics, scenario content and AI tuning keep their existing scale.

Image needed assets/news-090-contextual-hud.png Flight HUD in combat: bottom icon dock, objective notification, allegiance markers, combat lock and weapon chips visible while the rest of the screen stays clear.
The HUD now appears when the situation asks for it.

Combat reads faster and ends when the fight does

Every non-player ship now carries a small filled triangle above it. Green marks an ally, red a threat, grey a neutral or unaffiliated ship. The player ship does not mark itself. Because the colour follows live allegiance, a neutral hauler provoked in the middle of a scenario flips red on the spot. In convoy fights and mixed brawls, the field can be read before cycling through combat locks.

The more important change is what counts as beaten. An armed ship that loses all working weapons and all working thrusters enters NEUTRALIZED. Its AI switches off and it drifts as a wreck, still present in the scene but no longer able to fight or maneuver. It does not disappear, and an unarmed civilian is not treated as combat-dead merely because its drive fails.

Enemy kill objectives count neutralization alongside destruction. The player's defeat logic does the same when their ship can no longer fight. Scenario authors get a dedicated OnNeutralized event for aftermath, dialogue and branching. The outcome now follows the actual tactical state: once the enemy has no gun and no drive left, the game no longer asks for another minute of hull grinding.

Combat lock behavior got a readability pass around the same principle. Firing now counts as combat activity for the existing 30-second idle decay, so a lock does not expire underneath a player who is actively shooting with the stance lowered. Over the final five seconds of a genuinely idle lock, the red reticle dims and pulses faster. Any combat activity snaps it back to full, and every automatic drop now names its cause: idle decay, range, missing target or an allegiance change.

Image needed assets/news-090-combat-readability.png A mixed fight with green, red and grey allegiance triangles visible above ships and one disarmed, disabled enemy left drifting as a neutralized wreck.
Friend, threat and neutral read at a glance; a ship out of the fight can stay in the world.

Campaigns browse like campaigns

The Scenarios tab used to flatten every launchable scenario into one list. A chapter could carry a title prefix that implied a campaign, but the menu did not know what that relationship meant. Hidden mid-story chapters were especially awkward: reachable through play, but not available for direct replay.

Bundles can now declare a first-class Campaign content file with an id, a display name and an ordered list of scenario ids. The Scenarios tab renders that mapping as a collapsible [-] / [+] header with its chapters indented below. The order comes from the content, and every member can be launched directly from the campaign, including a chapter that stays hidden from the flat ungrouped list. The list pane also keeps a fixed share of the screen, so selecting a long description no longer shoves the campaign column around.

The Ledger moves to bundle 1.13.0 to use the new model. All six chapters sit under one The Ledger header, their redundant The Ledger N: prefixes are gone, and The Raid returns to being a hidden reward finale while remaining available for replay from the campaign sequence. The content lint checks that every declared campaign member is actually supplied by a bundle, so a typo cannot ship a dead row.

For mod authors, this is deliberately data rather than menu scripting. Declare the ordered relationship once, and the picker gets the grouping, replay access and validation.

Image needed assets/news-090-scenario-campaigns.png Scenarios picker with The Ledger expanded under a campaign header, six chapters indented below it and the selected scenario detail pane holding its width.
Campaigns are now first-class in the picker and in mod content.

One interface language from boot to editor

NOVA OS became the source for the rest of the game's interface. The flat navy-and-cyan theme is retired. Menus, settings, scenario browser and ship editor now use the green phosphor palette, near-black recesses, amber accents and the same state-aware widget vocabulary as the cockpit.

Buttons, segmented controls, rows, badges and panels are skin-aware rather than each screen inventing its own treatment. The main menu gives New Game the primary emphasis and Exit the danger treatment, adds the glowing title and a version footer, and lets long scenario lists scroll. The setting lives under a new Interface section and persists across restarts.

There are two in-game skins. Phosphor is the default terminal surface: flat, dark and luminous. Hardware gives the same controls a light-3D casing. The state and behavior remain shared, so changing the material does not create a second widget system.

Even the first native frame participates. Instead of a blank window while assets arrive, startup shows a near-black NOVA OS loading screen with the green mark, a LOADING line, marching dots and a blinking cursor. It hands off to the menu only after the load gate clears.

The website now shows the game that exists

The old site still advertised the retired navy HUD after the game had moved on. v0.9.0 rebuilds it around the same Phosphor skin: near-black CRT fields, green terminal lines, amber bracketed keycaps, mono typography, screen recesses for code and tables, and flat bordered CLI buttons that invert when primary. Cards and sidebars read as lit screen regions behind phosphor hairlines. The game's alternate Hardware material stays in the game; the website is a screen, not a moulded control panel.

Typography is terminal-first across display, body and code. JetBrains Mono replaces the former Rajdhani and Inter pair, with measure and leading retuned for a mono face rather than merely swapping the font file.

This visual relationship is checked, not maintained by memory. The site and the game's UI proof of concept mirror the same :root palette block, and web tests compare both directions. They also reject Hardware-only material creeping back into the web skin. npm run ci now includes those tests before the production webpack build.

The new scripts/shoot-web-pages.sh closes the other half of web verification. It builds the site, serves it locally, checks each representative URL returns 200, then captures desktop and mobile screenshots for landing, news index, news post, tutorial, wiki index and a developer wiki page. A CSS change now ends with rendered evidence for all six page kinds instead of only a successful bundle.

Assets load before they are needed

Static UI assets now preload through asset collections and gate the transition into the game. The terminal font, shared HUD art, input glyphs, UI sounds, textures and meshes arrive before gameplay instead of being fetched the first time a surface opens. Dynamic scenario AssetRefs and downloaded mods:// bundles remain dynamic, where their source actually requires it.

The difference is most visible on web. The first NOVA OS open no longer asks the browser for the old 66 MB font collection. The terminal ships one Iosevka Term Regular face as an approximately 11 MB .ttf, using Bevy's built-in loader and the matching generated web metadata. Startup can show progress, and the first terminal frame has the font it needs.

The asset cleanup also closes the licensing trail. Iosevka Term ships with its SIL Open Font License copyright and full license text. The keyboard glyphs come from JulioCacko's CC0 FREE Input Prompts set; only the Alt style used by the game ships, while unused Dark and White variants stay out of the build.

Tooling runs in a clean cockpit too

nova_probe now gives each native child run an empty, probe-owned profile under its run directory. The mod cache, enabled-mod list and saved settings from the developer's everyday game can no longer silently decide whether an autopilot example passes. Each run receives isolated NOVA_MOD_CACHE_ROOT, XDG_DATA_HOME and XDG_CONFIG_HOME roots; exporting one explicitly is the opt-in path when a test genuinely needs local state.

That isolation matters because a run harness should reproduce the committed game, not the machine that launched it. Alongside the website's palette checks and screenshot runner, v0.9.0 makes visual and runtime evidence less dependent on whatever happened to be installed locally.

Fixes

  • NOVA OS clicks now land where the picture is. Pointer mapping now inverts the CRT barrel curve and includes overscan, removing an error that grew toward the corners and was most obvious on the map. Contact and section dots plus their labels are one continuous target.
  • Terminal scrolling stops cleanly at the content bottom. Reaching the end no longer leaves a hidden overscroll that makes the first reverse wheel input appear unresponsive.
  • World-anchored nav chips have complete backgrounds. The objective marker and beacon chip fill and border now wrap the full label, with the objective diamond inside the pill instead of beside a top-left slab.
  • NOVA OS text renders on the web build. The extracted .ttf uses the built-in font loader and receives the required generated .meta sidecar, so strict web asset metadata checks no longer leave the terminal glyphs invisible.

Point releases

  • v0.9.1 - 2026-08-02. Web release builds compile again after the pause-menu split stopped importing the native-only Exit handler on wasm.