ce7cd19fef
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.8 KiB
2.8 KiB
Concerns
Security
- No rate limiting on
server/api/contact.post.ts— the contact API accepts unlimited POST requests, enabling spam/email flooding - No CAPTCHA or honeypot bot protection on
app/components/ContactForm.vue .env.exampleonly documentsNUXT_PUBLIC_GTAG_IDbut the contact form requires four SMTP vars (NUXT_SMTP_HOST,NUXT_SMTP_USER,NUXT_SMTP_PASS,NUXT_SMTP_TO) with no documentation- Server-side email validation in
contact.post.tsline 12 usesemail.includes('@')instead of a proper regex, while client-side already uses Zod'sz.string().email()
Tech Debt
'https://killiandalcin.fr/og-image.png'hardcoded verbatim in 6 page files — any domain change requires editing all of them- Static
public/sitemap.xmlbypasses the installed@nuxtjs/sitemapmodule — new projects are never indexed, and/formationin the sitemap has no matching page - Both
package-lock.json(npm) andpnpm-lock.yaml(pnpm) coexist;Dockerfileusesnpm ciafter migration to pnpm flowboardprojectfeatures[]array inapp/data/projects.ts(lines 91-97) is hardcoded English, not i18n keys, while all other project content goes throughuseProjects.tssiteConfig.seo.organization.aggregateRatinginapp/data/site.tsclaimsreviewCount: '50'whileapp/data/testimonials.tshastotalReviews: 10— mismatched structured data Google could flag- Two Fiverr services have
url: '#'inapp/data/site.ts— non-functional CTAs on the/fiverrpage
Performance / UX
HeroSection.vuesplits the title string by.split(' ').slice(-2)to apply gradient styling — breaks if the FR/EN title has a different word count- All testimonial avatar URLs point to
https://ui-avatars.com/api/...(external CDN, external HTTP requests per avatar on every render)
Missing SEO Features
- No
ogUrlset on any page (alluseSeoMetacalls omit it) app/pages/project/[id].vueuses the genericog-image.pnginstead ofproject.value?.image- No
<link rel="canonical">— theprefix_except_defaulti18n strategy produces/and/en/duplicate URLs without canonical deduplication /formationinpublic/sitemap.xmlhas no corresponding page (app/pages/formation.vuedoes not exist)
i18n Completeness
app/error.vuelines 39-44: two hardcoded English error description strings not in locale filesapp/components/sections/HeroSection.vueline 30:'Available for projects'badge is raw English, nott()- Same file lines 148, 153:
'50+ projects'and'5.0 rating'decorative stats are hardcoded English a11y.langTogglein both locale files hardcodes the current language name as a static string
Testing
- Zero test files exist anywhere in the project — no coverage for the security-sensitive contact API validation,
useProjectscomposable, or i18n key resolution