Some checks failed
Build and Deploy to k3s / build-and-deploy (push) Failing after 1m31s
Complete framework migration from Angular to Next.js with full feature parity. ## What Changed - Migrated from Angular 20 to Next.js 15 with App Router - Replaced Angular components with React functional components - Implemented React Context API for state management (replacing RxJS) - Integrated React Hook Form for form handling - Added shadcn/ui component library - Configured Tailwind CSS 4.1 with @tailwindcss/postcss - Implemented JWT authentication with middleware protection ## Core Features Implemented - ✅ User registration and login with validation - ✅ JWT token authentication with localStorage - ✅ Protected dashboard route with middleware - ✅ Portfolio listing with status indicators - ✅ Create portfolio functionality - ✅ ZIP file upload with progress tracking - ✅ Portfolio deployment - ✅ Responsive design with Tailwind CSS ## Technical Stack - Framework: Next.js 15 (App Router) - Language: TypeScript 5.8 - Styling: Tailwind CSS 4.1 - UI Components: shadcn/ui + Lucide icons - State: React Context API + hooks - Forms: React Hook Form - API Client: Native fetch with custom wrapper ## File Structure - /app - Next.js pages (landing, login, register, dashboard) - /components - React components (ui primitives, auth provider) - /lib - API client, types, utilities - /hooks - Custom hooks (useAuth, usePortfolios) - /middleware.ts - Route protection - /angular-backup - Preserved Angular source code ## API Compatibility - All backend endpoints remain unchanged - JWT Bearer token authentication preserved - API response format maintained ## Build Output - Production build: 7 routes compiled successfully - Bundle size: ~102kB shared JS (optimized) - First Load JS: 103-126kB per route ## Documentation - Updated README.md with Next.js setup guide - Created OpenSpec proposal in openspec/changes/migrate-to-nextjs-launchui/ - Added project context in openspec/project.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
12 KiB
Project Context
Purpose
This is a Portfolio Hosting Management Platform - a SaaS application that enables users to create, upload, deploy, and manage their portfolio websites with custom domains. Users can register for accounts, upload portfolio content as ZIP files, and deploy them to custom domains with automated hosting infrastructure.
Primary Goals
- Provide a simple, user-friendly interface for portfolio deployment
- Enable non-technical users to host professional portfolio websites
- Support multiple portfolios per user with custom domain mapping
- Offer seamless file upload and deployment workflows
- Display public portfolio examples to attract new users
Tech Stack
Current Stack (Angular - To Be Migrated)
- Frontend Framework: Angular 20 (standalone components)
- Language: TypeScript 5.8.2
- Styling: Tailwind CSS 4.1.8
- State Management: RxJS 7.8.0 (BehaviorSubjects)
- Forms: Angular Reactive Forms
- HTTP Client: Angular HttpClient with interceptors
- Routing: Angular Router
- Testing: Jasmine 5.7.0 + Karma 6.4.0
- Build Tool: Angular CLI 20.0.0
- Package Manager: npm
Target Stack (Next.js - Migration in Progress)
- Frontend Framework: Next.js 15 (App Router)
- UI Component Library: Launch UI (shadcn/ui + Tailwind CSS 4.0)
- Language: TypeScript 5.0
- Styling: Tailwind CSS 4.0
- State Management: React Context API + hooks
- Forms: React Hook Form
- HTTP Client: Native fetch with custom wrapper
- Icons: Lucide React
- Testing: Jest + React Testing Library
- Build Tool: Next.js + Turbopack
- Package Manager: npm
Backend (Unchanged)
- API Server: Separate backend service (not part of this repository)
- Authentication: JWT Bearer tokens
- API Base URL:
- Development:
http://localhost:8000/api - Production:
https://api.portfolio-host.com/api
- Development:
Infrastructure
- Containerization: Docker (Dockerfile in repository)
- Deployment: Kubernetes with Ingress
- Version Control: Git (current branch:
main)
Project Conventions
Code Style
TypeScript
- Strict Mode: Enabled (
strict: truein tsconfig.json) - Null Checks: Enforced (
strictNullChecks: true) - Explicit Types: Required (
noImplicitAny: true) - Target: ES2022
Naming Conventions
- Files: kebab-case (e.g.,
api-client.ts,auth-provider.tsx) - Components: PascalCase (e.g.,
LoginComponent,DashboardPage) - Functions/Variables: camelCase (e.g.,
getUserData,isAuthenticated) - Constants: UPPER_SNAKE_CASE (e.g.,
API_BASE_URL,MAX_FILE_SIZE) - Interfaces/Types: PascalCase with descriptive names (e.g.,
Portfolio,ApiResponse<T>)
Code Organization (Next.js Target)
- Components:
/componentsdirectory, grouped by feature or UI library/components/launch-ui/- Launch UI components/components/ui/- shadcn/ui primitives/components/auth/- Authentication-related components
- Pages:
/appdirectory using App Router conventions - Utilities:
/libdirectory for shared utilities and API client - Hooks:
/hooksdirectory for custom React hooks - Types:
/lib/types.tsor co-located with features
Formatting
- Indentation: 2 spaces (no tabs)
- Quotes: Single quotes for strings (except JSX attributes use double quotes)
- Semicolons: Required
- Line Length: 100 characters (soft limit)
- Trailing Commas: Yes (for multi-line arrays/objects)
Architecture Patterns
Component Architecture (Next.js)
- React Server Components (RSC): Default for pages and non-interactive components
- Client Components: Explicitly marked with
'use client'directive - Composition Over Inheritance: Prefer component composition
- Single Responsibility: Each component has one clear purpose
State Management
- Global State: React Context API for authentication and user data
- Local State:
useStatefor component-level state - Server State:
useEffect+ fetch for data fetching (consider SWR/React Query for future enhancement) - Form State: React Hook Form for all forms
API Integration
- API Client Pattern: Centralized fetch wrapper in
/lib/api-client.ts - Generic Methods: Typed request methods (
get<T>,post<T>, etc.) - Error Handling: Centralized error handling with automatic 401 logout
- Authentication: Bearer token injection via function wrapper (not middleware in fetch)
- Response Model: All API responses follow
ApiResponse<T>interface
Routing Strategy
- File-Based Routing: Next.js App Router (
/appdirectory) - Protected Routes: Middleware-based authentication check
- Layouts: Shared layouts in
layout.tsxfiles - Metadata: Page-level SEO metadata using Next.js metadata API
Styling Strategy
- Utility-First CSS: Tailwind CSS utilities for all styling
- Component Variants: shadcn/ui variant patterns (e.g.,
variant="outline") - Responsive Design: Mobile-first breakpoints (sm, md, lg, xl, 2xl)
- Custom Themes: Extend Tailwind config for brand colors and typography
- CSS Modules: Avoid - prefer Tailwind utilities
Testing Strategy
Current (Angular - To Be Replaced)
- Unit Tests: Jasmine + Karma for component and service tests
- Test Location:
*.spec.tsfiles co-located with source files - Coverage Target: Not formally defined
Target (Next.js)
- Unit Tests: Jest + React Testing Library
- Component Tests: Test user interactions and rendering
- Integration Tests: Test authentication flows and API interactions
- E2E Tests: (Future) Playwright or Cypress for critical user journeys
- Test Location:
*.test.tsxor__tests__/directories - Coverage Target: 70%+ for critical paths (auth, API client)
- Accessibility Tests: axe-core integration for WCAG 2.1 AA compliance
Testing Principles
- Test user behavior, not implementation details
- Mock external API calls in unit tests
- Use integration tests for authentication flow validation
- Validate form validation logic thoroughly
- Test error states and edge cases
Git Workflow
Branching Strategy
- Main Branch:
main(production-ready code) - Feature Branches:
feature/<feature-name>(e.g.,feature/nextjs-migration) - Bugfix Branches:
fix/<bug-description>(e.g.,fix/login-redirect) - Hotfix Branches:
hotfix/<issue>for production issues
Commit Conventions
- Format:
<type>(<scope>): <subject> - Types:
feat: New featurefix: Bug fixrefactor: Code refactoringdocs: Documentation changesstyle: Formatting changestest: Adding or updating testschore: Build tasks, dependencies
Examples:
feat(auth): implement JWT token refreshfix(dashboard): correct portfolio status badge logicrefactor(api): migrate from Angular HttpClient to fetch
Pull Request Process
- Create PR with descriptive title and summary
- Link related issues or OpenSpec changes
- Request code review from at least one team member
- Ensure CI/CD checks pass (tests, linting, build)
- Squash commits before merging to main
Domain Context
Core Domain Concepts
Portfolio
A user's website project that can be uploaded, deployed, and hosted.
- Status States:
Inactive- Payment pending (not active)Pending Upload- Active but no files uploaded (no path)Uploaded- Files uploaded, ready for deployment (has path)
- Deployment: Portfolio ZIP files are extracted and served at custom domains
- Domain Mapping: Each portfolio has a unique domain (user-defined)
User Authentication
- Registration: Users provide name, email, and password
- Login: Email/password authentication returns JWT token
- Session Management: JWT tokens stored in localStorage, included in API requests
- Token Refresh: Backend supports token refresh endpoint
File Upload
- Format: ZIP files containing portfolio HTML/CSS/JS
- Process: Upload → Extract → Deploy to domain
- Size Limits: (Backend-defined, not enforced in frontend)
User Roles
Currently single-role system:
- Authenticated User: Can create, upload, and manage their own portfolios
Key User Flows
-
New User Registration
- User visits landing page
- Clicks "Sign Up" → Registration form
- Submits name, email, password → Backend creates account
- Redirects to login page
-
Existing User Login
- User navigates to /login
- Submits email + password
- Receives JWT token → Stored in localStorage
- Redirects to dashboard
-
Portfolio Creation & Deployment
- User creates new portfolio (name + domain)
- Uploads ZIP file → Backend processes
- Clicks "Deploy" → Portfolio goes live at custom domain
- Visits domain to view live portfolio
-
Portfolio Example Discovery
- Visitor on landing page clicks "View Example"
- Random portfolio fetched from API
- Redirects to example portfolio domain
Important Constraints
Technical Constraints
- API Compatibility: Frontend must remain compatible with existing backend API (no backend changes allowed during migration)
- JWT Token Format: Must preserve existing JWT authentication pattern
- Bundle Size: Next.js production bundle should be ≤500KB (main JS)
- Browser Support: Modern browsers (Chrome, Firefox, Safari, Edge - latest 2 versions)
- TypeScript Version: Next.js migration requires TypeScript 5.0 (downgrade from 5.8)
- Mobile Responsiveness: Must support viewports down to 375px width
Business Constraints
- Zero Downtime Deployment: Migration must not cause service interruption
- Session Preservation: Minimize user re-authentication during migration (stretch goal)
- Feature Parity: All Angular features must be replicated in Next.js version before cutover
- Performance Requirements: Core Web Vitals must meet or exceed current benchmarks
- First Contentful Paint (FCP): <1.0s
- Largest Contentful Paint (LCP): <1.5s
- Time to Interactive (TTI): <2.0s
Design Constraints
- UI Library: Launch UI (free version) must be used for landing page components
- Accessibility: WCAG 2.1 Level AA compliance required
- SEO: Server-side rendering required for public pages (landing, login, register)
Infrastructure Constraints
- Deployment Platform: Must remain Docker-based (Dockerfile required)
- Environment Variables: Must support development and production configurations
- Reverse Proxy: Deployment assumes reverse proxy/Ingress for routing
External Dependencies
APIs
- Backend API: RESTful API for authentication and portfolio management
- Base URL:
{environment.apiUrl}/api - Endpoints:
/auth/*,/portfolios/*,/portfolio/random - Authentication: Bearer token (JWT)
- Response Format:
{ success: boolean, data?: T, message?: string, errors?: any }
- Base URL:
Third-Party Libraries
- Launch UI: Open-source UI component library (MIT license)
- Repository: https://github.com/launch-ui/launch-ui
- Components: Navbar, Hero, Items, Logos, FAQ, Stats, CTA, Footer
- Foundation: shadcn/ui + Tailwind CSS
- shadcn/ui: Headless component library (copy-paste components)
- Lucide Icons: Icon library (MIT license)
- Tailwind CSS: Utility-first CSS framework (MIT license)
Build & Development Tools
- Next.js: React framework (MIT license)
- TypeScript: JavaScript superset (Apache 2.0)
- PostCSS: CSS processing (MIT license)
- Autoprefixer: CSS vendor prefixing (MIT license)
Testing & Quality Tools
- Jest: Testing framework (MIT license)
- React Testing Library: Component testing (MIT license)
- axe-core: Accessibility testing (Mozilla Public License 2.0)
Migration Notes
Current Status
- Phase: Planning and proposal stage (OpenSpec change in progress)
- Change ID:
migrate-to-nextjs-launchui - Affected Capabilities: frontend, ui-components, authentication, routing, state-management
Key Decisions
- Next.js App Router over Pages Router (future-proof, Launch UI compatibility)
- React Hook Form for form management (performance, TypeScript support)
- React Context API for state (simplicity, adequate for scale)
- Native fetch with custom wrapper (Next.js optimization, smaller bundle)
- Parallel deployment strategy (risk mitigation, gradual rollout)
Post-Migration Conventions
Once migration is complete, this section will be removed and the conventions above will reflect the Next.js stack as the primary architecture.