A DIY build guide

Build your own Codex Micro.

I wanted the OpenAI × Work Louder keypad, but it was unavailable. So I put together a guide to making my own version, with the files and steps for anyone who wants to do the same.

Print the enclosure, gather the electronics, and see how every piece fits. This is an independent DIY recreation; the original design belongs to OpenAI and Work Louder.

Concept render of the DIY Codex Micro: translucent case, six numbered illuminated agent keys, and labeled Fast, Approve, Decline, New Chat, Voice, and Send keys.
Concept render · DIY prototype with functional key labels. Use the CAD and fit checks for dimensions.

Before you start

Choose your electronics route before ordering or printing. This is a DIY prototype; full native Codex behavior requires genuine compatible electronics.

OpenAI explicitly lists Creator Micro 2 as compatible. The model with Bluetooth is the Pro; the Base is wired. A verified OEM PCB-only kit was not found. If matching the original is the priority, start with a complete genuine unit, verify it works, and customize its enclosure only after measuring it. OpenAI compatibility guide ↗ · Manufacturer specifications ↗

Recommended for your requirement

Native electronics + printed exterior

Retain the factory controller, LEDs, touch electrode, switch assembly, firmware, diffuser, and—on Pro—the original battery and charging circuit. That preserves the supported connection to Codex.

What still needs work: measure the donor PCB, mounting holes, connectors, antenna and diffuser; then revise the case. No donor-compatible enclosure is claimed in this package.

Creator Micro 2 Pro ↗ · Codex Micro ↗

Availability: Codex Micro page showed out of stock ($230). Creator Micro 2 page showed “Not available” without a price. Confirm the selected variant at purchase; no order was placed.
Prototype / additional development

Custom electronics + supplied CAD

USB-C KB2040, hand-wired switches, planar joystick, rotary encoder, capacitive touch, six key LEDs and eight perimeter LEDs. The files below form a buildable prototype design, subject to physical fit and electrical testing.

Included software: USB function keys, dial scroll, joystick arrows, three touch-selected banks, and individually addressable RGBW lights.

Missing for parity: native detection, automatic task status, task switching, voice behavior, reasoning control, app settings, and Bluetooth.

Custom electronics are not a substitute purchase for the full-function donor route.

Feature acceptance matrix

RequirementGenuine supported unitIncluded custom prototype
Native device setup and remappingDocumentedNot implemented
Six task-linked colors and selected-key pulseDocumentedLED hardware; manual color commands only
Task switching, approve / decline / sendDocumentedGeneric F13–F24 keys; app bindings still needed
Push-to-talk and recording / processing lightsDocumentedNot implemented; no microphone in the keypad
Reasoning and composer dial modesDocumentedScroll + Enter only
Joystick actions and touch inputDocumentedArrows + three banks
Bluetooth and rechargeable batteryCodex Micro / Creator Micro 2 ProNot included in USB design
OEM case proportions, finish and feelFactory productPhoto reconstruction; deeper hand-wired body

Native behavior source: OpenAI’s current setup documentation. Color and behavior changes in future app releases must be tested on the running app. These are separate from the geometry checks performed here.

Parts checklist

Check off what you have. Open print files or go straight to the supplier.

0 items checkedLoading your checklist…

Make these on your 3D printer.

Print checklist. Check off parts you have. Click a part name for print files.
#HavePartMaterialQuantityGet it
1Clear PETG1
2White PETG1
3White PETG1
4Black PETG1
5Black PETG1
6White PETG1
7Black PETG6
8Clear PETG6
9White PETG5
10White PETG1
11White PETG1 test piece
12Clear PETG1 test piece

Buy27 items

Electronics, hardware, materials, and donor options.

Buy checklist. Check off parts you have. Part names open supplier links in a new tab.
#HavePartTypeQuantityGet it
13Adafruit KB2040Electronics1Buy ↗
14Gateron North Pole Yellow 2.0Electronics13Buy ↗
15Thumb slide joystickElectronics1Buy ↗
16Rotary encoder with push switchElectronics1Buy ↗
17Encoder nut and washerHardware1 setBuy ↗
18Mini RGBW NeoPixel boardElectronics14Buy ↗
1974AHCT125 level shifterElectronics1Buy ↗
201N4148 signal diodeElectronics13Buy ↗
21Silicone hookup wireElectronicsAs neededBuy ↗
22Copper touch electrodeElectronics1 diskBuy ↗
233 mm indicator LEDElectronics3Buy ↗
24Resistors and capacitorsElectronics1 small setBuy ↗
25Small prototype circuit boardElectronics1Buy ↗
26M3 heat-set insertHardware6Buy ↗
27M3 × 8 mm plate screwHardware4Buy ↗
28Low-profile M3 × 8 mm screwHardware2Buy ↗
29Steel weight washerHardware4 optionalBuy ↗
30Adhesive rubber feetHardware4 pads or a stripBuy ↗
31USB-C data cableHardware1Buy ↗
32Insulation and mounting tapeHardwareAs neededBuy ↗
33Clear key-label decal paperHardwarePart of one sheetBuy ↗
34Clear PETGMaterialsAbout 150 gBuy ↗
35White PETGMaterialsAbout 100 gBuy ↗
36Black PETGMaterialsAbout 50 gBuy ↗
37Creator Micro 2 ProNative1 donor optionBuy ↗
38Genuine Codex MicroNative1 alternativeBuy ↗
39Frosted MX Pure capsNative6 × 1UBuy ↗

Choose either custom electronics or a genuine donor route. Supplier availability and prices can change. Generic hardware links require selecting the stated dimensions.

3D printing

These materials have different jobs. Use the material listed beside each printed part.

Buy colorless clear / natural PETG for light transmission. Use opaque white and black where light should be reflected or blocked.

Light transmission

Clear / natural PETG

Print the case and six agent keycaps. Its 0.8 mm perimeter windows let the LED colors escape. Clear plate printing is optional for a more translucent appearance.

Allow roughly 150 g for these parts plus trials. Printed layers usually make clear filament look frosted; the actual result depends on settings and thickness.

PETG · choose Clear ↗
Visible opaque parts

White PETG

Print the structural plate, five individual command caps, wide cap, dial and foot. Ordinary white is appropriate here; it is not a replacement for clear agent caps.

Allow roughly 100 g. Purchasing molded keycaps gives smoother surfaces and more reliable stem fit.

PETG · choose White ↗
Light isolation

Black PETG

Print six baffles, the touch cap and joystick cradle. The baffles keep one agent’s light from spilling into the next.

Allow roughly 50 g. Existing black PLA can work for the internal baffles. Use adhesive rubber feet; TPU is optional, not required.

PETG · choose Black ↗

These are material allowances, not slicer weight estimates. Three new spools may cost about $55–85, while this build uses only a fraction of each. Confirm 1.75 mm versus 2.85 mm for your printer before ordering; the links default to 1.75 mm.

For faithful colors: choose colorless filament. Tinted blue, gray, smoke, glitter and fiber-filled plastics change or block the light. Sand a test patch lightly for diffusion. Neither FDM PETG nor a printed keycap will exactly reproduce CNC-sandblasted polycarbonate or molded PBT. For the donor route, retain the factory lightpipe and use six frosted MX Pure caps; the vendor listed those as a pre-order.

Starting print profile

SettingStarting pointReason / constraint
Nozzle / layer height0.4 mm / 0.20 mmUse 0.12–0.16 mm for keycaps and the dial; 0.2 mm nozzle improves sockets if available.
Walls / top & bottom4 perimeters / 5 layersUse local solid modifiers around insert bosses and switch lands.
Infill20–30% for opaque partsPerimeter windows are modeled thin. Do not use sparse infill inside an optical window.
TemperatureFilament’s own PETG presetPolymaker lists 240–260°C nozzle and 60–70°C bed; start within your printer’s supported range.
Moisture / plateDry filament; suitable release layerFollow spool instructions. PETG can bond too strongly to smooth PEI or glass.
Bed sizeAt least 120 × 120 mm for one caseLargest part is 110 × 110 mm; allow for brim and actual printable area.
Scale100%, millimetresAdjust socket/cutout parameters instead of scaling the entire model.

Filament guidance: Polymaker PETG specifications. Actual printer model, nozzle and calibrated tolerances remain unconfirmed.

Assembly

Click a part for print files or buying links.Loading 3D model…

Build it, one step at a time.

Choose a step to see its parts, learn the idea behind it, and check your work. These lessons follow the custom build using the supplied Rev A files.

Step 01 / 10

Print the fit samples

Learn how print tolerances affect a real fit.

Test the switch aperture, MX socket and insert fit before printing the body01 / SWITCH APERTURE14.0 mm14.1 mm14.2 mmChoose the aperture that lets the real switch latch.02 / STEM + INSERTMX socketGrip, no split.M3 insertStraight, no spin.
Fit-test schematic, not to scale. These samples are test pieces and stay out of the finished keyboard.
On your bench
Gateron North Pole Yellow 2.0 M3 heat-set insert

How to do it

  1. Print the switch-fit coupon (file 10) and stem/insert coupon (file 11), using the materials and settings you intend to use for the finished parts.
  2. Try a real MX switch in the 14.0, 14.1 and 14.2 mm apertures. Choose the fit that clips in securely without forcing or cracking the plastic.
  3. Test the MX stem socket and one specified M3 insert in the second coupon. If the fit is wrong, adjust the CAD parameters, regenerate and repeat before printing the full set.

Why it matters

A printer does not reproduce every hole at its exact CAD size. Material, extrusion and cooling affect the fit. A small coupon lets you calibrate the mating surfaces using little filament, before committing to the whole case.

Before you move on

The switch clips in and stays seated; the keycap socket grips without splitting; the cooled insert stays straight and does not spin.

Step 1 of 10
Using genuine donor electronics?

Native route: preserve the working assembly

  1. Connect a genuine unit in its original case and complete the official setup. Confirm task colors and controls before changing hardware.
  2. Measure with the donor worksheet. If opening a Pro unit, unplug USB, turn it off and disconnect the battery before moving the board. Keep its original charger, protection circuit and cell together.
  3. Revise and test-print the mounting interface. Retain the factory switch/LED assembly and lightpipe. Provide access to USB and the rear button, clearance around the antenna, and a measured gap at the touch electrode.
  4. Fit the revised shell without loading the PCB or pinching wires. Reconnect the original components and run the acceptance checklist below. The supplied custom-PCB-free case is not approved for this transplant.
Prototype fit checks that need the actual partsThe slide joystick has no controlled supplier drawing; test its 19.8 mm pocket. Keycap sockets depend on printer calibration. At full key travel, caps must clear the plate and each other. The dial must rotate freely and still depress. LED solder joints must not touch switch pins. No physical print or electrical bench test has been performed here.

Matrix: view from above, USB at the rear

Row / GPIOC1 / D6C2 / D7C3 / D8C4 / D9
R1 / D2Encoder, separate wiringAgent 01Agent 02Joystick, separate wiring
R2 / D3Agent 03Agent 04Agent 05Agent 06
R3 / D4Command 1Command 2Command 3Command 4
R4 / D5Touch, separate wiringWide key / left switchWide key / right switchCommand 6

When soldering from underneath, this layout is mirrored left-to-right. Label rows and columns before flipping the plate.

Electrical connection map

DIY wiring map · KB2040 · USB-C onlySignal schematic. All grounds connect. This is the custom prototype, not OEM electronics. KB2040 USB-C → computerRAW → protected 5 V rail3V → joystick supplyGND → common groundD2–D5 rows R1–R4D6–D9 cols C1–C4A0 / A1 → joystick X/YTX / RX → encoder A/BA2 → encoder buttonD10 → copper touch pad 13-switch matrixColumn → switch → diode → rowDiode band / cathode faces the row.13 diodes, including both wide-key switches.Empty cells: R1C1, R1C4, R4C1. Analog + tactileJoystick VCC = 3.3 V, never 5 V.Encoder common + button return → GND.Touch: D10 to GND through 1 MΩ. 14 RGBW LEDsMOSI → 74AHCT125 → 330Ω → DINLevel shifter and pixels use RAW / GND.DOUT → DIN, then repeat along chain.0–5: agent keys • 6–13: perimeter.GRBW order • firmware brightness 15%.100 µF across LED rail; 100 nF at IC. 3 status indicatorsSCK / MISO / A3 → 1kΩ → LEDLED cathodes → GND. Three 3 mm LEDs. 74AHCT125: 14=RAW, 7=GND, 1=GND, 2=MOSI, 3=330Ω→DIN. Tie unused inputs 5/9/12 to GND. Disable unused gates: 4/10/13=RAW; leave outputs 6/8/11 open. Confirm DIP orientation against the datasheet. Keep the KB2040 fuse bypass jumper OPEN. Inspect polarity and check for power-to-ground shorts before connecting USB.

Keep power domains correct

Power pixels and the 74AHCT125 from the KB2040’s fused RAW rail. Power the joystick from 3V so its analog outputs stay within 3.3 V. All grounds join. Leave the fuse-bypass jumper open.

Budget estimate: 14 × 75 mA × 15% ≈ 158 mA for the LEDs at the worst RGBW setting, plus board and indicators. Target under 250 mA total and verify with a USB meter. This is an estimate, not a measured result.

Put a 100 µF / ≥10 V capacitor across the LED rail and 100 nF close to the shifter’s supply pins. Do not add an external supply to this USB-powered build.

Joystick and encoder pinout

On SparkFun’s COM-09426, the bottom-view pad sequence is X, VCC, Y, GND; GND is nearest the two mounting tabs. Use the linked seller’s orientation diagram and a meter—other PSP replacements may differ. Despite the seller’s Arduino example, this build uses 3.3 V VCC.

Encoder A/B go to TX/RX and common to GND. Its separate switch goes between A2 and GND. If turn direction is reversed, swap A/B in firmware. No resistor is needed for the encoder switch because the firmware enables its pull-up.

Electrical sources: KB2040 pinout · LED level shifting · Joystick · Encoder drawing.

Firmware & colors

Native setup

Use the current desktop app, connect the genuine unit, and follow its detected-device setup. On macOS, grant the requested Input Monitoring access. Choose task assignments, controls and brightness in the device settings. Work Louder Input is optional for other-app layers.

The mic key uses the computer’s microphone. Native voice feedback uses a sea-green recording animation, followed by white processing and ready feedback.

Complete official setup and behavior reference ↗

State → agent-key color

White · idle
Blue · working
Green · completed, unread
Amber · input required
Red · error
Off · unassigned

The selected task pulses. The current guide specifies red for errors; the supply-page photography can look pink. RGB values in the illustration are approximations, not published firmware constants.

Install the custom prototype firmware

Only do this on the KB2040. These files are not compatible with the genuine Work Louder board and must not replace its firmware.

  1. Install the stable CircuitPython build for Adafruit KB2040 using its BOOT + USB bootloader procedure.
  2. From the matching CircuitPython library bundle, copy adafruit_hid/, neopixel.mpy, and adafruit_pixelbuf.mpy into CIRCUITPY/lib/.
  3. Copy boot.py, code.py, and logic.py to CIRCUITPY. Unplug/replug so the second USB serial port is enabled. Keep hands off the stick and touch pad during startup calibration.
  4. Agent and command keys output F13–F24. The touch control chooses plain, Shift, or Control banks. Map these in your shortcut utility or edit the mappings. The dial scrolls and presses Enter; the joystick sends arrows.
  5. Install Python’s pyserial on the computer and use the included helper to set individual light colors.
python -m pip install pyserial
python -m serial.tools.list_ports
# Pick the KB2040 DATA port, not its REPL/console port.
python tools/set_light.py /dev/cu.usbmodemXXXX 0 0 120 255
# Windows example: replace the device path with COM7.
# LED 0–5 = agent keys; LED 6–13 = perimeter.

The helper sends a manual color command. Seeing the right color confirms LED control, not live task synchronization. Default bank colors are not agent-status indicators.

Work remaining for custom full functionality

A host integration must obtain live task identities and lifecycle events, map six keys consistently, send status and selection updates, handle voice states, dispatch app actions, and recover after reconnects. Native settings, reasoning controls, approval actions and Bluetooth add separate work. The installed app’s Work Louder library confirms a vendor RPC connection for device events and thread lighting; the supplied generic HID firmware does not implement that connection.

No tested custom bridge or native-device emulation is included. A periodic notification script is insufficient to match the original. Completion requires tests on the actual hardware and the current desktop app. The genuine electronics route avoids this unimplemented software layer.

Final checks

Completed offline

All 11 STL files are closed, single-volume meshes. Individual STEP solids pass the CAD kernel validity check. The tested assembly pairs have no material overlap. The board envelope clears the case.

Input-state tests cover the wide key’s two-switch press/release ordering, joystick dead-zone behavior and malformed color input. Firmware syntax is checked.

These tests do not establish print fit, soldering correctness, optical uniformity, key travel feel, electrical current, firmware operation on hardware, or OEM donor compatibility.

Still needed from the build

Printer model, material diameter and nozzle; choice of genuine or custom electronics; actual-part measurements; first fit coupons; assembled hardware; and end-to-end software tests.

Native functionality is documented for genuine devices, but this particular printed re-housing has not been built. The custom route’s native software parity remains unimplemented.

Bench acceptance checklist

The native column is a future physical acceptance test, not a statement that the custom firmware passes it.

Downloads

STLs are oriented for printing. STEP files retain assembly coordinates. Units are millimeters.

Download everything ↓
Printed partQuantityFiles
caseOpen side up; supports in USB tunnel only if your slicer needs them.1STLSTEP
switch plateVisible face DOWN. 1.6 mm switch clip lands, 3 mm structural plate.1STLSTEP
round footFlat bottom DOWN. Washer pockets face up; secure washers with tape before assembly.1STLSTEP
joystick cradlePocket 19.8 mm. Vendor does not publish a controlled drawing; fit-check actual joystick.1STLSTEP
touch capVisible face DOWN. Bond 13 mm copper disk immediately beneath the 0.8 mm top skin.1STLSTEP
encoder knobSocket DOWN; short bridging above nut pocket. Trial fit the D socket before pressing fully. Adhesive optional after testing.1STLSTEP
led baffleBlack filament, cavity UP. LED PCB on floor, insulated pads underneath. Six identical cups.6STLSTEP
keycap 1uPrototype cap: 6 translucent and 5 white. Support only cavity roofs, keep sockets clear. Bought MX caps feel better.11STLSTEP
keycap 2u dual stemTwo MX stems spaced 19.05 mm; uses two switches, NOT a conventional centered 2U stabilizer.1STLSTEP
switch fit couponLeft/middle/right from top: 14.0 / 14.1 / 14.2 mm. Choose snug clip fit before full print.1STLSTEP
stem insert couponCross fits -0.05 / nominal / +0.05, then 3.9 mm insert pocket. Sockets UP for inspection.1STLSTEP

Firmware, wiring and validation files