portfolio/README.md
2026-02-03 15:12:09 +00:00

48 lines
2 KiB
Markdown

# Portfolio
A high-performance, containerized professional portfolio and R&D lab built with **Next.js 15**, **Tailwind CSS**, and **TypeScript**. This project serves as both a public showcase and a dynamic bridge to a private **Forgejo** instance for real-time development tracking.
## 🏗️ Architecture Summary
- **Infrastructure**: Hosted on a **Hetzner** cloud node.
- **Containerization**: Fully Dockerized for **linux/amd64** architectures.
- **CI/CD**: Automated build and deployment via **Woodpecker CI**.
- **CDN**: Assets and media served via **Bunny CDN** for global performance.
- **Data Layer**: Dynamic changelog fetching from private repositories via **Forgejo API**.
## 🛠️ Technical Stack
- **Framework**: Next.js 15 (App Router).
- **Styling**: Tailwind CSS with a monospace "Technical Lab" aesthetic.
- **Icons**: Lucide React.
- **Deployment**: Docker Compose with `force-dynamic` runtime environment injection.
## 🚀 Deployment & Build
The project utilizes a specialized build process to ensure compatibility with the production Hetzner node environment:
### Manual Build
```bash
docker buildx build --platform linux/amd64 -t portfolio:latest .
```
### Automated Pipeline
Deployments are triggered via Git Releases. The Woodpecker pipeline executes the following steps:
-Build: Compiles the Next.js application for linux/amd64.
-Push: Uploads the image to a private container registry.
-Deploy: Re-creates the container on the Hetzner node, injecting the FORGEJO_TOKEN from a secure .env file at runtime.
## 🧪 The_Forge Integration
"The Forge" is a dynamic project log system that provides a glimpse into active R&D cycles.
-Metadata: Configured via data/forge.ts for project-specific details.
-Real-time Logs: Fetched server-side from private changelog.md files.
-Status: Includes a conditional ACTIVE_STREAM pulse based on commit recency.
-Performance: Utilizes Next.js data caching with a 1-hour revalidation window.
---
Built for performance and technical transparency.