UX review: Dynamic Type fixes + website accuracy & polish#2
Merged
Conversation
The Ask Halen plugin detail view and the Plugin Store's "External"/ "Example" tag used fixed point sizes for reading text (size 8–12), unlike the rest of the app which uses semantic fonts that respect Dynamic Type / Larger Accessibility Sizes. Increasing the system text size left these labels frozen and, in the tag's case, near-illegible at 8pt. - Ask Halen detail: convert hero/description/toggle/privacy text to .caption and .callout; fold the bespoke `cardHeader` into the shared `cardLabel` helper so section labels match every other detail view. - Plugin Store tag: size-8 → scalable .caption2. - Ask Halen palette: add a "Send (⏎)" tooltip on the send button to match the Close and Insert buttons' shortcut hints.
Privacy page was the priority — it claimed "only loopback connections"
and "no auto-updater", but the app ships Sparkle (SUFeedURL =
halen.dev/appcast.xml, automatic daily checks, signed DMGs from GitHub
Releases). An inaccurate privacy page undermines the whole trust pitch,
so this honestly discloses the one outbound connection:
- New "Software updates" section documenting the Sparkle check: what's
fetched (static appcast + signed DMG), EdDSA verification, that no
content/identifiers are sent, and how to disable automatic checks.
- Correct the "only loopback" / "no auto-updater" claims and the
callout ("nothing you write leaves the machine").
- Add a "Last updated" line + meta description fix.
Copy (4 one-word, high-leverage):
- "Plugins for the cursor" → "Tools for the cursor" (less jargon)
- "Halen sits in your menu bar" → "lives" (matches README voice)
- "Apple Silicon only" → "Apple Silicon native" (reframe at the CTA)
- "a small local classifier" → "model" (drop ML jargon)
Demo:
- Rail showed two identical "Word Replacements" chips; relabel the
style path "Banned Words" so it reads as a distinct capability.
- Polish the product-mockup model tags "gemma4:e4b" → "Gemma 4 E4B"
(left the terminal-style swarm tags lowercase, where they belong);
fix the swarm's "gemma4:26b" → "27b" to match the CTA model card.
Remove interactions.js — a stale, unreferenced demo script (the live
demo is the inline script in index.html).
Wiki + README accuracy pass. Privacy (docs/wiki/privacy.md) — same fix already applied to the website: the page claimed egress "all hit localhost" and "no auto-updater", but Halen ships Sparkle (daily check of halen.dev/appcast.xml, signed DMGs from GitHub Releases). - Intro now scopes the promise to "nothing you write leaves the machine" and names the two content-free internet requests. - New "Software-update check" bullet documenting Sparkle (static appcast, EdDSA-verified DMG, empty request body, how to disable). - Drop the false "no auto-updater" claim. - Notifications row: add Ask Halen (clipboard-fallback alerts), which the table omitted. README: - "small bundled model" → "small local model … downloaded once on first use", reconciling the contradiction with the existing "Model weights aren't bundled; they download from Hugging Face". architecture.md: - Stale stats: ~13k → ~20k lines, 168 → 169 tests (verified). - Clarify that the ten in-process plugin classes back the six marketplace entries after the v0.3 merges. getting-started.md: - Notifications section was titled "Meeting Prep only"; Ask Halen and the ;reply drafter also post fallback notifications. index.html: - Revert last commit's swarm tag "gemma4:27b" → "gemma4:26b" to match the code-true Ollama large-tier tag (OllamaInferenceClient maps large → gemma4:26b; getting-started's `ollama pull` uses 26b too).
The CTA model card listed "Gemma 4 27B" — the only 27B reference in the repo. Verified against Google's Gemma 4 release (E2B / E4B / 26B MoE / 31B Dense): there is no 27B. The code's large tier is the 26B MoE (OllamaInferenceClient → gemma4:26b; ModelTier → google/gemma-4-26B-A4B-it, the variant that activates ~4B params per token). Aligns the card with the code and every other surface, all of which already say 26b.
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.
A UX-review pass across the app and the marketing site.
App (Swift)
The codebase already handles Dynamic Type, VoiceOver, and Reduce Motion/Transparency deliberately — these fix the few outliers.
size: 10.5–12) for reading text, so it stayed frozen when the user increases system text size. Converted to semantic.caption/.callout; folded the bespokecardHeaderinto the sharedcardLabel.size: 8— below legible threshold and non-scaling →.caption2.Send (⏎)tooltip to match the Close/Insert shortcut hints.Website
SUFeedURL = halen.dev/appcast.xml, daily checks, signed DMGs from GitHub). Added a Software updates section honestly disclosing the one outbound connection (static appcast + EdDSA-verified DMG, no content/identifiers sent, how to disable), corrected the loopback/updater claims and the callout, and added a "Last updated" line + meta fix.Plugins → Tools(demo H2),sits → lives(manifesto, matches README),only → native(download specs),classifier → model(drops ML jargon).gemma4:e4b → Gemma 4 E4B(left the terminal-style swarm tags lowercase); fixed the swarm's26b → 27bto match the CTA card.interactions.js— a stale, unreferenced demo script.Test plan
index.html/privacy.htmlhttps://claude.ai/code/session_01X7Ph1RYZ13kMwTeeEKe6i8