Readiness: Implemented
Start
Install
Install uf, then choose a JavaScript host for development, builds and tests.
uf supports macOS and Linux on x86-64 and ARM64, and Windows on x86-64. You also need Node.js, Bun or Deno. See JavaScript hosts for runtime differences.
From a release
On macOS, Linux or WSL2:
curl -fsSL https://setup.uniflowed.dev | sh
On Windows, use PowerShell:
irm https://setup.uniflowed.dev/install.ps1 | iex
The installer downloads the release for your platform and adds the uf, ufr
and ufx launchers to ~/.local/bin by default. Add that directory to PATH
if your terminal cannot find them. The installer does not edit your shell profile.
You can inspect the POSIX installer
or PowerShell installer before running it.
The POSIX script supports sh, bash and zsh.
Verify downloads
The installer checks SHA-256 checksums to detect damaged downloads. It can also verify the release's Sigstore signature against the GitHub release workflow's identity. Install cosign to enable signature verification.
Checksums from the download host alone do not establish who produced an archive.
Set UF_VERIFY_ORIGIN=require to require an origin check. With the default
auto, the installer reports when it cannot perform that check.
| Variable | Default | Purpose |
|---|---|---|
UF_VERIFY_ORIGIN | auto | require demands an origin check; off disables it |
UF_CHECKSUM_BASE | unset | Check a second digest from an independent host, using <base>/<version>/<asset>.sha256 |
UF_VERSION | latest | Install a specific version |
UF_RELEASE_BASE | unset | Download from a mirror using <base>/<version>/<asset> |
UF_INSTALL_ROOT | Platform data directory | Store versioned runtimes |
UF_BIN_DIR | ~/.local/bin | Store command launchers |
When origin checking is enabled, an invalid signature or a conflicting
independent checksum stops installation. Some older releases have no signature;
installing those with require needs an independent checksum source.
Windows paths
Windows uses .cmd launchers in %USERPROFILE%\.local\bin. The executables live
in versioned directories under %LOCALAPPDATA%\uf\runtimes, or
~/.local/share/uf/runtimes when LOCALAPPDATA is unset.
Use UF_INSTALL_ROOT and UF_BIN_DIR to choose other locations.
Update or roll back
uf self-update
This installs the newest release with the same download checks.
Use uf self-update --check to check without installing, or
uf self-update 0.0.0-alpha.35 to select a version.
To return to the previous installed version without downloading it again:
uf self-update --rollback
Previous runtimes remain in the install store. Running the installer again also records the version it replaces, so the same rollback command applies.
Pin a project to a release
A project can name the release of uf it runs on in uf.config.js:
export default defineConfig({
uf: "0.3.0",
});
Inside that project every uf command runs uf@0.3.0, installed on first use,
whatever uf self-update last switched the machine to. See
uf.
Uninstall
uf self-uninstall
The command lists what it will remove and asks for confirmation.
Use --dry-run to preview the list. It leaves projects, shell profiles and
unrelated executables unchanged.
With Nix
Run uf without installing it:
nix run github:ubugeeei-prod/uf
Or install uf, ufr and ufx into your profile:
nix profile install github:ubugeeei-prod/uf
To run another entry point directly, use a flake output such as
nix run github:ubugeeei-prod/uf#ufx.
System configuration
NixOS and nix-darwin expose nixosModules.default and darwinModules.default.
Home Manager uses homeManagerModules.default:
{
inputs.uf.url = "github:ubugeeei-prod/uf";
# NixOS or nix-darwin
imports = [ inputs.uf.nixosModules.default ];
programs.uf.enable = true;
}
You can also use the overlay to provide pkgs.uf:
{
nixpkgs.overlays = [ inputs.uf.overlays.default ];
environment.systemPackages = [ pkgs.uf ];
}
There is no binary cache yet. The first build compiles Flow and the React Compiler from source; use a release binary for a faster install.
The flake declares aarch64-darwin, aarch64-linux, x86_64-darwin and
x86_64-linux. CI builds x86_64-linux; it evaluates the other configurations
without building them.
From source
git clone --recurse-submodules https://github.com/ubugeeei-prod/uf
cd uf
tools/upstream/sync.sh
cargo build --release --bin uf
The repository pins its Rust nightly toolchain. rustup downloads it on the
first build. The sync script prepares the upstream Flow sources and patches.
The resulting binary is target/release/uf.
The JavaScript host
uf selects an available host for development, builds and tests:
| Host | Dev and build | Tests | Notes |
|---|---|---|---|
| Node.js | Yes | Yes | Default host; supports test coverage |
| Bun | Yes | Yes | Loads Flow through a preload plugin |
| Deno 2.8+ | Yes | Yes | Native addons and some Node APIs have runtime limits; coverage requires Node |
To select a host for the project:
uf use bun
This saves the choice in uf.config.js. Use uf info to see the selected host.
Testing covers test-host options and limitations.
Check the installation
uf info
This shows the uf version, selected host and current project. Reporting no project is normal outside a project directory.
Next, create your first project.
Edit this pagedocs/app/guide/install/$page.mdx