Agent skill

Slt

by subinium in subinium/SuperLightTUI

Build Rust TUI apps with SuperLightTUI v0.20 (immediate-mode terminal UI).

MITAuto-check passed

Install Slt

skills CLI
$ npx skills add subinium/SuperLightTUI --skill slt -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install subinium/SuperLightTUI slt --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/subinium/SuperLightTUI.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/slt .claude/skills/slt && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
slt
GitHub stars
191
Token cost
~5k tokens
SKILL.md length
1,509 words
Files
2
Skills in repo
4
Repo updated
First seen
Licence
MIT

At a glance

Build Rust TUI apps with SuperLightTUI v0.20 (immediate-mode terminal UI).

  • Works in 6 steps: Builder for optional config. Methods on… → Floats are f64. Public surface never… → ≤3 positional args. When 4+ args appear,… → …
  • The user asks to create
  • SKILL.md covers Mental model, The 5 API rules…, Naming categories (NAMING.md… and Layer model (5 layers,…, plus 13 more sections
  • Calls cargo and gh

What it does

Slt is an agent skill from subinium/SuperLightTUI. Build Rust TUI apps with SuperLightTUI v0.20 (immediate-mode terminal UI). Use this skill when the user asks to create, modify, or debug terminal UI code in this repo, or asks "how do I X in SLT / TUI / terminal", or types Korean triggers like "터미널 UI", "TUI 만들어줘", "SLT로", "ratatui 대신". Read REFERENCES.md for feature flags and doc pointers; grep src/context/ and src/widgets/ before inventing any API.

Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `REFERENCES.md`).

It works with Rust. The repository describes itself as: 🦀 An immediate-mode Rust TUI framework with flexbox layout and Tailwind-style chaining API. The licence is MIT.

When your agent uses it

  • The user asks to create
  • Debug terminal UI code in this repo
  • Asks how do I X in SLT / TUI / terminal
  • Types Korean triggers like 터미널 UI

Example prompts

  • “how do I X in SLT / TUI / terminal”
  • “터미널 UI”
  • “TUI 만들어줘”
  • “/slt”

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Builder for optional config. Methods on Context return a builder when ≥1 option exists. Builders chain &mut self -> &mut Self, render on…
  2. Floats are f64. Public surface never takes/returns f32. 0.5 is f64 natively, so ui.gauge(0.5) just works.
  3. ≤3 positional args. When 4+ args appear, use an opts struct (Opts) or a builder.
  4. Stateful widgets take &mut State. Never &mut String, &mut Vec, &mut usize. Trivial-value exceptions: slider(&mut f64), checkbox(&mut…
  5. Responses. Single-rect widgets return Response. Compound widgets return Response: Deref with #[must_use]. Never tuples.
  6. Return-type pattern. Methods on Context return one of two types — picking the wrong one is the most common AI-generated compile error.

What it can do on your machine

Read from SKILL.md and the folder at commit 15fd63a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • cargo
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Slt loads about 5k tokens when it runs. Until then it costs about 103 tokens; SKILL.md has 1,509 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~103
When it runs · the whole SKILL.md, loaded when a task matches
~5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from subinium/SuperLightTUI at commit 15fd63a, republished under its MIT licence (© subinium). 1,509 words, ~5,023 tokens.

Download SKILL.mdSave it as .claude/skills/slt/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
slt
description
Build Rust TUI apps with SuperLightTUI v0.20 (immediate-mode terminal UI). Use this skill when the user asks to create, modify, or debug terminal UI code in this repo, or asks "how do I X in SLT / TUI / terminal", or types Korean triggers like "터미널 UI", "TUI 만들어줘", "SLT로", "ratatui 대신". Read REFERENCES.md for feature flags and doc pointers; grep `src/context/` and `src/widgets/` before inventing any API.

SuperLightTUI (SLT) Authoring Skill — v0.20

Mental model

SLT is immediate-mode. Your app is one closure: slt::run(|ui: &mut Context| { ... }). The closure runs every frame. State lives in plain Rust variables outside the closure — no App trait, no Model/View/Update, no retained tree. SLT handles flexbox layout, ANSI diff, and stdout flush.

Response.rect reflects the previous frame because layout runs after the closure returns. Frame 1 returns a zero Rect. Guard measurement-dependent logic with if ui.tick() > 0 { ... }. See docs/PREVIOUS_FRAME_GUIDE.md.

For larger apps write components as functions: fn render_card(ui: &mut Context, data: &Card). Share read-mostly state with ui.provide(value, |ui| ...) + ui.use_context::<T>() instead of threading &theme through every helper.

The 5 API rules (predictability anchors)

These are non-negotiable in v0.20+. When generating new code, every public widget must match all 5.

  1. Builder for optional config. Methods on Context return a builder when ≥1 option exists. Builders chain &mut self -> &mut Self, render on Drop, expose .show() to capture a *Response.

    rust
    ui.gauge(0.6).label("60%").width(24).color(Color::Cyan);                     // good
    let r = ui.breadcrumb(&segs).separator(" › ").show();                        // capture response

    Removed in v0.20: gauge_w, gauge_colored, line_gauge_with, breadcrumb_sep, LineGaugeOpts, HighlightRange::single, label_owned. Do not write these — AI training data may suggest them.

  2. Floats are f64. Public surface never takes/returns f32. 0.5 is f64 natively, so ui.gauge(0.5) just works.

  3. ≤3 positional args. When 4+ args appear, use an opts struct (<Widget>Opts) or a builder.

    rust
    GutterOpts::line_numbers(total, viewport)                                    // Opts struct
    ui.scrollable_with_gutter(&mut scroll, opts, |ui, abs| { ... });
  4. Stateful widgets take &mut <Widget>State. Never &mut String, &mut Vec<T>, &mut usize. Trivial-value exceptions: slider(&mut f64), checkbox(&mut bool), toggle(&mut bool).

    rust
    ui.text_input(&mut TextInputState);   // not &mut String
    ui.tabs(&mut TabsState);              // not &mut usize
  5. Responses. Single-rect widgets return Response. Compound widgets return <Widget>Response: Deref<Target = Response> with #[must_use]. Never tuples.

    rust
    if ui.button("Save").clicked { ... }                                          // Response
    if let Some(i) = ui.breadcrumb(&segs).show().clicked_segment { ... }          // BreadcrumbResponse
  6. Return-type pattern. Methods on Context return one of two types — picking the wrong one is the most common AI-generated compile error.

    • &mut Self — chainable mutators of the last rendered element. Use for: text, link, styled, separator, timer_display, and the style chain (bold, dim, italic, fg, bg, wrap, truncate, align, text_center, m, mx, w, h, grow, spacer, with_if, with).
    • Response — interaction result of an independently-rendered widget. Use for every stateful interactive widget (button, checkbox, toggle, table, tabs, select, radio, multi_select, text_input, list, tree, file_picker, slider, calendar, command_palette, rich_log).
    • Container helpers split: col / row / modal → Response. line / line_wrap / screen → &mut Self (these continue an inline-text chain).
    rust
    ui.button("Save").bold();           // ❌ Response has no .bold() — compile error
    if ui.button("Save").clicked { … }  // ✅ Response field
    ui.text("Saved").bold().fg(green);  // ✅ &mut Self chain on display element

Naming categories (NAMING.md micro tier)

Method names encode their category. When picking a name, match the category shape of nearby methods.

CategoryShapeExamples
Verbs (actions, side effects)<verb> or <verb>_<object>quit, notify, register_focusable, focus_by_name, consume_indices, set_ratio
Nouns (getters, no side effects)<noun> or <noun>_<modifier>theme, width, events, focused_name, state.cursor. Never get_X.
Adjectives (Layer 2 builder modifiers)short, ≤2 syllablesbordered, bg, fg, p, m, w, h, gap, grow, fill, bold, dim
ConstructorsType::default() / Type::new(args) / Type::with_X(arg)TextInputState::default(), SplitPaneState::new(0.5), TextInputState::with_placeholder("…")

Allowed universal abbreviations: bg fg id idx len min max pos pct w h x y r g b a. Forbidden: ctx btn lbl dbg cfg req res srv db in public API. Closure params over &mut Context are always ui, never ctx.

Layer model (5 layers, predictability anchor)

LayerObjectExamples
1 — Context&mut Context (the ui parameter)ui.text(...), ui.button(...), ui.row(...), ui.theme(), ui.use_state(...)
2 — ContainerBuilderreturned by ui.container(), ui.bordered(...)chained adjectives: `.p(2).bg(c).gap(1).col(
3 — Widgetimpl Widget for MyType { type Response; fn ui(...) }custom widget extension point
4 — Statepub struct <Widget>State in src/widgets/*.rsTextInputState, TableState, ScrollState
5 — ResponseResponse or <Widget>Response: Deref<Response>Response { clicked, hovered, changed, focused, rect, right_clicked, gained_focus, lost_focus }

When a method belongs to two layers (ui.bordered(B) shortcut vs ui.container().border(B) explicit), prefer the explicit form in skill output.

Sibling widget shapes (memorize)

When unsure about a widget signature, find its family and match.

rust
// Stateful interactive widgets — &mut <Widget>State, returns Response
ui.list(&mut ListState);              ui.tabs(&mut TabsState);
ui.table(&mut TableState);            ui.tree(&mut TreeState);
ui.select(&mut SelectState);          ui.radio(&mut RadioState);
ui.multi_select(&mut MultiSelectState);
ui.file_picker(&mut FilePickerState); ui.calendar(&mut CalendarState);
ui.text_input(&mut TextInputState);   ui.textarea(&mut TextareaState, rows);  // textarea takes rows
ui.rich_log(&mut RichLogState);       ui.command_palette(&mut CommandPaletteState);
ui.toast(&mut ToastState);            ui.spinner(&SpinnerState);              // spinner is &, not &mut

// Trivial-value siblings — exception to Rule 4
ui.button("Save");                    // Response
ui.checkbox("Done", &mut done);       // Response
ui.toggle("Enabled", &mut on);        // Response
ui.slider("Vol", &mut value, 0.0..=100.0);  // Response

// Builder widgets — chain optional config, render on Drop
ui.gauge(0.6).label("60%").width(24).color(Color::Cyan);
ui.line_gauge(0.6).filled('━').empty('─').width(24).label("60%");
let r = ui.breadcrumb(&segs).separator(" › ").color(Color::Cyan).show();

// Compound responses — Deref<Response> + extra fields
let r = ui.gauge(cpu).label("CPU").show();          // GaugeResponse { ratio: f64 }
let r = ui.breadcrumb(&segs).show();                // BreadcrumbResponse { clicked_segment: Option<usize> }
let r = ui.split_pane(&mut split, l, r);            // SplitPaneResponse { ratio: f64 }
let r = ui.scrollable_with_gutter(&mut scroll, opts, body);  // GutterResponse { current_highlight: Option<usize> }

Hook ordering — three variants

Hooks must be called in the same order every frame unless they are id-keyed.

HookKeySafe in if/match?Use when
ui.use_state(|| init)call orderNoTop-level state, no conditional placement
ui.use_state_named::<T>("id")&'static strYesConditional/branching state with compile-time id
ui.use_state_named_with("id", || init)&'static strYesSame, with explicit init fn
ui.use_state_keyed("id-{i}", || init)runtime StringYesPer-row state in a list (key from data)
ui.use_state_keyed_default("id-{i}")runtime StringYesSame, T: Default shortcut
ui.use_memo(&deps, |d| compute(d))call order + depsNoCached compute, deps change → recompute
ui.use_effect(|d| { ... }, &deps)call order + depsNoSide effect on deps change
rust
// WRONG — order-based hook in conditional drifts call order between frames
if expanded { let count = ui.use_state(|| 0); }

// RIGHT — id-keyed variant is safe inside conditionals
if expanded { let count = ui.use_state_named::<i32>("sidebar.count"); }

// Per-list-item runtime keys
for i in 0..items.len() {
    let count = ui.use_state_keyed_default::<i32>(format!("counter-{i}"));
}

Context injection (provide / use_context)

Stop threading &theme, &tick, &mut toasts through every render fn. provide injects a typed value scoped to a closure; nested code reads it back with use_context.

rust
struct AppCtx { theme: slt::Theme, tick: u64, user: &'static str }

slt::run(|ui| {
    let ctx = AppCtx { theme: *ui.theme(), tick: ui.tick(), user: "subin" };
    ui.provide(ctx, |ui| {
        render_header(ui);
        render_card(ui);
    });
});

fn render_card(ui: &mut slt::Context) {
    let ctx = ui.use_context::<AppCtx>();           // panics if missing
    // let maybe = ui.try_use_context::<AppCtx>(); // returns Option<&T>
    ui.text(format!("hi {} (tick {})", ctx.user, ctx.tick));
}

Reserve explicit parameters for writes (&mut MyDocState). Bound is T: 'static — use &'static str for literals, String for runtime values.

Conditional styling (with_if / with)

with_if(cond, modifier) and with(modifier) collapse conditional branches into a single chain. Available on text and ContainerBuilder. Beware: text uses &mut self -> &mut Self, ContainerBuilder uses consuming Self -> Self.

rust
// text — closure receives &mut Self
ui.text("Status").with_if(is_error, |t| { t.bold().fg(Color::Red); });

// ContainerBuilder — closure receives Self by value
ui.container().with_if(is_focused, |c| c.bg(theme.surface_hover)).col(|ui| ...);

Custom widget pattern (Layer 3)

When to use which pattern:

  • Function (fn render_card(ui: &mut Context, data: &CardData)): 90% of cases. Use for screens, sections, reusable layouts. Cheaper to write, no trait bounds, easier to test. Built-in widgets follow this shape internally (impl Context direct methods).
  • impl Widget: when the component (a) has its own state struct that the caller owns, and (b) you want ui.widget(&mut w) ergonomics matching built-ins. Required for third-party crates that export widgets through trait-bound APIs.
rust
struct Label<'a> { text: &'a str }

impl<'a> slt::Widget for Label<'a> {
    type Response = slt::Response;
    fn ui(&mut self, ui: &mut slt::Context) -> Self::Response {
        ui.register_focusable();
        ui.text(self.text).bold();
        slt::Response::default()
    }
}

ui.add(Label { text: "hello" });   // or call .ui(ui) directly

For mouse hit-testing use ui.interaction(rect). For keyboard use register_focusable() + available_key_presses().

Authoring workflow

  1. Confirm the goal — what app? Data table? Dashboard? Form? Game?
  2. Check examples/ for the closest pattern (see Reference Examples below). Start from that file if it fits.
  3. Grep src/context/widgets_* and src/widgets/* for the actual signature before writing ui.foo(...). Do NOT invent APIs.
  4. Keep Cargo.toml features minimal — see REFERENCES.md.
  5. Run the quality gate before saying "done".
Show full SKILL.md (603 more words)Show less

Quality gate (mandatory before saying "done")

Core — every commit:

cargo fmt -- --check
cargo check --all-features
cargo clippy --all-features -- -D warnings
cargo test --all-features
cargo check --examples --all-features

Extended — before PR or release:

typos
cargo check -p superlighttui --no-default-features
cargo check -p slt-wasm --target wasm32-unknown-unknown
cargo hack check -p superlighttui --each-feature --no-dev-deps
cargo audit
cargo deny check

Release workflow (mandatory — do not skip any step)

CLAUDE.md has the full 8-step checklist. Short version:

  1. Local PRE-CI (Core + Extended both green)
  2. Bump Cargo.toml, update CHANGELOG.md
  3. Branch release/vX.Y.Z, single atomic commit, push
  4. gh pr create, wait for CI green
  5. Merge (squash), pull main
  6. Tag, push tag, wait for release.yml green
  7. Verify gh release view, crates.io, docs.rs
  8. Only now announce

Red flags that mean STOP: "Probably fine", "Just a docs change", "CI will catch it", "I'll tag now and fix later". Run the gate locally first.

Common pitfalls (AI-generated SLT code)

  • Inventing method names. Always grep src/context/ and src/widgets/ first.
  • Stale removed APIs. gauge_w, gauge_colored, line_gauge_with, breadcrumb_sep, LineGaugeOpts, HighlightRange::single, label_owned are GONE in v0.20. Use the builder forms.
  • Response.rect on frame 1. Zero Rect. Guard with ui.tick() > 0.
  • use_state() inside if/match/for. Use use_state_named (&'static str id) or use_state_keyed (runtime String).
  • Forgetting .show() on builders that return a response. Drop renders and discards the response. Capture with let r = ui.gauge(...).show();.
  • 'static on ContainerBuilder::draw() closure. Raw draw is deferred; the closure must be 'static.
  • Mixing crossterm raw events with ui.* helpers. Prefer ui.key(), ui.key_code(), ui.key_mod(). For modal-aware shortcuts use ui.raw_key_*.
  • Hard-coding Color::Rgb(...) instead of ui.theme() — themes can't swap.
  • RichLogState::new() for unbounded. New caps at 10000; use RichLogState::new_unbounded() if you really want unlimited.
  • First-frame hover/click tests. Render once to warm the prev-frame hit map, then send the event in a second tb.render(...) call.
  • Binding only Ctrl-C as quit. macOS terminals intercept Ctrl-C as Copy. Always pair q, Esc, and Ctrl-Q.
  • unsafe blocks. #![forbid(unsafe_code)]. Hard compile error.
  • Printing to stdout/stderr from a widget. A library must not write to stdout. Lints catch this.

Reference examples (skill should reference these by file:line)

DomainReference fileKey shape
Hello / minimalexamples/hello.rs (21 lines)slt::run, bordered.title.col, quit triple
Counter (state in closure)examples/counter.rsmove-closure state pattern
Inline modeexamples/inline.rs (23 lines)run_inline(rows, ...)
Tabbed tourexamples/cookbook_tour.rsTabsState + child pub fn render(ui, &mut DemoState)
Form / validatorsexamples/cookbook_login.rsTextInputState::with_placeholder, masked password, validation
Searchable+sortable tableexamples/cookbook_table.rsTableState::set_filter, toggle_sort, consume_key
Modal + Toastexamples/cookbook_modal_toast.rsButtonVariant::Danger, raw_key_code(Esc) for modal-aware quit
Modal focus trapexamples/v020_modal_trap.rsModalOptions { tab_trap: true }
File pickerexamples/cookbook_file_picker.rsFilePickerState::selected_file()
Dashboard (chart+sparkline)examples/cookbook_dashboard.rsui.chart(|c| c.line(...).color()), rolling VecDeque<f64>
Animation primitivesexamples/anim.rsTween/Spring/Keyframes/Sequence/Stagger
use_state_keyedexamples/v020_use_state_keyed.rsper-row counter via format!("counter-{i}")
use_effectexamples/v020_use_effect.rsthree dep shapes (&(), &i32, &bool)
provide/use_contexttests/context_provider.rs (100 lines), examples/demo_website.rs:139-152injection + try_use_context
Theme subtreeexamples/v020_theme_subtree.rscontainer().theme(theme) per-subtree override
Theme densityexamples/v020_spacing_scale.rsTheme::compact() / comfortable() / spacious()
Gauge builderexamples/v020_gauge.rs:104-107ui.gauge(value).label(...).width(24)
Line gaugeexamples/v020_gauge.rs:74-92ui.line_gauge(0.45).filled('#').empty('.').width(24)
Breadcrumb responseexamples/v020_breadcrumb_response.rs:72-77ui.breadcrumb(&segs).separator(" › ").show()
Scrollable + gutterexamples/v020_gutter_highlights.rs:150-165GutterOpts::line_numbers, HighlightRange::line
Split paneexamples/v020_split_pane.rssplit_pane, vsplit_pane, drag handle
WidthSpec variantsexamples/v020_widthspec.rsConstraints::default().w_pct(50), .w_ratio(1,3), .w_minmax(10,30)
Named focusexamples/v020_named_focus.rs:187register_focusable_named + focus_by_name
Keymap help overlayexamples/v020_keymap_help.rsWidgetKeyHelp, publish_keymap, keymap_help_overlay
DX shortcutsexamples/v020_dx_shortcuts.rson_hover, animate_bool, fill(), Rect::center_in
Static log / scrollbackexamples/v020_static_log.rsslt::run_static, ui.static_log(...)
Async demoexamples/async_demo.rsslt::run_async with tokio
All-in-one showcaseexamples/v020_showcase.rs (277 lines)every major v0.20 feature
Test utilitiestests/v020_test_utils_demo.rsrecord_frames, sequence().tick().key().type_string()

Testing pattern (headless)

rust
use slt::{TestBackend, EventBuilder};

#[test]
fn my_widget_renders() {
    let mut tb = TestBackend::new(80, 24);
    tb.render(|ui| { ui.text("hello"); });
    tb.assert_contains("hello");
}

// Multi-frame with events (warm prev-frame hit map first)
#[test]
fn click_triggers() {
    let mut tb = TestBackend::new(40, 10);
    tb.render(|ui| { ui.button("Save"); });                    // warm frame
    tb.run_with_events(vec![EventBuilder::mouse_down(2, 0)],   // event frame
        |ui| { if ui.button("Save").clicked { /* assert */ } });
}

// Sequence builder (most readable)
tb.sequence().tick(5).key(KeyCode::Tab, KeyModifiers::NONE).type_string("hello", &mut state.value).run();

See tests/v020_test_utils_demo.rs for record_frames, assert_not_contains, assert_style_at.

File layout cheat sheet

AreaPrimary files
Public APIsrc/lib.rs (re-exports)
Run loop / backendsrc/terminal.rs, src/lib.rs (run, run_with, run_inline, run_async, run_static, frame, frame_owned)
Context coresrc/context/{core,runtime,container,helpers,state}.rs
Widget implssrc/context/widgets_display/*, widgets_interactive/*, widgets_input/*, widgets_viz.rs
Layer 4 state typessrc/widgets/*.rs
Compound responsessrc/widgets/responses.rs (BreadcrumbResponse, GaugeResponse, SplitPaneResponse, GutterResponse)
Layout kernelssrc/layout/{tree,flexbox,collect,render,command}.rs
Style / themesrc/style/{color,theme}.rs, src/style.rs
Animationsrc/anim.rs
Chartssrc/chart.rs, src/chart/*.rs, src/context/widgets_viz.rs
Testing helperssrc/test_utils.rs
Skill referencesREFERENCES.md (feature flags, doc pointers)

Korean conventions

  • "ㄱㄱ" = "go go" → proceed immediately, no clarifying questions
  • "켜줘" / "열어줘" → open the file in Cursor (NOT cat to terminal)
  • "고쳐줘" / "수정해줘" → fix with minimal change, run quality gate
  • "리뷰해줘" → audit only, do not modify code unless explicitly asked

© subinium, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .claude/skills/slt of subinium/SuperLightTUI.

  • SKILL.md
  • REFERENCES.md

Open the folder on GitHubat commit 15fd63a

Compare with similar skills

Slt next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Slt compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Slt this skillsubinium/SuperLightTUI191—~5kAutomated safety check: PassMIT
Update V8 Versionopeninterpreter/openinterpreter69k2 repos~845Automated safety check: PassApache-2.0
Firecrawl Page Scrape Integrationfirecrawl/firecrawl190k1 repos~944Automated safety check: PassISC
Migrate Core Code to Submodulestinyhumansai/openhuman42k—~2.6kAutomated safety check: PassGPL-3.0
Rust TDD Workflowrtk-ai/rtk83k—~753Automated safety check: NotesApache-2.0
Rust Best Practicesfarm-fe/farm5.6k3 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Update V8 Version

    openinterpreter/openinterpreter

    Bumps the pinned v8 and rusty_v8 versions in Codex, validates the release-candidate path with the v8-canary check, and traces failures to upstream build changes.

    69k GitHub starsUsed in 2 repos~845 tokens
    DevOps & CloudAuto-check passed
  • Adds Firecrawl's /scrape endpoint to application code to pull markdown, HTML, links, screenshots or structured data from a single known URL.

    190k GitHub starsUsed in 1 repo~944 tokens
    Data & AnalyticsAuto-check passed
  • Migrate Core Code to Submodules

    tinyhumansai/openhuman

    Plans and carries out moving non-host-specific code and its tests from the OpenHuman core into vendored tiny submodule libraries, then releases the submodule and re-pins the host.

    42k GitHub stars~2.6k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Enforces red-green-refactor for Rust work, with idiomatic test patterns, a naming convention and a pre-commit gate of cargo fmt, clippy and test.

    83k GitHub stars~753 tokensUpdated yesterday
    Testing & QAAuto-check: notes
  • Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.

    5.6k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Decides whether an OpenLogi device problem on macOS is a privacy-permission (TCC) problem, using agent log lines, and says which identity needs which grant.

    23k GitHub stars~2.5k tokensUpdated 5 days ago
    DevelopmentAuto-check: notes

More from subinium/SuperLightTUI

  • Slt

    subinium/SuperLightTUI

    Build Rust TUI apps with SuperLightTUI v0.23 (immediate-mode terminal UI).

    191 GitHub stars~5.1k tokensUpdated 29 days ago
    Auto-check passed
  • Slt Migration

    subinium/SuperLightTUI

    Migrate Rust TUIs from ratatui (or cursive, Python textual) to SuperLightTUI v0.23.

    191 GitHub stars~6.2k tokensUpdated 29 days ago
    Auto-check passed
  • Slt Migration

    subinium/SuperLightTUI

    Migrate Rust TUIs from ratatui (or cursive, Python textual) to SuperLightTUI v0.20.

    191 GitHub stars~6.2k tokensUpdated 29 days ago
    Auto-check passed

Works with

Questions about Slt

What does Slt do?

Build Rust TUI apps with SuperLightTUI v0.20 (immediate-mode terminal UI). Slt is an agent skill from subinium/SuperLightTUI.20 (immediate-mode terminal UI).

When should I use Slt?

Slt fits situations like: the user asks to create; debug terminal UI code in this repo; asks how do I X in SLT / TUI / terminal; types Korean triggers like 터미널 UI.

How do I install Slt in Claude Code?

Run `npx skills add subinium/SuperLightTUI --skill slt -a claude-code`. Or copy the skill folder (.claude/skills/slt in subinium/SuperLightTUI) into .claude/skills/slt in your project. Claude Code loads it when a task matches its description.

How do I install Slt in Codex?

Run `npx skills add subinium/SuperLightTUI --skill slt -a codex`. Or copy the skill folder (.claude/skills/slt in subinium/SuperLightTUI) into .agents/skills/slt in your project. Codex loads it when a task matches its description.

Can I use Slt in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add subinium/SuperLightTUI --skill slt -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/slt, .gemini/skills/slt, .github/skills/slt and .opencode/skills/slt in your project.

What does Slt need to run?

Going by SKILL.md and its folder, Slt needs the command-line tools its instructions call (cargo and gh).

Does Slt access the network?

SKILL.md contains no URLs. Its commands use gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Slt safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Slt use?

Slt is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Slt use?

About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Slt?

Skills that share tags, products or a category with Slt: Update V8 Version (openinterpreter/openinterpreter, 69k stars), Firecrawl Page Scrape Integration (firecrawl/firecrawl, 190k stars), Migrate Core Code to Submodules (tinyhumansai/openhuman, 42k stars) and Rust TDD Workflow (rtk-ai/rtk, 83k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Slt?

subinium (a GitHub user) maintains it in subinium/SuperLightTUI, which has 191 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on September 9, 2026.

Source: subinium/SuperLightTUI on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.