c5lab/projectzero/skill
Claude Code and agent skill by c5lab/projectzero
- community
Checking that the SKILL.md file is still in the repository.
Build LVGL touchscreen applications that communicate with JanOS ESP32C5 firmware over UART. Use when creating screens for Tab5, CoreS3, Cardputer, or any ESP-IDF device that sends UART commands like scan_networks, start_deauth, list_hosts, show_pass. Covers screen building, UART parsing, attack flows, and navigation patterns.
Install
npx vskill@latest install c5lab/projectzero/skillSKILL.md
JanOS UART Application Builder
Guide for building ESP-IDF + LVGL applications that control JanOS firmware on ESP32C5 via UART. Reference implementation: /Users/janulrich/kod/dev/tabgit/M5MonsterC5-Tab5/main/main.c
For the complete command list, see commands-reference.md.
Architecture
JanOS exposes a text CLI over UART. The UI app sends commands like scan_networks\r\n and parses the multi-line text responses to update the screen.
UART Setup
Pin assignments (configurable, stored in NVS):
| Connector | TX | RX | Usage | |
|---|---|---|---|---|
| Grove | 53 | 54 | UART1 (primary) | |
| M5Bus | 37 | 38 | UART2 (Kraken secondary) |
For CoreS3: use the appropriate GPIO for your board. The Tab5 reference stores pin config in NVS and reads with get_uart1_pins().
Sending Commands
Always append \r\n. Log every command sent.
Reading & Parsing Responses
Core Pattern: Line-by-Line Accumulation
All UART parsing follows the same pattern -- read bytes, accumulate into a line buffer character by character, parse on newline:
Completion Markers
Every command response has a known end marker. Wait for it before proceeding:
| Command | Completion Marker | |
|---|---|---|
scan_networks | "Scan results printed" | |
inspect_network | "[INSPECT]" (single line) | |
wifi_connect | "SUCCESS" or "FAILED" or "TIMEOUT" | |
start_nmap | "Scanned" + "open ports" (final summary line) | |
list_hosts | "Discovered Hosts" (header line, data follows) | |
list_sd | "HTML files found" (header, data follows), or timeout | |
show_pass | Timeout (no explicit end marker) | |
list_probes | Timeout (no explicit end marker) | |
wpasec_upload | "Done:" | |
start_pcap | "PCAP radio capture started" / "PCAP net capture started" / (gateway usually via capture_gateway); on stop: "PCAP saved:" / "[PCAP_FINAL]" | |
capture_gateway | "[CGW] END" (after start/status/capture_gateway stop); while recording use universal stop | |
start_rogue_gitm | "[CGW] END" (same status block as capture_gateway start) | |
zig_recon_status | "[ZIG] END" | |
zig_recon_list | "[ZIG] END" | |
zig_recon_nodes | "[ZIG] END" | |
zig_recon_clear | "[ZIG] END" | |
start_beacon_spam | "Beacon spam started. Use 'stop' to end." | |
start_beacon_spam_ssids | "Beacon spam started. Use 'stop' to end." (same as start_beacon_spam) | |
list_ssids | Timeout (no explicit end marker, list ends after last indexed line) | |
add_ssid | "Added SSID:" | |
remove_ssid | "SSID removed." | |
version | "JanOS version: X.Y.Z" (single line, immediate) |
For commands without explicit end markers, use a timeout with empty-read detection (e.g., 3 consecutive empty reads of 500ms each).
zig_recon_nodes emits [ZIG] node lines for Mesh Recon consumers. Parse legacy fields first (pan, addr_type, short, ext, role, packets, last_rssi, last_seen_ms, age_ms) and treat appended fields as optional: best_rssi, avg_rssi, lqi, sample_count, last_channel, vendor, device_hint, battery. RSSI/LQI fields are signal hints only, not distance. For a passive Locate/track UI, suggested labels are warming up for sample_count < 2, closer when last_rssi >= avg_rssi + 4, farther when last_rssi <= avg_rssi - 4, and steady otherwise. Locate behaves as a toggle: selecting a node starts locate, selecting the same node again stops it, and selecting another PAN/network or leaving/collapsing the expanded network view clears the target.
Key Parsing Recipes
Network scan CSV -- fields: index, SSID, (empty), BSSID, channel, security, RSSI, band:
Host list -- parse " IP -> MAC" lines:
Evil twin passwords -- "SSID", "password":
HTML file list -- "N filename.html":
Probe list -- "N SSID":
Deauth detector -- "[DEAUTH] CH: N | AP: name (BSSID) | RSSI: N":
Handshake success:
Evil twin password capture:
wifi_connect result (password is optional -- omit for open networks):
start_nmap progress and results:
Screen Building
Screen Lifecycle
Tile (Button) Creation
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingESP32C5/SKILL/SKILL.md
Popularity
- Repository stars
- 172
- Repository forks
- 21
- 7-day trend score
- 26
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/c5lab/projectzero/skill)