Disaster Recovery Plan
Run ID: 69caf8d126e01bf7c6786ee82026-03-30Infrastructure
PantheraHive BOS
BOS Dashboard

Generate a comprehensive disaster recovery plan with RTO/RPO targets, backup strategies, failover procedures, communication plans, and testing schedules.

Disaster Recovery Plan (DRP)

1. Executive Summary

This Disaster Recovery Plan (DRP) outlines the strategies, procedures, and responsibilities required to ensure the rapid recovery and restoration of critical IT systems, applications, and data in the event of a disruptive incident. The primary goal is to minimize downtime, prevent data loss, and maintain business continuity, adhering to defined Recovery Time Objectives (RTOs) and Recovery Point Objectives (RPOs). This plan provides a structured approach to prepare for, respond to, and recover from various disaster scenarios, ensuring the resilience of our operations.

2. Scope

This DRP covers all critical IT infrastructure, applications, and data essential for core business operations. This includes, but is not limited to:

  • Data Centers: Primary and secondary data center facilities.
  • Servers: Physical and virtual servers hosting critical applications and services.
  • Network Infrastructure: Routers, switches, firewalls, VPNs, and internet connectivity.
  • Applications: Enterprise Resource Planning (ERP), Customer Relationship Management (CRM), core business applications, email, collaboration tools, and custom applications.
  • Databases: All production databases, including transactional and analytical systems.
  • Storage Systems: SAN, NAS, and cloud storage solutions.
  • Endpoints: Critical workstations and remote access infrastructure.
  • Cloud Services: All critical services hosted on public or private cloud platforms.

3. Objectives

The key objectives of this Disaster Recovery Plan are to:

  • Minimize Downtime: Achieve recovery within defined RTOs to limit operational disruption.
  • Prevent Data Loss: Ensure data is recoverable within defined RPOs.
  • Ensure Business Continuity: Facilitate the rapid resumption of critical business functions.
  • Protect Assets: Safeguard IT infrastructure, data, and intellectual property.
  • Maintain Compliance: Adhere to regulatory and industry standards for data protection and availability.
  • Provide Clear Guidance: Establish clear roles, responsibilities, and procedures for disaster response and recovery.
  • Facilitate Communication: Ensure timely and accurate communication to all stakeholders during an incident.

4. Key Definitions

  • Disaster Recovery (DR): The process of restoring data, hardware, and applications after a natural or human-induced catastrophe.
  • Business Continuity Plan (BCP): A comprehensive plan for continuing business operations before, during, and after a disaster. DR is a subset of BCP.
  • Recovery Time Objective (RTO): The maximum tolerable duration of time that a computer system, network, or application can be down after a failure or disaster.
  • Recovery Point Objective (RPO): The maximum tolerable amount of data loss, measured in time, that an application or system can sustain after an incident.
  • Failover: The process of switching to a redundant or standby system upon the failure or abnormal termination of the previously active system.
  • Failback: The process of restoring systems to their original primary site after a disaster has been resolved and operations have been sustained at the recovery site.

5. Disaster Recovery Team & Roles

A dedicated Disaster Recovery Team is established with clear roles and responsibilities to manage and execute the DRP.

  • DR Coordinator (Overall Lead):

* Activates the DRP.

* Oversees all recovery efforts.

* Liaises with senior management and external stakeholders.

* Approves critical decisions during recovery.

  • Communication Lead:

* Manages internal and external communications.

* Drafts and disseminates status updates.

* Handles media inquiries (if applicable).

  • Technical Recovery Teams (Specific IT Domains):

* Network Team Lead: Restores network connectivity, firewalls, VPNs.

* Server & Virtualization Team Lead: Restores physical/virtual servers, hypervisors.

* Database Team Lead: Recovers and restores databases, ensures data integrity.

* Application Team Lead: Restores critical applications, performs functional testing.

* Storage Team Lead: Manages data recovery from backups, ensures storage availability.

* Cloud Services Team Lead: Manages recovery of cloud-hosted resources and services.

  • Business Unit Liaisons:

* Represent specific business departments.

* Verify application functionality from a business perspective.

* Communicate business impact and priorities.

6. Recovery Time Objective (RTO) & Recovery Point Objective (RPO) Targets

Systems are categorized based on their criticality to business operations, and corresponding RTO and RPO targets are assigned.

| System Criticality | Description | Example Systems | RTO (Time to Recover) | RPO (Max Data Loss) |

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

| Tier 0: Mission-Critical | Absolute highest priority. Direct impact on revenue/safety. | Core ERP, Primary Transactional Databases, E-commerce Platforms, Critical Security Systems, Customer-Facing APIs. | < 4 hours | < 15 minutes |

| Tier 1: Business-Critical | High priority. Significant operational or financial impact. | CRM, Email/Collaboration (Exchange/O365), File Servers, Key Business Applications, HR/Payroll Systems. | 4-24 hours | 1-4 hours |

| Tier 2: Business-Important | Moderate priority. Operations can continue with manual workarounds temporarily. | Internal Reporting, Development/Test Environments, Secondary Analytics Systems, Intranet. | 24-72 hours | 4-24 hours |

| Tier 3: Non-Critical | Lowest priority. Minimal impact on core business functions. | Non-essential internal tools, Archival Systems, Legacy applications with low usage. | > 72 hours | > 24 hours |

Note: Specific RTO/RPO values for individual applications will be detailed in the respective application recovery runbooks.

7. Backup and Data Recovery Strategy

A multi-layered backup strategy is employed to ensure data integrity and availability.

  • Backup Types:

* Full Backups: Weekly for all critical systems.

* Incremental Backups: Daily for all critical systems, capturing changes since the last backup.

* Differential Backups: Daily/Bi-daily for selected systems, capturing changes since the last full backup.

* Database Transaction Logs: Continuously shipped for Tier 0 databases to ensure near-zero data loss.

  • Backup Frequency and Retention:

* Tier 0: Continuous data protection (CDP) or transactional log shipping, daily full, 7-day retention on-site, 30-day off-site.

* Tier 1: Daily incremental, weekly full. 14-day retention on-site, 90-day off-site. Monthly full for 1 year.

* Tier 2: Weekly full, daily incremental. 7-day retention on-site, 30-day off-site.

* Tier 3: Monthly full. 30-day retention off-site.

  • Backup Locations:

* On-site: Primary backup repository for fast recovery of recent data.

* Off-site: Secure, geographically separate location (e.g., secondary data center, cloud storage) for disaster recovery.

* Cloud Storage: Encrypted and geo-redundant storage (e.g., AWS S3, Azure Blob Storage) for long-term retention and disaster recovery copies.

  • Data Encryption: All data at rest (on backup media) and in transit (during backup transfer) is encrypted using industry-standard protocols (e.g., AES-256).
  • Data Integrity Checks: Regular verification of backup integrity and restorability through automated tools and periodic test restores.
  • Restoration Procedures:

* Detailed runbooks for restoring individual applications, databases, and servers.

* Prioritization of restoration based on RTO/RPO targets.

* Verification steps post-restoration to ensure full functionality.

8. Failover Procedures

The activation and execution of failover procedures are critical for rapid recovery.

  • Activation Criteria:

* Declaration of a disaster by the DR Coordinator.

* Prolonged outage of critical systems at the primary site exceeding RTO thresholds.

* Physical damage to the primary data center.

* Regional disaster impacting the primary site.

  • Failover Strategy:

* Hot Standby/Active-Active: For Tier 0 systems, immediate failover to a continuously synchronized secondary site.

* Warm Standby: For Tier 1 systems, pre-provisioned infrastructure at the secondary site, requiring minimal configuration and data synchronization.

* Cold Standby/Pilot Light: For Tier 2/3 systems, minimal infrastructure at the secondary site, requiring significant setup and data restoration.

  • General Failover Steps:

1. Declare Disaster & Activate DRP: DR Coordinator initiates the plan.

2. Assess Damage & Isolate Primary Site: Prevent further data corruption.

3. Activate Recovery Site Infrastructure: Power on, configure network, security.

4. Restore Data: Restore databases and application data from the most recent valid backup/replica to the recovery site.

5. Restore Applications: Deploy and configure applications on the recovery site infrastructure.

6. Update DNS/Load Balancers: Redirect user traffic to the recovery site.

7. Perform Functional Testing: DR Team and Business Unit Liaisons verify system and application functionality.

8. Monitor Performance: Continuously monitor systems at the recovery site for stability and performance.

  • Failback Procedures:

1. Assess Primary Site: Ensure the primary site is fully restored and stable.

2. Synchronize Data: Replicate data changes from the recovery site back to the primary site.

3. Schedule Failback: Plan for a controlled failback during a low-impact window.

4. Reverse DNS/Load Balancer Changes: Redirect traffic back to the primary site.

5. Verify Primary Site Functionality: Conduct full testing.

6. Deactivate Recovery Site: Power down/de-provision recovery resources.

9. Communication Plan

Effective communication is paramount during a disaster to manage expectations and provide timely information.

  • Internal Communication (DR Team, Employees, Management):

* Initial Notification: DR Coordinator notifies DR team members via dedicated communication channels (e.g., SMS, emergency contact list, dedicated chat group).

* Status Updates: Regular updates (e.g., hourly, every 4 hours) provided to senior management and key stakeholders via email, dedicated communication platform, or conference calls.

* Employee Communication: General updates to all employees regarding operational status and expected recovery times, distributed via company-wide email, intranet, or designated hotline.

  • External Communication (Customers, Vendors, Media, Regulatory Bodies):

* Customer Communication: Proactive updates via dedicated status page, email, or social media, informing them of the incident, impact, and estimated resolution time. Pre-approved templates available.

* Vendor Communication: Notify critical vendors (e.g., ISP, cloud providers, hardware support) to coordinate recovery efforts.

* Media Inquiries: All media inquiries are directed to the Communication Lead or designated spokesperson. Pre-approved press statements are available.

* Regulatory Bodies: Notify relevant regulatory authorities if required by law or compliance standards (e.g., data breach notification).

  • Communication Channels:

* Primary: Dedicated Emergency Notification System (SMS, voice calls), Email (secondary system if primary is down).

* Secondary: Dedicated collaboration platform (e.g., Slack/Teams channel), Company Intranet (if available), Public Status Page.

* Offline: Printed contact lists and DRP documents.

10. Testing and Maintenance Schedule

Regular testing and maintenance are crucial to ensure the DRP remains effective and up-to-date.

  • Types of Tests:

* Tabletop Exercises (Annually): A discussion-based session where the DR team walks through the plan, identifying gaps and validating procedures without actual system changes.

* Simulated Recovery Tests (Bi-Annually): Partial or full simulation of a disaster scenario in an isolated environment, testing specific components like backup restoration or application failover.

* Full Failover Tests (Annually for Tier 0/1, Bi-Annually for Tier 2): Actual failover to the recovery site, including DNS changes and full application functionality testing, followed by a planned failback. This is a disruptive test and requires careful planning.

  • Testing Frequency:

* Tier 0/1 Systems: Full failover test annually. Simulated recovery tests bi-annually.

* Tier 2/3 Systems: Simulated recovery tests annually. Tabletop exercises annually.

* Backup Restoration Tests: Monthly verification of random data sets.

  • Documentation of Test Results:

* Detailed reports for each test, including objectives, scope, participants, steps executed, issues encountered, lessons learned, and recommendations for improvement.

* Actionable items assigned with clear owners and deadlines.

  • Review and Update Process:

* Formal Review (Annually): The entire DRP document is reviewed and updated by the DR team and senior management.

* Ad-hoc Updates: Updates are made whenever there are significant changes to infrastructure, applications, personnel, or business processes.

* All changes are version-controlled and approved by the DR Coordinator.

11. Emergency Contact Information

  • Internal Key Personnel:

* DR Coordinator: [Name, Title, Primary Phone, Secondary Phone, Email]

* Communication Lead: [Name, Title, Primary Phone, Secondary Phone, Email]

* Network Team Lead: [Name, Title, Primary Phone, Secondary Phone, Email]

... (list all core DR team members)...*

  • External Vendors/Partners:

* Internet Service Provider (ISP): [Company Name, Support Number, Account Manager]

* Cloud Provider (e.g., AWS, Azure, GCP): [Support Number, Account ID, Technical Contact]

* Hardware Support (e.g., Dell, HPE, Cisco): [Support Number, Contract ID, Technical Contact]

* Software Vendors (e.g., Microsoft, Oracle, SAP): [Support Number, License ID, Technical Contact]

* Managed Security Service Provider (MSSP): [Support Number, Contact Name]

*

gemini Output

Disaster Recovery Plan for \[Organization Name]

Document Version: 1.0

Date: October 26, 2023

Prepared By: PantheraHive


1. Executive Summary

This Disaster Recovery Plan (DRP) outlines the strategies, procedures, and responsibilities required to ensure the timely and effective recovery of critical IT systems, applications, and data following a disaster or major service disruption. The objective is to minimize downtime, prevent data loss, and maintain business continuity for \[Organization Name]. This plan defines clear Recovery Time Objectives (RTOs) and Recovery Point Objectives (RPOs) for critical assets, details backup strategies, failover procedures, communication protocols, and a comprehensive testing schedule to ensure readiness.

2. Introduction

2.1. Purpose

The primary purpose of this DRP is to provide a structured and actionable framework for responding to and recovering from various disaster scenarios that could impact \[Organization Name]'s operations. This plan aims to:

  • Minimize the impact of disruptions on business operations.
  • Restore critical systems and data within defined RTOs and RPOs.
  • Ensure the safety and well-being of personnel.
  • Maintain stakeholder confidence.
  • Comply with regulatory and contractual obligations.

2.2. Scope

This DRP covers the recovery of critical IT infrastructure, applications, and data essential for the continuous operation of \[Organization Name]. This includes, but is not limited to:

  • Data Centers/Server Rooms: Primary and secondary locations.
  • Key Applications: ERP, CRM, Email, Collaboration Platforms, Financial Systems, Custom Applications (e.g., \[List 3-5 specific applications]).
  • Network Infrastructure: Core routers, switches, firewalls, VPNs.
  • Data: Databases, file shares, user data, application data.
  • Critical Services: Internet connectivity, telephony.

This plan does NOT cover specific physical security protocols or detailed business process recovery beyond the IT infrastructure required to support them.

2.3. Assumptions

  • A designated Disaster Recovery Team (DR Team) is in place and trained.
  • Necessary recovery hardware, software licenses, and network connectivity are available at the recovery site or through cloud providers.
  • Off-site backups are accessible and validated.
  • Key personnel contact information is current and readily available.
  • Management commitment and resources are allocated for DRP implementation and testing.

3. Disaster Recovery Team (DR Team)

The DR Team is responsible for executing this plan. Roles and responsibilities are assigned to ensure a coordinated and efficient response.

3.1. DR Team Roles and Responsibilities

| Role | Primary Contact | Alternate Contact | Key Responsibilities

gemini Output

Disaster Recovery Plan (DRP)

This document outlines the comprehensive Disaster Recovery Plan for [Organization Name], designed to ensure the continuity of critical business operations, minimize downtime, and protect data in the event of a major disruptive incident. This plan provides the framework for responding to, recovering from, and restoring normal operations after a disaster.


1. Introduction and Purpose

The purpose of this Disaster Recovery Plan (DRP) is to provide a structured and actionable framework for [Organization Name] to respond effectively to unforeseen events that disrupt normal business operations. This plan aims to:

  • Minimize Downtime: Reduce the duration of service interruptions for critical systems and applications.
  • Prevent Data Loss: Safeguard critical data assets through robust backup and replication strategies.
  • Ensure Business Continuity: Facilitate the rapid restoration of essential business functions and services.
  • Define Roles and Responsibilities: Clearly assign tasks and responsibilities to key personnel during a disaster.
  • Establish Communication Protocols: Outline how internal and external stakeholders will be informed throughout a crisis.
  • Provide a Roadmap for Recovery: Detail the procedures for recovering and restoring IT infrastructure and services.

This DRP is a living document that will be regularly reviewed, tested, and updated to reflect changes in business operations, technology, and risk profiles.

2. Scope

This Disaster Recovery Plan covers all critical IT infrastructure, applications, data, and associated services essential for [Organization Name]'s core business operations. This includes, but is not limited to:

  • Primary Data Center/Cloud Environments: [Specify locations, e.g., On-premise data center, AWS us-east-1, Azure West US 2].
  • Critical Business Applications: [List examples, e.g., ERP System, CRM, Financial Accounting System, E-commerce Platform].
  • Core Network Infrastructure: Routers, switches, firewalls, VPN services.
  • Server Infrastructure: Physical and virtual servers, operating systems.
  • Database Systems: All production databases.
  • Data Storage: SAN/NAS, object storage.
  • Connectivity: Internet access, WAN links.
  • End-User Computing: Critical workstations, remote access.

Events covered by this DRP include, but are not limited to: natural disasters (e.g., floods, fires, earthquakes), major power outages, widespread hardware failures, critical software failures, cyber-attacks (e.g., ransomware, DDoS), and significant human error.

3. Key Personnel and Roles

A dedicated Disaster Recovery Team (DRT) is established to manage and execute this plan. Roles and responsibilities are clearly defined to ensure a coordinated and effective response.

| Role | Primary Contact | Alternate Contact | Responsibilities

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