Mimic

A desk buddy
that looks back.

Mimic is a Raspberry Pi Pico W, a 128×64 OLED and two buttons. It keeps an eye on the weather, your calendar, your music and your machine — and pulls a face about all of it.

CircuitPython on a Pico W · SSD1306 over I2C
8 screens · 2 buttons · 1 passive buzzer · 3 printed parts

This is the real interface, running in your browser.

Eight screens, two buttons

tap a row to send it to the screen

One button walks the tabs and goes home when you hold it. The other does whatever the current screen needs. Nothing is more than two presses away.

The real thing

captured from the device, not photographed

The panel above is a simulation, so it can be interactive. This is the object, and these are its actual pixels — dumped over USB by screenshot.py and rebuilt on the PC, which is the only way to get a clean picture off a lit OLED.

Mimic on a desk: a red and black printed case holding an OLED showing the games menu, with two large round buttons in front
Printed in red and black PLA. The stand and the button discs are MakerWorld models; the tray, lid and spacer are the custom parts.
The weather screen: a large clock, temperature and a rain icon
weather
The usage screen showing session and weekly percentages
usage
The games menu listing Dino Run and Magic 8-Ball
games
The face screen: clock, battery of tab dots, two eyes and the date
face
The calendar screen showing nothing scheduled in the next 14 hours
calendar
The Spotify screen showing a track, artist and progress bar
spotify
The system screen showing CPU, RAM, disk and uptime
system
The dino runner mid-game
dino
The magic eight ball waiting for a question
8 ball

What it is made of

about £25 of parts

Everything sits on a half-size breadboard inside a printed case. No soldering — female-to-male jumpers, and buttons that come pre-assembled on discs.

PartWhat it doesNotes
Raspberry Pi Pico WBrains and Wi-Fi2.4 GHz networks only
SSD1306 OLED 0.96″The face, 128×64 pixelsI2C, monochrome — no colour anywhere
2 × tactile buttonsThe whole interface6×6 mm on 25.4 mm discs
Passive buzzerChiptune jinglesArbitrary frequencies, so short melodies work
Half-size breadboardHolds it togetherTrim the top rail strip to fit the tray
Dupont jumpersNine connectionsFemale-to-male
Wiring map: OLED SDA to GP0, SCL to GP1, ground to pin 38 and 3V3 to pin 36; button 1 to GP2 and button 2 to GP3 with their other legs to ground pins 3 and 8; buzzer signal to GP15 with 5V from VBUS and ground on pin 18.
Signal map, not to scale. Each row gives the GPIO name, the physical pin and the breadboard hole.
OLED SDAGP0 · pin 1 · hole 1a
OLED SCLGP1 · pin 2 · hole 2a
OLED GNDGND · pin 38 · hole 3j
OLED VCC3V3 OUT · pin 36 · hole 5j
Button 1GP2 · pin 4 · hole 4a, other leg to GND pin 3
Button 2GP3 · pin 5 · hole 5a, other leg to GND pin 8
Buzzer signalGP15 · pin 20 · hole 20a
Buzzer VCCVBUS 5V · pin 40 · hole 1j

Build one

an evening, plus print time

Steps one to five get a face on the screen. Six and seven are what make it useful.

  1. Flash CircuitPython

    Hold BOOTSEL, plug the Pico W in, drop the .uf2 on the RPI-RP2 drive. It reboots as a drive called CIRCUITPY.

  2. Copy the libraries

    From the CircuitPython library bundle, copy the display, text, connection-manager and requests modules into /lib on CIRCUITPY.

  3. Wire it up

    Nine jumpers, following the map above. Check every connection before you trust anything else, and check it again after any change to the case.

  4. Add your settings

    Put your Wi-Fi details and the address of your PC in settings.toml. Remember the radio is 2.4 GHz only.

    CIRCUITPY_WIFI_SSID = "your-network"
    CIRCUITPY_WIFI_PASSWORD = "your-password"
    BRIDGE_HOST = "192.168.1.42"
    CITY = "Athens"
  5. Deploy

    Copy the six board files across and flush the write. Skipping sync is how you get a half-written file and a board that boots to an error.

    cp code.py eyes.py dino.py eightball.py sfx.py icons.py \
       /media/$USER/CIRCUITPY/ && sync
    tio /dev/ttyACM0   # watch it boot
  6. Start the bridge

    Run bridge.py on the machine Mimic sits next to, then install it as a user service so it comes back after a reboot.

    systemctl --user enable --now mimic-bridge
  7. Print the case

    Three parts from one OpenSCAD file: the tray, a lid with a cable slot, and a spacer that sets the stack height. The screen stand and the button discs come from MakerWorld.

The bridge

bridge.py, running on your own machine

A Pico W has no business holding your Spotify tokens or your calendar URL. So it doesn't. A small HTTP server on your PC does the talking and hands Mimic plain numbers over your own network.

GET /stats

Your machine, in four numbers

CPU load, memory, uptime and disk, read on the PC where that information already lives.

GET /next

The meeting popup

The bridge parses your calendar's private iCal feed and returns only the next event and its start time. All-day entries are ignored — birthdays are not meetings.

GET /now

Music and usage

Spotify playback state and how much of your Claude usage window is gone. Tokens are refreshed on the PC and never leave it.

The case

OpenSCAD, v6

Three custom parts printed from one OpenSCAD file, plus a screen stand and button assemblies from MakerWorld. The breadboard drops into the tray, the spacer sets the stack height, the lid lifts off.

tray.stl

The body

Breadboard pocket, USB opening on the right wall, and counterbores for the pre-assembled button discs.

lid.stl

The lid

Locating lip and a cable pass-through. Lifts off whenever you want to get at the breadboard.

spacer.stl

The spacer

Sets the height of the stack inside the tray so the board and breadboard sit where the openings expect them.