No description
  • Rust 64.7%
  • Python 26.1%
  • C 3.9%
  • OpenSCAD 2.2%
  • Nix 1.8%
  • Other 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Daniel Flanagan 0fcd0e2920 docs(carrier): record the third routing pass and what is left
The carrier README gains a third-pass section: what the scripted
fanout, the mux island, the corridor reservation and the length
matching did, the pair table with skew before and after, the
unmatched DSI/CSI inter-lane spread, freerouting's per-pass curve,
the 32 copper DRC errors by cause, the hot spots left and the next
fixes in order. The zone-fill table follows the regenerated
placement. routing-readiness.md and ROADMAP carry the headline
numbers; route.py's docstring lists its stages in their new order.

The D-PHY in-pair skew target is the same 0.05 mm as TI's SuperSpeed
figure because no D-PHY specification number is on file in the
repository; the README says so instead of citing one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TpP3mMquPhtgUE612DFiEx
2026-10-14 17:08:57 -05:00
docs docs(camera): record the lid camera adapter and the second routing pass 2026-10-14 12:32:01 -05:00
firmware feat(compute): add the base IMU with a motion wake to the supervisor 2026-10-13 10:01:06 -05:00
hardware docs(carrier): record the third routing pass and what is left 2026-10-14 17:08:57 -05:00
LICENSES chore(license): label the shell's harvested mecha-wayland crates and Lucide icons 2026-10-02 13:52:56 -05:00
os feat(os/debix): default the DEBIX image to the 2 GiB board 2026-10-13 14:45:12 -05:00
reference/mecha-comet docs: fix the swapped Mecha licence labels and note the MAX17055 EZ range 2026-10-06 20:27:13 -05:00
reports fix(pcb,reports): consistency corrections — mini-PCIe RI is 3.3V, SoCs are USB-2-only 2026-07-13 23:35:42 -05:00
software/pinephone-shell fix(shell): the keyboard's exclusive zone is its height, not height plus margin 2026-08-19 16:59:06 -05:00
tools Merge debix-os 2026-10-11 14:39:48 -05:00
.gitignore feat(pcb/input-board): generate the keypad + trackball input PCB 2026-10-11 21:50:25 -05:00
.pre-commit-config.yaml feat+docs: supervisor v0 LIVE on Pico 2 W; SSH-able-suspend + tethering modes budgeted 2026-07-13 11:38:37 -05:00
AGENTS.md docs(agents): use jj workspaces instead of git for the merge-to-main flow 2026-10-05 10:45:12 -05:00
README.md docs(camera): write up the lid camera design, viewfinder and hinge budget 2026-10-13 16:07:38 -05:00
REUSE.toml feat(pcb/input-board): generate the keypad + trackball input PCB 2026-10-11 21:50:25 -05:00
ROADMAP.md docs(carrier): record the third routing pass and what is left 2026-10-14 17:08:57 -05:00

Cyberdeck: pocket phone-replacement — research synthesis

Date: 2026-07-12 · Status: research phase complete, direction proposed Full evidence: seven citation-heavy research reports in reports/ — this document is the synthesis; every claim here is sourced in a report. Parts: what has been bought is logged in docs/orders.md; the running bill of materials, endgame and each bench generation, is docs/bom.md.

Where it stands (2026-10-06) — this file is the July research record; the living plan is ROADMAP.md. Since July:

  • Compute is the NXP i.MX8M Plus (not the AM62x or i.MX93 below): video needs its GPU and VPU, and the always-on supervisor makes SoC standby power a non-issue (docs/soc-comparison.md). It is a soldered F&S FS 8MP OSM-SF module on our carrier.
  • The supervisor is an nRF52840 (not an RP2040), and the charger a BQ25798 fed by a standalone TPS25751 PD controller on one USB-C port and a Linux-run PTN5110 port controller on the other, the future DisplayPort port (not a BQ25895).
  • The bench phone works: real VoLTE calls and SMS through an EG25-G, with the supervisor waking the suspended host on the modem's ring.
  • Open design findings and their status: docs/review-2026-10-01.md.

TL;DR

  • Nothing off-the-shelf meets the hard requirements. Every shipping Linux keyboard device is a 3–5 h session machine with no working suspend; every multi-day-standby device lacks a keyboard or lacks Linux. (devices report)
  • The architecture that works is proven end-to-end, just never shipped in one box: a tiny always-on supervisor (MCU or on-die coprocessor) owns power/modem-wake/ notifications at milliwatts, while a Linux SoC sleeps in suspend-to-RAM and resumes in ~0.45 s on demand. Snapdragon W5+ ships this two-chip pattern commercially; MNT Pocket Reform, Precursor, and Chromebook ECs prove every layer in the open. (coprocessor report)
  • Voice is solvable but prescriptive: US voice = VoLTE only, carriers gate by IMEI. The way through is a pre-certified cellular module that terminates VoLTE internally (Quectel EG25-G — the PinePhone modem, proven on T-Mobile/MVNOs — or SIMCom A7670-class). Never expect mainline Linux to do IMS; it can't in 2026. T-Mobile (Daniel's current carrier) is the friendliest. Escape hatch: data-only
  • (Superseded 2026-07-21: compute is the i.MX8M Plus; see the box above.) Compute is decided by suspend power, and only two chips clear the bar with headroom: TI AM62x (~1 mW deep sleep, on-die Cortex-M4F always-on domain) and NXP i.MX93 (7.6 mW documented, on-die Cortex-M33). RISC-V, x86, and Raspberry Pi are all eliminated by 5–30×. RK3588-class is the convergence tier (only clean mainline USB-C DP-altmode) but cannot sleep. (soc-landscape, edge-silicon)
  • Recommended path: staged build (proposed phases below), starting with a ~$100 proof of the two riskiest assumptions (VoLTE on our SIM through an EG25-G; SoC deep sleep + modem-ring wake), on a SoM-based carrier board so compute stays upgradeable (Framework-esque).

Product identity (Daniel, 2026-07-13)

A ThinkPad-utility that happens to fit in the pocket: remote terminal, hacker/workbench tool, and communications device. Explicitly NOT an entertainment slab — avoiding the doom-scroll is a feature, not a gap. Design consequences: keyboard-first, open-to-terminal-in-a-second is the hero interaction; the outer strip handles glances so the main screen never becomes a feed; folded-phone mode is occasional utility (QR, maps, a call), not a couch posture, so its 38 mm chunk is acceptable; terminal excellence outranks browser comfort in every tradeoff (RAM, GPU, panel choices).

Requirements & decisions

Hard: physical keyboard · pocket brick (thick OK, no dangly bits) · 1–2 day light-use battery · SIM with calls/SMS/data · notifications · basic GPS · audio media · BT · QR-grade camera · heavy SSH · durable printed shell · encryption at rest · remote nuke · hackable firmware. Secondary, endgame: USB-C video out (DP alt-mode) to dock to a monitor ("convergence"; owner 2026-10-06, below). Nice: touchscreen · GPIO/LoRa/Meshtastic · blob-free.

Decisions captured 2026-07-11/12:

  • Voice: no dogma — "whatever can be made to work"; willing to switch carriers (≤$50/mo, month-long high-quality audio streaming must be viable).
  • Build path: off-the-shelf would be a win if it truly existed (it doesn't — see verdict table); otherwise staged toward custom.
  • Convergence: (updated 2026-10-06, owner's words) "secondary - we want the low power 'glance' display, a 'serious' display, and the ability to connect to a tv or monitor is admitedly secondary, but we definitely want to aim for it in the endgame - usbc video out so the thing can dock to a dock/monitor for 'convergence' is an endgame goal for sure". So USB-C DisplayPort alt-mode docking is an endgame goal, not a rev-1 gate. Route and rev-1 reservations: docs/external-video.md.
  • Budget: ~$2k if it actually comes to life; modular/upgradeable strongly preferred.
  • Battery: chunky is fine — thick pack, possibly multi-cell, silicon-carbon if obtainable.

The physics

The device is screen-off ~95% of the time, so standby draw dominates. Average power allowed for 48 h:

Pack 48 h average budget Notes
20 Wh 417 mW large-phone class (~5,400 mAh @ 3.7 V)
30 Wh 625 mW thick brick, still pocketable
40 Wh 833 mW "chunky is fine" tier; 2× 21700 ≈ 37 Wh already

Realistic daily energy = standby (46 h × standby-mW) + active (~1.5–2 h × 2–4 W). With a sleeping SoC at ≤10 mW + modem idle at ~10–50 mW, even a 20 Wh pack gives multiple days; at i.MX8MP-class ~150 mW suspend a 30–40 Wh pack still clears 2 days. What never clears it: anything that must stay idle-not-suspended (0.4–5 W).

Battery notes: silicon-carbon cells (the 2024–26 phone-density jump) are worth sourcing but availability in maker-friendly pouch formats needs verification — treat as a Phase-2 sourcing task, not a plan dependency. Multi-cell is fine if done as parallel same-model cells behind one proper charger/fuel-gauge (BQ25895 + BQ27427, or AXP2101); the PinePhone keyboard case is the cautionary tale for ad-hoc two-battery charging (see linux-phones report). uConsole's protected-18650 brownouts under LTE TX spikes are the other lesson: budget the modem's burst current.

The four hard walls (and how each is passed)

1. VoLTE + carrier certification

US 2G/3G are gone (T-Mobile's last 2G dies 2026-08-03); voice = VoLTE-over-IMS only, and carriers whitelist by IMEI/TAC. Mainline Linux cannot do IMS (81voltd is a PoC; pmOS was still fixing call audio routing in 2025). Pass: use a standalone module whose own baseband terminates VoLTE and carries a pre-certified IMEI — EG25-G is field-proven on T-Mobile/MVNOs via PinePhone; SIM7670G is on Verizon's approved-module list. Target T-Mobile first; AT&T/Verizon are strict. Fallback: data-only module + number ported to VoIP (JMP.chat-style). Details + citations: mcu-cellular §2/§c, linux-phones lesson 1.

2. Standby power is a software problem

Good silicon numbers ≠ working suspend: MNT Pocket Reform's i.MX8MP suspend is still broken/regressed in mainline; uConsole's CM4 has no true sleep at all. The suspend-to-RAM + wake path must be treated as a first-class engineering deliverable, not an assumed feature. Pass: pick the SoCs whose deep sleep is documented and measured (AM62x ~1 mW, i.MX93 7.6 mW), and prototype modem-RI → supervisor GPIO → PMIC → S2R-resume before designing anything else. Also: disable modem ADB (10→50 mW suspend penalty). Details: soc-landscape §1/§6, coprocessor §3, linux-phones lesson 2.

3. Nothing off-the-shelf does it

See verdict table below. The pragmatic community shortcut (reshell a real phone + keyboard) inherits cellular/battery/encryption for free but fails hackability and the no-Android goals. Details: devices report.

4. The blob ceiling

The baseband cannot be opened — even biktorgj's EG25-G firmware opens only modem userspace (and is minimally maintained since 2024-05). Pass: isolation, not liberation — modem on USB (no DMA), AT/QMI only, hardware kill switch, host-side firewall. SoC blob audit: Allwinner A64 cleanest (but slow), RK3588 cleanest-per-performance (one DDR blob), AM62x carries two TI firmware blobs, i.MX8M's HDMI blob is permanently unreplaceable (avoid HDMI; use MIPI-DSI) — that blob is the i.MX8MQ's (Cadence HDMI); the 8M Plus chosen since uses no HDMI here anyway (2026-10-06 note). Nordic BLE is now fully open. WiFi: only ath9k_htc (USB, 2.4 GHz-n) is source-open; modern WiFi = host-loaded blob, accept it. Details: security report §2/§3/§7.

What survives the filter

Role Primary pick Alternate Rationale
Linux SoC TI AM62x SoM (quad-A53 + M4F AON) NXP i.MX93 SoM (dual-A55 + M33); TI AM62L (2025, <5 mW, no M4F) Only chips with ≤10 mW documented deep sleep; castellated SoMs (Verdin/Variscite/phyCORE) — no BGA. BeaglePlay = test vehicle only, NOT the deck's compute
Modem Quectel EG25-G (mini-PCIe, VoLTE proven on T-Mo, biktorgj fw, PinePhone ecosystem) SIMCom A7670/SIM7670G (Cat-1bis, cheaper, lower idle) Pre-certified IMEI, internal IMS, PCM audio out, RI wake line
Supervisor RP2040 or nRF5340 running Zephyr (or cros-ec/MNT fork) on-die M4F/M33 only (Architecture C) Owns PMIC, keyboard matrix, modem RI, RTC, notification state
Always-on display Sharp Memory LCD strip (~15 µW static) none (blank-when-asleep) Smartwatch trick: time/notifs without waking Linux
Main display DXQ 3.92" AMOLED 1080×1240 @90 Hz, 450 nits, MIPI-DSI touch (piBrick's panel; dark theme = power scales with lit pixels) 4" 720×720 TFT (HackberryPi's) MIPI-DSI avoids the i.MX HDMI blob entirely; ≥450 nits requirement
Keyboard Solder Party KeebDeck family: raw keypad ($1.77, in stock) scanned by our supervisor; assembled KeebDeck Basic when restocked Bench: ZitaoTech P9981 Pro (USB HID + trackpad, in stock); raw BB Q20 flex (22-pin, trackpad) BBQ20KBD is OOS everywhere/retired; KeebDeck = Solder Party's in-house successor, no salvage dependency (see docs/bom.md)
Audio ES8311 codec (+ ES7210 mics) + ESP-SR/soft AEC; modem PCM for calls — AEC is non-negotiable for speakerphone
GPS modem's integrated GNSS first; u-blox MAX-M10S (<25 mW) if standalone ATGM336H (cheap) duty-cycled by supervisor
LoRa SX1262 module (uMesh-style internal bay) — Meshtastic; nice-to-have bay, not core
Security LUKS2 aes-xts (ARMv8 AES) + SE050/ATECC608 two-secret unlock + duress PIN + Ed25519-signed remote nuke over SMS + escrowed header — security report's reference design; avoid CAAM/hw-XTS traps
OS postmarketOS (best FDE story) or mobile-nixos (hand-rolled encrypted image; fits NixOS-everywhere) custom Zephyr on supervisor side regardless supervisor firmware: Zephyr (ZSWatch/InfiniTime patterns to steal)

Reference architectures

From the coprocessor report (full mechanisms + citations there):

  • A — "Supervisor + Suspend" (fast, safe): RP2040-class supervisor + AM62x/i.MX93 in S2R (~1–10 mW) + modem-RI wake. One display; screen blank while asleep. Ships the soonest; this is MNT Pocket Reform tuned for battery.
  • B — "Watch-computer + Deck" (the dream): nRF5340 always-on computer with its own memory-LCD strip owning modem/BLE/notifications/call UI at single-digit mW, plus a gated Linux module for terminal/convergence. Multi-day standby with a live status display. Highest integration cost (two firmware stacks, sync protocol, antenna coex).
  • C — "SoC-with-integrated-SCP" (fewest chips): lean entirely on the AM62x M4F / i.MX93 M33 always-on domain; no external MCU. Least hardware, but bound to that SoC's suspend quality and the on-die core usually can't drive an always-on display.

Proposed trajectory: start C-flavored-A, evolve toward B. Phase 1 validates deep sleep + RI-wake using the on-die core (C); the custom carrier adds an external supervisor + memory-LCD strip (A→B) since we'll want a PMIC/keyboard owner anyway. Convergence: don't chase DP-altmode in v1. (Corrected 2026-10-06: it does not need RK3588-class silicon. A DSI→DP bridge plus a USB-C alt-mode redriver works on the chosen i.MX 8M Plus module, and carrier rev-1 only needs to reserve for it. See docs/external-video.md.) Interim convergence = SSH/waypipe into the deck from any screen, or a DisplayLink dock once USB-C #1 carries USB 3.

Off-the-shelf verdict

Device Ships? Pocket Kbd Cellular 2-day batt Linux Verdict
Mecha Comet Jan'27 earliest (slipped from Oct'26) ✅ 225 g ✅ QMK ✅ M.2+SIM ⚠️ claimed 7-day susp, unproven; their mainline 8MP suspend stalls on wake (Jul'26) ✅ new Reference code, not a platform (docs/path-forward-2026-07-17.md)
Furi FLX1s ✅ $550 ✅ slab ❌ ✅ VoLTE T-Mo, measured 3.9–7.2-day standby, SSH-alive ✅ ✅ Debian/Halium Best reference design; no keyboard
piBrick PocketCM5 ✅ $240 kit ✅ ✅ BBQ20 ❌ ❌ CM5 no suspend ✅ Best form-factor donor/chassis lessons
HackberryPi CM5 ✅ $168 ⚠️ 306 g ✅ ❌ ❌ 3–4 h ✅ Best buy-today kbd brick; wrong compute
uConsole ⚠️ made-to-order ❌ slab ✅ ⚠️ data-only, brownouts ❌ ✅ LTE-bay + swap-cell engineering reference
Unihertz Titan 2 ✅ ~$400 ✅ ✅ ✅ (Android) ✅ ❌ Android/Termux Pragmatic interim daily-driver option
MNT Pocket Reform ✅ €1099 ❌ 1.1 kg ✅✅ ⚠️ M.2 ⚠️ ~7–10 h ✅✅ Gold-standard open supervisor design to copy
Precursor ✅ ~$512 ✅ 96 g ✅ ❌ ✅ 100 h ❌ Xous Trust-anchor companion / security lessons
T-Deck Pro A7682E ✅ $94 ✅ ✅ ✅ 4G voice ✅ e-ink ❌ MCU Scale-model of the right industrial design
Pilet / Liberux NEXX / Planet ❌ — — — — — Avoid (refund campaign / failed funding / scam-adjacent)

Proposed roadmap (~$2k ceiling) — living plan in ROADMAP.md + docs/

Phase 0 — kill the two risks (~$145, weeks): (rewritten 2026-07-12 around Daniel's existing PinePhone — see docs/phase0-runbook.md for the divergent plan)

  1. PinePhone ($0): the VoLTE-vs-2G diagnostic on the actual T-Mobile SIM (before the 2026-08-03 2G sunset), then Branch A (VoLTE works → lock EG25-G, reuse PinePhone as wake-chain testbed) or Branch B (remediation ladder → data-only + VoIP floor). Exact AT recipes in the runbook.
  2. BeaglePlay ($101, AM62x test vehicle — NOT the deck's compute): prove the unpublished trio — 100+-cycle suspend reliability, resume latency, AON-GPIO wake. Fallback: FRDM-IMX93. SoM candidates for the real deck: AM625 / AM62L / i.MX93, chosen at the Phase 1 exit gate.

Phase 1 — ugly-but-working bench prototype (~$300): see docs/phase1-plan.md — BeaglePlay + modem + P9981 Pro keyboard (BBQ20KBD is OOS/retired; KeebDeck Basic restock = the real successor) + RP2040 supervisor (Zephyr; protocol in docs/supervisor-protocol.md) + charger/gauge breakouts + ~10 Ah LiPo pouch (pouch-primary decision — see hardware/dimensions.md). Goal: the five milestones, led by the keystone wake loop. PPK2 purchased only when µA tuning starts.

Phase 2 — carrier PCB + shell (~$400–600): custom carrier for the chosen SoM (this is where "fab a PCB" is justified: PMIC/power domains, modem socket, keyboard matrix (KeebDeck raw pad), codec+AEC, SE050, USB-C, memory-LCD strip, DXQ 3.92" AMOLED). Printed PETG/PA shell around the dummy-brick-validated envelope (slim/mid likely — pouch-primary). One respin budgeted. Power targets + audit protocol: docs/power-budget.md.

Phase 3 — software depth (mostly time): FDE + duress + signed remote-nuke; notification pipeline (supervisor as source of truth, InfiniTime ANS patterns); call UX; GPS; QR camera; Meshtastic bay; power tuning to the 2-day target.

Deferred decisions: interim daily-driver purchase (FLX1s $550 or Titan 2 ~$400 — would consume budget but de-risks the "life happens meanwhile" problem); convergence module; LoRa bay; camera choice.

Open questions

Answered since July are struck through; the live list is in ROADMAP.md.

  1. AM625 vs AM62L vs i.MX93 — i.MX8M Plus (2026-07-21, docs/soc-comparison.md).
  2. Cat-4 EG25-G vs Cat-1bis A7670 — EG25-G: VoLTE confirmed on Daniel's T-Mobile SIM (2026-07-13), and real calls on the bench (2026-10-05).
  3. mobile-nixos vs postmarketOS — neither as the base: a minimal custom NixOS (os/, running on the FRDM bench today), reusing their userland pieces (docs/os-distro.md).
  4. Si-C cell sourcing in pouch form; final pack topology (2P vs single big pouch).
  5. Whether Mecha Comet becomes the chassis — no: build our own, use its open kernel and panel work as reference (docs/path-forward-2026-07-17.md); it now ships no earlier than January 2027.
  6. Camera: cheap DVP/CSI module for QR on the Linux side vs supervisor-side — a USB/UVC module on the hub (2026-10-11), replaced 2026-10-13 by a MIPI CSI-2 photo camera on the lid back that also scans QR codes, with a "camera powered" LED by the lens (docs/photo-camera.md, hardware/pcb/camera/). No camera in folded-360 phone pose.
  7. Display interface — the i.MX8M Plus has native MIPI-DSI, and the 3.92" AMOLED's CH13726A driver chip has a mainline driver (panel-chipwealth-ch13726a.c).

Reports index

Report Scope
devices.md Every pocket Linux/cyberdeck device shipping or announced, with the comparative table
linux-phones.md PinePhone/Librem 5/FLX1s/pmOS; the VoLTE + standby lessons, measured power numbers
soc-landscape.md Compute by suspend power + mainline; the power-budget math; shortlist
edge-silicon.md Mid-2026 bleeding edge: Panther/Wildcat Lake, RK3688, Qualcomm upstream-first, RISC-V reality
mcu-cellular.md MCU-class route, cellular module ecosystem, VoLTE/carrier certification analysis
coprocessor.md Multi-computer architectures, wake/peripheral-sharing mechanisms, reference architectures A/B/C
security.md Modem isolation, blob audit, FDE, secure elements, remote-nuke design, Precursor/Baochip

License

Hardware under CERN-OHL-S-2.0, firmware and software under GPL-3.0-or-later, prose under CC-BY-SA-4.0. Per-file mapping, including vendored third-party files, is in REUSE.toml (reuse lint checks it).