Skip to main content

S3 Panel

@vcjdeboer/s3-panelv2026.09.30.1· 6d agoMODELSSKILLS
01README

Drive an ESP32-S3 with a screen from swamp. One model type, s3-panel, is everything @vcjdeboer/s3-device does plus typed methods for the display: text, fill, clear, backlight and logo, plus touch screens (screen, zonewait) and a physical approve for workflow approvals. The board renders and the host says what to render, so no pixels cross the wire. Built against a Guition JC3248W535 (3.5" 320x480 AXS15231B), but any firmware answering the same commands will do. Firmware 0.12 also runs the panel on its own as a swamp-club profile badge on Wi-Fi, set up from a phone; wifi, configure, forget, profile and idle drive that from swamp.

02Release Notes

Swamp badge (firmware s3panel 0.12.2): the panel runs on its own as a swamp-club profile badge on Wi-Fi, set up from a phone. New methods wifi, configure, forget, profile and idle. send and write refuse Wi-Fi credentials. Reflash from the repo's firmware/s3panel to use the badge.

03Models1
@vcjdeboer/s3-panelv2026.09.30.1s3_panel.ts
fn idle(timeoutMs?: number)
Hand the screen back to the firmware (s3panel 0.12): the badge,
ArgumentTypeDescription
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn profile(username?: string, fetchMs: number)
Show a swamp-club profile on the panel (firmware s3panel 0.12, on
ArgumentTypeDescription
username?stringswamp-club username; omit to refresh the stored one
fetchMsnumberWait for the board's HTTPS fetch (it may first wait up to 30 s for a
fn listen(timeoutMs?: number)
Listen for unsolicited event lines for timeoutMs. The board pushes
ArgumentTypeDescription
timeoutMs?numberHow long to listen; defaults to the global timeoutMs
fn drain()
Drain all buffered unsolicited events from the holder. Unlike
fn text(lines: array, timeoutMs?: number)
Draw lines of text, replacing whatever was on the screen. Pass one
ArgumentTypeDescription
linesarrayOne string per screen line, drawn top to bottom
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn fill(color: enum, timeoutMs?: number)
Flood the whole screen with one colour. The cheapest way to see,
ArgumentTypeDescription
colorenumA colour the firmware knows by name
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn clear(timeoutMs?: number)
Blank the screen to black, leaving the backlight alone.
ArgumentTypeDescription
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn backlight(on: boolean, timeoutMs?: number)
Turn the backlight on or off. Off leaves the framebuffer intact, so
ArgumentTypeDescription
onbooleanTrue for lit, false for dark
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn logo(timeoutMs?: number)
Show the Swamp Club logo on screen and enter touch-reactive mode.
ArgumentTypeDescription
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn touch(timeoutMs?: number)
Read the touch controller right now: is a finger on the screen?
ArgumentTypeDescription
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn touchstate(timeoutMs?: number)
Read the latched touch state: how many touches since the last
ArgumentTypeDescription
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn touchclear(timeoutMs?: number)
Reset the touch counter to zero. Returns how many touches were
ArgumentTypeDescription
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn waittouch(timeoutMs: number)
Block until the screen is touched, then return the coordinates.
ArgumentTypeDescription
timeoutMsnumberHow long to wait for a touch before giving up (default 30s)
fn simtouch(x: number, y: number, timeoutMs?: number)
Simulate a touch at the given coordinates without physically
ArgumentTypeDescription
xnumberX coordinate (0-319)
ynumberY coordinate (0-479)
timeoutMs?numberOverrides the instance's timeoutMs for this call
fn screen()
Push a screen definition to the panel. Sends screen clear, then screen add for each element, then screen show. The firmware renders a mini logo at the top and stacks elements below it.
fn zonewait()
Wait for a touch zone to be tapped on a rendered screen. Returns the zone id that was hit, or times out. `swamp model cancel` ends the wait within a couple of seconds.
fn approve(workflow: string, step: string, prompt?: string, run?: string, resolve: boolean, resume: boolean, swampPath?: string)
Answer a suspended manual_approval step from the panel. Finds the waiting run, shows the workflow, step, prompt and APPROVE / REJECT buttons, waits for a physical tap, then approves (and resumes) or rejects that run in swamp itself. Records the decision and the run it answered as an evidentiary data record.
ArgumentTypeDescription
workflowstringWorkflow name (shown on screen)
stepstringThe manual_approval step name
prompt?stringText to show; defaults to the step's own prompt
run?stringRun ID to answer; required only when several runs wait at this step
resolvebooleanApprove/reject the run in swamp after the tap (false: only record)
resumebooleanAfter approving, start `swamp workflow resume` for the run
swampPath?stringswamp binary to call back into; defaults to the running one
04Skills1
driving-s3-panel5 files
05Previous Versions10
2026.09.29.4
2026.09.29.3

Added 1 skills

2026.09.29.2
2026.09.29.1
2026.09.27.5

Modified 1 models

2026.09.27.4

Modified 1 models

2026.09.27.3

Modified 1 models

2026.09.27.2

Modified 1 models

2026.09.27.1

Modified 1 models

2026.09.26.3
06Stats
A
100 / 100
Downloads
15
Archive size
68.9 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License declared1/1earned
  • Verified public repository2/2earned
07Platforms