| name | badger-quickstart |
| description | Complete getting started guide for Universe 2025 (Tufty) Badge from zero to first app. Use when helping absolute beginners, providing step-by-step first-time setup, or when users ask "how do I get started", "where do I begin", or "first steps with the badge". |
Universe 2025 (Tufty) Badge Quickstart Guide
Complete step-by-step guide to go from zero to creating your first app for MonaOS on the Universe 2025 (Tufty) Badge. Perfect for absolute beginners!
About the Badge
The Universe 2025 Badge is a custom version of the Pimoroni Tufty 2350, created for GitHub Universe 2025. It comes pre-loaded with MonaOS, a MicroPython-based operating system with an app launcher.
Hardware Specifications
- RP2350 Dual-core ARM Cortex-M33 @ 200MHz
- 512kB SRAM and 16MB QSPI XiP flash
- 320x240 full colour IPS display (framebuffer pixel doubled from 160x120)
- 2.4GHz WiFi and Bluetooth 5
- 1000mAh rechargeable battery (up to 8 hours runtime)
- IR receiver and transmitter for beacon hunting
- Five front-facing buttons (A, B, C, UP, DOWN)
- 4-zone LED backlight
- USB-C for charging and programming
About MonaOS
Your badge runs MonaOS, which provides:
- An app launcher that auto-discovers apps in
/system/apps/ - Each app is a directory containing
__init__.py,icon.png(24x24), and optionalassets/ - Apps implement
update()function called every frame - Navigate apps using physical buttons
What You'll Need
Hardware
- ✓ Universe 2025 (Tufty) Badge
- ✓ USB-C cable (data capable, not just charging)
- ✓ Computer (macOS, Linux, or Windows)
Software (we'll install together)
- Python 3.8 or newer
- Development tools (mpremote)
- Text editor or IDE
Time Required
- First-time setup: 30-45 minutes
- Your first app: 20-30 minutes
Step-by-Step Setup
Step 1: Install Python on Your Computer
Why: You need Python on your computer to run the tools that communicate with your badge.
macOS:
# Install using Homebrew
brew install python3
# Verify
python3 --version # Should show 3.8 or higher
Linux (Ubuntu/Debian):
sudo apt update
sudo apt install python3 python3-pip python3-venv
python3 --version
Windows:
- Download from https://www.python.org/downloads/
- Run installer
- ✓ CHECK "Add Python to PATH"
- Complete installation
- Open PowerShell and verify:
python --version
✅ Checkpoint: Run python3 --version (or python --version on Windows). You should see version 3.8 or higher.
Need help? See the
python-setupskill for detailed installation guides.
Step 2: Create Your First Project
Why: Keeping projects organized and using virtual environments prevents conflicts.
# Create a directory for your project
mkdir ~/badger-projects
cd ~/badger-projects
mkdir hello-badge
cd hello-badge
# Create a virtual environment
python3 -m venv venv
# Activate it
# macOS/Linux:
source venv/bin/activate
# Windows (PowerShell):
venv\Scripts\Activate.ps1
# Windows (Command Prompt):
venv\Scripts\activate.bat
✅ Checkpoint: Your terminal prompt should now show (venv) at the beginning.
Step 3: Install Badge Tools
Why: These tools let you communicate with your badge, upload files, and run code.
# Make sure venv is activated (you should see "(venv)" in prompt)
# Install essential tool
pip install mpremote
# Verify installation
mpremote --version
✅ Checkpoint: Command should show version number without errors.
Step 4: Connect Your Badge
Why: Let's make sure your computer can talk to your badge.
- Connect badge to computer using USB-C cable
- Find the device:
macOS/Linux:
ls /dev/tty.usb*
# Should see something like: /dev/tty.usbmodem14201
Windows:
# In PowerShell
[System.IO.Ports.SerialPort]::getportnames()
# Should see something like: COM3
- Test connection:
macOS/Linux:
mpremote connect /dev/tty.usbmodem* exec "print('Hello from Badge!')"
Windows:
mpremote connect COM3 exec "print('Hello from Badge!')"
✅ Checkpoint: You should see "Hello from Badge!" printed in your terminal.
Troubleshooting:
- Badge not found? Try different USB ports
- Permission denied? See Step 4a below
- Still stuck? See the
badger-diagnosticsskill
Step 4a: Fix Permissions (Linux only)
If you get "Permission denied" on Linux:
# Add yourself to dialout group
sudo usermod -a -G dialout $USER
# Log out and log back in for changes to take effect
# Or restart your computer
Step 5: Verify Badge is Ready (CRITICAL)
Why: We must verify everything is working before writing code.
# macOS/Linux:
mpremote connect /dev/tty.usbmodem* exec "
import sys
print('✓ MicroPython:', sys.version)
# Test badgeware module
from badgeware import screen, brushes, shapes
print('✓ badgeware module: loaded')
print('✓ Display size: 160x120')
print('✓ ALL CHECKS PASSED!')
"
# Windows:
mpremote connect COM3 exec "import sys; from badgeware import screen, brushes, shapes; print('✓ MicroPython:', sys.version); print('✓ badgeware loaded'); print('✓ ALL CHECKS PASSED!')"
✅ Checkpoint - ALL must pass:
- ✓ MicroPython version shown
- ✓ badgeware module loads
- ✓ No error messages
DO NOT PROCEED until all checks pass.
Step 6: Understand MonaOS App Structure
MonaOS apps must follow this structure:
my_app/
├── icon.png # 24x24 PNG icon for launcher
├── __init__.py # Entry point with update() function
└── assets/ # Optional: app assets (auto-added to path)
└── ...
Your __init__.py must implement:
init()- Optional, called once when app launchesupdate()- Required, called every frame by MonaOSon_exit()- Optional, called when returning to menu
Step 7: Create Your First App
Create the app directory structure:
mkdir hello_app
cd hello_app
Create hello_app/__init__.py:
# hello_app/__init__.py - Your first MonaOS app!
from badgeware import screen, brushes, shapes, io, PixelFont
import math
# Optional: called once when app launches
def init():
screen.font = PixelFont.load("nope.ppf")
print("Hello app initialized!")
# Required: called every frame by MonaOS
def update():
# Clear the framebuffer
screen.brush = brushes.color(20, 40, 60)
screen.clear()
# Draw animated sine wave
y = (math.sin(io.ticks / 100) * 20) + 60
screen.brush = brushes.color(0, 255, 0)
for x in range(160):
screen.draw(shapes.rectangle(x, int(y), 1, 1))
# Draw text
screen.brush = brushes.color(255, 255, 255)
screen.text("Hello, Badge!", 10, 10)
screen.text("Press HOME to exit", 10, 100)
# Handle button presses
if io.BUTTON_A in io.pressed:
print("Button A pressed!")
if io.BUTTON_HOME in io.pressed:
# HOME button exits to MonaOS menu automatically
pass
# Optional: called before returning to menu
def on_exit():
print("App exiting!")
Create hello_app/icon.png:
- 24x24 pixel PNG image
- Use any image editor to create a simple icon
- Or download a free icon and resize it
✅ Checkpoint: Files created:
hello_app/__init__.pyhello_app/icon.png(24x24 PNG)
Step 8: Test Your App Locally
# From your project directory (not inside hello_app/)
cd ~/badger-projects/hello-badge
# Run the app temporarily (doesn't save to badge)
# macOS/Linux:
mpremote connect /dev/tty.usbmodem* run hello_app/__init__.py
# Windows:
mpremote connect COM3 run hello_app/__init__.py
✅ Checkpoint: Your badge display should show "Hello, Badge!" with an animated wave. Press HOME to exit.
Step 9: Install Your App to MonaOS
Why: Install it permanently so it appears in the MonaOS launcher menu!
⚠️ IMPORTANT: The /system/apps/ directory is READ-ONLY via mpremote. You MUST use USB Mass Storage Mode.
Enter USB Mass Storage Mode
- Connect badge via USB-C (if not already connected)
- Press RESET button TWICE quickly (double-click the RESET button on the back)
- Wait 2-3 seconds - Badge will appear as "BADGER" drive
- Verify: Drive should appear in Finder (macOS), File Explorer (Windows), or file manager (Linux)
Install Your App
macOS/Linux:
# Copy your entire app directory to the badge
cp -r hello_app /Volumes/BADGER/apps/
# OR manually via Finder:
# 1. Open BADGER drive in Finder
# 2. Navigate to apps/ folder
# 3. Drag hello_app folder into apps/
Windows:
# Copy your entire app directory
# (Replace D: with your actual BADGER drive letter)
xcopy hello_app D:\apps\hello_app\ /E /I
# OR manually via File Explorer:
# 1. Open BADGER drive
# 2. Navigate to apps\ folder
# 3. Drag hello_app folder into apps\
Exit Mass Storage Mode
macOS:
# Eject the drive
diskutil eject /Volumes/BADGER
# Or right-click BADGER in Finder → Eject
Windows:
- Right-click BADGER drive → "Eject"
- Or use "Safely Remove Hardware" in system tray
Linux:
# Eject the drive
sudo umount /media/$USER/BADGER
All Platforms:
- Press RESET button once on the badge
- Badge reboots into MonaOS with your app installed!
✅ Checkpoint:
- BADGER drive was successfully ejected
- Badge reboots normally (you see MonaOS menu)
Step 10: Launch Your App from the Badge
- On your badge: Press HOME if needed to return to MonaOS launcher
- Navigate: Use UP/DOWN buttons to find your app
- Launch: Press the select button to run your app!
Note: The default MonaOS menu shows 6 apps. You may need to expand pagination (see https://badger.github.io/hack/menu-pagination/)
🎉 Congratulations! Your first MonaOS app is installed and running!
🎉 Congratulations!
You just:
- ✓ Set up your Python development environment
- ✓ Installed badge communication tools
- ✓ Connected to your badge
- ✓ Created your first MonaOS app with proper structure
- ✓ Installed your app into MonaOS launcher
- ✓ Launched your custom app from the badge!
Quick Reference Card
Save these commands - you'll use them a lot:
# Activate your virtual environment
source venv/bin/activate # macOS/Linux
venv\Scripts\Activate.ps1 # Windows
# Test app temporarily (doesn't save)
mpremote run my_app/__init__.py
# Install app to MonaOS launcher (USB Mass Storage Mode REQUIRED)
# 1. Press RESET button twice on badge (enters Mass Storage Mode)
# 2. Copy app to badge:
cp -r my_app /Volumes/BADGER/apps/ # macOS/Linux
xcopy my_app D:\apps\my_app\ /E /I # Windows
# 3. Eject BADGER drive safely
# 4. Press RESET once to reboot
# List files (read-only view)
mpremote ls /system/apps
# Connect to REPL (interactive mode)
mpremote
# (Ctrl+C to interrupt, Ctrl+D to soft reset, Ctrl+X to exit)
⚠️ Remember: You CANNOT use mpremote to install apps to /system/apps/ - it's read-only! Always use USB Mass Storage Mode.
Your First Improvements
1. Add Button Interactions
def update():
screen.brush = brushes.color(20, 40, 60)
screen.clear()
screen.brush = brushes.color(255, 255, 255)
if io.BUTTON_A in io.held:
screen.text("Button A held!", 10, 50)
elif io.BUTTON_B in io.pressed:
screen.text("Button B pressed!", 10, 50)
elif io.BUTTON_C in io.released:
screen.text("Button C released!", 10, 50)
2. Draw Shapes
def update():
screen.brush = brushes.color(20, 40, 60)
screen.clear()
# Draw a circle
screen.brush = brushes.color(255, 0, 0)
screen.draw(shapes.circle(80, 60, 30))
# Draw a rectangle
screen.brush = brushes.color(0, 255, 0)
screen.draw(shapes.rectangle(10, 10, 50, 30))
# Draw a line
screen.brush = brushes.color(255, 255, 255)
screen.draw(shapes.line(0, 0, 160, 120))
3. Create a Counter
# Add at top level
counter = 0
def update():
global counter
screen.brush = brushes.color(0, 0, 0)
screen.clear()
screen.brush = brushes.color(255, 255, 255)
screen.text(f"Count: {counter}", 30, 50)
if io.BUTTON_A in io.pressed:
counter += 1
if io.BUTTON_B in io.pressed:
counter = 0
Common Beginner Questions
Q: Do I need to activate venv every time?
Yes, activate it each time you open a new terminal.
Q: What if I make a mistake in my code?
Edit locally, test with mpremote, then reinstall via Mass Storage Mode:
# 1. Edit your code locally
# 2. Test it temporarily
mpremote run my_app/__init__.py
# 3. Reinstall via Mass Storage Mode
# - Press RESET twice (enters Mass Storage Mode)
# - Replace files in /Volumes/BADGER/apps/my_app/
# - Eject and press RESET once
Q: Can I edit code directly on the badge?
Yes! Enter USB Mass Storage Mode (press RESET twice). Badge appears as "BADGER" disk. Edit files in /Volumes/BADGER/apps/ using any text editor.
Q: What if my badge freezes?
Press the RESET button on the back of the badge.
Q: How do I see errors?
Connect to REPL:
mpremote
Then test importing: import my_app. Errors will show in terminal.
Q: How do I remove an app?
mpremote rm -rf :/system/apps/my_app
Q: My app doesn't appear in the menu?
The default menu shows 6 apps. Expand pagination: https://badger.github.io/hack/menu-pagination/
Troubleshooting Common Issues
Badge not detected
- Check USB cable (must be data cable, not just charging)
- Try different USB port
- Restart badge (press RESET)
- Check connection:
- macOS/Linux:
ls /dev/tty.usb* - Windows: Check Device Manager
- macOS/Linux:
"Permission denied" error
Linux: Add yourself to dialout group (see Step 4a) Windows: Run PowerShell as Administrator
"Module not found" error
Activate your virtual environment:
source venv/bin/activate # macOS/Linux
venv\Scripts\Activate.ps1 # Windows
App doesn't appear in MonaOS menu
- Verify upload:
mpremote ls /system/apps/my_app - Check files exist:
__init__.pyandicon.png - Icon must be 24x24 PNG
- May need to expand menu pagination
Next Steps
Learn More About App Development
→ See badger-app-creator skill
- Advanced button handling
- Working with sprites and images
- WiFi integration
- State management and persistence
Connect Hardware
→ See badger-hardware skill
- GPIO pins and sensors
- I2C/SPI devices
- IR transmitter/receiver
- LED backlight control
Use the REPL
→ See micropython-repl skill
- Interactive development
- Quick testing
- Install packages
Improve Your Workflow
→ See badger-deploy skill
- Automated deployment scripts
- Project organization
- Multi-file apps
Official Resources
- Getting Started: https://badger.github.io/get-started/
- Hacks & Tutorials: https://badger.github.io/hacks/
- Official Apps: https://badger.github.io/apps/
- Source Code: https://github.com/badger/home/tree/main/badgerware
- API Docs: https://github.com/badger/home/blob/main/badgerware/
You're Ready!
You now have everything you need to create amazing projects with your Universe 2025 Badge. Happy coding! 🦡