Disaster Recovery Plan
Run ID: 69cacea9eff1ba2b79624fe72026-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.

Please note: There appears to be a minor discrepancy in the prompt. While the workflow and description clearly indicate generating a "Disaster Recovery Plan," the final sentence of your instruction requests a "Marketing Strategy." Given the explicit workflow context and "User Input" for "Disaster Recovery Plan," I will proceed with generating a comprehensive Disaster Recovery Plan. If a Marketing Strategy is indeed required, please clarify.


Disaster Recovery Plan: Comprehensive Framework

This document outlines a comprehensive Disaster Recovery Plan (DRP) designed to ensure the swift recovery of critical IT systems and data following a disruptive event. Its purpose is to minimize downtime, prevent data loss, and maintain business continuity, adhering to defined Recovery Time Objectives (RTOs) and Recovery Point Objectives (RPOs).

1. Introduction and Purpose

1.1 Goal

The primary goal of this Disaster Recovery Plan is to provide a structured, actionable framework for responding to and recovering from significant disruptions that impact critical business operations and IT infrastructure. This plan aims to:

  • Minimize the duration of service interruptions.
  • Protect critical data and information assets.
  • Restore operations to an acceptable level within predefined RTOs and RPOs.
  • Ensure the safety of personnel during and after an incident.
  • Maintain stakeholder confidence and regulatory compliance.

1.2 Scope

This DRP covers all critical IT systems, applications, data, and associated infrastructure deemed essential for the continuous operation of the business. This includes, but is not limited to:

  • Core application servers (e.g., ERP, CRM, custom applications)
  • Database servers
  • Networking infrastructure (routers, switches, firewalls)
  • Storage systems (SAN, NAS)
  • Virtualization platforms
  • Email and communication systems
  • End-user computing environments (as applicable)
  • Key third-party services and integrations

2. Key Definitions

  • Disaster: A sudden, unforeseen event that causes significant disruption to business operations, requiring activation of the DRP. Examples include natural disasters, major power outages, cyberattacks, or widespread hardware failures.
  • Incident: A single or series of events that may or may not escalate to a disaster but requires immediate attention and response.
  • Recovery Time Objective (RTO): The maximum acceptable duration of time for a business process or system to be restored after a disaster or outage to avoid unacceptable consequences associated with a break in business continuity.
  • Recovery Point Objective (RPO): The maximum acceptable amount of data loss measured in time. It defines the point in time to which data must be recovered (e.g., data up to 1 hour before the disaster).
  • Critical Systems: Systems or applications whose unavailability would significantly impact business operations, revenue, or regulatory compliance.
  • Warm Site: A disaster recovery site that has essential equipment installed and configured, but requires some setup and data restoration before full operation.
  • Hot Site: A fully equipped and configured disaster recovery site that can take over operations with minimal downtime.

3. Risk Assessment Summary

(This section assumes a prior risk assessment has been conducted. A full risk assessment identifies potential threats, vulnerabilities, and their impact.)

Key risks identified include:

  • Natural Disasters: Earthquakes, floods, severe storms, fires.
  • Cyberattacks: Ransomware, denial-of-service (DoS), data breaches.
  • System Failures: Hardware malfunctions, software bugs, power outages.
  • Human Error: Accidental deletions, misconfigurations.
  • Third-Party Failures: Outages from critical vendors or service providers.

Each risk has been evaluated for likelihood and potential impact, informing the RTO/RPO targets and recovery strategies outlined below.

4. Recovery Objectives (RTO/RPO)

Recovery objectives are tiered based on the criticality of systems and data to business operations.

| System/Application Category | Example Systems | RTO (Time to Restore) | RPO (Max Data Loss) |

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

| Tier 0: Mission-Critical | Core ERP, Primary Database, CRM, Payment Gateway | < 4 hours | < 15 minutes |

| Tier 1: Business-Critical | Email System, File Servers, Key Custom Applications | 4-8 hours | < 1 hour |

| Tier 2: Business-Support | Development Environments, Internal Tools, Secondary Websites | 8-24 hours | < 4 hours |

| Tier 3: Non-Critical | Archive Systems, Test Environments | 24-72 hours | < 24 hours |

Note: Specific RTO/RPO values will be finalized for each individual application/system within these tiers.

5. Backup and Data Recovery Strategies

A multi-layered backup strategy ensures data integrity and availability across different scenarios.

5.1 Backup Types and Frequency

  • Full Backups: Weekly for all critical systems and data.
  • Incremental Backups: Daily for all critical systems and data. Captures only changes since the last full or incremental backup.
  • Differential Backups: Not currently utilized, but can be implemented for specific systems where faster restores from recent full backups are preferred over incremental chains.
  • Continuous Data Protection (CDP): For Tier 0 systems, real-time replication or near-CDP solutions will be implemented to achieve minimal RPO.

5.2 Backup Storage Locations

  • On-site Storage: Short-term retention of recent backups for quick recovery from minor incidents. Stored in a fire-resistant, secure location separate from primary IT infrastructure.
  • Off-site Storage: All full and incremental backups are replicated or moved to a secure off-site facility (e.g., a dedicated data center, cloud storage) at least daily. This protects against site-wide disasters.
  • Cloud Storage: Utilize a reputable cloud provider (e.g., AWS S3, Azure Blob Storage) with geo-redundancy for long-term archival and disaster recovery purposes. Data is encrypted in transit and at rest.

5.3 Data Retention Policies

  • Daily Backups: Retained for 30 days.
  • Weekly Full Backups: Retained for 90 days.
  • Monthly Full Backups: Retained for 1 year.
  • Annual Full Backups: Retained for 7 years (or as required by regulatory compliance).

5.4 Encryption and Security

  • All backup data, whether in transit or at rest, must be encrypted using industry-standard encryption protocols (e.g., AES-256).
  • Access to backup systems and storage locations is restricted to authorized personnel only, utilizing strong authentication mechanisms (e.g., MFA).

6. Failover and System Recovery Procedures

These procedures detail the steps to activate the DRP, switch to a recovery site, and restore critical services.

6.1 DRP Activation Criteria

The DRP will be activated by the DRP Coordinator or designated alternate when:

  • A critical system or service is unavailable beyond its defined RTO, and immediate local recovery is not feasible.
  • A major incident (e.g., fire, flood, cyberattack) renders the primary data center or office unusable.
  • Directed by executive management following a significant business disruption.

6.2 Roles and Responsibilities (DRP Team)

  • DRP Coordinator: Overall lead, decision-making authority, communication lead.
  • Infrastructure Recovery Team: Servers, virtualization, storage.
  • Network Recovery Team: Connectivity, firewalls, VPNs.
  • Application Recovery Team: Specific application restoration and configuration.
  • Database Recovery Team: Database restoration, integrity checks.
  • End-User Support Team: Workstation setup, user access.

6.3 Recovery Site Strategy

  • Primary Recovery Site: Warm Site (e.g., secondary data center or cloud region configured with essential infrastructure) for Tier 0 and Tier 1 systems. This site will have pre-provisioned hardware/virtual machines and network connectivity.
  • Secondary Recovery Site: Cloud-based cold site for Tier 2 and Tier 3 systems, where resources are provisioned on-demand.

6.4 General Failover Procedure (Example for a Tier 0 Application)

  1. Assess and Declare Disaster: DRP Coordinator confirms disaster, activates DRP.
  2. Isolate Primary Systems: Disconnect affected primary systems to prevent further compromise or data corruption.
  3. Initiate Recovery Site Activation:

* Power on/provision resources at the recovery site.

* Verify network connectivity to the recovery site.

  1. Restore Data:

* For CDP/Replicated systems: Initiate failover to the replica.

* For Backup-based systems: Restore the latest valid backup to the recovery site infrastructure.

* Perform data integrity checks.

  1. Restore Applications:

* Install/configure applications on the recovered infrastructure.

* Verify application functionality and connectivity to databases.

  1. Update DNS/Routing: Redirect user traffic to the recovery site.
  2. Test and Verify: Conduct comprehensive testing of restored services.
  3. Notify Stakeholders: Inform internal and external parties of recovery status.
  4. Monitor: Continuously monitor recovered systems for performance and stability.
  5. Post-Recovery Review: Conduct a detailed review of the incident and recovery process.

Note: Detailed, step-by-step runbooks for each critical system will be maintained as appendices to this plan.

7. Communication Plan

Effective communication is paramount during a disaster to manage expectations and ensure coordinated efforts.

7.1 Internal Communication

  • Initial Notification: DRP Coordinator notifies DRP team and executive management via predetermined channels (e.g., SMS, dedicated emergency email list, internal communication platform).
  • Regular Updates: Scheduled updates (e.g., hourly, every 4 hours) on status, progress, and next steps to all relevant employees and management.
  • Channels:

* Emergency contact tree

* Dedicated crisis communication platform (e.g., Slack channel, Microsoft Teams)

* Internal status page

* Mass SMS/Email system (if primary email is affected)

7.2 External Communication

  • Customers:

* Method: Public status page, email announcements, social media.

* Content: Acknowledge incident, provide estimated recovery times (if known), confirm data security, apologize for inconvenience.

* Timing: Initial notification within 1 hour of DRP activation, regular updates every 2-4 hours.

  • Vendors/Partners:

* Method: Direct email, phone calls.

* Content: Inform relevant vendors (e.g., ISP, cloud providers, critical software vendors) of the situation and coordinate support.

  • Regulatory Bodies/Legal:

* Method: As required by specific regulations (e.g., GDPR, HIPAA, PCI DSS).

* Content: Provide factual information, steps taken to mitigate, and impact assessment.

  • Media:

* Policy: All media inquiries must be directed to a designated spokesperson (e.g., CEO, Head of Communications). No other personnel are authorized to speak to the media.

* Pre-approved statements: Develop templates for various scenarios.

7.3 Crisis Communication Team

  • Lead: DRP Coordinator / Head of Communications
  • Members: Executive representative, IT representative, Legal counsel.
  • Responsibilities: Crafting messages, approving communications, managing inbound inquiries.

8. Roles and Responsibilities

| Role | Responsibilities |

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

gemini Output

Disaster Recovery Plan

Document Version: 1.0

Date: October 26, 2023

Author: PantheraHive AI

Approved By: [Client Management/DR Committee - To be filled by client]


1. Introduction

This Disaster Recovery Plan (DRP) outlines the procedures and strategies to ensure the rapid recovery of critical IT systems, applications, and data following a disruptive event. The primary objective is to minimize downtime, data loss, and business impact, enabling a swift return to normal operations and maintaining business continuity.

1.1 Purpose

The purpose of this DRP is to:

  • Provide a structured framework for responding to IT-related disasters.
  • Define roles, responsibilities, and communication protocols during a disaster.
  • Detail procedures for the recovery of critical IT infrastructure and applications.
  • Establish clear Recovery Time Objectives (RTOs) and Recovery Point Objectives (RPOs) for essential business functions.
  • Ensure the regular testing and maintenance of disaster recovery capabilities.

1.2 Scope

This DRP covers the recovery of critical IT infrastructure, applications, and data hosted within [Specify primary data center/cloud environment, e.g., On-premise Data Center, AWS us-east-1, Azure West US 2]. It addresses scenarios including, but not limited to:

  • Major hardware failure (servers, storage, network).
  • Data corruption or loss.
  • Environmental disasters (fire, flood, power outage).
  • Cybersecurity incidents (ransomware, major data breach).
  • Regional outages affecting IT services.

1.3 Objectives

Upon the declaration of a disaster, the objectives of this plan are to:

  • Restore critical business services within their defined RTOs.
  • Recover data with minimal loss, adhering to established RPOs.
  • Ensure the safety and well-being of personnel.
  • Maintain essential communication channels with stakeholders.
  • Provide clear guidance to the DR team for effective incident response and recovery.

2. Executive Summary

This Disaster Recovery Plan is a critical component of our overall business continuity strategy. It details a robust approach to safeguarding our digital assets and ensuring operational resilience. Key highlights include aggressive RTO and RPO targets for critical systems, a multi-layered backup strategy leveraging both on-site and off-site cloud storage, comprehensive failover procedures for core applications, a structured communication plan for internal and external stakeholders, and a rigorous testing schedule to validate our recovery capabilities. This plan is designed to minimize disruption and protect our business interests in the face of unforeseen catastrophic events.

3. Assumptions and Dependencies

This plan is based on the following assumptions and dependencies:

  • Personnel Availability: Key DR team members are available and contactable during a disaster.
  • Off-site Data Integrity: Off-site backups and replication are current and restorable.
  • Recovery Site Readiness: The designated recovery site (e.g., cloud environment, secondary data center) is provisioned, maintained, and capable of supporting critical workloads.
  • Vendor Support: Critical vendors (e.g., hardware, software, cloud providers) will provide timely support as per their service level agreements (SLAs).
  • Network Connectivity: Essential network connectivity to the recovery site is available.
  • Security Controls: Existing security measures remain effective to protect recovered systems.

4. Roles and Responsibilities

A dedicated Disaster Recovery Team (DRT) is established with clear roles and responsibilities.

| Role | Primary Responsibility | Contact Info |

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

| DR Coordinator/Incident Commander | Overall command and control; decision-making for DR plan activation/deactivation; external communication approval; resource allocation. | [Name, Title, Phone, Email] |

| IT Infrastructure Lead | Oversees server, storage, and network recovery; manages hardware procurement if necessary; coordinates with vendors. | [Name, Title, Phone, Email] |

| Network & Security Lead | Manages network configuration at the recovery site; restores VPNs, firewalls, and security policies; ensures network connectivity and security. | [Name, Title, Phone, Email] |

| Applications Lead | Coordinates application-specific recovery, testing, and data restoration; works with business units to validate application functionality. | [Name, Title, Phone, Email] |

| Database Administrator (DBA) | Manages database restoration, integrity checks, and recovery procedures; ensures data synchronization and consistency. | [Name, Title, Phone, Email] |

| Communications Lead | Manages internal and external communications; drafts and distributes alerts and updates; coordinates with media/PR if required. | [Name, Title, Phone, Email] |

| Business Unit Liaisons | Represent specific business units; provide input on application criticality and testing; validate recovered business functions. | [Name, Title, Phone, Email] (for each B.U.) |

| Executive Sponsor | Provides high-level oversight, strategic guidance, and executive support; authorizes major expenditures or policy deviations if necessary. | [Name, Title, Phone, Email] |

Detailed contact lists for all DR team members, including primary and secondary contacts, are maintained in Appendix A: Contact Lists.

5. Business Impact Analysis (BIA) Summary & Recovery Targets

Based on the latest Business Impact Analysis, the following critical systems and their associated Recovery Time Objectives (RTOs) and Recovery Point Objectives (RPOs) have been identified. These targets represent the maximum tolerable downtime and data loss.

5.1 Critical Systems Inventory & Priority

| System ID | System Name | Description | Business Owner | Priority |

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

| SYS-001 | Core ERP System | Financials, Inventory, Order Processing | Finance, Ops | Critical |

| SYS-002 | Customer CRM Platform | Sales, Customer Support, Marketing | Sales, Support | Critical |

| SYS-003 | E-commerce Platform | Online Sales, Product Catalog | Sales, Marketing | Critical |

| SYS-004 | Database Cluster (Prod) | Primary data store for ERP, CRM, E-commerce | IT | Critical |

| SYS-005 | Email & Collaboration | Internal and external communication, document sharing | All | High |

| SYS-006 | Active Directory / IAM | User authentication and authorization | IT | Critical |

| SYS-007 | File Servers (Prod) | Shared documents, project files | All | High |

| SYS-008 | HRIS System | Employee records, payroll | HR | Medium |

5.2 Recovery Time Objective (RTO) Targets

The maximum acceptable duration for restoring business functions after a disaster.

| System ID | System Name | RTO Target | Justification |

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

| SYS-001 | Core ERP System | 4 hours | Direct impact on revenue, critical operations, financial reporting. |

| SYS-002 | Customer CRM Platform | 4 hours | Customer service disruption, sales pipeline impact. |

| SYS-003 | E-commerce Platform | 2 hours | Immediate revenue loss, brand reputation. |

| SYS-004 | Database Cluster (Prod) | 2 hours | Underpins all critical applications; data integrity paramount. |

| SYS-005 | Email & Collaboration | 8 hours | Internal and external communication essential for coordination. |

| SYS-006 | Active Directory / IAM | 2 hours | No user access to any system without authentication. |

| SYS-007 | File Servers (Prod) | 12 hours | Operational disruption for shared documents, project work. |

| SYS-008 | HRIS System | 24 hours | Payroll processing, employee management; can be handled manually short-term. |

5.3 Recovery Point Objective (RPO) Targets

The maximum acceptable amount of data loss measured in time.

| System ID | System Name | RPO Target | Justification |

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

| SYS-001 | Core ERP System | 15 minutes | Transactions are continuous and highly critical; minimal data loss tolerated. |

| SYS-002 | Customer CRM Platform | 1 hour | Frequent updates to customer interactions; recent data is valuable. |

| SYS-003 | E-commerce Platform | 15 minutes | Real-time orders and inventory updates. |

| SYS-004 | Database Cluster (Prod) | 15 minutes | Data consistency across critical applications. |

| SYS-005 | Email & Collaboration | 4 hours | Less frequent data changes; some data loss can be tolerated. |

| SYS-006 | Active Directory / IAM | 24 hours | User changes are less frequent; can be manually re-entered. |

| SYS-007 | File Servers (Prod) | 4 hours | Document changes; some work can be recreated. |

| SYS-008 | HRIS System | 24 hours | Infrequent changes; manual updates are feasible. |

6. Incident Response and Declaration Procedures

6.1 Incident Detection

Incidents may be detected through various means:

  • Automated monitoring alerts (e.g., system down, high resource utilization, data corruption alerts).
  • User reports of system unavailability or data loss.
  • Physical security alerts or environmental monitoring (e.g., fire alarms, power outages).
  • External notifications (e.g., cloud provider outage, cybersecurity advisories).

6.2 Incident Assessment

Upon detection, the IT Infrastructure Lead or designated on-call personnel will:

  1. Verify the incident: Confirm the nature, scope, and severity of the event.
  2. Estimate Impact: Determine which systems are affected, potential data loss, and estimated downtime.
  3. Assess Business Impact: Consult with Business Unit Liaisons to understand the operational impact.
  4. Initial Remediation: Attempt immediate local recovery if feasible and safe (e.g., rebooting a single server, restoring a recent snapshot).

6.3 DR Plan Activation Criteria

The DR Plan will be activated if any of the following criteria are met:

  • Failure of a critical system (RTO 4 hours or less) that cannot be recovered within 1 hour using standard operational procedures.
  • Data loss exceeding the RPO for any critical system.
  • Primary data center or critical infrastructure becomes unavailable or compromised due to a major event (e.g., fire, flood, prolonged power outage, uncontained cyberattack).
  • The Incident Commander (or Executive Sponsor if IC is unavailable) declares a disaster.
  • Prolonged service disruption impacting a significant number of users or business functions.

6.4 DR Plan Declaration

  1. Notification: The Incident Commander, upon confirming activation criteria, will notify the DR Team via emergency communication channels (e.g., emergency notification system, dedicated conference bridge, SMS alerts).
  2. DR Team Assembly: All DR team members must acknowledge receipt of the notification and join the designated communication channel (e.g., MS Teams bridge, conference call) within 30 minutes of notification.
  3. Initial Briefing: The Incident Commander will provide an initial briefing, outlining the situation, known impacts, and confirming the activation of the DRP.
  4. Go/No-Go Decision: A formal "Go/No-Go" decision will be made by the Incident Commander in consultation with the Executive Sponsor, based on the assessment. "Go" initiates recovery procedures at the DR site.

7. Backup and Data Recovery Strategies

Our strategy focuses on a multi-tiered approach to data protection, ensuring data integrity, availability, and recoverability.

7.1 Data Classification

Data is classified based on its criticality, sensitivity, and RPO/RTO requirements:

  • Critical: Data essential for core business operations (e.g., financial transactions, customer orders). RPO: Minutes to 1 hour.
  • High: Important operational data (e.g., email, project documents). RPO: 4-8 hours.
  • Medium: General business data (e.g., HR records, internal reports). RPO: 12-24 hours.
  • Low: Non-essential data, easily recreatable. RPO: >24 hours.

7.2 Backup Methodologies

  • Databases (SYS-004):

* Full Backups: Daily, off-hours.

* Differential Backups: Hourly.

* Transaction Log Backups: Every 15 minutes (for databases supporting RPO of 15 min).

* Replication: Real-time asynchronous replication to the DR site/cloud region for critical databases.

  • Virtual Machines (VMs) & Applications (SYS-001, SYS-002, SYS-003, SYS-005, SYS-006, SYS-007, SYS-008):

* Full VM Backups: Weekly, off-hours.

* Incremental Backups: Daily.

* Snapshots: Hourly for critical VMs, retained for 24 hours.

  • File Servers (SYS-007):

* Full Backups: Weekly.

* Differential Backups: Daily.

* Shadow Copies/Versioning: Enabled for user self-service recovery.

7.3 Backup Frequencies

| Data Type/System | Full Backup | Differential Backup | Incremental Backup | Transaction Logs/Replication |

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

| Critical Databases | Daily | Hourly | N/A | Every 15 minutes (Replication) |

| Critical Application VMs | Weekly | N/A | Daily | Hourly Snap

gemini Output

Disaster Recovery Plan (DRP)

1. Executive Summary

This document outlines the Disaster Recovery Plan (DRP) for [Your Organization Name]. Its primary purpose is to ensure the rapid and effective restoration of critical IT systems and business operations in the event of a disaster, minimizing downtime and data loss. This plan details RTO/RPO targets, backup strategies, failover procedures, communication protocols, and testing schedules to safeguard business continuity and stakeholder confidence.

2. Scope

This DRP covers all critical IT infrastructure, applications, and data essential for the continuous operation of [Your Organization Name]'s core business functions. This includes, but is not limited to:

  • Primary data centers and cloud environments.
  • Core business applications (e.g., ERP, CRM, financial systems, custom applications).
  • Databases (e.g., SQL, Oracle, NoSQL).
  • Network infrastructure (servers, routers, firewalls, switches).
  • User data and file shares.
  • Communication systems (email, VoIP).

Out-of-scope for this document are comprehensive Business Continuity Plan (BCP) elements such as physical site recovery for non-IT functions, human resource relocation, or supply chain recovery, which are typically addressed in a broader BCP.

3. Key Definitions

  • Disaster Recovery (DR): The process of restoring systems, data, and infrastructure after a disruptive event.
  • Recovery Time Objective (RTO): The maximum tolerable duration of time that a computer system, application, or network can be down after a failure or disaster.
  • Recovery Point Objective (RPO): The maximum tolerable amount of data that can be lost from an IT service due to a major incident. It is expressed as a period of time.
  • Business Continuity Plan (BCP): A comprehensive plan for continuing business operations before, during, and after a significant disruption. DR is a subset of BCP.
  • 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 operations to the original primary system after recovery at the disaster recovery site.

4. Disaster Recovery Objectives

The primary objectives of this DRP are to:

  • Minimize Downtime: Restore critical systems and services within defined RTOs.
  • Minimize Data Loss: Recover data with minimal loss, adhering to defined RPOs.
  • Ensure Data Integrity: Guarantee the consistency and accuracy of recovered data.
  • Maintain Business Operations: Enable the continuation of essential business functions during and after a disaster.
  • Facilitate Rapid Response: Establish clear procedures and responsibilities for effective disaster response.
  • Comply with Regulations: Meet all relevant legal, regulatory, and compliance requirements.
  • Protect Stakeholder Interests: Safeguard customer data, maintain trust, and protect the organization's reputation.

5. Critical Systems and Services with RTO/RPO Targets

Systems and services are categorized by their criticality to business operations. RTO and RPO targets are set accordingly.

| System/Service Category | Examples | RTO (Time) | RPO (Data Loss) | Justification |

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

| Tier 1: Mission Critical | Core ERP, Primary Customer Database, Financial Reporting | 4 hours | 15 minutes | Direct impact on revenue, legal compliance, customer operations. |

| Tier 2: Business Critical | CRM, Email/Communication, HR Systems, Intranet | 8 hours | 1 hour | Significant impact on productivity, internal operations, customer service. |

| Tier 3: Business Support | Development Environments, Secondary File Shares, Test Systems | 24 hours | 4 hours | Moderate impact on specific departments, non-immediate operational needs. |

| Tier 4: Non-Critical | Archive Systems, Non-production environments | 48 hours | 24 hours | Minimal immediate impact on core business functions. |

Note: Specific RTO/RPO values may vary based on individual application requirements and business impact analysis.

6. Backup and Data Recovery Strategy

A multi-layered backup strategy ensures data availability and recoverability for all critical systems.

6.1. Backup Types and Frequency

  • Full Backups: Weekly for all critical systems.
  • Incremental Backups: Daily for all critical systems, capturing changes since the last full or incremental backup.
  • Differential Backups: (Optional, if applicable) Daily for key databases, capturing changes since the last full backup.
  • Database Transaction Logs: Continuously shipped or replicated for Tier 1 systems to achieve near-zero RPO.

6.2. Backup Retention

  • Daily Backups: Retained for 30 days.
  • Weekly Backups: Retained for 90 days.
  • Monthly Backups: Retained for 1 year.
  • Annual Backups: Retained for 7 years (or as per regulatory requirements).

6.3. Backup Storage Locations

  • On-site Storage: Short-term storage for immediate recovery (e.g., local NAS/SAN). Primarily for operational recovery, not disaster recovery.
  • Off-site Storage: Encrypted backups transferred daily to a geographically separate, secure facility or cloud storage provider ([Cloud Provider Name], Region [e.g., US-East-2]).
  • Cloud-based Storage: Utilizes object storage with versioning and immutability features for long-term retention and protection against ransomware.

6.4. Data Encryption

  • All data at rest (on backup media, storage devices) is encrypted using AES-256 encryption.
  • All data in transit (during backup transfer, replication) is encrypted using TLS 1.2 or higher.

6.5. Data Integrity and Verification

  • Regular Backup Verification: At least monthly, random backup sets are restored to isolated test environments to verify data integrity and recoverability.
  • Checksums/Hashing: Implemented during backup processes to ensure data consistency.
  • Monitoring: Backup job success/failure rates are continuously monitored with alerts for any issues.

7. Disaster Recovery Procedures (Failover & Failback)

7.1. Activation Criteria

A disaster will be declared by the DR Coordinator or their designated alternate under any of the following circumstances:

  • Loss of primary data center functionality due to natural disaster, fire, power outage, or significant environmental failure.
  • Major cyber-attack resulting in widespread system compromise or data loss.
  • Prolonged outage of critical systems exceeding defined RTOs, with no immediate prospect of recovery at the primary site.
  • Declaration of emergency by local authorities impacting primary site access or operations.

7.2. Disaster Declaration Process

  1. Detection: Incident detected by monitoring systems or personnel.
  2. Assessment: DR Coordinator and core DR Team assess the scope, impact, and estimated duration of the outage.
  3. Declaration: If activation criteria are met, the DR Coordinator formally declares a disaster and initiates the DRP.
  4. Notification: Internal and external communication plans are activated.

7.3. Roles and Responsibilities (DR Team)

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