57 Commits
Author SHA1 Message Date
james.maesandClaude Sonnet 4.6 878aa28b31 feat(widgets): LocalNetwork widget — Bonjour scanner + CoreLocation place name
Adds a real-data LocalNetworkWidget to the HUD showing the Mac's approximate
location (city/region via CLGeocoder reverse-geocode), the user's phone presence
on the LAN (● HERE / ○ AWAY via Bonjour NWBrowser matching configured name
patterns), and a live list of Bonjour-advertising LAN devices (iPhones, iPads,
Macs, Apple TVs, HomePods, etc.) with a total count.

All data is real — NWBrowser browses 13 service types continuously;
CoreLocation supplies GPS coordinates reverse-geocoded to a place name.
On first launch, macOS will prompt for Location Services permission; the widget
gracefully shows "(awaiting permission)" until granted. Bonjour discovery is
async — the device list starts empty and populates within a few seconds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:41:22 -05:00
james.maesandClaude Sonnet 4.6 b892d574e6 feat(widgets): add force-directed graph, network topology, and wireframe icosahedron
Phase 1 — ForceGraphWidget + Graph.metal: 10-node physics simulation with
spring/repulsion forces, status-coded glowing nodes (ok/warn/err), and
live edge rendering. Procedural fullscreen-quad shader.

Phase 2 — NetworkTopologyWidget + Topology.metal: fixed hub-and-spoke layout
(8 nodes, 11 edges) with animated cyan flow pulses traveling along each edge
at Theme.Tick.topologyFlowSpeedPerSec. Status flips for visual variety.

Phase 3 — WireframeModelWidget + Model.metal: rotating 3D wireframe icosahedron
(12 verts, 30 edges) with Y-axis rotation, X-axis tilt, depth-faded edge
brightness, and a centered glow pivot. Rotation rate from Theme.Tick.

Phase 4 — Three widgets wired into HUDWindowController: backdrop NSVisualEffectView
per widget, included in setMode(.full) scene array, staggered reveal at 1.9/2.1/2.3s.
Theme.Layout + Theme.Reveal + Theme.Tick constants added for all three.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:28:17 -05:00
james.maesandClaude Sonnet 4.6 c2e14b84cd docs: add README, MIT LICENSE, contributing guide, and GitHub issue/PR templates
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:05:08 -05:00
james.maesandClaude Sonnet 4.6 f946006bc5 feat(menu): three-mode menu (Full / Compact / Hidden) with hotkeys 1/2/3
Replace single onToggle callback with onFull/onCompact/onHidden callbacks in
StatusItemController. Menu now shows three explicit items — Full HUD (1),
Compact orb only (2), Hide HUD (3) — wired directly to setFull/setCompact/
setHidden on HUDWindowController via AppDelegate.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:21:18 -05:00
james.maesandClaude Sonnet 4.6 0582e5ae32 feat(controller): three-state visibility — Full / Compact / Hidden
Introduce HUDMode enum (full/compact/hidden) and refactor HUDWindowController
to hold persistent strong references to all elements. setMode() is the single
code path for scene construction: full shows everything, compact shows only the
orb repositioned to the lower-right corner, hidden orders the window out.
Expose cycleMode(), setFull(), setCompact(), setHidden() for menu and future use.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:19:54 -05:00
james.maesandClaude Sonnet 4.6 c2a9db50bd feat(orb): orb shader supports a center offset uniform
Add center (float2) and _pad (float) to OrbUniforms so the orb can render
at any position rather than always at screen center. Update OrbElement.swift
to expose a center property and pass it through to the fragment shader.
Add Theme.Orb.compactCenter and Theme.Orb.compactRadius for the lower-right
corner placement used in compact mode.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:17:33 -05:00
james.maesandClaude Sonnet 4.6 ca75510d80 refactor: centralize all tunable visual + timing parameters in Theme.swift
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 11:48:30 -05:00
james.maes f3bc83cf9d style(schedule): bump font 13pt → 36pt so countdown row fills the strip 2026-05-14 11:19:05 -05:00
james.maes ff247d11f7 fix(ticker): smooth sub-pixel scroll via per-frame CTLineDraw at fractional x 2026-05-14 11:01:34 -05:00
james.maes 76b35e25db style(backdrops): dark tint layer over the blur (Jarvis-dark regardless of desktop content) 2026-05-14 10:53:30 -05:00
james.maes a2f3b9532a style(backdrops): .hudWindow + vibrantDark (Jarvis-style dark frosted glass with heavy blur) 2026-05-14 10:51:12 -05:00
james.maes f54d897a2a style(backdrops): .sidebar material + vibrantLight (lighter, more transparent, heavier blur) 2026-05-14 10:46:08 -05:00
james.maes b856435a02 fix(frame): drop softGlow halo on widget frame (was reading as shadow outside chamfered shape) 2026-05-14 10:43:58 -05:00
james.maes d7beff5a02 fix(backdrops): swap to .fullScreenUI material (eliminates .hudWindow top-rim highlight) 2026-05-14 10:39:48 -05:00
james.maes 20c0dbc27b fix(backdrops): double the chamfer leg to match Metal SDF (cut is 2*notchSize, not 1*notchSize) 2026-05-14 10:37:29 -05:00
james.maes 42bb7ea106 fix(backdrops): clip NSVisualEffectViews to chamfered shape so corners don't peek past Metal frame 2026-05-14 10:33:57 -05:00
james.maesandClaude Sonnet 4.6 7d2eb8edf5 style(widgets): remove shader panel (NSVisualEffectView provides backdrop now)
Deletes the dark-panel composite block (panelAlpha=0.62) from widget_fragment
since the native NSVisualEffectView behind the window now provides the
content-aware blurred backdrop. Hex grid edge alpha dialed from 0.22 to 0.14
for cleaner readability against the blur material.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 10:30:38 -05:00
james.maesandClaude Sonnet 4.6 ce37529efd feat(window): NSVisualEffectView backdrop per widget (blur behind, on top of which the MTKView draws)
HUDWindow now owns a transparent container view. HUDWindowController iterates
all FramedHUDWidget elements and inserts one NSVisualEffectView (.hudWindow
material, .behindWindow blending, .active state, cornerRadius 4) per widget
before adding the MTKView on top, ensuring correct subview z-order.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 10:29:28 -05:00
james.maesandClaude Sonnet 4.6 929ce6d1af feat(render): add FramedHUDWidget protocol for backdrop placement
Introduces FramedHUDWidget sub-protocol of HUDElement exposing origin/size
in screen-normalized coords. All 8 framed widgets (KPI, LLM, WorldClocks,
LogStream, TaskList, Compass, ScheduleStrip, StatusTicker) now conform.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 10:28:10 -05:00
james.maes 99278f3efc fix(widgets): dark translucent panel backdrop + bump hex grid alpha (readable on any desktop) 2026-05-14 10:21:46 -05:00
james.maes cbdc8c97ab fix(glitch): only arm fire-time on first threshold crossing, reset after burst 2026-05-14 10:16:52 -05:00
james.maes 6d8efdf5be fix(layout): inset text inside widget chamfered frame (chamfer back to 10%, text inset 10% of smaller dim) 2026-05-14 09:54:48 -05:00
james.maes 7adac62ec7 fix(widgets): smaller chamfer + remove divider + dial down flash + glitch every ~10min 2026-05-14 09:48:27 -05:00
james.maesandClaude Sonnet 4.6 531558434d style(post): RGB-split glitch sweep every 10-15s
Adds a two-pass render path: scene → intermediate MTLTexture, then glitch fragment samples R/G/B channels with slight horizontal offsets. Fires for ~150ms once per 12s period. Normal single-pass path used when no glitch is active.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:37:16 -05:00
james.maesandClaude Sonnet 4.6 aab647fe8f style(boot): staggered widget reveal sequence on app launch
All 8 text widgets have revealDelay/revealStart guards; orb+ornament+rings appear immediately. Widgets pop in 200ms apart starting at 0.3s.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:33:30 -05:00
james.maesandClaude Sonnet 4.6 9ca4448fbd style(kpi): inline sparklines for each KPI value
Adds rolling 20-sample history to KPI struct, an extraDraw overload to TextRasterizer, and CG-path sparklines drawn right-aligned in KPIClusterWidget. Other widgets not modified.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:28:10 -05:00
james.maesandClaude Sonnet 4.6 37c2505d4d style(widgets): reactive frame flash on content change
Replaces _pad1 with flashAge in all widget Uniforms structs (layout preserved). Shader uses exp(-flashAge*6)*0.6 to briefly boost frame brightness on rebuild.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:24:12 -05:00
james.maesandClaude Sonnet 4.6 8ced47e174 style(widgets): per-widget hex micro-readout in bottom-right
Applied to 7 text widgets (StatusTickerWidget skipped — scroll logic). Micro-ID is right-aligned 9pt dim cyan using ObjectIdentifier hash.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:08:57 -05:00
james.maesandClaude Sonnet 4.6 565291072f style(widgets): header divider line + pulsing LED indicator
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:05:20 -05:00
james.maesandClaude Sonnet 4.6 bf02d1423c style(widgets): subtle hex grid background inside body
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:04:07 -05:00
james.maesandClaude Sonnet 4.6 cbc3a8c18c style(orb): saturate core, brighten swirl gradient
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:03:00 -05:00
james.maesandClaude Sonnet 4.6 51b28ded39 fix(tasks): cycle DONE back to PENDING to keep workload alive
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:02:06 -05:00
james.maesandClaude Sonnet 4.6 40477be334 fix(layout): widen text-heavy widgets to accommodate bar gauges
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 09:01:20 -05:00
james.maesandClaude Sonnet 4.6 85676b2648 style(font): bundle Share Tech Mono (body) + Orbitron Bold (titles)
Downloads ShareTechMono-Regular.ttf and Orbitron-Bold.ttf from Google
Fonts and bundles them via xcodegen resources build phase. Info.plist
gains ATSApplicationFontsPath="" for auto-loading from Resources root.

All widget body text now uses ShareTechMono-Regular (12-13pt); header
lines use Orbitron-Bold (13pt). Widgets with single-font text blocks
are split into NSMutableAttributedString with separate title/body attrs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 06:49:53 -05:00
james.maesandClaude Sonnet 4.6 f21d246355 style(widgets): inline bar gauges for KPI and LLM context
KPIClusterWidget: adds 10-segment unicode bar (▰▱) before each KPI
percentage value. LLMTelemetryWidget: replaces CTX raw token count with
a fill-fraction gauge + percentage for instant visual scanning.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 06:42:49 -05:00
james.maesandClaude Sonnet 4.6 6f4dffffb1 style(widgets): cut corner frames, scanline drift, text glow
Widget.metal fragment shader now:
- Chamfers TL and BR corners at 45° using SDF half-plane cuts (10% notch)
- Adds soft cyan halo around text glyphs (0.35x alpha contribution)
- Animates a thin scanline band drifting down each widget over ~12s cycle

WidgetUniforms.time field replaces _pad0 in Metal struct and all 8 Swift
Uniforms structs; context.time passed through in every encode call.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 06:40:41 -05:00
james.maesandClaude Sonnet 4.6 b31d5cc2ff style(layout): contain all widgets inside bracket safe-area
Adjusted origin/size for all 8 positional widgets to align with the
bracket inner-corner safe-area boundaries per design spec.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 06:33:27 -05:00
james.maesandClaude Sonnet 4.6 243f1f13d0 feat(widgets): SpectrumBarsWidget — 32 dancing bars above orb
Adds Spectrum.metal shader (upper-hemisphere arc of 32 bars with perlin-flavored
noise at 30 Hz), SpectrumBarsWidget Swift element, spectrum pipeline in Pipelines.swift,
and wires the widget into the HUDWindowController scene.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 18:33:18 -05:00
james.maesandClaude Sonnet 4.6 f5ad6d62ea feat(widgets): VitalsRingWidget — battery/temp/fan arcs around orb
Adds Vitals.metal shader with three arc-gauge rings (battery, CPU temp,
fan RPM) rendered as radial overlays just outside the orb. Introduces the
vitals MTLRenderPipelineState in Pipelines.swift and inserts
VitalsRingWidget into the scene immediately after OrbElement.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 18:28:17 -05:00
james.maesandClaude Sonnet 4.6 67bd79b904 feat(widgets): StatusTickerWidget scrolling right-to-left
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 18:24:24 -05:00
james.maes e8e1d4be08 feat(widgets): ScheduleStripWidget with countdowns + flash on fire 2026-05-13 18:22:16 -05:00
james.maes f2daee7371 feat(widgets): CompassWidget with bearing tape 2026-05-13 18:20:19 -05:00
james.maes 8bf08cbcb2 feat(widgets): TaskListWidget with status dots + animated progress 2026-05-13 18:18:23 -05:00
james.maes ab7c15737b feat(widgets): LogStreamWidget (color-coded mock log stream) 2026-05-13 18:15:21 -05:00
james.maes db529ae0e1 feat(widgets): WorldClocksWidget (NYC/LON/TYO/SYD, 1Hz) 2026-05-13 18:12:41 -05:00
james.maes a1aef00ce6 feat(widgets): LLMTelemetryWidget (tok/s, ctx, cost, latency, model) 2026-05-13 18:10:38 -05:00
james.maesandClaude Sonnet 4.6 1ce11b9dda feat(widgets): KPIClusterWidget (CPU/GPU/MEM/NET, 2Hz mock)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 18:08:10 -05:00
james.maesandClaude Sonnet 4.6 a5741b3ddc feat(render): widget pipeline (textured quad + frame)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 18:04:42 -05:00
james.maesandClaude Sonnet 4.6 efc382a634 feat(text): CoreText→MTLTexture rasterizer wired through FrameContext
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 17:57:19 -05:00
james.maes e71434aad8 feat(render): procedural orb element + orb pipeline 2026-05-13 17:54:09 -05:00