Skip to main content

Portfolio App Configuration Reference

Purpose

Provide a centralized reference for all Portfolio App configuration files, including rationale, options, and troubleshooting guidance.

Scope

Configuration files covered:

  • next.config.ts — Next.js framework configuration
  • eslint.config.mjs — ESLint linting rules (flat config)
  • prettier.config.mjs — Prettier formatting rules
  • postcss.config.mjs — PostCSS and Tailwind integration
  • tsconfig.json — TypeScript compiler options
  • .nvmrc — Node version pinning

next.config.ts

Current configuration

import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
/* config options here */
reactCompiler: true,
};

export default nextConfig;

Options

reactCompiler: true

  • Enables the React Compiler (React 19 experimental feature)
  • Automatically optimizes components for performance
  • See ADR-0009 for decision rationale
  • Rollback: set to false if compiler issues arise

Future options (staged)

  • basePath — if deploying to a subpath (not planned)
  • images.remotePatterns — for external image optimization (when needed)
  • experimental.ppr — Partial Prerendering (Phase 3+)

References


eslint.config.mjs

Current configuration

import { defineConfig, globalIgnores } from 'eslint/config';
import nextVitals from 'eslint-config-next/core-web-vitals';
import nextTs from 'eslint-config-next/typescript';

const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
globalIgnores([
'.next/**',
'out/**',
'dist/**',
'coverage/**',
'.vercel/**',
'next-env.d.ts',
]),
]);

export default eslintConfig;

Configuration approach

  • Flat config (ESLint 9+) — modern ESLint standard
  • Presets:
    • eslint-config-next/core-web-vitals — Next.js recommended rules (accessibility, performance)
    • eslint-config-next/typescript — TypeScript integration rules
  • Global ignores — build artifacts, generated files, vendor folders

Rationale

  • Flat config simplifies composition and improves clarity
  • Next.js presets align with framework best practices
  • Zero warnings enforced via --max-warnings=0 in CI

Troubleshooting

  • Lint failures on type issues: Ensure tsconfig.json is valid and pnpm typecheck passes
  • Rules too strict: Override specific rules in eslintConfig array if justified; document via ADR if significant
  • Ignores not working: Verify paths match repo structure; flat config uses ** glob patterns

References


prettier.config.mjs

Current configuration

/** @type {import("prettier").Config} */
const config = {
semi: true,
singleQuote: false,
trailingComma: 'all',
printWidth: 100,
tabWidth: 2,
plugins: ['prettier-plugin-tailwindcss'],
};

export default config;

Options explained

OptionValueRationale
semitrueExplicit semicolons for clarity (standard JS convention)
singleQuotefalseDouble quotes for consistency with JSON and JSX defaults
trailingComma"all"Cleaner diffs and easier array/object expansion
printWidth100Balance readability and horizontal space
tabWidth2Standard for modern JS/TS projects
plugins["prettier-plugin-tailwindcss"]Automatic Tailwind class sorting

Tailwind plugin

  • Purpose: Automatically sorts Tailwind utility classes in a consistent order
  • Benefit: Eliminates manual class ordering; improves diff quality
  • Requirement: ESM config (prettier.config.mjs) to support plugin ESM/TLA

Troubleshooting

  • Format check fails repeatedly: Run pnpm format:write locally and commit
  • Plugin errors: Ensure prettier-plugin-tailwindcss version is compatible with prettier and tailwindcss versions
  • Config not loading: Verify filename is prettier.config.mjs (ESM) not .prettierrc (JSON)

References


postcss.config.mjs

Current configuration

/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
'@tailwindcss/postcss': {},
},
};

export default config;

Options

@tailwindcss/postcss

  • Tailwind CSS v4 PostCSS plugin
  • Processes @import "tailwindcss" in globals.css
  • No additional configuration needed (Tailwind v4 uses CSS-first config)

Rationale

  • Tailwind v4 requires PostCSS integration via this plugin
  • Simpler than v3 (no tailwind.config.js needed for basic usage)
  • See ADR-0010 for Tailwind v4 decision (to be created)

References


tsconfig.json

Key compiler options

{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [{ "name": "next" }],
"paths": {
"@/*": ["./src/*"]
}
}
}

Important options

OptionValuePurpose
stricttrueEnable all strict type-checking options
noEmittrueType-check only (Next.js handles build)
moduleResolutionbundlerModern module resolution for Next.js 15+
paths{ "@/*": ["./src/*"] }Path alias for cleaner imports
plugins[{ "name": "next" }]Next.js TypeScript plugin for App Router support

Rationale

  • Strict mode: Catches type errors early; improves code quality
  • Path aliases: Clean imports (@/components/Callout vs ../../components/Callout)
  • Next.js plugin: Provides App Router type support and validation

Troubleshooting

  • Type errors in .next/ folder: Ensure .next/** is in ESLint/TS ignore lists
  • Module resolution errors: Verify moduleResolution: "bundler" and Next.js version compatibility
  • Path alias not working: Check baseUrl is set (implicitly ./ in Next.js) and paths matches actual structure

References


.nvmrc

Current configuration

20

Purpose

  • Pins Node.js version to 20 LTS
  • Used by nvm use or compatible Node version managers
  • Ensures consistent Node version across local dev and CI

Rationale

  • Node 20 LTS: Active long-term support; security updates; modern features
  • Determinism: Same Node version locally and in CI reduces "works on my machine" issues
  • Upgrade policy: Follow Node.js LTS schedule; document via ADR when upgrading

References


Configuration change policy

When to update configuration

  • Security advisories requiring version bumps
  • Performance improvements with measurable benefit
  • Framework/tooling upgrades (Next.js, ESLint, Prettier)
  • New features requiring config changes (e.g., React Compiler)

Process for significant changes

  1. Create ADR if decision is durable (e.g., enable React Compiler, adopt new ESLint rules)
  2. Update configuration file
  3. Test locally: pnpm quality && pnpm build
  4. Validate in CI: open PR, verify checks pass
  5. Update this reference doc if options change
  6. Add release note if user-facing or operationally significant

Rollback procedure

  • Revert config file to previous state
  • Redeploy from reverted commit
  • Document reason in ADR or postmortem if material

References

  • Portfolio App architecture: docs/60-projects/portfolio-app/architecture.md
  • Testing and quality gates: docs/60-projects/portfolio-app/testing.md
  • ADR index: docs/10-architecture/adr/