{"slug": "cordless-v0-8-tab-groups-custom-launchers-bring-your-own-copilot", "title": "cordless v0.8: Tab Groups, Custom Launchers & Bring-Your-Own Copilot", "summary": "Cordless v0.8 introduces tab groups, custom launchers, and a built-in GitHub Copilot CLI profile for managing remote terminal and coding-agent sessions. The update adds named, colored session groups, renameable tabs, and persisted scrollback history that survives daemon restarts. Custom launchers allow users to define any command as a profile, and the new copilot profile includes attention detection for agent sessions.", "body_md": "TL;DR—[cordless]is a CLI-first tool that manages your remote terminal / coding-agent sessions and puts them on your phone.v0.8is aboutorganisingthe swarm:Chrome-mobile-style tab groups,custom launchers(bring any command as a profile), a built-inGitHub Copilot CLIprofile,renameable tabs, andpersisted scrollback historyso a reopened session after a reboot shows what it was doing. There's also a properinstaller. Six features, each on its own branch — designed with`cordless setup`\n\nGPT-5.6 Sol, built withGitHub Copilot CLI.\n\nv0.7 taught cordless to tell me *which* of my eight agent sessions needs me. v0.8 is the next problem: once you're running that many, they stop fitting on the screen. You need to **organise** them — like browser tabs, because that was the whole metaphor from day one. So this release is six features that make a big session swarm manageable.\n\nThe headline. Sessions can now live in **named, colored groups** — think \"API migration\", \"Website\", \"Flaky tests\" — exactly like Chrome mobile's tab groups.\n\nIn the terminal dashboard, groups render as **collapsible headers** with a live per-group waiting/session count:\n\n```\n── Sessions (6) ──\n▼ API migration          2 waiting · 3 sessions\n  ! claude   build pipeline            waiting\n  ● codex    api tests                 working\n  ○ shell    api ~/src/api             idle\n▶ Website                              2 sessions\n▼ Ungrouped                            1 session\n    ○ copilot scratch                  idle\n```\n\nPress `g`\n\nfor the group menu (new / assign / ungroup / collapse / rename / delete), and `f`\n\nto cycle a **smart-view filter** — `All · Attention · Claude · Codex · Copilot · Shell`\n\n. Those filters are *views*, not groups; collapse state is per-device. On the **phone** you get the same idea as a chip strip above the tabs (All · Unread · one chip per group, with counts and color dots) plus rename/move in the details sheet.\n\nThe design decision I kept going back and forth on — and where Sol was firm — was **manual groups over continuous auto-grouping**. Auto-sorting your tabs by directory sounds clever until a session changes cwd and silently jumps groups. So groups are something you *choose*; deleting one never kills its sessions, it just ungroups them.\n\nUntil now cordless had three profiles: `shell`\n\n, `claude`\n\n, `codex`\n\n. v0.8 makes profiles **yours**. Drop this in `~/.cordless/config.json`\n\n:\n\n```\n\"profiles\": {\n  \"api\": { \"command\": \"pwsh\", \"args\": [\"-NoLogo\"], \"cwd\": \"C:/src/api\" },\n  \"notes\": { \"command\": \"nvim\", \"args\": [\"~/notes.md\"] }\n}\n```\n\n…and `cordless new api`\n\nspawns it directly (resolved against the daemon's `PATH`\n\n, not a shell string — no `sh -c`\n\ninjection surface). A missing executable doesn't crash anything; it shows as **unavailable** with a reason, and `cordless profiles`\n\nlists every launcher with its source and availability.\n\nAnd because the agent world moved, v0.8 ships a built-in ** copilot** profile — the standalone\n\n`claude`\n\nand `codex`\n\n. The nice part: attention detection is now `copilot`\n\n(and any custom profile you tag `attentionPreset: \"agent\"`\n\n) gets the same Small feature, big daily quality-of-life. `cordless rename <id> \"API migration\"`\n\n, or the dashboard `e`\n\nkey, or a long-press on the phone. Titles are Unicode-normalized, control-stripped and length-capped, an empty title restores the generated default, and the change **broadcasts live** to every connected client (with a monotonic revision so a stale update can't clobber a newer one).\n\nThis is the one that turned into a proper engineering story. A cordless session already survives a *daemon restart* (it reopens the same shell in the same directory). But it came back **blank** — you lost the scrollback. v0.8 fixes that: the daemon persists a **capped, plain-text** copy of each session's scrollback (2000 lines / 512 KB, gzipped, user-only) and, on restore, shows it as **frozen context above** the reopened session with a `── session reopened after system restart ──`\n\nbanner.\n\nA couple of decisions worth calling out:\n\nHere's the part I'm glad CI caught. My persisted-history tests were **green on Windows** and I shipped v0.8.0. The **Linux and macOS** CLI builds went red on the exact same test.\n\nThe cause is a lovely cross-platform trap. On a graceful stop, the daemon catches `SIGTERM`\n\nand runs `shutdown()`\n\n: it saves each session's history, then kills the PTYs. Killing a PTY fires its exit handler — and *that* handler deleted the just-saved history **and** rewrote the \"reopen these on restart\" manifest without the now-exited session. So on Linux the session came back with no history; on macOS it didn't come back at all.\n\nWhy did Windows pass? Because on Windows `SIGTERM`\n\nfrom another process is an **uncatchable hard-kill** — `shutdown()`\n\nnever runs, the exit handler never fires, and the periodically-flushed history file just… survives. The platform that \"worked\" only worked by accident.\n\nThe fix is a `_shuttingDown`\n\nflag so the exit handler preserves history and the manifest during a graceful stop. What I like about it: I reproduced the Linux-only failure **on Windows** by driving `shutdown()`\n\ndirectly in a unit test (the harness's `SIGTERM`\n\ncan't), so the regression is now locked shut on every platform. Re-tagged, rebuilt, and v0.8.0 went out clean with the full asset set.\n\nSame loop, tightened further: **me on GitHub Copilot CLI, GPT-5.6 Sol as the design partner** — and this time with a rule I'm keeping for good: **every feature on its own branch, merged --no-ff, with clean well-documented code**. The v0.8 program was six branches (\n\n`feature/persisted-history`\n\n, `feature/custom-profiles`\n\n, `feature/copilot-profile`\n\n, `feature/session-rename`\n\n, `feature/session-groups`\n\n, `feature/group-ui-phone`\n\n) plus a `fix/history-shutdown`\n\n. The daemon's test harness grew to The feeling I was chasing: open cordless with a dozen agents running and not feel underwater. The waiting ones surface (v0.7); the rest are **filed into groups** you named, launched from **profiles** you defined, titled how *you* think about them — and if the box reboots overnight, each one comes back **with its history intact**. It's the browser-tabs promise, finally delivered for a swarm of terminals.\n\n`cordless setup`\n\n*Part of the #AI4Good series. Built one day at a time. — @naveenneog*", "url": "https://wpnews.pro/news/cordless-v0-8-tab-groups-custom-launchers-bring-your-own-copilot", "canonical_source": "https://dev.to/naveenneog/cordless-v08-tab-groups-custom-launchers-bring-your-own-copilot-2i0b", "published_at": "2026-07-13 14:51:24+00:00", "updated_at": "2026-07-13 15:18:09.694085+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["cordless", "GitHub Copilot CLI", "Claude", "Codex", "Sol"], "alternates": {"html": "https://wpnews.pro/news/cordless-v0-8-tab-groups-custom-launchers-bring-your-own-copilot", "markdown": "https://wpnews.pro/news/cordless-v0-8-tab-groups-custom-launchers-bring-your-own-copilot.md", "text": "https://wpnews.pro/news/cordless-v0-8-tab-groups-custom-launchers-bring-your-own-copilot.txt", "jsonld": "https://wpnews.pro/news/cordless-v0-8-tab-groups-custom-launchers-bring-your-own-copilot.jsonld"}}