jwinterm abc968fe6f feat(web): a gate for the repository, starting with the tags in the built HTML
The site had no CI of any kind: no .github, no .gitea, no workflow. The only
automation touching production is the redeploy timer, and it runs no checks. So
`pnpm run check` now exists as the single command, lint then build then the
metadata assertions, and it is the thing a CI lane will eventually call.

The first assertion reads the emitted HTML, because that is the only place the
defect it catches is visible. Next composes metadata at build time and merges it
shallowly, so a page declaring its own `openGraph` silently replaces the parent's
image. No diff, no type error and no lint rule shows that; only the output does.
Reintroducing the bug on /support was confirmed to fail this check, and the
refusal names the route, the missing tag, and what breaks without it.

It refuses rather than passing vacuously when there is no build output, or when
the output holds no HTML. A metadata checker that reports success over zero pages
is worse than none, because it is quoted.

Four tags per page, each with its reason: og:image, twitter:image, canonical,
description. 51 of 51 today.
2026-09-05 23:42:40 -04:00

Such Software Website

Corporate website for Such Software LLC, a full-service software provider based in Kennett Square, PA.

Lighthouse Scores

Page Performance Accessibility SEO Best Practices
Home 99% 100% 100% 77%*
Services 98% 100% 100% 100%
About 99% 100% 100% 100%

*Home page Best Practices is 77% due to Cloudflare Turnstile third-party cookies.

Tech Stack

  • Next.js 15 with App Router
  • React 18 + TypeScript 5
  • Tailwind CSS 3 + Framer Motion 11
  • Radix UI accessible primitives
  • next-themes for dark/light mode
  • Zod for validation
  • Cloudflare Turnstile for bot protection
  • Turborepo + pnpm 9

Project Structure

such-software-site/
├── apps/web/               # Next.js website
│   ├── src/app/            # Pages (home, services, about)
│   ├── src/components/     # React components
│   ├── tests/              # Playwright a11y tests
│   └── public/             # Static assets
├── packages/ui/            # Shared UI components
└── packages/config/        # Shared config

Development

pnpm install    # Install dependencies
pnpm dev        # Start dev server at localhost:3000
pnpm build      # Production build
pnpm start      # Start production server

Testing

cd apps/web
pnpm test:a11y  # Run Playwright accessibility tests
pnpm test:ui    # Run tests with interactive UI

42 accessibility tests across Chromium, Firefox, and WebKit covering WCAG 2.2 AA criteria, heading hierarchy, color contrast, and keyboard navigation.

Accessibility

  • WCAG 2.2 AA: engineered to meet, audited against (Lighthouse measured 100%)
  • Skip-to-main link, semantic HTML5, ARIA labels
  • Proper heading hierarchy, color contrast (4.5:1+)
  • prefers-reduced-motion support
  • Keyboard navigation, focus indicators
  • Structured data (JSON-LD) and canonical URLs

Environment Variables

Create apps/web/.env.local:

NEXT_PUBLIC_TURNSTILE_SITE_KEY=your_site_key
TURNSTILE_SECRET_KEY=your_secret_key

See apps/web/.env.example for template.

License

Proprietary - Such Software LLC

S
Description
company website
Readme
47 MiB
Languages
TypeScript 81%
MDX 15.3%
CSS 2.8%
JavaScript 0.9%