You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Blog: review fixes for the GUI overview post (stacked on #991) - #999
#991 adds the GUI overview post and the code behind its clickable thumbnails. Reviewing it turned up a few gaps:
Four screenshots (15_review, 22_chat, 26_terminal, 30_notifications) were committed but never used, yet the new image route still shipped them.
The intro promised highlighted elements and links to related posts; neither was there.
Some captions were inaccurate (Resources, Extensions, Changes, Layout). The excerpt read "Below, you will find…" on index cards and in RSS. The UTM campaign was copied from the 0.2.0 post.
Each row was a header-only table (28 <table>s, 0 <td>s), so screen readers announced every caption as a column header, and the alt text repeated it.
The image route swallowed every read error and resolved paths from the working directory, so a misconfigured build would have shipped 404 links silently.
Thumbnails were a fixed 280 px, which left the wide strips (token usage, project path) unreadable, and the screenshots weighed 7.2 MB.
Approach
This PR is stacked on #991 (base: blog_gui_features), so the author can take all of it, some commits, or none. Commits are split by concern: code fixes first, then the screenshot frames, the copy, the compression and the spec.
The author's zigzag layout stays. Each row is still a two-cell table, but under an empty header row that CSS hides, so the cells are real <td>s.
A linked screenshot takes two thirds of its row at its own aspect ratio and still reserves its space before it lazy-loads. Below 520 px of content width the cells stack. This uses a container query, because the blog pane's width does not follow the viewport.
Highlight frames are orange, to stand apart from the lime UI accent and the red/green diff colours. Compression is lossless (oxipng): pixels are bit-identical and the ICC profile is kept.
Copy edits keep the author's voice. Left untouched: the 0.3.0 (Nightly) note, the footer and positioning, the draft flag and the date.
Changes
Image route (src/pages/blog/[slug]/images/[file].ts, new src/blogImages.ts with tests): the post folder resolves from the Astro root via astro:config/server. A post without images/ has no images; any other read error now fails the build.
validateBuild: fails when a relative link or src on a blog post has no built file (relativeLinkTargets, tested).
imageZoom.ts: the click filter is extracted as zoomsInPlace, and non-primary buttons now follow the link too (tested). The dialog takes its name from the image's alt, and the image is cleared on close so the previous screenshot never flashes.
styles.css: hidden empty table header, the thumbnail sizing above, and a zoom-in cursor only on linked images.
Post:
rows for the four unused screenshots
sections: The chat / The workspace / Settings
corrected captions and descriptive alt text
links to the workspaces, spec-driven development, pi skills and 0.2.0 posts
a "Not pictured here" paragraph
a new excerpt and utm_campaign=gui-overview
the "planned post" promise removed
Screenshots: highlight frames on all 32; 7.2 MB → 3.8 MB losslessly.
Docs: apps/website/SPEC.md (Blog) and content/blog/BLOG.md (header-less tables, oxipng).
Screenshots
Same viewport and scroll position: the head of #991 (before) against this branch (after).
Fast gates pass: bun run lint, bun run typecheck, bun run test
bun run lint: 0 errors (one existing warning: design-audit/buttons.html exceeds 1 MiB).
bun run typecheck: 25/25 tasks pass.
bun run test: 24/25 tasks pass. The one failure is boot.test.ts › boot applies the stored environment before serving, and launch variables win, which only fails because THINKRAIL_PORT was set in the shell the suite ran in. With it unset, bun test src/host/boot.test.ts passes 19/19.
Website: bun test 312 pass. astro build + bun src/validateBuild.ts pass, and removing one built original makes it fail with missing local output. astro build --root apps/website run from the repo root emits all 32 originals.
E2E suite passes for app-affecting changes (bun run e2e, or bun run e2e:full when touching agent behavior): not applicable, as this is website-only and the e2e suite does not cover apps/website
Before/after screenshots are included for frontend changes, or marked not applicable
Relevant SPEC.md / top-level specs updated to reflect any boundary, contract, or behavior change
The reason will be displayed to describe this comment to others. Learn more.
Non-blocking:
Problem: The new check treats URL-encoded paths as literal disk filenames, rejecting valid relative image links.
Failure scenario: In a local fixture, Astro 7.3.3 successfully emitted screenshot one.png and écran.png, but links to ./images/screenshot%20one.png and ./images/écran.png made validation fail with missing local output: the existence check looks for %20 and %C3%A9 on disk. This prevents publishing posts using those supported filenames.
Suggested fix: Decode the URL pathname once when converting it to a filesystem path in outputPathExists, and cover a space and a non-ASCII filename in the validation tests.
The reason will be displayed to describe this comment to others. Learn more.
Approved — ready to merge.
This branch has not been deployed
No deployments
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
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.
Problem
#991 adds the GUI overview post and the code behind its clickable thumbnails. Reviewing it turned up a few gaps:
15_review,22_chat,26_terminal,30_notifications) were committed but never used, yet the new image route still shipped them.<table>s, 0<td>s), so screen readers announced every caption as a column header, and the alt text repeated it.Approach
This PR is stacked on #991 (base:
blog_gui_features), so the author can take all of it, some commits, or none. Commits are split by concern: code fixes first, then the screenshot frames, the copy, the compression and the spec.<td>s.draftflag and the date.Changes
src/pages/blog/[slug]/images/[file].ts, newsrc/blogImages.tswith tests): the post folder resolves from the Astro root viaastro:config/server. A post withoutimages/has no images; any other read error now fails the build.validateBuild: fails when a relative link orsrcon a blog post has no built file (relativeLinkTargets, tested).imageZoom.ts: the click filter is extracted aszoomsInPlace, and non-primary buttons now follow the link too (tested). The dialog takes its name from the image's alt, and the image is cleared on close so the previous screenshot never flashes.styles.css: hidden empty table header, the thumbnail sizing above, and azoom-incursor only on linked images.utm_campaign=gui-overviewapps/website/SPEC.md(Blog) andcontent/blog/BLOG.md(header-less tables,oxipng).Screenshots
Same viewport and scroll position: the head of #991 (before) against this branch (after).
Desktop 1280×900, dark: the first Settings rows
Desktop 1280×900, dark: the token usage strip
Mobile 390×844, light: the first chat rows
Related issues
Stacked on #991; closes no issue.
Checklist
bun run lint,bun run typecheck,bun run testbun run lint: 0 errors (one existing warning:design-audit/buttons.htmlexceeds 1 MiB).bun run typecheck: 25/25 tasks pass.bun run test: 24/25 tasks pass. The one failure isboot.test.ts › boot applies the stored environment before serving, and launch variables win, which only fails becauseTHINKRAIL_PORTwas set in the shell the suite ran in. With it unset,bun test src/host/boot.test.tspasses 19/19.bun test312 pass.astro build+bun src/validateBuild.tspass, and removing one built original makes it fail withmissing local output.astro build --root apps/websiterun from the repo root emits all 32 originals.bun run e2e, orbun run e2e:fullwhen touching agent behavior): not applicable, as this is website-only and the e2e suite does not coverapps/websiteSPEC.md/ top-level specs updated to reflect any boundary, contract, or behavior change