frankentui
SkillAI & modelsBuild showcase-grade FrankenTUI screens. Use when working in ftui-demo-showcase, diagnosing TUI issues with doctor_frankentui, polishing TUI UX, or replacing placeholder interfaces.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the frankentui skill
What this skill tells your AI
The instructions your AI receives, as published by lev-os/agents in skills-db/design-ux/frankentui/SKILL.md and read by ahel’s review.
Table of Contents
- Mandatory First Pass
- Non-Negotiable Showcase Contract (Global Shell, Color, Search, Markdown, Panes, Forms, Space, Drag, i18n, Diagnostics, Responsive, Text Editing, Config, Hyperlinks)
- Cross-Cutting Design Patterns
- doctor_frankentui Diagnostic Workflow (Visual-First)
- Quick Router | Workflow | Quality Gates | Cass Mining | Anti-Slop Rule | References
Skill for architecture-accurate, showcase-level work in FrankenTUI, especially
ftui-demo-showcase.
Mandatory First Pass
- Read
AGENTS.mdfully. - Read
README.mdfully. - Run cass archaeology before major polish work:
cass status --json && cass index --jsoncass search "under construction placeholder" --workspace /data/projects/frankentui --json --fields minimal --limit 20cass search "mind-blowing dashboard" --workspace /data/projects/frankentui --json --fields minimal --limit 20cass search "improve TUI" --workspace /data/projects/frankentui --json --fields minimal --limit 20
- Verify runtime architecture contracts before editing:
crates/ftui-core/src/terminal_session.rscrates/ftui-runtime/src/program.rscrates/ftui-runtime/src/terminal_writer.rscrates/ftui-render/src/{frame.rs,buffer.rs,diff.rs,presenter.rs}
Non-Negotiable Showcase Contract
If the task is "make this screen good" or "upgrade weak TUI UI", treat these as default requirements.
Important: this contract is capability-gated.
- Global shell + discoverability + resize resilience are always required.
- Feature-specific contracts (search, markdown streaming, adjustable panes, forms) are required only when that capability is part of the screen.
Global Shell Invariants (Always)
Ctrl+Tcycles theme globally and must remain reachable:- app key handler:
crates/ftui-demo-showcase/src/app.rs:3805 - palette command:
crates/ftui-demo-showcase/src/app.rs:3043 - palette dispatch:
crates/ftui-demo-showcase/src/app.rs:4870
- app key handler:
- Tab strip is not optional chrome. It is screen navigation + visual identity:
- tab rendering + hit regions:
crates/ftui-demo-showcase/src/chrome.rs:330 - per-screen accent backgrounds in active tabs:
crates/ftui-demo-showcase/src/chrome.rs:362 - accent map for every screen:
crates/ftui-demo-showcase/src/chrome.rs:1298 - accent token source:
crates/ftui-demo-showcase/src/theme.rs:260
- tab rendering + hit regions:
- Bottom status bar must communicate navigation and state:
- status bar renderer:
crates/ftui-demo-showcase/src/chrome.rs:595 - tab navigation hint text:
crates/ftui-demo-showcase/src/chrome.rs:726 - clickable state toggles and hit regions:
crates/ftui-demo-showcase/src/chrome.rs:636
- status bar renderer:
- Help overlay must merge global and screen-specific keybindings:
- keybinding hint builder:
crates/ftui-demo-showcase/src/chrome.rs:1109 - help modal renderer:
crates/ftui-demo-showcase/src/chrome.rs:1176 - current screen binding handoff:
crates/ftui-demo-showcase/src/app.rs:4058
- keybinding hint builder:
Color Harmony Invariants (Always)
- Prefer curated theme tokens over ad-hoc color choices.
- screen accent palette:
crates/ftui-demo-showcase/src/theme.rs:260
- screen accent palette:
- Explicitly support standard demo theme rotation via
Ctrl+T:Cyberpunk AuroraDarculaLumen LightNordic Frost- plus accessibility
High Contrastsupport - canonical theme enum + names:
crates/ftui-extras/src/theme.rs:26 - standard theme set (non-accessibility):
crates/ftui-extras/src/theme.rs:49 - app default theme starts at Cyberpunk Aurora:
crates/ftui-demo-showcase/src/app.rs:2652
- Use neutral tones for large surfaces/chrome, and reserve higher-chroma accents for focus/highlights.
- tab bar neutral base:
crates/ftui-demo-showcase/src/theme.rs:723 - status bar neutral base:
crates/ftui-demo-showcase/src/theme.rs:736 - focused panel accent rule:
crates/ftui-demo-showcase/src/theme.rs:779
- tab bar neutral base:
- Keep semantic color mappings intentional (status, priority, screen accents).
- semantic style system:
crates/ftui-demo-showcase/src/theme.rs:32
- semantic style system:
- Respect contrast discipline already encoded in theme tests.
- WCAG contrast test suite:
crates/ftui-demo-showcase/src/theme.rs:1309 - screen accent contrast validation:
crates/ftui-demo-showcase/src/theme.rs:1459
- WCAG contrast test suite:
Search Excellence Invariants (When Search Exists)
- Search-as-you-type (not submit-only).
- Clear focus entry and exit (
/orCtrl+F,Esc). - Fast match navigation (
Enter/Tab/arrows andn/Nstyle repeat). - Match count visibility (
current/total) in search bar and/or status bar. - Strong visual hierarchy for matches:
- list-level marker/gutter style,
- line-level highlight,
- active-match emphasis stronger than passive matches.
- Contextual affordances around results:
- match radar/density sparkline,
- nearest context snippet,
- summary panel.
Reference implementations:
- Shakespeare:
crates/ftui-demo-showcase/src/screens/shakespeare.rs - SQLite Code Explorer:
crates/ftui-demo-showcase/src/screens/code_explorer.rs - Log Search:
crates/ftui-demo-showcase/src/screens/log_search.rs - Virtualized Search:
crates/ftui-demo-showcase/src/screens/virtualized_search.rs - Markdown Live Editor:
crates/ftui-demo-showcase/src/screens/markdown_live_editor.rs
Streaming Markdown Invariants (When Markdown/LLM Output Exists)
- Use full GFM-style rendering (tables, task lists, admonitions, math, syntax-highlighted code).
- themed markdown + GFM extensions:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:578
- themed markdown + GFM extensions:
- Support true incremental rendering for streaming output (not full re-render only at completion).
- stream fragment renderer:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:676 - streaming renderer call:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:686
- stream fragment renderer:
- Show explicit stream status and progress.
- streaming panel status + progress:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:905 - mini progress bar:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:952
- streaming panel status + progress:
- Provide direct controls for stream lifecycle.
- play/pause + turbo + restart keys:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:1101 - focus-aware scroll controls:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:1053
- play/pause + turbo + restart keys:
Dynamic Pane Invariants (When Multi-Panel Layout Exists)
- Model pane geometry explicitly and map pointer position to active/focused pane.
- panel hit mapping:
crates/ftui-demo-showcase/src/screens/dashboard.rs:3414
- panel hit mapping:
- Render visible splitter handles and support drag-to-resize with clamped bounds.
- splitter drag update:
crates/ftui-demo-showcase/src/screens/dashboard.rs:3452 - splitter handle renderer:
crates/ftui-demo-showcase/src/screens/dashboard.rs:5620
- splitter drag update:
- Keep drag state robust (cancel/clear on mouse-up and keyboard interaction).
- drag lifecycle in update:
crates/ftui-demo-showcase/src/screens/dashboard.rs:6006 - keyboard clears drag latch:
crates/ftui-demo-showcase/src/screens/dashboard.rs:6099
- drag lifecycle in update:
- Register pane hit regions so mouse navigation and deep links stay reliable.
- pane hit registration:
crates/ftui-demo-showcase/src/screens/dashboard.rs:5597
- pane hit registration:
Multi-Section Visual Delineation Invariants (When Screen Has Many Sections)
- Major sections should be visually boxed with rounded borders.
- dashboard panels use rounded borders:
crates/ftui-demo-showcase/src/screens/dashboard.rs:3847 - forms panels use rounded borders:
crates/ftui-demo-showcase/src/screens/forms_input.rs:764
- dashboard panels use rounded borders:
- Section borders/colors should encode semantics (focus/state/domain accents), not random decoration.
- semantic panel border styling with screen accents:
crates/ftui-demo-showcase/src/screens/dashboard.rs:3852 - data-viz panel accent styling by focus:
crates/ftui-demo-showcase/src/screens/data_viz.rs:113 - form panel semantic accent/focus:
crates/ftui-demo-showcase/src/screens/forms_input.rs:760
- semantic panel border styling with screen accents:
Forms Invariants (When Data Entry Exists)
- Support mixed form/input affordances with explicit focus management.
- panel focus model:
crates/ftui-demo-showcase/src/screens/forms_input.rs:34 - left/right panel rendering:
crates/ftui-demo-showcase/src/screens/forms_input.rs:1077
- panel focus model:
- Use validation with user-state awareness (dirty/touched vs forced full validation).
- touched/dirty filtered validation:
crates/ftui-demo-showcase/src/screens/forms_input.rs:430 - summary badges (ready/errors/progress):
crates/ftui-demo-showcase/src/screens/forms_input.rs:506
- touched/dirty filtered validation:
- Include undo/redo and visible history for confidence while editing.
- undo/redo stack ops:
crates/ftui-demo-showcase/src/screens/forms_input.rs:693 - undo history panel:
crates/ftui-demo-showcase/src/screens/forms_input.rs:721
- undo/redo stack ops:
- Provide robust validation demo patterns (real-time vs on-submit, error summary, injection).
- mode toggle + immediate behavior:
crates/ftui-demo-showcase/src/screens/form_validation.rs:342 - submit flow + notifications:
crates/ftui-demo-showcase/src/screens/form_validation.rs:309 - error summary panel:
crates/ftui-demo-showcase/src/screens/form_validation.rs:361
- mode toggle + immediate behavior:
Space-Constrained Resilience Invariants (Always)
- Screens must degrade gracefully and still show meaningful content in tight terminals.
- Use explicit layout tiers with a tiny fallback for constrained sizes.
- tier switch:
crates/ftui-demo-showcase/src/screens/dashboard.rs:6174 - tiny layout fallback:
crates/ftui-demo-showcase/src/screens/dashboard.rs:5813
- tier switch:
- Gate optional subpanels by area so core controls remain visible.
- forms header/footer gating by height:
crates/ftui-demo-showcase/src/screens/forms_input.rs:779 - undo panel suppressed when too small:
crates/ftui-demo-showcase/src/screens/forms_input.rs:722
- forms header/footer gating by height:
- Guard empty areas and keep rendering no-op safe.
- markdown screen empty-area guard:
crates/ftui-demo-showcase/src/screens/markdown_rich_text.rs:1128 - forms screen empty-area guard:
crates/ftui-demo-showcase/src/screens/forms_input.rs:1077
- markdown screen empty-area guard:
- Add tests proving small-size behavior.
- dashboard threshold tests:
crates/ftui-demo-showcase/src/screens/dashboard.rs:6586 - form validation small-size render test:
crates/ftui-demo-showcase/src/screens/form_validation.rs:739
- dashboard threshold tests:
Drag-and-Drop Invariants (When Drag-and-Drop Exists)
- Implement three-phase drag state machine: Down (arm) -> Drag (update hover) -> Up (commit or cancel).
- kanban drag protocol:
crates/ftui-demo-showcase/src/screens/kanban_board.rs:321 - drag_drop sortable + cross-container modes:
crates/ftui-demo-showcase/src/screens/drag_drop.rs:358
- kanban drag protocol:
- Provide full keyboard accessibility via
KeyboardDragManagerwith announcements for screen readers.- keyboard drag handler:
crates/ftui-demo-showcase/src/screens/drag_drop.rs:358 - drop target info builder:
crates/ftui-demo-showcase/src/screens/drag_drop.rs:446
- keyboard drag handler:
- Show visual feedback layers: dimmed ghost for drag source, highlight for drop target, focus indicator for keyboard.
- drag source dimming:
crates/ftui-demo-showcase/src/screens/kanban_board.rs:476 - drop target highlight:
crates/ftui-demo-showcase/src/screens/kanban_board.rs:464
- drag source dimming:
- Sync keyboard focus and mouse selection to the same item on every interaction.
- focus sync on click:
crates/ftui-demo-showcase/src/screens/kanban_board.rs:898
- focus sync on click:
- Include undo/redo for drag operations.
- drag undo/redo stack:
crates/ftui-demo-showcase/src/screens/kanban_board.rs:668
- drag undo/redo stack:
Reference implementations:
- Kanban Board:
crates/ftui-demo-showcase/src/screens/kanban_board.rs - Drag-Drop Demo:
crates/ftui-demo-showcase/src/screens/drag_drop.rs
Accessibility and i18n Invariants (When Internationalized or Keyboard-Heavy)
- Use
display_width()for layout,grapheme_count()for editing positions. Never use.len()for display measurement.- i18n width metrics:
crates/ftui-demo-showcase/src/screens/i18n_demo.rs:677
- i18n width metrics:
- Handle combining marks, CJK double-width, emoji ZWJ sequences, and flag emojis correctly.
- grapheme stress tests:
crates/ftui-demo-showcase/src/screens/i18n_demo.rs:100
- grapheme stress tests:
- Support RTL flow direction via
Flex::flow_direction()for Arabic and Hebrew layouts.- RTL mirroring:
crates/ftui-demo-showcase/src/screens/i18n_demo.rs:606
- RTL mirroring:
- Use
StringCatalogwith plural forms for multi-locale text (one/few/many/other).- plural form system:
crates/ftui-demo-showcase/src/screens/i18n_demo.rs:1064
- plural form system:
- Provide full keyboard navigation as a peer to mouse (Tab/Shift-Tab panel cycling, arrow/vim navigation, Space/Enter activation).
- mouse playground keyboard nav:
crates/ftui-demo-showcase/src/screens/mouse_playground.rs:1049 - drag_drop keyboard drag:
crates/ftui-demo-showcase/src/screens/drag_drop.rs:358
- mouse playground keyboard nav:
Diagnostic and Telemetry Invariants (When Debugging/Inspection Surfaces Exist)
- Use JSONL structured logging with monotonic sequence numbers and FNV-1a checksums for verification.
- diagnostic entry format:
crates/ftui-demo-showcase/src/screens/mouse_playground.rs:173 - determinism export format:
crates/ftui-demo-showcase/src/screens/determinism_lab.rs:579
- diagnostic entry format:
- Support environment-variable-driven configuration for log paths and deterministic mode.
- env var config:
crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:52
- env var config:
- Provide telemetry hooks (callbacks) for external observers without modifying core logic.
- telemetry hooks:
crates/ftui-demo-showcase/src/screens/mouse_playground.rs:476
- telemetry hooks:
- Enable deterministic replay via seed-driven pseudo-random generation (LCG).
- deterministic buffer gen:
crates/ftui-demo-showcase/src/screens/determinism_lab.rs:296
- deterministic buffer gen:
- Display Bayesian evidence (posterior parameters, log Bayes factors, e-values, conformal bounds) when introspecting runtime decisions.
- evidence cockpit:
crates/ftui-demo-showcase/src/screens/explainability_cockpit.rs:693 - VOI overlay:
crates/ftui-demo-showcase/src/screens/voi_overlay.rs:140
- evidence cockpit:
Reference implementations:
- Explainability Cockpit:
crates/ftui-demo-showcase/src/screens/explainability_cockpit.rs - VOI Overlay:
crates/ftui-demo-showcase/src/screens/voi_overlay.rs - Determinism Lab:
crates/ftui-demo-showcase/src/screens/determinism_lab.rs - Mouse Playground:
crates/ftui-demo-showcase/src/screens/mouse_playground.rs
Responsive Layout Invariants (When Breakpoint-Driven Layouts Exist)
- Use
ResponsiveLayoutwithBreakpointtiers (XS/SM/MD/LG/XL) for structured responsive design.- breakpoint-driven layout:
crates/ftui-demo-showcase/src/screens/responsive_demo.rs:134
- breakpoint-driven layout:
- Use
Visibility::visible_above()to conditionally hide components below their breakpoint tier.- visibility gating:
crates/ftui-demo-showcase/src/screens/responsive_demo.rs:289
- visibility gating:
- Use
Responsive<T>::resolve(bp)for per-breakpoint value switching (padding, labels, sizing).- responsive values:
crates/ftui-demo-showcase/src/screens/responsive_demo.rs:309
- responsive values:
- For content-aware sizing, compute constraints procedurally at render time with minimum floors.
- intrinsic sizing with floors:
crates/ftui-demo-showcase/src/screens/intrinsic_sizing.rs:252
- intrinsic sizing with floors:
- Use
LayoutDebugger+LayoutRecord+ConstraintOverlayto visualize constraint solver behavior during development.- layout inspector:
crates/ftui-demo-showcase/src/screens/layout_inspector.rs:273
- layout inspector:
Reference implementations:
- Responsive Demo:
crates/ftui-demo-showcase/src/screens/responsive_demo.rs - Intrinsic Sizing:
crates/ftui-demo-showcase/src/screens/intrinsic_sizing.rs - Layout Inspector:
crates/ftui-demo-showcase/src/screens/layout_inspector.rs
Text Editing Invariants (When Text Editor Surfaces Exist)
- Use
TextAreawidget with line numbers, soft wrap, and cursor tracking.- text editor setup:
crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:1542 - markdown editor with soft wrap:
crates/ftui-demo-showcase/src/screens/markdown_live_editor.rs:183
- text editor setup:
- Implement search/replace with
search_ascii_case_insensitive()returning byte-range results.- search implementation:
crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:868 - replace implementation:
crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:997
- search implementation:
- Convert between byte offsets and line/grapheme positions for cursor jumps.
- byte-to-cursor conversion:
crates/ftui-demo-showcase/src/screens/markdown_live_editor.rs:296
- byte-to-cursor conversion:
- Provide undo/redo via
VecDeque<String>with bounded history (FIFO eviction at limit).- undo stack:
crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:647
- undo stack:
- For live preview (markdown), re-render only on content change, not every frame.
- cached preview rendering:
crates/ftui-demo-showcase/src/screens/markdown_live_editor.rs:280
- cached preview rendering:
Reference implementations:
- Advanced Text Editor:
crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs - Markdown Live Editor:
crates/ftui-demo-showcase/src/screens/markdown_live_editor.rs
Configuration and Persistence Invariants (When User Configuration Exists)
- Use serde
Serialize/Deserializesnapshot types for JSON round-trip import/export.- widget builder snapshots:
crates/ftui-demo-showcase/src/screens/widget_builder.rs:134 - table theme spec:
crates/ftui-demo-showcase/src/screens/table_theme_gallery.rs:478
- widget builder snapshots:
- Provide built-in presets (read-only) plus user-saveable custom presets.
- preset system:
crates/ftui-demo-showcase/src/screens/widget_builder.rs:226 - custom preset saving:
crates/ftui-demo-showcase/src/screens/table_theme_gallery.rs:216
- preset system:
- Use FNV-1a hashing for regression detection on configuration snapshots.
- props hash:
crates/ftui-demo-showcase/src/screens/widget_builder.rs:934
- props hash:
- Validate imported data before applying (spec.validate() pattern).
- import validation:
crates/ftui-demo-showcase/src/screens/table_theme_gallery.rs:478
- import validation:
Reference implementations:
- Widget Builder:
crates/ftui-demo-showcase/src/screens/widget_builder.rs - Table Theme Gallery:
crates/ftui-demo-showcase/src/screens/table_theme_gallery.rs
Hyperlink and Terminal Feature Invariants (When OSC-8 Links Exist)
- Register links with
frame.register_link(url)and hit regions withframe.register_hit(rect, hit_id, HitRegion::Link, link_id).- link registration:
crates/ftui-demo-showcase/src/screens/hyperlink_playground.rs:290
- link registration:
- Provide keyboard navigation (Up/Down/Tab) as a peer to mouse hover/click for link activation.
- keyboard link nav:
crates/ftui-demo-showcase/src/screens/hyperlink_playground.rs:81
- keyboard link nav:
- Show visual distinction for focused vs hovered vs default links.
- link styling:
crates/ftui-demo-showcase/src/screens/hyperlink_playground.rs:310
- link styling:
Reference implementation:
- Hyperlink Playground:
crates/ftui-demo-showcase/src/screens/hyperlink_playground.rs
Cross-Cutting Design Patterns
These patterns recur across many screens and should be applied consistently. See also ARCHITECTURE.md sections 9-17 for full details.
Layout Caching for Hit-Testing
Store layout rectangles in Cell<Rect> during view(), read them in update() for mouse hit-testing.
This decouples rendering from event handling and avoids borrow checker issues.
// In view(): self.layout_panel.set(panel_rect);
// In update(): if self.layout_panel.get().contains(mouse.x, mouse.y) { ... }
Every interactive screen uses this pattern:
crates/ftui-demo-showcase/src/screens/dashboard.rs:5597crates/ftui-demo-showcase/src/screens/kanban_board.rs:870crates/ftui-demo-showcase/src/screens/drag_drop.rs:112
Enum-Driven Focus Management
Use an enum to model which panel has focus. Implement next()/prev() for cycling.
Mouse clicks set focus via hit-testing. Keyboard navigation uses Tab/Shift-Tab or directional keys.
enum FocusPanel { Editor, Search, Replace, View }
Examples:
crates/ftui-demo-showcase/src/screens/forms_input.rs:34crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:588crates/ftui-demo-showcase/src/screens/shakespeare.rs:343
Basis Points for Splitter Ratios
Use basis points (0-10000 bps) instead of pixels for resizable splitter positions. This survives terminal resizing without losing user intent.
crates/ftui-demo-showcase/src/screens/dashboard.rs:3442
Tick-Driven Animation
Use tick_count: u64 and time: f64 = tick_count as f64 * factor for smooth animation.
Apply to gradient phases, text effects, sparkline updates, and streaming progression.
crates/ftui-demo-showcase/src/screens/dashboard.rs:3557crates/ftui-demo-showcase/src/screens/shakespeare.rs:873
RefCell for Interior Mutability in Stateful Widgets
Use RefCell<WidgetState> to allow view() (which takes &self) to mutate widget state
when required by the framework's stateful widget rendering pattern.
crates/ftui-demo-showcase/src/screens/forms_input.rs:1077crates/ftui-demo-showcase/src/screens/form_validation.rs:65
VecDeque Ring Buffers for Bounded History
Use VecDeque<T> with pop_front() at capacity for bounded logs, undo stacks, and timelines.
crates/ftui-demo-showcase/src/screens/inline_mode_story.rs:246crates/ftui-demo-showcase/src/screens/advanced_text_editor.rs:647
Deterministic Mode for Testing
Support environment-variable-driven deterministic mode that replaces timestamps with tick counts and uses fixed seeds for reproducible test scenarios.
crates/ftui-demo-showcase/src/screens/determinism_lab.rs:296crates/ftui-demo-showcase/src/screens/mouse_playground.rs:173
HoverStabilizer for Jitter Prevention
Use HoverStabilizer to prevent hover state flickering from noisy mouse position reports.
crates/ftui-demo-showcase/src/screens/mouse_playground.rs:635
doctor_frankentui Diagnostic Workflow (Visual-First)
doctor_frankentui is not just for pass/fail capture plumbing. Use it to see real UI states and catch showcase regressions.
Execution Checklist
- Capture full suite with
doctor_frankentui suite. - Inspect
report.jsonfor run health fields. - Inspect
snapshot.pngandtimeline_strip.pngfor every profile. - Patch profiles or screen code based on visual evidence.
- Rebuild
doctor_frankentuiif profile env files changed. - Re-run targeted profile, then full suite.
Decision tree:
- If
status=failed-> fix capture/runtime failure first. - If
status=okbut visuals are wrong -> treat as real bug and fix. - If
snapshotis shell but timeline shows UI -> fixsnapshot_second. - If timeline is shell-only -> debug app startup/exit behavior.
1) Build and run suite captures
Use rch for compile/test work:
cd /data/projects/frankentui
rch exec -- cargo build -p doctor_frankentui -p ftui-demo-showcase
Run the full demo showcase sweep:
RUN_ROOT="/tmp/doctor_frankentui_demo_audit_$(date +%Y%m%d_%H%M%S)"
./target/debug/doctor_frankentui suite \
--app-command '/data/projects/frankentui/target/debug/ftui-demo-showcase' \
--project-dir /data/projects/frankentui \
--run-root "$RUN_ROOT" \
--suite-name demo_showcase_audit \
--keep-going
2) Triage machine-readable run health
Do not stop at success=4 failure=0. Inspect per-run metadata:
REPORT="$RUN_ROOT/demo_showcase_audit/report.json"
jq -r '.runs[] | [
.profile,
.status,
("capture_error_reason=" + (.capture_error_reason // "null")),
("vhs_driver=" + (.vhs_driver_used // "unknown")),
("fallback_active=" + (.fallback_active|tostring)),
("snapshot_status=" + (.snapshot_status // "unknown")),
("snapshot_exists=" + (.snapshot_exists|tostring)),
("video_exists=" + (.video_exists|tostring)),
("video_duration_seconds=" + (.video_duration_seconds|tostring))
] | @tsv' "$REPORT"
3) Inspect visuals, not just JSON
Open each profile’s snapshot.png, and generate timeline strips from capture.mp4:
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 22
- Forks
- 2
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
frankentui- Source
- github.com/lev-os/agents