Skip to content

Releases: aka-kika/WAWE

WAWE 0.2.0

Choose a tag to compare

@aka-kika aka-kika released this 14 Aug 03:43

Added

  • Demo recording in the README (docs/demo.gif) — searching, opening a term, stepping
    the four tiers, then Mini mode. Encoded from docs/demo.mp4 at 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 .mp4 is kept alongside it so it can be re-encoded
    without re-recording.
  • Homebrew distribution. scripts/brew-cask.sh hashes the release DMG and writes a
    cask into the homebrew-wawe tap, so brew install --cask wawe works and
    brew upgrade keeps 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.swift rather than checked in as an
      opaque binary, so it stays reproducible and in step with Theme.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.
  • PointerArming — hover highlighting only lights up once the pointer has physically
    moved, and disarms on any keystroke. Without it, onHover fires when rows scroll under
    a stationary pointer
    during / navigation, so the mouse would silently steal the
    highlight from the keyboard. (Technique borrowed from
    Tinycast's armedHover, AGPL-3.0 — the idea,
    not its code.)
  • AppState.select(_:) and AppState.openTerm(at:) — pointer equivalents of /
    and Enter. select clamps; openTerm ignores an out-of-range index rather than
    opening a neighbour.
  • VERSION file as the single source of truth for the release version, read by
    build-app.sh, release-dmg.sh, and brew-cask.sh. The version had already drifted
    once by being duplicated across scripts.
  • Tests for pointer selection, the Esc ladder, and setQuery idempotency — 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.
  • Esc now unwinds one layer per press instead of two. Typing a search and pressing
    Esc used 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 in AppState.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 a TextField's current value back through its binding
    when the field gains focus, SearchBar passed that straight to setQuery, and
    setQuery unconditionally forces mode = .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. Added Theme.miniScrim (dark-mode only, so light
    mode is untouched) and appearance-aware Theme.blockFill/blockStroke that roughly
    double the block's alpha in dark mode.
  • Clicking a result now opens it. The rows had a contentShape but 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 of ForEach's id: \.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 — searching mc could 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, and ScrollViewReader scrolls 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. PointerArming watched
    for .keyDown in its own local event monitor, but a local monitor that returns nil
    ends the dispatch chain — and the key handler returns nil for 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.sh printed 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.glossarycom.kika.wawe), SwiftPM package and targets
    (GlossaryCoreWAWECore, GlossaryWAWE), source/test directories, build
    scripts, and all docs. The domain vocabulary is deliberately unchanged: the app still
    holds a glossary, so the Glossary type, 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 existing Glossary/glossary.json is 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...
Read more

Glossary 0.1.0

Choose a tag to compare

@aka-kika aka-kika released this 30 Jun 03:16

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 disclosureSpace reveals each block, then closes them
  • Clipboard auto-load, Cmd+C copy, 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

  1. Download Glossary-0.1.0.dmg, open it, drag Glossary to Applications.
  2. 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.app

A signed & notarized build is coming.

Requires macOS 14+ · Apple Silicon.