-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
313 lines (302 loc) · 30.6 KB
/
index.html
File metadata and controls
313 lines (302 loc) · 30.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>Joe Maloney</title>
<style>
body {
font-family: -apple-system, "Helvetica Neue", Helvetica, Arial, sans-serif;
max-width: 760px;
margin: 40px auto;
padding: 0 20px;
color: #222;
line-height: 1.6;
}
header {
border-bottom: 1px solid #ccc;
padding-bottom: 16px;
margin-bottom: 24px;
}
h1 { font-size: 1.8em; margin: 0 0 4px; }
header p { margin: 0; color: #666; }
h2 {
font-size: 1.25em;
margin-top: 2em;
border-bottom: 1px solid #eee;
padding-bottom: 4px;
}
ul { padding-left: 20px; }
li { margin-bottom: 8px; }
a { color: #0366d6; text-decoration: none; }
a:hover { text-decoration: underline; }
.guides li { margin-bottom: 12px; }
.guides .desc { color: #666; font-size: 0.92em; display: block; }
footer {
margin-top: 3em;
padding-top: 16px;
border-top: 1px solid #eee;
color: #888;
font-size: 0.9em;
}
</style>
</head>
<body>
<header>
<h1>Joe Maloney</h1>
<p>Open-source contributor · <a href="https://github.com/pkgdemon">github.com/pkgdemon</a></p>
</header>
<h2>Blog</h2>
<ul class="guides">
<li>
<a href="the-50th-floor.html?v=20260514">The 50th Floor</a>
<span class="desc">Porting launchd to FreeBSD — and why FreeNAS Corral is next. On the phases of a software life, AI as a paintbrush, vibe coding honestly, and the rabbit hole that led to a standalone Mach kernel module.</span>
</li>
<li>
<a href="how-a-computer-should-work.html?v=20260514">How a Computer Should Work</a>
<span class="desc">The case for an offline-first appliance, simple enough for a mere mortal. A quiet boot, login without the internet, applications you actually own, upgrades that don't erase your disk, and a desktop that runs on refurbished hardware.</span>
</li>
</ul>
<h2>GNUstep & Gershwin Guides</h2>
<ul class="guides">
<li>
<a href="SquashFS-Setup.html?v=20260514">SquashFS Setup Guide for Gershwin Workspace</a>
<span class="desc">Building a SquashFS-based workspace on Debian/Linux.</span>
</li>
<li>
<a href="default-browser-setup.html?v=20260514">Setting Chromium as the Default Web Browser</a>
<span class="desc">Configuring the default browser under GNUstep.</span>
</li>
<li>
<a href="mdns-local-fix.html?v=20260514">Fixing <code>.local</code> (mDNS) Resolution</a>
<span class="desc">Getting mDNS name resolution working on Debian/Devuan.</span>
</li>
<li>
<a href="zsh-setup.html?v=20260514">Zsh System-Wide Setup</a>
<span class="desc">Configuring zsh as a system-wide shell environment.</span>
</li>
<li>
<a href="devuan-alsa-only.html?v=20260514">ALSA + dmix + apulse Setup</a>
<span class="desc">Sharing the sound card via ALSA dmix with apulse, no PulseAudio/PipeWire.</span>
</li>
<li>
<a href="nfs-locking-freeze-investigation.html?v=20260514">NFS Locking Freeze Investigation</a>
<span class="desc">Why Chromium screen-share freezes the X session when <code>$HOME</code> is on NFS: the server doesn't register NLM, SQLite POSIX locks block in <code>fcntl()</code>, and the main thread stops servicing X events. Evidence, root cause, and fix.</span>
</li>
</ul>
<h2>GNUstep Research</h2>
<ul class="guides">
<li>
<a href="menu-rendering-compared.html?v=20260514">How Menus Work: macOS vs GNUstep</a>
<span class="desc">Comparing menu rendering architecture between macOS and GNUstep.</span>
</li>
<li>
<a href="apple-menu-ownership.html?v=20260514">Who draws the macOS menu bar?</a>
<span class="desc">Ownership and rendering of the macOS menu bar.</span>
</li>
<li>
<a href="WindowServer-Plan.html?v=20260514">WindowServer.app Development Plan</a>
<span class="desc">Native GNUstep display server for Linux using KMS/DRM and GPU compositing.</span>
</li>
<li>
<a href="gershwin-windowmanager-qa-plan.html?v=20260514">Gershwin WindowManager QA Plan</a>
<span class="desc">Two-track QA plan: per-PR manual smoke checklist plus a phased automated test suite.</span>
</li>
</ul>
<h2>FreeBSD Research</h2>
<ul class="guides">
<li>
<a href="freebsd-livecd-plan.html?v=20260514">FreeBSD Live ISO — implementation report & remaining options</a>
<span class="desc">Working livecd: cd9660 + mkuzip + gunion overlay + init_chroot pivot. Measured at 396 MiB minimal / 3.8 GiB with KDE Plasma 6. Lessons learned and three concrete paths to RAM-scaled writable headroom.</span>
</li>
<li>
<a href="freebsd-squashfs-research.html?v=20260514">SquashFS on FreeBSD — architecture research</a>
<span class="desc">Why a Linux-style squashfs livecd is hard on FreeBSD today: GSoC 2023 kernel work, geom_uzip vs squashfs vs tarfs, gunion vs unionfs, reboot -r vs init_chroot.</span>
</li>
<li>
<a href="freebsd-livecd-gunion-reroot-plan.html?v=20260514">freebsd-livecd-gunion-reroot — experimental architecture <span class="pill info">DEFERRED</span></a>
<span class="desc">Combine gunion (block-level RAM overlay) with <code>reboot -r</code> reroot to eliminate the kernel/userspace namespace split. Deferred — the simpler symlink trick (<code>cdroot/boot/firmware → /sysroot/boot/firmware</code>) verified working on real hardware, addressing the firmware-loading problem without architectural rewrite. Plan preserved as a reference if some future need genuinely requires kernel-and-userspace-share-a-root semantics.</span>
</li>
<li>
<a href="gershwin-livecd-unionfs-plan.html?v=20260514">gershwin-on-freebsd: init_chroot + unionfs livecd rework + bsdtar installer — plan</a>
<span class="desc">Fixes "admin can't log in after install" at its source. Replaces gershwin-on-freebsd's piecemeal nullfs + rc.d-neutering <code>init_script</code> with the <code>init_chroot</code> + in-kernel-unionfs (tmpfs upper / uzip lower) pivot — the whole root becomes one writable union, the real rc.d scripts run, nothing is neutered. Ports the <code>/boot/firmware → /sysroot/boot/firmware</code> symlink; splits <code>loader.conf</code> into a live-only tier and an everywhere <code>loader.conf.d/gershwin.conf</code>. Changes <code>gershwin-system</code>'s installer to copy the pristine uzip with <code>bsdtar --acls --xattrs --fflags</code> from a read-only mount of <code>/dev/md0.uzip</code>, instead of a broken <code>cp -a</code> tree copy — full metadata fidelity, off unionfs entirely, no live-session cruft. Net: minimal divergence between the livecd and the installed system.</span>
</li>
<li>
<a href="gershwin-native-installer-backend-plan.html?v=20260514">gershwin native installer backend — <code>Copier.framework</code> scoping plan <span class="pill pill-warn">Scoping</span></a>
<span class="desc">Follow-up to the livecd plan: a fully-native, cross-platform GNUstep file-level copier to eventually replace the interim <code>bsdtar</code> installer step. A <code>Copier.framework</code> (libs-base citizen) + CLI — <code>GSFileCopier</code> / <code>GSCopyOptions</code> / <code>GSFileMetadata</code> / <code>GSInodeMap</code> / <code>GSExcludeMatcher</code> — with a ~600-800 line platform shim (<code>extattr_*</code>/<code>acl_*_link_np</code>/<code>lchflags</code> on FreeBSD, <code>*xattr</code>/<code>acl_*_file</code>/<code>FS_IOC_*FLAGS</code> on Linux). No incremental deps since the ISO always ships GNUstep. Documents the load-bearing per-file operation ordering, the unpreservable bits (<code>ctime</code>, <code>birthtime</code>), and a local-only v1 scope.</span>
</li>
</ul>
<h2>Launchd Research Sockets</h2>
<ul class="guides">
<li>
<a href="gershwin-livecd-launchd-plan.html?v=20260514e">gershwin-on-freebsd: livecd rework + launchd port — plan <span class="pill ok">Phase 1 + 2 CI-green</span></a>
<span class="desc">Sequenced integration of freebsd-launchd's work into <a href="https://github.com/pkgdemon/gershwin-on-freebsd">pkgdemon/gershwin-on-freebsd</a>. Phase 1 landed (single-root unionfs + init_chroot pivot, CI boot-test gate, feat/libs-corebase). Phase 2 landed (launchd as PID 1 via Option D, bedrock plists from freebsd-launchd, gershwin-specific dshelper/loginwindow/gdomap plists, dhcpcd swap, no getty — LoginWindow is the login). Phase 3 polish (dbus, kmodloader, gdomap lo0 fix, dshelper daemonization, ASL, single-user) deferred.</span>
</li>
<li>
<a href="freebsd-launchd-plan.html?v=20260514">FreeBSD launchd — porting plan (AF_UNIX sockets track) <span class="pill info">Superseded</span></a>
<span class="desc">Original non-Mach port of Apple's launchd — AF_UNIX/sockets only, GNUstep system-domain libs + launchd built inside a livecd staging chroot, boot-tested in qemu. <strong>Superseded by <a href="freebsd-launchd-mach-plan.html">freebsd-launchd-mach (v2)</a></strong>, which is now working end-to-end on stock FreeBSD-15 (mach.ko + libmach + userland <code>mach_msg</code>, 19/19 smoke green). Kept for historical context and as the lineage of the gershwin-livecd integration; the child plans below were drafted against this track and inherit its superseded status.</span>
<ul>
<li>
<a href="freebsd-launchd-service-ordering.html?v=20260514">FreeBSD launchd — service ordering <span class="pill info">Superseded</span></a>
<span class="desc">Cross-service ordering on freebsd-launchd: what makes <code>varrun → cron</code>, <code>syslogd</code>-first, and <code>dhcpcd</code>-after-<code>kmodloader</code> work declaratively rather than by alphabetical-filename luck. netconfigd is one downstream consumer of the same primitives; the doc walks both layers. Superseded along with the sockets track.</span>
</li>
<li>
<a href="freebsd-kmodloader-plan.html?v=20260514">FreeBSD kmodloader — porting plan <span class="pill info">Superseded</span></a>
<span class="desc">Apple-shaped clean-room daemon: every hardware-class kmod autoloads at boot or hot-plug. Closes the gap where stock FreeBSD doesn't aggressively bind GPU/NIC/USB drivers without manual <code>kld_list=</code> editing. <strong>Superseded in the mach track by <a href="freebsd-hardware-registry-iokit-plan.html">hwregd</a></strong>, which lifts devmatch's <code>search_hints()</code> parser into a daemon that reads <code>/dev/devctl</code> directly and kldload's on <code>?nomatch</code> — same job, integrated with the Mach IORegistry instead of standing alone.</span>
<ul>
<li>
<a href="freebsd-gpu-detection-comparison.html?v=20260514">GPU autodetection comparison — kmodloader vs. GhostBSD xconfig vs. NomadBSD initgfx vs. xlibre vs. Linux</a>
<span class="desc">Side-by-side comparison of how each system maps GPUs to drivers, handles fallback to scfb/vesa/efifb, and what happens when a DRM kmod loads but the chip is too new to bind. Cites source line:column for the key logic in each.</span>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="freebsd-mach-kmod-plan.html?v=20260514">FreeBSD <code>mach.ko</code> — out-of-tree kernel module feasibility (v1) <span class="pill info">Superseded</span></a>
<span class="desc">Predecessor investigation that led to <a href="freebsd-launchd-mach-plan.html">freebsd-launchd-mach (v2)</a>. Earlier framing: build a minimal <code>mach.ko</code> from scratch covering the ~15-call subset configd and launchd's bootstrap actually use. Stable-KPI-only diet so the artifact rebuilds only at major FreeBSD bumps. Shipped from <code>freebsd-launchd</code>'s CI as a per-major release tarball alongside the live ISO. <strong>Superseded by v2</strong> once direct inspection of NextBSD and ravynOS revealed a working module already exists, but kept for the API-surface analysis (the configd Mach-surface inventory in §8 and the stable-KPI / KBI diet in §5 are cited in-body from v2).</span>
</li>
</ul>
<h2>Launchd Research Mach</h2>
<ul class="guides">
<li>
<a href="freebsd-launchd-mach-plan.html?v=20260514">freebsd-launchd-mach — pure-port track forking ravynOS's Mach + launchd stack (v2) <span class="pill ok">Phase B Tier 1 + C1-C3 complete</span></a>
<span class="desc">FreeBSD modernization plan. Two-repo strategy: keep <code>freebsd-launchd</code> on the AF_UNIX track unchanged; create a new <code>freebsd-launchd-mach</code> repo that extracts ravynOS's <code>sys/compat/mach/</code> as an out-of-tree <code>mach.ko</code>, lifts their launchd / liblaunch / libxpc / libdispatch, integrates the configd Apple source already imported by <code>freebsd-launchd</code>, and reuses the existing CI / ISO scaffolding. Apple source covers only the system-services layer (Mach, launchd, configd, notifyd, asl, dispatch, xpc); GNUstep stays for the framework layer (Foundation, AppKit, libobjc2). Stays ELF; no dyld, no Mach-O execution, Linux compat unaffected. <strong>Status:</strong> mach.ko builds + kldloads on stock FreeBSD-15; 4 wired trap-family syscalls + libmach + lazy Mach init + end-to-end userland <code>mach_msg</code> proof; 19/19 smoke green, zero kernel patches.</span>
<ul>
<li>
<a href="freebsd-launchctl-corefoundation-spike.html?v=20260514">launchctl CoreFoundation spike — picking the CF source for launchd-842</a>
<span class="desc">Picks the CoreFoundation source for the launchd-842 launchctl port. Apple's <code>launchctl.c</code> is 4,549 LOC of CF-heavy code. Audits three candidates — gnustep/libs-base, gnustep/libs-corebase, swiftlang/swift-corelibs-foundation — against the exact symbol set <code>launchctl.c</code> uses, with a buy/build/skip decision per candidate. Settles the CF choice that the v2 plan's lede references.</span>
</li>
<li>
<a href="freebsd-libcorefoundation-icu-audit.html?v=20260514">libCoreFoundation ICU audit — do we need ICU on the ISO?</a>
<span class="desc">Decision-quality survey of ICU usage across 22 Apple-source components relevant to the launchd-adjacent system-services stack. Reverses the CF spike's §14.4 "install ICU as a build dep, keep all CF source files" call: <strong>no ICU on the ISO</strong>, with the caveat that two daemons (configd, IPConfiguration) and one library (PowerManagement) touch CF-ICU APIs in narrow cosmetic / debug paths that have direct libc-equivalent replacements. <strong>Superseded by the libicu port plan</strong> — CI execution surfaced 33 additional ICU call sites in CF the audit missed, forcing the decision to flip from Option A (drop) to Option C (vendor).</span>
</li>
<li>
<a href="freebsd-libicu-port-plan.html?v=20260515">libicu port plan — vendoring Apple ICU into freebsd-launchd-mach</a>
<span class="desc">Concrete, agent-derived plan after the audit's Option A turned out to miss 33 ICU call sites (CFString grapheme detection, CFTimeZone localized names, CFBundle_Locale + the Apple-only <code>ualoc_localizationsToUse</code>). Mid-plan vendor-source pivot: started with apple-oss-distributions/ICU, found that swift-corelibs CF actually expects <code>apple/swift-foundation-icu</code> (purpose-built, native <code>_foundation_unicode/</code> namespace, Apache 2.0). Final shape: vendor swift-foundation-icu at <code>src/swift-foundation-icu/</code>, build via CMake to <code>/usr/lib/system/libicucore.so</code> (~40–50 MB installed, matching macOS's libicucore.dylib).</span>
</li>
<li>
<a href="freebsd-launchd-842-porting-plan.html?v=20260514">freebsd-launchd-842 — porting Apple's last open-source launchd <span class="pill pill-warn">Plan drafted</span></a>
<span class="desc">Data-grounded porting plan for Apple's <code>launchd-842.92.1</code> (2014, ~28.5k LOC, last open source pre-libxpc-split) onto our <code>mach.ko</code> + <code>libsystem_kernel</code> + <code>libdispatch</code> + <code>libxpc</code> + <code>bootstrap_server</code> stack. Drafted from four parallel research passes through the verbatim Apple source: build-system map (7 MIG .defs files), Mach/IPC gap analysis (audit-trailer materialization + dead-name notifications + port sets are the hard items), PID-1 vs daemon-mode split (single <code>pid1_magic</code> gate; per-user mode is the natural non-PID-1 analogue), and launchctl + control protocol (25 subcommands, <code>launch_msg</code> over Unix socket, CFPropertyList plist parsing). Phases I1 (build + exec only, <code>LAUNCHD-BUILD-OK</code>), I2 (core functionality with multiple test daemons: KeepAlive, StartInterval, WatchPaths, Sockets), then explicit user checkpoint before any PID 1 work.</span>
</li>
<li>
<a href="freebsd-libxpc-plan.html?v=20260514">freebsd-libxpc — porting Apple XPC onto our mach.ko</a>
<span class="desc">Phased porting plan for libxpc on FreeBSD. Phase 0 starts with a libdispatch Mach backend (new <code>event_mach_freebsd.c</code> shipped as a patch to gershwin-developer); subsequent phases fork libxpc from ravynOS's tree, add a bootstrap server, swap freebsd-launchd's daemon for a clean Apple <code>launchd-842.92.1</code> import, build a hybrid CoreFoundation library, and finally bring up configd. Audits related daemons (asl, notifyd, mDNSResponder, IPConfiguration, DiskArbitration). NSXPCConnection documented as a downstream GNUstep contribution.</span>
<ul>
<li>
<a href="freebsd-libxpc-foundation-spike.html?v=20260514">Foundation / CoreFoundation spike for freebsd-libxpc</a>
<span class="desc">Companion spike: which Foundation and CoreFoundation implementations do downstream daemon ports actually need? Compares GNUstep <code>libs-corebase</code>, Apple CF-Lite-1153.18 (2015), and swift-corelibs-foundation's CoreFoundation. Per-port symbol audit: configd (12,968 CF calls, 42 CFMachPort sites), SystemConfiguration framework (6,925 CF, 0 NS), asl/notifyd/libnotify (zero CF). Recommends hybrid: GNUstep value-type CF + a supplementary <code>libCFRuntime.so</code> sourced from swift-corelibs CF for the runtime parts (CFMachPort, CFRunLoop v1, CFPreferences, CFBundle plugin loader). libgnustep-base for Foundation; no swift-corelibs Foundation.</span>
</li>
<li>
<a href="freebsd-libxpc-libdispatch-mach-spike.html?v=20260514">libdispatch Mach backend spike for freebsd-libxpc</a>
<span class="desc">Why we need to patch libdispatch on FreeBSD: empirical grep shows 5+ components use <code>DISPATCH_SOURCE_TYPE_MACH_RECV</code> (libxpc, libnotify, notifyd, notifyutil, SystemConfiguration framework). Three options analyzed: patch libdispatch once, polling threads per consumer, or a small bridge library. Recommends Option 1. Includes the comprehensive "all in-scope apps" dispatch-dep matrix, the existing gershwin kqueue performance patches we inherit, install-path comparison (<code>/System/Library/Libraries</code> vs <code>/usr/lib</code> vs <code>/usr/local/lib</code>), Block.h coordination with FreeBSD pkgbase.</span>
</li>
<li>
<a href="freebsd-libxpc-install-layout-spike.html?v=20260514">Install layout spike — per-component paths across four layouts</a>
<span class="desc">Per-component install-path matrix for every component we port: <code>mach.ko</code>, libmach, libdispatch, libxpc, liblaunch, launchd (+launchctl), asl family (syslogd + aslmanager + libasl + syslog), notifyd (+libnotify + notifyutil), configd (+scutil + SystemConfiguration framework + plugins), CoreFoundation hybrid, mDNSResponder, IPConfiguration (+ipconfig + bootpd + helpers), DiskArbitration (framework + daemon + agent), Block.h, GNUstep stack. Four columns: Apple macOS / <code>/usr/lib/system/</code> (Apple-like) / Gershwin <code>/System/Library/</code> / FreeBSD base <code>/usr/lib</code>. Documents project policies: <code>/Local/Library</code> never <code>/Library</code>; GNUstep core always at <code>/System/Library/</code>; <code>/System/Applications/</code> for system .app bundles; gershwin conditional-skip pattern; <code>/System/Library/Tools/</code> as daemon alternative on every binary.</span>
</li>
</ul>
</li>
<li>
<a href="freebsd-mach-kmod-syscall-slots-spike.html?v=20260514">mach.ko syscall slot expansion — audit plan <span class="pill pill-warn">In review</span></a>
<span class="desc">freebsd-launchd-mach has wired 10 Mach syscalls into FreeBSD’s reserved <code>lkmnosys</code> slot range (210–219); adding an 11th fails with <code>ENFILE</code>. Forward-demand estimate puts total Mach syscalls at 30–40 by the time launchd+configd+notifyd+asl are ported. This is an <strong>audit plan</strong>, not a design decision: outlines why the 10-slot limit exists, what Apple does differently (separate <code>mach_trap_table</code> with negative syscall numbers), the risk profile of each expansion path (RESERVED-slot claiming, multiplexer dispatcher, base-kernel patch), and the four sub-agent audits to run before picking a path.</span>
</li>
<li>
<a href="freebsd-apple-userland-cmds-plan.html?v=20260514">freebsd-apple-userland-cmds — porting Apple userland onto FreeBSD</a>
<span class="desc">Data-grounded audit of six Apple userland repos (bootstrap_cmds, file_cmds, shell_cmds, system_cmds, network_cmds, text_cmds) for the question "should we replace FreeBSD's version with Apple's?". Decision rule: port if Apple's version gives Mach IPC integration, libxpc/libdispatch/launchd integration, or a real feature advantage over the FreeBSD equivalent; skip if not. Bootstrap_cmds and network_cmds are the items that earn their keep alongside the v2 mach + launchd stack.</span>
</li>
<li>
<a href="freebsd-hardware-registry-iokit-plan.html?v=20260516c">freebsd hardware registry + IOKit userland — porting plan <span class="pill pill-warn">Draft</span></a>
<span class="desc">FreeBSD-devd + FreeBSD-devmatch were removed at commit <code>88694f0</code>, leaving no kldload-on-nomatch and no notification mechanism for hardware events. This plan builds <code>hwregd</code> as a registry-first cohesive block: <strong>Phase 0</strong> (~3-4 wk) lifts devmatch's <code>search_hints()</code> parser into a daemon that reads <code>/dev/devctl</code> directly, kldload's on <code>?nomatch</code>, and emits Mach events. <strong>Phase 1</strong> (~5-6 wk) grows it into a full IORegistry + IOKit-shape Mach-RPC API. Then <code>HardwareMatch</code> launchd plist key (~1.5 wk) + IOKitUser facade K1+K2 (~6 wk). At step 4 devd+devmatch are fully replaced and <code>ioreg -l</code> works — <strong>this is the foundation block, ~4 months</strong>. Then a demand-driven decision point: configd+IPConfiguration (~7 wk, network mgmt) vs. powerd+IOKitUser K3 (~4 wk, power mgmt) vs. cuse-backed DriverKit-shape framework (~4-8 mo, native userspace drivers). Verdicts on related paths: kernel kext support <strong>skip</strong> (3-5 yr ABI emulation diversion); Apple DriverKit binary compat <strong>defer</strong> (8-18 mo).</span>
</li>
<li>
<a href="freebsd-configd-plan.html?v=20260514">FreeBSD configd — porting plan</a>
<span class="desc">Companion to launchd. Ports Apple's configd as <code>netconfigd</code>: one daemon owns network state, hostname, DNS. Drops Mach IPC for GNUstep Distributed Objects; libdispatch for kernel events.</span>
<ul>
<li>
<a href="freebsd-ipconfiguration-plan.html?v=20260514">FreeBSD IPConfiguration — porting plan</a>
<span class="desc">Eventual replacement for dhcpcd. Ports Apple's IPConfiguration as a netconfigd plugin (DHCPv4 + DHCPv6 + IPv4LL + RA, ~57k LOC, 6-9 person-months). Currently <strong>deferred</strong> — dhcpcd works, the cost-benefit doesn't justify the port until netconfigd Phase 2-3 ships and a real reason surfaces.</span>
<ul>
<li>
<a href="freebsd-wifi-management.html?v=20260514">FreeBSD WiFi management — Apple stack research</a>
<span class="desc">What macOS uses for WiFi (it's not <code>wpa_supplicant</code>): <code>wifid</code> + <code>Apple80211</code> + <code>CoreWLAN</code>, mostly closed source. Only the <code>eap8021x</code> EAP/802.1X code is open. We ship <code>wpa_supplicant</code> from ports; sketches a hypothetical <code>wifid-fbsd</code> wrapper if Apple-shape API symmetry ever matters.</span>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="freebsd-asl-plan.html?v=20260514">FreeBSD ASL — porting plan</a>
<span class="desc">Apple System Logger replacing FreeBSD's <code>/usr/sbin/syslogd</code>. Structured log records (Sender/Facility/PID/Time queries without grep), binary-store + BSD-text dual output (<code>tail /var/log/messages</code> still works).</span>
</li>
<li>
<a href="freebsd-notifyd-plan.html?v=20260514">FreeBSD notifyd — porting plan</a>
<span class="desc">Apple's lightweight named-event pub/sub bus (<code>libnotify</code> + <code>notifyd</code>). Cross-process event coordination for gershwin desktop — theme changes, network state, power events — via the same C API Apple-derived apps already speak.</span>
</li>
<li>
<a href="freebsd-hostnamed-plan.html?v=20260523">FreeBSD hostnamed — porting plan <span class="pill info">v0 draft</span></a>
<span class="desc">Stops shipping <code>FreeBSD/amd64 (Amnesiac)</code> as the Bonjour name. Clean-room daemon that synthesizes a hardware-derived default at first boot (<code>ThinkPad-T420-8AB123</code>, <code>Mac-mini-F12345</code>, …) from <code>kenv</code> + SMBIOS, sets <code>kern.hostname</code>, and publishes Apple's three-name shape (<code>ComputerName</code> / <code>LocalHostName</code> / <code>HostName</code>) to configd's <code>SCDynamicStore</code> so mDNSResponder has a real <code>.local</code> name to announce. Hybrid source: vendors Apple's <code>Plugins/IPMonitor/set-hostname.c</code> (~500 LOC, APSL 2.0) for the precedence/DHCP-option-12/reverse-DNS pipeline; clean-rooms the hardware-synthesis fallback that fills Setup Assistant's role on real Macs. Standalone (not a configd plugin) because this repo's <code>configd</code> has no <code>.bundle</code> loader yet — same trade <code>hwregd</code> / <code>ipconfigd</code> / <code>diskarbitrationd</code> already took.</span>
</li>
<li>
<a href="freebsd-mdnsresponder-plan.html?v=20260514">FreeBSD mDNSResponder — porting plan</a>
<span class="desc">Bonjour / zeroconf service discovery: <code>.local</code> hostnames, automatic printer / file-share discovery on the LAN. Surprise win — Apple's source already has a cross-platform <code>mDNSPosix</code> layer with zero Mach surface; the port is mostly a configuration exercise.</span>
</li>
<li>
<a href="freebsd-disk-arbitration-plan.html?v=20260514">FreeBSD DiskArbitration — porting plan</a>
<span class="desc">Disk attach/detach events, mount/unmount/eject coordination, mount-policy approvals. Replaces ad-hoc <code>kqueue(EVFILT_FS)</code> polling with Apple's clean event API. Workspace File Viewer's "Devices" sidebar wants this. The hard one: replaces IOKit with <code>libgeom</code> + <code>devctl(4)</code>.</span>
</li>
</ul>
</li>
</ul>
<h2>Volunteer Projects</h2>
<ul class="guides">
<li>HexBSD 2025–present —
<a href="https://github.com/search?q=org%3Ahexbsd+author%3Apkgdemon&type=commits&s=author-date&o=asc">Commits</a>
<span class="desc">A native macOS application, written in Swift, for managing FreeBSD servers.</span>
</li>
<li>Gershwin 2025–present —
<a href="https://github.com/search?q=org%3Agershwin-desktop+author%3Apkgdemon&type=commits&s=author-date&o=asc">Commits</a>,
<a href="https://github.com/search?q=org%3Agershwin-desktop+author%3Apkgdemon&type=pullrequests&s=updated&o=asc">Pull Requests</a>
<span class="desc">A GNUstep-based desktop environment.</span>
</li>
<li>GNUstep 2024–present —
<a href="https://github.com/search?q=org%3Agnustep+author%3Apkgdemon&type=commits&s=author-date&o=asc">Commits</a>,
<a href="https://github.com/search?q=org%3Agnustep+author%3Apkgdemon&type=pullrequests&s=updated&o=asc">Pull Requests</a>
<span class="desc">Open-source implementation of the OpenStep / Cocoa frameworks — Foundation, AppKit, and the Objective-C runtime.</span>
</li>
<li>GhostBSD 2015–present —
<a href="https://github.com/search?q=org%3Aghostbsd+author%3Apkgdemon&type=commits&s=author-date&o=asc">Commits</a>,
<a href="https://github.com/search?q=org%3Aghostbsd+author%3Apkgdemon&type=pullrequests&s=updated&o=asc">Pull Requests</a>
<span class="desc">Desktop-focused FreeBSD distribution with a ready-to-use graphical environment.</span>
</li>
<li>FreeNAS/TrueNAS 2015–2022 —
<a href="https://github.com/search?q=org%3Atruenas+author%3Apkgdemon&type=commits&s=author-date&o=asc&p=1">Commits</a>,
<a href="https://github.com/search?q=org%3Atruenas+author%3Apkgdemon&type=pullrequests&s=updated&o=asc">Pull Requests</a>
<span class="desc">FreeBSD-based network-attached storage operating system, with ZFS at its core.</span>
</li>
<li>HelloSystem 2019–2020 —
<a href="https://github.com/search?q=org%3AhelloSystem+author%3Apkgdemon&type=commits&s=author-date&o=asc&p=1">Commits</a>
<span class="desc">FreeBSD-based desktop system designed for simplicity and a Mac-like experience.</span>
</li>
<li>NextBSD 2015–2016 —
<a href="https://github.com/search?q=org%3ANextBSD+author%3Apkgdemon&type=pullrequests&s=updated&o=asc">Pull Requests</a>
<span class="desc">Effort to bring macOS system technologies — launchd, Mach IPC, libdispatch — to a FreeBSD base.</span>
</li>
<li>PCBSD/TrueOS 2013–2018 —
<a href="https://github.com/search?q=org%3Atrueos+author%3Apkgdemon&type=commits&s=author-date&o=asc">Commits</a>,
<a href="https://github.com/search?q=org%3Atrueos+author%3Apkgdemon&type=pullrequests&s=updated&o=asc&p=1">Pull Requests</a>
<span class="desc">Desktop-oriented FreeBSD distribution (later TrueOS), focused on ease of installation and use.</span>
</li>
</ul>
<h2>Sample Projects</h2>
<ul>
<li><a href="https://github.com/pkgdemon/dockerstep">Dockerized GNUstep</a> (2024)</li>
<li><a href="https://github.com/pkgdemon/swift-vm-cli">Swift CLI to boot ISOs with the Apple Hypervisor Framework</a> (2023)</li>
</ul>
<p>More examples, including forks I've contributed fixes to, can be found on
<a href="https://github.com/pkgdemon?tab=repositories">my GitHub</a>.</p>
</body>
</html>