About
About Me
I've been lucky to build a career in technology.
I'm an engineer and architect who believes software should make the world steadier, not noisier. My work and my life run on the same principles:
- be humble
- be kind
- be useful
- say what's true
- take responsibility
I optimize for long time horizons. I care about tradeoffs, edge cases, and the person who has to operate the system at 2 a.m.
Speed matters. Judgment matters more.
What I Won't Build
- dark patterns — engagement mechanics designed to exploit
- systems without auditability or rollback
- features that quietly degrade user agency
- growth-at-all-costs architecture that ignores long-term cost
There are easier ways to make money. This isn't what I'm here for.
On AI
I use AI heavily. Work that used to take a year takes a month. That compression doesn't come at the cost of quality — it buys more of it. More test coverage, more engineering rigor, more advanced features at a fraction of the cost. The time constraint that can make good engineering expensive shrinks significantly.
What makes it work is judgment. AI can generate. It can't prioritize, can't read an org, can't translate what a stakeholder actually means versus what they said. Architecture decisions, system boundaries, the call to slow down or push back — that's experience. That stays mine.
Technical Stack
Frontend
- React, TypeScript
- Astro, Next.js
- Tailwind CSS
- Modern JavaScript (ES2024+)
Backend & Infrastructure
- Node.js, Python, Java
- DynamoDB, PostgreSQL, MongoDB
- Docker, Kubernetes
- AWS, Azure, GCP
About This Site
This is a portfolio site built the way I'd build anything that matters. The scale is small. The practices aren't.
Stack
- Framework: Astro 5 - Islands architecture, zero JS by default
- UI: React 19, TypeScript (strict mode), Tailwind CSS 4
- Deployment: Cloudflare Pages (main site), GitHub Pages (architecture docs)
- Source: github.com/chrislyons-dev/home
CI/CD Pipeline
Every push triggers a full quality gate:
- Change detection - Skip deployment for docs-only changes (grep filter for
^(docs/|.*\.md$)) - Commit validation - Conventional commits enforced via commitlint
- Code quality - Prettier format check, ESLint (TypeScript strict), type check (tsc --noEmit)
- Tests - Vitest with coverage tracking (V8 provider)
- Build - Astro production build with Lightning CSS minification
- Lighthouse CI - 3 runs - 5 pages, scores 95 required (Performance, Accessibility, Best Practices, SEO)
- Performance tracking - Lighthouse scores auto-committed to
docs/performance.md
Deployment requires: [ok] All checks pass, [ok] Concurrency control (no simultaneous deploys), [ok] CSP hash generation, [ok] Docs validation
Security
- Content Security Policy: Build-time script hashing - scan built HTML for
inline scripts, generate SHA-256 hashes, inject into
_headers. Nounsafe-inline, no nonces. - HTTP Security Headers: X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Strict-Transport-Security, Referrer-Policy
- No tracking: Zero analytics, zero cookies, zero third-party scripts
- Dependency scanning: npm audit on every CI run, Dependabot for automated updates
Architecture as Code
- Auto-generated diagrams: C4 system context, container, and component diagrams - PlantUML generated from source on every commit
- Dependency graphs: Module relationships visualized with Mermaid, circular dependency detection enforced
- Route maps: File-based routing structure auto-documented from
src/pages/ - Docs publishing: MkDocs site built and deployed to GitHub Pages on every PR to main
Performance
- Island architecture: Zero JS shipped by default, selective hydration (
client:idle,client:visible) - Static generation: No runtime server, pages pre-rendered at build time
- View Transitions API: Smooth page navigation without SPA overhead
- Edge CDN: Cloudflare Pages global distribution, immutable caching for assets (1 year), short cache for HTML (5 min + stale-while-revalidate)
- Current scores: All pages maintain Lighthouse scores >=95 across all metrics
Pre-Commit Hooks
Husky enforces quality gates before every commit:
- Format check (Prettier)
- Lint (ESLint)
- Type check (tsc)
- Tests (Vitest)
- Architecture docs generation
- Dependency analysis (circular deps, orphans)
Why this matters: The code shows more than a list of principles ever could. Read the source, check the CI logs, inspect the headers. This site is a portfolio piece that references itself.