Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
299 commits
Select commit Hold shift + click to select a range
06d107f
docs: M7 TODO — clarify §10d is a shared event bus, not a shared FS o…
pgodwin Jun 13, 2026
2d93078
docs: design — NetBIOS browser as a datagram-layer service common to …
pgodwin Jun 13, 2026
1828ed4
docs: design — server identity (hostname/workgroup) is one top-level …
pgodwin Jun 13, 2026
49fe37a
docs: design — §4-bis hostname is a server property, not NetBIOS-owne…
pgodwin Jun 13, 2026
835213a
docs: design — SMB session transports are two families (NetBIOS-based…
pgodwin Jun 13, 2026
2189ba9
refactor: M7e SMB direct-hosted over IPX (socket 0x0550) over the Ses…
pgodwin Jun 14, 2026
4bd6534
docs: CLAUDE.md rule #10 — use DTOs for protocol-level representations
pgodwin Jun 14, 2026
4d118d5
refactor: M7d NetBIOS browser service — datagram-layer, common to all…
pgodwin Jun 14, 2026
1b3c684
refactor: M7d-b SMB IPC$ NetServerEnum2 — serve the browse list over …
pgodwin Jun 14, 2026
6790977
refactor: M7d-c SMB IPC$ NetShareEnum — serve the share list over \PI…
pgodwin Jun 14, 2026
e1aa881
refactor: M7d-d NBIPX datagram-egress — browser broadcasts over IPX too
pgodwin Jun 14, 2026
7e2908d
docs: design — mailslot is its own seam (§3-quater), browser handles …
pgodwin Jun 14, 2026
d839a89
refactor: M7f mailslot seam — browser sits on NetBIOS via a shared ma…
pgodwin Jun 14, 2026
5b58075
refactor: M7g messenger service — net send over the mailslot seam
pgodwin Jun 14, 2026
748dab0
refactor: M8a auth seam — user store + login-gated share access
pgodwin Jun 15, 2026
590c29e
refactor: M8 config-codec round-trips — real sections + UCI empty-val…
pgodwin Jun 15, 2026
1a58ee7
refactor: M8 bus log sink — the "log" telemetry-topic source
pgodwin Jun 15, 2026
1ced79a
refactor: M8a AFP volume config sections — repeated named sections + …
pgodwin Jun 15, 2026
ac5395d
refactor: M8a SMB share config sections — the SMB-side config→ShareSp…
pgodwin Jun 15, 2026
5db0e62
refactor: M8a supervisor share hot-apply — ApplyConfig reconciles the…
pgodwin Jun 15, 2026
26acc0c
refactor: M8a server identity (§4-bis) — one config.Identity, with de…
pgodwin Jun 15, 2026
851dd34
refactor: M8a §10d AFP+SMB FS-bus coordination (seam; wire push defer…
pgodwin Jun 15, 2026
13d2fb4
refactor: M8a §10d wire push — SMB NT_TRANSACT NOTIFY_CHANGE (AFP exc…
pgodwin Jun 15, 2026
5985386
refactor: M8a §10e host-watcher — fsnotify inbound edge of the FS bus
pgodwin Jun 15, 2026
aedc074
refactor: M8a Model.Validate() Apply hook — closes the §4-bis validat…
pgodwin Jun 15, 2026
5d4f6bc
refactor: M8 control front-ends catch-up — full Plane surface over ht…
pgodwin Jun 15, 2026
11d4fc9
refactor: M8a secret-param masking — redact fs-backend secrets on the…
pgodwin Jun 15, 2026
4acc3e9
refactor: M8 web-admin Basic auth + first-run setup for the HTTP cont…
pgodwin Jun 16, 2026
dcfc816
docs: design — cross-reference web-admin Basic auth (§4-ter) from the…
pgodwin Jun 16, 2026
e898006
refactor: M7a prereq — transport-agnostic AFP command-core seam
pgodwin Jun 16, 2026
51d8282
docs: refactor TODO — add M-ng minimal testable classicstack-ng target
pgodwin Jun 16, 2026
d9ccd0a
docs: refactor TODO — resolve M8<->M10 deadlock, fix execution order
pgodwin Jun 16, 2026
3cf6b39
refactor: M9/M10 prereq — compose runtime root
pgodwin Jun 16, 2026
3c2f026
refactor: M10 slice A — factory BuildContext + router cross-wiring
pgodwin Jun 16, 2026
32d7db2
refactor: M10 slice B — port config schema + pcap device-link injecti…
pgodwin Jun 16, 2026
9e539a4
refactor: M10 slice B — resolve port interface through the shared Bri…
pgodwin Jun 16, 2026
761c8c1
refactor: M10 slice B — LLAP framer (LocalTalk LLAP<->DDP), router ow…
pgodwin Jun 16, 2026
a708e67
refactor: M10 slice B — LToUDP FrameLink adapter brings LocalTalk live
pgodwin Jun 16, 2026
fb093bf
refactor: M10 slice B — TashTalk serial FrameLink completes LocalTalk
pgodwin Jun 16, 2026
6699e9e
refactor: M10 slice B — LToUDP and TashTalk are two distinct segments
pgodwin Jun 16, 2026
363c377
docs: design — named port instances over an interface namespace
pgodwin Jun 16, 2026
03dd3c4
docs: design — explicit AppleTalk router membership by instance name
pgodwin Jun 16, 2026
3f9fad8
docs: thread named-ports/interface-namespace design through DESIGN/PH…
pgodwin Jun 16, 2026
b627954
refactor: M11.1 — named interface namespace in the config model
pgodwin Jun 16, 2026
bb0cee8
refactor: M11.2 — codec round-trip for the interface namespace
pgodwin Jun 16, 2026
dbae340
refactor: M11.b — ports become named repeated instances (one factory …
pgodwin Jun 16, 2026
2d534c8
refactor: M11.d — explicit router membership via [Router].members (§3…
pgodwin Jun 17, 2026
f07e209
refactor: M11.c — opener dispatch by interface kind + shared adapter/…
pgodwin Jun 17, 2026
b6ae33b
refactor: M11.e — IPX/NetBEUI device-link injection (M11 closeout)
pgodwin Jun 17, 2026
a2adf9b
refactor: M-ng2 NetBIOS-transport cross-wire — IPX/NetBEUI mini-route…
pgodwin Jun 18, 2026
e32d805
refactor: M-ng2 datagram layer — register browser/messenger, cross-wi…
pgodwin Jun 18, 2026
c2b2e67
refactor: M-ng2 SMB direct-hosted-over-IPX — wire 0x0550 without NetBIOS
pgodwin Jun 18, 2026
b9b7a89
refactor: M-ng3 end-to-end integration tests over inmem links
pgodwin Jun 18, 2026
ba71a69
refactor: M8a browse-list provider wiring — browser → SMB BrowseProvider
pgodwin Jun 18, 2026
e217ab3
refactor: T1 client tools — cmd/csecho + cmd/csnetsend (protocol-reus…
pgodwin Jun 18, 2026
e6bcd8d
refactor: M10 ng control plane — wire the HTTP web-admin API into cla…
pgodwin Jun 18, 2026
21f8d1b
refactor: M9 repoint binaries at the new-ring run-core (cmd/internal/…
pgodwin Jun 18, 2026
511299a
refactor: M10 cutover — delete the legacy runtime tree; ship the new …
pgodwin Jun 18, 2026
fce7f5d
refactor: M8-spa contract — fs.Types + Plane.ParamsFor across the con…
pgodwin Jun 18, 2026
a560a06
refactor: M8-spa — new-ring web-admin SPA over the HTTP control adapter
pgodwin Jun 18, 2026
3935140
refactor: delete cmd/pcapdiff + the legacy protocol/ + pkg/binutil leaf
pgodwin Jun 18, 2026
b6df47b
feat: csnbp + csgetzones — netatalk nbplkup/getzones equivalents
pgodwin Jun 18, 2026
fcaf3d1
feat: csipxping (IPX ping) + csnetview (enhanced net view) + IPX diag…
pgodwin Jun 18, 2026
14d3cbc
feat: AppleTalk client utilities gain a -transport selector (ltoudp/t…
pgodwin Jun 19, 2026
d5e4938
docs/feat: refresh server.toml.example + OpenWRT UCI package artifacts
pgodwin Jun 19, 2026
28bf665
feat(webui+backend): restore web-admin functionality — DDP services, …
pgodwin Jun 20, 2026
5b8020d
feat(control): extmap + config-download surface, NIC/serial/path pickers
pgodwin Jun 20, 2026
8dbc653
feat(webui): SPA editors — volumes/shares CRUD, path picker, extmap g…
pgodwin Jun 20, 2026
d59b049
feat(web-admin+macip): restore post-M10 management surface + full Mac…
pgodwin Jun 22, 2026
6e62619
feat: Novell NCP file service (NetWare 3.x) over IPX + OS/2/Mac name …
pgodwin Jun 23, 2026
830c464
feat(etherdfs+storage): EtherDFS server + per-share DOS attributes & …
pgodwin Jun 23, 2026
2723e04
feat(macgarden): port the read-only MacGarden virtual filesystem to t…
pgodwin Jun 23, 2026
e5857af
feat(fs): real per-OS local_fs DiskUsage with per-protocol byte caps
pgodwin Jun 24, 2026
c5a91f3
fix(core): restore archtest green — drop x/sys/windows + fmt from cor…
pgodwin Jun 24, 2026
e3785d2
feat(zipfs): read-write .zip filesystem backend (streaming, no full-a…
pgodwin Jun 24, 2026
d458d90
feat(fs): add optional FSCloser teardown seam; close backends at serv…
pgodwin Jun 24, 2026
92e09a7
refactor(fs): decentralize share validation + fold read-only into the…
pgodwin Jun 25, 2026
4f88557
refactor(fs): fork-adapter registry + mandatory nofork (phase 1)
pgodwin Jun 25, 2026
15deadb
refactor(fs): per-layout appledouble adapters over a shared base (pha…
pgodwin Jun 25, 2026
8ee0e7f
feat(fs): ForkContainers capability + §10d rename/shortname coordinat…
pgodwin Jun 25, 2026
2082e6e
ci: bump TinyGo to 0.41.0 in the refactor-harness gate
pgodwin Jun 25, 2026
de3ca01
feat(fs): applesingle + macbinary single-container forks, native host…
pgodwin Jun 25, 2026
f473003
test(fs): assert FinderInfo is closest to the header in AppleSingle l…
pgodwin Jun 25, 2026
6fbe83e
feat(fs): derez fork backend (rdump/idump text sidecars) + upstream c…
pgodwin Jun 25, 2026
d7cdbd4
refactor: close composition-root leaks via per-component capabilities
pgodwin Jun 26, 2026
8888388
feat(aarp): pure AARP packet codec + AMT + proxy primitive (stage 1)
pgodwin Jun 26, 2026
dc6e19f
feat(aarp): pure claim + resolution + inbound engine (stage 2)
pgodwin Jun 26, 2026
79fef63
feat(aarp): AARP-aware EtherTalk framer — live node-claim + unicast r…
pgodwin Jun 26, 2026
60fef8b
Add embedded hardware support for WT32-ETH01 and Raspberry Pi Pico fa…
pgodwin Jun 29, 2026
f516a50
feat(aarp): diagnostic to print the AARP table (web/ubus drill-down)
pgodwin Jun 30, 2026
e195251
feat(llap): LocalTalk LLAP ENQ/ACK node-claim (the AARP analogue)
pgodwin Jul 1, 2026
9d8af62
feat(aarp): proxy-AARP Wi-Fi/tunnel bridge — two-FrameLink forwarder …
pgodwin Jul 1, 2026
1b423f8
fix(afp): repair AFP wire regressions + EtherTalk RX filter from the …
pgodwin Jul 2, 2026
c5f75fd
fix(afp): FPEnumerate must honour maxReplySize; hide Netatalk metadata
pgodwin Jul 2, 2026
11ef295
fix(afp): root directory reports the configured volume name
pgodwin Jul 2, 2026
c7a8bdd
fix(afp): release the two-phase-write XO transaction with a TRel
pgodwin Jul 2, 2026
ce05486
fix(afp): restore ASP session-lifecycle semantics lost in the M7 rewrite
pgodwin Jul 2, 2026
8c87e89
fix(afp): restore fork-command numbers + port remaining catalog comma…
pgodwin Jul 3, 2026
fb8b4c3
fix(aarp): ignore this station's own reflected transmissions
pgodwin Jul 3, 2026
eb9c051
docs: add GitHub Copilot instructions
pgodwin Jul 3, 2026
1dbf6ff
feat(control): add host-info endpoint exposing board/build/system met…
pgodwin Jul 3, 2026
426acd8
feat(hardware): report board/build identity from the embedded targets
pgodwin Jul 3, 2026
6bea3ca
feat(webui): host-info panel and model-aware port/interface editors
pgodwin Jul 3, 2026
6f16f92
fix(chooser): make a self-contained seed router advertise its zone + …
pgodwin Jul 3, 2026
f67f405
refactor(config): collapse Bridge into the interface namespace; make …
pgodwin Jul 3, 2026
ee6e566
style: gofmt host-info and control-adapter files
pgodwin Jul 3, 2026
70de017
fix(smb,netbeui): port dropped handlers and wiring lost in the refactor
pgodwin Jul 6, 2026
d7053b2
feat(netbios,ipx): harden NBF & IPX transports; verified against real…
pgodwin Jul 9, 2026
21b2df2
fix(smb,netbios): NT 3.51 / OS/2 / Win98 interop across NetBEUI and IPX
pgodwin Jul 10, 2026
e8ee440
feat(ncp): NetWare client attach end-to-end — discovery, bindery, dir…
pgodwin Jul 12, 2026
27d435e
feat(etherdfs,fs): finish EtherDFS server support; add cross-platform…
pgodwin Jul 13, 2026
a987cbd
feat(smb,fs,netbios): comprehensive SMB/transport/metadata refactor
pgodwin Jul 15, 2026
a1ef09b
feat(netboot): ABP (AppleTalk Boot Protocol) implementation with hash…
pgodwin Jul 17, 2026
ba618cd
fix(afp): cap BytesFree/Total at 2 GiB − 1, not 4 GiB − 1
pgodwin Jul 17, 2026
9280fed
Add NetBoot boot support!
pgodwin Jul 19, 2026
059e662
test(e2e): add end-to-end test harness for legacy clients
pgodwin Jul 21, 2026
6f7cc25
test(e2e): pin mtools and flopgen (binaries + source) in-repo
pgodwin Jul 21, 2026
f93830e
fix(afp): page FPEnumerate over visible entries, not the raw listing
pgodwin Jul 21, 2026
a83f89f
fix(afp): advance the FPCatSearch cursor when the payload cap truncat…
pgodwin Jul 21, 2026
7609dd5
fix(zip): set LastFlag on an empty GetZoneList page
pgodwin Jul 21, 2026
baab077
localtalk: log the LLAP node-claim, document why RTS/CTS is absent
pgodwin Jul 21, 2026
03b23dd
config: set size_limit on the local server.toml volume
pgodwin Jul 21, 2026
07a6865
Add some stray files that should have been committed earlier.
pgodwin Jul 21, 2026
11fbde1
client: Phase 0 foundation for the file-client SDK ring
pgodwin Jul 21, 2026
1019321
client/afp: AFP file client over ASP/ATP/DDP — in-process e2e passing
pgodwin Jul 22, 2026
4cca98c
cmd/csfs: file-client CLI (one-shot + REPL + discover)
pgodwin Jul 22, 2026
f404d6b
client/link: pick a USER-range LLAP node so DDP replies reach the client
pgodwin Jul 22, 2026
0bf2655
fix(smb): honour TRANS2 MaxDataCount so FIND pages over connectionles…
pgodwin Jul 22, 2026
8e87a3f
feat(client/smb): SMB file client over direct-hosted IPX and TCP
pgodwin Jul 22, 2026
7bc4ba4
feat(client): NCP and EtherDFS file clients (Phase 3)
pgodwin Jul 23, 2026
27f943b
fix(client/afp): connect to a real System 7.x Mac + server-root browse
pgodwin Jul 23, 2026
7ebfca1
feat(client/smb): NBIPX + NBF carriers; shared core/log verbose trace…
pgodwin Jul 23, 2026
3f8bb77
refactor(cmd): csecho/csnbp/csgetzones onto the client/atalk SDK (Pha…
pgodwin Jul 23, 2026
58b0102
feat(netbios): client SDK datagram carrier — real net send + active n…
pgodwin Jul 24, 2026
9c501b6
fix(csfs): REPL cp command + quote-aware argument splitting
pgodwin Jul 24, 2026
922666d
fix(csfs): honour the URI ",<transport>" tail as the SMB pcap carrier
pgodwin Jul 24, 2026
084289e
fix(csfs/nbf): RR poll/final checkpoint + poll-bit SESSION_INITIALIZE
pgodwin Jul 24, 2026
8cf4d25
fix(csfs/nbf,smb): real-Win98 LLC2 poll semantics + SMB header/dialec…
pgodwin Jul 24, 2026
0c7d61b
fix(csfs/nbf): DATA_ACK the server's response correlator — Win98 SESS…
pgodwin Jul 24, 2026
2278bdb
feat(csfs/smb): enumerate shares on a server-root URI — Win98 share b…
pgodwin Jul 24, 2026
31b309d
Merge feat/client-sdk-v2 into feature/refactor
pgodwin Jul 24, 2026
1d7457a
Add LTOUDP dissector for wireshark
pgodwin Jul 25, 2026
d83038d
Add MIT license to netboot and derez
pgodwin Jul 25, 2026
10d81bc
feat(client): mount remote shares on Windows via WinFsp (csmount)
pgodwin Jul 25, 2026
922e0bb
fix(afp): two client fork-I/O wire bugs vs System 7.5 Personal File S…
pgodwin Jul 25, 2026
cdf3543
fix(atalk): take ATP response UserData from the seq-0 packet, not the…
pgodwin Jul 25, 2026
7c02566
fix(smb): read/create/rename against a real Win98 DOS-error server
pgodwin Jul 25, 2026
613ca8d
feat(fs,smb): surface remote DOS attributes natively through the Meta…
pgodwin Jul 26, 2026
da8f501
feat(afp,smb,fs): surface remote attributes + dates through the fs-na…
pgodwin Jul 26, 2026
8a42d96
feat(smb): TRANS2 QUERY_PATH_INFO Stat for reliable per-file timestamps
pgodwin Jul 26, 2026
8774e9c
docs(readme): document the file client (csmount WinFsp mount + csfs CLI)
pgodwin Jul 26, 2026
01f8c19
build: fold forknative + perfcounters into the `all` build tag
pgodwin Jul 28, 2026
5e4f276
vendor(go-winfsp): local patch exposing FileInfoTimeout for metadata …
pgodwin Jul 28, 2026
c515169
feat(hostinfo): shared primary-NIC (default-route) auto-detection
pgodwin Jul 28, 2026
8924241
feat(ipx,ncp): multi-frame-type IPX binding + Create Directory wire-o…
pgodwin Jul 28, 2026
ac618ea
feat(fs): project native forks into sidecars for the client mount (fo…
pgodwin Jul 28, 2026
9abfbdb
feat(protocol): client-direction DTOs for NCP + SMB file/browse services
pgodwin Jul 28, 2026
75acd00
feat(browse): master-browser "net view" for SMB discovery (passive)
pgodwin Jul 28, 2026
fa78dab
feat(client): file-client ring — csfs→csclient, AFP/NCP/SMB mount + W…
pgodwin Jul 28, 2026
ff25eb8
test(e2e): consolidated in-process file-op harness + Windows driver-i…
pgodwin Jul 28, 2026
68e1bcd
docs(errata,wireshark): SMB-client FIND paging quirks + ltoudp dissec…
pgodwin Jul 28, 2026
c761064
fix(core): drop fmt from ncp/sap to satisfy the no-reflection archtest
pgodwin Jul 28, 2026
f7c8856
fix(compose): gate router-dependent registrations (and their test) on…
pgodwin Jul 28, 2026
a7d92b9
chore(security): bump Go for GO-2026-5856, restore + green the gosec …
pgodwin Jul 29, 2026
1329f28
test(fork/native): gate the resource-fork assertion to Darwin
pgodwin Jul 29, 2026
55b7be3
feat(winfsp): port GetStreamInfo/GetEa/SetEa into the third_party fork
pgodwin Jul 30, 2026
baedd51
feat(fs/ads): SFM Comments stream, exported AfpInfo DTO, NTFS gate, A…
pgodwin Jul 30, 2026
85e84a5
refactor(fs/fork): make "native" a per-OS alias; rename native adapte…
pgodwin Jul 30, 2026
68366d5
feat(csmount): surface remote AFP forks as NTFS SFM streams (-fork na…
pgodwin Jul 30, 2026
01e845b
docs: document per-OS "native" fork alias + SFM stream layout
pgodwin Jul 30, 2026
58bf4c4
docs(CLAUDE.md): expand rules — const grouping, tshark path, license …
pgodwin Aug 1, 2026
0da5e94
feat(link): per-destination-node write pacing for LocalTalk transports
pgodwin Aug 1, 2026
e3d7ff8
feat(control): emit Info audit lines for management actions; stream t…
pgodwin Aug 1, 2026
f4c8fd8
fix(smb/netbios): match real WfW/Win98 NetServerEnum2 + directed brow…
pgodwin Aug 1, 2026
15bb2ad
fix(macip): correct gateway/lease semantics, resolve egress iface, ad…
pgodwin Aug 1, 2026
351bd21
config: document MacIP/IPXGW gateways and port pace_ms; update local …
pgodwin Aug 1, 2026
f99e715
fix(macip): correct MacIPGP wire format and implement full NBP-ARP ad…
pgodwin Aug 1, 2026
412616b
Revert "fix(macip): correct MacIPGP wire format and implement full NB…
pgodwin Aug 2, 2026
4d2de39
feat(webui+ports): self-describing config, per-transport sections, an…
pgodwin Aug 2, 2026
0a7a2bd
fix(macip): correct MacTCP config wire format + NBP-ARP so real clien…
pgodwin Aug 4, 2026
c30539e
feat(config): document every config field with display name, descript…
pgodwin Aug 4, 2026
c9f9ff3
fix(tashtalk): restore inbound framing, arm hardware node filter, ena…
pgodwin Aug 13, 2026
fcd2c91
feat(netboot): ChainDisk streaming payload, size stamping, and TashTa…
pgodwin Aug 16, 2026
9b037fe
feat(netboot): ChainDisk full DrvSts reply and _StripAddress handling
pgodwin Aug 16, 2026
87f2bb0
feat(csmount): mount shares via macFUSE and libfuse
pgodwin Aug 17, 2026
11d4dbf
feat(webui): embed a Finder-first Vite SPA over the live shares
pgodwin Aug 17, 2026
55192ae
feat(client+webui+net): add an in-process file client, a Finder-style…
pgodwin Aug 18, 2026
24b1e20
feat(client+net): direct-hosted IPX SMB, NWLink browser discovery, sh…
pgodwin Aug 20, 2026
55b5763
docs: add first-pass operator and developer manual
pgodwin Aug 20, 2026
bd05737
smb/nbipx: stop swallowing DATA frames as name-service replies
pgodwin Aug 20, 2026
8e709b0
ci: install the ClassicStack-web deps the SPA typecheck needs
pgodwin Aug 21, 2026
f1bcb03
core: restore the import-graph dependency rule (§1)
pgodwin Aug 21, 2026
4040fac
core/port: keep struct tags under the TinyGo 255-byte limit
pgodwin Aug 21, 2026
6dda237
test: align two stale gates with the behaviour they cover
pgodwin Aug 21, 2026
b0eecb3
feat(webui+client): Open by Path, Settings window, and SMB command lo…
pgodwin Aug 21, 2026
e6a2322
config: point the default bridge at bridge1 and drop the SMB_Share us…
pgodwin Aug 21, 2026
ac3a789
ci: fix the linux/amd64 LToUDP build and the TinyGo goroot mismatch
pgodwin Aug 21, 2026
78e0eab
Add macOS menu bar app for ClassicStack (cmd/classicstack-tray)
pgodwin Aug 21, 2026
7c7f8cf
Add a Windows port of the tray app, sharing logic with macOS
pgodwin Aug 22, 2026
6799603
Add native notifications for Messenger/error events to the tray app
pgodwin Aug 22, 2026
15c1241
Migrate ClassicStack-web from a CI/script fallback clone to a git sub…
pgodwin Aug 22, 2026
5ea53ae
Add the Windows installer (Inno Setup) and its build.ps1 driver
pgodwin Aug 22, 2026
9980461
gitignore: exclude Windows installer build output and staged redistri…
pgodwin Aug 22, 2026
75db6b8
Add -version flag to all client CLI tools, build Windows installer in…
pgodwin Aug 22, 2026
a2b678b
docs: split the manual, correct config drift, add a published site, c…
pgodwin Aug 22, 2026
16ca3da
feat(afp): implement DSI (AFP-over-TCP) for client and server
pgodwin Aug 22, 2026
a6d05a3
fix: two pre-existing CI-only failures found while verifying the DSI …
pgodwin Aug 22, 2026
76bcb8a
fix(embedded): unblock several layers of the WT32-ETH01/Pico TinyGo b…
pgodwin Aug 22, 2026
bb579b7
docs: rewrite ARCHITECTURE.md for the current core/adapter/compose/cl…
pgodwin Aug 22, 2026
d40b953
fix: diskUsage redeclared for windows+tinygo (regression from previou…
pgodwin Aug 22, 2026
3a05804
ci/fix: pin TinyGo 0.41.1 in pr-ci/release-main; fix installer Pascal…
pgodwin Aug 22, 2026
7aacc53
lint: fix errorlint/govet/misspell findings across the tree (golangci…
pgodwin Aug 22, 2026
bc80d78
lint: fix staticcheck, unused, and revive findings (golangci-lint)
pgodwin Aug 23, 2026
210063f
lint: fix ineffassign findings (golangci-lint)
pgodwin Aug 23, 2026
4592e09
lint: fix gocritic findings across the tree (golangci-lint)
pgodwin Aug 23, 2026
87eeca7
lint: fix errcheck findings across the tree (golangci-lint)
pgodwin Aug 23, 2026
6e2ea47
lint: fix errcheck findings in Linux-only hostinfo files
pgodwin Aug 23, 2026
8cef04a
build: bump Go toolchain to 1.25.13 and golang.org/x/net to v0.56.0
pgodwin Aug 23, 2026
d747f54
ci: require a version tag to cut a release; support -rc/-rcN tags
pgodwin Aug 23, 2026
480b391
ci(embedded): install ESP-IDF for WT32-ETH01; stop it blocking Pico/r…
pgodwin Aug 23, 2026
00436e4
fix(embedded): make all four Pico targets actually build
pgodwin Aug 23, 2026
b60f8d5
Add reference pcaps
pgodwin Aug 23, 2026
3923e13
test(link): widen TestPace_SameNodeSpaced's tolerance to stop CI flakes
pgodwin Aug 23, 2026
c5cc6d1
fix(router): late AARP/LLAP claims never join the routing table
pgodwin Aug 24, 2026
6e20804
fix(nbp): resolve wildcard zone before rebuilding LkUp/Fwd payload
pgodwin Aug 24, 2026
6a3b012
fix(config): disable dhcp_relay so NAT mode uses its static pool
pgodwin Aug 24, 2026
2c5a2f6
fix(macipgw): force-disable dhcp_relay in nat mode, log a warning
pgodwin Aug 24, 2026
012c4e4
smb: refuse OPEN_ANDX on directories
pgodwin Aug 24, 2026
e457ae8
fix(router,nbp): broadcast replies to unnumbered clients on extended …
pgodwin Aug 24, 2026
cd7f465
smb: FIND_FIRST2 on an exact directory name returns the entry, not it…
pgodwin Aug 24, 2026
3ff6816
fs: never unescape control/reserved chars back onto a DOS wire
pgodwin Aug 24, 2026
478b2c2
smb,fs: give SMB shares a windows-safe filename codec by default
pgodwin Aug 24, 2026
31b273c
aarp,supervisor,cli,finder: fix AARP frame trim, shutdown hang, sideb…
pgodwin Aug 24, 2026
102ce57
Add CI workflow to build e2e client disk images
pgodwin Aug 24, 2026
c5a0e5e
Pin Apple Universal Interfaces disk image for the macOS e2e client build
pgodwin Aug 24, 2026
126cbdb
fs: don't let windows-safe escape FIND_FIRST2 wildcard metacharacters
pgodwin Aug 24, 2026
aefc4c2
Add full CLI reference doc and Unix man pages for cmd/ tools
pgodwin Aug 25, 2026
771a69b
docs: stop cross-referencing man pages from cli.md
pgodwin Aug 25, 2026
f1a41dd
Restore pcap capture files accidentally deleted in 771a69b
pgodwin Aug 25, 2026
47d16e8
Add docs/forks.md and docs/filename-encoding.md
pgodwin Aug 25, 2026
93542a9
Update documentation and remove pcaps from test run.
pgodwin Aug 25, 2026
31729c2
docs(wireshark): explain llap hand-off in ltoudp dissector, credit NJ…
pgodwin Aug 26, 2026
4be3f9a
netboot: add makefile with ChainDisk.bin target and vasm auto-build
pgodwin Aug 26, 2026
3a71cf3
Add vasm and bootstrap floppy resources.
pgodwin Aug 26, 2026
623467b
Add log file path to [logging] config and web UI
pgodwin Aug 26, 2026
39a1cd4
afp: cap two-phase writes at one in-flight per session
pgodwin Aug 26, 2026
9d7b3a7
ltoudp: validate LLAP framing at ingress and name the offending peer
pgodwin Aug 27, 2026
c441a6c
shutdown: stop a wedged serial read, and stop it cascading
pgodwin Aug 27, 2026
b35b88e
serial: an idle-line read timeout is not end-of-stream
pgodwin Aug 27, 2026
977b3fe
chore(web): bump ClassicStack-web submodule for Finder multi-select
pgodwin Aug 27, 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
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .cursor/rules/classicstack-web-codecs.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
description: ClassicStack-web codecs stay pluggable; do not inline SIT/rez into the Go SPA
globs: adapter/control/http/ui/**/*.{ts,tsx,css}
alwaysApply: false
---

# Shared Finder codecs

ClassicStack-web will split Finder UI from Macintosh codecs. The Go SPA must import expand/zip/resource-fork through ClassicStack-web (`classicstack-web/fs/expand`, `fs/codecs`, `fs/resource-fork`), not copy SIT/`dcmp`/rez into `adapter/control/http/ui`.

To add or replace StuffIt decompression or rez decoding, register a codec with `registerArchiveCodec` / `registerRezCodec` in ClassicStack-web — do not special-case formats in `GoFinderHost` or `HttpCatalog`.
32 changes: 32 additions & 0 deletions .github/actions/setup-spa/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Setup SPA
description: Build the Vite SPA (Finder UI from the ClassicStack-web submodule) for go:embed.

runs:
using: composite
steps:
# The Finder UI comes from the third_party/classicstack-web submodule, which
# Vite aliases into this tree (see adapter/control/http/ui). Callers must
# check out with `submodules: recursive`; fail loudly rather than let tsc
# report a wall of unresolved classicstack-web/* imports.
- name: Check ClassicStack-web submodule
shell: bash
run: |
if [[ ! -f third_party/classicstack-web/src/ui/finder-window.ts ]]; then
echo "::error::third_party/classicstack-web is empty. Check out with 'submodules: recursive'." >&2
exit 1
fi
echo "spa: ClassicStack-web at $(git -C third_party/classicstack-web rev-parse --short HEAD)"

- name: Setup Node
uses: actions/setup-node@v7
with:
node-version: "22"
cache: npm
# spa.sh installs in both trees, so key the cache off both lockfiles.
cache-dependency-path: |
adapter/control/http/ui/package-lock.json
third_party/classicstack-web/package-lock.json

- name: Build SPA
shell: bash
run: bash scripts/ci/spa.sh
77 changes: 77 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@

ClassicStack **bridges contemporary systems and legacy systems** by implementing legacy
network protocols and file/print services in **modern, self-contained code** — with **no
dependency on legacy kernel extensions or OS services** (no `AF_APPLETALK` stack, no Windows
Services-for-Macintosh, no kernel IPX). We meet users where they are — Windows, macOS, Linux,
or embedded — and serve as many legacy clients as possible (Classic Mac OS, DOS, early
Windows). The four pillars below drive every design decision in this document.

**Cross-platform — first-class on each target.**
- *Desktop* (Windows / macOS / Linux): behaves natively — Windows Service, launchd, systemd.
- *OpenWRT*: lives in the ecosystem — UCI configuration, ubus control, procd integration.
- *Embedded* (primarily ESP32 via **TinyGo**): the same core runs on microcontrollers.
TinyGo is also a **size lever on desktop** — e.g. a TinyGo build inside an Alpine image to
keep a Linux container tiny.

**Flexible.**
- Components are **selectable at build time** so binaries stay small (only what you ship is
linked).
- Ports and services **start, stop, and reconfigure at runtime** (§11).
- **No leaky abstractions** — adapters absorb each environment's capabilities (§1).

**Small.** Clear separation of concerns; prefer the smaller implementation; delete code.

**Adaptable.** **No hard-coded assumptions about the physical interface.** A port works over
pcap, TAP, PPP/SLIP, a kernel datagram socket, or an in-memory pipe **without rewriting the
port** — the link is an adapter (§2).

### Compatibility over correctness (a deliberate stance)

We target long-obsolete systems that predate modern best practice (no/weak encryption, no
bounds discipline, quirky clients). Our goal is **compatibility — including bug-for-bug
compatibility with real clients — not abstract spec correctness.** Concretely:

- **Observed client behaviour outranks the spec.** Where a real Classic Mac / DOS client
disagrees with the written protocol, we match the client and **document the deviation**
(per CLAUDE.md: code comment + `spec/errata.md`).
- **Quirk handling is a feature, not debt.** Working around known client bugs is expected.
- **Where we have no spec, the wire is the spec** — observed framing/commands/responses are
documented and become the contract (e.g. MacIPX from captures).

### Security posture — host-side modern, wire-side faithful

The governing split: **apply modern good practice to everything on *our* side of the bridge,
and faithfully speak the legacy client's insecure dialect on the *wire* side.** Insecurity is
scoped to the wire-facing edge by necessity — it is never leaked inward to the host.

**Host side (we hold ourselves to current practice):**
- **Robust, safe Go**: no memory-unsafety, careful parsing of hostile input, fail closed on
our own bugs, sanitise everything that crosses into the host (paths, names, sizes).
- **Credentials at rest are protected with modern primitives** even when the protocol that
*uses* them is weak — e.g. a user store keeps salted-hashed passwords, regardless of the
fact that the legacy auth handshake will compare them against a cleartext or
weakly-hashed value off the wire.

**Wire side (compatibility is the requirement, weakness is intentional):**
- We **implement the legacy protocol's auth and crypto exactly as the client expects** —
cleartext passwords, obsolete ciphers, broken hashes — because that is the only thing the
client can speak. Refusing defeats the project's purpose.
- **Deliberately-obsolete cryptography is a feature, not a defect.** Example: a future HTTP
proxy may MITM and **re-encrypt with SSL 3.0 and dead ciphers** so a Netscape 2.0 client
can connect over "SSL." A modern browser will (correctly) reject it; the legacy client
works. A security scanner flagging the SSL 3.0 code path **must not "fix" it** — it is
there on purpose, behind a feature/build flag, and annotated as intentional.


## Remember!
1. Always confirm implementation details with the specifications found in /spec/*.md
2. Use consts rather than hard-coded values, especially for responses, errors, etc.
3. Use the names from the specification for functions, consts, etc and include a comment with a breif description from the spec for any functions.
4. Captures of protocols can be found in /captures. Use `tshark` to review protocol captures to aid in diagnosing faults.
5. When the observation from a capture differs from the spec, document it in the code and in `/spec/errata.md`
6. Where we do not have a spec and implementation is from observation, add details on wire format, observed commands, observed responses. Eg, the MacIPX Gateway implementation will be based on observed IPX encapsulation over AppleTalk traffic between a Novell Server and a Macintosh MacIPX client.
7. If code is from 3rd parties, **Always** attribute it to the original authors.
8. Check for linting errors before committing.
9. Run gofmt before commiting.
10. Every function, const must have a comment
11. every code file should have a comment
64 changes: 64 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Docs Site

on:
push:
branches:
- main
paths:
- "docs/**"
- "spec/**"
- "ARCHITECTURE.md"
- "site/**"
- ".github/workflows/docs.yml"
workflow_dispatch: {}

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: false

jobs:
build:
name: Build (Hugo)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7

- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: site/go.mod

- name: Set up Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: "0.165.0"
extended: true

- name: Build site
working-directory: site
env:
HUGO_ENVIRONMENT: production
run: hugo --minify --gc -d ../public

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: public

deploy:
name: Deploy to GitHub Pages
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy
id: deployment
uses: actions/deploy-pages@v4
115 changes: 115 additions & 0 deletions .github/workflows/e2e-clients.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
name: E2E Clients

# Builds the vintage-client test tools under tools/end-to-end and publishes
# their disk images as artifacts. These are not part of the PR gate — they
# produce the floppy images that get run by hand under an emulator (86Box for
# the Windows clients, Snow/Mini vMac for the Mac client); see
# tools/end-to-end/{windows,macos}/readme.md for the run procedure.

on:
push:
branches:
- feature/refactor
paths:
- "tools/end-to-end/**"
- ".github/workflows/e2e-clients.yml"
workflow_dispatch: {}

permissions:
contents: read

jobs:
win32:
name: Build Win32 SMB client (MSVC 1.2)
runs-on: windows-latest
defaults:
run:
shell: cmd
steps:
- name: Checkout
uses: actions/checkout@v7

- name: Build SMBE2E.EXE + floppy image
working-directory: tools/end-to-end/windows/win32
run: build.bat floppy

- name: Upload disk image
uses: actions/upload-artifact@v4
with:
name: e2e-win32-smb-disk
path: tools/end-to-end/windows/win32/SMBE2E1.img
if-no-files-found: error

win16:
name: Build Win16 SMB client (MSVC 1.5)
runs-on: windows-latest
defaults:
run:
shell: cmd
steps:
- name: Checkout
uses: actions/checkout@v7

# build.bat hardcodes OTVDM=c:\otvdm\otvdm.exe: it runs NMAKE (and the
# CL driver's TNT-extended compiler passes) under otvdm, the only piece
# of the win16 toolchain that isn't committed under tools/msvc/win16
# (see tools/end-to-end/windows/readme.md's Toolchains section). Pin a
# version rather than tracking "latest" since this is a compiler-adjacent
# dependency other CI pins already treat the same way (TinyGo, ESP-IDF).
- name: Install otvdm
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$version = "v0.9.0"
Invoke-WebRequest -Uri "https://github.com/otya128/winevdm/releases/download/$version/otvdm-$version.zip" -OutFile "$env:RUNNER_TEMP\otvdm.zip"
Expand-Archive -Path "$env:RUNNER_TEMP\otvdm.zip" -DestinationPath "$env:RUNNER_TEMP\otvdm-extracted"
Move-Item "$env:RUNNER_TEMP\otvdm-extracted\otvdm-$version" "C:\otvdm"
if (-not (Test-Path "C:\otvdm\otvdm.exe")) {
throw "C:\otvdm\otvdm.exe not found after extracting otvdm"
}

- name: Build SMBE2E.EXE + floppy image
working-directory: tools/end-to-end/windows/win16
run: build.bat floppy

- name: Upload disk image
uses: actions/upload-artifact@v4
with:
name: e2e-win16-smb-disk
path: tools/end-to-end/windows/win16/SMBE2E1.img
if-no-files-found: error

macos:
name: Build macOS AFP client (Retro68)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7

# ghcr.io/autc04/retro68 is the official Retro68 cross-toolchain image
# (68k/PPC gcc + the hmount/hcopy/hattrib disk-image tools); only a
# "latest" tag is published upstream, rebuilt on every Retro68 merge.
# Mirrors the manual build recipe in tools/end-to-end/macos/readme.md,
# just with the container's toolchain file path instead of the WSL one.
#
# The image's default "multiversal" interfaces (Retro68's free, still-
# incomplete reimplementation of Apple's headers) don't implement
# pre-System-7 APIs like AppleTalk.h yet, which afp/atalk.h needs. The
# container's entrypoint switches to the real thing given
# INTERFACES=universal + INTERFACESFILE pointing at a MacBinary
# DiskCopy image of Apple's Universal Interfaces — tools/end-to-end/
# tools/mpw/MPW-GM.img.bin (pinned in-repo alongside the MSVC kits;
# see tools/end-to-end/.gitignore).
- name: Build AFPE2E.APPL + disk image
run: |
docker run --rm -v "$PWD/tools/end-to-end:/e2e" -w /e2e/macos \
-e INTERFACES=universal -e INTERFACESFILE=/e2e/tools/mpw/MPW-GM.img.bin \
ghcr.io/autc04/retro68:latest \
bash -c "mkdir -p build && cd build && cmake .. -DCMAKE_TOOLCHAIN_FILE=/Retro68-build/toolchain/m68k-apple-macos/cmake/retro68.toolchain.cmake && make"

- name: Upload disk image
uses: actions/upload-artifact@v4
with:
name: e2e-macos-afp-disk
path: tools/end-to-end/macos/build/AFPE2E.dsk
if-no-files-found: error
Loading
Loading