Skip to content

0.8.1 — an installer a teacher can run, and a page that stops saying there is none - #102

Merged
peopleworks merged 4 commits into
mainfrom
desktop-installer
Sep 16, 2026
Merged

peopleworks merged 4 commits into
mainfrom
desktop-installer

Conversation

@peopleworks

@peopleworks peopleworks commented Sep 16, 2026

Copy link
Copy Markdown
Owner

The desktop app is for the teacher who wants to open a folder of PDFs. The zip asked that teacher to right-click it, tick Unblock, run Get-FileHash in PowerShell, extract it, and then keep the folder together — because WebView2 needs wwwroot next to the executable, and a teacher who drags the .exe to the desktop ends up with a broken app.

This adds an installer beside the zip, makes it what the page offers first, and releases it as 0.8.1.

The installer

Inno Setup, built on the runner from the same staging folder as the zip, so the two can never carry different files.

  • Per-user, no administrator rights (PrivilegesRequired=lowest, into %LOCALAPPDATA%\Programs). A teacher on a managed school laptop can install it without asking IT.
  • Start menu entry, and an uninstaller registered under the current user — it leaves from Settings → Apps like any other program.
  • English and Spanish wizard; Windows 10 1809 minimum, as the page already promised.
  • No version is written in the .iss. It is passed with /DAppVersion, because the version already lives in seven places ReleaseVersionTests holds together.
  • Both artifacts get a .sha256 and both are attached. The dry run keeps both.

It is unsigned, exactly like the executable inside it, so SmartScreen still warns. The page says so. Only code signing removes that.

Verified, not assumed

On the runner (dry run 35119013341): Inno Setup 6.7.1 is already on windows-latest, and the Spanish wizard file is found. The installer is 57.6 MB against 83.8 MB for the zip — the same 488 files, compressed with LZMA2 instead of the zip's deflate. Nothing is left out.

On a real Windows machine, from that artifact:

Silent per-user install exit code 0
Installed tree vs the zip 488 files each, 0 differences, wwwroot included
Settings → Apps entry present, under HKCU
Start menu shortcut present
Launch app alive after 12 s, window titled Signs of AI Writing
Silent uninstall entry, shortcut and every file removed — 0 left

A running process with its window proves only that WPF started; a WebView2 that could not find wwwroot would show the same window with a blank pane. The evidence that the UI loads is the file comparison: the installed tree is identical to the zip's, paths included, and that tree has worked since desktop-v0.1.0.

The page, which was about to lie three times

The moment an installer exists, three sentences on /download become false: "no installer" under the button, "There is no installer" in the zip notes, and a three-step warning whose middle step was Get-FileHash. Rewritten in both languages:

  1. Run the installer. It installs for you only.
  2. On the warning: More info → Run anyway.
  3. It is in the Start menu; uninstall it from Settings → Apps.

The checksum is still explained, as an option beside the steps rather than an obstacle in them. The size under the button said 80 MB, which was the zip. It now says under 100 MB — true of both files, and not a number that drifts with the next release, since DesktopRelease already keeps sizes in the release notes. The README's download link went to a GitHub releases search page instead of /download; fixed. Rendered and checked: the button resolves to the 0.8.1 Setup.exe, the secondary link to the zip.

Why the version is bumped here

The page builds the installer's URL from DesktopRelease.Version, and Pages deploys on merge. Merged at 0.8.0, the primary button would point at desktop-v0.8.0, which has no Setup.exe. The version and the page must land together.

Order:

  1. Merge A list of data is not a tricolon #101 first, so v0.8.1 carries the rule-of-three fix.
  2. Merge this.
  3. Cut desktop-v0.8.1 first — until it exists, the download button 404s.
  4. Then v0.8.1, then the MCP registry after NuGet indexes.

Known gaps, not fixed here

  • The WebView2 runtime is not checked. The app assumes it is present, which it is on nearly every Windows 10/11 machine but not guaranteed on managed or LTSC images. That was already true of the zip; the installer could bootstrap it later.
  • Uninstalling leaves %LOCALAPPDATA%\SignsOfAI, where the perplexity model weights are downloaded. That is the usual behaviour for user data, and it is the one thing a teacher short on disk might want removed.
  • Unsigned. See above.

375 + 72 + 7, plus the desktop job's 31.

🤖 Generated with Claude Code

https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF

peopleworks and others added 4 commits September 16, 2026 12:07
The desktop app is for the teacher who wants to open a folder of PDFs, and the
zip asked that teacher to right-click, tick Unblock, run Get-FileHash in
PowerShell, extract, and then keep the folder together -- because WebView2
needs wwwroot on disk next to the executable, and a folder dragged apart is a
broken app.

An Inno Setup installer now ships beside the zip, built from the same staging
folder so the two can never carry different files:

- PrivilegesRequired=lowest, into %LOCALAPPDATA%\Programs: a teacher on a
  managed school laptop installs it without asking IT
- a Start menu entry and an uninstaller registered under the current user, so
  it removes itself from Settings -> Apps like anything else
- English and Spanish wizard, Windows 10 1809 minimum, as the page promises

No version is written into the script. It is passed with /DAppVersion from
the workflow, because the version already lives in seven places that
ReleaseVersionTests holds together and an eighth copy is how one disagrees.

It is unsigned, exactly like the executable inside it, so SmartScreen still
warns. Only code signing removes that; an installer does not.

Both artifacts get a sha256 sidecar and both are attached. The dry run keeps
both, so the installer can be tried by hand before a tag.

Verified on the runner and on a machine: Inno Setup 6.7.1 is already on
windows-latest; the installer is 57.6 MB against 83.8 for the zip; a silent
per-user install exits 0 and lays down exactly the zip's 488 files with none
missing or extra; the Start menu entry and the Settings entry appear; the app
starts and holds its window; and the silent uninstall removes the entry, the
shortcut and every file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
The download page's primary button now fetches the installer. The zip stays
one click away for anyone who would rather not run one.

Three sentences on that page became false the moment the installer existed:
"no installer" under the button, "There is no installer" in the zip notes, and
a three-step warning whose middle step was Get-FileHash. Rewritten in both
languages. The installer path is now: run it, More info -> Run anyway, find it
in the Start menu. Checking the SHA-256 is still explained, as an option
beside the steps rather than the thing standing between a teacher and the app.

The page says plainly that the installer is unsigned and that SmartScreen will
warn anyway. It does not imply otherwise.

The size under the button said 80 MB, which was the zip. The installer is 58.

The README's download link went to a GitHub releases search page -- a wall of
tags and assets -- rather than to /download. It now goes to the page.

SetupUrl is interpolated from DesktopRelease.Version, like ZipUrl, so the two
cannot disagree. Rendered and checked: the button resolves to the 0.8.1
Setup.exe and the secondary link to the 0.8.1 zip.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
Bumped here rather than in a later release PR, on purpose. Pages deploys on
merge, and the download page builds the installer's URL from
DesktopRelease.Version: merging the page change at 0.8.0 would point the
primary button at desktop-v0.8.0, which has no Setup.exe. The version and the
page have to land together.

All seven declarations, held together by ReleaseVersionTests.

Merge #101 first, so v0.8.1 carries the rule-of-three fix. Then cut
desktop-v0.8.1 before v0.8.1: until that tag exists, the button 404s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
The line under the download button said 80 MB, which was the zip; the previous
commit corrected it to 60 for the installer. That is still a number typed by
hand, and the next release changes the payload. DesktopRelease already says
the size belongs in the release notes, because it is only known once the runner
has built the files.

"Under 100 MB" is true of both the installer (58) and the zip (84), and stays
true without anybody remembering to edit it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
@peopleworks
peopleworks merged commit cc3cc85 into main Sep 16, 2026
4 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