Full Stack App Blueprint
Run ID: 69b6fa11896970b089464ae42026-03-29Development
PantheraHive BOS
BOS Dashboard

Full Stack App Blueprint: AI Model Explorer & Interaction Platform

Workflow Category: Development

Description: Test run

Topic: AI Technology

Execution Time: 5 minutes

This blueprint outlines a comprehensive full-stack application designed to provide users with an interactive platform to explore various AI models, understand their functionalities, visualize their outputs, and potentially interact with them through a simple API interface. This "Test run" blueprint aims to demonstrate a robust, scalable, and maintainable architecture for such a system.


1. Application Overview

Title: AI Model Explorer & Interaction Platform

Core Idea: A web application enabling users to discover, learn about, and interact with different Artificial Intelligence models. It will feature a model catalog, detailed model views, an interactive demo interface, and visualization tools for AI outputs.

Target Audience: Developers, researchers, students, and anyone interested in understanding and experimenting with AI models without deep technical setup.


2. Frontend Components Blueprint

The frontend will focus on an intuitive user experience, responsive design, and efficient data presentation.

* Framework: React (with TypeScript)

* Meta-framework/SSR: Next.js (for routing, server-side rendering/static site generation, API routes for minor serverless functions)

* Styling: Tailwind CSS (for utility-first styling)

* State Management: Zustand or Jotai (for lightweight, performant global state)

* Data Fetching: React Query / SWR (for efficient data fetching, caching, and synchronization)

* Charting/Visualization: Recharts or Nivo (for interactive data visualizations)

* Model Discovery: Search and filter AI models by category, tags, or popularity.

* Model Detail Pages: Comprehensive information for each model (description, architecture, use cases, performance metrics).

* Interactive Demo: A dynamic interface to input data (text, image, parameters) and execute inference on selected models.

* Output Visualization: Rich display of AI model outputs, including text generation, image manipulation, data charts, and confidence scores.

* User Dashboard: Personalized section for saving favorite models, tracking interaction history, and managing API keys (if applicable).

* Responsive Design: Optimized experience across desktop, tablet, and mobile devices.

| Component Name | Description | Dependencies/Props |

| :---------------------- | :------------------------------------------------------------- | :--------------------------------------------------- |

| Header & Footer | Global navigation and branding. | AuthStatus, NavLink |

| ModelCard | A compact display of a single AI model for listings. | Model object, onClick |

| ModelCatalog | Displays a grid/list of ModelCard components. | List of Model objects, SearchInput, FilterTags |

| ModelDetailView | Detailed page for a specific AI model. | Model object, ModelInteractionForm |

| ModelInteractionForm | Dynamic form to accept inputs for AI model inference. | Model input schema, onSubmit |

| OutputDisplay | Renders various types of AI model outputs (text, image, chart). | Output data, OutputType |

| AuthForms | Components for user login and registration. | onSubmit (login/register data) |

| UserDashboard | User-specific content like history and saved models. | User object, InteractionHistory |

| VisualizationChart | Generic component for rendering charts (e.g., bar, line, pie). | ChartData, ChartType, Options |


3. Backend API Blueprint

The backend will provide a robust, scalable, and secure API to manage users, AI model metadata, and orchestrate interactions with AI inference engines.

* Framework: NestJS (Node.js framework for scalable, maintainable server-side applications with TypeScript)

* Language: TypeScript

* Database ORM: TypeORM or Prisma (for interacting with PostgreSQL)

* AI Inference Layer: Python (FastAPI/Flask) for actual AI model serving, potentially as a separate microservice or integrated via a message queue.

* Caching/Queue: Redis (for session management, caching, and task queuing)

* User Management: Handles user registration, authentication, profile management, and role-based access control (RBAC).

* Model Management: CRUD operations for AI model metadata, including versioning, input/output schemas, and status.

* Interaction Service: Manages user requests for model inference, forwards to the AI inference engine, and stores interaction logs.

* Visualization Data Service: Prepares and aggregates data for frontend visualizations, potentially caching results.

* AI Inference Gateway: An internal service responsible for routing requests to the appropriate AI model (either locally hosted, via external APIs, or dedicated Python microservices).

* Logging & Monitoring: Centralized logging and performance monitoring.

| Method | Endpoint | Description | Authentication |

| :----- | :--------------------------- | :----------------------------------------------------- | :------------- |

| POST | /auth/register | Register a new user account. | Public |

| POST | /auth/login | Authenticate user and issue JWT. | Public |

| GET | /users/me | Get current user's profile. | Authenticated |

| PUT | /users/me | Update current user's profile. | Authenticated |

| GET | /models | Retrieve a list of all available AI models. | Public |

| GET | /models/:id | Get details for a specific AI model. | Public |

| POST | /models | Add a new AI model (Admin only). | Admin |

| POST | /models/:id/interact | Submit input data for AI model inference. | Authenticated |

| GET | /interactions | Get interaction history for the current user. | Authenticated |

| GET | /models/tags | Get a list of all available model tags. | Public |

text • 542 chars
*   **Actionable Recommendation:** Implement robust input validation at the API gateway level to protect against malicious inputs and ensure data integrity. Use a dedicated logging library (e.g., Winston or Pino for NestJS) for structured logging.

---

## 4. Database Design Blueprint

A relational database (PostgreSQL) is chosen for its reliability, data integrity features, and strong support for complex queries, suitable for managing structured user and model metadata.

*   **Database System:** PostgreSQL
*   **Schema Design:**

    
Sandboxed live preview
  • Relationships:

* users 1-to-Many models (a user can create many models)

* users 1-to-Many interactions (a user can have many interactions)

* models 1-to-Many interactions (a model can have many interactions)

* models Many-to-Many tags (a model can have many tags, a tag can apply to many models)

  • Actionable Recommendation: Implement database migrations (e.g., using TypeORM migrations or Flyway/Liquibase) to manage schema changes version-controlled and reproducibly. Regularly back up the database.

5. Authentication Blueprint

Secure user authentication and authorization are critical for protecting user data and controlling access to features.

  • Strategy: JSON Web Tokens (JWT)
  • Key Features:

* User Registration: Securely store user credentials (hashed passwords using Bcrypt).

* Login: Authenticate users against stored credentials, issue a short-lived access token (JWT) and a longer-lived refresh token.

* Token-Based API Authentication: Frontend sends the access token with each API request in the Authorization header. Backend validates the token's signature, expiry, and claims.

* Role-Based Access Control (RBAC): Assign roles (user, admin) to users. Backend middleware/guards check user roles to authorize access to specific endpoints or functionalities.

* Password Hashing: Use a strong, adaptive hashing algorithm like Bcrypt for storing passwords.

* Token Refresh Mechanism: (Optional but recommended) Use refresh tokens to obtain new access tokens without re-authenticating, improving user experience and security.

* Environment Variables: All secrets (JWT secret, database credentials) are stored as environment variables.

  • Flow:

1. User registers/logs in with email/password.

2. Backend authenticates, hashes password (for register), generates JWT (access token) and optionally a refresh token.

3. Frontend stores tokens (e.g., access token in memory/httpOnly cookie, refresh token in httpOnly cookie).

4. For subsequent requests, frontend sends access token in Authorization: Bearer <token>.

5. Backend validates token. If valid, processes request. If expired, frontend uses refresh token to get a new access token (if refresh token is valid).

  • Actionable Recommendation: Ensure JWTs are signed with a strong, secret key. Implement rate limiting on authentication endpoints to prevent brute-force attacks. Consider multi-factor authentication (MFA) for enhanced security in later stages.

6. Deployment Configuration Blueprint

A robust deployment strategy ensures high availability, scalability, and maintainability.

  • Infrastructure (Example using AWS):

* Frontend (Next.js): Vercel or AWS Amplify (for static site hosting, CDN, global edge caching).

* Backend (NestJS API): AWS ECS (Elastic Container Service) with Fargate (serverless containers) behind an Application Load Balancer (ALB) for auto-scaling and high availability.

* Database (PostgreSQL): AWS RDS for PostgreSQL (managed database service with automated backups, replication, and scaling).

* AI Inference Layer (Python):

* For lighter models: AWS Lambda with custom runtimes or FastAPI deployed on AWS ECS/Fargate.

* For heavier models: AWS SageMaker Endpoints or dedicated EC2 instances with GPUs.

* Caching/Queue (Redis): AWS ElastiCache for Redis (managed in-memory data store).

* Logging: AWS CloudWatch Logs, integrated with a centralized logging solution like Datadog or ELK stack.

* Monitoring: AWS CloudWatch, Prometheus/Grafana.

  • CI/CD Pipeline (Example using GitHub Actions):

1. Code Commit: Developer pushes code to GitHub.

2. Linting & Formatting: Automated checks for code style and quality.

3. Unit & Integration Tests: Run all test suites for frontend and backend.

4. Build:

* Frontend: Next.js build, generate static assets.

* Backend: Build Docker image for NestJS application.

* AI Inference: Build Docker image for Python inference application.

5. Image Push: Push Docker images to AWS ECR (Elastic Container Registry).

6. Deployment:

* Staging Environment: Automatically deploy to a staging environment for QA testing.

* Production Environment: Manual approval or scheduled deployment for production.

* Frontend: Deploy to Vercel/Amplify.

* Backend/AI Inference: Update ECS service with new Docker image.

7. Post-Deployment: Run E2E tests against deployed environment, notify stakeholders.

  • Scalability & High Availability:

* Horizontal Scaling: Backend API and AI inference services configured for auto-scaling based on CPU utilization or request queue length.

* Database Read Replicas: For heavily read-bound workloads.

* Caching: Redis for frequently accessed data to reduce database load.

* Asynchronous Processing: Use message queues (e.g., AWS SQS or Redis queues) for long-running AI inference tasks to decouple requests and responses, preventing API timeouts.

* CDN: For global distribution and faster delivery of frontend assets.

  • Actionable Recommendation: Implement infrastructure as code (IaC) using tools like AWS CloudFormation or Terraform for reproducible and version-controlled infrastructure provisioning. Set up robust alerting for critical system metrics.

7. Test Suites Blueprint

Comprehensive testing is essential for ensuring application quality, reliability, and preventing regressions.

  • Frontend Test Suites:

* Unit Tests:

* Scope: Individual React components, utility functions, hooks.

* Tools: Jest, React Testing Library.

* Coverage: Aim for 80%+ line coverage for critical components.

* Integration Tests:

* Scope: Interaction between multiple components, API calls (mocked), state management flows.

* Tools: Jest, React Testing Library.

* End-to-End (E2E) Tests:

* Scope: Simulate full user journeys through the application in a real browser.

* Tools: Cypress or Playwright.

* Examples: User registration/login, model search and detail view, submitting an interaction and viewing output.

  • Backend Test Suites:

* Unit Tests:

* Scope: Individual service methods, controllers, utility functions.

* Tools: Jest (for NestJS).

* Coverage: Aim for 80%+ line coverage.

* Integration Tests:

* Scope: API endpoint testing, database interactions (using a test database), service-to-service communication.

* Tools: Supertest (for API requests), Jest.

* E2E Tests:

* Scope: Verify entire API flows, ensuring all services work together correctly.

* Tools: Jest, Supertest.

  • Database Tests:

* Schema Migration Tests: Ensure database migrations apply correctly and don't cause data loss.

* Seed Data Validation: Verify initial data is correctly populated.

  • AI Model Specific Tests:

* Data Validation Tests: Ensure input data conforms to the model's expected schema and ranges.

* Output Validation Tests: Check if model outputs are within expected formats, types, and plausible ranges.

* Performance Benchmarking: Measure inference latency and throughput under various loads.

* Regression Tests: Ensure model updates don't negatively impact previous performance or output quality.

* Bias & Fairness Testing: (Advanced, but critical for ethical AI) Evaluate model outputs for potential biases across different demographic groups or input types.

  • Actionable Recommendation: Integrate testing into the CI/CD pipeline. Use a consistent testing methodology across frontend and backend. Prioritize E2E tests for critical user flows, even if unit test coverage is high.

8. Summary & Next Steps

This blueprint provides a solid foundation for building a robust "AI Model Explorer & Interaction Platform." The chosen technologies offer a balance of performance, maintainability, and community support.

Immediate Actionable Recommendations:

  1. Define MVP Scope: Clearly articulate the minimum set of features for the first release. Focus on core user value (e.g., model discovery, basic interaction, and output display for a few key AI models).
  2. Setup Project Repositories: Create separate (or a monorepo) for frontend, backend, and potentially AI inference services.
  3. Core API Development: Prioritize building the User Management and Model Management APIs, including database schema and authentication.
  4. Frontend Shell: Develop the basic UI layout, navigation, and core components without full data integration.
  5. CI/CD Setup: Establish basic CI/CD pipelines for linting, testing, and automated deployment to a development environment.
  6. Documentation: Start documenting API endpoints, database schema, and architectural decisions from day one.

Long-term Considerations:

  • AI Model Integration Strategy: Plan how to integrate diverse AI models (e.g., local serving, cloud APIs, containerized models).
  • Scalability for AI Inference: If handling high-volume or complex AI models, consider dedicated GPU resources, serverless inference, or specialized AI platforms.
  • Monitoring & Alerting: Implement comprehensive monitoring for application performance, errors, and security events.
  • Security Audits: Regularly conduct security audits and penetration testing.
  • User Feedback Loop: Establish channels for collecting user feedback to guide future development.

This blueprint serves as a detailed roadmap. By following these structured recommendations, your team can efficiently and effectively develop a high-quality, full-stack AI technology application.

full_stack_app_blueprint.txt
Download source file
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
\n\n\n"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547}\n"); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/\.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/\*\*(.+?)\*\*/g,"$1"); hc=hc.replace(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); } function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}