Releases: aka-kika/WAWE
Releases · aka-kika/WAWE
Release list
WAWE 0.2.0
Added
- Demo recording in the README (
docs/demo.gif) — searching, opening a term, stepping
the four tiers, then Mini mode. Encoded fromdocs/demo.mp4at 680px / 12fps / 128
colours (3.3 MB), the point at which the tier text is still crisp but the file stays
reasonable for a README; the source.mp4is kept alongside it so it can be re-encoded
without re-recording. - Homebrew distribution.
scripts/brew-cask.shhashes the release DMG and writes a
cask into thehomebrew-wawetap, sobrew install --cask waweworks and
brew upgradekeeps it current. README documents the release sequence. - New app icon: a W drawn as four strokes. A capital W has exactly four strokes and
WAWE has exactly four disclosure tiers, so each stroke carries one tier's own
light-mode accent colour — What It Is (slate blue), Analogy (sand), Why It Matters
(coral), Example (dusty lilac) — on a cream superellipse plate. The old icon was a
book-plus-{ / }mark: a squircle nested inside another squircle, near-monochrome
grey on black with none of the brand palette, illegible below ~64px, and describing
"code book" rather than anything the app now is.- Artwork is generated by
scripts/make-icon.swiftrather than checked in as an
opaque binary, so it stays reproducible and in step withTheme.swift. - The plate is a true superellipse (n≈5) inset like a real macOS icon, not a rounded
rectangle filling the canvas — the usual tell of a hand-rolled icon. - Menu-bar glyph redrawn as the same W, monochrome template so macOS tints it.
- Artwork is generated by
PointerArming— hover highlighting only lights up once the pointer has physically
moved, and disarms on any keystroke. Without it,onHoverfires when rows scroll under
a stationary pointer during↑/↓navigation, so the mouse would silently steal the
highlight from the keyboard. (Technique borrowed from
Tinycast'sarmedHover, AGPL-3.0 — the idea,
not its code.)AppState.select(_:)andAppState.openTerm(at:)— pointer equivalents of↑/↓
andEnter.selectclamps;openTermignores an out-of-range index rather than
opening a neighbour.VERSIONfile as the single source of truth for the release version, read by
build-app.sh,release-dmg.sh, andbrew-cask.sh. The version had already drifted
once by being duplicated across scripts.- Tests for pointer selection, the
Escladder, andsetQueryidempotency — suite is
now 49.
Changed
- Settings rebuilt as three tabs — General, Glossary, About — replacing one long
scrolling form whose largest section was a six-button grid of glossary actions.- General: hotkey, window style, panel size, theme, the two toggles, and a reset.
- Glossary: term count, a primary Edit Terms… action, three quiet links
(Reload · Copy Template · Reveal in Finder), the file path, and a destructive reset. - About: the icon, version, the name spelled out in the four tier colours, and links
to GitHub, the issue tracker, akakika.com, undrdr.com and @akakikaaa — split into a
project row and a maker row, since one row of five wrapped badly at larger text
sizes. The tier list sits in a bordered card so
its left alignment reads as deliberate inside otherwise-centered content, and the
leftover height is split evenly above and below the identity group rather than
collapsing into one large gap above the footer.
Escnow unwinds one layer per press instead of two. Typing a search and pressing
Escused to close the whole overlay, throwing the query away — the one place the
otherwise-consistent Back behavior didn't apply. The ladder is now: focused term →
result list → clear the query → dismiss. A typed search can no longer be lost to a
single keypress, and the footer hint reads "Back" until there is genuinely nothing
left to unwind. The decision lives inAppState.backStep(pure and tested), so both
the overlay and mini controllers just switch on it.- Minimum macOS raised from 14 to 26 (Tahoe), and the toolchain baseline to
Xcode 27 / Swift 6.4. SwiftPM tools-version bumped to 6.2 (required for.macOS(.v26)).
Deliberately not macOS 27 — Golden Gate is in public beta and doesn't ship until
~September 2026, so targeting it would mean shipping to almost nobody.
Removed
- The "Add Built-ins" settings button.
bootstrap()already merges new built-ins on
every launch, so the button only repeated what had already happened.
Fixed
- Clipboard auto-load works again. Copying a term and summoning left you on the
browse list instead of that term. The read and the matching were both fine —
resolve(clipboard:)opened the right term, and then the search field immediately
threw it away. SwiftUI writes aTextField's current value back through its binding
when the field gains focus,SearchBarpassed that straight tosetQuery, and
setQueryunconditionally forcesmode = .list; focusedTerm = nil. It is now a no-op
when the text hasn't actually changed, so a stray write can't discard a focused term. - Mini mode is legible in dark mode. Mini deliberately rides on the popover's native
material rather than its own backdrop, but in dark mode that material is translucent
enough that a light window behind it washed out the text, and the disclosure block's
8%-alpha tint disappeared entirely. AddedTheme.miniScrim(dark-mode only, so light
mode is untouched) and appearance-awareTheme.blockFill/blockStrokethat roughly
double the block's alpha in dark mode. - Clicking a result now opens it. The rows had a
contentShapebut no tap gesture
at all, so the list was keyboard-only — you could scroll to a term with the mouse and
then had no way to select it. Rows now respond to a click, and show a faint hover
highlight (Theme.rowHover) that stays visually subordinate to the keyboard selection. ↑/↓no longer make the whole list lurch. The scroll-follow used
scrollTo(index, anchor: .center), which re-centered the viewport on every
keypress — so pressing↓once from the top scrolled the list several rows to put
the new selection in the middle. Now it scrolls the minimum needed to bring a row into
view, and doesn't move at all while the row is already visible.- Search results no longer render duplicated or stale rows. Each row carried an
explicit.id(index)on top ofForEach'sid: \.element.id. An explicit.id()
replaces structural identity, so once the query changed and index 1 came to mean a
different term, SwiftUI reused the old row — searchingmccould show "Microservices"
and "API" twice, draw the selection bar on two rows at once, and rank the wrong term
first. Identity is now the term id throughout, andScrollViewReaderscrolls by term
id to match. This also explains↑/↓seeming to need several presses while
searching: the selection was moving, but the highlight was being painted onto a
recycled row showing the wrong term. - Hover highlight no longer sticks to a stale row. Hover was tracked by row index,
which stays valid across a change in results and simply starts pointing at whatever
lands in that slot — so typing left a highlight stranded on an unrelated row. It is now
keyed by term id, and cleared outright whenever the result set changes. - Keyboard input now reliably disarms the hover highlight.
PointerArmingwatched
for.keyDownin its own local event monitor, but a local monitor that returnsnil
ends the dispatch chain — and the key handler returnsnilfor every key it consumes
(arrows,Esc,Enter,Space,⌘C). Each controller's key monitor now calls
pointer.disarm()explicitly, so it no longer depends on monitor ordering. build-app.shprinted the wrong hotkey on success (⌥Space, from before the
default moved to⌥Esc).
Changed (rename)
- Renamed the app from Glossary to WAWE. "Glossary" is a generic, heavily-used
name that said what the app contains rather than what it does. WAWE is the four
disclosure tiers themselves — What It Is · Analogy · Why It Matters ·
Example — so the name is the product's structure. The rename covers the app
name, bundle id (com.kika.glossary→com.kika.wawe), SwiftPM package and targets
(GlossaryCore→WAWECore,Glossary→WAWE), source/test directories, build
scripts, and all docs. The domain vocabulary is deliberately unchanged: the app still
holds a glossary, so theGlossarytype,GlossaryLibrary,glossary.json, and
the Glossary settings tab keep their names. - Term library moved to
~/Library/Application Support/WAWE/glossary.json. On first
launch after the rename, an existingGlossary/glossary.jsonis copied across
automatically, so custom terms and edits survive. The old file is left in place
untouched rather than moved, so nothing is lost if the copy fails.
Added
- Seed glossary expanded from 54 to 147 terms (+93). New coverage across:
- AI/LLM — LLM, Token (AI), Prompt, Context Window, Embedding, Vector Database,
RAG, Fine-Tuning, Hallucination, Inference, Training, Model Weights, Temperature,
AI Agent, System Prompt, Multimodal, Quantization, Local Model, Transformer, Eval. - Dev practice — Bug, Refactoring, Branch, Commit, Merge Conflict, Fork, Dependency,
Package Manager, Linter, Unit Test, Staging Environment, Rollback, Feature Flag,
Technical Debt, Boilerplate, Semantic Versioning, Code Review. - Data — Database, SQL, Database Index, Migration, Query, Primary Key, Big O, ETL.
- Security — Hashing, Salt, 2FA, SSL Certificate, Public/Private Key, Phishing,
CORS, SQL Injection, XSS, Zero-Day, CVE, Penetration Test. - Web — HTML, CSS, JavaScript, DOM, SPA, SSR, WebSocket, Responsive Design,
Access...
- AI/LLM — LLM, Token (AI), Prompt, Context Window, Embedding, Vector Database,
Glossary 0.1.0
Keyboard-first macOS menu-bar glossary — first public release. 📖
Highlights
- Global summon —
⌥Esc(rebindable), centered Overlay or compact Mini menu-bar mode - Fuzzy search with usage-aware (frecency) ranking
- Single-key disclosure —
Spacereveals each block, then closes them - Clipboard auto-load,
Cmd+Ccopy, full keyboard control - Light / Dark / System theming (KIKA palette)
- Add your own terms via an editable JSON file — no rebuild; new built-ins merge in on update
- 54 seed tech terms
Install
- Download
Glossary-0.1.0.dmg, open it, drag Glossary to Applications. - Launch it (look for the
{ / }icon in the menu bar), then press ⌥Esc.
⚠️ Not yet notarized (ad-hoc signed). On first launch macOS will warn it's from an unidentified developer. Right-click the app → Open, or run:xattr -dr com.apple.quarantine /Applications/Glossary.appA signed & notarized build is coming.
Requires macOS 14+ · Apple Silicon.