Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
511 commits
Select commit Hold shift + click to select a range
4131e81
Resume hub links and bound hostname handshakes and identity lookup
i2cjak Sep 29, 2026
fc11032
Threads monitor background shells: a turn that ends with a shell, mon…
i2cjak Sep 29, 2026
b9b1e08
Merge pull request #17 from i2cjak/backplane/monitor-bg-shells
i2cjak Sep 29, 2026
bf586dd
Subagents in view: one panel in every client with what each does now …
i2cjak Sep 29, 2026
28a5f06
Keep memo visibility checks outside native frame continuations
i2cjak Sep 29, 2026
85e8186
Merge pull request #18 from i2cjak/backplane/subagent-visibility
i2cjak Sep 29, 2026
9f1f110
Merge branch 'sol/a1' into backplane/remote-thread-performance
i2cjak Sep 29, 2026
f78e20a
Merge sol/a2: publish peer directories independently while retaining …
i2cjak Sep 29, 2026
692c880
Merge sol/a3: keep immediate far bot views and safe cached machine sw…
i2cjak Sep 29, 2026
29dd9ef
Desks: phones hold alerts for a thread the window or a web page is wa…
i2cjak Sep 29, 2026
c1eda52
Complete owner-shared project threads and mirror recovery
i2cjak Sep 29, 2026
ddc386b
Merge pull request #19 from i2cjak/backplane/desktop-notifications-setup
i2cjak Sep 29, 2026
967f513
Adopt arriving bot mirrors and resync on owner discovery
i2cjak Sep 29, 2026
3cfac71
Measure actual bot frames for local, mirrored and directory-only sele…
i2cjak Sep 29, 2026
605e03d
Check bot multipart rejection against the existing 2 MB limit
i2cjak Sep 29, 2026
f9b7bf2
Send discovery head hints outside the item-only push queue
i2cjak Sep 29, 2026
7e4d87a
Design history in the viewer: every agent edit to a board or schemati…
i2cjak Sep 29, 2026
feed28a
Keep phone owner labels after deduplication in Active rows and headers
i2cjak Sep 29, 2026
0baf6df
Pull authoritative history when owner discovery returns a peer
i2cjak Sep 29, 2026
6192fd5
Viewer header: tabs, help and Open in KiCad only where they fit (a na…
i2cjak Sep 29, 2026
636e255
Merge pull request #20 from i2cjak/backplane/steps-playback-animate
i2cjak Sep 29, 2026
5f4d7fb
File links in messages: paths (bare, in backticks, markdown targets) …
i2cjak Sep 29, 2026
1cc18d4
Merge pull request #21 from i2cjak/backplane/clickable-file-links
i2cjak Sep 30, 2026
3dbb3ed
Thread header: icons, clearer labels and groups, one list for every c…
i2cjak Sep 29, 2026
182a735
An agent starting in a KiCad project opens its thread's panel on the …
i2cjak Sep 30, 2026
01d87cb
Merge pull request #23 from i2cjak/backplane/top-bar-redesign
i2cjak Sep 30, 2026
e095591
Android: the tool's icon is read by the tool parser, not the swipe's …
i2cjak Sep 30, 2026
8f0f05f
Merge pull request #24 from i2cjak/backplane/tool-icon-android-fix
i2cjak Sep 30, 2026
0918cc4
Merge remote-tracking branch 'origin/main' into backplane/remote-thre…
i2cjak Sep 30, 2026
6630849
Phones: fast screens, a frame per burst not per token, and state kept…
i2cjak Sep 30, 2026
5860afe
Merge pull request #25 from i2cjak/backplane/cbor-phone-performance
i2cjak Sep 30, 2026
faf8b98
PROOF: restore the proof line the union merge dropped (hubs_origin_ti…
i2cjak Sep 30, 2026
3fd7d16
Merge pull request #26 from i2cjak/backplane/remote-thread-performance
i2cjak Sep 30, 2026
fe12a29
Scratch threads: conversations outside any project, and /give
i2cjak Sep 30, 2026
010565e
Merge pull request #27 from i2cjak/backplane/scratch-conversations
i2cjak Sep 30, 2026
fe4a3fd
One hub per home; the phone survives long messages; todo card shows t…
jlcjak Sep 30, 2026
47850d6
Hub lock matches the running program by name; bridge-native finds the…
jlcjak Sep 30, 2026
a5aec12
smoke: the cleanup waits for a scratch thread's git init
jlcjak Oct 1, 2026
973440e
API keys in Settings, for agents to use without reading them
jlcjak Sep 30, 2026
1b064e2
Merge pull request #28 from i2cjak/backplane/one-hub-per-home
jlcjak Oct 1, 2026
91d0ea6
Merge pull request #29 from i2cjak/backplane/api-keys
jlcjak Oct 1, 2026
e2d4335
Markdown tables, ordered lists, quotes, rules and italics on all four…
i2cjak Oct 1, 2026
bb33044
Merge pull request #31 from i2cjak/backplane/markdown-tables
i2cjak Oct 1, 2026
d3270ed
The viewer button reads Viewer, not Panel
jlcjak Oct 1, 2026
64329cd
Rename any thread, on every client
jlcjak Oct 1, 2026
4292bff
A fork opens and deletes on the web: long texts are labelled without …
jlcjak Oct 1, 2026
715411d
Files in the viewer: browse the project, open boards, models, images …
jlcjak Oct 1, 2026
4f67fe7
The web holds its place while text streams in
jlcjak Oct 1, 2026
c7a3834
Long messages and drafts no longer break the web
jlcjak Oct 1, 2026
d64a1c2
A thread with a long message opens on the phones
jlcjak Oct 1, 2026
1516b34
Android: a board's 3D parts arrive over a slow link
jlcjak Oct 1, 2026
957c723
Phones: the rename dialog shows the title alone
jlcjak Oct 1, 2026
0449e61
Window: images and PDF pages show in the viewer
jlcjak Oct 1, 2026
3eac99a
Merge pull request #32 from i2cjak/backplane/files-rename-fixes
jlcjak Oct 1, 2026
7cd09a1
README: what Backplane is, with screenshots from the web, the phones …
jlcjak Oct 1, 2026
9357dea
A new project opens on a new thread
i2cjak Oct 1, 2026
9edd5a4
Merge pull request #33 from i2cjak/backplane/new-project-thread
i2cjak Oct 1, 2026
c50e41b
iOS: the root view type-checks again
i2cjak Oct 1, 2026
d6d7182
Merge pull request #34 from i2cjak/backplane/ios-views-typecheck
i2cjak Oct 1, 2026
a65d61a
README: mobile up front; the demo board's VBUS cap no longer sits und…
jlcjak Oct 1, 2026
590133d
README: Why as plain reasons, with KiStack and FreeCAD; Mech higher
jlcjak Oct 1, 2026
9efaeaa
README: one hero image, the web's 3D view beside a phone
jlcjak Oct 1, 2026
833bf32
README: the viewers open on a readable schematic sheet
jlcjak Oct 1, 2026
22bc74d
Hub: look messages up only when named, stop at the first hit; replies…
i2cjak Oct 2, 2026
00e07a1
Hub: a retired run ends fully (Stop, archive, delete, crash, failed s…
i2cjak Oct 2, 2026
a447f5e
Hub: Claude lines answer to their process and their turn
i2cjak Oct 2, 2026
ae0c321
Hub: carry a cut-short turn once, and never an archived one
i2cjak Oct 2, 2026
34857a5
Server: the hub never parks on its own inbox
i2cjak Oct 2, 2026
b3456ac
Server: a dead or stalled client cannot hold the hub for long
i2cjak Oct 2, 2026
1a2453c
Client: changes it cannot read still count
i2cjak Oct 2, 2026
a4fe544
retire_e2e: the stand-in writes its last result on SIGTERM
i2cjak Oct 2, 2026
1db4128
Client: a reconnect keeps the person's viewer choices
i2cjak Oct 2, 2026
a277188
Native window: receive through recv_act (outbox resend, desktop notif…
i2cjak Oct 2, 2026
2eaf7c4
Phones: redraw for every paired hub, cheaply
i2cjak Oct 2, 2026
abf6360
stall_e2e: match the wire's turn state and pin id; bound the wait und…
i2cjak Oct 2, 2026
648eb8f
Web: no render or log write for another thread's streamed text
i2cjak Oct 2, 2026
1b50a1e
Far: keep the history epoch, repair lost pushes, stop feed scans early
i2cjak Oct 2, 2026
8961ab7
Client: a reconnect lists each kept folder again; native receive keep…
i2cjak Oct 2, 2026
2b03b1c
Merge pull request #35 from i2cjak/backplane/adversarial-ui-harness-r…
i2cjak Oct 2, 2026
b6f2284
Terminals in the chat: agents hand the person tools they can use
i2cjak Oct 2, 2026
52ec707
Merge pull request #36 from i2cjak/backplane/embed-interactive-terminals
i2cjak Oct 2, 2026
cc1aba1
Web: drag the viewer's edge to resize it
jlcjak Oct 2, 2026
662d0d4
Web: 3D views turn, move and zoom like the phones and the window
jlcjak Oct 2, 2026
c3c2a20
Merge pull request #37 from i2cjak/backplane/web-viewer-resize-orbit
jlcjak Oct 2, 2026
988834d
Subagents: done, the panel folds to one line
jlcjak Oct 2, 2026
b7fa0f2
Claude: own each command by uuid; end turns on lifecycle; show wake t…
i2cjak Oct 2, 2026
452bc72
Work: pending outcomes, background_tasks_changed, WorkSet shared with…
i2cjak Oct 2, 2026
1f32298
Work: one readiness check for alerts, wait, settle, cleanup, island, …
i2cjak Oct 2, 2026
33921f5
Store: one write per step, fail loudly, deliver tasks idempotently, r…
i2cjak Oct 2, 2026
6035b18
Recovery: tell and resume lost work, keep carried children, bounded r…
i2cjak Oct 2, 2026
94fa86a
Agents: spawn generations, generation-bound inputs and MCP, guarded kill
i2cjak Oct 2, 2026
926e36c
Agents: notice exit without EOF, drain once, note long silence
i2cjak Oct 2, 2026
a72eea7
Work: managed work_run/work_watch with retained outcomes, honest canc…
i2cjak Oct 2, 2026
9b7dbf6
Transport: renew a send's deadline on progress; the JS twin parks ins…
i2cjak Oct 2, 2026
1858441
Transport: a failed connection's channel is drained after it is closed
i2cjak Oct 2, 2026
39b7a0a
Transport: credit for every producer, chunked bootstrap, encode once
i2cjak Oct 2, 2026
77c0be5
Live: hub-side partial text, replacement snapshot on join
i2cjak Oct 2, 2026
de80b91
Client: select only the thread this client created
i2cjak Oct 2, 2026
8959a41
README: KiCad-aware agents first among the reasons
jlcjak Oct 2, 2026
0de554b
Sidebar: one derived index per frame; phone alerts by affected thread
i2cjak Oct 2, 2026
dd2abb5
Proof: restore emb_focus_round's body lost in the rebase
i2cjak Oct 2, 2026
0aa4e8a
QR code pairing for the phone apps
i2cjak Oct 2, 2026
79b778f
Merge pull request #38 from i2cjak/backplane/qr-pairing
i2cjak Oct 2, 2026
8345f68
Onboarding: a first-run tour on every client
i2cjak Oct 2, 2026
333165e
Bg: coalesce progress writes; Fr.forget in one pass
i2cjak Oct 2, 2026
e26a71e
Far: retain and retry in-flight batches; new epoch when the log outru…
i2cjak Oct 2, 2026
310bb25
Heartbeat: the hub sends hb every 15 s; a link silent for 40 s is dro…
i2cjak Oct 2, 2026
8f52884
Bots: bots.say, bots.post and bots.tell are idempotent by the client'…
i2cjak Oct 2, 2026
0e39f32
Claude: text blocks of one message on separate lines get ids of their…
i2cjak Oct 2, 2026
662be15
Turn start: a Codex or Grok turn's KiCad files are read in its own jo…
i2cjak Oct 2, 2026
495c5e4
bots_e2e: a repeated bots.say with one msg is stored once; the hub se…
i2cjak Oct 2, 2026
3d19a24
Client: a changes frame with boot:true starts a catch-up, so a live c…
i2cjak Oct 2, 2026
9ec828d
Store: a failed append is closed off with a newline before the next w…
i2cjak Oct 2, 2026
0b41027
Watched work: an archived or deleted thread is not woken by its work'…
i2cjak Oct 2, 2026
73ca8ad
Install: /hello busy follows every committed step; dev.sh checks busy…
i2cjak Oct 2, 2026
58fb528
restart_work_e2e: /hello busy is read once, right after the commit
i2cjak Oct 2, 2026
c74a62b
Watched work: a command or path is stored reversibly, so recovery run…
i2cjak Oct 2, 2026
9cfa435
Watched work scripts: Stop signals only a verified pid or unit invoca…
i2cjak Oct 2, 2026
1c351b4
watch_test: the row's target carries its encoding
i2cjak Oct 2, 2026
fc67a98
Recovery: a deferred 'carry' marker is released only while restart.co…
i2cjak Oct 2, 2026
9f31ec2
Task.repair: the parent's wake is written before TaskDelivered (task_…
i2cjak Oct 2, 2026
0d92b49
Laws: a finished join's live turn end alerts (a live frame, not a boo…
i2cjak Oct 2, 2026
9000efd
Join: a chunk's lines go out in byte-bounded frames; the writer count…
i2cjak Oct 2, 2026
ee399b9
Agents: Codex and Grok processes are watched for exit too; their fina…
i2cjak Oct 2, 2026
10dfe01
Turn start: a Claude process is started by a job (its files and keys …
i2cjak Oct 2, 2026
1852223
Merge branch 'backplane/harness-f1' into backplane/harness-final
i2cjak Oct 2, 2026
c8bde94
Cmds: a legacy Claude's ledger forgets commands once written, so it n…
i2cjak Oct 2, 2026
1d78c58
Merge branch 'backplane/harness-f3' into backplane/harness-final
i2cjak Oct 2, 2026
62550e7
Contain: run each agent in its own memory-limited scope
i2cjak Oct 2, 2026
7d28623
Live: lay out the settled prefix once
i2cjak Oct 2, 2026
2524b78
Proof: restore bots_tell_once's body lost in the merge
i2cjak Oct 2, 2026
2b06c6c
Merge origin/main (QR pairing) into the harness branch
i2cjak Oct 2, 2026
4f1e7cb
Update: check for busy work immediately before the restart, forced up…
i2cjak Oct 2, 2026
b139a4d
Outbox: a writer-split log frame says more:true so bootstrap suppress…
i2cjak Oct 2, 2026
eb2dec6
Contain: systemd-run must not expand $ in an agent's arguments
i2cjak Oct 2, 2026
2ff3c5f
Log: a failed append is cut back to its pre-write length; commits are…
i2cjak Oct 2, 2026
0fa53c8
Contain: read the scope's account of an exit in the reader, off the h…
i2cjak Oct 2, 2026
5c64d5f
Contain: a Codex or Grok out-of-memory end gets the scope's diagnosis…
i2cjak Oct 2, 2026
54b7c29
Contain: retiring an agent stops its whole scope; recovery stops scop…
i2cjak Oct 2, 2026
e7fcd3b
Window: the local hub link takes a log frame's plain header; log-full…
i2cjak Oct 2, 2026
20bc973
Contain e2e: codex and grok stand-ins hog only when running a turn
i2cjak Oct 2, 2026
6c19c59
Merge branch 'backplane/harness-g2' into backplane/harness-final
i2cjak Oct 2, 2026
ff73649
Contain: a hub stops only the leftover scopes it started (each scope …
i2cjak Oct 2, 2026
e01be35
Onboarding: a modal tour, accurate words, a lifecycle that holds
i2cjak Oct 2, 2026
e04e020
Onboarding: held keys stay quarantined, the tour follows the visible …
i2cjak Oct 2, 2026
76a9f86
Contain: own scopes are picked from list-units' description column (a…
i2cjak Oct 2, 2026
dbf9d18
Contain: a recovery stops its leftover scopes in one --no-block call
i2cjak Oct 3, 2026
d46f9e6
Onboarding: keys quarantined by keycode, one presenter rule, the hub'…
i2cjak Oct 3, 2026
c04fe17
iOS: the tour waits until nothing is presented, going away included
i2cjak Oct 3, 2026
4629481
Merge pull request #39 from i2cjak/backplane/agent-onboarding-flow
i2cjak Oct 3, 2026
1c884b8
Merge origin/main (onboarding tour) into the harness branch
i2cjak Oct 3, 2026
5dd1ded
Merge pull request #40 from i2cjak/backplane/harness-final
i2cjak Oct 3, 2026
a2d55d7
macOS builds in releases and nightlies; the hub's shell runs on a Mac
i2cjak Oct 3, 2026
059a155
Merge pull request #41 from i2cjak/backplane/mac-nightly
i2cjak Oct 3, 2026
17f4610
macOS releases: emit on Linux, compile on the Mac
i2cjak Oct 3, 2026
7c07bf3
Merge pull request #42 from i2cjak/backplane/mac-prebuilt
i2cjak Oct 3, 2026
8ca6b81
Phones: uploads that finish, an island that never goes stale, picking…
i2cjak Oct 3, 2026
aa0f306
Merge pull request #44 from i2cjak/backplane/fix-stuck-uploads-dynami…
i2cjak Oct 3, 2026
8f41365
Owner's machines pair themselves over Tailscale and sync in the backg…
i2cjak Oct 4, 2026
7be7774
Pairing guards: a hub without its tailnet pairs only with BACKPLANE_P…
i2cjak Oct 4, 2026
b213efb
Threads on another machine as >machine:slug: the composer offers them…
i2cjak Oct 4, 2026
d992597
docs: pairing, choosing machines, catching up, >machine:slug; the tou…
i2cjak Oct 4, 2026
63c179e
Pairing: a hub compares its loopback address with a hub on this machi…
i2cjak Oct 4, 2026
e140ee2
Far: a pull's answer keeps its page's fields beside the catalog (Fr.l…
i2cjak Oct 4, 2026
0c78d7e
far_e2e: a joining client's catalog is the last pull's
i2cjak Oct 4, 2026
1943ed7
Merge pull request #46 from i2cjak/backplane/device-onboarding-state-…
i2cjak Oct 4, 2026
0eb061f
Phones: sent messages show again, New Thread opens at once, subagents…
i2cjak Oct 5, 2026
a83b067
Merge pull request #48 from i2cjak/backplane/ios-sent-messages-threads
i2cjak Oct 5, 2026
3170b4b
A thread whose subagents wrote long steps opens on the web and phones
jlcjak Oct 4, 2026
f6596cb
Web: frames decoded in JavaScript, not in Bend
jlcjak Oct 4, 2026
ddc8074
Hub: a join's chunks encoded and sent in C
jlcjak Oct 5, 2026
6fea08b
The tour waits for a long log's last chunk
jlcjak Oct 5, 2026
3802ac9
Long threads: todos and subagents fold and scroll; the web keeps its …
jlcjak Oct 5, 2026
1a86044
Hub: a join's frames split and joined in C, and its log measured once…
jlcjak Oct 5, 2026
14f09cd
A thread with thousands of entries opens on the web again
jlcjak Oct 5, 2026
ff1a056
Scrolling up never stalls on a page of entries the timeline does not …
jlcjak Oct 5, 2026
28686fc
Phones: a thread whose tool calls wrote long summaries opens
jlcjak Oct 5, 2026
e3f2f25
Test: the todo card's fold and show-all, and the window's panes by th…
jlcjak Oct 5, 2026
8b61da5
Phones: a hub not heard for three hours leaves the island
i2cjak Oct 6, 2026
c338daa
iOS: a Live Activity per hub, ended at once
i2cjak Oct 6, 2026
3be9c80
Agents across machines: fmcp.bend (mcp.call routed hub to hub over /f…
i2cjak Oct 6, 2026
1b6a1cc
Agents across machines: machine_list, tool text, prompt
i2cjak Oct 6, 2026
f4bd465
Create anywhere: route thread create/fork/pin/archive/delete and proj…
i2cjak Oct 6, 2026
b23441c
Far give: /give >machine:slug and %machine:project over the signed route
i2cjak Oct 6, 2026
29cacc4
far_test: create anywhere routing, allowed, adoption, picker machine
i2cjak Oct 6, 2026
57cddc4
Far live text: ephemeral delta channel hub to hub (core/farlive.bend)…
i2cjak Oct 6, 2026
77e6fd4
Viewers elsewhere: core/fview.bend (read-only ops, safe paths, cache …
i2cjak Oct 6, 2026
15c7bfe
Laws fmc_*: routing, trust, ids
i2cjak Oct 6, 2026
e23ec79
fmcp unit test
i2cjak Oct 6, 2026
c7e0c68
Far live: client clears live text on far end, laws flive_*
i2cjak Oct 6, 2026
4f91e75
Laws for create anywhere; delete stays refused (far_no_delete)
i2cjak Oct 6, 2026
74ff806
Agents across machines: e2e, docs
i2cjak Oct 6, 2026
3208c23
e2e: wait for the rename's mirror
i2cjak Oct 6, 2026
2f2932e
create_far_e2e, docs
i2cjak Oct 6, 2026
da79383
Far: alerts keyed by the owner's key, island lists a far thread once,…
i2cjak Oct 6, 2026
981f329
farview.bend: owner list/get and near-hub sync into the cache; Bn.to_…
i2cjak Oct 6, 2026
142186e
server: owner answers viewer reads, near hub syncs far.view and mech.…
i2cjak Oct 6, 2026
742261c
client: far.view sync state (Fv.*), view gate, root = cache for threa…
i2cjak Oct 6, 2026
2147bd3
viewer_show on a thread elsewhere: owner tells its machines (view.sho…
i2cjak Oct 6, 2026
fd61b6d
fview_test
i2cjak Oct 6, 2026
a1b03a9
docs: viewers elsewhere; e2e test; DirJob stays inside the folder
i2cjak Oct 6, 2026
a073071
create_far_e2e: ports from a base
i2cjak Oct 6, 2026
91cb2d1
Merge pull request #51 from i2cjak/backplane/island-unheard-hubs
i2cjak Oct 6, 2026
9814dd8
Far sync: tail-recursive join chunking (was O(N) stack per chunk), be…
i2cjak Oct 6, 2026
35df65f
docs: far live text
i2cjak Oct 6, 2026
341dde8
viewers_far_e2e: the listing brings every KiCad file
i2cjak Oct 6, 2026
1ff6ccf
Far synthesis (A review): route from parsed params, per-request nonce…
i2cjak Oct 6, 2026
a643f2f
Merge p2p/d (viewers elsewhere) into the synthesis; near view sync on…
i2cjak Oct 6, 2026
ef83f83
Far viewers (D review): no hidden folder through a symlink, ns change…
i2cjak Oct 6, 2026
612f153
agents_far_e2e: distinct second for each hub's ids, project listing c…
i2cjak Oct 6, 2026
b1bfae5
Merge p2p/b (agents across machines); agents' far calls carry a nonce…
i2cjak Oct 6, 2026
557efab
Rview: a window on another hub reads copies of its files (pure defs, …
i2cjak Oct 6, 2026
995c19a
Rview: hub /view/ver, /view/get, /view/git for clients; the window fo…
i2cjak Oct 6, 2026
094a5e8
Rview laws and proofs, e2e test
i2cjak Oct 6, 2026
1be390f
Docs and native sync test for the window on another hub
i2cjak Oct 6, 2026
644a01d
Agents across machines (B review): senders named right on the way bac…
i2cjak Oct 6, 2026
18fbf56
e2e: the window's fetching code against a hub
i2cjak Oct 6, 2026
81d0017
Merge p2p/c (live far turns, alerts once across hubs)
i2cjak Oct 6, 2026
6f2b99a
Live far text (C review): streams ordered by the owner's log (an end …
i2cjak Oct 6, 2026
2fe3f8d
Rview: a mirrored thread's folder is the cache the client names (far.…
i2cjak Oct 6, 2026
796780c
Merge origin/main into the P2P synthesis
i2cjak Oct 6, 2026
31313a8
Phones: Google sign-in through the app's own loopback listener, any n…
i2cjak Oct 6, 2026
b544058
e2e: /give elsewhere is a queued handoff; owner folders browsed by it…
i2cjak Oct 6, 2026
9acb1b7
P2P (second review): escaped requests parsed before routing, queued a…
i2cjak Oct 6, 2026
2a4161f
Merge p2p/e (the window on another machine's hub reads copies of its …
i2cjak Oct 6, 2026
aad2d03
Merge pull request #52 from i2cjak/backplane/google-login-multi-account
i2cjak Oct 6, 2026
8e3f827
Window on another hub (E review): versions read only from the thread'…
i2cjak Oct 6, 2026
7c9c647
Merge remote-tracking branch 'origin/main' into backplane/p2p-agent-b…
i2cjak Oct 6, 2026
64e09da
Merge pull request #53 from i2cjak/backplane/p2p-agent-backplane
i2cjak Oct 6, 2026
92aa704
Pairing off the tailnet: a hub names the address its machines list fo…
i2cjak Oct 6, 2026
28d9754
Merge pull request #54 from i2cjak/backplane/pair-self-url
i2cjak Oct 6, 2026
e0783d5
Merge remote-tracking branch 'bp/main' into backplane/long-threads
jlcjak Oct 7, 2026
844cb05
Merge pull request #55 from i2cjak/backplane/long-threads
jlcjak Oct 7, 2026
4d7c45a
Layers: KiCad's order and names, and its high contrast, in core
jlcjak Oct 7, 2026
e804d3a
Web: the Layers menu in KiCad's order, a layer to single out, All/Dim…
jlcjak Oct 7, 2026
b4ba290
Window: layers in KiCad's order, a click singles one out, ctrl+H as i…
jlcjak Oct 7, 2026
45488d5
Phones: layers in KiCad's order, a layer to single out, All/Dim/Only
jlcjak Oct 7, 2026
8dac8dc
Window: the focus applies in Look.at, Look.on is as it was
jlcjak Oct 7, 2026
c1d83f4
Merge pull request #56 from i2cjak/backplane/board-layers
jlcjak Oct 7, 2026
ed036e6
Merged threads settle when the agent pushed from a branch of another …
i2cjak Sep 30, 2026
92e4857
iOS Live Activity fits: the first three threads listed (Notice.island…
i2cjak Oct 11, 2026
dd17559
Remove systemd from Backplane: agents and work_run jobs run as plain …
i2cjak Oct 11, 2026
7b4b497
Merge pull request #22 from i2cjak/backplane/settle-on-merge-by-commit
i2cjak Oct 11, 2026
b07ac05
Merge pull request #58 from i2cjak/backplane/island-fit
i2cjak Oct 11, 2026
05acba3
Merge remote-tracking branch 'origin/main' into HEAD
i2cjak Oct 11, 2026
b3629a6
Merge pull request #60 from i2cjak/backplane/no-systemd
i2cjak Oct 11, 2026
e92dc15
Hold the cats still while the person types or scrolls
i2cjak Oct 12, 2026
12352ab
Merge pull request #61 from i2cjak/backplane/cats-calm
i2cjak Oct 12, 2026
ff5b177
Web board viewer: pan and zoom from a bitmap of the layers
shanedertrain Oct 12, 2026
07d06e6
Web board viewer: a fit is drawn at once
shanedertrain Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
108 changes: 103 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ jobs:
include:
- { target: linux-x64, os: ubuntu-24.04 }
- { target: linux-arm64, os: ubuntu-24.04-arm }
# macOS is on hold; scripts/build.sh builds it as hub + web server
# - { target: darwin-arm64, os: macos-15 }
# darwin-arm64 is the two jobs below
runs-on: ${{ matrix.os }}
env:
TAG: ${{ inputs.tag || github.ref_name }}
Expand Down Expand Up @@ -77,16 +76,102 @@ jobs:
sudo apt-get install -y clang-19 libx11-dev
sudo ln -sf /usr/bin/clang-19 /usr/local/bin/clang
- run: BACKPLANE_VERSION="$TAG" scripts/build.sh
env:
# the Google client "Connect Google" signs in with (scripts/build-app.sh)
BACKPLANE_GOOGLE_CLIENT_ID: ${{ secrets.BACKPLANE_GOOGLE_CLIENT_ID }}
BACKPLANE_GOOGLE_CLIENT_SECRET: ${{ secrets.BACKPLANE_GOOGLE_CLIENT_SECRET }}
- run: scripts/smoke.sh
- run: scripts/package.sh "$TAG" "${{ matrix.target }}"
- run: scripts/package-linux.sh "$TAG" "${{ matrix.target }}"
- uses: actions/upload-artifact@v4
with:
name: backplane-${{ matrix.target }}
path: |
dist/backplane-*.tar.gz
dist/backplane-*.AppImage
dist/backplane_*.deb

# macOS: the hub and web UI as `backplane` (no X11, so no window). bend's
# emit of the server takes over 8 GB, which a macOS runner (7 GB) spends
# hours swapping through, and its C is the same on every platform: a
# Linux runner emits it with the web client, the Mac compiles it.
emit-darwin:
name: Emit darwin-arm64
needs: [laws]
runs-on: ubuntu-24.04
env:
TAG: ${{ inputs.tag || github.ref_name }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.tag || github.ref }}
- uses: ./.github/actions/setup-bend
- run: BACKPLANE_VERSION="$TAG" scripts/build.sh emit
- uses: actions/upload-artifact@v4
with:
name: darwin-arm64-emitted
retention-days: 1
path: |
dist/web
build/cc/backplane-serve/all.c
build/wire

build-darwin:
name: Build darwin-arm64
needs: [emit-darwin]
runs-on: macos-15
env:
TAG: ${{ inputs.tag || github.ref_name }}
BACKPLANE_PREBUILT: "1"
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.tag || github.ref }}
- uses: ./.github/actions/setup-bend
- uses: oven-sh/setup-bun@v2
- uses: actions/download-artifact@v4
with:
name: darwin-arm64-emitted
path: .
- run: clang --version
- run: BACKPLANE_VERSION="$TAG" scripts/build.sh
env:
BACKPLANE_GOOGLE_CLIENT_ID: ${{ secrets.BACKPLANE_GOOGLE_CLIENT_ID }}
BACKPLANE_GOOGLE_CLIENT_SECRET: ${{ secrets.BACKPLANE_GOOGLE_CLIENT_SECRET }}
- run: scripts/smoke.sh
- run: scripts/package.sh "$TAG" darwin-arm64
- uses: actions/upload-artifact@v4
with:
name: backplane-darwin-arm64
path: dist/backplane-*.tar.gz

android:
name: Build Android
needs: [laws]
runs-on: ubuntu-24.04
env:
TAG: ${{ inputs.tag || github.ref_name }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.tag || github.ref }}
- uses: ./.github/actions/setup-bend
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
# the runner's Android SDK ($ANDROID_HOME); signed with the debug key
# until a release key exists (mobile/android/app/build.gradle.kts)
- run: scripts/build-mobile.sh
- run: mv dist/backplane-android.apk "dist/backplane-$TAG-android.apk"
- uses: actions/upload-artifact@v4
with:
name: backplane-android
path: dist/backplane-*-android.apk

publish:
name: Publish
needs: [build]
needs: [build, build-darwin, android]
runs-on: ubuntu-24.04
env:
TAG: ${{ inputs.tag || github.ref_name }}
Expand All @@ -98,12 +183,13 @@ jobs:
- uses: actions/download-artifact@v4
with:
path: out
pattern: backplane-*
merge-multiple: true
- name: Checksums and installer
run: |
set -eu
cd out
sha256sum backplane-*.tar.gz > SHA256SUMS
sha256sum backplane-*.tar.gz backplane-*.AppImage backplane_*.deb backplane-*.apk > SHA256SUMS
cat SHA256SUMS
sum() { grep "backplane-$TAG-$1.tar.gz" SHA256SUMS | cut -d' ' -f1; }
sed -e "s/@VERSION@/$TAG/" \
Expand All @@ -112,12 +198,24 @@ jobs:
-e "s/@SHA_DARWIN_ARM64@/$(sum darwin-arm64)/" \
../deploy/install.sh.in > install.sh
chmod +x install.sh
# the AUR's PKGBUILD follows full releases only
case "$TAG" in
*-*) ;;
*) sed -e "s/@PKGVER@/${TAG#v}/" \
-e "s/@SHA_LINUX_X64@/$(sum linux-x64)/" \
-e "s/@SHA_LINUX_ARM64@/$(sum linux-arm64)/" \
../deploy/aur/PKGBUILD.in > PKGBUILD ;;
esac
- name: Release
run: |
set -eu
pre=""
case "$TAG" in *-*) pre="--prerelease" ;; esac
notes="Install: curl -fsSL https://github.com/${{ github.repository }}/releases/latest/download/install.sh | sh"
# each release's installer installs that release (latest/ never
# names a prerelease, so a nightly's must be its own)
notes="Linux (x64, arm64) and macOS (Apple silicon; the hub and web UI at http://127.0.0.1:3787, no native window yet).

Install: \`curl -fsSL https://github.com/${{ github.repository }}/releases/download/$TAG/install.sh | sh\`"
if gh release view "$TAG" >/dev/null 2>&1; then
gh release upload "$TAG" out/* --clobber
else
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ build/
.DS_Store
.claude/
node_modules/
.env
Loading