Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
798027b
remove accidentally committed node_modules submodule
lerko96 Apr 1, 2026
05a3249
rebuild portfolio: Next.js 16, React 19, Tailwind v4, homelab page, C…
lerko96 Apr 12, 2026
088a06a
feat: terminal-noir redesign — widget system + design token overhaul
lerko96 Apr 12, 2026
bf0910a
style: narrow content column to max-w-3xl for centered layout
lerko96 Apr 12, 2026
a58fafc
fix(layout): narrow content column to 740px for visible centering
lerko96 Apr 12, 2026
b3fc7b2
fix(layout): restore mx-auto centering by scoping CSS reset to @layer…
lerko96 Apr 12, 2026
79d3fb1
style: improve readability across all pages
lerko96 Apr 13, 2026
94cb2da
feat: terminal-noir redesign with centering fix and readability impro…
lerko96 Apr 13, 2026
01f012f
docs: update README for Gitea/self-hosted setup
lerko96 Apr 13, 2026
a9b73fd
fix(docs): correct Gitea repo link in README
lerko96 Apr 13, 2026
a7edf0b
Merge pull request 'docs/update-readme-gitea-primary' (#2) from docs/…
Apr 13, 2026
153bdf5
fix(docs): update Gitea repo URL to lerko/portfolio
lerko96 Apr 13, 2026
4718d5d
Merge pull request 'fix(docs): update Gitea repo URL to lerko/portfol…
Apr 13, 2026
7d9b300
ci: add GitHub Actions deploy workflow for GitHub Pages
lerko96 Apr 13, 2026
6d0b4e2
refactor(ui): enforce terminal metaphor, unify secondary opacity
lerko96 Apr 16, 2026
c36cc94
feat(ui): add timeline component; complete terminal-noir design system
lerko96 Apr 16, 2026
49028e7
feat(content): reposition for security engineer, expand services to 37
lerko96 Apr 17, 2026
2946801
ci: auto-tag CalVer after deploy if commit untagged
lerko96 Apr 17, 2026
8e9fcfa
Merge pull request 'feat(content): reposition for security engineer, …
Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
70 changes: 70 additions & 0 deletions .gitea/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Build and Deploy

on:
push:
branches:
- dev

jobs:
deploy:
runs-on: ubuntu-latest
container: node:22-alpine

steps:
- name: Install SSH and rsync
run: apk add --no-cache openssh-client rsync git

- name: Checkout
uses: actions/checkout@v4

- name: Build
run: npm ci && npm run build

- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H 10.99.0.23 >> ~/.ssh/known_hosts

- name: Sync out/ to Portfolio LXC
run: |
rsync -az --delete \
-e "ssh -i ~/.ssh/deploy_key" \
out/ root@10.99.0.23:/opt/lerkolabs/out/

- name: Rebuild and restart container
run: |
ssh -i ~/.ssh/deploy_key root@10.99.0.23 \
"cd /opt/lerkolabs && \
docker build -t portfolio . && \
docker stop portfolio 2>/dev/null || true && \
docker rm portfolio 2>/dev/null || true && \
docker run -d --name portfolio -p 80:80 --restart unless-stopped portfolio"

- name: Tag release (CalVer)
run: |
git fetch --tags
if git describe --exact-match --tags HEAD 2>/dev/null; then
echo "Commit already tagged, skipping."
else
YEAR=$(date +%Y)
MONTH=$(date +%m)
LATEST=$(git tag --sort=-v:refname | grep -E '^[0-9]{4}\.[0-9]{2}\.[0-9]+$' | head -1)
if [ -n "$LATEST" ]; then
LATEST_YEAR=$(echo "$LATEST" | cut -d. -f1)
LATEST_MONTH=$(echo "$LATEST" | cut -d. -f2)
LATEST_MICRO=$(echo "$LATEST" | cut -d. -f3)
if [ "$YEAR" = "$LATEST_YEAR" ] && [ "$MONTH" = "$LATEST_MONTH" ]; then
MICRO=$((LATEST_MICRO + 1))
else
MICRO=1
fi
else
MICRO=1
fi
NEW_TAG="${YEAR}.$(printf '%02d' $MONTH).${MICRO}"
git tag "$NEW_TAG"
git push origin "$NEW_TAG"
echo "Tagged $NEW_TAG"
fi
44 changes: 44 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Deploy to GitHub Pages

on:
push:
branches:
- dev

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- name: Build
run: npm ci && npm run build

- uses: actions/upload-pages-artifact@v3
with:
path: out/

deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy
id: deployment
uses: actions/deploy-pages@v4
22 changes: 18 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage
# next.js
/.next/
/out/

# production
/build

# testing
/coverage

# misc
.DS_Store
.env
.env.local
.env.development.local
.env.test.local
Expand All @@ -21,3 +24,14 @@
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# typescript
*.tsbuildinfo
next-env.d.ts

# claude code
CLAUDE.md
.claude/

# docs
/docs
3 changes: 3 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FROM nginx:alpine
COPY out/ /usr/share/nginx/html
EXPOSE 80
95 changes: 42 additions & 53 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,70 +1,59 @@
# Getting Started with Create React App
# Tyler Koenig portfolio

This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
Personal portfolio site. Live at [lerkolabs.com](https://lerkolabs.com) — self-hosted.

## Available Scripts
Source: [gitea.lerkolabs.com/lerko/portfolio](https://gitea.lerkolabs.com/lerko/portfolio)

In the project directory, you can run:
**Stack:** Next.js 16 · React 19 · TypeScript · Tailwind v4

### `npm start`
---

Runs the app in the development mode.\
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
## Branches

The page will reload if you make edits.\
You will also see any lint errors in the console.
- `dev` — source code; pushing here updates lerkolabs.com
- `master` — reserved for future GitHub mirror; don't touch manually

### `npm test`
---

Launches the test runner in the interactive watch mode.\
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
## Commands

### `npm run build`
```bash
npm run dev # dev server at localhost:3000
npm run build # static export into out/
```

Builds the app for production to the `build` folder.\
It correctly bundles React in production mode and optimizes the build for the best performance.
---

The build is minified and the filenames include the hashes.\
Your app is ready to be deployed!
## Deploy

See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
```bash
git checkout dev && git merge <branch> && git push gitea dev
```

### `npm run eject`
Push to `dev` triggers Gitea Actions (`.gitea/workflows/deploy.yml`):
1. Builds the static site (`npm run build`)
2. rsyncs `out/` to the portfolio LXC
3. Rebuilds and restarts the Docker container serving lerkolabs.com

**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
---

If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
## Project layout

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
```
src/
app/
layout.tsx # root layout, fonts, ThemeProvider
page.tsx # home: hero, skills, project cards
homelab/page.tsx # homelab page: VLANs, services, ADRs
archive/page.tsx # older projects grid
globals.css # full design system (Tailwind v4 CSS-first, all tokens here)
components/ # Nav, Footer, Hero, ThemeScript, etc.
context/
ThemeContext.tsx # dark mode provider + useTheme hook
data/
projects.ts # all projects, featured + archive split
services.ts # homelab services with categories
public/ # static assets copied into out/ on build
```

You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

## Learn More

You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).

To learn React, check out the [React documentation](https://reactjs.org/).

### Code Splitting

This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)

### Analyzing the Bundle Size

This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)

### Making a Progressive Web App

This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)

### Advanced Configuration

This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)

### Deployment

This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)

### `npm run build` fails to minify

This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
> Tailwind v4 is CSS-first — no `tailwind.config.ts`. All custom tokens live in `globals.css` under `@theme {}`.
18 changes: 18 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";

const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
]);

export default eslintConfig;
11 changes: 11 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
output: "export",
trailingSlash: true,
images: {
unoptimized: true,
},
};

export default nextConfig;
1 change: 0 additions & 1 deletion node_modules/.bin/acorn

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/ansi-html

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/atob

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/autoprefixer

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/babylon

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/browserslist

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/css-blank-pseudo

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/css-has-pseudo

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/css-prefers-color-scheme

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/cssesc

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/detect

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/detect-port

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/errno

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/escodegen

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/esgenerate

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/eslint

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/esparse

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/esvalidate

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/he

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/html-minifier-terser

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/import-local-fixture

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/is-ci

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/is-docker

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/jest

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/jest-runtime

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/js-yaml

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/jsesc

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/json5

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/loose-envify

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/lz-string

This file was deleted.

1 change: 0 additions & 1 deletion node_modules/.bin/miller-rabin

This file was deleted.

Loading
Loading