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
Next.js 16 App Router portfolio with a static export for GitHub Pages. It fetches pinned repositories from the GitHub GraphQL API at build time and renders them in a terminal-themed UI.
13
+
Astro portfolio with a static export for GitHub Pages. It fetches public, non-fork repositories from the GitHub GraphQL API at build time, resolves live GitHub Pages links through the REST API, and renders them in a terminal-themed UI.
14
14
15
15
The site includes a print-optimized resume page, SEO metadata, analytics, and a Konami code easter egg. The same shared data powers the on-page resume and the dedicated `/resume` route.
16
16
@@ -20,16 +20,17 @@ It is built to stay simple to deploy: build locally, export statically, and publ
20
20
21
21
| Technology | Version | Purpose |
22
22
|-----------|---------|---------|
23
-
|Next.js|16|App Router site with static export |
24
-
| React | 19 |UI rendering|
23
+
|Astro|6|Static site build and GitHub Pages export |
24
+
| React | 19 |Interactive portfolio UI|
25
25
| TypeScript | Latest | Type safety |
26
26
| Tailwind CSS | v4 | Styling system |
27
-
| GitHub GraphQL API | v4 | Fetches pinned repos at build time |
27
+
| GitHub GraphQL + REST APIs | v4 / REST | Fetches repositories and live Pages URLs at build time |
28
28
| Google Analytics 4 | GA4 | Traffic and engagement analytics |
29
29
30
30
## Features
31
31
32
-
- Dynamic projects from GitHub GraphQL API (pinned repos)
32
+
- Dynamic Workbench repository ledger from GitHub GraphQL API (public, non-fork repos)
33
+
- Live GitHub Pages links resolved at build time via GitHub REST API
33
34
- Terminal-themed dark UI with typing animations and scroll effects
34
35
- Print-optimized resume page with download support
35
36
- PWA manifest and SEO optimizations
@@ -40,18 +41,18 @@ It is built to stay simple to deploy: build locally, export statically, and publ
<p>Fetched at build time from GitHub, excluding this portfolio, profile metadata, collaborator repos, and forks. Pages links resolve from each repository's live GitHub Pages site.</p>
{title: "super-mango-editor",description: "A classic side-scrolling platformer built with C and SDL2 — playable in the browser via WebAssembly.",url: "https://github.com/jonathanperis/super-mango-editor",lang: "C",langColor: "#555555",stars: 0,homepageUrl: "https://jonathanperis.github.io/super-mango-editor/"},
16
-
{title: "rinha2-back-end-dotnet",description: "High-performance Rinha de Backend challenge in C# with PostgreSQL and Nginx.",url: "https://github.com/jonathanperis/rinha2-back-end-dotnet",lang: "C#",langColor: "#178600",stars: 3,homepageUrl: "https://jonathanperis.github.io/rinha2-back-end-dotnet/"},
17
-
{title: "rinha2-back-end-k6",description: "K6 load testing suite for the Rinha de Backend challenge.",url: "https://github.com/jonathanperis/rinha2-back-end-k6",lang: "JavaScript",langColor: "#f1e05a",stars: 0,homepageUrl: "https://jonathanperis.github.io/rinha2-back-end-k6/"},
{title: "rinha2-back-end-go",description: "Rinha de Backend in Go — high-performance with PostgreSQL and Nginx.",url: "https://github.com/jonathanperis/rinha2-back-end-go",lang: "Go",langColor: "#00ADD8",stars: 1},
{title: "super-mango-editor",description: "A classic side-scrolling platformer built with C and SDL2 — playable in the browser via WebAssembly.",url: "https://github.com/jonathanperis/super-mango-editor",lang: "C",langColor: "#555555",stars: 0,homepageUrl: "https://jonathanperis.github.io/super-mango-editor/",pagesUrl: "https://jonathanperis.github.io/super-mango-editor/"},
19
+
{title: "rinha4-back-end-dotnet",description: "Rinha de Backend 2025 implementation in .NET with docs and benchmark reports.",url: "https://github.com/jonathanperis/rinha4-back-end-dotnet",lang: "C#",langColor: "#178600",stars: 0,homepageUrl: "https://jonathanperis.github.io/rinha4-back-end-dotnet/",pagesUrl: "https://jonathanperis.github.io/rinha4-back-end-dotnet/"},
20
+
{title: "rinha2-back-end-dotnet",description: "High-performance Rinha de Backend challenge in C# with PostgreSQL and Nginx.",url: "https://github.com/jonathanperis/rinha2-back-end-dotnet",lang: "C#",langColor: "#178600",stars: 3,homepageUrl: "https://jonathanperis.github.io/rinha2-back-end-dotnet/",pagesUrl: "https://jonathanperis.github.io/rinha2-back-end-dotnet/"},
21
+
{title: "rinha2-back-end-k6",description: "K6 load testing suite for the Rinha de Backend challenge.",url: "https://github.com/jonathanperis/rinha2-back-end-k6",lang: "JavaScript",langColor: "#f1e05a",stars: 0,homepageUrl: "https://jonathanperis.github.io/rinha2-back-end-k6/",pagesUrl: "https://jonathanperis.github.io/rinha2-back-end-k6/"},
{title: "rinha4-back-end-c",description: "Rinha de Backend 2025 C implementation with GitHub Pages documentation.",url: "https://github.com/jonathanperis/rinha4-back-end-c",lang: "C",langColor: "#555555",stars: 0,homepageUrl: "https://jonathanperis.github.io/rinha4-back-end-c/",pagesUrl: "https://jonathanperis.github.io/rinha4-back-end-c/"},
24
+
{title: "rinha2-back-end-go",description: "Rinha de Backend in Go — high-performance with PostgreSQL and Nginx.",url: "https://github.com/jonathanperis/rinha2-back-end-go",lang: "PLpgSQL",langColor: "#336790",stars: 1,homepageUrl: "https://jonathanperis.github.io/rinha2-back-end-go/",pagesUrl: "https://jonathanperis.github.io/rinha2-back-end-go/"},
Copy file name to clipboardExpand all lines: wiki/dynamic_projects.md
+34-27Lines changed: 34 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,56 +2,63 @@
2
2
3
3
## How It Works
4
4
5
-
The projects section is **not hardcoded** — it fetches your **pinned repositories** from GitHub at build time using the GraphQL API.
5
+
The Workbench repository ledger is dynamic. During the Astro build, `src/lib/github.ts` fetches Jonathan's owned public, non-fork repositories from GitHub, excludes profile/portfolio metadata repos, and enriches each row with its live GitHub Pages URL when Pages is enabled.
6
+
7
+
Featured project cards remain curated in `src/lib/data.ts` so the top of the Workbench can emphasize the strongest portfolio examples. The dynamic ledger lists the remaining repositories below those cards.
6
8
7
9
## Data Flow
8
10
9
-
1.`page.tsx` (Server Component) calls `fetchPinnedRepos()` from `lib/github.ts`
10
-
2.`github.ts` sends a GraphQL query to the GitHub API:
11
+
1.`src/pages/index.astro`calls `fetchRepos()` from `src/lib/github.ts`.
12
+
2.`github.ts` sends a GraphQL query to GitHub for public repositories ordered by recent update:
3. The response is mapped to `PinnedRepo[]` and passed to `portfolio.tsx` as a prop
31
-
4. At build time, this data is baked into the static HTML
32
+
3. For each included repository, `github.ts` also checks the REST Pages endpoint: `GET /repos/jonathanperis/{repo}/pages`.
33
+
4. The response is mapped to `GitHubRepo[]` and passed to the React `Portfolio` component.
34
+
5. At build time, this data is baked into the static HTML.
32
35
33
36
## Filtering
34
37
35
-
-`jonathanperis.github.io` (this repo) is automatically excluded from the list
36
-
- Only pinned repos are shown — pin/unpin repos on GitHub to control what appears
38
+
The GitHub query excludes forks via `isFork: false`; the mapper also requires `owner.login` to match `jonathanperis` so collaborator repositories do not appear.
37
39
38
-
## Play URLs
40
+
The code also excludes repositories that should not appear in the public Workbench ledger:
39
41
40
-
Some projects have a "Play in browser" button. This is configured in `github.ts`:
Featured project slugs from `FEATURED_PROJECTS` are removed from the ledger so they are not duplicated below the curated cards.
47
+
48
+
## GitHub Pages Links
49
+
50
+
`pagesUrl` is the preferred live link and comes from the GitHub Pages REST API. If a repo uses a standard `https://jonathanperis.github.io/<repo>/` homepage value, that is used as a fallback Pages URL.
51
+
52
+
If a repository has a non-Pages homepage, the UI can show it separately as `homepage`.
47
53
48
54
## Fallback
49
55
50
-
If `GITHUB_TOKEN` is not available (e.g., local dev without it), hardcoded fallback data is used so the site always builds.
56
+
If `GITHUB_TOKEN` is not available, hardcoded fallback data is used so the site always builds locally and in constrained environments.
51
57
52
58
## Updating Projects
53
59
54
-
To update the projects on the live site:
55
-
1. Pin/unpin repos on your GitHub profile
56
-
2. Push any change to trigger a deploy
57
-
3. The build fetches fresh data from GitHub
60
+
To update the live repository ledger:
61
+
62
+
1. Push or update the target GitHub repository.
63
+
2. Enable GitHub Pages on that repo if it should expose a live Pages link.
64
+
3. Push any change to this portfolio, or manually run the Pages workflow, so the build fetches fresh GitHub data.
0 commit comments