Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

144 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lusk Website Template

CIcodecovQuality Gate StatusLicense: MIT

A reusable Next.js + TypeScript website template for Lusk Technologies. Ships with compliance pages, analytics/monitoring integrations, security tooling, CI/CD workflows, GitHub community documents, and deployment support for both Vercel and Netlify.

Features

  • Next.js 16 with TypeScript 5.9 and App Router
  • Region-adaptive cookie consent — GDPR (EU), CCPA (California), and general banners
  • Privacy Policy & Terms of Service pages with placeholder content
  • SEO — Open Graph, Twitter Cards, JSON-LD structured data, sitemap, robots.txt
  • Security headers — CSP, X-Frame-Options, HSTS, and more via vercel.json / netlify.toml
  • Analytics — Configurable provider (Google Analytics, Plausible, Umami) gated on cookie consent
  • Axiom — Structured logging for page views, errors, and Web Vitals
  • Sentry — Client + server error tracking with source map uploads
  • Pre-commit hooks — Husky + lint-staged + commitlint (Conventional Commits)
  • Linting & formatting — ESLint 10 + Prettier 3.8
  • Testing — Vitest + fast-check property-based tests with Istanbul coverage
  • CI/CD — 11 GitHub Actions workflows with secret-guarded graceful skipping
  • Deployment — Vercel and Netlify configs included
  • Community docs — LICENSE, CODE_OF_CONDUCT, SECURITY, issue/PR templates, CODEOWNERS

Quick Start

# 1. Clone the template (or click "Use this template" on GitHub)
git clone https://github.com/LUSKTECH/lusk-website-template.git my-site
cd my-site
# 2. Install dependencies
npm install
# 3. Set up environment variables
cp .env.example .env.local
# Edit .env.local — at minimum set NEXT_PUBLIC_SITE_URL# 4. Start the dev server
npm run dev

Open http://localhost:3000 to see the site.

Available Scripts

ScriptDescription
npm run devStart the Next.js development server
npm run buildProduction build
npm startServe the production build
npm run lintRun ESLint
npm run formatCheck formatting with Prettier
npm run format:fixAuto-fix formatting
npm run testRun tests in watch mode
npm run test:runRun tests once (CI mode)
npm run test:coverageRun tests with Istanbul coverage

Environment Variables

Copy .env.example to .env.local and configure the values for your project. Required variables block the build; optional variables produce a warning if missing.

VariableRequiredPurposeUsed By
NEXT_PUBLIC_SITE_URLYesPublic site URL for SEO metadata and canonical linksApp, SEO component
NEXT_PUBLIC_GA_IDNoGoogle Analytics measurement IDAnalytics integration
AXIOM_TOKENNoAxiom API token for structured log ingestionAxiom integration
AXIOM_DATASETNoAxiom dataset name for log routingAxiom integration
SENTRY_DSNNoSentry DSN for error captureSentry integration
SENTRY_AUTH_TOKENNoSentry auth token for source map uploadsBuild process
DISCORD_WEBHOOK_URLNoDiscord webhook for CI/CD notificationsdiscord-notify.yml
VERCEL_TOKENNoVercel deployment tokendeploy-preview.yml, deploy-production.yml
NETLIFY_AUTH_TOKENNoNetlify deployment tokendeploy-preview.yml, deploy-production.yml
CODECOV_TOKENNoCodecov upload token for coverage reportsci.yml
LHCI_GITHUB_APP_TOKENNoLighthouse CI GitHub App tokenlighthouse.yml
TRIVY_ENABLEDNoSet to true to enable Trivy scanningsecurity.yml
SNYK_TOKENNoSnyk API token for dependency scanningsecurity.yml
SAFETY_API_KEYNoSafety CLI API key for Python dependency scanningsecurity.yml
SONAR_TOKENNoSonarQube token for code quality analysissonarqube.yml
QLTY_TOKENNoqlty.sh token for code quality metricsqlty.yml

All optional secrets should be added as GitHub repository secrets for CI workflows to use them.

Deployment

Vercel

  1. Push your repo to GitHub.
  2. Import the project at vercel.com/new.
  3. Set environment variables in the Vercel dashboard (at minimum NEXT_PUBLIC_SITE_URL).
  4. Vercel auto-detects Next.js — no additional build config needed.
  5. Security headers are configured in vercel.json.

For CI-driven deployments, add VERCEL_TOKEN as a GitHub repository secret. The deploy-preview.yml and deploy-production.yml workflows will handle preview and production deploys automatically.

Netlify

  1. Push your repo to GitHub.
  2. Import the project at app.netlify.com.
  3. Set environment variables in the Netlify dashboard.
  4. Build settings are configured in netlify.toml (build command: npm run build, publish directory: .next).
  5. Security headers are configured in netlify.toml.

For CI-driven deployments, add NETLIFY_AUTH_TOKEN as a GitHub repository secret. The same deploy workflows support Netlify as an alternative to Vercel.

CI/CD Workflows

All workflows live in .github/workflows/. Optional integrations use a secret-guard pattern — when the required secret is missing, the job is skipped with a neutral status and a skip-notice is logged.

WorkflowTriggerSecret GuardDescription
ci.ymlPush, PRLint (ESLint), format check (Prettier), test (Vitest) with coverage. Uploads to Codecov when CODECOV_TOKEN is set.
security.ymlPR, weekly scheduleTRIVY_ENABLED, SNYK_TOKEN, SAFETY_API_KEYRuns Trivy, Snyk, and Safety CLI security scans. Each scanner is independently guarded. Fails on critical/high findings.
lighthouse.ymlPRLHCI_GITHUB_APP_TOKENLighthouse CI performance, accessibility, best practices, and SEO checks against configurable thresholds.
deploy-preview.ymlPRVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys PR branches to a preview URL on the configured platform.
deploy-production.ymlPush to mainVERCEL_TOKEN or NETLIFY_AUTH_TOKENDeploys the main branch to production.
sonarqube.ymlPR, push to mainSONAR_TOKENSonarQube code quality and security analysis.
qlty.ymlPRQLTY_TOKENqlty.sh code quality analysis.
a11y.ymlPRaxe-core accessibility testing. Fails on WCAG 2.1 Level AA violations.
stale.ymlDaily scheduleCalls reusable stale bot workflow from LUSKTECH/.github. Labels issues inactive for 30 days, closes after 7 more. Exempts pinned and security labels.
automerge.ymlPR (Dependabot)Auto-merges Dependabot patch/minor PRs when all checks pass.
discord-notify.ymlWorkflow runDISCORD_WEBHOOK_URLCalls reusable Discord notification workflow from LUSKTECH/.github. Sends formatted embeds on CI events.

Reusable Workflows

This template references reusable workflows from the LUSKTECH/.github repository:

  • reusable-discord-notify.yml — Sends formatted Discord embeds with build/deploy status
  • reusable-stale.yml — Labels and closes stale issues/PRs with configurable thresholds
  • reusable-security-scan.yml — Runs Trivy, Snyk, or Safety CLI scans with shared configuration

Contributing

  1. Fork the repository and create a feature branch.
  2. Make your changes — pre-commit hooks will run ESLint, Prettier, and commitlint automatically.
  3. Write or update tests for your changes.
  4. Ensure all tests pass: npm run test:run
  5. Open a pull request using the PR template.

Commit Convention

This project uses Conventional Commits. Commit messages are validated by commitlint via a Husky commit-msg hook.

feat(cookie): add marketing consent toggle
fix(seo): correct canonical URL generation
docs: update deployment instructions
chore(deps): bump next to 16.1.6

Code Quality

  • ESLint enforces code style and catches common issues
  • Prettier ensures consistent formatting
  • Husky runs pre-commit hooks for lint-staged and commitlint
  • Vitest with fast-check provides unit and property-based test coverage

Project Structure

├── .github/
│ ├── workflows/ # CI/CD workflow files
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request, question templates
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ └── dependabot.yml
├── public/ # Static assets (favicons, robots.txt, manifest)
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── privacy/ # Privacy Policy page
│ │ ├── terms/ # Terms of Service page
│ │ ├── layout.tsx # Root layout with cookie banner
│ │ ├── not-found.tsx # Custom 404 page
│ │ ├── error.tsx # Custom 500 page
│ │ └── sitemap.ts # Auto-generated sitemap
│ ├── components/ # React components (SEO, CookieBanner, CookiePreferences)
│ └── lib/ # Utilities (env validation, analytics, Axiom, Sentry, CSP, cookie consent)
├── __tests__/ # Test files
│ ├── unit/ # Unit tests
│ └── properties/ # Property-based tests (fast-check)
├── vercel.json # Vercel deployment config + security headers
├── netlify.toml # Netlify deployment config + security headers
├── vitest.config.ts # Vitest configuration
├── lighthouserc.js # Lighthouse CI thresholds
├── codecov.yml # Codecov coverage thresholds
├── sonar-project.properties # SonarQube project config
├── .qlty.toml # qlty.sh quality gates
└── .env.example # Environment variable reference

License

This project is licensed under the MIT License. See LICENSE for details.

Repobeats

Repobeats analytics image

AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

About

A blueprint for new sites.

Resources

Code of conduct

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages