You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(readme): merge touch-optimized content into the mobile section
- One compact Mobile-Optimized Web UI section: the two current screenshots
(mobile-session-keyboard, mobile-toolbar-enter) side by side, comparison
table, condensed feature bullets, then QR auth
- Drop the outdated black-background phone screenshots
(mobile-landing-qr.png, mobile-session-active.png)
- Same restructure in README.zh-CN.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+15-27Lines changed: 15 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -230,14 +230,12 @@ The most responsive AI coding agent experience on any phone. Full xterm.js termi
230
230
231
231
<table>
232
232
<tr>
233
-
<tdalign="center"width="33%"><imgsrc="docs/screenshots/mobile-landing-qr.png"alt="Mobile — landing page with QR auth"width="260"></td>
234
-
<tdalign="center"width="33%"><imgsrc="docs/screenshots/mobile-session-keyboard-20260727.png"alt="Mobile — answering an agent's plan prompt with the keyboard accessory bar and Enter button"width="260"></td>
235
-
<tdalign="center"width="33%"><imgsrc="docs/screenshots/mobile-session-active.png"alt="Mobile — active agent session"width="260"></td>
233
+
<tdalign="center"width="40%"><imgsrc="docs/screenshots/mobile-session-keyboard-20260727.png"alt="Mobile — answering an agent's plan prompt with the keyboard accessory bar and Enter button"width="300"></td>
234
+
<tdalign="center"width="60%"><imgsrc="docs/screenshots/mobile-toolbar-enter-20260727.png"alt="Mobile toolbar: accessory bar with /init, /clear, clipboard and Esc above the Run, case, stop, Enter, voice and settings controls"width="440"></td>
236
235
</tr>
237
236
<tr>
238
-
<tdalign="center"><em>Landing page with QR auth</em></td>
239
237
<tdalign="center"><em>Answering prompts by touch</em></td>
240
-
<tdalign="center"><em>Agent working in real-time</em></td>
238
+
<tdalign="center"><em>Accessory bar + dedicated Enter button</em></td>
241
239
</tr>
242
240
</table>
243
241
@@ -256,28 +254,10 @@ The most responsive AI coding agent experience on any phone. Full xterm.js termi
256
254
<tr><td>Password typing on phone</td><td><b>QR code scan — instant auth</b></td></tr>
257
255
</table>
258
256
259
-
### Secure QR Code Authentication
260
-
261
-
Typing passwords on a phone keyboard is miserable. Codeman replaces it with **cryptographically secure single-use QR tokens** — scan the code displayed on your desktop and your phone is authenticated instantly.
262
-
263
-
Each QR encodes a URL containing a 6-character short code that maps to a 256-bit secret (`crypto.randomBytes(32)`) on the server. Tokens auto-rotate every **60 seconds**, are **atomically consumed on first scan** (replays always fail), and use **hash-based `Map.get()` lookup** that leaks nothing through response timing. The short code is an opaque pointer — the real secret never appears in browser history, `Referer` headers, or Cloudflare edge logs.
264
-
265
-
The security design addresses all 6 critical QR auth flaws identified in ["Demystifying the (In)Security of QR Code-based Login"](https://www.usenix.org/conference/usenixsecurity25/presentation/zhang-xin) (USENIX Security 2025, which found 47 of the top-100 websites vulnerable): single-use enforcement, short TTL, cryptographic randomness, server-side generation, real-time desktop notification on scan (QRLjacking detection), and IP + User-Agent session binding with manual revocation. Dual-layer rate limiting (per-IP + global) makes brute force infeasible across 62^6 = 56.8 billion possible codes. Full security analysis: [`docs/qr-auth-plan.md`](docs/qr-auth-plan.md)
266
-
267
-
### Touch-Optimized Interface
268
-
269
-
<palign="center">
270
-
<imgsrc="docs/screenshots/mobile-toolbar-enter-20260727.png"alt="Mobile toolbar: accessory bar with /init, /clear, clipboard and Esc above the Run, case, stop, Enter, voice and settings controls"width="560">
271
-
</p>
272
-
273
-
-**Keyboard accessory bar** — `/init`, `/clear`, `/compact` quick-action buttons above the virtual keyboard. Destructive commands (`/clear`, `/compact`) require a double-press to confirm — first tap arms the button, second tap executes — so you never fire one by accident on a bumpy commute
274
-
-**Dedicated Enter button** — submitting is a constant need on a touch keyboard, so the phone toolbar gives it a button of its own. It replays the keypress through the terminal, so text buffered by local echo is flushed first rather than stranded. Starting a shell moves into the Run dropdown (`Terminal / Shell`), which is the rarer action
275
-
-**Swipe navigation** — left/right on the terminal to switch sessions (80px threshold, 300ms)
276
-
-**Smart keyboard handling** — toolbar and terminal shift up when keyboard opens (uses `visualViewport` API with 100px threshold for iOS address bar drift)
277
-
-**Safe area support** — respects iPhone notch and home indicator via `env(safe-area-inset-*)`
278
-
-**44px touch targets** — all buttons meet iOS Human Interface Guidelines minimum sizes
279
-
-**Bottom sheet case picker** — slide-up modal replaces the desktop dropdown
280
-
-**Native momentum scrolling** — `-webkit-overflow-scrolling: touch` for buttery scroll
257
+
-**Keyboard accessory bar** — `/init`, `/clear`, `/compact` quick-action buttons above the virtual keyboard; destructive commands require a double-press to confirm, so you never fire one by accident
258
+
-**Dedicated Enter button** — replays the keypress through the terminal, so text buffered by local echo is flushed first rather than stranded
259
+
-**Swipe navigation & smart keyboard handling** — swipe left/right to switch sessions; toolbar and terminal shift up when the keyboard opens (`visualViewport` API)
260
+
-**Built for phones** — safe-area insets for notch and home indicator, 44px touch targets, bottom-sheet case picker, native momentum scrolling
281
261
282
262
```bash
283
263
codeman web --https
@@ -286,6 +266,14 @@ codeman web --https
286
266
287
267
> `localhost` works over plain HTTP. Use `--https` when accessing from another device, or use [Tailscale](https://tailscale.com/) (recommended) — it provides a private network so you can access `http://<tailscale-ip>:3000` from your phone without TLS certificates.
288
268
269
+
### Secure QR Code Authentication
270
+
271
+
Typing passwords on a phone keyboard is miserable. Codeman replaces it with **cryptographically secure single-use QR tokens** — scan the code displayed on your desktop and your phone is authenticated instantly.
272
+
273
+
Each QR encodes a URL containing a 6-character short code that maps to a 256-bit secret (`crypto.randomBytes(32)`) on the server. Tokens auto-rotate every **60 seconds**, are **atomically consumed on first scan** (replays always fail), and use **hash-based `Map.get()` lookup** that leaks nothing through response timing. The short code is an opaque pointer — the real secret never appears in browser history, `Referer` headers, or Cloudflare edge logs.
274
+
275
+
The security design addresses all 6 critical QR auth flaws identified in ["Demystifying the (In)Security of QR Code-based Login"](https://www.usenix.org/conference/usenixsecurity25/presentation/zhang-xin) (USENIX Security 2025, which found 47 of the top-100 websites vulnerable): single-use enforcement, short TTL, cryptographic randomness, server-side generation, real-time desktop notification on scan (QRLjacking detection), and IP + User-Agent session binding with manual revocation. Dual-layer rate limiting (per-IP + global) makes brute force infeasible across 62^6 = 56.8 billion possible codes. Full security analysis: [`docs/qr-auth-plan.md`](docs/qr-auth-plan.md)
0 commit comments