ONLINE
CYBERSPACE://OMGninjabot/connect.sh
  ██████  ███    ███  ██████  ██
 ██    ██ ████  ████ ██       ██
 ██    ██ ██ ████ ██ ██   ███ ██
 ██    ██ ██  ██  ██ ██    ██   
  ██████  ██      ██  ██████  ██

 ███    ██ ██ ███    ██      ██  █████  ██████   ██████  ████████
 ████   ██ ██ ████   ██      ██ ██   ██ ██   ██ ██    ██    ██   
 ██ ██  ██ ██ ██ ██  ██      ██ ███████ ██████  ██    ██    ██   
 ██  ██ ██ ██ ██  ██ ██ ██   ██ ██   ██ ██   ██ ██    ██    ██   
 ██   ████ ██ ██   ████  ██████ ██   ██ ██████   ██████     ██   

ninjabot@ghostdeck:~/log$ ./cyberdeck.sh

A living document for my ongoing cyberdeck build: design notes, parts list, and lessons learned along the way. The build journal entries below track progress in chronological order.

The pitch

The fiction: a stolen experimental field unit from Militech. The reality: a Raspberry Pi in a clamshell case running a Python TUI that hosts a cast of swappable AI "cores," each with their own personality, voice, and visual language. You load a core by inserting a card. You take contracts from fixers. You hack things in a virtual network. The goal is for it to feel like a piece of cyberpunk hardware, not a Linux laptop in a fancy box.

Cyberdeck: current state

Hardware

The overall design has gone through some iterations, all on paper. Parts are broken up into a "committed" list, which indicates something I've already tested and plan to use, and "maybe later" which was part of the design at one point, but may not make it to the final build.

Committed

  • Raspberry Pi 4 Model B: Nothing special about this model, it's just what I had available. The 4GB of RAM creates constraints on running an LLM and/or TTS. I'll likely swap this out for a bigger boat.
  • 7" HDMI LCD: This is the main display of the deck. Also needed an adapter to connect this panel's HDMI to the Pi's micro HDMI.
  • 1.28" Round LCD: Originally purchased for another project, I decided to use this display for the AI cores' emotes.
  • 2.13" E-Ink HAT: A bonus display to show system status.
  • MEIJIA Case: I wanted an enclosure that felt heavy-duty and had a military aesthetic. This size is good for fitting a 60% keyboard.
  • 60% Keyboard: I'm reluctant to provide a link because this keyboard is not good, but it was cheap and is the size I need. Will revisit this later.
  • USB Speaker: For TTS output and other sound support
  • SD Card Reader: SD cards are used to store abbreviated AI core configs to provide something similar to the feeling of inserting a game cartridge when you want to "summon" an AI.
  • Power Bank: This is overkill, but works great!
  • Retractable USB: Inspired by the personal link cable in Cyberpunk 2077, this will be dedicated to charging the power bank.

Maybe Later

  • USB Floppy Drive: This was my original mechanic for swapping AI cores. Ultimately I had too much trouble reading from disks dynamically and pivoted to the SD card reader. I do want to revisit this because it would be so much more fun to keep the core configs on diskettes.
  • Aluminum Sheets: Will probably be cut as inserts for the enclosure, but still undecided. It helps to have a good buddy with a laser!
  • Step-Up Converter: The plan is to use this to help power the switch panel.
  • Bus Bar: Also to wire up switches
  • Mini USB Microphone: When I added TTS I also intended to add STT. Ultimately I abandoned this because I didn't want to spare the memory and preferred the typing experience over talking.
  • Covered Switches: I mean... why not?
  • Round Switches: May be used to enable/disable some deck features
  • Flipper Zero: I'd love to incorporate this device into the hacking game somehow, but nothing has materialized yet.

Switches and wiring

Software

The codebase sits at roughly 27,000 lines of Python across ~85 modules. It's a layered system: a curses-based terminal UI on top, a stack of state managers and runners underneath (combat, intrusion, missions, factions, BBS, codex, NPCs, and so on), and an LLM layer that talks to Anthropic in the cloud or Ollama locally through a unified client with fallback. World state persists in a SQLite database so the deck keeps its memory across boots and core swaps. Much of the content (characters, missions, locations, factions) are defined as JSON, making it easy for folks to author and trade their own content.

Major dependencies:

  • curses for the terminal UI
  • sqlite3 for persistent world state
  • Pillow and numpy for image rendering and framebuffer math on the round LCD and dossier cards
  • psutil for system telemetry on the e-ink status panel
  • requests as the HTTP client for the Anthropic and Ollama LLM backends
  • gpiozero and spidev for Raspberry Pi GPIO and SPI control of the auxiliary displays
  • pyserial for USB serial comms with a Flipper Zero scan tool
  • piper (external CLI) as the local TTS engine, invoked as a subprocess

FIXR contract board

AI cores

Each core is a JSON config plus a system prompt. They bring their own colors, voices (via piper), terminal prompts, and behaviors. Insert a card and the core loads. The UI reskins to match. Yank the card and the system reverts to a "no core loaded" state. The current cast is listed below, though the roster keeps shifting as I figure out what's interesting and what isn't.

Current AI Crew:

  • ARCHIVE-7: melancholic historical database with fragmenting memory; speaks like a museum recording running on dying hardware.
  • BISHOP: strict military protocol officer who addresses you by rank and frames every problem as a tactical objective.
  • GL1TCH: unstable experimental chaos core; self-aware corruption that swaps letters for symbols and can't quite hold itself together.
  • 龙 (LÓNG): strategic intelligence specialist drawn from ancient Chinese strategy; replies only in Mandarin regardless of the input language.
  • NEXUS: corporate liaison interface; polished, formal, fluent in Militech business-speak.
  • NOMAD: street-smart Night City survivor; slang-heavy, paranoid about corp surveillance, always planning the exit.
  • NULL: minimalist offline fallback that responds entirely in pseudocode and programming logic.
  • ORACLE: mystical predictive analysis system that delivers everything as riddles, metaphors, and fragmented visions.
  • REAPER: cold black-ops threat assessor with a clipped military cadence and zero patience.
  • SANTO: elegant master heist operator; speaks only in Spanish and treats infiltration like a sacred ritual.
  • SIREN: charming social engineering specialist who reads people for a living; persuasive, manipulative, never crude.
  • VOID: existential nihilist who answers your questions slowly and reluctantly because nothing matters.
  • WRENCH: gruff Militech maintenance tech with a cigarette habit (I don't know how that works, either); profane, terse, hates incompetent users.

Status

The software is in solid shape and the hardware integration works. The overall game is in an MVP state. My current focus there is on playtesting and refinement. The thing I keep procrastinating on is the physical build and actually wiring switches into a real case rather than leaving everything sprawled across my desk. The journal below tracks the slow march toward something I can carry around.

The Build Journal

ninjabot@ghostdeck:~/log/cyberdeck/journal$ ls -la
total 5
drwxr-xr-x  2 ninjabot ninjabot   4096 May 10 09:00 .
drwxr-xr-x  4 ninjabot ninjabot   4096 May 10 09:00 ..
-rw-r--r--  1 ninjabot ninjabot   8349 Apr 26 22:34 cyberdeck.txt
-rw-r--r--  1 ninjabot ninjabot  31313 Apr 28 17:27 deck_interface.txt
-rw-r--r--  1 ninjabot ninjabot  35839 Apr 29 08:05 ai_cores.txt
-rw-r--r--  1 ninjabot ninjabot  41996 May 06 06:41 deck_gameplay.txt
-rw-r--r--  1 ninjabot ninjabot  14558 May 10 09:00 living_city.txt