V1 — Auto Monitoring | V2 — MacroDeck

Pico Real Rich Presence

Physical status monitor for Linux environments. Displays contextual active application information on a secondary LCD screen powered by RP2040.

Two Modes of Operation

PRRPC adapts to your workflow with automatic monitoring or manual macro control.

V1 — Auto Monitoring

Automatically detects the active application on your Linux desktop and displays contextual status on the LCD screen. Zero manual input required.

  • GNOME focus event detection via pyatspi
  • Serial port communication (zero CPU polling)
  • Real-time application switching
  • Session time tracking

V2 — MacroDeck

Transforms into an interactive MacroDeck with local web control. Send emoji reactions and manually override the display status from any browser.

  • Flask web server on localhost:5000
  • Multi-thread architecture
  • Emoji selector UI
  • 100x100px optimized assets

Client-Server Architecture

The system operates via a robust Client-Server architecture over serial port, combining software detection with hardware rendering for reliable performance.

Host (PC - Linux) Python service monitors GNOME desktop focus events using pyatspi
Serial Port Native integration, no polling, zero CPU consumption
Client (RP2040) Renders graphical interface using raw RGB565 icons

Specifications

Minimal hardware requirements for a complete physical status monitor setup.

RP2040-Zero

Microcontroller or compatible Raspberry Pi Pico running MicroPython firmware.

1.69" IPS LCD

ST7789 controller, 240x280 resolution, SPI interface with vibrant color output.

USB-C Connection

Single cable for both data interface and power supply. Plug and play setup.

Linux (GNOME/Wayland)

Tested on Fedora with GNOME desktop environment. Python with pyatspi required.

monitor_pc.py — App Mapping
# Example: Adding a new app in monitor_pc.py
APPS_MAPPING = {
    "Code":       "VSCODE",
    "Firefox":    "FIREFOX",
    # Map window focus keyword to an internal ID
    "Obsidian":   "NOTAS"
}

# V2: Web control API snippet
@app.route('/set_emoji/<emoji_id>')
def set_emoji(emoji_id):
    # Sends manual Emoji command via serial
    send_to_serial(emoji_id.upper())
    return {"status": "success"}

# V2: RP2040 optimized image loading
if comando in EMOJI_MAP:
    arch = EMOJI_MAP[comando]
    mostrar_imagen(arch)

Build Your Own PRRPC

Open source, fully documented. Get started with minimal hardware and bring physical status monitoring to your Linux desktop.