I build voice assistants, robots, security hardware, games, websites and 3D prints in York, Pennsylvania.

Below, a Rubik’s cube drawn in text characters solves itself as you scroll, then unfolds into six sides: one for each field of my work.

Christopher A. Lee

work()

Open a project for the problem, the hardest part and some of the real code.

Showing all 7 projects

  • AI

    ADAM voice assistant

    A real-time voice assistant with a crash-isolated plugin engine, a local wake word and a custom HUD.

    Python, Gemini Live API, faster-whisper, PyQt6

    1. Microphone audio passes a local wake-word gate (faster-whisper) before anything is streamed
    2. Gemini Live streams audio both ways for real-time conversation
    3. Tools are plugins: drop a file in a folder and it is found, validated and crash-isolated
    4. A PyQt6 HUD and a phone dashboard show what it is doing; the face-tracking rig is its body
  • Hardware

    Face-tracking rig

    A servo head that finds and recognises faces, with OLED eyes that follow the assistant’s state.

    C++ (Arduino), ESP32, Python, OpenCV

    A blue box-shaped camera case with a hinged mount on its side and a separate base plate
    The camera case, modelled in OpenSCAD (render)
  • Security

    ESP32 Marauder handheld

    A school cybersecurity project: Wi-Fi and Bluetooth testing firmware, brought up on a board and touchscreen it has no build for.

    C++ (Arduino), ESP32-S3, PlatformIO

    1. An ESP32-S3 DevKitC (16 MB flash, 8 MB PSRAM) runs the firmware
    2. A custom MARAUDER_DIY_S3 target reuses the existing ILI9341 screen and menu code
    3. The display and the XPT2046 touch controller each get their own SPI bus
    4. Touch is polled instead of interrupt-driven, so no IRQ wire is needed
    5. Scans hop across all 14 Wi-Fi channels instead of sitting on one
  • Games

    Roblox RPG

    Server-authoritative combat, procedurally rigged enemies and orbiting companions that multiply XP.

    Luau, Roblox

    1. The client fires Attack with no arguments — it only says “I swung”
    2. The server owns range, cooldown, crits and damage
    3. Enemies are rigged procedurally and scale with level
    4. Summoned companions orbit the player and multiply XP
    5. Walk cycles animate on each client, so limbs never touch the network
  • Web

    Phone-first site editor

    The editor behind HZR Tech’s client sites: owners change their own site from a phone, and a bad edit cannot take it down.

    Astro, Cloudflare Pages Functions, GitHub Git Data API, Playwright

    The editor on a phone: a notice-bar switch, opening-hours choices and a Publish button
    The editor on a phone, for Jay’s Cleans & Things (screenshot)
  • Web

    Local business site template

    The Astro template every HZR Tech client site starts from, built so a live site costs nothing to run but the domain.

    Astro, JavaScript, Cloudflare Pages, Web3Forms

    The Jay’s Cleans & Things LLC home page: the business name over a photo of a clean kitchen, with quote and phone buttons
    A live client site built from the template (screenshot)
  • 3D printing

    Parametric 3D-print models

    Parametric OpenSCAD designs, with a headless render loop and an STL checker that catches fused print-in-place parts.

    OpenSCAD, BOSL2, Python

    1. Parametric OpenSCAD models, using BOSL2 for gears, threads and rounding
    2. Headless renders to images from several angles, so geometry is checked by looking
    3. An STL inspector counts separate shells and open edges before anything is sliced
    4. Sized for a Flashforge Adventurer 5M: a 220 mm bed and a 0.6 mm nozzle

onMakerWorld()

Models I’ve published as Pyenjoyer. Both are CC0, free for anyone to print, remix or use.

  • A black cube frame whose bars pass in front of and behind each other in a way a real cube could not

    Impossible Cube

    A cube frame with a slight physical illusion built in.

    "license":
    "CC0"
    "published":
    "2026-08-31"

    Cover image from the listing

  • A pale grey ring with a raised band of interlaced trinity knots, on a black background

    Trinity Nordic Ring

    A ring banded with trinity knots. It comes out smoothest in silver PLA with a 0.25 mm nozzle; 0.4 and 0.6 work if fine detail matters less.

    "license":
    "CC0"
    "published":
    "2026-09-02"

    Cover image from the listing

about()

I’m Christopher Lee, Chris to most people. I build across software and hardware: an AI voice assistant with its own plugin engine, a servo head that recognises faces, a Wi-Fi testing handheld on a board it was never made for, and a Roblox game where the server does not trust the client.

I also run HZR Tech, where I build and look after websites for local businesses.

Visit HZR Tech

toolbox.jsonWhat I build with
Languages
TypeScript, JavaScript, Python, C++, Luau
Web
React, Astro, Cloudflare Pages, Playwright
Hardware
ESP32, Arduino, PlatformIO, OpenSCAD
AI and vision
Gemini Live API, faster-whisper, OpenCV, PyQt6

offTheClock()

When I’m not building something, I’m usually solving a Rubik’s cube, playing chess or playing guitar.

Rubik’s cube

Scramble it, then try to solve it.

Drag to look around. Keys work too: R, U, F, L, D, B, with Shift for the other way.

Chess

A puzzle to warm up with.

White: king g1, rook e1, pawns f2, g2 and h2. Black: king g8, queen b2, pawns f7, g7 and h7. White to move.

White to move. Find checkmate in one.

Guitar

Four chords go a long way.

Tap a chord to strum it. Turn your sound on.

getInTouch()

Email is the fastest way to reach me.

hzrtech.dev@gmail.com