Repository navigation
Blog: ThinkRail 0.2.0 release post - #768
Merged
Merged
Conversation
Rinat S (rsolmano)
requested review from
Olga Lavrichenko (OLavrik),
Rustam Sadykov (SBOne-Kenobi) and
danyaberezun
as code owners
October 19, 2026 11:22
🌐 Website previewPreview retired when this pull request closed. |
4 of 5 tasks
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
ThinkRail 0.2.0 shipped on 2026-10-18 with no post on thinkrail.ai/blog. And the post needs screenshots, but local blog images, the route
BLOG.mdrecommends (./images/…), had never been used and break the build:astro buildfails withMissingSharp.sharpreaches the lockfile only as an optional dependency ofastro, and with bun's isolated installs@thinkrail/websitecan't resolve it. CI'sbun install --frozen-lockfilewould fail the same way.Approach
sharp0.35.4exactly as a website devDependency. It's the version already inbun.lock, so nothing new is downloaded. It's website-only, so it's pinned in the package and not in the root catalog, the same way as@astrojs/rss. This makes./images/work for every future post.rinat-stocontent/authors.json.src/components/InstallPicker.astro. The landing's built HTML differs only bydata-install-picker="hero".[slug].astrorenders it withidPrefix="blog"after the post body. Analytics attributes its downloads, command copies and command-line disclosure opens toblog_post, so install intent from posts is counted.install_command_copiedgainsblog_postas an allowed location. Only the hero picker drives the side terminal's install replay.utm_source=blog&utm_medium=organic-social&utm_campaign=release-0-2-0. First-time contributors link to their GitHub profiles.Changes
apps/website/package.json+bun.lock:sharpdevDependency.bun installalso re-sorts the@thinkrail/pi-visualizeentry that chore(pi-extensions): publish pi packages under the @thinkrail npm scope #734's rename left out of alphabetical order. That's bun's own output, not a hand edit.apps/website/content/blog/2026-10-18-thinkrail-0-2-0-review-the-turn/:index.md+images/.draft: false, so it publishes when this merges.apps/website/content/authors.json:"rinat-s": { "name": "Rinat S" }.apps/website/src/components/InstallPicker.astro(new),src/pages/index.astro,src/pages/blog/[slug].astro,src/styles.css,src/main.ts: the shared picker, placed on every post.apps/website/src/analyticsEvents.ts+packages/website-analytics/src/index.ts:blog_postlocation for command copies and command-line disclosure opens.apps/website/src/validateBuild.ts: every article must have the blog picker and the landing the hero picker. Introducing ThinkRail's expected desktop-link count goes from 1 to 2: that older post keeps its own download list, and the picker adds a second.apps/website/SPEC.md,packages/website-analytics/SPEC.md: document the shared picker and the new location.Every feature claim in the post maps to a PR in the v0.2.0 release notes (#668, #691–#695, #749, #763, #633, #728, #706, #654, #663, #680, #703, #710, #727, #730, #745, #711, #726, #690, #709, #699, #764, #685, #731, #626, #619, #697, #700, #747, #723).
Screenshots
Website-only change (no app frontend). Before: posts had no install picker. After: every post ends with the landing's picker (checked in
astro preview: light and dark, desktop 1400 px and phone 390 px with no horizontal overflow, Windows tab and command-line disclosure working).Checklist
bun run lint,bun run typecheck,bun run test(lint + typecheck pass; repo-widebun run testnot run, only the website suite)bun run e2e, orbun run e2e:fullwhen touching agent behavior)SPEC.md/ top-level specs updated to reflect any boundary, contract, or behavior changeTesting
bun run --filter @thinkrail/website build(before the fix) → fails withMissingSharpon the post's imagesbun run --filter @thinkrail/website build(after) → passes;/blog/thinkrail-0-2-0-review-the-turn/generated, images emitted as WebP,validateBuildOKbun install --frozen-lockfile→ no changesbun run --filter @thinkrail/website test→ 234 pass (new cases: blog-post copy and disclosure attributed toblog_post)packages/website-analyticsbun test→ 25 passdist/index.htmldiffed before/after the extraction → onlydata-install-picker="hero"differscheck:deps,check:boundaries,check:seams, style checks,biome check,turbo run typecheck) → all passbun run test(whole repo) and E2E → not run: the app and agent code are unchanged; CI runs them