Create MicroPython applications for Universe 2025 (Tufty) Badge including display graphics, button handling, and MonaOS app structure. Use when building badge apps, creating interactive displays, or developing MicroPython programs.
View on GitHubjohnlindquist/badger-2350-plugin
badger-2350-dev
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/johnlindquist/badger-2350-plugin/blob/main/badger-2350-dev/skills/badger-app-creator/SKILL.md -a claude-code --skill badger-app-creatorInstallation paths:
.claude/skills/badger-app-creator/# Universe 2025 Badge App Creator
Create well-structured MicroPython applications for the **Universe 2025 (Tufty) Badge** with MonaOS integration, display graphics, button handling, and proper app architecture.
## Important: MonaOS App Structure
**Critical**: MonaOS apps follow a specific structure. Each app is a directory in `/system/apps/` containing:
```
/system/apps/my_app/
├── icon.png # 24x24 PNG icon
├── __init__.py # Entry point with update() function
└── assets/ # Optional: app assets (auto-added to path)
└── ...
```
### Required Functions
Your `__init__.py` must implement:
**`update()`** - Required, called every frame by MonaOS:
```python
def update():
# Called every frame
# Draw your UI, handle input, update state
pass
```
**`init()`** - Optional, called once when app launches:
```python
def init():
# Initialize app state, load resources
pass
```
**`on_exit()`** - Optional, called when HOME button pressed:
```python
def on_exit():
# Save state, cleanup resources
pass
```
## MonaOS App Template
```python
# __init__.py - MonaOS app template
from badgeware import screen, brushes, shapes, io, PixelFont, Image
# App state
app_state = {
"counter": 0,
"color": (255, 255, 255)
}
def init():
"""Called once when app launches"""
# Load font
screen.font = PixelFont.load("nope.ppf")
# Load saved state if exists
try:
with open("/storage/myapp_state.txt", "r") as f:
app_state["counter"] = int(f.read())
except:
pass
print("App initialized!")
def update():
"""Called every frame by MonaOS"""
# Clear screen
screen.brush = brushes.color(20, 40, 60)
screen.clear()
# Draw UI
screen.brush = brushes.color(255, 255, 255)
screen.text("My App", 10, 10)
screen.text(f"Count: {app_state['counter']}", 10, 30)
# Handle buttons (checked every frame)
if io.BUTTON_A in io.pressed:
app_state["counter"] += 1