Lean Nuxt 3 starter for a personal portfolio.
- Nuxt 3, Vue 3, TypeScript
- @nuxt/content, @nuxt/image
- @nuxtjs/i18n (source of truth in
locales/*.json) - @nuxtjs/tailwindcss, @nuxtjs/color-mode
- Pinia, @vueuse/nuxt
- vee-validate, zod
- ESLint + Nuxt/Vue/TypeScript configs
- Prettier
- nuxi typecheck (project type validation)
- Single responsibility per layer:
components/: reusable UI componentspages/: route-level compositionstores/: shared statelocales/: i18n message source (pt-BR and en)content/: markdown/content-driven pages
- No duplicated source of truth for translations, constants, or business rules.
- Prefer composition API and typed utilities over implicit behavior.
- Accessibility first: semantic HTML, keyboard focus, visible labels, contrast-aware color use.
Run before opening PRs:
npm run lintnpm run type-checknpm run build
- Every new business rule must come with unit tests.
- Bugfixes should include a test that reproduces and prevents regression.
- Keep tests close to the feature/module they validate.
If test tooling is changed, document scripts and conventions in this README.
- Blog posts may exist in only one language.
- Frontmatter supports:
lang:enorpt-BR(defaults toenwhen omitted)translationKey: groups translated variants of the same article
- Fallback strategy:
- requested locale
- English (
en) as default fallback - any available variant as last resort
- Contact form submits through FormSubmit AJAX endpoint to
itpzzi@gmail.com. - Submission success state is coupled to FormSubmit success payload (no local-only success simulation).
- Form includes a honeypot field to reduce bot submissions.
- First real submission may require FormSubmit e-mail activation/confirmation.
- Project is configured for static generation (
npm run buildrunsnuxi generate). - For GitHub Pages in Actions, base URL is auto-detected from
GITHUB_REPOSITORY. - Optional override: set
NUXT_APP_BASE_URL(example:/NuxtPortfolio/).
This repository includes deploy-pages.yml for automated GitHub Pages deployment.
- Production host:
https://itpzzi.github.io - Deployment model: source in
main, static output deployed by GitHub Actions Pages
On each push to main (or manual dispatch), the workflow executes:
npm cinpm run lintnpm run type-checknpm run build(static generation)- Generate
.output/public - Upload Pages artifact and deploy via
actions/deploy-pages
- Pages source should be
GitHub Actions - Workflow trigger:
main
- If deploying from a user/org pages repository (
<owner>.github.io), base URL resolves to/. - If deploying from a project repository, base URL resolves to
/<repo>/. NUXT_APP_BASE_URLcan still be used to force a specific base path when needed.
Production remote topology:
origin:https://github.com/itpzzi/itpzzi.github.io.git
Standard publish to production branch model:
pwsh ./scripts/publish-pages.ps1Push target: origin/main
First replacement publish when remote history is non-fast-forward:
pwsh ./scripts/publish-pages.ps1 -Force- Actions repository:
itpzzi/itpzzi.github.io - Workflow:
Deploy Portfolio to GitHub Pages - Runtime URL:
https://itpzzi.github.io