Back to Skills

badger-app-creator

verified

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 GitHub

Marketplace

badger-marketplace

johnlindquist/badger-2350-plugin

Plugin

badger-2350-dev

Repository

johnlindquist/badger-2350-plugin
4stars

badger-2350-dev/skills/badger-app-creator/SKILL.md

Last Verified

January 25, 2026

Install Skill

Select agents to install to:

Scope:
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-creator

Installation paths:

Claude
.claude/skills/badger-app-creator/
Powered by add-skill CLI

Instructions

# 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

Validation Details

Front Matter
Required Fields
Valid Name Format
Valid Description
Has Sections
Allowed Tools
Instruction Length:
15609 chars