Ubunatic Coding

Stories · Terminal & TUI Stack · 🔎 fdapps

This project is in an early phase; its repository is not public yet. Copied from fdapps/docs/studies/2026-10-04-fdapps-story.md.

fdapps: Finding the App Behind the Icon

Desktop applications are easy to launch and surprisingly awkward to inspect. A user sees an icon in a launcher, but the useful answers are scattered across desktop-entry files, executable search paths, icon themes, and package-export directories. fdapps turns that scavenger hunt into one terminal tool: search installed applications, inspect their metadata, and act on what was found.

The project is a Go command-line application for freedesktop.org desktops such as GNOME, KDE, and XFCE. Its interactive terminal interface puts a searchable application list beside a live details pane. It also offers scriptable commands to list applications, launch one, open the folder holding its binary or icon, and render its icon in the terminal. Application discovery follows XDG data-directory precedence and also checks common Snap and Flatpak export locations. The tool reads local desktop metadata and launches existing desktop applications; it does not replace the desktop environment.

The work moved quickly from an app-details prototype to a usable explorer. Issues 001–008 cover the first product arc: parsing .desktop entries, pinned-app filtering, matching CLI filters to interactive search, launching applications, opening relevant folders, split-pane navigation, terminal icons, and a user-feedback polish batch. The repository's roadmap records a deliberate rule: interactive functions should have command-line equivalents, so the same capabilities remain scriptable and can be checked without driving the interface.

One episode captures why the workflow includes real terminal probes. In the September 10 polish sprint, an Escape-key fix looked plausible from code inspection and advisor review. The proposed os.File.SetReadDeadline approach failed on a real pseudo-terminal: the file type did not support deadlines, and Escape still waited for the full input timeout. A small pseudo-terminal experiment exposed the mismatch that unit tests using in-memory readers could not. The implementation switched to polling the raw terminal descriptor with unix.Poll, only when the buffered reader had no data. A timing check then measured about 30 milliseconds, matching the configured response timeout. The same sprint caught another composition bug: rendered icon lines began with terminal-clear control bytes that were harmless on standalone lines but corrupted text beside the icon. That appeared only when the exact split-pane composition was rendered and inspected.

These were not solved by adding more abstraction or trusting a plan. The team used canaries to test external mechanisms before depending on them, and pseudo-terminal checks for behavior that ordinary unit tests could not represent. Advisors helped narrow investigations to concrete code locations; implementation still had to validate the proposed mechanism on the actual interface. In the earlier icon investigation, a canary also corrected a mistaken assumption about SVG support in the public renderer API. The project recorded those misses in sprint retrospectives so future work could reuse the evidence instead of repeating the guess.

The repository shows meaningful breadth for a compact utility. It contains 46 Go test functions across parser, launcher, folder opener, pinned-app lookup, icon rendering, spec loading, and terminal UI packages. Ticket 008's polish batch changed 18 files with 833 insertions and 100 deletions, adding navigation handling, icon modes, spec-backed icon glyphs, and rendering tests. That breadth does not prove a single developer could not have made the tool; the stronger claim is that several focused agent reviews, canaries, and user-facing probes made a rapid sequence of small features and bug fixes more auditable. The valuable contribution was parallel investigation and disciplined verification, not autonomous code volume.

As of October 4, 2026, the source history had been quiet for a little over two weeks: the latest commit was September 17. The most recent six-week window contained 27 commits, mostly from the September build-out and release-preparation phase; version v0.1.1 and GoReleaser configuration were added September 14. Four feature tickets remain open, including grid navigation, lazy loading, active-app filtering, and usage statistics. The repository has no project website, so a future public page should explain the Linux desktop scope, show a short terminal capture, document installation requirements, and make the local application-data boundary clear.

Facts

Item Verified facts
Stack Go 1.26.5, Cobra CLI, YAML specs, x/sys / x/term, cati terminal image renderer
Scope freedesktop.org .desktop discovery; XDG paths; Snap/Flatpak exports; Unix terminal and desktop launch/open commands
Size 28 commits total; 27 in the six weeks before 2026-10-04; 46 Go test functions; 4 open tickets
Recent arc 2026-09-09 through 2026-09-17; TUI features, polish, rename, and v0.1.1 packaging prep
Evidence Issues 001–010, roadmap, canary programs, and September 9/10 sprint retrospectives