DIY / MICRO
Build specification · revision A · 06 Sep 2026

Codex Micro.
A DIY build.

Recreate the Codex Micro’s layout, tactile controls, and illuminated keys—with editable CAD and a complete parts plan.

110 × 110 mm prototype13 switches6 agent keys
Color behavior / interactive illustration
ϟ
×
Agent 01 · Thinking

Select a key, then a state. This illustrates color meaning;
it is not connected to Codex and is not a color calibration.

Exact functionality is an electronics + software requirement.The included CAD and KB2040 firmware are a custom prototype. They do not currently deliver native Codex integration. For documented native behavior, use a genuine Creator Micro 2 or Codex Micro with its original firmware. Re-housing that board requires measured donor geometry; the current printable case is not a verified donor fit.
01 / choose the build that meets your requirement

Keep the native electronics
for native Codex behavior.

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.

02 / materials

Yes—some parts should transmit light.

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.

03 / files you can use

Editable solids. Printable meshes.

11 unique printable files, plus an assembled STEP model, parametric source and 3D preview. STL files are already rotated to their intended print orientation; STEP solids retain assembly coordinates.

The prototype uses 19.05 mm MX spacing, a 94 mm faceplate, 3 mm structural thickness with 1.6 mm switch clip lands, a 25 mm case and a 5 mm removable circular foot. Controls bring maximum overall height to about 46 mm, plus rubber.

Accuracy boundary: dimensions were selected from standard parts and the reference photo, not measured from the original. The CAD is not a manufacturer drawing. In particular, the joystick pocket, keycap sockets and printed insert holes require test fitting.

In the assembly, names beginning REF are purchased-part clearance envelopes. They are not objects to print. The STEP model does not contain a full production PCB or wires.

CAD rendering of the custom keypad case with dial, six agent keys, command keys, wide key and joystick
Part / print noteQtyMaterialDownload
01 caseOpen side up; supports in USB tunnel only if your slicer needs them.1Clear / natural PETGSTL · STEP
02 switch plateVisible face DOWN. 1.6 mm switch clip lands, 3 mm structural plate.1White or clear PETGSTL · STEP
03 round footFlat bottom DOWN. Washer pockets face up; secure washers with tape before assembly.1White or gray PETGSTL · STEP
04 joystick cradlePocket 19.8 mm. Vendor does not publish a controlled drawing; fit-check actual joystick.1Black PETGSTL · STEP
05 touch capVisible face DOWN. Bond 13 mm copper disk immediately beneath the 0.8 mm top skin.1Black PETGSTL · STEP
06 encoder knobSocket DOWN; short bridging above nut pocket. Trial fit the D socket before pressing fully. Adhesive optional after testing.1White PETGSTL · STEP
07 led baffleBlack filament, cavity UP. LED PCB on floor, insulated pads underneath. Six identical cups.6Black PETGSTL · STEP
08 keycap 1uPrototype cap: 6 translucent and 5 white. Support only cavity roofs, keep sockets clear. Bought MX caps feel better.116 clear + 5 white PETGSTL · STEP
09 keycap 2u dual stemTwo MX stems spaced 19.05 mm; uses two switches, NOT a conventional centered 2U stabilizer.1White PETGSTL · STEP
10 switch fit couponLeft/middle/right from top: 14.0 / 14.1 / 14.2 mm. Choose snug clip fit before full print.1Same as plateSTL · STEP
11 stem insert couponCross fits -0.05 / nominal / +0.05, then 3.9 mm insert pocket. Sockets UP for inspection.1Same as cap / caseSTL · STEP
Print the two fit coupons first. Trial a single switch, stem, and heat-set insert. The 3.9 mm insert pilot is for the specified 4.2 mm OD × 4 mm long Adafruit insert; it is a starting allowance, not a universal insert hole size. The full shell should follow a successful test.

Add the key legends

The CAD keycaps are blank. Key legend SVG provides six functional symbols at print scale; the artwork approximates the reference labels. Print at 100%, verify the 20 mm scale bar, and trim close to each icon. Apply to the five white 1U caps and the white wide mic cap. Leave the six translucent agent caps unmarked.

Optional clear waterslide decal paper works with an inkjet printer. Use the paper manufacturer’s sealing instructions, test the finish on a spare PETG cap, and keep coatings away from switch stems. A local print shop can make the decals if you do not have a paper printer. These are surface labels, not molded legends.

To adapt the CAD for a genuine donor board

Use the donor measurement worksheet to record the real board outline, hole pattern, component heights, port/button positions, optical parts and antenna clearance. Import the STEP into Fusion, FreeCAD, Onshape or another CAD tool; remove the hand-wiring supports, add measured PCB standoffs, and revise the port, battery and diffuser seats. A donor mounting revision is still required. Keeping the factory enclosure while using custom keycaps is the quickest way to preserve native functionality during this phase.

The supplied wide key has two MX sockets 19.05 mm apart. It fits two independent switches. A conventional single-center 2U keycap and stabilizer will not fit this plate. Two lighter switch springs may be preferable because the wide key presses both switches.

04 / shopping list

Buy for one electronics route.

Filter by route before buying. Native means genuine electronics for supported Codex features. Custom means the experimental hand-wired design and supplied CAD. Materials means filament. US-dollar figures are observed prices where shown, or labeled estimates; tax, shipping and tools are extra.

0 items checked
Part / seller link / specificationBuy / useUSDRoute
Creator Micro 2 Pro ↗Officially supported; Pro required to also match Bluetooth; availability unconfirmed1Use: 1check sellernative
Codex Micro alternative ↗Alternative to Creator Micro 2; page was out of stock; do not buy both1Use: 1230.00native
Frosted MX Pure keycaps ↗For visible agent colors; product page says pre-order1 setUse: 6 1Ucheck sellernative
Adafruit KB2040 ↗USB-C RP2040 board; no Bluetooth1Use: 18.95custom
Gateron New North Pole Yellow 2.0 ↗Transparent top AND bottom; normal MX type; no Choc or Hall switches1 pack of 35Use: 1319.04custom
SparkFun COM-09426 thumb slide joystick ↗PSP1000 style; measure body and test 19.8 mm cradle before bonding1Use: 15.95custom
Adafruit rotary encoder 377 ↗6 mm D shaft M7 panel bushing; nut and washer; included knob is fallback1Use: 14.50custom
Adafruit RGBW mini NeoPixels 4776 ↗6 agent lights plus 8 perimeter; must use GRBW firmware2 packs of 10Use: 149.90custom
74AHCT125 DIP level shifter ↗5 V supply; translates 3.3 V data to pixels1Use: 1check sellercustom
1N4148 diodes ↗One per physical switch; band toward matrix row2 packs of 10Use: 13check sellercustom
28 AWG silicone ribbon ↗Signals and short LED wiring; use 24-26 AWG for power trunk1 m 10 conductorsUse: as neededcheck sellercustom
Translucent MX caps optional ↗Replaces printed translucent 1U caps1 pack of 10Use: 64.95custom
White MX caps optional ↗Replaces printed white 1U caps; wide cap still custom1 pack of 10Use: 5check sellercustom
M3 x 4 mm heat-set inserts OD4.2 ↗Prototype pilot diameter 3.9 mm; print coupon first1 pack of 50Use: 65.95custom
M3 x 8 mm screws ↗Four top socket caps; two foot low-profile heads max6 mm diameter max1.7 mm high1 small packUse: 6estimate 3-6custom
Passives and prototype board ↗330 ohm x1; 1M ohm x1; 1k ohm x3; 100nF x1; 100uF 10V x1; three 3mm LEDs; perfboard max25x20mm1 small assortmentUse: see guideestimate 8-15custom
Copper foil and insulation ↗13mm copper touch disk; polyimide tape; thin foam tape1 small roll eachUse: as neededestimate 8-12custom
USB-C DATA cable ↗Connector overmold must fit 15x8mm rear tunnel1Use: 1estimate 5-10custom
Rubber foot material and optional weights ↗Adhesive rubber 1-2mm; optional M8 fender washers OD24 max thickness2mm1 strip and 4 washersUse: as neededestimate 4-8custom
Clear or natural PETG 1.75mm ↗Choose Clear; case and six agent caps; buy spool not refill if no empty spool1 spoolUse: approx150g allowanceestimate 20-30materials
White PETG 1.75mm ↗Plate white command caps knob and foot; clear plate optional1 spoolUse: approx100g allowanceestimate 20-30materials
Black PETG 1.75mm ↗Light baffles touch cap and joystick cradle; existing black PLA can serve for baffles1 small spoolUse: approx50g allowanceestimate 15-25materials
Clear waterslide decal paper optional ↗Optional printed legends; inkjet version requires inkjet printer and suitable sealer; print shop alternative1 pack of 20 sheetsUse: part of 1 sheet15.99 + sealercustom

Check marks are saved in this browser when local storage is available. Supplier pages and stock can change. Catalog/search links for generic hardware require selecting the dimensions stated here.

Custom build budget

≈ $75–115

Electronics, small hardware and consumed materials, before shipping, tools and optional decal supplies. Add roughly $55–85 if buying three entire filament spools. The result still requires custom integration work for native parity.

Tools & bench supplies

Soldering iron with fine tip, flux, solder, ventilation, wire cutters/strippers, tweezers, multimeter, digital calipers, M3 hex driver, heat-set insertion tip, polyimide tape, thin removable foam tape and a small perfboard.

A filament dryer and a keycap puller help. No motors, display, speaker, Raspberry Pi computer, or onboard microphone are required.

Assembly / interactive 3D

Watch the pieces come together.

Play all eleven stages, use the timeline to separate the layers, and switch to the underside to inspect the hidden parts. Printed components use the same STEP geometry linked above.

The animation shows the custom prototype. Purchased components and cable routes are simplified references; use the written instructions and wiring map for the build.

05 / assembly

Test the electronics before closing the case.

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.

Custom route: supplied Rev A geometry

Print the fit samples

Print files 10 and 11 in the chosen materials. Check the 14.0 / 14.1 / 14.2 mm switch apertures. The switch should click in securely without forcing. Test the MX cross and heat-set insert. Change the JSON parameters and regenerate if necessary.

Print and finish the body

Print the case open side up, plate face down, foot bottom down, and baffles open side up. Clean burrs without widening switch lands. Keep the eight thin optical windows intact. Trial the USB cable in the 15 × 8 mm tunnel.

Install the inserts

Heat-set four inserts from the tops of the corner posts and two into the underside foot mounts. Use the 4 mm-long specified insert and let each cool fully. Keep the iron away from the thin windows.

Fit switches and controls

Clip 13 normal MX switches into the plate. Fasten the encoder with its washer and M7 nut; do not overtighten plastic. Test the dial with the supplied knob first. Solder flexible leads onto the slide joystick, test its movement, and seat it in the printed tray. Trim only tray plastic if required; do not remove the joystick’s retention frame.

Wire the key matrix

Use the top-view matrix below. One switch terminal joins its column. The other goes to the unbanded end of its diode; the banded end joins the row. Insulate crossings. Wire both switches under the wide key independently—the firmware merges them.

Build the light chain

Use two packs of the specified RGBW pixels. Put LEDs 0–5 into six black baffles, shining upward; insulate their rear pads. Tack baffles to the plate underside after wiring. Face LEDs 6–13 outward through the case’s eight inner-wall pockets. Chain DOUT to DIN and use common power/ground buses.

Add touch and indicators

Cut a 13 mm copper disk and solder its lead before installing it beneath the touch cap’s thin top skin. Run it to D10 with a 1 MΩ resistor to ground. Secure the cap by its flange. Fit the three 3 mm indicator LEDs with one 1 kΩ resistor each.

Mount the controller

KB2040 lies between the guide rails, USB facing rear. Use approximately 1.6 mm insulating foam tape under it; its nominal envelope is 17.8 × 35 × 4.9 mm. Solder wires directly to pads, not tall headers. Secure a maximum 25 × 20 mm perfboard in the front internal bay for the level shifter and passives.

Power and program on the bench

Check for shorts and diode polarity with a multimeter. Connect USB with the plate still accessible. Install CircuitPython and the included files. Test every switch, both wide-key halves, joystick axes, encoder/button, touch and every RGBW pixel. LEDs remain brightness-limited to 15%.

Close and fit the foot

Allow service slack without trapping wires under baffles, switches or posts. Fasten the plate with four M3 × 8 screws. Optionally tape four 24 mm OD, ≤2 mm-thick steel washers into the foot pockets. Attach the foot with two low-profile M3 × 8 screws and add adhesive rubber at the perimeter. Fit keycaps last.

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.

06 / software and light behavior

Colors must follow real task state.

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.

07 / verification and remaining decisions

What has been checked.

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.