Meta Tag Generator
Run ID: 69c955daa17964d77e86e1382026-03-29SEO
PantheraHive BOS
BOS Dashboard

Meta Tag Generation Report: Optimized Titles, Descriptions, and Open Graph Tags

This report details the generated meta titles, descriptions, and Open Graph (OG) tags for your specified pages. These tags are crucial for improving your website's Search Engine Optimization (SEO), enhancing click-through rates from search results, and optimizing how your content appears when shared on social media platforms.


Understanding the Generated Tags

Before diving into the specifics, here's a brief overview of each tag type and its importance:

* Purpose: Appears as the clickable headline in search engine results (SERPs), browser tabs, and social media shares. It's a primary SEO ranking factor.

* Best Practices: Keep it concise (ideally under 60 characters), include primary keywords, be unique for each page, and reflect the page's content accurately.

* Purpose: A short summary of the page's content, displayed below the title in SERPs. While not a direct ranking factor, a compelling description significantly impacts click-through rates.

* Best Practices: Aim for 150-160 characters, include relevant keywords naturally, provide a clear value proposition, and encourage a click.

* Purpose: These tags control how your web page content is displayed when shared on social media platforms (Facebook, LinkedIn, X/Twitter, etc.). They ensure your links look professional and inviting.

* Key OG Tags Generated:

* og:title: The title of your content as it should appear in the social share.

* og:description: A brief description of the content for social media.

* og:image: The URL of an image that will be displayed with the social share. Crucial for visual appeal.

* og:url: The canonical URL of the page.

* og:type: The type of content (e.g., website, article, product).

* og:site_name: The name of your website.

* Best Practices: Use high-quality, relevant images (recommended aspect ratio often 1.91:1, e.g., 1200x630 pixels), ensure titles and descriptions are engaging for a social audience, and verify image URLs are absolute.


Generated Meta Tags for Your Pages

We have generated optimized meta tags for a diverse set of pages based on common website structures. Please review and adapt these examples to your specific content and target keywords.


Page 1: Homepage

Hypothetical Page Context: The main landing page for "EcoBloom – Sustainable Home & Garden Essentials," focusing on overall brand message and key offerings.

html • 872 chars
    <meta property="og:title" content="5 Tips for Starting Your Urban Garden">
    <meta property="og:description" content="Transform your small space into a green oasis! Get expert advice on starting your urban garden with EcoBloom's top 5 tips.">
    <meta property="og:image" content="https://www.ecobloom.com/blog/images/og-urban-garden-tips.jpg">
    <meta property="og:url" content="https://www.ecobloom.com/blog/urban-garden-tips">
    <meta property="og:type" content="article">
    <meta property="og:site_name" content="EcoBloom">
    <meta property="article:published_time" content="2023-10-27T10:00:00+00:00">
    <meta property="article:author" content="https://www.ecobloom.com/authors/jane-doe">
    <meta property="article:section" content="Gardening">
    <meta property="article:tag" content="urban gardening, small space gardening, gardening tips">
    
Sandboxed live preview
  • Rationale: og:type is article. Includes additional article: specific OG tags for richer sharing, such as publish date, author, section, and tags. Image should be compelling and relevant to urban gardening.

How to Use This Output

  1. Review and Customize: While these are optimized examples, we strongly recommend reviewing each tag for accuracy, brand voice, and specific keyword targets unique to your content.
  2. Implementation: Copy the provided HTML snippets directly into the <head> section of the respective pages on your website. Ensure they are placed before the closing </head> tag.
  3. Image Paths: Update all og:image URLs to point to the correct, absolute paths of your chosen images.
  4. Testing: After implementation, use tools like Facebook's Sharing Debugger, LinkedIn's Post Inspector, or X/Twitter's Card Validator to preview how your content will appear when shared and to ensure all OG tags are correctly parsed.
  5. Monitor Performance: Keep an eye on your SEO performance (e.g., click-through rates, rankings) and social media engagement to further refine these tags over time.

Next Steps

This concludes Step 1: gemini -> generate. The next step in the "Meta Tag Generator" workflow will involve:

Step 2: user_review -> finalize

  • You will have the opportunity to review these generated tags, make any necessary adjustments, and confirm their final version for implementation.

Please let us know if you have any questions or require further adjustments to these generated meta tags.

gemini Output

Deliverable: Optimized Meta Tags Generation Framework

This document outlines the framework and best practices for generating optimized Meta Titles, Meta Descriptions, and Open Graph (OG) tags for your web pages. As part of Step 2 of 2 in the "Meta Tag Generator" workflow, this deliverable provides the structure, principles, and examples for highly effective SEO and social sharing tags.

Please Note: To generate the specific and customized meta tags for your actual pages, we require details about each page's content, target keywords, and overall business context. This document serves as a comprehensive guide and an example of the output you can expect once that information is provided.


1. Introduction: The Importance of Optimized Meta Tags

Meta tags are crucial for your website's visibility and performance. They serve two primary purposes:

  • Search Engine Optimization (SEO): Meta Titles and Descriptions are often displayed in search engine results pages (SERPs), influencing click-through rates (CTR) and helping search engines understand your page's content.
  • Social Media Engagement: Open Graph (OG) tags control how your content appears when shared on social media platforms (Facebook, LinkedIn, etc.), significantly impacting visibility, branding, and engagement.

Our goal is to craft tags that are:

  • Keyword-rich: To improve search visibility.
  • Compelling: To encourage clicks from SERPs and social feeds.
  • Concise: To adhere to character limits across platforms.
  • Brand-consistent: To reinforce your brand identity.

2. Meta Tag Generation Framework & Examples

Below is a structured framework demonstrating how we will generate meta tags for various types of pages. We will use a hypothetical example of an "Artisanal Coffee Roaster" to illustrate the concepts.

2.1. Global Best Practices for All Tags

  • Target Keywords: Integrate primary and secondary keywords naturally.
  • Unique Content: Each page should have unique meta tags.
  • Call to Action (CTA): Where appropriate, include a subtle CTA (e.g., "Shop Now," "Learn More," "Discover").
  • Brand Name: Include your brand name (e.g., | Meridian Solutions) in the Meta Title for consistency and recognition.

2.2. Page Type: Homepage

The homepage is your digital storefront. Its meta tags should reflect your core offering and brand identity.

  • Meta Title:

* Structure: Primary Keyword | Secondary Keyword | Brand Name

* Character Limit: ~50-60 characters (pixels, not characters, is the true limit, but 60 is a safe estimate)

* Example: Artisanal Coffee Roaster | Ethically Sourced Beans | Meridian Solutions

* Rationale: Clearly states the core business, highlights a key differentiator, and includes brand.

  • Meta Description:

* Structure: Compelling summary of your business, unique selling propositions (USPs), and a soft CTA.

* Character Limit: ~150-160 characters

* Example: Discover premium, ethically sourced coffee beans roasted in small batches for exceptional flavor. Explore our unique blends and single origins. Shop now!

* Rationale: Provides a clear overview, emphasizes quality and ethics, and includes a call to action.

  • Open Graph (OG) Tags:

* og:title: (Often same as Meta Title, but can be slightly more engaging for social)

* Example: Artisanal Coffee Roaster: Ethically Sourced & Freshly Roasted | Meridian Solutions

* og:description: (Often same as Meta Description, or slightly rephrased)

* Example: Experience the rich taste of our ethically sourced, small-batch roasted coffee beans. Your perfect cup starts here. Shop our collection!

* og:image: High-quality, visually appealing image representing your brand/product.

* Example: https://yourdomain.com/images/homepage-hero.jpg

* og:url: Canonical URL of the page.

* Example: https://yourdomain.com/

* og:type: website

* Rationale: Ensures consistent, engaging presentation on social media. The image is critical for social CTR.

2.3. Page Type: Product Page (e.g., "Ethiopian Yirgacheffe")

Product pages require highly specific and descriptive tags to attract buyers.

  • Meta Title:

* Structure: Product Name | Key Feature/Benefit | Category | Brand Name

* Example: Ethiopian Yirgacheffe Coffee Beans | Light Roast | Single Origin | Meridian Solutions

  • Meta Description:

* Structure: Describe the product's unique characteristics, benefits, and a strong CTA.

* Example: Experience the vibrant, floral notes of our single-origin Ethiopian Yirgacheffe. Ethically sourced, light roast, perfect for pour-over. Buy now!

  • Open Graph (OG) Tags:

* og:title: Ethiopian Yirgacheffe Coffee Beans - Light Roast | Meridian Solutions

* og:description: Discover our exquisite Ethiopian Yirgacheffe with bright citrus and floral aromas. Get yours today!

* og:image: High-resolution image of the specific product.

* Example: https://yourdomain.com/images/ethiopian-yirgacheffe.jpg

* og:url: https://yourdomain.com/products/ethiopian-yirgacheffe

* og:type: product (or article if it's a product review/blog post about a product)

* product:retailer_item_id: (If applicable for e-commerce platforms)

* product:price:amount: (If applicable)

* product:price:currency: (If applicable)

* Rationale: Detailed product information improves search relevance and social sharing for e-commerce.

2.4. Page Type: Category/Collection Page (e.g., "Single Origin Coffees")

Category pages help users navigate and should be optimized for broader category terms.

  • Meta Title:

* Structure: Category Name | Key Offering | Brand Name

* Example: Single Origin Coffee Beans | Ethically Sourced & Freshly Roasted | Meridian Solutions

  • Meta Description:

* Structure: Overview of the category, variety offered, and a discovery CTA.

* Example: Explore our curated selection of single origin coffee beans, each telling a unique story from its region. Discover your next favorite brew.

  • Open Graph (OG) Tags:

* og:title: Single Origin Coffee Collection | Meridian Solutions

* og:description: Dive into the diverse world of single origin coffees. Find your perfect regional brew.

* og:image: Representative image for the category (e.g., a collage of different beans).

* Example: https://yourdomain.com/images/single-origin-collection.jpg

* og:url: https://yourdomain.com/collections/single-origin

* og:type: website (or article if it's a content-heavy category page)

* Rationale: Helps users and search engines understand the scope of the category.

2.5. Page Type: Blog Post / Article (e.g., "The Art of Pour-Over Coffee")

Blog posts benefit from engaging titles and descriptions that entice readers.

  • Meta Title:

* Structure: Engaging Blog Post Title | Blog Category (Optional) | Brand Name

* Example: The Art of Pour-Over Coffee: A Step-by-Step Guide | Coffee Brewing | Meridian Solutions

  • Meta Description:

* Structure: Hook the reader, summarize the article's value, and include a "Read More" CTA.

* Example: Master the perfect pour-over coffee with our expert guide. Learn techniques, tips, and tricks for a truly exceptional brew at home. Read now!

  • Open Graph (OG) Tags:

* og:title: Master The Art of Pour-Over Coffee with Our Expert Guide

* og:description: Unlock the secrets to brewing the perfect pour-over. Dive into our detailed guide and elevate your coffee game.

* og:image: Featured image for the blog post, visually representing the content.

* Example: https://yourdomain.com/blog/images/pour-over-guide.jpg

* og:url: https://yourdomain.com/blog/art-of-pour-over-coffee

* og:type: article

* article:author: (Optional) Author's name or profile URL.

* article:published_time: (Optional) Publication date.

* Rationale: Optimizes for content consumption and sharing, driving traffic to valuable information.

2.6. Page Type: Contact Us / About Us

These pages build trust and facilitate communication.

  • Meta Title:

* Structure: Page Name | Brand Name | Key Action (e.g., "Get in Touch")

* Example: Contact Us | Meridian Solutions | Get in Touch

  • Meta Description:

* Structure: Briefly explain the page's purpose and what users can do.

* Example: Have questions about our artisanal coffee or your order? Contact the Meridian Solutions team today. We're here to help!

  • Open Graph (OG) Tags:

* og:title: Contact Meridian Solutions - We're Here to Help!

* og:description: Reach out to our friendly team for any inquiries about our coffee or services.

* og:image: Branded image, team photo, or logo.

* Example: https://yourdomain.com/images/contact-us.jpg

* og:url: https://yourdomain.com/contact

* og:type: website

* Rationale: Clearly communicates purpose and reinforces brand professionalism.


3. Key Optimization Principles

We adhere to the following principles when generating your meta tags:

  • User-Centricity: Tags are crafted to be informative and appealing to human readers first, encouraging clicks.
  • Keyword Integration: Strategic placement of relevant keywords to improve search engine understanding and ranking potential.
  • Character Limits: Strict adherence to recommended character/pixel limits to prevent truncation in SERPs and social feeds.
  • Uniqueness: Every page will have distinct meta titles and descriptions to avoid duplicate content issues and maximize individual page relevance.
  • Brand Consistency: Maintaining your brand voice, tone, and identity across all generated tags.
  • A/B Testing Readiness: While initial generation provides a strong baseline, we recommend future A/B testing of meta descriptions to further optimize CTR.
  • Dynamic vs. Static Tags: For dynamic content (e.g., user profiles, search results), we can advise on templates for programmatic generation. For most content, static, hand-optimized tags are preferred.

4. Actionable Next Steps for You

To proceed with the actual generation of your optimized meta tags, please provide the following information:

  1. List of Pages: A comprehensive list of URLs for which you need meta tags generated.
  2. Page Content / Brief: For each URL, please provide:

* A brief description of the page's content and purpose.

* The primary and any secondary keywords you wish to target for that page.

Any specific messaging or unique selling propositions (USPs) that must* be included.

  1. Brand Guidelines: Any specific tone of voice, brand values, or mandatory legal disclaimers.
  2. Existing Meta Tags (Optional but helpful): If you have existing meta tags, sharing them can help us understand your current strategy and identify areas for improvement.

Once we receive this information, we will generate the specific meta titles, descriptions, and Open Graph tags tailored to each of your pages, following the framework and principles outlined above.


5. Conclusion

This detailed framework ensures that your website's meta tags are not only technically correct but also strategically optimized for maximum impact on search engines and social media. We are ready to transform this framework into concrete, high-performing tags for your specific pages.

meta_tag_generator.html
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);}});}