From 600997a5697b94a208393e9498a3a6d4c3dc99c3 Mon Sep 17 00:00:00 2001 From: baseplate-admin <61817579+baseplate-admin@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:25:02 +0600 Subject: [PATCH 1/3] add --- .github/workflows/push-landing-page-ghcr.yml | 2 ++ apps/landing-page/Dockerfile | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push-landing-page-ghcr.yml b/.github/workflows/push-landing-page-ghcr.yml index b7a3e50e..452eebf7 100644 --- a/.github/workflows/push-landing-page-ghcr.yml +++ b/.github/workflows/push-landing-page-ghcr.yml @@ -40,6 +40,8 @@ jobs: - name: Build and push image uses: docker/build-push-action@v7 + env: + GITHUB_TOKEN: ${{ secrets.GHP_TOKEN }} with: context: ./apps/landing-page file: ./apps/landing-page/Dockerfile diff --git a/apps/landing-page/Dockerfile b/apps/landing-page/Dockerfile index 6232332c..f953e6f4 100644 --- a/apps/landing-page/Dockerfile +++ b/apps/landing-page/Dockerfile @@ -27,8 +27,9 @@ COPY . . # Uncomment the following line in case you want to disable telemetry during the build. ENV NEXT_TELEMETRY_DISABLED=1 -RUN --mount=type=secret,id=github_token \ - export GITHUB_TOKEN=$(cat /run/secrets/github_token) && \ +ENV GITHUB_TOKEN=${GITHUB_TOKEN} + +RUN \ if [ -f yarn.lock ]; then yarn run build; \ elif [ -f package-lock.json ]; then npm run build; \ elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ From 8068d8956b9ea55097b57ce674f56713631d33a9 Mon Sep 17 00:00:00 2001 From: baseplate-admin <61817579+baseplate-admin@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:29:37 +0600 Subject: [PATCH 2/3] Inject from secrets --- .github/workflows/push-landing-page-ghcr.yml | 2 -- apps/landing-page/Dockerfile | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/push-landing-page-ghcr.yml b/.github/workflows/push-landing-page-ghcr.yml index 452eebf7..b7a3e50e 100644 --- a/.github/workflows/push-landing-page-ghcr.yml +++ b/.github/workflows/push-landing-page-ghcr.yml @@ -40,8 +40,6 @@ jobs: - name: Build and push image uses: docker/build-push-action@v7 - env: - GITHUB_TOKEN: ${{ secrets.GHP_TOKEN }} with: context: ./apps/landing-page file: ./apps/landing-page/Dockerfile diff --git a/apps/landing-page/Dockerfile b/apps/landing-page/Dockerfile index f953e6f4..6232332c 100644 --- a/apps/landing-page/Dockerfile +++ b/apps/landing-page/Dockerfile @@ -27,9 +27,8 @@ COPY . . # Uncomment the following line in case you want to disable telemetry during the build. ENV NEXT_TELEMETRY_DISABLED=1 -ENV GITHUB_TOKEN=${GITHUB_TOKEN} - -RUN \ +RUN --mount=type=secret,id=github_token \ + export GITHUB_TOKEN=$(cat /run/secrets/github_token) && \ if [ -f yarn.lock ]; then yarn run build; \ elif [ -f package-lock.json ]; then npm run build; \ elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ From ba56ab2567d62bcf8df9e9397d330f6a7caaca69 Mon Sep 17 00:00:00 2001 From: baseplate-admin <61817579+baseplate-admin@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:38:12 +0600 Subject: [PATCH 3/3] switch to GQL --- .../src/app/(home)/download/page.client.tsx | 34 ++++-------- .../src/app/(home)/download/page.tsx | 54 +++++++++++++------ .../src/app/(home)/download/types.ts | 24 +++++---- .../src/app/(home)/layout.client.tsx | 31 ++++++----- apps/landing-page/src/app/(home)/layout.tsx | 53 ++++++++---------- 5 files changed, 100 insertions(+), 96 deletions(-) diff --git a/apps/landing-page/src/app/(home)/download/page.client.tsx b/apps/landing-page/src/app/(home)/download/page.client.tsx index ccfb5062..f73c5d3c 100644 --- a/apps/landing-page/src/app/(home)/download/page.client.tsx +++ b/apps/landing-page/src/app/(home)/download/page.client.tsx @@ -3,16 +3,12 @@ import { Avatar, Tabs } from '@skeletonlabs/skeleton-react'; import { DownloadIcon, MonitorIcon, TerminalIcon } from 'lucide-react'; import { useState } from 'react'; -import type { Octokit } from 'octokit'; - -type OctokitRelease = Awaited< - ReturnType ->['data'][number]; +import type { GithubRelease, GithubAsset } from './types'; export default function DownloadView({ releases, }: { - releases: OctokitRelease[]; + releases: GithubRelease[]; }) { const [tabOS, setTabOS] = useState('windows'); const [selectedReleaseIndex, setSelectedReleaseIndex] = useState(0); @@ -23,7 +19,7 @@ export default function DownloadView({ const release = releases[selectedReleaseIndex]; - const assets = release.assets ?? []; + const assets = release.releaseAssets?.nodes ?? []; const windows = assets.filter((a) => a.name.toLowerCase().includes('windows'), ); @@ -72,7 +68,7 @@ export default function DownloadView({ > {releases.map((rel, index) => ( ))} @@ -81,7 +77,7 @@ export default function DownloadView({
@@ -96,9 +92,9 @@ export default function DownloadView({ Published on{' '} - {release.published_at + {release.publishedAt ? new Date( - release.published_at, + release.publishedAt, ).toLocaleDateString() : 'Unknown'} @@ -157,17 +153,7 @@ export default function DownloadView({ ); } -function AssetGrid({ - assets, -}: { - assets: { - id: number; - name: string; - size: number; - download_count: number; - browser_download_url: string; - }[]; -}) { +function AssetGrid({ assets }: { assets: GithubAsset[] }) { if (!assets || assets.length === 0) { return (
@@ -191,12 +177,12 @@ function AssetGrid({ {(asset.size / 1024 / 1024).toFixed(2)} MB - {asset.download_count} Downloads + {asset.downloadCount} Downloads
Download diff --git a/apps/landing-page/src/app/(home)/download/page.tsx b/apps/landing-page/src/app/(home)/download/page.tsx index a42705a4..41cc83ed 100644 --- a/apps/landing-page/src/app/(home)/download/page.tsx +++ b/apps/landing-page/src/app/(home)/download/page.tsx @@ -1,25 +1,49 @@ import { AlertTriangle } from 'lucide-react'; import DownloadView from './page.client'; import { RequestError } from 'octokit'; -import type { Octokit } from 'octokit'; import { octokit } from '@/server/providers/octokit.server'; - -type OctokitRelease = Awaited< - ReturnType ->['data'][number]; +import type { GithubRelease } from './types'; export default async function DownloadPage() { - let allReleases: OctokitRelease[] = []; + let allReleases: GithubRelease[] = []; try { - const octokitReleases = await octokit.paginate( - octokit.rest.repos.listReleases, - { - owner: 'chithi-dev', - repo: 'chithi', - per_page: 100, - }, - ); - allReleases = octokitReleases as OctokitRelease[]; + const data = await octokit.graphql<{ + repository: { + releases: { + nodes: GithubRelease[]; + }; + }; + }>(` + query { + repository(owner: "chithi-dev", name: "chithi") { + releases(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) { + nodes { + id + name + tagName + publishedAt + author { + login + avatarUrl + } + releaseAssets(first: 100) { + nodes { + id + name + size + downloadCount + downloadUrl + } + } + } + } + } + } + `); + + if (data?.repository?.releases?.nodes) { + allReleases = data.repository.releases.nodes; + } } catch (error: unknown) { const isRateLimited = error instanceof RequestError && error.status === 403; diff --git a/apps/landing-page/src/app/(home)/download/types.ts b/apps/landing-page/src/app/(home)/download/types.ts index 5cc22805..aa13ee75 100644 --- a/apps/landing-page/src/app/(home)/download/types.ts +++ b/apps/landing-page/src/app/(home)/download/types.ts @@ -1,17 +1,21 @@ -// Define minimal types for the GitHub Release and Assets -export type Asset = { - id: number; +export type GithubAsset = { + id: string; name: string; size: number; - download_count: number; - browser_download_url: string; + downloadCount: number; + downloadUrl: string; }; -export type Release = { - id: number; +export type GithubRelease = { + id: string; name: string; tagName: string; - published_at: string; - author: { login: string; avatar_url: string }; - assets: Asset[]; + publishedAt: string; + author: { + login: string; + avatarUrl: string; + }; + releaseAssets: { + nodes: GithubAsset[]; + }; }; diff --git a/apps/landing-page/src/app/(home)/layout.client.tsx b/apps/landing-page/src/app/(home)/layout.client.tsx index e7cbf247..00dc95cf 100644 --- a/apps/landing-page/src/app/(home)/layout.client.tsx +++ b/apps/landing-page/src/app/(home)/layout.client.tsx @@ -5,19 +5,20 @@ import Image from 'next/image'; import Link from 'next/link'; import { GithubIcon as Github } from '@/icons/github'; import { Star, GitBranch } from 'lucide-react'; -import type { Octokit } from 'octokit'; -type OctokitRelease = Awaited< - ReturnType ->['data']; -type OctokitRepo = Awaited>['data']; +type GithubRepoData = { + stargazerCount: number; + forkCount: number; + latestRelease: { + tagName: string; + } | null; +} | null; type Props = { - release?: OctokitRelease | null; - repo?: OctokitRepo | null; + repo?: GithubRepoData; }; -export function Navbar({ release, repo }: Props) { +export function Navbar({ repo }: Props) { return (
@@ -43,9 +44,9 @@ export function Navbar({ release, repo }: Props) { className="btn btn-sm hover:preset-tonal flex items-center gap-2 rounded-full border border-surface-200-800 px-4 transition-colors" > - {release?.tag_name && ( + {repo?.latestRelease?.tagName && ( - {release.tag_name} + {repo.latestRelease.tagName} )} @@ -55,7 +56,7 @@ export function Navbar({ release, repo }: Props) { > - {repo?.stargazers_count ?? 0} + {repo?.stargazerCount ?? 0} @@ -65,7 +66,7 @@ export function Navbar({ release, repo }: Props) { > - {repo?.forks_count ?? 0} + {repo?.forkCount ?? 0} @@ -109,16 +110,14 @@ export function Footer() { export default function HomeLayoutClient({ children, - release, repo = null, }: Readonly<{ children: React.ReactNode; - release?: OctokitRelease | null; - repo?: OctokitRepo | null; + repo?: GithubRepoData | null; }>) { return (
- + {children}
diff --git a/apps/landing-page/src/app/(home)/layout.tsx b/apps/landing-page/src/app/(home)/layout.tsx index 5bd598d7..77bbf376 100644 --- a/apps/landing-page/src/app/(home)/layout.tsx +++ b/apps/landing-page/src/app/(home)/layout.tsx @@ -7,44 +7,35 @@ export default async function HomeLayout({ children: React.ReactNode; }>) { // Inline concurrent fetch of latest release and repo data - let release = null; let repoData = null; try { - const releasePromise = octokit.rest.repos.getLatestRelease({ - owner: 'chithi-dev', - repo: 'chithi', - }); + const data = await octokit.graphql<{ + repository: { + stargazerCount: number; + forkCount: number; + latestRelease: { + tagName: string; + } | null; + }; + }>(` + query { + repository(owner: "chithi-dev", name: "chithi") { + stargazerCount + forkCount + latestRelease { + tagName + } + } + } + `); - const repoPromise = octokit.rest.repos.get({ - owner: 'chithi-dev', - repo: 'chithi', - }); - - const [releaseRes, repoRes] = await Promise.allSettled([ - releasePromise, - repoPromise, - ]); - - if (releaseRes.status === 'fulfilled') { - release = releaseRes.value.data; - } else { - // Not fatal: repository may have no releases or request may fail - console.warn('getLatestRelease failed', releaseRes.reason); - } - - if (repoRes.status === 'fulfilled') { - repoData = repoRes.value.data; - } else { - console.error('Failed to fetch repository data', repoRes.reason); + if (data?.repository) { + repoData = data.repository; } } catch (err) { console.error('Unexpected error fetching GitHub data', err); } - return ( - - {children} - - ); + return {children}; }