A responsive Linux-terminal-themed portfolio for Joshua Terk, Senior Software Engineer. The site presents his work, writing, technology interests, and automotive projects through a custom React terminal backed by Spring Boot APIs.
The maintenance audit records the code review, dependency updates, and verification evidence. Current source navigation and build instructions follow.
- Java 25, with
JAVA_HOMEpointing to that installation. - Node.js 26.10.0 and npm;
.nvmrcselects the supported version. - The checked-in Maven wrapper downloads the project's Maven distribution.
From the repository root:
./mvnw test
./mvnw package
java -jar target/website-0.0.1-SNAPSHOT.jarThe Maven lifecycle installs frontend dependencies from the lockfile, typechecks TypeScript, builds the frontend, and packages the UI with the backend. The default local server listens on port 8080. ./mvnw spring-boot:run is also available for backend development.
For frontend development, keep the backend running and use a second terminal:
cd frontend
npm ci
npm run devVite serves the development UI on port 3000. npm run build runs TypeScript checking and creates production assets; npm run preview previews that build. Use the packaged Spring Boot application when verifying backend-dependent terminal commands.
- App.tsx renders the boot sequence and CustomTerminalEnhanced.tsx.
- Content such as
about,portfolio,blog, andresumecomes from classpath resources and the content API. - Contact information is returned by
GET /api/contact. The current site uses contact links; it does not submit or persist a contact form. /api/blogexposes read-only access to the legacy JPA-backed blog. The terminal's Markdown blog and portfolio use/api/content/**instead.- The H2 database is ephemeral by default. Resource-backed articles and portfolio entries are checked-in files, independent of that database.
/actuator/healthreports application health. The terminal's server-information commands are deliberately public display features.
CI and deployment configuration contain the automated build and image-publication rules. See the maintenance audit for the private-runner contract, validation evidence, and activation boundaries.
The Dockerfile tests and builds with Java 25 and Node 26, then uses jdeps and jlink to create the Java runtime. The final Alpine image contains the application and linked runtime, runs as UID/GID 1001, and excludes Maven, Node, Java compiler tools, and source resources outside the JAR. CI boots that image, exercises PDF/content/UI routes, and scans its filesystem with Trivy before image publication. Any reported OS or Java-library vulnerability fails the scan; the scan uses current advisory data rather than guaranteeing future vulnerability absence.
Container and reverse-proxy settings live under infrastructure. Verify the locally installed Docker or Podman Compose provider before running its commands.
Preserve the accessible terminal navigation and existing content. Run the relevant checks before submitting changes. New catalogue entries require owner selection.
The historical session notes describe earlier designs and are not a current feature checklist or proof of deployment.