Commercial website, documentation, and developer portal for Parametric Memory.
- Framework: Next.js 16 (App Router, TypeScript)
- Styling: Tailwind CSS + Framer Motion
- Payments: Stripe Checkout
- Docs: MDX, auto-generated from MMPM source
- Hosting: Docker + Nginx on DigitalOcean (SSH hardened, key-only access)
npm install
cp .env.example .env.local
# Fill in your keys in .env.local
npm run dev| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Production build |
npm run lint |
ESLint check |
npm run typecheck |
TypeScript check |
npm run test |
Run tests (Vitest) |
npm run format |
Auto-fix formatting with Prettier |
npm run format:check |
Check formatting without fixing |
npm run preflight |
Run all CI checks locally before pushing |
npm run generate-docs |
Regenerate docs from MMPM source |
Pushes to main trigger automatic deployment via GitHub Actions.
The pipeline: CI (Lint → Typecheck → Format Check → Test → Build) → Deploy (SSH to droplet → Docker build → Health check)
The Deploy workflow only runs after CI passes. If the health check fails, container logs are dumped for debugging.
Always run preflight locally first to catch issues before they hit CI:
npm run preflightVS Code is configured to auto-format on save (Prettier + ESLint).
The production droplet is SSH-hardened: root login disabled, password authentication disabled, access restricted to deploy and recover users only (key-based). CI/CD deploys via the deploy user. The recover user exists as an emergency fallback with sudo access.
src/
├── app/ # Next.js App Router pages and API routes
├── components/ # Reusable UI and feature components
├── lib/ # Shared utilities (Stripe, email, analytics)
└── test/ # Test setup and helpers
content/
├── docs/ # MDX documentation (auto-generated + manual)
└── blog/ # Blog posts (MDX)
scripts/
└── generate-docs.ts # Extracts API docs from MMPM source
This site is dual-accessibility by design — both humans and AI agents
(Claude-in-Chrome, Gemini, OpenAI Operator/Atlas, Playwright) must be able to
operate every button. See docs/DUAL-ACCESSIBILITY.md
for the data-testid + aria-* convention. Interactive elements without a
stable testid or accessible name fail CI (see scripts/check-testids.mjs,
shipping in sprint 2026-W18 item A6).
This software is proprietary. All rights reserved.
Copyright (c) 2025-2026 G. Osborne. Licensed to Parametric Memory Limited (New Zealand) under a separate written agreement; the author retains all underlying rights, title and interest.
See LICENSE for the full proprietary licence terms,
authorship statement and New Zealand jurisdiction clause.
Unauthorised use, reproduction, modification or distribution is prohibited. Licensing enquiries: entityone22@gmail.com