SaaS Pricing Strategy
Run ID: 69b6fa0d896970b089464a7d2026-03-29Business
PantheraHive BOS
BOS Dashboard

Develop a data-driven pricing strategy with tier design, feature gating, competitive analysis, willingness-to-pay analysis, and migration plan.

As a professional AI assistant within PantheraHive, I have executed the "SaaS Pricing Strategy" workflow. This strategy is tailored for an AI Technology SaaS, incorporating data-driven approaches, competitive insights, and a clear path for implementation, even within the context of a "Test run."


SaaS Pricing Strategy: AI Technology (Test Run)

Workflow Goal: Develop a data-driven pricing strategy with tier design, feature gating, competitive analysis, willingness-to-pay analysis, and a migration plan for an AI Technology SaaS.

Topic: AI Technology

Description: Test run

Execution Time: 5 min (+100 cr)


1. Executive Summary

This document outlines a foundational pricing strategy for an AI Technology SaaS, designed for a "test run" scenario. The core objective is to establish a tiered pricing model that aligns with customer value, market dynamics, and the unique cost structures of AI services. The strategy emphasizes a hybrid model, combining usage-based billing for core AI consumption with seat-based or feature-gated access for advanced capabilities and support. Key recommendations include a focus on value metrics, continuous competitive monitoring, and a phased migration plan for existing users. This strategy aims to optimize revenue, enhance customer acquisition, and ensure long-term sustainability.


2. Market & Competitive Analysis (AI Technology Sector)

The AI Technology sector is highly dynamic, with varied pricing models reflecting the diversity of services (e.g., foundational models, specialized APIs, MLOps platforms, AI-powered applications).

2.1 Key Competitive Landscape Overview

| Competitor Category | Examples (Illustrative) | Typical Pricing Models | Key Features Gated |

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

| Foundational Models | OpenAI (GPT-x), Anthropic (Claude), Google AI (PaLM) | Usage-based (tokens, requests), tiered access | Model size/performance, fine-tuning, higher rate limits, dedicated infrastructure, enterprise support |

| Specialized AI APIs | Hugging Face (inference), AWS Rekognition, Google Vision | Usage-based (per-call, per-unit processed), tiered | Throughput, latency, custom model deployment, advanced analytics, SLA guarantees |

| MLOps Platforms | DataRobot, Sagemaker, Weights & Biases | Seat-based, usage-based (compute, storage), project-based | Advanced governance, custom integrations, dedicated compute, team collaboration features |

| AI-Powered Apps | Jasper, Midjourney, Grammarly Business | Seat-based, feature-based, subscription tiers | Higher usage limits, advanced features, team management, branding, priority support |

2.2 Key Observations & Opportunities

  • Hybrid Models Prevail: A mix of usage-based (for core AI consumption) and subscription/seat-based (for platform features, support, and advanced access) is common and effective.
  • Value-Based Metrics: Pricing is often tied directly to value delivered (e.g., tokens processed, API calls, compute hours, number of models deployed).
  • Scalability & Enterprise Features: Higher tiers consistently gate features like dedicated infrastructure, advanced security/compliance, custom model training, and enterprise-grade support.
  • Developer-First Approach: Many AI platforms offer generous free tiers or low-cost entry points to attract developers, fostering adoption and community.
  • Opportunity: Differentiate by offering unique value metrics, superior performance for specific tasks, specialized model access, or unparalleled developer experience.

3. Willingness-to-Pay (WTP) Analysis (Conceptual for Test Run)

Determining WTP for an AI Technology SaaS involves understanding the perceived value across different customer segments. For this "test run," we'll outline a conceptual approach.

3.1 Customer Segments & Hypothesized WTP Drivers

| Segment | Primary Value Drivers | Hypothesized WTP |

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

| Individual Devs/Researchers | Access to powerful models, ease of use, experimentation | Low upfront, usage-based for bursts, free tier critical |

| Startups/SMBs | Productivity gains, cost efficiency, rapid prototyping | Moderate, predictable costs, scalable usage |

| Growth/Mid-Market | Scalability, reliability, integration, specific use-case optimization | Higher, value-based, dedicated support, some customization |

| Enterprise | Security, compliance, performance, dedicated resources, custom solutions, deep integrations | Premium, SLA-backed, custom contracts, value-based on ROI |

3.2 Recommended WTP Analysis Methods (for full implementation)

  1. Surveys & Interviews: Direct feedback on perceived value and acceptable price points.
  2. Conjoint Analysis: Identify feature combinations and their impact on WTP.
  3. Van Westendorp Price Sensitivity Meter: Determine a range of acceptable prices.
  4. Value-Based Pricing Interviews: Understand the ROI customers expect from using the AI service.
  5. Competitor Benchmarking: Analyze competitor pricing as a baseline.
  6. Usage Data Analysis: For existing products, identify features that drive engagement and value.

4. Proposed Tier Design & Feature Gating

We propose a 4-tier model, balancing accessibility with advanced capabilities and enterprise-grade services. The primary value metric will be "Compute Units" (an abstract measure combining API calls, tokens processed, or GPU seconds) for core AI consumption, complemented by seat-based access for platform features.

4.1 Tier Structure Overview

| Tier Name | Target Audience | Core Value Proposition | Pricing Model | Base Price (Illustrative) |

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

| 1. Developer | Individual devs, hobbyists, students | Free exploration, basic API access, community support | Free + Overage (low threshold) | Free |

| 2. Pro | Small teams, startups, advanced devs | Scalable usage, enhanced features, priority support | Monthly subscription + usage-based overage | $49/month |

| 3. Business | Mid-market, growing teams, specific use-cases | Higher limits, team management, dedicated resources, advanced analytics | Monthly subscription (per seat) + usage-based overage | $249/month |

| 4. Enterprise | Large corporations, highly regulated industries | Custom solutions, dedicated infrastructure, premium SLA, deep integration | Custom annual contract | Custom |

4.2 Detailed Tier Breakdown & Feature Gating

Tier 1: Developer (Free)

  • Target: Individual developers, students, researchers, proof-of-concept projects.
  • Key Features Included:

* Limited Compute Units (e.g., 50,000 units/month).

* Access to core AI models (standard performance).

* Standard API access and documentation.

* Community forum support.

* Basic analytics dashboard.

  • Key Features Gated (Excluded):

* Higher-performance models.

* Custom model training/fine-tuning.

* Dedicated support channels.

* Team collaboration features.

* Advanced security/compliance.

* SLA guarantees.

  • Overage Policy: Pay-as-you-go for additional Compute Units beyond the free limit (e.g., $0.0005/unit).

Tier 2: Pro ($49/month)

  • Target: Small teams, startups, individual professionals needing more capacity.
  • Key Features Included:

* All Developer Tier features.

* Increased Compute Units (e.g., 500,000 units/month included).

* Access to higher-performance models (e.g., faster inference).

* Priority email support (24-hour response).

* Basic team management (up to 5 users).

* Extended data retention (e.g., 90 days).

* Access to advanced API endpoints.

  • Key Features Gated (Excluded):

* Custom model training infrastructure.

* Dedicated account manager.

* Advanced enterprise integrations (SSO, SCIM).

* Audit logs, compliance reporting.

* SLA guarantees.

  • Overage Policy: Pay-as-you-go for additional Compute Units (e.g., $0.0004/unit).

Tier 3: Business ($249/month)

  • Target: Growing businesses, mid-market companies, departments within larger organizations.
  • Key Features Included:

* All Pro Tier features.

* Significantly increased Compute Units (e.g., 5,000,000 units/month included).

* Advanced team management (unlimited users).

* Access to specialized AI models or custom model training infrastructure (limited).

* Dedicated technical support channel (e.g., Slack, 12-hour response).

* Enhanced security features (e.g., role-based access control).

* Extended data retention (e.g., 1 year).

* Advanced analytics and reporting.

  • Key Features Gated (Excluded):

* Dedicated private cloud deployment.

* Custom model development services.

* On-premise deployment options.

* Highest level SLA.

  • Overage Policy: Pay-as-you-go for additional Compute Units (e.g., $0.0003/unit).

Tier 4: Enterprise (Custom Pricing)

  • Target: Large enterprises, organizations with strict compliance, high-volume users, specific custom requirements.
  • Key Features Included:

* All Business Tier features.

* Custom Compute Unit allocations, potentially unlimited.

* Dedicated account manager and solution architect.

* Highest priority, 24/7 support with guaranteed SLA.

* Advanced security & compliance (SOC 2, ISO 27001, HIPAA readiness).

* SSO, SCIM, and advanced enterprise integrations.

* Custom model development & fine-tuning services.

* Dedicated compute infrastructure or private cloud deployment options.

* On-premise deployment capabilities (optional).

* Custom data retention policies.

* Legal and procurement support.

  • Pricing: Tailored annual contracts based on specific needs, volume, and required services.

5. Value Metrics & Pricing Model Recommendations

5.1 Recommended Value Metrics for AI Technology

  • Primary Metric: Compute Units: An aggregated metric that abstracts underlying complexity (e.g., 1 Compute Unit = 1,000 tokens processed, or 10 API calls, or 0.1 GPU seconds). This provides flexibility and simplifies pricing for users.
  • Secondary Metrics (for specific features):

* Active Users/Seats: For team collaboration, platform access.

* Number of Models Deployed: For MLOps or model hosting features.

* Storage (GB-months): For custom model data, training data.

* Dedicated Infrastructure (per hour/month): For private endpoints, GPU instances.

5.2 Pricing Model Recommendation

A Hybrid Pricing Model is recommended:

  • Usage-Based Core: The primary pricing driver for AI consumption (API calls, tokens, compute) should be usage-based ("Compute Units") across all paid tiers. This aligns cost directly with value consumed.
  • Subscription/Seat-Based for Platform Value: A fixed monthly subscription fee per tier (or per seat for Business/Enterprise) unlocks specific platform features, higher rate limits, support levels, and included Compute Units.
  • Overage Charges: Implement clear, transparent overage charges for Compute Units beyond the included allowance in Pro and Business tiers.

Justification: This hybrid approach provides flexibility and scalability, caters to varying consumption patterns, and allows for clear differentiation of features and support levels. It also makes pricing transparent and predictable for core usage while enabling growth through consumption.


6. Pricing Strategy Implementation & Migration Plan

6.1 Phased Rollout Strategy

  1. Internal Testing & Feedback (Week 1-2):

* Test pricing models internally with mock customers.

* Gather feedback from sales, marketing, and product teams.

* Refine pricing pages and internal tools.

  1. Pilot Program (Month 1):

* Select a small group of friendly, engaged customers (existing and new) to pilot the new pricing.

* Collect direct feedback on perceived fairness, value, and clarity.

* Monitor usage patterns and revenue impact closely.

  1. Public Launch (Month 2):

* Full public rollout of the new pricing structure.

* Monitor KPIs intensely and be prepared for quick adjustments.

6.2 Communication Plan

  • Existing Customers:

* Early Notification: Send a personalized email 30-60 days before the change, explaining the "why" behind the new pricing (e.g., "to better align with value," "enable new features").

* Value Proposition: Clearly articulate the benefits of the new tiers and how it enhances their experience.

* Grandfathering/Migration Incentives: Offer existing customers a transition period, e.g., maintain their current plan for X months, or offer a discounted migration to the most suitable new tier.

* Dedicated FAQ & Support: Provide a comprehensive FAQ page and dedicated support channels for questions.

  • New Customers:

* Clearly present the new pricing on the website, emphasizing the value and benefits of each tier.

* Provide a pricing calculator if applicable for usage-based components.

6.3 Migration Plan for Existing Customers

  1. Identify Current Plans: Map all existing customers to their current plans and usage patterns.
  2. Tier Mapping: Recommend the most suitable new tier for each existing customer based on their historical usage and current feature set.
  3. Grandfathering Option: Offer existing customers the option to remain on their current plan (if financially viable) for a limited period (e.g., 6-12 months) before requiring migration. This reduces churn risk.
  4. Incentivized Migration: For customers encouraged to move to a new tier, offer incentives like:

* A discount on their first 3-6 months of the new plan.

* Bonus "Compute Units" for a period.

* Free access to a premium feature for a limited time.

  1. Automated & Manual Outreach: Automate the migration process where possible, but ensure personal outreach for high-value or complex accounts.

7. Key Performance Indicators (KPIs) & Monitoring

Continuous monitoring is crucial for optimizing the pricing strategy.

7.1 Essential KPIs

  • Average Revenue Per User (ARPU) / Per Account (ARPA): Track revenue generated per customer.
  • Customer Acquisition Cost (CAC): Monitor the cost to acquire new customers under the new pricing.
  • Customer Lifetime Value (CLTV): Assess the long-term value of customers.
  • Churn Rate: Monitor both logo churn (customers leaving) and revenue churn (downgrades).
  • Conversion Rates: Track conversion from free to paid, and between paid tiers.
  • Feature Adoption Rates: Identify which features are driving upgrades or retention.
  • Gross Margin: Ensure profitability across different tiers.
  • Price Elasticity: Understand how changes in price affect demand.
  • Usage Patterns: Monitor "Compute Unit" consumption and overage generation across tiers.

7.2 Monitoring Cadence

  • Weekly: Review immediate sales, conversion, and support ticket trends post-launch.
  • Monthly: Comprehensive review of all KPIs, identify patterns, and plan minor adjustments.
  • Quarterly: Strategic review, competitive landscape updates, and potential for significant pricing iterations.

8. Next Steps

  1. Validate WTP: Conduct targeted customer interviews and surveys to refine the WTP analysis for your specific AI product.
  2. Detailed Cost Analysis: Map out the exact costs associated with each "Compute Unit" and feature to ensure profitability at proposed price points.
  3. Refine Feature Gating: Review each feature and decide its placement across tiers based on value, cost, and competitive differentiation.
  4. Develop Pricing Page Mockups: Design clear and compelling pricing pages that communicate value effectively.
  5. Internal Alignment: Present this strategy to sales, marketing, product, and finance teams for feedback and buy-in.
  6. Build Tools: Ensure billing systems and internal dashboards are ready to support the new pricing model and track KPIs.

This comprehensive framework provides a robust starting point for developing and implementing a data-driven SaaS pricing strategy for your AI Technology product.

saas_pricing_strategy.md
Download as Markdown
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);}});}