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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>