Skip to content

feat(tui): greet launch with the mark, once, drawn in braille - #52

Merged
benjipeng merged 1 commit into
mainfrom
feat/branding-mark
Sep 23, 2026
Merged

benjipeng merged 1 commit into
mainfrom
feat/branding-mark

Conversation

@benjipeng

Copy link
Copy Markdown
Contributor

What

Stage 10: launch greets a new conversation with the mark, once.

  • The greeting. On a launch onto an empty conversation the mark plays at the conversation's centre with the name beneath and leaves after about 2.5 s: frame fades in (0.25 s), the chosen cycle runs in 2 s (a dot grows into a circle, becomes a rounded square and a square, turns into a diamond while the frame turns with it, shrinks away) with one 0.8 s sheen over the frame, then frame and name fade out (0.3 s). Input never waits; the first message ends it for good; /new, /resume and reopened conversations are not greeted. The empty primary conversation it leaves is blank (the inspector keeps its placeholder).
  • The drawing. Braille, after Grok's welcome logo (read from its source): two by four dots a cell, so the mark is a small bitmap squared against the terminal's reported cell (crossterm::terminal::window_size), a common monospace cell standing in. Colours come from the palette's slots (blue frame lit toward text, purple centre, fading from the ground), so a theme reaches them.
  • The clock. The greeting counts the one motion clock's phases from the instant launch greeted, plays its 38 once, and stops waking the clock (MOT-1/MOT-2/MOT-3).

The user chose the drawing, motion, greeting and pace in kitty from the spike's previews (kept as mockups/mark-braille*.py), rejecting the box-drawn frame around a one-cell glyph (too coarse), a mark that stayed until the first message (too insistent), 3.7 s (too slow) and a placeholder sentence afterwards; the Rust output was compared with the chosen preview dot for dot. ui-ux, the motion spec and evidence, the spike and the phase say so; the plan is consumed. Frames: crates/plexmaton-tui/frames/greeting/ at 120/88/60.

scripts/smoke-tui.py's "a status-line press repaints nothing" check now waits for the greeting to leave, since the greeting repaints while it plays.

Verified

Local: cargo test --workspace --no-fail-fast 1639 passed; all eight terminal smokes; workspace clippy -D warnings; fmt, file length, citations, frames, typos, script unit tests. The user watched the greeting in the real binary. CI not yet observed.

When Plexmaton starts on a new, empty conversation the mark plays once at its centre with the
name beneath and leaves after about 2.5 s: the frame fades in, the centre grows from a dot into a
circle, becomes a rounded square and a square, turns into a diamond while the frame turns with it,
and shrinks away, a sheen passing once, then frame and name fade out. Input never waits; the first
message ends it for good; /new, /resume and a reopened conversation are not greeted. The empty
conversation it leaves says nothing.

The mark is drawn in braille, the way Grok draws its logo: two by four dots a cell make it one
small bitmap, squared against the cell the terminal reports, so the circle is round and the growth
is smooth. It runs on the workspace's one motion clock and stops waking it once it has left. The
user chose the drawing, the motion, the greeting and its pace in kitty, after finding the
box-drawn frame around a one-cell glyph too coarse and a mark that stayed until the first message
too insistent; the spike keeps the previews and the Rust output matches them dot for dot.

The terminal smoke's check that a status-line press repaints nothing now waits for the greeting to
leave, since the greeting itself repaints while it plays.
@benjipeng
benjipeng merged commit 9bc36b4 into main Sep 23, 2026
3 checks passed
@benjipeng
benjipeng deleted the feat/branding-mark branch September 23, 2026 19:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant