pSEO Template Designer
Run ID: 69c94f2ca17964d77e86d8f82026-03-29SEO
PantheraHive BOS
BOS Dashboard

Design programmatic SEO page templates with dynamic variables, schema markup, and content patterns.

Programmatic SEO Template Design: Comprehensive Blueprint

This deliverable outlines a detailed and actionable blueprint for designing programmatic SEO (pSEO) page templates. The goal is to create scalable, high-quality landing pages that leverage dynamic variables, robust content patterns, and integrated schema markup to capture long-tail search demand efficiently.

1. Introduction to Programmatic SEO Template Design

Programmatic SEO involves generating thousands or even millions of unique, high-quality web pages based on structured data. Instead of manually creating each page, we design a single template that dynamically populates content, meta information, and structured data using predefined variables. This approach ensures consistency, scalability, and SEO effectiveness across a vast number of related search queries.

This blueprint covers the core components necessary to build such a template, focusing on a structured approach that maximizes search engine visibility and user experience.

2. Core Principles of Effective pSEO Templates

Before diving into the specifics, it's crucial to understand the guiding principles:

  • Scalability: The template must be able to generate unique, valuable content for hundreds or thousands of variable combinations without manual intervention.
  • Uniqueness & Value: Each generated page, despite sharing a template, must offer distinct value and sufficiently unique content to avoid "thin content" penalties and rank effectively.
  • User Experience (UX): Pages must be easy to read, navigate, and provide clear answers to user queries.
  • SEO Optimization: Every element, from meta tags to headings to internal links, must be optimized for relevant keywords and search intent.
  • Data Dependency: The success of pSEO hinges on high-quality, comprehensive, and well-structured data to populate the dynamic variables.

3. Template Design Components

3.1. Template Goal & Target Audience

Every pSEO template should serve a specific purpose and target a defined audience. This clarity informs variable selection, content tone, and call-to-action (CTA).

  • Example Use Cases:

* "Best [Product/Service] in [Location]": E.g., "Best Plumbers in Austin TX", "Best CRM Software for Small Business"

* "[Product/Service] Reviews": E.g., "iPhone 15 Pro Max Review", "Salesforce vs. HubSpot Comparison"

* "How to [Task] with [Tool]": E.g., "How to Integrate Shopify with Mailchimp", "How to Fix a Leaky Faucet"

* "[Product/Service] Pricing": E.g., "Solar Panel Installation Cost in California", "SaaS Pricing Tiers"

3.2. Dynamic Variables & Data Model

This is the backbone of any pSEO effort. Variables are placeholders in the template that will be replaced by specific data points from your dataset.

  • Key Variable Categories:

* Primary Keyword Variables:

* {{main_keyword}}: The central topic (e.g., "plumbers", "CRM software").

* {{product_name}}: Specific product (e.g., "iPhone 15 Pro Max").

* {{service_type}}: Type of service (e.g., "HVAC repair", "web design").

* Geographic Variables (for local pSEO):

* {{city}}: E.g., "Austin".

* {{state}}: E.g., "TX".

* {{region}}: E.g., "Central Texas".

* {{zip_code}}: E.g., "78704".

* {{nearby_cities}}: A list of 3-5 related cities for internal linking.

* Descriptive Variables:

* {{feature_1}}, {{feature_2}}, {{feature_n}}: Specific attributes or functionalities.

* {{benefit_1}}, {{benefit_2}}, {{benefit_n}}: Advantages for the user.

* {{unique_selling_proposition}}: A concise statement of what makes the offering special.

* {{problem_solved}}: The pain point the product/service addresses.

* Quantitative Variables:

* {{price_range}}: E.g., "$100 - $300".

* {{average_rating}}: E.g., "4.8/5 stars".

* {{number_of_reviews}}: E.g., "150+ reviews".

* {{years_in_business}}: E.g., "10 years".

* Call-to-Action (CTA) Variables:

* {{cta_text}}: E.g., "Get a Free Quote", "Download Now".

* {{cta_link}}: The URL for the CTA.

* Image/Media Variables:

* {{hero_image_url}}, {{hero_image_alt_text}}

* {{product_gallery_urls}}

* Supplier/Provider Specifics (if applicable):

* {{company_name}}, {{company_phone}}, {{company_address}}

  • Data Model Considerations:

* Source: Identify your primary data source (e.g., internal database, API, Google Sheets, web scraping).

* Structure: Ensure data is clean, consistent, and structured (e.g., JSON, CSV) to map directly to your variables.

* Completeness: Missing data for key variables can lead to broken or thin pages. Implement fallback logic (e.g., "N/A", default text).

3.3. Page Structure & Content Patterns

The template defines the layout and content flow, ensuring each dynamically generated page is well-structured and engaging.

  • 3.3.1. Meta Information (Critical for SERP Display)

* Title Tag (<title>):

* Pattern: {{main_keyword}} Services in {{city}}, {{state}} | {{Company Name}}

* Example: "Best Plumbers in Austin, TX | Acme Plumbing"

* Meta Description (<meta name="description">):

* Pattern: Find reliable {{main_keyword}} services in {{city}}, {{state}}. Get expert help, read reviews, and request a free quote today.

* Example: "Find reliable plumbing services in Austin, TX. Get expert help, read reviews, and request a free quote today."

* Canonical Tag (<link rel="canonical">):

* Always point to the canonical version of the dynamically generated URL to prevent duplicate content issues.

  • 3.3.2. Page Body Structure

* H1 Header:

* Pattern: The Best {{main_keyword}} Services in {{city}}, {{state}}

* Example: "The Best Plumbing Services in Austin, TX"

Guideline:* Should closely mirror the title tag and be unique per page.

* Hero Section:

* Purpose: Immediately engage the user and confirm they've landed on the right page.

* Content:

* Introductory Paragraph: Looking for top-rated {{main_keyword}} in {{city}}, {{state}}? Our guide helps you connect with trusted professionals offering comprehensive {{service_type}} solutions.

* Key Value Proposition/Summary: With an average rating of {{average_rating}} from {{number_of_reviews}} satisfied customers, we're your go-to source for reliable {{main_keyword}} expertise.

* Primary CTA: (e.g., "Get a Free Quote for {{service_type}} in {{city}}")

* Hero Image/Video: Dynamically linked {{hero_image_url}} with descriptive {{hero_image_alt_text}}.

* Main Content Body (Structured with H2s, H3s):

* H2: Why Choose [Our/Top] {{main_keyword}} in {{city}}?

* Content Pattern:

* Paragraph: Elaborate on the benefits of choosing local, quality services.

* Bullet Points (Leveraging {{feature_n}}, {{benefit_n}}):

* Expert {{feature_1}} services for your home or business.

* Fast, reliable, and affordable {{feature_2}} solutions.

* Transparent pricing with no hidden fees ({{price_range}}).

* Locally owned and operated, serving {{city}} and surrounding areas.

* H2: Our Comprehensive {{service_type}} Offerings

* Content Pattern: Detail the specific services.

* H3: {{specific_service_1}} in {{city}}

* Paragraph: Describe the service and its benefits, using {{city}} and {{service_type}} where natural.

* H3: {{specific_service_2}} for {{problem_solved}}

* Paragraph: Further detail.

Guideline:* Use 3-5 distinct sub-services or features, each with a brief description.

* H2: How to Get Started with {{main_keyword}} in {{city}}

* Content Pattern: Simple, numbered steps.

* Numbered List:

1. Step 1: Request a Quote. Fill out our quick form to tell us about your {{problem_solved}} needs in {{city}}.

2. Step 2: Connect with Experts. Receive personalized recommendations from top-rated {{main_keyword}} professionals.

3. Step 3: Get Your {{service_type}} Done. Enjoy peace of mind with quality service.

* H2: Client Testimonials & Success Stories in {{city}}

* Content Pattern: Embed dynamic testimonials.

* Testimonial Block (repeatable):

* "{{testimonial_quote}}" - {{customer_name}}, {{customer_city}}

Guideline:* Display 2-3 testimonials relevant to the current page's {{city}} or {{service_type}}.

* H2: Frequently Asked Questions (FAQs) about {{service_type}}

* Content Pattern: Address common queries directly.

* FAQ Item (repeatable):

* Q: {{faq_question_1}}?

* A: {{faq_answer_1}}

Guideline:* Include 3-5 relevant FAQs, using variables where appropriate (e.g., "What is the average cost of {{service_type}} in {{city}}?").

* Secondary CTA Block:

* Purpose: Reiterate the call to action before the footer.

* Content: Ready to find the best {{main_keyword}} for your needs in {{city}}? {{cta_text}} today!

* Related Content / Internal Linking Section:

* Purpose: Improve site navigation, pass link equity, and suggest relevant content.

* Content:

* Explore {{service_type}} in Nearby Cities:

* Link 1: {{service_type}} in {{nearby_city_1}}

* Link 2: {{service_type}} in {{nearby_city_2}}

* ... (up to 5 links)

* Related {{service_type}} Guides:

* Link to broader category pages or informational articles.

* Footer: Standard site-wide footer with navigation, contact info, copyright.

3.4. Schema Markup Integration

Structured data (Schema.org markup) helps search engines understand the content on your page, potentially leading to rich snippets in search results.

  • Recommended Schema Types for pSEO Templates:

*WebPage

gemini Output

Programmatic SEO Page Template Design: Comprehensive Deliverable

This document outlines a comprehensive design for a programmatic SEO (pSEO) page template, integrating dynamic variables, structured content patterns, and essential schema markup. This template is designed for scalability, allowing you to generate thousands of unique, SEO-optimized pages from a single data source.


1. Introduction: The Power of Programmatic Templates

Programmatic SEO leverages data to automatically generate content for specific long-tail keywords or niche topics. A well-designed pSEO template serves as the blueprint, ensuring consistency, quality, and SEO effectiveness across all generated pages. This deliverable provides a detailed framework for such a template, focusing on a typical service-based or location-based content strategy (e.g., "Best [Service] in [City]").


2. Core Template Components & Structure

The pSEO template will follow a standard web page structure, ensuring all critical SEO and user experience elements are present and dynamically populated.

  • HTML Structure: Semantic HTML5 (<header>, <main>, <section>, <footer>, etc.)
  • CSS Styling: (Assumed external stylesheet, not part of this template design, but considered for rendering)
  • Key Sections:

* Header: Logo, Navigation (static or dynamically generated for key categories)

* Hero Section: H1, compelling intro, primary CTA

* Body Content Sections: Detailed information, benefits, features, FAQs, sub-services, testimonials

* Secondary CTAs: Integrated throughout content

* Footer: Contact info, navigation, legal links (static)

  • Dynamic Elements: All content marked with {{variable_name}} will be replaced by data.

3. Dynamic Variable Definition & Usage

Dynamic variables are the backbone of programmatic content. They act as placeholders that will be populated from your data source (e.g., a spreadsheet, database, or API).

3.1. Variable Naming Convention

  • Use clear, descriptive names (e.g., {{city}}, {{service_type}}, {{business_name}}).
  • Consistency is key across your data source and template.

3.2. Essential Dynamic Variables (Example for "Service in City" model)

| Variable Name | Description | Example Data |

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

| {{service_type}} | The primary service offered. | Plumbing Services |

| {{city}} | The target city/location. | Austin |

| {{state}} | The state for location context. | Texas |

| {{business_name}} | Your company's name. | Panthera Plumbing |

| {{phone_number}} | Primary contact phone number. | (512) 555-1234 |

| {{email_address}} | Primary contact email. | info@pantheraplumbing.com |

| {{address_street}} | Street address of the business. | 123 Main St |

| {{address_zip}} | Zip code of the business. | 78701 |

| {{usp_1}}, {{usp_2}} | Unique Selling Propositions/Key Benefits. | 24/7 Emergency Service, Certified Technicians |

| {{service_desc_short}} | A concise description of the service. | Expert plumbing solutions for homes and businesses. |

| {{service_desc_long}} | A more detailed description. | From leaky faucets to full pipe replacements... |

| {{price_range}} | Indicative price range for the service. | Starts at $99 |

| {{cta_text}} | Text for the primary Call-to-Action. | Get a Free Quote |

| {{cta_link}} | URL for the primary Call-to-Action. | /contact-us/ |

| {{faq_q1}}, {{faq_a1}} | Question and Answer for FAQ section. | How much does plumbing cost?, Depends on the service... |

| {{nearby_area_1}}, {{nearby_area_2}} | Nearby cities/areas for local SEO context. | Round Rock, Cedar Park |

| {{image_url_1}} | URL for a relevant image. | /img/plumbing-austin.jpg |

| {{image_alt_1}} | Alt text for the image. | Emergency plumbing service in Austin |


4. Content Patterns & Generation Logic

This section details how content blocks will be structured and populated using dynamic variables, ensuring both readability and SEO value.

4.1. Page Title (<title>)

  • Pattern: {{service_type}} in {{city}}, {{state}} | {{business_name}}
  • Example: Plumbing Services in Austin, Texas | Panthera Plumbing
  • Logic: Combines primary keyword (service + location) with brand name.

4.2. Meta Description (<meta name="description">)

  • Pattern: Get expert {{service_type}} in {{city}}, {{state}}. We offer {{usp_1}} and {{usp_2}}. Contact {{business_name}} for a free quote today! {{phone_number}}
  • Example: Get expert Plumbing Services in Austin, Texas. We offer 24/7 Emergency Service and Certified Technicians. Contact Panthera Plumbing for a free quote today! (512) 555-1234
  • Logic: Includes keyword, benefits, CTA, and contact info (optional).

4.3. Main Heading (<h1>)

  • Pattern: Expert {{service_type}} in {{city}}, {{state}}
  • Example: Expert Plumbing Services in Austin, Texas
  • Logic: Directly targets the primary keyword.

4.4. Introduction Paragraph

  • Pattern: Looking for reliable {{service_type}} in {{city}}, {{state}}? {{business_name}} offers top-notch {{service_type}} solutions tailored to your needs. With {{usp_1}} and {{usp_2}}, we are your trusted local experts.
  • Example: Looking for reliable Plumbing Services in Austin, Texas? Panthera Plumbing offers top-notch plumbing solutions tailored to your needs. With 24/7 Emergency Service and Certified Technicians, we are your trusted local experts.
  • Logic: Engages the user, introduces the service and business, highlights key benefits.

4.5. Sub-Heading (<h2>) - Benefits/Features

  • Pattern: Why Choose {{business_name}} for Your {{service_type}} Needs in {{city}}?
  • Example: Why Choose Panthera Plumbing for Your Plumbing Services Needs in Austin?
  • Logic: Reinforces location and service, prompts user to consider benefits.

4.6. Body Paragraph (Benefits/Details)

  • Pattern: At {{business_name}}, we understand the importance of reliable {{service_type}}. Our team of professionals in {{city}} is dedicated to providing exceptional service, from {{service_desc_long}}. We pride ourselves on {{usp_1}} and delivering lasting solutions.
  • Example: At Panthera Plumbing, we understand the importance of reliable Plumbing Services. Our team of professionals in Austin is dedicated to providing exceptional service, from leaky faucets to full pipe replacements. We pride ourselves on 24/7 Emergency Service and delivering lasting solutions.
  • Logic: Expands on the service, reinforces location, integrates more details and USPs.

4.7. Service List / Key Features (<ul>)

  • Pattern:

* <h3>Our {{service_type}} Solutions Include:</h3>

* <ul>

* <li>{{sub_service_1}}</li>

* <li>{{sub_service_2}}</li>

* <li>{{sub_service_3}}</li>

* </ul>

  • Example:

* <h3>Our Plumbing Services Solutions Include:</h3>

* <ul>

* <li>Drain Cleaning</li>

* <li>Water Heater Repair</li>

* <li>Leak Detection</li>

* </ul>

  • Logic: Provides scannable details, allows for dynamic population of specific offerings.

4.8. Call-to-Action (CTA) Section

  • Pattern:

* <h2>Ready for Expert {{service_type}} in {{city}}?</h2>

* <p>Contact {{business_name}} today for a free consultation or immediate service.</p>

* <a href="{{cta_link}}" class="button">{{cta_text}}</a>

* <p>Call us directly: <a href="tel:{{phone_number}}">{{phone_number}}</a></p>

  • Example:

* <h2>Ready for Expert Plumbing Services in Austin?</h2>

* <p>Contact Panthera Plumbing today for a free consultation or immediate service.</p>

* <a href="/contact-us/" class="button">Get a Free Quote</a>

* <p>Call us directly: <a href="tel:(512) 555-1234">(512) 555-1234</a></p>

  • Logic: Clear, prominent CTA with dynamic text and link, includes phone number for immediate contact.

4.9. Frequently Asked Questions (FAQ) Section

  • Pattern:

* <h3>Common Questions About {{service_type}} in {{city}}</h3>

* <div class="faq-item">

* <h4>{{faq_q1}}</h4>

* <p>{{faq_a1}}</p>

* </div>

* <div class="faq-item">

* <h4>{{faq_q2}}</h4>

* <p>{{faq_a2}}</p>

* </div>

  • Logic: Addresses common user queries, provides rich content, and is ideal for FAQPage schema.

5. Schema Markup Integration

Structured data (Schema.org markup) helps search engines understand the content and context of your pages, improving visibility in rich results.

5.1. LocalBusiness Schema (JSON-LD)

  • Purpose: For local businesses offering services in a specific area.
  • Placement: In the <head> or <body> of the HTML.
  • Pattern:

    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "LocalBusiness",
      "name": "{{business_name}}",
      "image": "{{business_logo_url}}",
      "url": "https://yourwebsite.com/{{city_slug}}/{{service_slug}}/",
      "telephone": "{{phone_number}}",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "{{address_street}}",
        "addressLocality": "{{city}}",
        "addressRegion": "{{state}}",
        "postalCode": "{{address_zip}}",
        "addressCountry": "US"
      },
      "geo": {
        "@type": "GeoCoordinates",
        "latitude": "{{latitude}}",
        "longitude": "{{longitude}}"
      },
      "priceRange": "{{price_range}}",
      "openingHoursSpecification": [
        {
          "@type": "OpeningHoursSpecification",
          "dayOfWeek": [
            "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
          ],
          "opens": "09:00",
          "closes": "17:00"
        },
        {
          "@type": "OpeningHoursSpecification",
          "dayOfWeek": [
            "Saturday", "Sunday"
          ],
          "opens": "09:00",
          "closes": "12:00"

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);}});}