mirror of
https://github.com/kevinveenbirkenbach/homepage.veen.world.git
synced 2026-08-23 20:54:33 +00:00
a42930a699e56f1b01a6c2881bd95c2a1ab4cbe9
test-e2e drove Cypress through act, which fails to start where it cannot resolve a host address for its artifact server. It now starts Flask and Cypress in one shell via scripts/run-e2e.sh, so both share a network namespace; the act path stays available as test-e2e-act. The script guards the cases that made the old target lie: it aborts when something already serves the port instead of testing that server, checks that its own Flask is alive before trusting a response, pins Cypress to the same origin Flask binds, and drops ELECTRON_RUN_AS_NODE, which VS Code exports and which makes Cypress' bundled Electron reject its own flags. 30 YAML and 18 JavaScript files had no linter. yamllint runs correctness rules only, because the repository predates it and its cosmetic findings would be noise; key-duplicates is the one that earns its keep, since PyYAML keeps the last of two identical keys without complaining. eslint runs the recommended set and already found a dead getBoundingClientRect() call in navigation.js. Both get a CI job so make lint and the workflows stop diverging. flask>=3.1 because app.config["TRUSTED_HOSTS"] arrived in 3.1 and an older Flask accepts the key and ignores it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PortUI 🖥️✨
A lightweight, Docker-powered portfolio/landing-page generator—fully customizable via YAML! Showcase your projects, skills, and online presence in minutes.
🚀 You can also pair PortUI with JavaScript for sleek, web-based desktop-style interfaces.
💻 Example in action: CyMaIS.Cloud (demo)
🌐 Another live example: veen.world (Kevin’s personal site)
✨ Key Features
- Dynamic Navigation
Create dropdowns & nested menus with ease. - Customizable Cards
Highlight skills, projects, or services—with icons, titles, and links. - Smart Cache Management
Auto-cache assets for lightning-fast loading. - Responsive Design
Built on Bootstrap; looks great on desktop, tablet & mobile. - YAML-Driven
All content & structure defined in a simpleconfig.yaml. - CLI Control
Manage Docker containers via theportfoliocommand.
🌐 Quick Access
- Local Preview:
http://127.0.0.1:5000
🏁 Getting Started
🔧 Prerequisites
- Docker & Docker Compose
- Basic Python & YAML knowledge
🛠️ Installation via Git
-
Clone & enter repo
git clone <repository_url> cd <repository_directory> -
Configure Copy
config.sample.yaml→config.yaml& customize. -
Build & run
docker-compose up --build -
Browse Open http://localhost:5000
📦 Installation via Kevin’s Package Manager
pkgmgr install portui
Once installed, the portui CLI is available system-wide.
🖥️ CLI Commands
portui --help
buildBuild the Docker imageupStart containers (with build)downStop & remove containersrun-devDev mode (hot-reload)run-prodProduction modelogsView container logsdevDocker-Compose dev environmentprodDocker-Compose prod environmentcleanupPrune stopped containers
🔧 YAML Configuration Guide
Define your site’s structure in config.yaml:
accounts:
name: Online Accounts
description: Discover my online presence.
icon:
class: fa-solid fa-users
children:
- name: Channels
description: Platforms where I share content.
icon:
class: fas fa-newspaper
children:
- name: Mastodon
description: Follow me on Mastodon.
icon:
class: fa-brands fa-mastodon
url: https://microblog.veen.world/@kevinveenbirkenbach
identifier: "@kevinveenbirkenbach@microblog.veen.world"
cards:
- icon:
source: https://cloud.veen.world/s/logo_agile_coach_512x512/download
title: Agile Coach
text: I lead agile transformations and improve team dynamics through Scrum and Agile Coaching.
url: https://www.agile-coach.world
link_text: www.agile-coach.world
company:
title: Kevin Veen-Birkenbach
subtitle: Consulting & Coaching Solutions
logo:
source: https://cloud.veen.world/s/logo_face_512x512/download
favicon:
source: https://cloud.veen.world/s/veen_world_favicon/download
address:
street: Afrikanische Straße 43
postal_code: DE-13351
city: Berlin
country: Germany
imprint_url: https://s.veen.world/imprint
childrenenables multi-level menus.linkreferences other YAML paths to avoid duplication.
🚢 Production Deployment
- Use a reverse proxy (NGINX/Apache).
- Secure with SSL/TLS.
- Swap to a production database if needed.
📜 License
Licensed under GNU AGPLv3. See LICENSE for details.
✍️ Author
Created by Kevin Veen-Birkenbach
Enjoy building your portfolio! 🌟
Languages
Python
53.4%
JavaScript
33.5%
Jinja
5.9%
Makefile
3.3%
CSS
2.5%
Other
1.4%
