From 100ec61d31dae76bc6e4c900c89eb180925b305c Mon Sep 17 00:00:00 2001 From: Abhishek Doshi Date: Tue, 13 Oct 2026 13:08:46 +0530 Subject: [PATCH 1/2] chore: remove the roadmap page The changelog (#679) replaces it. /roadmap/ now redirects to /changelog/. Also drops the LINEAR_API_KEY build env, the README section, and the linearapp cspell word. The daily build stays, since it keeps the Flutter release table's build-time ages fresh. --- .cspell.yaml | 1 - .github/workflows/main.yaml | 4 +- README.md | 15 -- astro.config.mjs | 3 +- src/data/changelog.ts | 2 +- src/pages/roadmap.astro | 291 ------------------------------------ 6 files changed, 4 insertions(+), 312 deletions(-) delete mode 100644 src/pages/roadmap.astro diff --git a/.cspell.yaml b/.cspell.yaml index e60d0c0a..2a769dc8 100644 --- a/.cspell.yaml +++ b/.cspell.yaml @@ -66,7 +66,6 @@ words: - janky - lateinit - keyrings - - linearapp - linkset - lavamoat - libapp diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 4b2105cf..a95b7780 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -2,7 +2,7 @@ name: ci on: schedule: - - cron: '0 6 * * *' # 6am UTC / midnight CST β€” keeps roadmap data fresh + - cron: '0 6 * * *' # 6am UTC / midnight CST: keeps build-time dates fresh workflow_dispatch: pull_request: push: @@ -24,8 +24,6 @@ jobs: - name: πŸ“¦ Build Docs uses: ./.github/actions/astro_site - env: - LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} - name: πŸš€ Deploy to Cloudflare Pages if: diff --git a/README.md b/README.md index e9a2d194..c4ab161a 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,6 @@ Home of the [docs.shorebird.dev](https://docs.shorebird.dev) site. -## πŸ—ΊοΈ Roadmap page - -The `/roadmap` page fetches live data from Linear at build time. To see real -data locally, export your Linear API key before running the dev server: - -```sh -export LINEAR_API_KEY=your_key_here -npm run dev -``` - -You can create a personal API key at **Linear β†’ Settings β†’ API β†’ Personal API -Keys**. Without the key the page renders a fallback message instead of crashing. - -In CI the key is read from the `LINEAR_API_KEY` repository secret. - ## 🐦 Flutter release data The table on diff --git a/astro.config.mjs b/astro.config.mjs index d70b787b..ae037352 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -199,7 +199,6 @@ export default defineConfig({ collapsed: true, items: [{ autogenerate: { directory: 'flutter-concepts' } }], }, - { label: 'Roadmap', link: '/roadmap/' }, { label: 'Changelog', link: '/changelog/' }, ], plugins: [ @@ -394,5 +393,7 @@ Developer & Agent Interfaces: '/ci/checks/format': '/ci/', '/ci/checks/run-tests': '/ci/', '/ci/checks/upload-coverage': '/ci/', + // The roadmap was replaced by the changelog. + '/roadmap': '/changelog/', }, }); diff --git a/src/data/changelog.ts b/src/data/changelog.ts index 323fb5bf..0d3ceff5 100644 --- a/src/data/changelog.ts +++ b/src/data/changelog.ts @@ -193,7 +193,7 @@ async function checkDocLink(file: string, href: string): Promise { 'published page instead.', ); } - // Standalone pages like /roadmap/ aren't in the docs collection. + // Standalone pages like /changelog/ aren't in the docs collection. const standalone = [ `src/pages/${path}.astro`, `src/pages/${path}/index.astro`, diff --git a/src/pages/roadmap.astro b/src/pages/roadmap.astro deleted file mode 100644 index 0d755eba..00000000 --- a/src/pages/roadmap.astro +++ /dev/null @@ -1,291 +0,0 @@ ---- -// cspell:words linearapp graphql roadmap -import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; - -interface LinearProject { - id: string; - name: string; - description: string; - state: string; - targetDate: string | null; - priority: number; -} - -const PRIORITY_LABEL: Record = { - 1: 'Urgent', - 2: 'High', - 3: 'Medium', - 4: 'Low', -}; - -function getQuarterLabel(iso: string): string { - const d = new Date(iso); - const q = Math.ceil((d.getUTCMonth() + 1) / 3); - return `Q${q} ${d.getUTCFullYear()}`; -} - -// Returns a sortable numeric key for a quarter label like "Q2 2025" β†’ 20252 -function quarterSortKey(label: string): number { - const [q, year] = label.split(' '); - return parseInt(year) * 10 + parseInt(q.slice(1)); -} - -function currentQuarterCutoff(): Date { - const now = new Date(); - const quarter = Math.ceil((now.getUTCMonth() + 1) / 3); - // Start of one quarter behind current - const cutoffQuarter = quarter === 1 ? 4 : quarter - 1; - const cutoffYear = quarter === 1 ? now.getUTCFullYear() - 1 : now.getUTCFullYear(); - const cutoffMonth = (cutoffQuarter - 1) * 3; // 0-indexed month start of that quarter - return new Date(Date.UTC(cutoffYear, cutoffMonth, 1)); -} - -const STATUS_LABEL: Record = { - planned: 'Planned', - started: 'In Progress', - paused: 'Paused', - completed: 'Completed', - cancelled: 'Cancelled', -}; - -const LINEAR_API_KEY = import.meta.env.LINEAR_API_KEY; - -let projects: LinearProject[] = []; -let fetchError = false; - -if (LINEAR_API_KEY) { - try { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); - - const response = await fetch('https://api.linear.app/graphql', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: LINEAR_API_KEY, - }, - signal: controller.signal, - body: JSON.stringify({ - query: `{ - projects( - filter: { labels: { name: { eq: "Public Roadmap" } } } - first: 50 - ) { - nodes { - id - name - description - state - targetDate - priority - } - } - }`, - }), - }); - - clearTimeout(timeoutId); - - if (!response.ok) { - fetchError = true; - } else { - const json = await response.json(); - projects = json?.data?.projects?.nodes ?? []; - } - } catch { - fetchError = true; - } -} else { - fetchError = true; -} - -// Group by quarter; projects without a targetDate go to the "Future" bucket -// Filter out anything with a targetDate before the start of one quarter ago -const cutoff = currentQuarterCutoff(); -const quarterMap = new Map(); -const futureProjects: LinearProject[] = []; - -for (const p of projects) { - if (p.targetDate) { - if (new Date(p.targetDate) < cutoff) continue; - const label = getQuarterLabel(p.targetDate); - if (!quarterMap.has(label)) quarterMap.set(label, []); - quarterMap.get(label)!.push(p); - } else { - futureProjects.push(p); - } -} - -const sortedQuarters = [...quarterMap.keys()].sort( - (a, b) => quarterSortKey(a) - quarterSortKey(b), -); - -const buildTime = new Date().toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric', -}); ---- - - -

- Here's what we're working on at Shorebird. This roadmap is pulled directly from our Linear backlog and reflects our current engineering and product priorities. We keep it public because we believe in building in the open. If something you care about isn't here, let us know via Discord or Email. -

- - { - fetchError ? ( -

- Roadmap data is not available in this environment. -

- ) : ( - <> - {sortedQuarters.map((label) => ( - <> -

{label}

-
- {quarterMap.get(label)!.map((p) => ( -
-
-

{p.name}

- {STATUS_LABEL[p.state] && ( - - {STATUS_LABEL[p.state]} - - )} - {PRIORITY_LABEL[p.priority] && ( - - {PRIORITY_LABEL[p.priority]} - - )} -
- {p.description && ( -

{p.description}

- )} -
- ))} -
- - ))} - -

Future

- {futureProjects.length === 0 ? ( -

Nothing without a target date.

- ) : ( -
- {futureProjects.map((p) => ( -
-
-

{p.name}

- {STATUS_LABEL[p.state] && ( - - {STATUS_LABEL[p.state]} - - )} - {PRIORITY_LABEL[p.priority] && ( - - {PRIORITY_LABEL[p.priority]} - - )} -
- {p.description && ( -

{p.description}

- )} -
- ))} -
- )} - -
-

- Last updated: {buildTime} -

- - ) - } -
- - From 911643d4b1b494d8d514b8e1bab919402ad5ee2d Mon Sep 17 00:00:00 2001 From: Abhishek Doshi Date: Tue, 13 Oct 2026 13:14:48 +0530 Subject: [PATCH 2/2] chore: say what the daily build refreshes --- .github/workflows/main.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index a95b7780..1d199130 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -2,7 +2,7 @@ name: ci on: schedule: - - cron: '0 6 * * *' # 6am UTC / midnight CST: keeps build-time dates fresh + - cron: '0 6 * * *' # 6am UTC: refreshes the Flutter release table's ages and Upgrade flags workflow_dispatch: pull_request: push: