Information Security Policy
Read the policy document here.
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:
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:
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.
| Asset | RPO | Notes |
|---|---|---|
| Source code repositories | 4 hours | GitHub availability, with local copies |
| CI/CD configurations | 4 hours | GitHub availability, with local copies |
| Corporate identity & productivity data | 24 hours | SaaS provider availability and administrative recovery |
| Password manager | 24 hours | Dependent on 1Password daily backups |
| Company‑managed VPS infrastructure | 24 hours | Daily backups and/or snapshots |
| Company‑managed databases | 24 hours | Backup frequency dependent |
| Client infrastructure managed by contract | Defined per SOW | Documented per client engagement |
| Client infrastructure not managed by company | N/A | Out of scope |
Note: targets may be refined per client contract. TODO: how do we track these refinements?
| Business activity | Impact if down | Max tolerable outage | Dependencies |
|---|---|---|---|
| Respond to support requests | High | 4 hours | MS365/Email, WhatsApp |
| Deploy critical fixes | High | 4 hours | GitHub, Forge, VPS, secrets, access to client env |
| Routine feature work | Medium | 24–72 hours | GitHub, local dev env |
| Internal planning/admin | Low | 72+ hours | MS365, Jira |
| Role | Name | Responsibility | Backup |
|---|---|---|---|
| Incident Lead | Niall Morrison | Owns coordination and client comms | Max Taylor |
| DevOps Lead | John Baker | Recovery actions for GitHub, CI/CD, secrets and deployments | Niall Morrison |
| Operations/Account Lead | James Harcourt | Client updates, prioritisation | Max Taylor |
| Approver | Max Taylor | Approves high-risk actions (credential rotation, access revocation) | Niall Morrison |
| Service / Asset | Purpose | Owner | Backup/Recovery approach | RTO | RPO |
|---|---|---|---|---|---|
| GitHub org, repos, CI/CD | Source control, PRs | James Harcourt | SaaS availability, distributed local clones | 4 hrs | 4 hrs |
| 1Password | Secrets and credentials | Max Taylor | Built-in admin recovery, offline recovery credentials | 4 hrs | 4 hrs |
| Email/Calendar/MS365 | Internal comms | John Baker | Microsoft DR, admin access recovery, alternate comms (WhatsApp) | 4 hrs | 24 hrs |
| Cloudflare | Web infrastructure, website deployments | Niall Morrison | SaaS availability, config-as-code where possible, documented manual rebuilds | 4 hrs | 24 hrs |
| Tailscale | Zero-trust network access | John Baker | SaaS availability, re-enrol devices, identify provider recovery | 4 hrs | 24 hrs |
| Laravel Forge | Server and deployment orchestration | John Baker | SaaS availability, servers can be re-attached/re-deployed | 8 hrs | 24 hrs |
| Expo | Toolchain and build orchestration | Niall Morrison | SaaS availability | 8 hrs | 24 hrs |
| VPS Infrastructure (Hetzner, Digital Ocean, Vultr, Fly.io) | Application hosting | John Baker | Provider snapshots/backups availability | 8 hrs | 24 hrs |
| S3 Storage (Backblaze) | Backups and file storage | John Baker | S3 versioning, retention policies, restricted IAM; restore tested periodically | 8 hrs | 24 hrs |
| Design/collaboration tools (Figma, Excalidraw, Jira) | Design and planning | James Harcourt | SaaS availability, exports where available | 4 hrs | 24 hrs |
| Asset | Primary | Additional | Backup Schedule | Who can restore? | Retention Duration | Notes |
|---|---|---|---|---|---|---|
| Source code | GitHub | Distributed local copies | N/A | Anyone in org | N/A | |
| Database backups | Backblaze (S3) | Daily | Incident Lead & DevOps Lead | 14 days | Backups stored in object storage are protected using versioning, retention, and access controls rather than secondary backup systems. | |
| Secrets | 1Password | N/A | Anyone with admin recovery credentials | N/A | See 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:
Revoke device Office365 sessions using this guide
Unlink sessions in 1Password via this page
Remove device from Tailscale via the console
Revoke device GitHub session using this guide
Revoke device Cloudflare session via this guide
Revoke device Forge session via the profile security settings
Revoke device Expo session via the console
Reset any credentials and rotate tokens as required.
Confirm disk encryption status and exposure risk. Wipe device via this guide
Issue replacement device and try to restore device data from iCloud.
Notify client if risk to client data/credentials is plausible.
Create an incident summary in Sharepoint under Documents/Cybersecurity & Compliance/Incidents.
Freeze: remove org access for suspected accounts. Get someone else to review audit logs during account recovery.
Change password on the primary email address using a non-compromised device (revoke Office365 sessions if necessary).
Attempt the account recovery flow
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.
Once you regain access:
Immediately rotate GitHub password and set up 2FA again.
Revoke active GitHub sessions using this guide
Revoke unknown SSH keys, Personal Access Tokens, unauthorised OAuth apps.
Disable/rotate GitHub Actions secrets, deploy keys, environment secrets.
Check for newly added Actions workflows and edited branch protection rules.
Check repo access and organisation memberships for changes. Check latest commits and deployments. Re-deploy known-good versions if necessary.
Create an incident summary in Sharepoint under Documents/Cybersecurity & Compliance/Incidents.
Notify client immediately
Rotate/revoke keys/roles (client may do this while we support).
Audit deployment and build logs.
Confirm no malicious build artifacts.
Preserve evidence (logs) before redeploy if possible.
Redeploy from known-good commit.
Agree on notification obligations (client vs us), especially if personal data may be involved.”
Switch to fallback comms channels if necessary.
Pause automated deployments if possible.
Alert affected clients to inform them of the outage.
Continue local work where possible.
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