Files
mw-pfeddersheim-workstation/docs/tech/stack.md
T
mw cd63df4f59 docs(caddy): add agent0.localhost reverse proxy + RFC 6761 wildcard learning
- New site: https://agent0.localhost -> reverse_proxy 192.168.0.141:8090
  (first non-localhost backend; remote LAN host running uvicorn)
- Config in dedicated /etc/caddy/conf.d/agent0.localhost.conf
- Regenerated mkcert cert: 19 -> 20 SANs, valid until 2028-10-21
- Key learning: *.localhost wildcard is NOT honored by curl/system
  trust even for single-label subdomains - .localhost is a special-use
  TLD per RFC 6761; every subdomain needs an explicit SAN. Corrects
  prior assumption in stack.md and manual-overrides.md.

Updates: docs/tech/stack.md, docs/tech/manual-overrides.md, CHANGELOG.md
2026-07-21 14:08:07 +02:00

7.8 KiB

description, tags, last_updated
description tags last_updated
Detailed inventory of the core software stack, OS context, and maintenance policies for the mw-pfeddersheim-workstation.
software-stack
inventory
tech-stack
2026-07-12

Software Stack - mw-pfeddersheim-workstation

Core Development Environment

Technology Version Description
Node.js 25.6.1 Primary JavaScript/TypeScript runtime
Python 3.14.3 Secondary scripting and AI automation language
PHP 8.5.3 (CLI) Legacy and ERP integration language
Ansible 2.20.2 (core) Infrastructure provisioning and configuration
Docker 29.2.1 Containerization and environment isolation
Git latest Version control
ripgrep latest Fast line-oriented search tool (rg)
bat latest A cat clone with syntax highlighting
rustdesk latest Remote management via Tailscale

Desktop Environment

|| Technology | Version | Description | ||------------|---------|-------------| || Hyprland | 0.55.2 | Wayland compositor (uwsm-managed) | || Waybar | latest | Status bar (with USB auto-mount module) | || Kitty | latest | GPU-accelerated terminal emulator | || Fuzzel | latest | Application launcher (preferred over Wofi) | || Dunst | latest | Notification daemon | || yazi | latest | Terminal file manager (full deps: chafa, 7zip, resvg, etc.) |

Known Issues (2026-05-22 Boot Audit)

Domain Issue Status
PCIe slot GPU in bottom PCIEX4 slot (PCIe 2.0 x4, ~2 GB/s) instead of top PCIEX16 (PCIe 3.0 x16, ~16 GB/s). 8x bandwidth loss Pending: physical move required
PCIe slot NVMe Samsung PM9A1 running Gen2 x4 (8 GT/s) instead of Gen3 x4 (16 GT/s). May resolve after GPU slot fix + BIOS Gen3 setting Pending: BIOS tuning
Idle daemon hypridle SEGV crash loop — sdbus-cpp 2.3.0 ABI break Fixed: sdbus-cpp upgraded to 2.3.1-1
Webcam (UVC) Device 1-10 has multiple UVC control failures (zoom/pan/tilt/iris non-functional due to firmware non-compliance) Known hardware limitation, core capture works
KVM /dev/kvm unavailable — libvirtd cannot use hardware acceleration Open — check BIOS VT-x/AMD-V
Wi-Fi regulatory regulatory.db firmware missing — channels restricted Open — install wireless-regdb
D-Bus Stale org.kde.kwalletd6.service file; dunst/kscreen naming mismatches Fixed: kwalletd6 stub removed; kscreen/kscreenlocker/libkscreen uninstalled (35 MiB)
XDG portals Deprecated UseIn key usage (portals.conf preferred) Low priority, functional

Removed (2026-05-22, ADR 0007): All X11 display managers (lightdm, sddm), X11 video/input drivers (xf86-*), X11 tools (xterm, xorg-xinit, x11vnc, etc.), entire KDE Plasma stack (kwin, plasma-desktop, plasma-workspace, plasma-nm, plasma-pa, powerdevil, etc.), and Dolphin (replaced by yazi). greetd+tuigreet is the active DM. Screenshots use grim+slurp+grimblast.

Browsers

Technology Version Notes
Google Chrome 148.0.7778.178 (AUR) Sole browser — Wayland-native, VA-API on NVIDIA
Chromium removed All artifacts cleaned 2026-05-22 (see ADR 0006)

OS Context

  • OS: Linux (Manjaro/Arch Linux based)
  • Architecture: x86_64

Package Domain Classification (ADR 0007 Tier 4)

Packages previously listed as "Misc" reclassified to functional domains:

Package New Domain Role
uv Python Toolchain Fast Python package/env manager
jq Shell/Terminal JSON processor
inxi Hardware System hardware info
lsof Core OS List open files
iproute2 Network Advanced routing/networking
openresolv Network DNS resolver management
perl-image-exiftool Dev Tools Metadata read/write
icoutils Dev Tools ICO/ANE cursor extraction
innoextract-git Dev Tools Inno Setup installer extraction
opencl-headers GPU Compute OpenCL C headers
libxnvctrl-580xx NVIDIA NVML/XNVCTRL for 580xx
zram-generator Core OS Systemd zram swap generator
mkinitcpio-openswap Core OS Swap resume hook for mkinitcpio

Maintenance Policies

  • Updates: System-wide updates via pacman managed through maintenance scripts.
  • Node.js: Global packages managed via pnpm.
  • Python: Use uv for environment management.
  • PHP: Managed via system package manager, focused on CLI execution.

Tool Path Summary

  • Ansible: /usr/bin/ansible
  • Python: /usr/bin/python
  • Docker: /usr/bin/docker

Local Dev Services (Manual - not Ansible-managed)

System-level services running on this workstation that are configured manually outside this repo's Ansible roles. See docs/tech/manual-overrides.md for the full override table and docs/learnings/2026-07-06-caddy-onlyoffice-mcp-sse-investigation.md for the active Caddy/OnlyOffice investigation.

Caddy (port 443, systemd caddy.service)

Item Value
Package caddy (pacman)
Service caddy.service (enabled, runs as caddy user)
Config /etc/caddy/Caddyfile + /etc/caddy/conf.d/*.conf (main site file localhost-dev.conf, plus per-service files like agent0.localhost.conf)
TLS cert mkcert-generated pair at /etc/caddy/localhost{,-key}.pem; includes explicit SANs for all 20 hostnames, valid until 2028-10-21. The *.localhost wildcard is NOT honored by curl/system trust even for single-label subdomains like agent0.localhost (empirically verified 2026-07-21: .localhost is a special-use TLD per RFC 6761); every subdomain MUST be listed explicitly. Multi-label hosts like onlyoffice.docs.localhost additionally require explicit SANs because wildcards only cover one level.
Admin endpoint Unix socket /run/caddy/admin.socket
Sites 18 *.localhost virtual hosts (see table below)

*.localhost sites

Site Backend / Handler Notes
mcp.localhost reverse_proxy localhost:50880 MCP server (node, pid 1167)
artifacts.localhost file_server browse root /var/www/artifacts Static artifacts
onlyoffice.localhost reverse_proxy localhost:3847 OnlyOffice MCP server; emitting context canceled SSE aborts (issue #92)
project-1.localhost ... project-10.localhost respond "project-N - placeholder" 10 reserved placeholders
demo.satware.com.localhost reverse_proxy localhost:38081 webdevops/php-apache-dev container
platform.localhost reverse_proxy localhost:10080 amicron-platform Docker (Symfony 7.4 + Vue 3 + Firebird 3.0.14); ~/internal/amicron-platform
packages.localhost reverse_proxy localhost:20080 satis Docker (Composer package repository with token-based access control); ~/internal/satis
onlyoffice.docs.localhost file_server root /home/mw/internal/onlyoffice/docs-site/dist Starlight static docs build
agent0.localhost reverse_proxy 192.168.0.141:8090 First non-localhost backend (remote host on LAN, uvicorn app). Config in dedicated /etc/caddy/conf.d/agent0.localhost.conf. flush_interval -1 enabled.

Wildcard *.localhost only matches single-label subdomains (e.g. mcp.localhost) AND is not honored by curl/system trust for the .localhost special-use TLD (RFC 6761) - every subdomain needs an explicit SAN. Multi-label hosts like onlyoffice.docs.localhost and demo.satware.com.localhost require explicit SANs for both reasons.

Useful Caddy commands

sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo systemctl reload caddy
sudo journalctl -u caddy --no-pager -n 50
curl -sk https://onlyoffice.localhost/ping   # test (skips cert verify)