Technical Architecture Designer
Run ID: 69b6fa0a896970b089464a312026-03-29Development
PantheraHive BOS
BOS Dashboard

Technical Architecture Design: AI-Powered Content Platform

Project Description: Test run for an AI-powered content generation and analysis platform.

Topic: AI Technology

This document outlines a complete technical architecture for an AI-powered platform designed to generate, analyze, and manage textual content. It covers system components, API specifications, database design, infrastructure, and scalability strategies.


1. System Overview and Core Components

The AI-Powered Content Platform enables users to generate new content (e.g., articles, marketing copy, social media posts) using large language models (LLMs), analyze existing text for sentiment, key topics, or summaries, and manage their generated/analyzed content.

Core Components:

* Relational Database for user and content metadata.

* Cache/NoSQL for session management and fast data access.


2. System Diagrams

2.1. High-Level Architecture

text • 50 chars
### 2.2. Data Flow Diagram (Content Generation)

Sandboxed live preview

3. API Specifications

All APIs are RESTful, using JSON for request/response bodies, and secured with JWTs.

3.1. Authentication API (/auth)

  • POST /auth/register

* Description: Registers a new user.

* Request Body: {"username": "user", "email": "user@example.com", "password": "password"}

* Response: {"message": "User registered successfully", "userId": "uuid-123"}

  • POST /auth/login

* Description: Authenticates a user and returns a JWT.

* Request Body: {"email": "user@example.com", "password": "password"}

* Response: {"token": "jwt.token.here", "refreshToken": "refresh.token.here"}

  • POST /auth/refresh-token

* Description: Refreshes an expired JWT using a refresh token.

* Request Body: {"refreshToken": "refresh.token.here"}

* Response: {"token": "new.jwt.token.here"}

3.2. Content Generation API (/content/generate)

  • POST /content/generate

* Description: Initiates an asynchronous content generation task.

* Headers: Authorization: Bearer <JWT>

* Request Body: {"prompt": "Write a blog post about AI in healthcare.", "length": "long", "style": "professional"}

* Response: {"taskId": "gen-task-uuid-456", "status": "PENDING", "message": "Content generation initiated."}

  • GET /content/generate/status/{taskId}

* Description: Checks the status of a content generation task.

* Headers: Authorization: Bearer <JWT>

* Response (PENDING/IN_PROGRESS): {"taskId": "gen-task-uuid-456", "status": "IN_PROGRESS", "progress": 50}

* Response (COMPLETED): {"taskId": "gen-task-uuid-456", "status": "COMPLETED", "resultId": "content-uuid-789"}

3.3. Content Analysis API (/content/analyze)

  • POST /content/analyze

* Description: Initiates an asynchronous content analysis task.

* Headers: Authorization: Bearer <JWT>

* Request Body: {"text": "This movie was absolutely fantastic!", "analysisType": ["sentiment", "keywords"]}

* Response: {"taskId": "analyze-task-uuid-101", "status": "PENDING", "message": "Content analysis initiated."}

  • GET /content/analyze/status/{taskId}

* Description: Checks the status of a content analysis task.

* Headers: Authorization: Bearer <JWT>

* Response (COMPLETED): {"taskId": "analyze-task-uuid-101", "status": "COMPLETED", "results": {"sentiment": "positive", "keywords": ["movie", "fantastic"]}}

3.4. Content Management API (/content)

  • POST /content

* Description: Saves a piece of content.

* Headers: Authorization: Bearer <JWT>

* Request Body: {"title": "AI in Healthcare Blog Post", "content": "The generated text...", "tags": ["AI", "healthcare"]}

* Response: {"contentId": "content-uuid-789", "message": "Content saved successfully."}

  • GET /content/{contentId}

* Description: Retrieves a specific piece of content.

* Headers: Authorization: Bearer <JWT>

* Response: {"contentId": "content-uuid-789", "title": "...", "content": "...", "createdAt": "..."}

  • GET /content?userId={userId}&tag={tag}

* Description: Lists content for a user, with optional filtering.

* Headers: Authorization: Bearer <JWT>

* Response: [{"contentId": "...", "title": "..."}, ...]


4. Database Schemas

4.1. User Management Database (PostgreSQL)

Table: users

  • id (UUID, PK)
  • username (VARCHAR(50), UNIQUE, NOT NULL)
  • email (VARCHAR(255), UNIQUE, NOT NULL)
  • password_hash (VARCHAR(255), NOT NULL)
  • created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)
  • updated_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)

Table: refresh_tokens

  • id (UUID, PK)
  • user_id (UUID, FK to users.id, NOT NULL)
  • token (VARCHAR(255), UNIQUE, NOT NULL)
  • expires_at (TIMESTAMP, NOT NULL)
  • created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)

4.2. Content Database (PostgreSQL)

Table: content_items

  • id (UUID, PK)
  • user_id (UUID, FK to users.id, NOT NULL)
  • title (VARCHAR(255), NOT NULL)
  • content_url (VARCHAR(2048)) - S3 URL for large content
  • summary (TEXT) - Short preview, if content is large
  • type (VARCHAR(50)) - E.g., 'GENERATED', 'UPLOADED', 'ANALYZED'
  • status (VARCHAR(50)) - E.g., 'DRAFT', 'PUBLISHED'
  • created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)
  • updated_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)

Table: content_tags (Many-to-Many relationship for tags)

  • content_id (UUID, FK to content_items.id, PK)
  • tag (VARCHAR(100), PK)

Table: analysis_results

  • id (UUID, PK)
  • content_id (UUID, FK to content_items.id, NULLABLE if direct text analysis)
  • user_id (UUID, FK to users.id, NOT NULL)
  • analysis_type (VARCHAR(50), NOT NULL) - E.g., 'SENTIMENT', 'KEYWORDS', 'SUMMARY'
  • results_json (JSONB, NOT NULL) - Stores the detailed analysis output
  • created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)

4.3. Task Queue / Cache (Redis)

  • Key-Value Store: For session management, rate limiting, and temporary task statuses.

* session:<session_id>: JWT claims, expiration.

* task:<task_id>: JSON object containing status, progress, resultId/error, timestamp.

  • Message Broker: Redis Streams or Pub/Sub for task queue (alternative to dedicated message broker like Kafka/RabbitMQ for simpler cases).

5. Infrastructure Plan

5.1. Cloud Provider and Services

  • Provider: AWS (or GCP/Azure with equivalent services).
  • Compute:

* Frontend (UI): AWS S3 for static site hosting + CloudFront CDN.

* Backend Services: AWS ECS (Elastic Container Service) with Fargate for serverless containers, or AWS EKS (Elastic Kubernetes Service) for more complex orchestration.

  • Networking:

* API Gateway: AWS API Gateway for all external API endpoints, handling throttling, caching, and custom domains.

* Load Balancers: AWS ALB (Application Load Balancer) for distributing traffic to ECS/EKS services.

* VPC: Isolate resources in a Virtual Private Cloud with public/private subnets.

  • Databases:

* Relational: AWS RDS for PostgreSQL (managed database service).

* Cache/Queue: AWS ElastiCache for Redis.

  • Storage:

* Object Storage: AWS S3 for storing large content, model outputs, and static assets.

  • Message Queue: AWS SQS (Simple Queue Service) for decoupling AI tasks, or Kafka if high throughput/durability is critical.
  • AI/ML:

* External LLMs: Integration with OpenAI, Anthropic, Google Gemini, etc.

* Internal Models (Optional): AWS SageMaker for hosting custom fine-tuned models.

5.2. Deployment Strategy

  • Containerization: All backend services (Auth, Content, AI Gen/Analysis) are containerized using Docker.
  • CI/CD Pipeline:

* Version Control: Git (e.g., GitHub, GitLab, AWS CodeCommit).

* Build: AWS CodeBuild (or Jenkins, GitLab CI) to build Docker images.

* Registry: AWS ECR (Elastic Container Registry) to store Docker images.

* Deploy: AWS CodeDeploy (or ArgoCD for Kubernetes) for automated deployments to ECS/EKS.

  • Infrastructure as Code (IaC): AWS CloudFormation or Terraform to define and manage all infrastructure resources.

5.3. Monitoring & Logging

  • Logging: AWS CloudWatch Logs for centralized log aggregation from all services.
  • Monitoring: AWS CloudWatch Metrics and Dashboards for application performance, resource utilization, and custom alarms.
  • Tracing: AWS X-Ray for distributed tracing across microservices to identify bottlenecks.
  • Alerting: CloudWatch Alarms integrated with SNS for notifications (email, PagerDuty, Slack).

5.4. Security Considerations

  • Network Segmentation: Use VPCs, security groups, and NACLs to restrict network access.
  • Identity and Access Management (IAM): Least privilege principle for all AWS resources and service accounts.
  • Data Encryption:

* At Rest: RDS encryption, S3 encryption (SSE-S3, SSE-KMS).

* In Transit: HTTPS/TLS for all communication (API Gateway, ALB, internal service communication).

  • Authentication/Authorization: JWTs for user authentication, OAuth2 for third-party integrations.
  • Secrets Management: AWS Secrets Manager for API keys, database credentials, and other sensitive information.
  • Web Application Firewall (WAF): AWS WAF with API Gateway/CloudFront to protect against common web exploits.

6. Scalability Recommendations

6.1. Application Layer (Backend Services)

  • Horizontal Scaling: All stateless backend services (Auth, Content, AI Gen/Analysis) should be designed for horizontal scaling (add more instances). Use AWS Auto Scaling Groups or Kubernetes HPA (Horizontal Pod Autoscaler) based on CPU, memory, or request queue length.
  • Stateless Services: Ensure services do not store session-specific data locally; use Redis/ElastiCache for session management.
  • Asynchronous Processing: Leverage message queues (SQS) for long-running AI tasks to prevent API timeouts and improve responsiveness. This allows the system to accept many requests and process them in the background.

6.2. Data Layer

  • Read Replicas: For PostgreSQL RDS, use read replicas to offload read traffic from the primary database instance, especially for content retrieval.
  • Caching: Implement caching (ElastiCache Redis) at various layers:

* API Gateway Caching: For frequently accessed static content or user profiles.

* Application-Level Caching: For database query results or AI analysis results.

  • Database Sharding/Partitioning: If the content database grows excessively large, consider sharding content by user ID or other criteria to distribute data across multiple database instances.
  • Object Storage for Large Content: Store raw generated text or input documents in S3, storing only references (URLs) in the database.

6.3. AI/ML Layer

  • Managed AI Services: Rely on highly scalable external LLM APIs (OpenAI, Anthropic) which handle their own scaling.
  • Dedicated AI Workers: Scale AI Worker Services independently based on the volume of tasks in the message queue. Use GPU-optimized instances if deploying custom large models.
  • Model Caching: Cache results of common AI analysis requests to reduce redundant computations and API costs.

6.4. Infrastructure Layer

  • CDN: Use AWS CloudFront (Content Delivery Network) for the UI to cache static assets geographically closer to users, reducing latency and load on the origin server.
  • Serverless Functions: Consider AWS Lambda for specific, event-driven tasks that don't require long-running containers (e.g., webhook processing, data transformations).
  • Global Distribution: For global reach, explore multi-region deployments with AWS Global Accelerator or Route 53 latency-based routing.

7. Actionable Next Steps

  1. Define Detailed Requirements: Elaborate on specific content types, AI models, and user features.
  2. Choose Core Technologies: Finalize the choice of cloud provider, specific AWS services, programming languages, and frameworks.
  3. Setup Core Infrastructure (IaC): Begin implementing the VPC, API Gateway, RDS, and S3 buckets using Terraform or CloudFormation.
  4. Develop Authentication Service: Build and secure the user authentication and authorization module first.
  5. Implement CI/CD Pipeline: Establish the automated build, test, and deployment process for a single service.
  6. Prototype Key AI Integrations: Develop a basic content generation and analysis flow to validate external LLM API integrations and worker functionality.
  7. Security Audit: Conduct an initial security review of the proposed architecture and configurations.
technical_architecture_designe.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);}});}