From 0f71eff14344127203fae072be72d39770c3a1da Mon Sep 17 00:00:00 2001 From: brainstorm-os Date: Tue, 20 Oct 2026 11:51:08 +0200 Subject: [PATCH] fix(site): release notes render with their screenshots, and every release link points at GitHub The downloads page only ever showed the highlights list and a link to GitLab; the Markdown body of each release, and the nine 0.15.0 screenshots committed with it, were never rendered. The latest release's body now renders under the highlights as What's new, with each screenshot in a figure and its caption. Every repo link (footer, star banner, llms.txt, 'All releases') and the asset hrefs on 0.13.0 to 0.15.0 now point at the GitHub release, which is where releases are published; GitLab remains the in-app update feed only. Astro 7's default Markdown processor takes no rehype plugin without an extra dependency, so figures are written as HTML in the release body. Co-Authored-By: Claude Fable 5.1 --- src/components/DownloadsContent.astro | 71 +++++++++++++++++++++++++-- src/content/releases/0.13.0.md | 12 ++--- src/content/releases/0.14.0.md | 12 ++--- src/content/releases/0.15.0.md | 57 +++++++++++++++------ src/content/site.ts | 4 +- src/i18n/pages.ts | 5 ++ src/i18n/ui.ts | 12 ++--- src/pages/llms.txt.ts | 2 +- 8 files changed, 136 insertions(+), 39 deletions(-) diff --git a/src/components/DownloadsContent.astro b/src/components/DownloadsContent.astro index 6eb2648..a627be2 100644 --- a/src/components/DownloadsContent.astro +++ b/src/components/DownloadsContent.astro @@ -1,5 +1,5 @@ --- -import { type CollectionEntry, getCollection } from "astro:content"; +import { type CollectionEntry, getCollection, render } from "astro:content"; import CornerMarks from "~/components/CornerMarks.astro"; import Footer from "~/components/Footer.astro"; import Header from "~/components/Header.astro"; @@ -43,6 +43,10 @@ const published = (await getCollection("releases")) const latest = published[0]; const archive = published.slice(1); +// The notes body is English-only, like the blog: written once, in the voice of +// the design docs. The highlights above it are the per-locale summary. +const Notes = latest ? (await render(latest)).Content : null; + const dateFmt = new Intl.DateTimeFormat(copy.dateLocale, { year: "numeric", month: "short", @@ -185,7 +189,7 @@ const GLYPH: Record = {

{copy.emptyLine}

{copy.emptySub}

- + {copy.emptyCta}
@@ -202,8 +206,19 @@ const GLYPH: Record = { ))} )} + {Notes && ( +
+
+

{copy.notesTitle}

+ v{latest.data.version} +
+
+ +
+
+ )}

- + {copy.allReleases}

@@ -483,6 +498,56 @@ const GLYPH: Record = { border-radius: 50%; background: var(--cyan-glow); } + .release-notes { + margin-top: var(--space-6); + padding-top: var(--space-6); + border-top: 1px solid var(--hairline); + } + .release-notes-head { + display: flex; + align-items: baseline; + gap: var(--space-3); + margin-bottom: var(--space-4); + } + .release-notes-title { + font-size: clamp(1.4rem, 1.3vw + 0.9rem, 1.85rem); + font-weight: 500; + letter-spacing: var(--tracking-tight); + color: var(--paper); + } + .release-notes-version { + font-size: var(--text-mono); + text-transform: uppercase; + letter-spacing: var(--tracking-eyebrow); + color: var(--fog-2); + } + /* Screenshots run wider than the measure so a 1440px capture stays legible; + the text column keeps the prose width. */ + .release-notes-body { + max-width: 60rem; + } + .release-notes-body > :global(:not(figure)) { + max-width: 68ch; + } + .release-notes-body :global(figure) { + margin: 2em 0 2.4em; + width: 100%; + } + .release-notes-body :global(figure img) { + display: block; + width: 100%; + height: auto; + border-radius: var(--radius-2); + border: 1px solid var(--hairline-strong); + box-shadow: 0 24px 60px -30px rgba(0, 0, 0, 0.6); + background: var(--bg-edge); + } + .release-notes-body :global(figcaption) { + margin-top: var(--space-3); + font-size: var(--text-sm); + line-height: var(--leading-snug); + color: var(--fog-2); + } .all-releases a { font-size: var(--text-mono); text-transform: uppercase; diff --git a/src/content/releases/0.13.0.md b/src/content/releases/0.13.0.md index 05d1a2d..43661d8 100644 --- a/src/content/releases/0.13.0.md +++ b/src/content/releases/0.13.0.md @@ -15,22 +15,22 @@ highlights: assets: - platform: mac label: Apple silicon - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.13.0/Brainstorm-0.13.0-arm64.dmg + href: https://github.com/brainstorm-os/shell/releases/download/v0.13.0/Brainstorm-0.13.0-arm64.dmg - platform: mac label: Intel - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.13.0/Brainstorm-0.13.0.dmg + href: https://github.com/brainstorm-os/shell/releases/download/v0.13.0/Brainstorm-0.13.0.dmg - platform: windows label: Installer (.exe) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.13.0/Brainstorm-Setup-0.13.0.exe + href: https://github.com/brainstorm-os/shell/releases/download/v0.13.0/Brainstorm-Setup-0.13.0.exe - platform: linux label: AppImage (x86_64) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.13.0/Brainstorm-0.13.0-x86_64.AppImage + href: https://github.com/brainstorm-os/shell/releases/download/v0.13.0/Brainstorm-0.13.0-x86_64.AppImage - platform: linux label: AppImage (arm64) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.13.0/Brainstorm-0.13.0-arm64.AppImage + href: https://github.com/brainstorm-os/shell/releases/download/v0.13.0/Brainstorm-0.13.0-arm64.AppImage - platform: linux label: Debian (.deb) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.13.0/Brainstorm-0.13.0-amd64.deb + href: https://github.com/brainstorm-os/shell/releases/download/v0.13.0/Brainstorm-0.13.0-amd64.deb --- Most products bolt an assistant onto the side. A box in the corner that answers diff --git a/src/content/releases/0.14.0.md b/src/content/releases/0.14.0.md index 0811956..36b9053 100644 --- a/src/content/releases/0.14.0.md +++ b/src/content/releases/0.14.0.md @@ -16,22 +16,22 @@ highlights: assets: - platform: mac label: Apple silicon - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.14.0/Brainstorm-0.14.0-arm64.dmg + href: https://github.com/brainstorm-os/shell/releases/download/v0.14.0/Brainstorm-0.14.0-arm64.dmg - platform: mac label: Intel - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.14.0/Brainstorm-0.14.0.dmg + href: https://github.com/brainstorm-os/shell/releases/download/v0.14.0/Brainstorm-0.14.0.dmg - platform: windows label: Installer (.exe) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.14.0/Brainstorm-Setup-0.14.0.exe + href: https://github.com/brainstorm-os/shell/releases/download/v0.14.0/Brainstorm-Setup-0.14.0.exe - platform: linux label: AppImage (x86_64) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.14.0/Brainstorm-0.14.0-x86_64.AppImage + href: https://github.com/brainstorm-os/shell/releases/download/v0.14.0/Brainstorm-0.14.0-x86_64.AppImage - platform: linux label: AppImage (arm64) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.14.0/Brainstorm-0.14.0-arm64.AppImage + href: https://github.com/brainstorm-os/shell/releases/download/v0.14.0/Brainstorm-0.14.0-arm64.AppImage - platform: linux label: Debian (.deb) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.14.0/Brainstorm-0.14.0-amd64.deb + href: https://github.com/brainstorm-os/shell/releases/download/v0.14.0/Brainstorm-0.14.0-amd64.deb --- The last release added agents and app-to-app actions. This one adds almost no diff --git a/src/content/releases/0.15.0.md b/src/content/releases/0.15.0.md index 9b2a9b5..42f2740 100644 --- a/src/content/releases/0.15.0.md +++ b/src/content/releases/0.15.0.md @@ -16,22 +16,22 @@ highlights: assets: - platform: mac label: Apple silicon - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.15.0/Brainstorm-0.15.0-arm64.dmg + href: https://github.com/brainstorm-os/shell/releases/download/v0.15.0/Brainstorm-0.15.0-arm64.dmg - platform: mac label: Intel - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.15.0/Brainstorm-0.15.0.dmg + href: https://github.com/brainstorm-os/shell/releases/download/v0.15.0/Brainstorm-0.15.0.dmg - platform: windows label: Installer (.exe) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.15.0/Brainstorm-Setup-0.15.0.exe + href: https://github.com/brainstorm-os/shell/releases/download/v0.15.0/Brainstorm-Setup-0.15.0.exe - platform: linux label: AppImage (x86_64) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.15.0/Brainstorm-0.15.0-x86_64.AppImage + href: https://github.com/brainstorm-os/shell/releases/download/v0.15.0/Brainstorm-0.15.0-x86_64.AppImage - platform: linux label: AppImage (arm64) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.15.0/Brainstorm-0.15.0-arm64.AppImage + href: https://github.com/brainstorm-os/shell/releases/download/v0.15.0/Brainstorm-0.15.0-arm64.AppImage - platform: linux label: Debian (.deb) - href: https://gitlab.com/api/v4/projects/brainstorm-os%2Fshell/packages/generic/brainstorm/0.15.0/Brainstorm-0.15.0-amd64.deb + href: https://github.com/brainstorm-os/shell/releases/download/v0.15.0/Brainstorm-0.15.0-amd64.deb --- The last release was a polish pass. This one is the opposite: forty-eight @@ -46,7 +46,10 @@ lists it back under Deliverables without you doing anything. Adding, removing and deleting keep both sides in step, and if the far object is locked the change is refused rather than half-applied. -![A project in Database showing the deliverables linked back to it](/screenshots/0.15.0/database-two-way-relations.webp) +
+ A project in Database showing the deliverables linked back to it +
A project in Database showing the deliverables linked back to it
+
**A view can live inside the object it belongs to.** An embedded view can filter on "This object", so one project template shows each project its own tasks. @@ -57,14 +60,20 @@ only, and wrap the way you choose. Boards split into swimlanes by a second property, order groups by how many items they hold, and collapse every group at once. Galleries pick their cover from a property, the first image, or none. -![A board split into swimlanes by a second property](/screenshots/0.15.0/database-board-swimlanes.webp) +
+ A board split into swimlanes by a second property +
A board split into swimlanes by a second property
+
**Change your mind about a type.** Switch a property between text, number, checkbox and date with a preview of every value that converts and every one that would be cleared. Numbers can carry a unit. A property can also hold rich text, and a chart view draws bars, lines, pies and single numbers over any grouping. -![A chart view drawing a bar chart over a grouped collection](/screenshots/0.15.0/database-chart-view.webp) +
+ A chart view drawing a bar chart over a grouped collection +
A chart view drawing a bar chart over a grouped collection
+
**Work on many rows at once.** Select rows and set a property or add them to a collection in one go, with a one-step undo. Step through a view from the @@ -82,27 +91,39 @@ editor. Images and files already in the vault can be inserted and resized inline and images now reach HTML and Markdown exports. There is a tabs block, guide lines on lists, outliner keys inside toggles, and a spell-check language picker. -![A tabs block in Notes with three named tabs](/screenshots/0.15.0/notes-tabs-block.webp) +
+ A tabs block in Notes with three named tabs +
A tabs block in Notes with three named tabs
+
## The shell **Split view.** Alt-click any object, or choose "Open to the side", and work in two panes with their own apps, divider and shortcuts. -![Two apps side by side in one window](/screenshots/0.15.0/shell-split-view.webp) +
+ Two apps side by side in one window +
Two apps side by side in one window
+
**A history for every object.** Idle edits are captured on their own, an agent run is one checkpoint, and restoring is a forward edit you can undo. Retention keeps the newest version of every object no matter how full the history gets. -![The version history panel of a note](/screenshots/0.15.0/notes-version-history.webp) +
+ The version history panel of a note +
The version history panel of a note
+
**Backups that happen without you.** An hour after launch and hourly after that, the vault writes a backup, keeps a bounded set of restore points, and a restore only brings back what is missing. Whole-vault Markdown export writes one dated folder with one file per object and its assets alongside. -![Scheduled backups in Settings with the restore points listed](/screenshots/0.15.0/settings-scheduled-backups.webp) +
+ Scheduled backups in Settings with the restore points listed +
Scheduled backups in Settings with the restore points listed
+
Also: a startup page, search that shows saved searches and recents before you type, remembered "don't ask again" on Move-to-Bin prompts, auto-hide sidebars, @@ -118,7 +139,10 @@ Each run lists what it changed, and "Undo this run" checks the whole run first and refuses it whole, with a reason, if anything was edited since. An object an agent created says so in a read-only row, and that mark cannot be forged. -![An agent conversation listing what the run changed, with Undo this run](/screenshots/0.15.0/agent-run-changes-undo.webp) +
+ An agent conversation listing what the run changed, with Undo this run +
An agent conversation listing what the run changed, with Undo this run
+
## Chat and collaboration @@ -127,7 +151,10 @@ across devices. Pin up to fifty messages per channel, see who is typing, expand the composer, and show full dates. A `brainstorm://invite` link pre-fills the share dialog and never grants anything by itself; Viewer is the default role. -![Message search in a Chat channel jumping to a hit](/screenshots/0.15.0/chat-message-search.webp) +
+ Message search in a Chat channel jumping to a hit +
Message search in a Chat channel jumping to a hit
+
## Everywhere else diff --git a/src/content/site.ts b/src/content/site.ts index 476d5c3..05245f4 100644 --- a/src/content/site.ts +++ b/src/content/site.ts @@ -22,8 +22,8 @@ export const SITE_URL = "https://getbrainstorm.online"; export const YOUTUBE_VIDEO_ID = "kkjVrnwmZT4"; export const links = { - github: "https://gitlab.com/brainstorm-os", - repo: "https://gitlab.com/brainstorm-os/shell", + github: "https://github.com/brainstorm-os", + repo: "https://github.com/brainstorm-os/shell", docs: "https://docs.getbrainstorm.online", // The downloads page lists every release with per-platform builds. downloads: "/downloads", diff --git a/src/i18n/pages.ts b/src/i18n/pages.ts index 364c22d..2442f44 100644 --- a/src/i18n/pages.ts +++ b/src/i18n/pages.ts @@ -31,6 +31,8 @@ export interface DownloadsCopy { platformAria: string; noBuild: string; notesAria: string; + /** Heading over the latest release's rendered notes. */ + notesTitle: string; allReleases: string; emptyLine: string; emptySub: string; @@ -105,6 +107,7 @@ const downloads: Record = { platformAria: "Download by platform", noBuild: "No build for this platform yet.", notesAria: "Release notes", + notesTitle: "What's new", allReleases: "All releases on GitHub", emptyLine: "No public builds yet.", emptySub: "Brainstorm builds are published on GitHub — check the releases page for the latest.", @@ -127,6 +130,7 @@ const downloads: Record = { platformAria: "Nach Plattform herunterladen", noBuild: "Noch kein Build für diese Plattform.", notesAria: "Release-Notes", + notesTitle: "Was ist neu", allReleases: "Alle Versionen auf GitHub", emptyLine: "Noch keine öffentlichen Builds.", emptySub: @@ -153,6 +157,7 @@ const downloads: Record = { platformAria: "Télécharger par plateforme", noBuild: "Pas encore de build pour cette plateforme.", notesAria: "Notes de version", + notesTitle: "Nouveautés", allReleases: "Toutes les versions sur GitHub", emptyLine: "Aucun build public pour l'instant.", emptySub: diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 1fcdc0d..99a863d 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -89,7 +89,7 @@ type UiKey = keyof (typeof ui)["en"]; export const ui = { en: { "star.text": "Brainstorm is free and open source — if it's useful to you,", - "star.link": "star it on GitLab", + "star.link": "star it on GitHub", "nav.overview": "Overview", "nav.apps": "Apps", "nav.how": "How it works", @@ -104,7 +104,7 @@ export const ui = { "footer.download": "Download", "footer.docs": "Docs", "footer.blog": "Blog", - "footer.github": "GitLab", + "footer.github": "GitHub", "footer.youtube": "YouTube", "footer.opensource": "Open source · AGPL-3.0", "footer.privacy": "Privacy", @@ -124,7 +124,7 @@ export const ui = { }, de: { "star.text": "Brainstorm ist kostenlos und quelloffen — wenn es dir nützt,", - "star.link": "gib ihm einen Stern auf GitLab", + "star.link": "gib ihm einen Stern auf GitHub", "nav.overview": "Überblick", "nav.apps": "Apps", "nav.how": "So funktioniert's", @@ -139,7 +139,7 @@ export const ui = { "footer.download": "Herunterladen", "footer.docs": "Doku", "footer.blog": "Blog", - "footer.github": "GitLab", + "footer.github": "GitHub", "footer.youtube": "YouTube", "footer.opensource": "Quelloffen · AGPL-3.0", "footer.privacy": "Datenschutz", @@ -159,7 +159,7 @@ export const ui = { }, fr: { "star.text": "Brainstorm est gratuit et open source — s'il vous est utile,", - "star.link": "mettez-lui une étoile sur GitLab", + "star.link": "mettez-lui une étoile sur GitHub", "nav.overview": "Aperçu", "nav.apps": "Applications", "nav.how": "Comment ça marche", @@ -174,7 +174,7 @@ export const ui = { "footer.download": "Télécharger", "footer.docs": "Docs", "footer.blog": "Blog", - "footer.github": "GitLab", + "footer.github": "GitHub", "footer.youtube": "YouTube", "footer.opensource": "Open source · AGPL-3.0", "footer.privacy": "Confidentialité", diff --git a/src/pages/llms.txt.ts b/src/pages/llms.txt.ts index e182e1e..29c492e 100644 --- a/src/pages/llms.txt.ts +++ b/src/pages/llms.txt.ts @@ -48,7 +48,7 @@ export const GET: APIRoute = async () => { "", "## Source", "", - `- [GitLab](${links.github}): the Brainstorm organisation`, + `- [GitHub](${links.github}): the Brainstorm organisation`, `- [Shell repository](${links.repo}): the desktop shell`, "", ];