Yoctui
Yoctui is a terminal application for Yocto and BitBake development. It runs builds, shows tasks and logs, edits recipes and sources, inspects generated images, and manages development terminals.
Updated workflows
Production-renderer captures of the repaired screens. Fixture values illustrate the UI; GitUI panes replay real native output from a demo repository.
Current production-renderer screenshot. The deterministic gallery below is
generated from reviewed 160x50 Ratatui cell/style captures; it demonstrates
implemented UI flows without claiming a live build for the fixture values.
Raster provenance ·
Recorded live capture ·
Completed live build ·
Failed live build
Screenshots
Features
| Area | Features |
|---|---|
| Build environment | Source/build directory browser, manual path editing, environment-script detection, nested fresh-clone destinations, background cloning with Braille progress, initialization and connection checks |
| Dashboard and Tasks | Build/task state, progress, elapsed time, job history, background cancellation, clean CPU/RAM/filesystem bars, disk/network histories |
| Logs and Errors | Live follow/pause, filters, search, bookmarks, wrapping, horizontal scrolling, copy/export, task correlation and failure details; Yocto log panes use tui-logger |
| Layers and Recipes | Expandable layer tree using tui-tree-widget, provider/appends/tasks/patch inspection, syntax-aware file previews, source editing and external editors |
| Configuration | Effective values, overrides, provenance, scope comparison, reviewed local.conf edits and BBMASK |
| Dependencies and signatures | Recipe/task graphs, runtime dependencies, reverse traversal, why-built paths, signature inspection and diffsigs comparison |
| Devtool | Status, modify, source editing, recipe builds, update-recipe, finish into a layer, deploy and reset |
| Packages and Images | Generated pkgdata, installed packages, deployed artifacts, rootfs package pie chart using tui-piechart, filesystem tree, systemd units, system D-Bus configuration and udev rules |
| Kernel and firmware | Kernel and U-Boot/BIOS provider detection, configuration files, menuconfig, DTS/DTB/DTBO browsing and device-tree compile/decompile |
| Overview Insights | Timeline/critical path, rebuild causes, sstate/download outcomes, image size and retained size deltas, metadata provenance, package topology, supply-chain reports and disk history |
| Offline history | Saved build outcomes, machine, duration, bounded logs/tasks and explicit missing-evidence states; no daemon required |
| Source Git | Global branch, staged/unstaged/untracked/conflict and ahead/behind status; embedded GitUI diffs, staging and commits |
| Terminals | Daemon-owned shells, devshell/menuconfig, SSH and runqemu consoles using tui-term; split panes, resize, scrollback, copy/search and reconnect |
| SDK and Wic | Standard/extensible SDK builds and tests, installer inspection/publication, native tools, Wic creation and confirmed removable-device writing |
| Testing, Security and QA | Selftests, image/SDK tests, ptest, result comparison/JUnit export, CVE checks, SPDX/CycloneDX/manifest imports, recipe/kernel and layer checks |
| Raw Mode and Maintenance | Structured command catalog, argument previews, favorites/history, sstate checks/cleanup, PR/hash diagnostics, locked caches, buildhistory comparison and Git archives |
| Preferences and profiles | Color themes, reduced motion, ASCII/no-color views, keybindings, saved preferences, onboarding and optional team project profiles |
Actions depend on the connected Yocto environment and generated files. Unavailable actions show their prerequisites; a feature listed here is not a promise that every Poky release provides it.
Install
Use a Linux terminal of at least 80×24, Python 3, and a recent stable Rust/Cargo. Install the host packages required by your chosen Yocto release separately.
From crates.io:
From source:
Make sure Cargo's binary directory is on your PATH. An already-running client or daemon keeps its old executable until restarted. Do not restart a daemon with active builds or terminal sessions merely to refresh the version.
Quickstart: Poky build environment
For a complete Poky checkout with oe-init-build-env at its root:
|| {
}
For a split checkout, the script may instead be at
$POKY_DIR/layers/openembedded-core/oe-init-build-env. Source that script with
the same build directory. Use a vendor-provided setup wrapper when the BSP
requires one.
Start the daemon from the initialized shell. daemon start does not retarget
an existing daemon to a different build directory; check yoctui daemon status
before switching workspaces.
To launch a build, press B, edit the target with e, enter
core-image-minimal, and confirm the build action. Opening Yoctui does not
start a build.
Configure paths inside Yoctui
Start yoctui without a configured environment and open Build environment:
- Press
eto open the Source/Build/Script form. - Select Source or Build with Tab. Press
bto browse oreto type/paste. - In the browser, Enter/Right opens a folder; Left/Backspace goes up.
Arrow keys, mouse wheel, PageUp/PageDown and Home/End move the selection.
Press
sto choose the current directory. - Choosing Source detects the usual environment script. Edit Script manually for a custom wrapper. The build directory must already exist.
- Press
sto save the form, thenVto initialize and verify. Esc discards the current edit/browser or closes the draft.
Browsing and saving do not start a daemon or execute the setup script.
A opens the advanced TOML editor. Persistent daemon sessions still require
starting the daemon from an initialized shell as shown above.
Navigation
| Key | Action |
|---|---|
F1 / ? |
Help |
F2 / F3 / F4 |
Tasks / History / Dashboard |
F5 / F6 / F7 / F8 |
Logs / Layers / Recipes / Images |
F9 / Ctrl+P |
Command palette |
F10 / a |
Application menu / context actions |
Tab / Shift+Tab |
Change focus; some workspaces use Tab for their views |
Arrows, PageUp/PageDown, Home/End |
Move within lists and trees |
Right / Enter in Navigator |
Expand a group, then open and focus its workspace |
Left in a tree |
Collapse or move to parent |
Esc |
Close the active context, return to Navigator, then Dashboard |
/ |
Search build-file contents, generated rootfs and text image artifacts; opens empty (outside editors and local search fields) |
B |
Image build options |
q |
Request exit; confirmation required |
The footer lists shortcuts for the current view. Dialogs and editors own
their keys before global navigation. Terminal writers retain normal keys; use
Ctrl+B for Yoctui terminal controls. See the keymap for
terminal-prefix commands and custom bindings.
Build, logs and errors
- Use
Bfor an image build, orbon a selected recipe. - Open Tasks with
F2; use its filters to inspect active or failed tasks. - Open Logs with
F5.fresumes live follow; navigation pauses follow.wtoggles wrapping. Context actions expose local search and filters. - Open Errors from the Navigator to inspect failures and their source logs.
- Use the cancel action and confirm it to stop a build. Exiting the client is separate from cancelling a daemon-owned build.
Logs show output acquired by Yoctui, not every log file on the host. Retention is bounded. Log controls and limits.
Search source code and generated content
Press / and enter a case-insensitive Rust regex, for example
systemd|udev. Search includes actions and available content from recipes
(.bb, .bbappend, .inc), configuration, classes, layer scripts, Poky and
BitBake sources, build logs, pkgdata and generated metadata. Retained rootfs
trees are included, so an installed service file can match by its contents.
Results show file/line and image origin where known; Enter opens the result.
The search skips symlinks, binary/oversized files, downloads, sstate and other
large caches, and returns at most 500 hits. It is not an exhaustive disk index.
Editors and terminals retain literal /; use their own search controls.
Offline use and saved builds
Screens remain reachable without a configured build environment or a connected daemon. Setup and connection are separate: local source files and Git can remain usable while live build actions are unavailable. Disconnected screens label retained data as last observed; they do not claim a build is idle or successful.
| Connection state | Available work |
|---|---|
| No environment | Configure/clone, saved builds, Settings and Help |
| Configured, disconnected | Local files and Git, retained information and saved history |
| Connected, idle | Supported workflows and build launch |
| Connection lost | Last-observed data with its update age, saved history and automatic reconnect |
Press F3 for history. Up/Down selects a saved build; Enter opens details. Use Left/Right for Summary, Logs, Tasks and Errors; PgUp/PgDn scrolls; Esc returns to the list. r reloads saved records and l switches between saved records and live job history when connected. Viewing history never replaces live task/log state or grants control over an old process.
The updated daemon saves builds without an attached client. It checkpoints active
builds every 30 seconds and terminal transitions promptly in a background worker.
Storage is private under $XDG_STATE_HOME/yoctui/build-history/history.json
(default ~/.local/state/yoctui/build-history/history.json). Retention is bounded
to 32 builds and 8 MiB, with at most 256 log records and 256 task rows per build.
Each message is limited to 4096 UTF-8 bytes. These are saved excerpts, not complete
transcripts. Legacy builds show summaries when logs or task details were never saved.
A failure record states when the backend did not preserve a distinct cancellation
outcome. Incomplete records are last observations, never proof of a running build.
Offline startup does not run BitBake metadata probes. On the Dashboard, E opens
Build Environment and F3 opens history. To connect, start the updated daemon
from your initialized Yocto shell with yoctui daemon start; the client retries
automatically. A daemon started before this release must be restarted after its
active work finishes to enable the new history checkpoints.
GitUI requires a selected source repository, but no build environment verification. Without a daemon, its launch preview offers the current terminal; quitting GitUI restores Yoctui. A detected detached terminal is also available.
Source Git status
The global header shows the selected source repository and its Git state:
+N staged, ~N unstaged, ?N untracked, and !N conflicted files.
Ahead/behind counts compare against the last fetched upstream; synced* means
those recorded commits match. Local changes remain visible independently.
No upstream is shown explicitly. Status refreshes in the background without fetching.
GitUI source workbench
Install GitUI on your PATH,
then restart Yoctui. Choose F10 → Tools → Open GitUI, or search for GitUI in
Ctrl+P. Review the source directory and choose the embedded terminal.
Press o to take writer control. GitUI provides diffs, staging, commit messages,
branch management, fetch and push; its footer shows the active keys.
Use Ctrl+B t for the session list. Git status refreshes automatically.
Edit recipes and develop a patch
In Layers, Enter opens a layer tree, Right/Left expands/collapses directories,
and PageUp/PageDown moves through it. The selected text file appears beside
the tree; [/] scrolls a long preview.
In Recipes:
- Select a recipe. Enter loads its details;
eopens the provider for editing. - Use
tto refresh Devtool status anddto reviewdevtool modifyor open its existing source workspace. - Edit the source and save with
Ctrl+S. The editor provides syntax highlighting, navigation, search, undo/redo and a diff view; it is not an LSP or a replacement for VS Code's extension system. - Press
Ctrl+Bfrom the saved editor to review a build of that recipe. - Use
ufordevtool update-recipe, or commit the source changes and useFfordevtool finishinto a selected layer. Review the destination and changes before confirming. - Inspect the generated patch and recipe/bbappend, then rebuild the recipe.
Use p to inspect recipe patches and o for task logs. P previews
deployment and D previews a destructive Devtool reset.
Shell/devshell/menuconfig actions offer an embedded session or a detached
terminal when supported. External editing restores Yoctui after the editor
exits. Editing and Devtool details.
Inspect an image, its packages and rootfs
Open Images with F8. Select a deployed artifact, press R to rescan if
needed, and use the numbered views:
| Key | View |
|---|---|
1 |
Deployed artifacts |
2 |
Installed packages and size pie chart |
3 |
Rootfs filesystem |
4 |
Systemd services |
5 |
System D-Bus |
6 |
udev rules |
Package composition needs the selected image's manifest and generated pkgdata.
The filesystem, services, D-Bus and udev views need its retained
IMAGE_ROOTFS. Yoctui does not automatically mount or extract ext4/Wic images.
With rm_work, package information may remain while filesystem data is gone.
The udev view lists rules, overrides and masks; [/] scrolls the preview.
Service and D-Bus views describe installed files, not live unit/bus state.
No rule is executed. Changes made directly to staged rootfs files can be
overwritten by BitBake; make lasting changes in a recipe or layer.
The pie chart retains an exact size table and falls back to tables in narrow or accessible layouts. Rootfs details.
Boot with QEMU or connect over SSH
With an image artifact selected, press T in Images:
- Boot with QEMU: review the image and options. The embedded console uses
runqemuwithnographicandserialstdio. - Connect over SSH: enter the host, user, port and optional identity file. This connects to a running target; it does not boot it. OpenSSH's host-key checks remain enabled.
Confirming creates a daemon-owned Terminal Session. Ctrl+B, then o,
takes writer control. Q opens the advanced QEMU options.
| Prefix sequence | Action |
|---|---|
Ctrl+B c |
Create a build shell |
Ctrl+B n / Ctrl+B p |
Next / previous session |
Ctrl+B % / Ctrl+B " |
Split panes |
Ctrl+B z |
Zoom pane |
Ctrl+B [ / Ctrl+B / |
Copy / search |
Ctrl+B d |
Detach client; keep the process |
Ctrl+B K |
Confirm process termination |
Ctrl+B ? |
Prefix help |
Press the prefix and its command separately. ! opens an inherited shell
outside the TUI; exit that shell to return.
Terminal sessions.
Kernel, firmware and build analysis
Open Kernel or U-Boot / BIOS in the Navigator. Tab switches Configuration
and Device trees. Enter/e opens a text file; m opens menuconfig when the
selected provider supports it. Kernel and U-Boot menuconfig retain their native
ncurses layout, colors and key handling inside Terminal Sessions. The selected
session uses the full workspace beside the Navigator, omits the passive
Inspector and prefix-help rail, and resizes its PTY to the visible split pane.
The editor recognizes DTS/DTSI syntax and highlights directives, nodes,
properties, values and comments. With dtc available, c opens typed compile
options for symbols, stable sorting, padding and reserve entries before the
exact terminal-launch preview; d decompiles DTB/DTBO. Output uses a
.yoctui name and refuses overwrites.
Kernel and firmware guide.
Open Overview → Insights and choose 1–8 for timeline, rebuild causes,
sstate/downloads, image size, metadata provenance, package dependencies,
supply-chain coverage or disk history. These views use loaded data; missing
timestamps or reports are not estimates.
Use Dependencies for recipe/task graphs. In Recipes, Z opens signature
history; choose two sides with 1/2 and compare with c. Configuration
shows effective values and their source files. Reviewed edits target supported
assignments in conf/local.conf, rather than rewriting arbitrary metadata.
SDK, Wic, tests, security and maintenance
- SDK:
s/Ereviews standard/extensible SDK builds;t/Treviews SDK tests;Rrescans installers;Previews publication;nopens native tools. Actions use the active image, machine and distro. - Wic:
Win Images opens creation options.Dreviews writing an eligible removable device, requiring the exact device phrase and confirmation. Yoctui does not invoke sudo for device writing. - Testing: launch supported selftests, image/SDK tests or ptests; import results, compare runs and export JUnit. Review the operation before starting.
- Security: run supported CVE/SBOM tasks or import SPDX, CycloneDX JSON and legacy image manifests. A manifest supplies package/version information, not a full SBOM.
- QA: run available recipe/kernel checks or layer checks, then inspect findings and source locations.
- Raw Mode: select a command category and command, edit structured arguments, review the argv preview, then run. Keep common requests as favorites.
- Maintenance: use
[/]to choose Sstate, Services, Release or Integrations. Cleanup requires an exact candidate preview and confirmation. Service diagnostics are observational; Integrations detects tools rather than automatically uploading reports or managing Toaster.
See the operator guide for per-view controls and prerequisites. None of these workflows silently changes BitBake parallelism.
Daemon and remote use
The daemon keeps jobs and PTYs alive when a client disconnects. Connect to the
build host over SSH, then run yoctui attach there; the daemon uses a local
per-user Unix socket, not a public TCP listener.
After all work has stopped, use yoctui daemon restart to load a newly installed
binary, or yoctui daemon stop to stop it. After a host reboot, lost child
processes are reported as Lost; saved metadata does not resurrect them.
Optional systemd user-service setup:
Arrange the required Yocto environment before starting the user service. Installing a unit alone does not initialize a build environment.
Settings and team profiles
Settings controls themes, mouse input, reduced motion, ASCII/no-color rendering and keybindings. Preferences are local to the user.
A repository may also contain .yoctui/project.toml:
= 1
[]
= ["base-files"]
= ["core-image-minimal"]
= ["core"]
[[]]
= "minimal"
= ["core-image-minimal"]
= "qemux86-64"
[]
= 8
= false
[[]]
= "refresh-metadata"
[[]]
= "refresh_metadata"
Inspect it with yoctui --build-dir "$BUILDDIR" profile. Loading a profile does
not execute it. Profiles store shared names and build intent, not credentials,
host paths or shell hooks. Select a preset and review its request before running.
Compatibility and troubleshooting
Yoctui functionality is Yocto-feature-correlated: available actions depend on the connected environment's tools, tasks and capability checks. The same binary may expose different actions in different builds.
Open Compatibility for detected versions and reasons for disabled actions:
The recorded supported anchors are Scarthgap 5.0.19 / BitBake 2.8.1 and Wrynose 6.0.2 / BitBake 2.18.0. Exact revisions, evidence expiry and host limits are in the compatibility matrix. Other versions need their own checks; a version number alone does not establish support.
| Symptom | Check |
|---|---|
| Daemon unavailable | Start it from the initialized Yocto shell; check yoctui daemon status |
| Wrong workspace or old version | Check type -a yoctui, yoctui --version and the daemon's build directory; restart only when work is stopped |
| Packages unavailable after a build | Select the correct image and refresh; confirm its manifest and tmp/pkgdata still exist |
| No rootfs tree/services/udev | Confirm the reported IMAGE_ROOTFS was not cleaned; deploy artifacts alone are insufficient |
| Logs stop following | Press f in Logs; navigation pauses follow |
| Disabled workflow | Read its Compatibility reason and verify the required tool/task/configuration |
| Host overloaded or nearly full | Inspect telemetry and disk space; choose build parallelism/cleanup yourself |
Performance evidence
The checked Flamegraph is a real userspace perf capture of the deterministic
large-metadata workbench at v0.1.64 on September 6, 2026. It completed 6,000
frames with 2,403 real userspace samples, workload checksum
95d507f9b14b71d6, and zero unresolved frames. This is historical profiling
evidence because rendering and model sources have changed since that capture;
it is not source-bound performance certification for the current release.
Machine-readable summary · Profiling method and current limits
Reproduce the current-source report on a Linux host that permits userspace
perf sampling:
Development and license
Testing · Profiling · Performance contract · UI specification · Architecture · Implementation status
Yoctui is MIT-licensed. Dependency licenses are listed in third-party notices. The offline systemd service view was informed by the MIT-licensed systemd-manager-tui by Matheus-git; Yoctui uses its own parser for unbooted images.