Skip to content

docs(changelog): August 2026 — plugin system, voice meme generator, scratchpad editor - #245

Merged
initcore0 merged 1 commit into
mainfrom
docs/changelog-2026-08
Aug 4, 2026
Merged

docs(changelog): August 2026 — plugin system, voice meme generator, scratchpad editor#245
initcore0 merged 1 commit into
mainfrom
docs/changelog-2026-08

Conversation

@initcore0

Copy link
Copy Markdown
Owner

Adds the 2026-08 release entry to docs/changelog/changelog.json and re-renders docs/changelog/changelog.html from it. Docs-only — no source changed.

Scope verified against git log v1.0.18+173..v1.1.0+177 --oneline --no-merges (v1.0.19 → v1.1.0+177), docs/PLUGINS.md, and the real manifest in PluginRegistry.swift rather than from PR intent.

18 entries — 9 features, 6 fixes, 3 improvements. stats.testsPassing = 2685 is the measured swift test count on this tree.

Entry summary (the lede)

The headline: OpenWhisp has plugins — optional add-ons with their own window, their own settings, and their own spoken commands, every one of them off until you switch it on. The first plugin turns a spoken description into a finished meme. Say "create a meme about the deploy that broke everything" and it picks a template from ~300+ (or one of your own imported images), writes captions that fit that template's layout — a four-panel meme gets four captions — renders it on your Mac, and opens an editor where you can drag the caption boxes, change fonts and sizes, and export a PNG. It is fully hands-free from refine: select text anywhere and say "create a meme based on that", or refine with nothing selected and say the whole thing out loud, in English or Russian. The rendering is local — only the blank template image is fetched, and templates you import yourself need no network at all. Also in this release: the Scratchpad became a real editor — a proper note list with titles, dates and snippets, Markdown preview and .md/.txt export, live search with #tags, ⌘F find-in-note with highlighted matches, and two AI actions ("Format as Markdown", undoable with ⌘Z, and "Summarize" into a new note) with their own model override; transcribed files and meetings open in it in one click. Model loading is now visible instead of silently eating your first dictation, the stream overlay can count spoken phrases live for streamers, vocabulary substitutions finally fire on translate sessions, Russian stops being detected as Ukrainian, and ⌘V works everywhere — the app had never installed a main menu, so paste was dead in every window since day one. Everything still runs on your Mac.

The lead story, split three ways

"There are plugins now", "the first one makes memes", and "you can drive it hands-free" are three different things a reader needs, so they're three entries:

  1. Plugins exist — opt-in twice over (ships with the app, but PluginEnablement defaults to empty, so an untouched install runs no plugin code). The networkHosts disclosure is described as a label, not a sandbox — the honest limit docs/PLUGINS.md states — and the note carries the roadmap (out-of-process next, dylibs permanently rejected).
  2. The meme generator — ~300+ templates (Imgflip + memegen.link) plus imported images, ranked candidates, per-template caption slots, verbatim list extraction, manual editor, PNG export, ⌘M. Network use disclosed per-plugin and precisely: api.imgflip.com, i.imgflip.com, api.memegen.link serve only the blank template image; captioning and rendering are local. memegen.link's server-side captioning is deliberately unused, and the entry doesn't claim capability the plugin declines (it declines clipboardAccess).
  3. Hands-free voice commands — both flows (selection → "create a meme based on that"; empty refine → the spoken remainder), EN + RU triggers, and the strict prefix/word-boundary matching that keeps "create a memo about Q3" and "summarize this, then create a meme" out of the plugin.

Remaining entries: Scratchpad quality editor (MAK-95/96/97 · #239), in-note find + query highlighting (#240), AI actions + file-transcript import (MAK-98/99 · #241), model-readiness UX (MAK-94 · #237), stream-overlay voice counter (#232), and the fixes — vocabulary substitutions before translation (#238), ru/uk auto-detect (#235/#238), app-wide ⌘V (#242), per-keystroke Scratchpad saves, "Model: Not checked", and the "in 0s" timestamp.

Every howTo.availability is "live", each checked against the shipping code path per the truth contract in docs/changelog/README.md.

Notes on the render

changelog.html renders only the latest release — its established behavior — so July's entries move out of the reference render and stay canonical in the JSON (which the site consumes). The <style> block and page skeleton are byte-identical; only the content under div.wrap is regenerated. Verified well-formed: zero unclosed/mismatched tags, 9 <details> guides, 6 + 3 plain entries, say-list renders the Cyrillic triggers correctly.

Gates

  • swift test2685 passing, 0 failures (docs-only change; suite untouched)
  • No build needed

Site integration — what's needed to surface this on openwhisp.app

Read-only investigation of ~/projects/mnaboka/openwhisp-site (separate repo, not modified by this PR).

How the site gets the changelog: it does not link or copy changelog.html. The site is Bun + Vite + React 19 + TS + Tailwind v4 (all code under react/), and it renders its own /changelog page from a vendored snapshot of this repo's changelog.json:

  • Page: react/src/ChangelogPage.tsx · route in react/src/routes.tsx · accessor react/src/changelog.ts (import raw from "./data/changelog.json")
  • Vendored data: react/src/data/changelog.json (committed)
  • Sync script: react/scripts/fetch-changelog.mjs, wired as prebuild in react/package.json, so every build refreshes it from
    https://raw.githubusercontent.com/initcore0/openwhisp/main/docs/changelog/changelog.json

⚠️ It fetches from main on GitHub, not from a local checkout — so this PR must be merged first. On fetch failure the script keeps the committed snapshot (non-fatal), which means merging a site PR before this one lands would silently deploy the stale July-only JSON.

Build: bun run build from openwhisp-site/react (dev bun run dev :5173, preview :4173). Toolchain is Bun, not Node — the "homebrew node" note in project memory doesn't match this repo and should be corrected.

Deploy: automatic. .github/workflows/deploy.yml triggers on push to mainbun install --frozen-lockfilebun run build → GitHub Pages (actions/deploy-pages@v4), custom domain via react/public/CNAME (openwhisp.app). A third job mirrors the build to initcore0/openwhisp-mirror. History is 100% squash-merged PRs.

Steps to publish (in order):

  1. Merge this PR to initcore0/openwhisp main.
  2. In the site repo, branch off main; from react/ run bun install && bun run fetch:changelog — expect changelog: updated (2 release(s), generated 2026-08-04). If it says keeping committed snapshot, step 1 hasn't landed; don't hand-edit the JSON as a workaround.
  3. (Optional, recommended) Add a plugins blurb. There's no features data file — features are inline JSX in react/src/App.tsx <section id="features"> (~L306-354), via function Feature({icon,title,children}) (~L748). Icons are @phosphor-icons/react with weight="duotone", imported at the top of App.tsx. The grid is lg:grid-cols-4 with 10 cards today, so adding one leaves a ragged row — add two, or rebalance. For a launch this size the precedent (commit 5d66cb0, stream overlay) is a dedicated spotlight <section> + a homepage card + the changelog.
  4. (Optional) Blog post — posts are TS objects with JSX bodies, not Markdown, all in react/src/blog/posts.tsx (Post = slug, title, description, keyword, datePublished, dateModified, readingTime, answer, body, faq[], related[]). Adding one auto-generates the route, sitemap entry, Atom feed entry, and JSON-LD.
  5. bun run build && bun run preview, check /changelog/; commit react/src/data/changelog.json (+ App.tsx / posts.tsx if touched), not react/dist/.
  6. Open a PR and squash-merge to main — the push deploys to openwhisp.app and the mirror automatically.

The site uses CHANGELOG.generated as the sitemap lastmod for / and /changelog/, so the generated bump to 2026-08-04 in this PR is what refreshes those SEO dates.

🤖 Generated with Claude Code

…cratchpad editor

Adds the 2026-08 release entry covering everything shipped after the
2026-07 entry (v1.0.19 → v1.1.0+177), and re-renders changelog.html from
the JSON.

18 entries — 9 features, 6 fixes, 3 improvements — verified against
`git log v1.0.18+173..v1.1.0+177`, docs/PLUGINS.md, and the manifest in
PluginRegistry.swift rather than from PR intent.

The lead story is the plugin system (#244 / MAK-100) split into three
entries, because "there are plugins now", "the first one makes memes",
and "you can drive it hands-free from refine" are three different things
a reader needs:

- Plugins are opt-in twice over — the pane defaults to nothing enabled,
  and the entry says so, along with the networkHosts disclosure being a
  label rather than a sandbox (the honest limit docs/PLUGINS.md states).
- The meme entry discloses the only network use: api.imgflip.com,
  i.imgflip.com and api.memegen.link serve the blank template image;
  captioning and rendering are local, and imported templates need no
  network at all. memegen.link's server-side captioning is deliberately
  unused, and the entry doesn't claim capability the plugin declines.
- The voice-command entry spells out both flows (selection vs. spoken
  remainder), the EN + RU triggers, and the strict prefix/word-boundary
  matching — the reason "create a memo about Q3" is never eaten.

Remaining entries cover the Scratchpad quality editor (MAK-95/96/97),
in-note find (#240), AI actions + file-transcript import (MAK-98/99),
model-readiness UX (MAK-94), the stream-overlay counter (#232), and the
fixes: vocabulary substitutions before translation (#238), ru/uk
detection (#235/#238), app-wide ⌘V (#242), per-keystroke Scratchpad
saves, "Model: Not checked", and the "in 0s" timestamp.

Every `howTo.availability` is "live" — each was checked against the
shipping code path, per the truth contract in docs/changelog/README.md.

stats.testsPassing = 2685 is the measured `swift test` count on this
tree, not a carried-forward number.

changelog.html renders only the latest release (its established
behavior), so July's entries move out of the reference render and stay
canonical in the JSON. The <style> block and page skeleton are
byte-identical; only the content under div.wrap is regenerated.

Gates: swift test 2685 passing, 0 failures (docs-only change — untouched).

Co-Authored-By: Claude <noreply@anthropic.com>
@initcore0
initcore0 merged commit 4c84e2d into main Aug 4, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant