From ed946c03d7385d26b79861de8a0ab4fbeed9054d Mon Sep 17 00:00:00 2001 From: Luigi Maiorano Date: Fri, 10 Apr 2026 12:41:18 +0200 Subject: [PATCH] Initial project scaffold: Astro + OpenSpec + Claude Code config --- .claude/CLAUDE.md | 69 + .claude/commands/opsx/apply.md | 152 + .claude/commands/opsx/archive.md | 157 + .claude/commands/opsx/continue.md | 114 + .claude/commands/opsx/explore.md | 173 + .claude/commands/opsx/new.md | 69 + .claude/commands/opsx/onboard.md | 550 ++ .claude/commands/opsx/propose.md | 106 + .claude/commands/opsx/sync.md | 134 + .claude/commands/opsx/verify.md | 164 + .claude/settings.json | 22 + .claude/skills/openspec-apply-change/SKILL.md | 156 + .../skills/openspec-archive-change/SKILL.md | 114 + .../skills/openspec-continue-change/SKILL.md | 118 + .claude/skills/openspec-explore/SKILL.md | 288 + .claude/skills/openspec-new-change/SKILL.md | 74 + .claude/skills/openspec-onboard/SKILL.md | 554 ++ .claude/skills/openspec-propose/SKILL.md | 110 + .claude/skills/openspec-sync-specs/SKILL.md | 138 + .../skills/openspec-verify-change/SKILL.md | 168 + .gitignore | 33 + .mcp.json | 8 + openspec/config.yaml | 38 + qumo-website-rebuild-plan.md | 830 +++ website/.vscode/extensions.json | 4 + website/.vscode/launch.json | 11 + website/README.md | 43 + website/astro.config.mjs | 5 + website/package-lock.json | 4849 +++++++++++++++++ website/package.json | 22 + website/public/favicon.ico | Bin 0 -> 655 bytes website/public/favicon.svg | 9 + .../fonts/archia/archia-bold-webfont.woff | Bin 0 -> 19684 bytes .../fonts/archia/archia-bold-webfont.woff2 | Bin 0 -> 14136 bytes .../fonts/archia/archia-light-webfont.woff | Bin 0 -> 19908 bytes .../fonts/archia/archia-light-webfont.woff2 | Bin 0 -> 14240 bytes .../fonts/archia/archia-medium-webfont.woff | Bin 0 -> 20436 bytes .../fonts/archia/archia-medium-webfont.woff2 | Bin 0 -> 14484 bytes .../fonts/archia/archia-regular-webfont.woff | Bin 0 -> 19244 bytes .../fonts/archia/archia-regular-webfont.woff2 | Bin 0 -> 13656 bytes .../fonts/archia/archia-semibold-webfont.woff | Bin 0 -> 20240 bytes .../archia/archia-semibold-webfont.woff2 | Bin 0 -> 14460 bytes .../fonts/archia/archia-thin-webfont.woff | Bin 0 -> 19676 bytes .../fonts/archia/archia-thin-webfont.woff2 | Bin 0 -> 14004 bytes website/src/pages/index.astro | 17 + website/tsconfig.json | 5 + 46 files changed, 9304 insertions(+) create mode 100644 .claude/CLAUDE.md create mode 100644 .claude/commands/opsx/apply.md create mode 100644 .claude/commands/opsx/archive.md create mode 100644 .claude/commands/opsx/continue.md create mode 100644 .claude/commands/opsx/explore.md create mode 100644 .claude/commands/opsx/new.md create mode 100644 .claude/commands/opsx/onboard.md create mode 100644 .claude/commands/opsx/propose.md create mode 100644 .claude/commands/opsx/sync.md create mode 100644 .claude/commands/opsx/verify.md create mode 100644 .claude/settings.json create mode 100644 .claude/skills/openspec-apply-change/SKILL.md create mode 100644 .claude/skills/openspec-archive-change/SKILL.md create mode 100644 .claude/skills/openspec-continue-change/SKILL.md create mode 100644 .claude/skills/openspec-explore/SKILL.md create mode 100644 .claude/skills/openspec-new-change/SKILL.md create mode 100644 .claude/skills/openspec-onboard/SKILL.md create mode 100644 .claude/skills/openspec-propose/SKILL.md create mode 100644 .claude/skills/openspec-sync-specs/SKILL.md create mode 100644 .claude/skills/openspec-verify-change/SKILL.md create mode 100644 .gitignore create mode 100644 .mcp.json create mode 100644 openspec/config.yaml create mode 100644 qumo-website-rebuild-plan.md create mode 100644 website/.vscode/extensions.json create mode 100644 website/.vscode/launch.json create mode 100644 website/README.md create mode 100644 website/astro.config.mjs create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/public/favicon.ico create mode 100644 website/public/favicon.svg create mode 100644 website/src/assets/fonts/archia/archia-bold-webfont.woff create mode 100644 website/src/assets/fonts/archia/archia-bold-webfont.woff2 create mode 100644 website/src/assets/fonts/archia/archia-light-webfont.woff create mode 100644 website/src/assets/fonts/archia/archia-light-webfont.woff2 create mode 100644 website/src/assets/fonts/archia/archia-medium-webfont.woff create mode 100644 website/src/assets/fonts/archia/archia-medium-webfont.woff2 create mode 100644 website/src/assets/fonts/archia/archia-regular-webfont.woff create mode 100644 website/src/assets/fonts/archia/archia-regular-webfont.woff2 create mode 100644 website/src/assets/fonts/archia/archia-semibold-webfont.woff create mode 100644 website/src/assets/fonts/archia/archia-semibold-webfont.woff2 create mode 100644 website/src/assets/fonts/archia/archia-thin-webfont.woff create mode 100644 website/src/assets/fonts/archia/archia-thin-webfont.woff2 create mode 100644 website/src/pages/index.astro create mode 100644 website/tsconfig.json diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000..39d1f9a --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,69 @@ +# qumo.io Website + +## What this is + +The company website for Qumo (qumo.io), a data analytics consultancy targeting Dutch MKB companies. Built with Astro 5, Tailwind CSS, and served from Docker containers behind Caddy. + +## Execution environment + +Claude Code runs inside a nono sandbox (`nono run --profile claude-openspec -- claude`). +- The sandbox grants read+write to the working directory and `~/.claude` +- Network access is enabled (Anthropic API, npm registry, Astro MCP server) +- All filesystem and network boundaries are kernel-enforced by nono (Landlock on Linux) +- Do NOT attempt to access files outside the project directory or `~/.claude` + +## Architecture + +- **Framework**: Astro 5 (static output, zero JS by default) +- **Styling**: Tailwind CSS with custom Qumo brand tokens +- **Font**: Archia (self-hosted woff2, licensed from Atipo Foundry) +- **Localization**: EN (default) + NL, file-based routing with JSON content strings +- **Contact form**: Go backend at /api/contact, honeypot + timestamp spam protection +- **Deployment**: Docker multi-stage build → nginx:stable-alpine-slim → Caddy reverse proxy +- **Hosting**: Self-hosted VPS behind Cloudflare (orange cloud, Full strict TLS) +- **Git**: Gitea at gitea.qumo.io + +## Brand guidelines (must follow) + +- **Colors**: Midnight #102022 (primary dark), Snow #F3F3F3 (light bg), Gradient #5257E4 → #F71E3E (accent only, never as flat standalone colors) +- **Font**: Archia — Bold/SemiBold for headings (uppercase), Regular for body (sentence case) +- **Icons**: Phosphor Icons, light weight, 32px baseline, SVG format +- **Logo**: Q icon can stand alone. Wordmark must always pair with Q icon. Never modify. +- **Brand element**: Q-corner motif, can be used as corner accent or tiled pattern + +## Code conventions + +- Astro components use `.astro` extension +- All text content comes from `src/content/en.json` and `src/content/nl.json` — never hardcode user-visible strings in components +- CSS uses Tailwind utilities. Custom CSS only for animations and font-face declarations +- Images go in `src/assets/` and use Astro's `` component (never raw `` tags for raster images) +- SVGs can be inlined directly in components +- No client-side JavaScript frameworks (React, Vue, etc.) — use vanilla JS in `