inanimate-tech/resident/device
Claude Code and agent skill by inanimate-tech/resident
- community
Checking that the SKILL.md file is still in the repository.
Install
npx vskill@latest install inanimate-tech/resident/deviceSKILL.md
Adafruit ESP32-S2 TFT Feather
The Adafruit ESP32-S2 TFT Feather is a single-core ESP32-S2 board with a 1.14" 240×135 ST7789 TFT, an onboard NeoPixel, an LC709203F LiPo fuel gauge, and a single BOOT button on GPIO0. Apps drive the screen as their primary output, can light the NeoPixel, read battery state, and respond to button presses.
Hardware
TFT screen: ST7789, 135×240 pixels in portrait orientation (135 wide × 240 tall), USB-C at the bottom. Coordinates 0-based, origin top-left. Colours 0–255 per channel. Double-buffered: draw to an off-screen canvas, then screen.flip() to push the frame.
NeoPixel: A single addressable RGB LED on the front of the board.
Battery monitor: LC709203F fuel gauge over I2C at address 0x0B. Only responds when a LiPo is connected to the JST connector (the chip is powered by VBAT, so without a battery it's invisible).
Button: Single onboard BOOT button on GPIO0 (active-low, internal pull-up). Surfaces as button driver events with index = 0. Holding it during reset still enters the ROM bootloader; only runtime presses are delivered to apps.
Lua Modules
screen.*
Hardware: ST7789 TFT, 135×240 portrait, double-buffered.
MUST: call screen.flip() after every draw sequence — nothing is visible until you flip. On app reset the canvas is cleared and pushed.
led.*
Hardware: Onboard NeoPixel (single pixel).
The pixel is bright — clamp brightness with led.set_brightness(20) or similar in init() for indoor use.
battery.*
Hardware: LC709203F fuel gauge (only responds when a LiPo is plugged in).
The percentage takes ~30 seconds to converge after boot — the first few readings can be misleading.
button.*
Hardware: Single BOOT button on GPIO0 (active-low, debounced 50 ms).
Best practice: handle presses in on_event(ctx, event) rather than polling. The event has event.name == "button", event.data.index == 0, and event.data.count (the running press count).
The press count resets when a new app is loaded.
Examples
Hello world:
Bouncing ball:
Battery readout:
Pulse the NeoPixel:
Constraints
- Screen: 135×240 portrait, 0-based coords, 0–255 colour channels.
- Single NeoPixel —
led.set(r, g, b)takes one RGB triple. - Battery: needs a LiPo on the JST connector or
battery.*returns zeros. - One button (BOOT, GPIO0) — events carry
index = 0. - No IMU. No buzzer. No audio.
Practical Tips
- Always call
screen.flip()after a draw sequence — double-buffered. - Default text size is 2; use size 1 for dense info, size 3 for headings.
- The NeoPixel is bright — clamp brightness with
led.set_brightness(20). - Use
battery.present()before drawing battery readings to avoid showing
meaningless zeros when there's no LiPo connected.
Validation stubs
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingexamples/adafruit-esp32-s2-feather/device/DEVICE-SKILL.md
Popularity
- 7-day trend score
- 0
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/inanimate-tech/resident/device)