Changelog
- Snapshot
- v0.2.0
- Source path
CHANGELOG.md- Tree
c41b976e0362
This file records notable FlashOS changes and public releases. Its format is based on Keep a Changelog.
The 0.9.0 and older tags inherited with the Redox OS source history are upstream tags, not FlashOS releases. The former AArch64 FlashOS release history remains available in the archived FlashOS-old repository.
Unreleased
0.2.0 - 2026-08-28
Changed
- Published one coherent FlashOS and Flash product guide with checked quick starts and examples, explicit shipped-versus-future boundaries, an approved maintainer page, and public contribution and issue routes.
- Defined the pre-alpha evaluation threat model and release boundaries across local credentials, Flash execution, installed services, immutable build inputs, candidate identity, checksums, SBOMs, provenance, correction, and withdrawal. The release profile locks direct root login while retaining a passwordless administrative evaluation user.
- Bound candidate production by default to the reviewed, version-specific v0.2.0 release notes.
- Migrated the installed
auto-test,acid-runner,relibc-tests-runner, andos-test-runnerautomation from Ion or generated Bash to tracked Flash source with explicit runtime dependencies and preserved execution semantics. A fail-closed public automation inventory now classifies standalone and embedded scripts, reviews the remaining bootstrap/recovery/tool-interface exceptions, checks.fshlanguage presentation, and exercises behavior and failure parity through the real Flash runtime. - Replaced the inherited Bash source-build entry point with
build.fsh, which preserves its option, environment, Make, output, filesystem, refusal, and status contract. Source builds now require a compatible hostfsh; the newinstall-flash.shonly acquires, verifies, and installs Flash for hosts that do not yet provide it. - Released Flash 1.0.0 as the frozen component language, runtime, tooling, and platform-capability contract. Its exhaustive host inventory, exact-image FlashOS matrix, public claims, package version, and retained evidence now share one machine-validated release boundary; FlashOS image versions and publication remain separate.
- Flash now uses bounded nonblocking raw-terminal reads on Redox instead of lossy PTY readiness notifications, preventing independent console editor actions from remaining indefinitely unread.
- FlashOS now selects its dedicated Flash platform adapter for every target execution mode. The image-qualified path runs interactive foreground work, scripts, structured directory commands, external pipelines, redirections, addressable background waits, and conditional-chain supervisors. Background children remain owned and observed by the Redox session thread, while the indivisible signal/stop-transition capability stays explicitly unadvertised.
- Flash now executes
command NAME [ARG...]through the same resolved external stage contract as^NAME. Dynamically selected commands preserve native argv, byte pipelines, redirections, status, capture, callables, conditional execution, and background supervision while continuing to bypass the internal-command namespace without reparsing text. - Candidate and release image builders now pin their source-package header
generator and cook selected packages from tracked recipes instead of
combining the pinned source-built kernel with a moving binary userland feed.
Platform artifact validation binds the staged
relibcsource identity to its configured revision; capability claims remain unchanged and QEMU still owns runtime qualification. - Made dependency policy merge-blocking through a stable security aggregate: every pull request now reports the gate, while dependency review and Cargo policy run only for relevant manifests, lockfiles, policy, Dependabot, or workflow changes and controlled skips remain inexpensive.
- Focused hosted CI on one reliable, risk-routed product signal. Draft pull
requests run source feedback; ready documentation, policy, reporting, and
isolated host-tool changes can finish on the fast lane, while product,
target, image, mixed, and unknown paths build and boot the promoted image.
Protected
mainindependently repeats classification and proves exact tree, CI, and dependency-policy identity without rebuilding. Safe Cargo and BuildKit caches reduce repeated work, with an explicit cold-cache diagnostic. Release candidates now build disk and live bytes once, preserve first-attempt QEMU evidence in a manifest-bound bundle, and publish only an exact selected run whose commit and tree match the operator-created tag; publication cannot rebuild, substitute, select an expired artifact, or overwrite a release.
Added
- Added an exhaustive FlashOS target-capability matrix for the adapter's
advertised set. Every advertised classified operation has one owning case,
while QEMU executes the exact startup, configuration, language, session,
editor, supported-job, and clean-exit contract that can also be rendered for
operator-observed targets.
Signals, physical hardware, and release qualification remain explicitly separate. - Added a versioned FlashOS capability report backed by one reusable target-
runtime fixture suite. The automated QEMU consumer and manually run real-
system checklist now share exact ordered interactions and expected markers;
CI binds the report to the selected adapter, route classification, product
versions, and fixture coverage. The report is deliberately bounded, keeps
Signalswithheld, and does not claim exhaustive, physical, or release qualification. - Added a machine-checked Flash v1 host-conformance inventory. Every recovered language, runtime, checker, formatter, language-server, interactive, job, completion, portable-editor, and platform-route family now names executable owners in the locked workspace suite. CI also rejects unclassified runtime refusal boundaries and locks the intentional six-setting interactive config surface while keeping target compilation, image integration, and FlashOS runtime qualification as separate evidence.
- Added grammar-aware Flash path completion. Bounded, cancellable, generation-
stamped host snapshots now cover recursive cwd paths without following
directory symlinks, while the parser-derived completion engine handles bare,
quoted, interpolated, executable, redirection, and explicit
glob(...)positions. Insertions preserve wildcard spelling and reversible escaping, omit unrepresentable native names, reject stale snapshots, and perform no source execution or implicit argument expansion. - Added portable Flash interactive behavior across the host and target editor source paths. The shared contract now covers grapheme/display-cell editing, editable multiline submissions, in-flight resize, completion, highlighting, hints, persistent history, configurable prompts, and background notices that redraw without losing typed input. FlashOS image runtime qualification remains a separate gate.
- Added structured Flash error handling.
try { ... } catch error { ... }catches runtime errors into an immutable queryableError, whilethrowraises a source-anchored string error or rethrows an existing error without losing its source, labels, frames, cause, or status. Catching restores the pre-try language state without claiming rollback of output, files, or child effects, and cancellation, exit, stopped jobs, fatal host failures, and ordinary unsuccessful statuses remain distinct. - Added typed Flash command capture.
$(bytes: chain)now preserves exact bounded output as aBytesvalue, including NUL and non-UTF-8 data, while$(text: chain)explicitly selects the existing strict UTF-8 and trailing- newline behavior and$(chain)remains its shorthand. Both modes share status, cancellation, cleanup, redirection, and transactional execution; byte results cannot be inserted into command words implicitly. - Added
fsh plan [--] SOURCEfor deterministic inspection of one exact Flash command pipeline. It shares canonical parsing, static analysis, ordinary expansion and PATH resolution, structural preflight, and complete escaped- native plan rendering while refusing substitution and broader script shapes without opening redirections, mutating session state, starting processes, or accessing config, history, or a terminal. - Added live Flash interactive session configuration and completion snapshots.
Trusted startup config can transactionally set
pipefail, command-capture limits, completion, and history without leaking its temporary setting bindings into scripts or the prompt; safe mode and opt-out flags restore clean defaults. Host completion now refreshes at each prompt from live scope, cwd, childPATH, and bounded UTF-8 executable/path snapshots while keeping host I/O outside the keypress callback. - Added a dedicated FlashOS platform adapter for Flash. The adapter keeps the
classified Rust and
relibcroutes behind the portable platform contract and adds native-path-preserving home, configuration, cache, and state selection with deterministic FlashOS fallbacks. It is compiled by the Redox-targetfshbuild but remains unselected with no advertised capabilities until the later target-runtime qualification and bring-up work. - Added a checked FlashOS x86_64 platform classification for Flash. All 44 required operations and all 14 capability groups now have explicit native, shimmed, deliberately unsupported, or separately authorized kernel-work verdicts. The current result is 41 native operations plus a three-operation FlashOS standard-directory policy shim, with no deliberately unsupported or kernel-work verdicts; target-runtime qualification remains pending.
- Added a checked per-operation FlashOS x86_64 platform map for Flash. Every
portable capability requirement now resolves to its current Flash-internal,
Rust standard-library, direct
relibc, or unrouted boundary. The map preserves the unknown target compiler source commit and the configuredrelibcsource revision, and it keeps support classification and runtime qualification explicitly deferred. - Added a checked FlashOS x86_64 capability-evidence inventory for Flash. It compares all 14 current portable capability groups with the selected Redox executable and adapter source paths and with the behavior already observed by the QEMU smoke contract. Source declarations, runtime observations, and evidence gaps remain distinct, and support classification is explicitly deferred instead of being inferred from the Unix target family, adapter methods, or successful builds.
- Added a machine-readable FlashOS x86_64 platform baseline for Flash. It
records the configured Rust and
relibcinputs alongside observed compiler, source-built package, dynamic-linker, and ELF identity, with source checks in ordinary CI and artifact checks in the clean-room image path. The baseline establishes the adapter target without claiming capability support or runtime qualification. - Added arbitrary alternating mixed-pipeline execution. Maximal internal
segments stream concurrently across external byte stages without whole-stream
capture or cross-thread structured carriers, while source-ordered
preparation, status leaves,
pipefail, deferredcheck, transactional session state, closure-delta merging, explicit exit, local descriptor override, child cleanup, and interactive/script/background parity remain deterministic. - Added
/usr/bin/flash-language-server, a separate stdio-only Language Server Protocol executable with full-text versioned overlays for absolutefile:URIs. It publishes deterministic shared module diagnostics and provides completion, hover, signature help, definition, references, and canonical whole-document formatting with cancellation and stale-generation barriers. The adapter shares Flash syntax and semantic analysis but has no CLI, platform, terminal, session, configuration, history, executable-probe, or execution capability; effectful open source is analyzed without being run. - Added the complete Flash module-initializer effect contract. Named
dependencies share logical cwd, child environment, status, output, process,
and job state in deterministic initialization order; successful completion
and whole-program initializer
exitcommit the final child environment, while runtime or output failure does not. Output, filesystem, and process effects remain immediate and non-transactional, and every exit route joins program jobs with ordered background-failure precedence. Canonical module programs now expose source-spanned direct and named-dependency-folded host-free summaries for working-directory, environment, status, output, filesystem, process, job, exit, and opaque external effects. Load-only modules remain dormant in transitive summaries, known callables fold their bodies, and valid effectful modules add no checker diagnostic. - Added non-executing
fsh check [--] SOURCEanalysis for one root and its recursively discovered canonical import closure. The checker accumulates deterministic module, name, signature, andPIP001-PIP004pipeline-carrier diagnostics through shared runtime analysis, accepts canonical symlink aliases to regular UTF-8 source, and reports silent status-0 success, stderr-only status-1 analysis failure, and status-2 invocation misuse. Static carrier classification uses built-in contracts without expanding words, probing executables, initializing modules, mutating session state, applying redirections, or executing source. - Added explicit
fsh format --check [--] PATH...andfsh format --write [--] PATH...launcher modes. Ordered checks report anchoredFMT001diagnostics without writes; write mode preflights the full explicit-file batch and atomically replaces changed files through synchronized same-directory temporaries while preserving permission bits. The frontend rejects directories, final symlinks, duplicate canonical targets, invalid or incomplete source, and stale preflight data without loading imports, initializing a session, or executing source. - Added Flash documentation comments and inspection-only language help.
Consecutive complete-line
##blocks attach to immediately following named functions and normalize into the same resolved metadata retained by module analysis and runtime callables.help [NAME]snapshots documented built-ins and visible named functions during planning, renders deterministic UTF-8 byte output, preserves distinct built-in/function namespaces and lexical shadowing, and never runs the inspected body or probes an executable. - Added ordered script arguments to Flash.
fsh [OPTIONS] SCRIPT [ARGUMENT]...preserves empty, Unicode, and option-like operands as immutable root-only$args: List[String]data without splitting or reparsing. Non-UTF-8 script arguments fail before source loading, and dependency modules receive no ambient caller arguments. - Added resolved type annotations and named-function signatures to canonical
Flash programs. The closed built-in namespace includes exact scalar,
collection, callable, and
Anycontracts; known local and imported calls are checked conservatively before execution, while declarations, assignments, dynamic calls, closure parameters, and named-function results retain exact runtime enforcement with recursiveList[T]matching and cross-file diagnostics. - Added host-free lexical-reference resolution to every loaded Flash module.
Canonical module programs now expose deterministic source-spanned references
to local bindings and complete import/declaration/export provenance for
cross-file reads. Resolution mirrors source-ordered evaluator scopes,
callable capture, parameters, recursive functions, loops, match arms, and
shadowing before execution; unknown reads and same-scope duplicate bindings
now fail program construction with
MOD009andMOD010. Load-only modules are fully analyzed while remaining dormant at runtime. - Added Flash's first explicit module-name analysis. Top-level
export { name }lists make local declarations or functions visible, whileimport { name } from '<path>'requests only named target exports and never creates wildcard ambient access. Canonical module programs now expose deterministic export/import tables and diagnose unknown, private, duplicate, and colliding names without evaluation. At runtime, named dependencies now initialize once per canonical module in deterministic dependency-first order. Each module receives an isolated lexical root whose imported values are immutable snapshots of completed target exports, while ordinary session state remains shared. Imported callables retain their defining source, including in grouped cross-file runtime diagnostics, and load-only dependencies remain dormant. - Added Flash's first source-level module declaration and recursive analysis
loader. A top-level
import '<path>'records an exact static dependency; injected canonicalization and source-loading capabilities build one acyclic graph and stable source registry, parse canonical aliases only once, and preserve cross-file resolution, read, UTF-8, syntax, and cycle diagnostics without executing source. Non-interactivefsh <script>execution now uses the real filesystem adapter, renders grouped source excerpts for cross-file diagnostics. Load-only imports remain non-executing during script execution; explicit named imports use the initialization and binding behavior above. - Added informational host line-coverage reporting for all five Flash crates. A dedicated workflow generates one LCOV report with pinned Rust coverage tooling, rejects empty reports or reports that omit a workspace member, and authenticates the Codecov upload through GitHub OIDC. Coverage status checks and pull-request comments remain disabled while a new Rust baseline is established; the README badge explicitly represents Flash host coverage and does not claim Redox, QEMU, or hardware-path coverage.
- Added an optional sourceable Bash and Zsh helper layer for common image build, interactive QEMU, exact-artifact smoke, profile, Flash, Podman, and local quality commands. The wrappers keep the x86_64 FlashOS profile and artifact paths consistent without hiding the underlying tools or exposing Git and physical-device writes.
- Added interactive job control to Flash. Ctrl-C now interrupts the running
command without ending the shell, while Ctrl-Z retains an exact external
foreground command as an addressable job and returns the prompt.
jobsexposes structured job state,bgandfgresume stopped work in the chosen placement,waitconsumes selected completions, andkillsignals explicit%ntargets with termination as the default and forced termination available through--kill. Foreground handoff and restoration keep subsequent terminal input attached to the shell. A shell reading redirected input arranges no interactive signal handling and remains part of its existing foreground process group. - Added a line editor to the console shell.
fshon the image read input in canonical mode, so a session had no in-line editing, no history recall, and no continuation prompt for an incomplete block. The shell now decodes keys itself, holds the terminal in raw mode for the duration of a single read, and redraws one physical row. It is selected only when standard input and standard output are both terminals, so a redirected session still reads plain lines instead of receiving cursor escapes. - Added a release image profile that locks the root account, so a published
image no longer carries a root password. Locking is expressed by a new
lockeduser option in the image installer and writes an unmatchable hash;sudois unaffected because it authenticates the invoking user before switching to uid 0. - Added a security policy covering scope, supported versions, private vulnerability reporting, and the credential weaknesses that published images still carry.
- Added a second software bill of materials describing the operating-system image itself. Releases now publish a source document and an image document, each named for what it covers, with the image document bound to the SHA-256 digests of the artifacts it describes.
- Added product-contract rules covering release credentials, parity between the development and release profiles, immutable revisions for every external Git recipe that reaches the image, and the in-tree Flash workspace source.
- Added a lint gate for the release-critical Python in
ci/.
Changed
- Changed the Flash image recipe to snapshot the current in-tree
components/flash/workspace instead of pinning the repository to its own commit SHA. Clean builds remain bound to the exact outer FlashOS checkout, while local component edits can be tested without a follow-up pin commit; ignored build outputs are excluded from the snapshot. - Relicensed Flash from Apache-2.0 to MIT so the FlashOS-owned component and the inherited root build infrastructure use the same permissive license while retaining their separate copyright notices.
- Renamed FlashShell to Flash across the source tree while preserving the
fshexecutable,/usr/bin/fsh,.fshscripts, and prompt protocol. Added concrete fallback strategies for configuration and history:- Configuration paths:
<config_dir>/flash/config.fshand<config_dir>/flashshell/config.fsh. - History paths:
<state_dir>/flash/historyand<state_dir>/flashshell/history. - Fallback rules: if the new canonical path exists, it has exclusive priority; if only the legacy path exists, it continues to be used; if neither path exists, only the new canonical path is created or expected; invalid, incomplete, or unsafe files at the canonical path always fail as an error, with no fallback and no creation of replacement paths.
- Configuration paths:
- Flash now observes jobs continued by an external process, reports their live running state, and removes the stale stopped notice at the next command boundary.
- Pinned every input the image is built from: the container base image by digest, the Rust toolchain and its installer by version and checksum, the build-system Git dependencies by revision, every package recipe that reaches the image by revision, and the host installer that writes the image. The same commit previously resolved to whatever the upstream default branches happened to be at build time, including the kernel and the shell.
- Corrected the build-support crate license to
MIT, matching the root license file and the upstream origin of every file undersrc/. - Changed the default build configuration from the inherited
desktopprofile toflashos, so an invocation without an explicitCONFIG_NAMEbuilds the TUI-only product image instead of a graphical desktop image. The same default now applies tobuild.fshand to thechangelog,find-recipe, andventoyhelper scripts. - Declared the license and repository of the build-support crate and dropped its inherited author field, matching the Flash workspace metadata.
- Corrected two build-support paths that pointed at directories the recipe tree no longer uses.
Fixed
- Restored
flashos check quickvalidation of the Bash/Zsh helper surface and corrected top-level Bash completion so it offers the documented commands. - Corrected the final login banner so FlashOS no longer presents itself as an unofficial Redox OS distribution. Product identity files are now installed after packages, and the static and QEMU contracts reject inherited product branding in the resulting image.
- Corrected the package-repository web generator to link build scripts and commits to FlashOS by default, with an explicit source-URL override for alternate deployments.
- Replaced inherited Redox product wording in the Nix and bootstrap developer
interfaces and updated maintenance scripts to refer to the FlashOS
repository root and
mainbranch.
Removed
- Removed the unused repository-question and commit helpers, their external AI
integration, and undocumented legacy shell aliases. The sourceable host
flashosandfosdispatchers now accept only the commands listed byflashos help. - Removed every inherited image configuration that the product does not build:
the desktop, Wayland, X11, server, minimal, development, and test profiles,
the inherited base configuration they were layered on, and the configuration
directories for the inactive
aarch64,i586, andriscv64gcarchitectures.config/now contains only the FlashOS base configuration and the activex86_64product profile. - Removed the unreferenced upstream build-server image, packaging, and toolchain targets, which built configurations that no longer exist and named their artefacts after the upstream project.
- Removed the inherited graphical client library and every package recipe that depends on it, transitively: the SDL 1 and SDL 2 families, the OpenGL and multimedia libraries built on them, the demo, game, emulator, and web-browser packages, and the desktop, X11, and Xfce package groups. The remaining recipe set no longer offers a graphical stack, matching the TUI-only product scope. The corresponding entries were also dropped from the static-clean target, the native bootstrap package list, and the Nix development shell.
- Removed an unreferenced maintenance script that checked package coverage against an image configuration that no longer exists.
- Removed the inherited work-in-progress recipe collection and the packages that depended on it, transitively: the X11 and desktop client libraries, the text and font shaping stack built on them, and the development, scripting, and test-suite convenience groups. The recipe set is now 226 packages covering the kernel, core system, terminal userspace, and their libraries.
- Removed an unreferenced toolchain package manifest that no build step read and that listed packages without recipes.
- Removed the inherited windowing system and its clients, together with the graphical toolkits, font, icon, and wallpaper data packages, and the two-dimensional rendering libraries that only served them. The recipe set is now 192 packages and contains no windowing stack.
- Removed the unreferenced VirtualBox emulator target. QEMU is the supported emulation path.
- Removed VirtualBox installation from the native and container bootstrap scripts, which offered to install an emulator the build system can no longer target.
0.1.0 - 2026-07-26
Added
- Added the independent x86_64 FlashOS image profile at
config/x86_64/flashos.toml. - Defined FlashOS as a TUI-only product: no Orbital, COSMIC, X11, Wayland, GUI applications, or graphical installer is selected by the active profile.
- Added a FlashOS-owned TUI base configuration without Orbital scheme access
or the inherited legacy
/uicompatibility symlinks; audio remains in scope. - Made graphical XDG home directories optional in the inherited installer and disabled their creation for the FlashOS image.
- Added FlashShell to the active source tree and installed
fshas the login shell for both development accounts. - Added the FlashShell target recipe and target-build verification.
- Added FlashOS hostname, release metadata, console issue, QEMU title, network boot filename, and image build path.
- Restored the English documentation suite with the original FlashOS light/dark logo presentation and top navigation.
- Added public hardware, trademark, attribution, and upstream reference documents.
- Restored GitHub Actions as an x86_64-native CI/CD architecture with independent build-system, FlashShell, and TUI product-contract gates.
- Added a FlashOS-owned Docker clean-room build, immutable checksummed image promotion, and a separate QEMU consumer that verifies FlashOS identity, TUI login, FlashShell pipelines, and the IHDA audio driver.
- Added a self-contained live image for removable USB media and qualified its exact promoted bytes through an emulated USB mass-storage boot.
- Added scheduled dependency policy, Dependabot, tag-driven release packaging, CycloneDX SBOM generation, checksums, and build provenance.
Changed
- Renamed the standalone repository and product from Redox to FlashOS.
- Renamed the default branch from
mastertomain. - Detached the GitHub repository from the Redox OS fork network while keeping
redox-os/redoxas the localupstreamremote. - Removed the inherited Redox GitLab pipeline and GitLab templates; GitHub Actions is the single active public automation surface.
- Archived the former AArch64 project separately as
FlashOS-old. - Renamed the root support crate from
redox_cookbooktoflashos_build. - Defined the intended long-term borrowed boundary as the Redox OS kernel. Current Redox userspace, relibc, toolchain, installer, bootloader, package, and build dependencies remain transitional.
- Made future kernel divergence explicit: FlashOS may stop consuming Redox kernel updates when its kernel requirements differ.
- Extended the product contract to enforce release-version lockstep across
the root crate, FlashShell workspace, README,
os-release, console issue, and release artefact names. - Moved build-provenance attestation into release-candidate packaging so a non-publishing dry run exercises the same attestation used by tagged delivery.
- Updated artifact downloads and pull-request dependency review to their Node 24 action runtimes.
- Kept the installed-disk and removable-media contracts distinct:
harddrive.imgis qualified over NVMe, whileredox-live.isois qualified over USB and included in release checksums and provenance.
Verified
- FlashShell host tests and clippy checks.
- FlashShell target compilation for
x86_64-unknown-redox. - Root Cargo metadata and locked dependency check.
- FlashOS build-environment selection for
x86_64and theflashosprofile. - QEMU boot, login to
>>, and an external-to-external pipeline on the final rebranded image. - Automated QEMU contract including the FlashOS bootloader, kernel identity, login prompt, FlashShell pipeline, and retained IHDA audio driver.
- Non-publishing release workflow: clean-room rebuild of both images, separate NVMe and USB QEMU qualification, compression, checksum verification, CycloneDX SBOM generation, and build-provenance attestation.
- Physical live USB boot, display, keyboard, login, and FlashShell validation on a Sony VAIO VPCEB4L1E.