A portfolio site built using Nychthemeron
Find a file
Matthew L McPeak 199463fd21
All checks were successful
ci / build (push) Successful in 19s
ci / publish (push) Successful in 13s
Refactor Icons
2026-07-16 14:07:49 -04:00
.forgejo/workflows Inital Commit 2026-07-16 12:38:41 -04:00
.vscode Inital Commit 2026-07-16 12:38:41 -04:00
docs/superpowers/specs Inital Commit 2026-07-16 12:38:41 -04:00
e2e Inital Commit 2026-07-16 12:38:41 -04:00
public Inital Commit 2026-07-16 12:38:41 -04:00
src Refactor Icons 2026-07-16 14:07:49 -04:00
.dockerignore Inital Commit 2026-07-16 12:38:41 -04:00
.editorconfig Inital Commit 2026-07-16 12:38:41 -04:00
.gitattributes Inital Commit 2026-07-16 12:38:41 -04:00
.gitignore Inital Commit 2026-07-16 12:38:41 -04:00
.oxfmtrc.json Inital Commit 2026-07-16 12:38:41 -04:00
.oxlintrc.json Inital Commit 2026-07-16 12:38:41 -04:00
bun.lock Refactor Icons 2026-07-16 14:07:49 -04:00
Dockerfile Inital Commit 2026-07-16 12:38:41 -04:00
env.d.ts Inital Commit 2026-07-16 12:38:41 -04:00
eslint.config.ts Inital Commit 2026-07-16 12:38:41 -04:00
global.d.ts Inital Commit 2026-07-16 12:38:41 -04:00
index.html Refactor Icons 2026-07-16 14:07:49 -04:00
nginx.conf Inital Commit 2026-07-16 12:38:41 -04:00
package.json Refactor Icons 2026-07-16 14:07:49 -04:00
playwright.config.ts Inital Commit 2026-07-16 12:38:41 -04:00
README.md Inital Commit 2026-07-16 12:38:41 -04:00
sample.env Inital Commit 2026-07-16 12:38:41 -04:00
tsconfig.app.json Inital Commit 2026-07-16 12:38:41 -04:00
tsconfig.json Inital Commit 2026-07-16 12:38:41 -04:00
tsconfig.node.json Inital Commit 2026-07-16 12:38:41 -04:00
tsconfig.vitest.json Inital Commit 2026-07-16 12:38:41 -04:00
vite.config.ts Inital Commit 2026-07-16 12:38:41 -04:00
vitest.config.ts Inital Commit 2026-07-16 12:38:41 -04:00

portfolio

Personal portfolio site built with Vue 3, Vite, and Tailwind CSS, styled with the @nychthemeron/library design system (private package, published to the Forgejo registry at git.mcpeakdev.com). Content is fetched at runtime from a small key-value API rather than baked into the bundle (see src/composables/useAPI.ts).

Project Setup

bun install

Copy sample.env to .env and fill in VITE_API_URL / VITE_API_KEY for the content API.

Compile and Hot-Reload for Development

bun dev

Type-Check, Compile and Minify for Production

bun run build

Run Unit Tests with Vitest

bun test:unit

Run End-to-End Tests with Playwright

# Install browsers for the first run
npx playwright install

# When testing on CI, must build the project first
bun run build

# Runs the end-to-end tests
bun test:e2e
# Runs the tests only on Chromium
bun test:e2e --project=chromium
# Runs the tests of a specific file
bun test:e2e tests/example.spec.ts
# Runs the tests in debug mode
bun test:e2e --debug

Lint and Format

Linting runs both oxlint and ESLint; formatting uses oxfmt.

bun lint
bun format

Docker

The Dockerfile serves a pre-built dist/ directory via nginx, so build the app first:

bun run build
docker build -t portfolio .
docker run --rm -p 8080:80 portfolio

The site will be available at http://localhost:8080.

CI publishing

A Forgejo Actions workflow (.forgejo/workflows/ci.yml) runs tests, type checks, and a build on every push and pull request. When a v* tag is pushed (e.g. v1.2.3), it also builds and pushes the image to the Forgejo container registry:

  • git.mcpeakdev.com/mcpeakml/portfolio:<version>
  • git.mcpeakdev.com/mcpeakml/portfolio:latest

This requires a REGISTRY_TOKEN repository secret containing a token with write:package permission for the registry, plus VITE_API_URL / VITE_API_KEY build-time variables (see ci.yml).