Skip to content

Business Continuity Plan

Document owner: James Harcourt, Co-founder
Approved by: Max Taylor, Co-founder
Version: 1.0
Date: 2026-02-10
Next review: 2026-08-10
Classification / Scope: Internal
Applies to: Novatura staff/contractors who build/deploy/maintain client applications.

This BCP should be stored in:

  1. an internal docs repo
  2. 1Password/Sharepoint as PDF
  3. offline copy on Incident Lead’s laptop

This plan defines how we, as a company, maintain the continuity of our services and ensure we can recover our capabilities to deliver and support client work following disruptions. Examples of disruption:

  • Device loss
  • SaaS outage
  • Credential compromise
  • Data loss
  • Supplier outage
  • Corporate identity, access management, and productivity tools (e.g. email, IdP, password managers)
  • Source code repositories and CI/CD pipelines used for service delivery (e.g. GitHub)
  • Infrastructure owned and managed by Novatura (e.g. Cloudflare, VPS)
  • Infrastructure access held or operated by the company on behalf of clients (e.g. AWS accounts, deployment credentials)
  • Client support, incident response, and service communications.
  • Client runtime infrastructure, platforms, and data for which the company has no contractual responsibility to manage, secure, or back up

We outline recovery targets for our delivery capability:

Company wide target to restore ability to develop/deploy/maintain systems as normal (outer bound): 24 hours.

Company wide target for restoring minimum viable service (inner bound): 4 hours.

A minimum viable service includes the ability to communicate with clients, access credentials, access repositories, deploy emergency fixes and restore systems from backups. Feature work, non-urgent maintenance and internal administration and project management tasks may be paused during disruptions until business as usual can be achieved.

AssetRPONotes
Source code repositories4 hoursGitHub availability, with local copies
CI/CD configurations4 hoursGitHub availability, with local copies
Corporate identity & productivity data24 hoursSaaS provider availability and administrative recovery
Password manager24 hoursDependent on 1Password daily backups
Company‑managed VPS infrastructure24 hoursDaily backups and/or snapshots
Company‑managed databases24 hoursBackup frequency dependent
Client infrastructure managed by contractDefined per SOWDocumented per client engagement
Client infrastructure not managed by companyN/AOut of scope

Note: targets may be refined per client contract. TODO: how do we track these refinements?

Business activityImpact if downMax tolerable outageDependencies
Respond to support requestsHigh4 hoursMS365/Email, WhatsApp
Deploy critical fixesHigh4 hoursGitHub, Forge, VPS, secrets, access to client env
Routine feature workMedium24–72 hoursGitHub, local dev env
Internal planning/adminLow72+ hoursMS365, Jira
RoleNameResponsibilityBackup
Incident LeadNiall MorrisonOwns coordination and client commsMax Taylor
DevOps LeadJohn BakerRecovery actions for GitHub, CI/CD, secrets and deploymentsNiall Morrison
Operations/Account LeadJames HarcourtClient updates, prioritisationMax Taylor
ApproverMax TaylorApproves high-risk actions (credential rotation, access revocation)Niall Morrison
Service / AssetPurposeOwnerBackup/Recovery approachRTORPO
GitHub org, repos, CI/CDSource control, PRsJames HarcourtSaaS availability, distributed local clones4 hrs4 hrs
1PasswordSecrets and credentialsMax TaylorBuilt-in admin recovery, offline recovery credentials4 hrs4 hrs
Email/Calendar/MS365Internal commsJohn BakerMicrosoft DR, admin access recovery, alternate comms (WhatsApp)4 hrs24 hrs
CloudflareWeb infrastructure, website deploymentsNiall MorrisonSaaS availability, config-as-code where possible, documented manual rebuilds4 hrs24 hrs
TailscaleZero-trust network accessJohn BakerSaaS availability, re-enrol devices, identify provider recovery4 hrs24 hrs
Laravel ForgeServer and deployment orchestrationJohn BakerSaaS availability, servers can be re-attached/re-deployed8 hrs24 hrs
ExpoToolchain and build orchestrationNiall MorrisonSaaS availability8 hrs24 hrs
VPS Infrastructure (Hetzner, Digital Ocean, Vultr, Fly.io)Application hostingJohn BakerProvider snapshots/backups availability8 hrs24 hrs
S3 Storage (Backblaze)Backups and file storageJohn BakerS3 versioning, retention policies, restricted IAM; restore tested periodically8 hrs24 hrs
Design/collaboration tools (Figma, Excalidraw, Jira)Design and planningJames HarcourtSaaS availability, exports where available4 hrs24 hrs
AssetPrimaryAdditionalBackup ScheduleWho can restore?Retention DurationNotes
Source codeGitHubDistributed local copiesN/AAnyone in orgN/A
Database backupsBackblaze (S3)DailyIncident Lead & DevOps Lead14 daysBackups stored in object storage are protected using versioning, retention, and access controls rather than secondary backup systems.
Secrets1PasswordN/AAnyone with admin recovery credentialsN/ASee Password Manager Recovery

TODO: We are exploring ways to improve S3 backups to align more closely with ISO27001, e.g. immutable backups, encrypted backups, local storage solutions and bucket hardening. In addition to this, we need to plan and schedule a restore testing cadence of a random client DB.

The company uses 1Password with four designated account organisers.

Member accounts can be recovered by an organiser using 1Password’s built‑in recovery process.

Organiser accounts are protected using individual recovery codes. Recovery codes are stored offline in printed form and retained securely. At least one copy is stored separately from day‑to‑day devices.

Loss of access by all organisers would require use of stored recovery codes. Use of recovery material is logged by 1Password.

For internal comms, our primary channel is MS Teams. Our fallback is the internal Novatura WhatsApp group that we use for informal comms, which can be used during MS outages.

During disruptions, status updates should be provided to customers by the Incident Lead and Account Lead with initial notice provided within 4 hours, and then daily until resolved. Use emails as the primary channel, and mobile as a fallback if available.

Dear <CUSTOMER>,
We're writing to let you know about <ONE LINE OUTAGE SUMMARY>.
**What's happening?**
<BRIEF EXPLANATION OF IMPACT>
**What are we doing about it?**
<OUTLINE PLAN FOR REMEDIATION>
We'll keep you updated as the situation progresses.
Thank you for your patience and understanding while we deal with this.
Kind regards,
Dear <CUSTOMER>,
**What happened?**
There was an unexpected outage of the <APP> between <TIMESTAMPS> on <DATE>.
<BRIEF EXPLANATION OF IMPACT>
<BRIEF NON-TECHNICAL EXPLANATION OF CAUSE IF KNOWN>
**What did we do?**
<OUTLINE STEPS TAKEN TO REMEDIATE>
The outage was resolved at <TIMESTAMP> on <DATE>. <DESCRIBE CURRENT SYSTEM STATUS>.
**What are we going to do about it?**
<OUTLINE PLAN FOR CONTINUITY AND FAULT TOLERANCE>
Thank you for your patience and understanding while we dealt with this.
Kind regards,

Use these steps in the following scenarios:

  • Loss/theft of a staff laptop used for client work
  • Suspected compromise of GitHub/CI/password manager/cloud credentials
  • Major SaaS outage (GitHub, MS365, Cloudflare) preventing delivery or support
  • Accidental deletion or corruption of repo/secrets
  • Loss of key personnel (sickness) affecting delivery service

Staff device lost or stolen (phone or laptop)

Section titled “Staff device lost or stolen (phone or laptop)”
  1. Revoke device Office365 sessions using this guide

  2. Unlink sessions in 1Password via this page

  3. Remove device from Tailscale via the console

  4. Revoke device GitHub session using this guide

  5. Revoke device Cloudflare session via this guide

  6. Revoke device Forge session via the profile security settings

  7. Revoke device Expo session via the console

  8. Reset any credentials and rotate tokens as required.

  9. Confirm disk encryption status and exposure risk. Wipe device via this guide

  10. Issue replacement device and try to restore device data from iCloud.

  11. Notify client if risk to client data/credentials is plausible.

  12. Create an incident summary in Sharepoint under Documents/Cybersecurity & Compliance/Incidents.

  1. Freeze: remove org access for suspected accounts. Get someone else to review audit logs during account recovery.

  2. Change password on the primary email address using a non-compromised device (revoke Office365 sessions if necessary).

  3. Attempt the account recovery flow

  4. If this doesn’t work: Open a ticket with GitHub Support from an email you control. Include: your username, primary email(s), approximate account creation date, names of private/public repos, any invoices or payment IDs, and a short timeline of what happened. Mention that the account has been compromised.

  5. Once you regain access:

  6. Immediately rotate GitHub password and set up 2FA again.

  7. Revoke active GitHub sessions using this guide

  8. Revoke unknown SSH keys, Personal Access Tokens, unauthorised OAuth apps.

  9. Disable/rotate GitHub Actions secrets, deploy keys, environment secrets.

  10. Check for newly added Actions workflows and edited branch protection rules.

  11. Check repo access and organisation memberships for changes. Check latest commits and deployments. Re-deploy known-good versions if necessary.

  12. Create an incident summary in Sharepoint under Documents/Cybersecurity & Compliance/Incidents.

Client Environment Credentials Compromised

Section titled “Client Environment Credentials Compromised”
  1. Notify client immediately

  2. Rotate/revoke keys/roles (client may do this while we support).

  3. Audit deployment and build logs.

  4. Confirm no malicious build artifacts.

  5. Preserve evidence (logs) before redeploy if possible.

  6. Redeploy from known-good commit.

  7. Agree on notification obligations (client vs us), especially if personal data may be involved.”

SaaS Outage (GitHub, Office365, Cloudflare)

Section titled “SaaS Outage (GitHub, Office365, Cloudflare)”
  1. Switch to fallback comms channels if necessary.

  2. Pause automated deployments if possible.

  3. Alert affected clients to inform them of the outage.

  4. Continue local work where possible.

  5. Resume normal operations when service is restored. Frequently check status pages for progress.

Follow the steps in this playbook in event of data being not only lost, but stolen or exposed.

A tabletop business continuity exercise is scheduled for 2026-08-10.

A review of this document is scheduled for 2026-08-10.

Information Security Policy

Read the policy document here.

Incident Playbook

In case of a security incident, follow this guide