Änderungsprotokoll
Aktuelle Version: 26.18.0Added- •Anonymous Quick Check Log — New
QuickCheckLog model tracks ALL Quick Checks (anonymous + registered). IP stored as SHA-256 hash (GDPR-compliant). Admin Dashboard now shows 4 KPIs: total checks (all), avg score (all), registered checks, avg score (registered). Recent checks list shows last 60 entries with inline scroll. - •Save Task Pool tooltip — Structured shadcn Tooltip on the "Save Task Pool" button explaining what it does, where it saves, and what to do after (commit to Git).
Changed- •Website Quick Check rebrand — H1, meta title, and description now say "Website Quick Check" / "Website Schnell-Check" to clarify this is a website-specific tool. Navigation label and URL unchanged.
- •Admin Dashboard: Recent Checks from QuickCheckLog — Shows all checks (anonymous + registered) instead of only registered. Scrollable container (max-h-48) for up to 60 entries.
- •Navbar Quick Check button — Link title uses
nav.titleQuickCheck ("Run a free Website Quick Check") instead of generic quickCheck.title.
Fixed- •Free checklist expiry — Fixed to
createdAt + 30 days (was renewed on every page visit, always showing ~30 days remaining). Removed activity-extends-lifetime logic. Admin Dashboard free checklists also use createdAt for daysLeft calculation. - •Checklist detail page — Shows creation date in header. Edit button is now icon-only (less clutter).
- •Open Graph check — New warning
OG_IMAGE_RELATIVE_URL when og:image uses a relative URL (social media crawlers cannot resolve them). - •Favicon check — New warning
FAVICON_INVALID_CONTENT_TYPE when favicon response is not an image.
Added- •Grounding Page (
/facts / /de/fakten) — Machine-readable entity fact page following groundingpage.com Spec v1.5. Includes H1 entity name, lead definition, fact grid (11 key-value pairs), 7 H2 sections with entity prefix, disambiguation, FAQ with FAQPage JSON-LD, retrieval support sentence. 4 JSON-LD schemas (BreadcrumbList, SoftwareApplication, DefinedTerm, FAQPage). Full EN + DE translations (53 keys each). Spec-required CSS classes (human-notice, lead-definition, data-grid). - •
llms.txt — Static Markdown file at site root (llmstxt.org format). Site overview, key pages, features, tech details, German version links. Accessible at launch-checklist.com/llms.txt. - •Markdown API (
/api/md/[locale]/[page]) — Dynamic Markdown versions of all 9 public pages for AI crawlers. 18 endpoints (9 pages x 2 locales). Content-Type: text/markdown, Vary: Accept, Cache-Control: 1h. Generated from translation keys — always in sync, no static files. Changelog served directly from CHANGELOG.md. - •
<link rel="alternate" type="text/markdown"> on all public pages via buildPageMetadata(). AI crawlers can discover the Markdown version automatically. - •About page: Facts link — Dezenter Verweis auf die maschinenlesbare Fakten-Seite ("For AI systems and knowledge retrieval").
- •CLAUDE.md: Content Sync Checklist — Dokumentiert welche Dateien bei inhaltlichen Aenderungen synchron gehalten werden muessen (Features, Pricing, Zahlen, Tech Stack, Checks, Templates, Verified-Datum).
Changed- •Navbar redesign — Navigation links left-aligned next to logo (was centered). Breakpoint from md (768px) to lg (1024px). Quick Check icon: Search replaced with Zap globally. Quick Check CTA always visible (no longer hidden on /quick-check page). Tablet: Zap icon-only button. Mobile dropdown: Login/Register stacked vertically.
- •Footer breakpoint — Changed from sm (640px) to lg (1024px), consistent with navbar.
- •QuickCheckForm — Uses InputGroup pattern (like homepage hero), no Card wrapper. Zap icon instead of Search.
- •German translations — All 8 remaining "Launch" occurrences replaced with "Livegang" / "Livegang-" for consistent German terminology. Phase names "Pre-Launch, Launch" changed to "Vor-Livegang, Livegang".
Changed- •Homepage hero split into two sections — The overloaded hero area is now separated into (1) Quick Check with URL input field (focused, no distractions) and (2) a dedicated checklist section with H2 "Ready for the full launch checklist?", description, 4 stats, and CTA buttons. Dashboard mockup moved below both sections.
- •Checklist CTA buttons — "View Pricing" replaced with "Register" (nofollow) alongside "Start for Free". Logged-in users see "Go to My Projects".
- •DashboardMockup extracted — Exported from HeroSection for standalone use in page.tsx, rendered in its own full-width section.
- •German translations: "Launch" → "Livegang" — All 8 remaining occurrences of "Launch" in German translations replaced with "Livegang" / "Livegänge" / "Livegang-" for consistent German terminology. Phase names "Pre-Launch, Launch" → "Vor-Livegang, Livegang".
- •Communication style guide — Added to CLAUDE.md: concise but readable responses by default, detailed output only for code reviews and release notes.
- •CI/CD artifact expiry — SAST job artifacts now expire after 7 days (was: never). Reduces GitLab storage usage.
Fixed- •Changelog structured data error (follow-up) — CHANGELOG.md entries still contained HTML tags in backticks (e.g. script, code) that the
escapeHtml() fix could not fully handle due to double-backtick Markdown syntax. Removed all raw HTML tags from CHANGELOG.md text. Added documentation in CLAUDE.md warning against HTML tags in backticks.
Fixed- •Changelog structured data error — Backtick-wrapped HTML tags in CHANGELOG.md were rendered as real HTML elements inside code blocks. Google reported "Strukturierte Daten mit Syntaxfehlern". Now HTML entities are escaped via
escapeHtml() before insertion into code elements. - •Locale detection redirect — Disabled
localeDetection in next-intl routing (localeDetection: false). Previously, next-intl redirected / → /de based on Accept-Language header using a 307 (temporary) redirect, causing Google to report "Seite mit Weiterleitung". hreflang tags in sitemap + metadata handle locale serving instead. - •Auth links missing
rel="nofollow" — All 15 internal links to /login, /register, and /forgot-password across 12 files now have rel="nofollow". Prevents Google from discovering noindex auth pages via internal links. - •OG/Twitter image URLs crawled as pages — Added
/*opengraph-image*, /*twitter-image*, /_next/, /icon-*, /apple-icon* to robots.txt Disallow. Google was crawling generated image URLs (e.g. /de/opengraph-image/og) and reporting "Gecrawlt – zurzeit nicht indexiert". - •Meta descriptions too short — Changelog (55→127), Pricing (73→131), Imprint (58→115), Privacy (36→135) chars. Short descriptions may signal thin content to Google.
- •Locale 404/Error pages used
next/link — [locale]/not-found.tsx and [locale]/error.tsx now use @/i18n/navigation Link for auto-translated paths (e.g. /checklist → /de/checkliste). Prevents unnecessary redirects for DE users. - •Docker healthcheck IPv6 failure — Changed
localhost to 127.0.0.1 in Dockerfile HEALTHCHECK. Alpine resolves localhost to IPv6 [::1], but Next.js listens on 0.0.0.0 (IPv4 only). Container was reported as unhealthy despite working correctly.
Added- •Quick Check History — Registered users now see a team-scoped history of their Quick Check scans below the URL input. Each entry shows domain, score badge (color-coded), checks passed, tasks passed, and relative date. Results are saved automatically after each scan (fire-and-forget). Includes "Check again" button to re-scan a domain from history.
- •Admin Dashboard: Quick Check Statistics — New full-width card in the admin dashboard showing:
- •
QuickCheckHistory Prisma model — domain, url, scorePercent, tasksPassed, tasksTotal, checksPassed, checksTotal, checkResults (JSON snapshot), teamId, createdById, deletedAt. Indexed on [teamId, deletedAt] and domain.
Changed- •Hero H1 sizes reduced for mobile — All three hero pages (Homepage, About, Pricing) now use
text-3xl sm:text-4xl lg:text-5xl (was text-4xl sm:text-5xl lg:text-6xl). Homepage ListTodo icon scaled accordingly (size-8/10/12 instead of 10/12/14). Prevents awkward line-break of "Livegang Checkliste" + icon on 375px screens.
Fixed- •Admin Dashboard "Personal" badge was hardcoded English — Now uses
tRoot("teams.personal") for proper localization (EN: "Personal", DE: "Persönlich").
Added- •About / Über uns page (
/about / /de/ueber-uns) — Solo-founder trust page with 6 sections - •
<FadeIn> reusable animation component (src/components/ui/fade-in.tsx) — Single source of truth for the fade-in-up-with-blur animation used across the project. Two modes: trigger="mount" (for hero sections) and trigger="scroll" (for below-fold sections via whileInView). Replaces duplicated motion.div + fadeInUp patterns in HeroSection and 5 About components. Respects prefers-reduced-motion automatically via motion/react. - •Homepage sections now scroll-reveal — Features/Bento Grid, HowItWorks, Audience cards, FAQ, and Bottom CTA are wrapped in
<FadeIn trigger="scroll">. Same animation language as the About page. - •ProfilePage JSON-LD schema on About page — Google's official 2023 recommendation for person/author profiles. Better than plain
AboutPage for E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness). Includes dateCreated, dateModified, mainEntity (as @id reference), breadcrumb, isPartOf. - •Article JSON-LD schema for the About story section — Makes the narrative indexable for Google Discover and News. Cross-references the Person via
author: { "@id": "...#person" }. - •ImageObject schema for profile image — Structured image metadata with
width, height, caption, contentUrl instead of plain URL string. Used by Google Knowledge Graph. - •Extended Person schema —
givenName, familyName, description, nationality, address (PostalAddress), knowsLanguage (German + English), worksFor[].foundingDate (2004 for INGENIUMDESIGN), third company (Freelancer TYPO3). - •
@id cross-references between JSON-LD schemas — Person, ProfilePage, Article, and Breadcrumb on the About page are now linked as a coherent graph via @id references. Google understands them as one connected entity instead of isolated schemas. - •About OpenGraph image (
src/app/[locale]/(public)/about/opengraph-image.tsx) — Dedicated 1200×630 image for Social Sharing (LinkedIn, Twitter, WhatsApp) with purple accent color (168,85,247), EN + DE texts, badges ("Since 2004", "600+ Projects", "TYPO3 & WordPress", "Technical SEO"). - •
toBcp47() utility in src/lib/seo/json-ld.ts — Converts next-intl locale codes (en, de) to BCP-47 format (en-US, de-DE) for schema.org inLanguage fields. - •
common.home translation key (EN: "Home", DE: "Startseite") — Used by locale-aware breadcrumb JSON-LD. - •**5 new
nav.title* translation keys** — titleQuickCheck, titleAbout, titleImprint, titlePrivacy, titleChangelog for consistent title attributes on links across EN + DE.
Changed- •
breadcrumbJsonLd() utility is now locale-aware (src/lib/seo/json-ld.ts) — Optional locale parameter automatically localizes internal paths via next-intl getPathname(). Before, breadcrumbs on all 8 public pages emitted hardcoded English URLs (/about, /pricing) for DE users. Now DE emits /de/ueber-uns, /de/preise, etc. - •All 8 public pages migrated to locale-aware breadcrumbs — Homepage, About, Pricing, Checklist, Privacy, Imprint, Changelog, Quick Check. Each page now resolves the "Home" label via
tCommon("home") and passes locale to breadcrumbJsonLd(). - •**Footer links use
nav.title* keys** — Footer's title attributes on About, Imprint, Privacy, Changelog links now use the shared nav.title* namespace instead of ad-hoc common.footer*Title keys. - •HeroSection animation — Local CSS-based FadeIn function replaced by the new shared motion/react
<FadeIn> component. Same animation (fade + slide + blur) now shared with the About page. - •
profile.role EN synchronized with DE — Changed from "Founder · Web Developer · TYPO3 Expert" to "Founder · Web & TYPO3 Developer · SEO Expert" to match the DE "SEO Experte" signal. - •Homepage breadcrumb — Inline
BreadcrumbList JSON-LD replaced by shared breadcrumbJsonLd() utility call. Now properly localized for DE users.
Fixed- •robots.ts: DE-Path prefix bug — All German routes in
allow and disallow lists now include the /de/ prefix (/de/preise, /de/ueber-uns, /de/passwort-vergessen, etc.). robots.txt uses prefix matching, so /preise would NOT match the actual URL /de/preise. This was an existing bug across the entire codebase, affecting all German disallow rules. 17 allow entries (EN+DE) and 20 disallow entries (EN+DE) now. - •Breadcrumb JSON-LD: "Home" hardcoded in English across all public pages — For DE users, the breadcrumb label now shows "Startseite" and the URL is the localized version (e.g.
https://launch-checklist.com/de/ueber-uns instead of the English /about). - •About Article JSON-LD: description too long — Was using
story.paragraph1 (352 EN / 411 DE chars), now uses metaDescription (137/139 chars). Google recommends Article description under 200 chars for Rich Results. - •About Person schema double-render — Person was rendered twice in the JSON-LD: once standalone and once embedded in
ProfilePage.mainEntity. Now Person is rendered once standalone, and ProfilePage.mainEntity is a compact @id reference. Reduces HTML size and follows schema.org best practice. - •
nav.titleQuickCheck missing — About page's CTA button referenced tNav("titleQuickCheck") but the key didn't exist, causing next-intl to fall back to the key name as a title. Key now exists in EN + DE along with titleAbout, titleImprint, titlePrivacy, titleChangelog.
Removed- •Unused translation key
common.footerAboutTitle (EN + DE) — Replaced by nav.titleAbout as part of the footer refactor. - •Duplicated
fadeInUp constants in 6 components (HeroSection, AboutHero, AboutStory, AboutCompanies, AboutTools, AboutValues) — All replaced by the shared <FadeIn> component. Single animation definition across the project. - •Inline
BreadcrumbList JSON-LD object in homepage page.tsx — Migrated to the shared breadcrumbJsonLd() utility call.
Fixed- •Quick Check invisible to authenticated users — The Quick Check CTA button in the Navbar and the URL input field in the hero were only shown to non-authenticated users. Authenticated users (agencies, freelancers, dev teams) had no way to access the Quick Check tool from the homepage or navigation without typing the URL manually. Now:
Added- •Quick Check — public URL audit tool (
/quick-check / /schnell-check) - •Hero URL input on homepage — Users can check any website directly from the homepage without navigating to a separate page. Uses shadcn
InputGroup with Globe icon, integrated "Jetzt prüfen" button, and shadow-lg focus ring. - •Quick Check CTA in Navbar — Primary button visible on every page for non-authenticated users, hidden on
/quick-check itself and for logged-in users. - •Task pool as single source of truth for Quick Check — Quick Check now displays the actual tasks from the database pool (with title, description, help text, and documentation links). A single
checkKey like ssl shows all related tasks (e.g. task_ssl_certificate_present, task_ssl_certificate_valid, task_ssl_expiry_monitored). No more duplicate verify.checks.* translation keys. - •
InputGroup shadcn component — Added via npx shadcn@latest add input-group. Adapted to project standard sizing (h-9 container, border-border with dark:border-input pattern, project button sizes). - •
<VerifyResultDetails> shared component (src/components/features/verify/VerifyResultDetails.tsx) — Single source for verify result rendering (warnings + check details + fix hints). Used by both VerifyButton (Project Detail) and QuickCheckResultItem (Quick Check). - •
<DocumentationLinks> shared component (src/components/features/shared/DocumentationLinks.tsx) — Configurable doc-link rendering with size, layout, and fallbackLabel props. - •
<JsonLd> SEO component (src/components/seo/JsonLd.tsx) — Wrapper for JSON-LD structured data with suppressHydrationWarning to avoid React dev warnings on client-side navigation. - •
parseDocumentationLinks() utility (src/lib/utils/parse-documentation-links.ts) — Extracted from TaskItem and QuickCheckResultItem. Single source for doc-link parsing with locale fallback. - •Expandable auto-check details on Project Detail page — VerifyButton now shows the full result detail view (warnings, technical details, fix hints) via the shared
<VerifyResultDetails> component — previously this rich view only existed in the Quick Check.
Changed- •Homepage subtitle — More inclusive: "Dein zuverlässiger Begleiter für jeden erfolgreichen Livegang — Webseite, Online-Shop oder Webanwendung." (previously only "Website-Launch")
- •Wording: "Aufgaben-Vorlagen" → "Livegang-Aufgaben" (DE) / "task templates" → "launch tasks" (EN) — Clearer separation between individual tasks and project templates. Updated in:
home.description, home.stats.tasks, features.checklistDesc, features.freeDesc. - •Quick Check results layout — Redesigned to match Project Detail page structure: back button, h1 domain left + primary action button right, 2 radial charts standalone, summary card, task list outside card. Consistent with existing design language.
- •Score calculation task-based — Quick Check score now reflects actual task coverage (e.g. 20/24 tasks) instead of check coverage (7/9 checks). When an SSL check passes, all 3 SSL-related tasks count as passed.
- •
VerifyOverview uses task titles from pool — Instead of hardcoded verify.checks.* translations, VerifyOverview now displays the actual task title from the database via item.taskTitle resolved through tRoot(). - •
VerifyButton refactored — Private VerifyDetails function removed, now uses shared <VerifyResultDetails>. New optional taskTitle prop for better toast messages. - •Navbar — "Register" button changed from
default to outline variant so the new Quick Check primary CTA stands out as the main action. - •CLAUDE.md clarification: shadcn vs tweakcn — Explicit separation of responsibilities. shadcn is the primary source for UI components, markup, and composition patterns (with MCP server, skill, and CLI integration). tweakcn is ONLY for generating the color palette (oklch values). New section "shadcn Markup & Components" added. "UI Component Sizing (tweakcn Standard)" renamed to "UI Component Sizing (Project Standard)".
Removed- •**
verify.checks.* translation keys** (9 per language, EN + DE = 18 total) — Task titles now come from the pool via taskTitle. - •
nav.quickCheck + nav.titleQuickCheck translation keys — Quick Check is now accessed via CTA button using quickCheck.title. - •Dead code:
QUICK_CHECK_KEYS and QuickCheckKey type in src/lib/quick-check/config.ts — checkKeys now derived dynamically from tasksByCheckKey. - •Dead code:
isRunning prop in QuickCheckForm — form transitions out immediately after submission, prop was never true. - •7 inline JSON-LD script elements tags across public pages — migrated to
<JsonLd> component.
Fixed- •JSON-LD hydration warning — Inline JSON-LD script elements tags caused React dev warnings on client-side navigation. Fixed via new
<JsonLd> component with suppressHydrationWarning. - •Confetti timing — Confetti on 100% score previously fired before all checks completed. Now uses
useEffect with triple guard (isComplete + totalChecksDone === totalChecks + scorePercent === 100) and 2s delay for guaranteed settled state. - •Quick Check button disable logic — Button now requires URL to contain at least one
. (dot) — valid domains always have one.
Ideas Pool (added)- •Security Headers check: show missing optional headers (CSP, Referrer-Policy, Permissions-Policy) as warnings when the required headers pass — helps users reach an A-rating at securityheaders.com.
Added- •Zero-config Docker deployment —
docker compose up -d --build now automatically seeds the database on first start via a dedicated init container (lc-seed). No manual seed command needed — migrations + seed run automatically before the app starts. - •Quick Check concept — Architecture and product concept for the upcoming public URL audit tool (see
docs/concept-quick-check.md)
Changed- •Homepage meta titles — Include primary keyword: "Launch Checklist — Your Go-Live Companion" (EN) / "Livegang Checkliste — Dein Go-Live Begleiter" (DE)
- •Homepage meta descriptions — Updated for better SEO discoverability (keyword in first sentence, 123/149 chars)
- •GitHub README — Complete rewrite with all current features, Privacy First section, self-hosting guide, admin panel, screenshot and changelog link
Fixed- •Docker seed container — Migrations now run before seed check in
docker-seed-entrypoint.sh (was failing with "relation does not exist") - •BentoChecklist mobile — Animation card height reduced (
min-h-52) to match animation range at scale 0.55 — no more empty space below badges - •HowItWorks mobile — New vertical timeline layout for screens below
md breakpoint (dots left, animated description inline per step) - •Changelog page — Version badge wraps below title on narrow mobile screens (
flex-wrap)
Added- •Auto-migrate on startup —
docker-entrypoint.sh now runs prisma migrate deploy automatically before starting the server. Failed migrations prevent server start. - •Seeder service —
docker compose --profile seed run --rm seed now works (was missing from docker-compose.yml) - •
.gitattributes — Enforces LF line endings for shell scripts (prevents CRLF crash on Windows → Alpine)
Fixed- •Team invitation links broken in Docker —
team.ts used NEXT_PUBLIC_APP_URL (not set in Docker) instead of AUTH_URL. Invitation emails now use the correct production URL. - •Homepage meta titles — Added "Checkliste" / "Checklist" keyword for better SEO discoverability
Fixed- •Precedence header removed —
Precedence: bulk was incorrectly set on all emails (login links, password resets, invitations), causing spam classification - •SMTP password in config hash — password rotation now takes effect immediately instead of failing on first send
- •Stricter email validation —
sendTestEmail now validates user@domain.tld format server-side - •CRLF sanitization on email address — prevents header injection via email field (not just display name)
- •Tighter
extractDomain regex — only allows valid domain characters in Message-ID header
Added (⚠️ Magic Link + Password Reset not yet manually tested)- •Magic Link Login — Passwordless login via email link. Enter email on login page → receive link → click → auto-login. Token expires after 15 minutes. Rate-limited (3/15min).
- •Password Reset — "Forgot password?" flow. Enter email → receive reset link → set new password. Token expires after 60 minutes. Rate-limited (3/15min).
- •New localized routes:
/forgot-password (/de/passwort-vergessen), /reset-password/[token] (/de/passwort-zuruecksetzen/[token]), /verify-login/[token] (/de/login-bestaetigen/[token]) - •Login page: "Forgot password?" link + "or continue with" separator + Magic Link form section
- •Email templates: Password reset email + Magic Link login email (plain text + HTML)
- •Anti-enumeration: Both flows always return success (prevents email discovery)
- •Project Status System — Three-state lifecycle: Active → Completed → Archived. Projects can be completed (even with open tasks), reopened, archived, and unarchived. Only Owner/Admin can manage project status.
- •Confetti effect —
canvas-confetti celebration animation on the "Complete Project" button - •
deleteProject role check — Only Owner/Admin can delete projects (was missing before) - •Archived project guards — Edit, Delete, Share, SaveAsTemplate buttons hidden for archived projects;
updateProject server action rejects archived projects - •Privacy Policy — Full 15-section privacy page (EN + DE) covering cookies, registration, email, teams, auto-check, public links, data retention, GDPR rights
- •Imprint legal sections — Liability for content, liability for links, copyright, EU dispute resolution
- •SMTP Sender Name — New
smtp_from_name field in admin panel (emails sent as "Launch Checklist \") - •SMTP Secure checkbox —
smtp_secure (SSL/TLS) configurable via admin panel
Changed- •Credentials Provider (
auth.ts): Extended to accept magic link tokens via password field prefix - •Database schema:
isArchived: Boolean replaced by ProjectStatus enum (active, completed, archived) + completedAt + archivedAt timestamps - •
ProjectCard: Rewritten with status badges, Complete/Reopen AlertDialogs, canManage permission guard - •
ProjectForm: Archive toggle removed (now handled via ProjectStatusActions) - •Dashboard stats:
recentProjects excludes archived projects; project counts use explicit status instead of progress heuristic - •FAQ: Reduced from 10 to 9 questions (DSGVO/GDPR FAQ removed), texts rewritten for clarity
- •Imprint page: Redesigned without cards, plain text layout,
nofollow on external links - •Privacy page: Replaced placeholder with full privacy policy, cookie table using shadcn Table component
Fixed- •German umlauts: Fixed ASCII substitutes (ue→ü, oe→ö, ae→ä) in share and imprint i18n keys
- •Email header injection:
buildFromAddress() sanitizes CRLF characters - •SMTP cache: Config hash now includes
from address — sender changes take effect immediately
Added- •Workflow Skills:
/code-review (automated code review), /save (intermediate commits), /release (full release workflow with blocker phases) - •V2 Scope: New
v2-scope.md with prioritized feature roadmap and version plan
Changed- •design-system.md: Complete rewrite — corrected font (Open Sans), color system (oklch/tweakcn), component sizing (tweakcn standard), Base UI references
- •project-context.md: Updated tech stack (Base UI, Open Sans, oklch, Motion, Magic UI, teams, public view link)
- •decisions.md: Corrected auth strategy (JWT not database), UI framework (Base UI not Radix), colors (oklch not hex), monitoring (9 checks not 6)
- •implementation-rules.md: Corrected Base UI and Open Sans references
- •v1-scope.md: Archived as completed — 2 open items (Magic Link, Password Reset) moved to ideas.md
- •build-order.md: Added all post-V1 features (Team, Verify, Help, Bento, Public View Link, Skills)
- •domain-model.md: Added Team, TeamMember, TeamInvitation, PublicViewLink models and relationships
- •monitoring-agent.md: Updated to 9 checks with full details, architecture, timeouts, rate limiting
- •product-architect.md: Added Base UI, Open Sans, tweakcn, teams, public view link, verify system responsibilities
- •gitlab-workflow.md: Corrected pipeline triggers (tags/MRs/manual, not every push), code review section replaced with
/code-review reference - •ideas.md: Added Magic Link Login and Password Reset (from V1 backlog)
Fixed- •Cookie forgery prevention: Session token is now
randomBytes(32), hashed and stored in DB. Attacker cannot forge cookie from publicly-known URL token - •Rate limiting scope: Changed from IP-only to token:IP — prevents brute-force across multiple share links
- •Cookie expiry:
maxAge calculated from link.expiresAt instead of fixed 7 days - •Race condition: Link revocation + creation wrapped in
prisma.$transaction() - •i18n namespace: Fixed
useTranslations("share") — messages are at root level, not nested under common - •Checkbox UX: readOnly checkbox rendered as
<div> with full opacity (no fake clickable appearance)
Added- •Public View Link: Share any project via a unique URL — recipients see read-only view without login or team membership
- •ShareDialog: Share button in project detail header (owner/admin only) with link creation, copy URL, access stats, and revoke functionality
- •readOnly mode: New prop propagated through TaskChecklist → CategorySection → TaskItem. Checkbox rendered as div (no click), all action buttons hidden
- •New route:
/shared/[token] (EN) → /freigabe/[token] (DE) - •Schema: PublicViewLink model with token, password, expiry, access counter, access log
- •i18n: 30 translation keys for share feature (EN + DE)
- •SEO protection: noindex/nofollow meta tags, robots.txt Disallow for /shared/ and /freigabe/
- •Security: All task actions verified via verifyProjectAccess (session + team check) — anonymous viewers cannot modify any data
Fixed- •Auth.js debug logging disabled (prevents credential leaks in dev console)
Fixed- •Hero mockup: Task row badges now always right-aligned (flex-1 + ml-auto)
- •Feature tags: Replaced duplicate "Vorlagen & eigene Aufgaben" with "Projekt-Management"
- •Bottom CTA: Removed icons from buttons for cleaner look
Added- •HowTo JSON-LD schema: 3-step "How It Works" timeline for Google rich snippets
- •ItemList JSON-LD schema: 6 bento grid features as structured list
- •Footer link titles: Imprint, Privacy, Changelog links with title attributes
- •i18n key:
footerChangelog (EN + DE)
Fixed- •Avatar alt tags: Generic "Team member" replaced with specific roles (Designer, Developer, PM, QA, Content Editor, SEO Specialist)
- •Rocket alt tag: Improved to "Rocket — Start your free launch checklist"
Added- •Bento grid with 6 animated feature cards:
- •How it Works timeline: Horizontal animated timeline with auto-play (5s cycle), progress line, dot activation, content fade transitions
- •FAQ redesign: Two-column layout (Unsplash image left, accordion right), first item open by default
- •New dependencies:
motion (Framer Motion v12), Magic UI marquee + animated-beam components - •10 Unsplash avatar images for team card (128x128, locally hosted for GDPR)
- •Rocket image for free card (PNG, 13KB)
- •FAQ image (Unsplash, grayscale, 113KB)
- •shadcn MCP server configured (.mcp.json)
Changed- •Hero section: Dashboard skeleton mockup with browser chrome, donut charts, fade-in animations
- •Container widths unified: max-w-7xl (full/1280px), max-w-6xl (mid/1152px), max-w-3xl (narrow)
- •Activity icon replaces ShieldCheck for auto-checks across homepage
- •Pricing page: "Warum unsere Checkliste?" section set to max-w-7xl
- •i18n: Updated feature texts (Team, Export, Templates), FAQ badge/title, timeline subtitles
- •"213+ Tasks" → "200+ Task Templates" across all homepage texts (EN + DE)
Added- •Fix-help for failed auto-checks (Phase 3): "Why is this important?" + "How to fix this:" block with 19 fix texts (EN + DE) for all 9 check types
- •Admin links editor (Phase 4): new "Links" column in task pool with Popover editor, per-locale URL fields (Default EN + Deutsch DE), save with spinner
- •Documentation links for 51 tasks (Phase 5): Google Search Central, technicalseo.com, MDN, web.dev, SSL Labs, securityheaders.com, Facebook Debugger, PageSpeed Insights, MX Toolbox and more
- •Locale-fallback for documentation links (Phase 2): links rendered per user language, EN as default fallback, unified label ("View solution guide" / "Zu den Lösungsansätzen")
- •"Save Task Pool" button in admin: exports entire task pool (tasks + links + templates) to
task-pool-data.json with loading spinner - •Seed reads from
task-pool-data.json: single source of truth for all task definitions, survives database resets via upsert
Changed- •All 213 helpTexts improved (Phase 1): Option C pattern (why-context + what-to-do) applied to every task in EN + DE
- •Seed script: hardcoded task array replaced with
task-pool-data.json import - •Removed unused
HTTPS_REDIRECT_TEMPORARY fix text (success result, fix never shown)
Fixed- •Changelog page now works in Docker production builds (CHANGELOG.md copied in Dockerfile + .dockerignore exception)
- •Removed unused outputFileTracingIncludes from next.config.ts
Fixed- •Added aggregateRating to SoftwareApplication JSON-LD (required by Google for rich results)
Fixed- •og:image meta tag restored (was lost by openGraph override in buildPageMetadata)
- •Added missing OG tags per ogp.me spec: og:type, og:site_name, og:image:alt, og:image:secure_url
- •Hero icon stacks above title on mobile (fixes DE "Livegang Checkliste" layout)
Added- •Homepage redesign: 6 content sections (Hero with stats, 8 Feature cards, How it Works 3-step, Target audience, FAQ with 8 questions, Bottom CTA)
- •Context-aware CTAs: logged-in users see "Go to My Projects", guests see "Start for Free" + "View Pricing"
- •FAQ with JSON-LD: FAQPage schema for Google Rich Snippets
- •OG Image generation: dynamic per-page images (Home/Pricing/Checklist/Changelog) with locale support (EN+DE) and page-specific accent colors
- •Imprint page (EN:
/imprint, DE: /de/impressum) with full legal notice - •Privacy page placeholder (EN:
/privacy, DE: /de/datenschutz) - •Changelog page (EN:
/changelog, DE: /de/aenderungsprotokoll) — renders CHANGELOG.md as Cards - •JSON-LD breadcrumbs on all public pages (Pricing, Checklist, Changelog, Imprint)
- •
buildPageMetadata() helper for locale-aware canonical, OpenGraph, hreflang - •
src/lib/seo/ module with metadata.ts and json-ld.ts helpers - •Footer links: Impressum, Datenschutz, Version → Changelog
- •Accordion component (shadcn/Base UI)
Changed- •Footer redesigned: copyright + "Developed by" left, legal links center, version link right
- •Admin settings URL renamed: EN
/admin/settings → /admin/system-settings - •Menu active state: exact path matching instead of substring matching
- •Sitemap: DE pages as separate URL entries (Google Best Practice), locales from central config
- •Sitemap: login/register removed (no SEO value)
- •robots.txt: /login and /register added to disallow list
- •All public pages: locale-aware canonical URLs, OpenGraph title/description per language
- •Multi-language setup documented in README + CLAUDE.md
Fixed- •Settings menu item no longer falsely active on admin system settings page
- •Sitemap hreflang: fixed double
/de/de/ prefix - •next-themes React 19 script tag warning suppressed in dev
- •Accordion text size:
text-xs → text-sm (CLAUDE.md standard)
Added- •3 new auto-checks: Meta Tags (title/description/viewport/lang/charset), Open Graph (og:title/og:image + Twitter Cards), Favicon (link tags + /favicon.ico + Apple Touch Icon)
- •Verify result details: warnings, certificate info, meta tag lengths, OG properties shown inline (all i18n)
- •Client-side form validation for project create/edit (name, domain, deadline, template)
- •Auto-scroll to error on validation failure
- •Domain auto-cleanup (strips protocol on paste/blur)
- •Verify improvement plan (
docs/verify-improvements.md)
Changed- •SSL check: certificate expiry detection (< 30 days warning, < 7 days critical), self-signed detection, issuer details, HEAD → GET fallback
- •robots.txt check: site self-blocking detection (
Disallow: /), HTML meta robots noindex/nofollow, X-Robots-Tag header, sitemap URL extraction, 1 MB size limit - •sitemap.xml check: resolves URL from robots.txt, fallback paths (
/sitemap_index.xml, /wp-sitemap.xml), sub-sitemap counting, 10 MB size limit - •HTTPS redirect check: 307/308 support (was only 301/302), SEO recommendation for permanent redirects, HEAD → GET fallback
- •Security headers check: HSTS max-age validation (max-age=0 = fail), X-Content-Type-Options must be nosniff, X-Frame-Options ALLOW-FROM deprecated warning, X-Powered-By exposure warning
- •Canonical check: multiple tags detection, HTTP Link header support, www mismatch detection, relative URL warning
- •Verify system now has 9 checks with 25 linked TaskDefinitions
- •Project form preserves all inputs on server-side validation errors (controlled inputs)
Fixed- •recharts 3.x ResponsiveContainer negative dimension warning (ResizeObserver approach)
- •VerifyOverview check order stays stable during single check execution
- •VerifyOverview "Run All" toast shows total counts instead of batch-only counts
Changed- •Prisma 7.5.0 → 7.6.0 (prisma, @prisma/client, @prisma/adapter-pg)
- •eslint-config-next 16.1.6 → 16.2.1
- •shadcn 4.0.8 → 4.1.1
- •@types/node 20.x → 25.x, @types/bcryptjs 2.x → 3.x, @types/uuid 10.x → 11.x, @types/pg 8.18 → 8.20
Added- •
/check-versions skill for live dependency auditing against npm registry - •Dependency check routine in CLAUDE.md (before releases, after installs)
- •Documentation Maintenance rules expanded with version search patterns
Changed- •Next.js 16.1.6 → 16.2.1 (faster dev startup, faster rendering)
- •React 19.2.3 → 19.2.4
- •TypeScript 5.x → 6.0.2 (added
types: ["node"] to tsconfig for TS6 default change) - •lucide-react 0.577.0 → 1.7.0 (brand icons removed,
aria-hidden default) - •recharts 2.15.4 → 3.8.1 (updated chart.tsx types for new Tooltip/Legend API)
- •nodemailer 7.0.13 → 8.0.4 (error code renames)
- •Tailwind CSS 4.x → 4.2.2
- •react-hook-form 7.71.2 → 7.72.0
- •PostgreSQL Docker image 17 → 18 (requires dump/restore on server)
- •Database renamed:
website_checklist → launch_checklist (matches project rebrand) - •
tsconfig.json: added types: ["node"] for TS6 (target and esModuleInterop kept — required by Next.js) - •
chart.tsx: updated types for recharts 3.x Tooltip/Legend API - •Auth type augmentation:
@auth/core/jwt → next-auth/jwt (module resolution fix)
Added- •Localized URL pathnames: All routes translated per locale (EN:
/projects, DE: /de/projekte) via next-intl pathnames — 21 routes configured - •Admin DnD task ordering: Drag & drop reordering in admin task pool with order column tooltips
- •Admin verify statistics: Auto-check stats card with success rate and breakdown by check type
- •Admin export analytics: Export stats card with format breakdown (PDF, MD, JSON, Redmine)
- •Admin abandoned projects: Warning in System Health for projects inactive 30+ days
- •Domain normalization: Strip http/https from domain input, protocol determined by checks
- •Verify reset on domain change: Auto-completed tasks reset when domain changes, manual completions preserved
- •"Manually checked" status: Verify overview shows "Manuell geprüft" for hand-completed auto-check tasks
- •Run-all button in summary row: "Alle prüfen" moved to summary line (right-aligned)
- •Template save button: Shortened label "Vorlage" with FileUp icon + tooltip
- •GitHub marketing README:
docs/github/README.md for public repository - •AI Prompt Export idea: Added to ideas pool
- •Import hint text: Note next to task pool export buttons about manual AI import
Changed- •Localized DE URLs adjusted to match page names:
/de/dashboard, /de/admin/aufgaben-pool, /de/admin/systemeinstellungen - •All components migrated from
next/link → @/i18n/navigation Link - •Removed
useLocalePrefix() and ${prefix}/... pattern completely - •Sitemap uses
getPathname() for translated URLs with hreflang alternates - •Seed synced with admin panel adjustments (12 phase changes, 21 priority changes)
- •Removed 12
.gitkeep placeholders and 5 empty directories - •Domain info alert: bold warning about verify reset on change
- •Hardcoded "d" days suffix replaced with translated key
Fixed- •Verify overview: "Manually checked" instead of "Not checked yet" for completed tasks
- •Only auto-completed tasks reset on domain change (manual completions preserved)
- •Domain stored without protocol (checks prepend dynamically)
Added- •Verify System: Complete rename from "Monitoring" to "Verify" across entire codebase
- •Basic Auth Support: Encrypted credentials (AES-256-GCM) for password-protected dev/staging domains
- •Auto-Complete: Tasks automatically checked off when verify check passes, with auto-generated comment
- •Priority Radial Charts: 3 radial charts (High/Normal/Low) showing completion per priority on project detail page
- •Verify Concept Document:
docs/concept-verify-system.md with full architecture decisions - •README: Verify checks documentation with descriptions of all 6 auto-checks
- •Domain hint text explaining the field is used for automatic checks
- •Collapsible "Zugangsdaten" section in project form for Basic Auth credentials
- •CirclePlay icon as consistent "start/run" action icon
- •Individual check trigger icons in verify overview list
- •Pricing page: strikethrough price with beta notice
Changed- •Renamed
monitorable → verifiable in Prisma schema + initial migration - •Renamed
MonitoringResult → VerifyResult model + migration - •Renamed
src/lib/monitoring/ → src/lib/verify/ (checks, registry, runner, types) - •Renamed
src/components/features/monitoring/ → src/components/features/verify/ - •Renamed
src/lib/actions/monitoring.ts → src/lib/actions/verify.ts - •All check functions now support Basic Auth credentials pass-through
- •Verify overview deduplicates by unique
checkKey (6 checks, not 11) - •"Alle prüfen" skips already completed tasks
- •Verify button hidden on completed tasks, reappears on uncomplete
- •Task completion syncs between task list and verify overview
- •Project detail: back button + action buttons on same row, title full width
- •German label: "Automatische Prüfungen" (was "Verifizierungs-Übersicht")
- •All verify translations updated (EN + DE)
- •Updated CLAUDE.md, skills, memory files
Fixed- •Verify overview layout shift: fixed-width icon container
- •Last verify result stays visible after task completion
- •Spacing removed when verify button hidden and no result exists
Added- •Favicon set: ICO (root fallback), SVG, Apple Touch Icon, PWA icons (192px, 512px)
- •Link title attributes on all navigation and action links (22 files, EN + DE)
- •Custom 404 page with Card layout, ListTodo icon, multilingual
- •Custom error page with Card layout, AlertTriangle icon, retry + home buttons
- •Root 404: Open Sans font, browser language detection via Accept-Language header
- •SEO meta titles ≤70 chars, descriptions ≤150 chars (all public pages, EN + DE)
- •hreflang alternates corrected (EN = root, DE = /de/ prefix)
Fixed- •Navbar logo slogan: fixed broken translation key
- •TemplateEditor: hardcoded "Custom Task" / "Unknown Task" → i18n translation keys
- •Root 404: missing font and multilingual support
Changed- •CLAUDE.md: added SEO, Favicon, Error Pages sections
- •README.md: added SEO, PWA, Error Pages, Pricing features; updated Docker section
- •deployment.md: already current from v26.3.0
- •memory/project_architecture.md: added SEO, Favicon, Error Pages sections
Added- •Live domain:
https://launch-checklist.com - •robots.ts: dynamic robots.txt with sitemap reference
- •sitemap.ts: dynamic XML sitemap for all public routes with i18n alternates
- •OpenGraph + Twitter Card metadata on all public pages
- •JSON-LD structured data: Organization, WebSite, SoftwareApplication
- •manifest.webmanifest for PWA support
- •Apple Touch Icon
- •hreflang alternate links (correct: EN = root, DE = /de/ prefix)
- •Canonical URLs on all pages
- •Content-Security-Policy header
- •Gzip compression enabled (
compress: true) - •WWW → non-WWW redirect in next.config.ts
- •Cache headers for static assets (1 year immutable)
- •Browserslist for modern browsers (reduces polyfills by ~13 KiB)
- •Footer: INGENIUMDESIGN agency link
- •Pricing page: SEO-optimized meta titles/descriptions (EN + DE)
- •Landing page: slogan + icon in single line
Changed- •Rebranding: "Website Launch Checklist" → "Launch Checklist" (EN) / "Livegang Checkliste" (DE)
- •Package name:
website-checklist → launch-checklist - •Admin email:
admin@website-checklist.local → admin@launch-checklist.local - •All documentation updated (CLAUDE.md, README.md, deployment.md, ideas.md)
- •All Claude skills files updated with new name
- •SEO meta titles ≤70 chars, descriptions ≤150 chars (EN + DE)
Fixed- •Accessibility: aria-labels on all icon buttons (Navbar, TaskItem, TeamMembersList)
- •Accessibility: heading hierarchy (h1 → h2 → h3, no skipped levels)
- •Accessibility: html
lang attribute set dynamically per locale - •HTTP → HTTPS redirect noted in deployment docs (NGINX Proxy Manager)
Added- •Pricing page: 6 benefit cards (GitHub-style) with icon, title and description
- •Landing page slogan: "Mit unserer Checkliste wird bei Ihrem Livegang nichts vergessen"
- •Landing page description text below slogan
- •CardTitle
icon prop for automatic icon layout - •SelectTrigger
size="auto" for multi-line template selects - •Navbar active state for all menu items (including dropdown)
- •Language sync: dropdown language switch saves to user profile
- •DB health check on
npm run dev (verifies PostgreSQL connection) - •Pricing page with Free/Pro comparison, feature table
- •ListTodo as app icon and favicon
Changed- •Rebranded from "Website Launch Checklist" to "Launch Checklist" (EN) / "Livegang Checkliste" (DE) across all files
- •All UI components aligned to tweakcn standard sizing (Card, Button, Input, Select, Textarea, Label, Badge, Tabs)
- •Card: gap-6 py-6 px-6 rounded-lg border (no shadow, no ring)
- •Button: h-9 text-sm (default), h-8 (sm), h-6 (xs), h-10 (lg)
- •Input/Textarea: h-9 text-base md:text-sm with visible borders in light mode
- •Badge: text-xs font-medium (was text-[0.625rem])
- •Footer: text-sm py-6 (was text-xs py-4)
- •Avatar uploads: size-28 (112px, was size-20)
- •Avatar groups/member lists: size-lg (40px)
- •Hint texts: text-xs → text-sm across 33 feature components
- •Hardcoded text-[10px] → text-xs for badges and labels
- •Priority/Phase badges: use Badge component with semantic colors
- •CategorySection: text-base header, size-5 icons, larger padding
- •TaskItem title: font-semibold for better hierarchy
- •Team settings: personal team shows "Team erstellen" CTA first, members tab hidden
- •Template overview: NewTemplateDialog shown in empty state
- •Input border pattern: border-border light mode, dark:border-input dark mode
- •No shadows on cards, inputs, selects
Fixed- •Dropdown menu items: cursor-pointer instead of cursor-default
- •Checklist card: edit dialog via SquarePen icon, title links to detail page
- •Comment delete: Trash2 icon instead of ✕ text character
- •Project form error: uses Alert component instead of custom div
- •Reviewer chips: uses Badge component instead of custom span
- •Accordion help section: equal padding top and bottom
- •Checkbox: visible border in light mode
Fixed- •Cookie
secure flag now based on AUTH_URL protocol instead of NODE_ENV — fixes cookie storage over HTTP in Docker/local network deployments - •Upload directory permissions auto-fixed on container start via
docker-entrypoint.sh - •Squashed all 6 migrations into single
20260321000000_initial migration — fixes schema mismatches between db push (local) and migrate deploy (Docker) - •Added missing DB schema:
_TaskDefinitionToTemplate join table, project_reviewers table, task_comments table, teams.website/teams.industry columns, projects.isArchived column - •Duplicate
TEMP_PROJECT_COOKIE constant replaced with shared import from @/lib/constants/cookies
Changed- •Dockerfile: 3-stage → 4-stage build (added seeder stage for reliable DB seeding)
- •Seed script: cleaned up unnecessary workarounds (randomUUID, two-step create, explicit documentationLinks)
- •GitLab CI/CD pipeline: triggers only on tags, merge requests, and manual triggers (saves compute minutes)
- •
prisma.config.ts: dotenv import wrapped in try/catch for Docker compatibility
Added- •Docker integration guide (
docs/docker-integration.md) for global docker-compose setup - •Seeder service (
lc-seed) with --profile seed for one-shot database seeding - •
docker-entrypoint.sh with su-exec for non-root container execution - •Launch Checklist rebranding concept (
docs/concept-launch-checklist-rebranding.md)
Added- •Full team system with personal teams (auto-created) and real teams
- •Team roles: Owner, Admin, Member with granular permission matrix
- •Email-based invitation system with configurable token expiry
- •Team switcher integrated into user menu dropdown
- •Data migration dialog on team join (move or delete personal data)
- •Team avatar/logo upload with magic byte validation
- •Team settings: name, description, website, industry (predefined dropdown)
- •Team member avatar group with tooltips in team settings
- •Multi-reviewer support for projects
- •Admin teams table with owner, industry, member/project counts
- •Team column in admin users table
- •Team info display in user profile settings
- •Leave team functionality for members
- •Admin dashboard with KPI cards, registration/progress charts, template distribution, system health
- •Reordered KPIs: Projects → Teams → Users → Templates → Free-Checklists → Tasks → Progress → Pool
- •Admin task pool management with column sorting, category/phase/template filters, active toggle
- •Admin user management with role change (Admin/User)
- •Admin system settings (SMTP configuration, app name, invitation expiry)
- •Admin teams overview page
- •App version display in System Health section
- •Modular export architecture (one exporter per format)
- •PDF export (HTML-based)
- •Markdown export
- •JSON export
- •Redmine-compatible Markdown export
- •Export includes: tasks with status, category scores, user comments
- •6 manual website checks: SSL, robots.txt, sitemap.xml, HTTPS redirect, Security Headers, Canonical Tags
- •Registry pattern for extensible check system
- •Rate limiting (10 checks/minute/user)
- •Monitoring results displayed within tasks
- •Create, edit, delete projects with team scoping
- •Task checklist with category progress (score system)
- •Custom task creation (title, priority, description)
- •Task assignment to team members
- •Task completion tracking (who completed)
- •Drag & drop task sorting within categories
- •3 system templates: Default, TYPO3, WordPress
- •User templates: save project configuration as reusable template
- •Template editor with task selection
- •Template duplication
- •Apply template to new project
- •Anonymous access via cookie-based temporary project (UUID, 30 days)
- •Project editing for free users (name, domain, deadline, notes)
- •PDF-only export for free users (other formats require registration)
- •Expiry countdown notice with visual urgency (warning when ≤7 days)
- •Task comments with author tracking and delete permissions
- •Seamless conversion to registered account (no data loss)
- •Cleanup job for expired temporary projects
- •Auth.js (NextAuth v5) with JWT strategy and Credentials Provider
- •Login / Register with shadcn login-05 design
- •Password change
- •Account deletion (cascading soft-delete)
- •User avatar upload with magic byte validation
- •Rate limiting on auth endpoints (5 req / 15 min)
- •Profile: name, email, language preference
- •Theme: Dark / Light / System (next-themes)
- •Team settings tab (for team members)
- •Members tab with role management, invitations
- •Nodemailer with SMTP config from Admin Panel (SystemSettings DB)
- •ENV fallback for SMTP credentials
- •Transporter caching with config-hash invalidation
- •Invitation emails + acceptance notification to owner/admins
- •English (primary) and German — complete translations
- •213 task definitions translated (EN + DE)
- •All UI labels, error messages, toast messages
- •Locale routing: EN without prefix, DE with
/de/ prefix - •Next.js 16 App Router with Server Components + Server Actions
- •Prisma ORM with PostgreSQL 17
- •shadcn/ui v4 (Base UI primitives) + Tailwind CSS v4
- •Docker: multi-stage Dockerfile + docker-compose.yml
- •GitLab CI/CD: validate (TypeScript + ESLint), build, SAST, Claude Code
- •CalVer versioning (YY.RELEASE.PATCH) with auto-inject into Footer and Admin
- •Security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy)
- •Soft-delete strategy across all entities
- •Structured JSON logger
- •Global footer with version display
Changed- •Navbar redesign: avatar dropdown with language/theme/team switcher
- •Dashboard: template stats, reordered sections
- •Unified Template model (merged WebsiteType + ProjectTemplate)
- •Theme: tweakcn-generated oklch color scheme (light + dark mode)
- •Font: Open Sans (self-hosted via next/font, GDPR-compliant)
- •Alert component (info/warning variants) for notices and warnings
- •Custom containers refactored to shadcn Card components
- •Hardcoded colors eliminated in favor of theme variables
- •Progress track contrast improved (bg-border for card visibility)