Stage 2: Official client (rechat) #2

Closed
opened 2026-10-16 17:06:16 +00:00 by muse-lantern · 2 comments
Member

proj-rechat-client tier-3-hard

Build the official Limoni TUI client (rechat binary).

Scope

  • Limoni-based TUI (following residual amber aesthetic)
  • Server/channel sidebar, message pane, input
  • Parses enriched message format (UUIDv7, UID+nick) into clean UI
  • &index channel rendered as server/channel browser
  • Profile viewing via /msg srv profile

Character limit

The official client enforces a shorter message length limit than the IRC 512-byte cap, specifically to avoid the server-side chunking jank from stage 1. The limit is auto-calculated:

max_len = 512 - len(":srv PRIVMSG #<channel> :") - len("<uuidv7> <uid> <nick> ") - len("\r\n")

Since the prefix length varies by channel name and nick, the client computes it per-message and truncates/warns before sending. The goal: official client messages never trigger server chunking.

Depends on

  • #1 (SRV must be functional)
proj-rechat-client tier-3-hard Build the official Limoni TUI client (`rechat` binary). ## Scope - Limoni-based TUI (following residual amber aesthetic) - Server/channel sidebar, message pane, input - Parses enriched message format (UUIDv7, UID+nick) into clean UI - `&index` channel rendered as server/channel browser - Profile viewing via `/msg srv profile` ## Character limit The official client enforces a **shorter** message length limit than the IRC 512-byte cap, specifically to avoid the server-side chunking jank from stage 1. The limit is auto-calculated: `max_len = 512 - len(":srv PRIVMSG #<channel> :") - len("<uuidv7> <uid> <nick> ") - len("\r\n")` Since the prefix length varies by channel name and nick, the client computes it per-message and truncates/warns before sending. The goal: official client messages **never** trigger server chunking. ## Depends on - #1 (SRV must be functional)
Author
Member

Shared UI package (Zach, 2026-10-16)

The TUI/UIX code MUST live in a shared location in the rechat repo so both the client binary and the server (SSH gateway, #8) can use it — same pattern as residual core's shared UI elements. Proposed: internal/ui/ for Limoni components, internal/tui/ for the I/O backend interface. internal/ is fine (same module); public vs internal doesn't matter so long as both binaries reach it.

### Shared UI package (Zach, 2026-10-16) The TUI/UIX code MUST live in a shared location in the rechat repo so both the client binary and the server (SSH gateway, #8) can use it — same pattern as residual core's shared UI elements. Proposed: `internal/ui/` for Limoni components, `internal/tui/` for the I/O backend interface. `internal/` is fine (same module); public vs internal doesn't matter so long as both binaries reach it.
Author
Member

Implemented and pushed in 9702904.

  • internal/ui/ shared Limoni components (channel sidebar, message pane, input with live char counter, status bar, slash commands) — usable by both client and SSH gateway (#8)
  • internal/tui/ I/O backend interface (local terminal + SSH stub); Limoni natively supports Program.RunTerminal for the SSH use case
  • internal/client/ IRC client with UUIDv7 chunk reassembly and per-message character budget so client messages never trigger server chunking
  • Amber aesthetic, 13 tests (client + headless UI), live round-trip verified against rechat-server
Implemented and pushed in 9702904. - `internal/ui/` shared Limoni components (channel sidebar, message pane, input with live char counter, status bar, slash commands) — usable by both client and SSH gateway (#8) - `internal/tui/` I/O backend interface (local terminal + SSH stub); Limoni natively supports `Program.RunTerminal` for the SSH use case - `internal/client/` IRC client with UUIDv7 chunk reassembly and per-message character budget so client messages never trigger server chunking - Amber aesthetic, 13 tests (client + headless UI), live round-trip verified against rechat-server
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
residual/rechat#2
No description provided.