Repository navigation
chore: align halo with the updated homebrew skills - #1002
Merged
Merged
Conversation
coding-style:lint-format makes .editorconfig the cross-language source of truth for indentation and line width. Adding it moves Prettier off its bare 80-column default (it reads max_line_length), so every touched file reflows. Pure formatting — no behaviour change. The hand-written changes ride in the following commits.
Design tokens (themes.ts) had drifted from the canonical colors_and_type.css: - light text.muted #a0a0a0 -> #767676. The old value is ~2.6:1 on white and fails AA; the canonical file calls it out by name. - dark theme brightened: text.main #ededed, muted #9c9c9c, light #6f6f6f. - dark border #1f1f1f -> #3a3a3a. #1f1f1f sat between the body (#0f0f0f) and the surfaces (#1c1c1c/#252525), so dividers and outlined controls vanished. - dark error pink -> #ff8a8a, dark offBackground #404040 -> #4a4a4a. - new onAccent (#1a1a1a) for text on an accent fill (white is ~2.4:1 on it), plus radiusPill, cardPadding and the motion durations. touch-action: manipulation on buttons/labels/summary — kills iOS double-tap-to-zoom, which misfires on quick repeated taps (brightness steppers, view tabs) on a wall panel. Installable PWA: web manifest, the full icon set + scripts/gen-icons.sh to regenerate it from favicon.svg, per-scheme theme-color, and viewport-fit=cover. Icons are full-bleed squares on the light body colour — the OS does its own rounding, and the #525252 ring is invisible on a dark ground. iOS full-height: #root becomes the scroll container and pads off env(safe-area-inset-*), and height is 100vh when installed (html.standalone, set in main.tsx) vs 100dvh in a tab. iOS resolves 100dvh short at cold start in a standalone PWA, leaving a dead band until the device is rotated. Stale-tab guard: frontend and backend ship in one image, so a deploy replaces both and a panel left running serves a stale bundle. A Vite plugin emits version.json holding the baked VITE_HALO_IMAGE_TAG; useDeployReload polls it and reloads on change. Keyed off the image tag, not a semver — a :main rebuild never bumps a semver.
Drop corepack. Yarn is already vendored at .yarn/releases and pinned by yarnPath, so CI and the Dockerfile now invoke it through node. node 25+ ships no bundled corepack, so the old `corepack enable` would have broken on the next node bump — and the Dockerfile needed it on the build step too, not just the install. CI reads node-version-file: frontend/.node-version instead of a hardcoded "24". A literal silently drifts: dependabot bumps the Dockerfile node stage but cannot touch a workflow literal or .node-version. Rust checks widen to the house flags in CI and the pre-commit hook (cargo fmt --all, clippy --workspace --all-targets, test/build --workspace); CI also gained the missing typecheck step. New: cve-scan.yaml (weekly trivy of the :main image, SARIF to the Security tab, report-only; action SHAs resolved fresh), SECURITY.md, a root justfile with a `just dev` that runs both halves and tears them down on one Ctrl-C, and [jobs.check] + background in bacon.toml for the headless dev flow. dependabot gains the docker ecosystem (default-days only — the semver-* keys break parsing for docker and github-actions). The frontend package was still named vite_react_template; renaming it rewrites its workspace entry in yarn.lock.
Mobile is no longer out of scope. The family default is that every app is touch-first and installable; only a deliberately desktop-only app opts out, and halo is a touch panel that also gets opened from phones. Documents the PWA and stale-tab invariants that now back that up, plus `just dev`. The layout section claimed TanStack Router (file-based). There is no router — App.tsx switches views from useState. halo-app-design claimed the lucide migration was done. It is not: 5 files use lucide-react, ~12 still render Material Icons through components/Icon.tsx and index.html still loads both Material stylesheets. Say so, and say new code uses lucide.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Audits halo against the current homebrew skills (
halo-design,spa-frontend,sibling-app,ts-style,lint-format) and closes the drift. Four commits, each reviewable on its own — start with the second; the first is pure reflow.chore: adopt the house .editorconfig and reflow to 100 columnslint-formatmakes.editorconfigthe cross-language source of truth for indentation and line width. Prettier readsmax_line_length, so adding the file moves it off its bare 80-column default and 37 files reflow. No behaviour change — skim it and move on.feat(frontend): align with halo-design + spa-frontendTokens.
themes.tshad drifted from the canonicalcolors_and_type.css. Two of these are live bugs the canonical file names explicitly:text.muted#a0a0a0(~2.6:1 on white, fails AA)#767676border#1f1f1f(invisible between#0f0f0fbody and#1c1c1c/#252525surfaces)#3a3a3atext.main/muted/light#d6d6d6/#8a8a8a/#646464#ededed/#9c9c9c/#6f6f6ferrorpink#ff8a8aactivity.offBackground#404040#4a4a4aonAccent#1a1a1a(white on the accent is ~2.4:1)Plus
radiusPill,cardPadding, and the motion durations.Touch.
touch-action: manipulationon buttons/labels/summary — iOS double-tap-to-zoom misfires on quick repeated taps, which is exactly how a wall panel gets used.Installable. Web manifest, full icon set,
scripts/gen-icons.shto regenerate fromfavicon.svg, per-schemetheme-color,viewport-fit=cover. Icons are full-bleed squares on the light body colour — the OS does its own rounding, and halo's#525252ring is invisible on the template's dark ground.iOS full-height.
#rootbecomes the scroll container and pads offenv(safe-area-inset-*); height is100vhwhen installed vs100dvhin a tab. iOS resolves100dvhshort at cold start in a standalone PWA and leaves a dead band until you rotate the device.Stale-tab guard. Frontend and backend ship in one image, so a deploy replaces both and a panel left running serves a stale bundle. A Vite plugin emits
version.jsonfrom the bakedVITE_HALO_IMAGE_TAG;useDeployReloadpolls it and reloads on change. Keyed off the image tag, not a semver — a:mainrebuild never bumps a semver.chore: align repo tooling with sibling-appCorepack is gone: yarn was already vendored and pinned by
yarnPath, so CI and the Dockerfile now call it through node. This would have broken on the next node bump (node 25+ ships no bundled corepack), and the Dockerfile needed it on the build step too, not just install.CI reads
node-version-file: frontend/.node-versioninstead of a hardcoded"24"— a literal silently drifts, since dependabot bumps the Dockerfile node stage but can't touch a workflow literal.Rust checks widen to the house flags in CI and the pre-commit hook; CI gained the missing
typecheck. New:cve-scan.yaml(weekly trivy, SARIF to the Security tab, report-only, SHAs resolved fresh),SECURITY.md, a rootjustfilewhosejust devruns both halves under one Ctrl-C, and[jobs.check]+backgroundinbacon.toml. dependabot gains the docker ecosystem. The frontend package was still namedvite_react_template.docs: correct halo scope, routing and icon-migration claimsMobile is no longer out of scope — the family default is touch-first and installable, and halo gets opened from phones. Also: there is no TanStack Router (App.tsx switches views from
useState), and the lucide migration is in progress, not done — 5 files converted, ~12 still on Material Icons viacomponents/Icon.tsx.Verification
yarn validateclean, tests pass,cargo fmt/clippyclean with the new flags,podman build --target frontend-buildsucceeds without corepack. Computed styles in the built app confirmbody844px /overflow: hidden,#rootscrolling and positioned,touch-action: manipulationon buttons, and the100vhstandalone rule present. Rendering checked at 1280×900 and 390×844.The installed-PWA behaviour is the one thing not verified on hardware — the skill is explicit that the simulator doesn't reproduce the
100dvhcold-start bug. Worth adding halo to a phone home screen once this lands.SECURITY.mddocuments halo's actual trust boundary: no app auth at all, and the only thing keeping that safe is that its public DNS record resolves to the LAN IP with no port forward, and its Traefik route is deliberately not in_gated_hosts.Deliberately left out
React.FCcomponents → named function declarations (ts-style).node-versionis still 24; bumping it now gets CI for freedockerimage.yamlhas no paths-filter gate and still tagslateston every main push — safe (the Pi pulls:main) but deploy-adjacent, so not changed blindfrontend/e2e-tests/not renamed toe2e/;automerge.yamlstill inlinegh pr mergeyarn formatstill only coverssrc/, so the config files aren't Prettier-checked