56,966 blogs · [ { "id": "01a087eb-5acc-72e8-abaa-bdbf2569b350", "title": "Using Durable Objects as a WebSocket Session State Machine", "url": "https://termonmac.com/blog/durable-objects-websocket-state-machine/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf256d28c9", "title": "Surviving Cloudflare DO Hibernation Without Dropping WebSocket Connections", "url": "https://termonmac.com/blog/durable-objects-hibernation/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2595f46c", "title": "Per-User Strong Consistency: Subscription State in a Durable Object", "url": "https://termonmac.com/blog/subscription-durable-object/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf26693b0b", "title": "Building a Credit-Based Quota System with 5-Hour Rolling Windows", "url": "https://termonmac.com/blog/credit-quota-rolling-window/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf26d2e0fc", "title": "Enforcing Per-User Room Limits Without a Database", "url": "https://termonmac.com/blog/room-limit-without-database/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf28ed3547", "title": "Forward Secrecy in a Reconnectable Protocol: Two Key Pairs Per Session", "url": "https://termonmac.com/blog/forward-secrecy-ephemeral-keys/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2a575e82", "title": "forkpty() on macOS: The Login Shell Setup", "url": "https://termonmac.com/blog/forkpty-login-shell/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2b302dc4", "title": "SHELL_SESSIONS_DISABLE and Other macOS Shell Environment Setup", "url": "https://termonmac.com/blog/shell-sessions-disable/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2bb13cc7", "title": "Non-Blocking PTY I/O with GCD Dispatch Sources", "url": "https://termonmac.com/blog/nonblocking-pty-dispatch-source/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2c8145be", "title": "PTY Output Buffering: 32KB or 200ms, Whichever Comes First", "url": "https://termonmac.com/blog/pty-output-buffering/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2ccf7926", "title": "RingBuffer for Terminal Replay: Restoring State After Reconnect", "url": "https://termonmac.com/blog/ringbuffer-terminal-replay/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2d048d19", "title": "Integrating SwiftTerm into a SwiftUI App", "url": "https://termonmac.com/blog/swiftterm-ios-integration/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2da686a7", "title": "PTY Resize: Buffer Switch and Reinit Triggers in SwiftTerm", "url": "https://termonmac.com/blog/pty-resize-debounce/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2de06ea3", "title": "Building a Terminal Keyboard Toolbar on iOS", "url": "https://termonmac.com/blog/ios-keyboard-terminal/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2e2f5894", "title": "Preserving Scroll Position While Terminal Output Keeps Arriving", "url": "https://termonmac.com/blog/scroll-position-terminal/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2e817b8c", "title": "Reconnecting Without Hammering the Server: Exponential Backoff with NetworkMonitor", "url": "https://termonmac.com/blog/reconnect-exponential-backoff/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2f6e8190", "title": "Heartbeat Design: Keeping Durable Objects Awake", "url": "https://termonmac.com/blog/heartbeat-design/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2fa859d6", "title": "Batching WebSocket Messages: How relay_batch Reduces Overhead", "url": "https://termonmac.com/blog/relay-batch-coalescing/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf302f9170", "title": "The attach/detach Model: PTY Keeps Running While You're Away", "url": "https://termonmac.com/blog/attach-detach-session-model/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf308df66b", "title": "Session Takeover: When a Second Device Connects to the Same PTY", "url": "https://termonmac.com/blog/session-takeover/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf31788b35", "title": "Unix Domain Socket IPC: How the Mac CLI Talks to the Helper Daemon", "url": "https://termonmac.com/blog/unix-socket-ipc/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf324e9c66", "title": "Multi-Provider OAuth with Account Linking: GitHub, Google, and Apple Sign In", "url": "https://termonmac.com/blog/multi-provider-oauth/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf331f3164", "title": "API Key Lifecycle: 30-Day TTL, Refresh Tokens, and Sliding Expiry", "url": "https://termonmac.com/blog/api-key-lifecycle/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf33378623", "title": "QR Code as a Secure Pairing Mechanism: One-Time Token and TOFU", "url": "https://termonmac.com/blog/qr-code-pairing/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf3349a61b", "title": "Verifying Apple JWS Receipts Without a Third-Party Library", "url": "https://termonmac.com/blog/storekit2-jws-verification/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf3395d607", "title": "Reliable Apple Subscription Notifications with Durable Objects", "url": "https://termonmac.com/blog/apple-subscription-notifications/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf33e5c2a9", "title": "The R-M-W Race in Cloudflare KV: A Quota Bug and How We Fixed It", "url": "https://termonmac.com/blog/kv-rmw-race-condition/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf34850639", "title": "Recurring Architectural Patterns in TermOnMac", "url": "https://termonmac.com/blog/lessons-learned/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf24e866d1", "title": "How TermOnMac Works: A Zero-Knowledge Mac Terminal Relay", "url": "https://termonmac.com/blog/how-termonmac-works/", "published_at": "2026-04-08T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf26d91741", "title": "X25519 Key Exchange Without a Central Key Server: How QR Pairing Works", "url": "https://termonmac.com/blog/x25519-device-pairing/", "published_at": "2026-04-08T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf2787f2cf", "title": "Why We Don't Use Raw ECDH Output: HKDF Session Key Derivation", "url": "https://termonmac.com/blog/hkdf-session-key-derivation/", "published_at": "2026-04-08T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf28109756", "title": "Channel Binding with HMAC: Preventing Relay-Level MITM Attacks", "url": "https://termonmac.com/blog/channel-binding-hmac/", "published_at": "2026-04-08T00:00:00+00:00" }, { "id": "01a087eb-5acc-72e8-abaa-bdbf297cb58d", "title": "Trust On First Use: How TermOnMac Verifies Your Mac's Identity on Reconnect", "url": "https://termonmac.com/blog/tofu-mac-identity/", "published_at": "2026-04-08T00:00:00+00:00" } ] posts Claim your blog
Back to termonmac.com
Blog · corpus.blog/blogs/termonmac.com/posts

termonmac.com

termonmac.com

2026