| .forgejo/workflows | ||
| .vscode | ||
| docs/superpowers/specs | ||
| e2e | ||
| public | ||
| src | ||
| .dockerignore | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .oxfmtrc.json | ||
| .oxlintrc.json | ||
| bun.lock | ||
| Dockerfile | ||
| env.d.ts | ||
| eslint.config.ts | ||
| global.d.ts | ||
| index.html | ||
| nginx.conf | ||
| package.json | ||
| playwright.config.ts | ||
| README.md | ||
| sample.env | ||
| tsconfig.app.json | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| tsconfig.vitest.json | ||
| vite.config.ts | ||
| vitest.config.ts | ||
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).