Secrets Management Standard: [Organisation name]
Organisation standard for secrets: what counts as a secret, inventory and
classes, approved stores, issuance, rotation, dynamic short-lived
credentials, workload identity in place of static keys, CI/CD and
container rules, secret scanning, leak detection and revocation,
break-glass access and audit. Informed by the OWASP Secrets Management
Cheat Sheet (CC BY-SA 4.0), NIST SP 800-57 Part 1 Rev. 5 Recommendation
for Key Management: Part 1, General (May 2020) for key lifecycle and
cryptoperiods, and NIST SP 800-53 Rev. 5 (Release 5.2.0, August 2025)
controls IA-5 (authenticator management), SC-12 (cryptographic key
establishment and management) and SC-28 (protection of information at
rest). Replace every [bracketed] value and every row marked Example.
Worked examples use Corvid Commerce, a fictional SaaS company.
Document control
| Field | Value |
|---|
| Document ID | [SEC-STD-SECRETS-001] |
| Version | [1.0] |
| Status | [Draft / In review / Approved / Superseded] |
| Owner | [@head-of-security-engineering] |
| Approvers / reviewers | [@ciso], [@head-of-platform], [@engineering-directors], [@soc-lead] |
| Last updated | YYYY-MM-DD |
| Classification | Internal |
| Effective date | YYYY-MM-DD |
| Parent policy | [Information security policy, section [x]] |
| Applies to | All employees, contractors and suppliers who create, store, use or operate secrets for [Organisation name] |
| Review cycle | Annually and after any secret-related incident |
| Next review | YYYY-MM-DD |
Approvals
| Role | Name | Decision | Date |
|---|
| Chief information security officer | [@name] | [Approved / Changes requested] | YYYY-MM-DD |
| Head of platform engineering | [@name] | [Decision] | YYYY-MM-DD |
| Engineering director (representing product teams) | [@name] | [Decision] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|
| 0.1 | YYYY-MM-DD | [@name] | First draft |
| 0.9 | YYYY-MM-DD | [@name] | Example: Rotation periods agreed with platform and data teams |
| 1.0 | YYYY-MM-DD | [@name] | Example: Approved; static cloud keys for workloads banned for new systems |
Contents
1. Purpose and scope
1.1 Purpose
This standard sets the minimum rules for creating, storing, distributing,
using, rotating, revoking and auditing secrets so that:
- no secret is stored in plain text where unauthorised people or systems can read it;
- every secret has an owner, a class, a store and a lifetime;
- static long-lived credentials are replaced by short-lived or identity-based access wherever the platform supports it;
- a leaked secret is detected quickly and revoked before it can be abused.
1.2 What is a secret
A secret is any value that grants access, proves identity or protects data
and must stay confidential. Examples: passwords, API keys and tokens, OAuth
client secrets, cloud access keys, database credentials, private keys
(TLS, SSH, signing, encryption), symmetric data keys, webhook signing
secrets, session signing secrets, recovery codes, and connection strings
that embed credentials.
1.3 Scope
| In scope | Out of scope (covered elsewhere) |
|---|
| Secrets used by applications, services, pipelines, infrastructure and operators in all environments, including development and test | End-user passwords of customers (see customer identity design) |
| Secrets held by suppliers on behalf of [Organisation name] | Workforce password rules for human sign-in (see identity standard) |
| Private keys and symmetric keys used by software | Certificate authority hierarchy design (see PKI and Certificate Architecture, security/pki-certificate-architecture) |
2. Roles and responsibilities
| Activity | Security engineering | Platform team | Secret owner (service team) | SOC | Engineering managers |
|---|
| Maintain this standard | A/R | C | C | C | I |
| Operate approved stores and their availability | C | A/R | I | I | I |
| Register secrets and keep inventory accurate | C | C | A/R | I | I |
| Rotate and revoke secrets | C | R (automation) | A/R | I | I |
| Operate secret scanning | A/R | R (pipeline integration) | I | C | I |
| Respond to leaks | C | R | R | A (triage, coordination) | I |
| Grant exceptions | A | C | R (request) | I | C |
| Report compliance metrics | A/R | C | I | I | I |
R = responsible, A = accountable, C = consulted, I = informed.
3. Principles
- Eliminate before you protect. Prefer an identity-based or short-lived credential over any stored secret.
- Centralise. Secrets live in an approved store, never in code, configuration files, images, tickets or chat.
- Least privilege and least lifetime. Each secret grants the minimum access for the minimum time.
- One secret, one purpose. Never share a secret between applications, environments or people.
- Assume leakage. Design so that a leaked secret is detected, revoked and replaced without an outage.
- Automate the lifecycle. Manual rotation is the exception, documented and scheduled.
- Audit every access. Reads of high-value secrets are logged and reviewable.
4. Secret classes and inventory
4.1 Secret classes
| Class | Definition | Examples | Store | Monitoring |
|---|
| S1 Critical | Compromise gives broad or privileged control, or access to restricted data across systems | Cloud organisation admin credentials, root CA and code-signing private keys, KMS key administration, production database admin | HSM or KMS for keys; vault with dual control for credentials | Every access alerts the SOC |
| S2 High | Compromise gives access to production data or a production system | Service database credentials, payment provider API keys, production TLS private keys, webhook signing secrets | Vault (production namespace) or cloud secret manager | Access logged; anomalies alert |
| S3 Moderate | Compromise affects non-production or limited, low-sensitivity scopes | Staging credentials, read-only monitoring API tokens | Vault or cloud secret manager | Access logged |
| S4 Low | Test values with no access to real data or systems | Local development fixtures, mock keys | Developer local store or test fixtures, never in production stores | None required |
4.2 Inventory record
Each S1 to S3 secret MUST have an inventory record, generated where possible
from store metadata.
| Field | Example (Example) |
|---|
| Secret ID | SEC-PAY-014 |
| Name or path | prod/checkout/payment-provider-api-key |
| Class | S2 High |
| Owner | [@checkout-team] |
| Consumer(s) | checkout-service (production) |
| Store | Vault, namespace prod-checkout |
| Type | Static API key (provider does not support OAuth client credentials) |
| Created | YYYY-MM-DD |
| Rotation period | 90 days (Example) |
| Last rotated | YYYY-MM-DD |
| Rotation method | Automated (dual-key overlap) |
| Revocation procedure | Runbook RB-SEC-014 |
| Exception | None |
5. Policy statements summary
| ID | Statement | Level |
|---|
| SM-01 | Secrets MUST NOT be stored in source code, commit history, infrastructure-as-code files, container images, build logs, wikis, tickets, chat or email. | MUST |
| SM-02 | S1 to S3 secrets MUST be stored only in an approved store (section 6). | MUST |
| SM-03 | Each S1 to S3 secret MUST have an owner and an inventory record (section 4.2). | MUST |
| SM-04 | Secrets MUST NOT be shared across environments, applications or people. | MUST |
| SM-05 | New workloads MUST use workload identity or dynamic credentials where the platform supports it; static cloud access keys for workloads MUST NOT be created. | MUST |
| SM-06 | Static secrets MUST be rotated within the period for their class and immediately on suspected exposure or owner departure. | MUST |
| SM-07 | Access to secrets MUST be granted to identities, not to shared accounts, using least privilege. | MUST |
| SM-08 | Every repository MUST have secret scanning enabled with push protection where the platform supports it. | MUST |
| SM-09 | A detected leak of a valid S1 or S2 secret MUST be revoked within the leak response target (section 11.3). | MUST |
| SM-10 | Reads of S1 secrets MUST be logged and alert the SOC; reads of S2 secrets MUST be logged. | MUST |
| SM-11 | Cryptographic keys MUST follow the key lifecycle in NIST SP 800-57 Part 1 and the cryptoperiods set in section 8. | MUST |
| SM-12 | Secrets SHOULD be delivered to workloads at runtime (mounted or fetched) rather than baked into artefacts or passed as command-line arguments. | SHOULD |
| SM-13 | Applications SHOULD reload rotated secrets without restart. | SHOULD |
| SM-14 | Break-glass credentials MUST be sealed, monitored and rotated after every use (section 12). | MUST |
| SM-15 | Secrets MUST be encrypted at rest in stores and backups, and in transit, with keys managed under SM-11. | MUST |
6. Approved stores
| Store ID | Store | Approved classes | Authentication of consumers | Operated by | Notes |
|---|
| ST-01 (Example) | Cloud KMS with HSM-backed keys | S1, S2 keys (non-exportable) | Cloud IAM roles via workload identity | Platform | Key material never leaves the HSM boundary |
| ST-02 (Example) | Central vault cluster (production) | S1 (dual control), S2 | Kubernetes service account tokens, cloud IAM auth, OIDC for CI | Platform | Namespaces per business unit |
| ST-03 (Example) | Cloud provider secret manager | S2, S3 | Cloud IAM roles | Platform | For serverless workloads without vault access |
| ST-04 (Example) | CI platform encrypted secrets | S3 only, and only until OIDC federation is available for the target | Repository and environment scoping | Developer experience team | Not for S1 or S2 |
| ST-05 (Example) | Enterprise password manager | Human-used shared credentials for third-party consoles that lack SSO | SSO with phishing-resistant MFA | IT | Not for workloads |
Requirements for every approved store:
- Encryption at rest with keys under SM-11, and TLS for all access.
- Fine-grained access policies per path or secret, managed as code and reviewed.
- Audit logs of reads, writes and policy changes forwarded to the SIEM.
- Versioning, so a rotation can roll back within the overlap window.
- High availability and a tested recovery procedure; loss of the store is a severity-1 incident risk.
- Removal of secrets from memory and temporary files on consumer hosts is the responsibility of the consuming application.
7. Issuance and access
7.1 Issuance rules
- Generate secrets in the store or by the target system using a cryptographically secure random generator. Humans MUST NOT choose secret values for S1 to S3.
- Minimum strength (Example): random API secrets of at least 256 bits of entropy; passwords for service accounts at least 32 random characters; key sizes and algorithms per the cryptography standard.
- Register the inventory record (section 4.2) at creation, ideally by the same automation.
- Deliver the secret only to the consuming identity through the store's access policy. If a human must transfer a secret to an external party, use a one-time, expiring share from the approved password manager.
- Scope each secret to the narrowest permission the target system offers (read-only, single resource, IP or network restrictions where available).
7.2 Access control
- Access policies are granted to workload or human identities, versioned in a repository and approved by the secret owner.
- Human read access to S1 and S2 production secrets is not standing; it uses just-in-time elevation with a ticket reference.
- Access reviews: quarterly for S1, semi-annually for S2 (Example). Record results in the access review process.
8. Rotation and expiry
8.1 Rotation periods
All values are Example values. Adjust them to your risk assessment and the
capabilities of the target systems.
| Secret type | S1 Critical | S2 High | S3 Moderate | Trigger-based rotation |
|---|
| Dynamic database or cloud credentials | Lease 1 hour (Example) | Lease 8 hours (Example) | Lease 24 hours (Example) | Automatic on lease expiry |
| Static service passwords and API keys | 30 days (Example) | 90 days (Example) | 180 days (Example) | Suspected exposure, owner leaves, supplier breach |
| Webhook and token signing secrets | 90 days (Example) | 180 days (Example) | 365 days (Example) | Suspected exposure |
| TLS server private keys | Re-key on each certificate renewal | Re-key on each certificate renewal | Re-key on each certificate renewal | Key compromise |
| Symmetric data encryption keys | Per cryptoperiod set in the cryptography standard (informed by NIST SP 800-57 Part 1) | Same | Same | Compromise, algorithm deprecation |
| Code-signing and CA private keys | Per PKI design; HSM-held, rotated by planned key ceremony | n/a | n/a | Compromise |
| Break-glass credentials | After every use and at least every 90 days (Example) | n/a | n/a | Every use |
8.2 Rotation method
- Use dual-secret overlap: create the new secret, deploy it to consumers, verify use, then revoke the old one.
- Automate rotation in the store where a rotation integration exists for the target system.
- Record each rotation (date, method, operator or automation) in the store metadata.
- Treat a rotation that fails, or that is more than 14 days overdue (metric in section 13.2), as a finding; fix it within 30 days (Example), or within the leak response target in section 11.3 if exposure is suspected.
- When a secret cannot be rotated without downtime, record it as a design defect and plan a fix; do not extend the period silently.
9. Dynamic credentials and workload identity
9.1 Target patterns
| Context | Target pattern | Static secret eliminated |
|---|
| Workloads in a cloud account | Cloud workload identity (instance or function role, managed identity, service account attached to the resource) | Cloud access keys |
| Kubernetes workloads | Projected service account tokens federated to cloud IAM and to the vault | Cloud keys and vault tokens in Kubernetes Secrets |
| CI/CD pipelines | OIDC federation from the CI platform to cloud IAM and the vault, scoped to repository, branch and environment | Long-lived deploy keys in CI secrets |
| Databases | Dynamic credentials issued per workload with a lease, or database IAM authentication | Shared static database passwords |
| Service-to-service | Mutual TLS with short-lived certificates from an automated issuer, or signed tokens from the platform identity | Shared API keys between internal services |
| Human operators | SSO with phishing-resistant MFA and just-in-time role elevation | Personal long-lived cloud keys |
9.2 Migration register
| Migration ID | Current static secret | Target | Owner | Due | Status |
|---|
| MIG-001 (Example) | 14 machine-user cloud keys (Corvid data platform; 22 a quarter earlier) | Workload identity on the ETL runners | [@data-platform] | YYYY-MM-DD | In progress (14 active at the Q3 snapshot; 11 to be replaced this quarter; 3 used by the third-party ETL tool stay under SMX-003) |
| MIG-002 (Example) | CI deploy keys for 120 repositories | OIDC federation | [@devex] | YYYY-MM-DD | Planned |
| MIG-003 (Example) | Shared reporting database password | Dynamic credentials, 8-hour lease | [@analytics] | YYYY-MM-DD | Planned |
Cross-reference: posture reviews measure static key counts in Cloud Security
Posture Review (security/cloud-security-posture-review), section 5.
10. CI/CD, containers and Kubernetes
10.1 CI/CD rules
- Pipelines MUST obtain cloud and vault access by OIDC federation where supported (SM-05); stored CI secrets are limited to S3 (ST-04).
- Scope credentials to the environment and protected branches; jobs from forks or untrusted pull requests MUST NOT receive secrets.
- Do not print secrets, pass them as command-line arguments, or write them to artefacts or caches. Enable log masking as a backstop, not a control.
- Pin third-party actions and plugins to a full commit hash or verified digest; a compromised dependency can read every secret the job holds. See Software Supply Chain Security Assessment Template (SLSA) (
security/supply-chain-security).
- Self-hosted runners for production deployments MUST be ephemeral, so no credential persists between jobs.
10.2 Container rules
- Container images MUST NOT contain secrets in any layer, including layers deleted later; build-time secrets use the build tool's secret mount feature.
- Do not pass S1 or S2 secrets as plain environment variables where a mounted file or runtime fetch is available; environment variables leak through crash dumps, debug endpoints and child processes.
- Scan images for secrets in the registry and block promotion on a confirmed finding.
10.3 Kubernetes rules
- Enable encryption at rest for Kubernetes Secrets using a KMS provider; base64 encoding is not encryption.
- Prefer an external secrets operator or a CSI secrets store driver that syncs from the approved store, with namespace-scoped access.
- Restrict
get, list and watch on Secrets through RBAC to the workloads that need them; list on Secrets in a namespace exposes all of them.
- Disable automatic mounting of service account tokens for pods that do not call the Kubernetes API.
- Cluster-level design choices live in Kubernetes Cluster Design (
ops/kubernetes-cluster-design).
11. Secret scanning and leak response
11.1 Scanning coverage
| Location | Control | Mode | Owner |
|---|
| Developer workstation | Pre-commit hook with the approved scanner | Warn and block | Each engineer, installed by onboarding script |
| Source code platform | Platform secret scanning with push protection | Block, bypass needs reason and is alerted | Security engineering |
| Full history of all repositories | Scheduled deep scan | Report | Security engineering |
| CI logs and artefacts | Pipeline log scanner | Report and purge | Developer experience team |
| Container registry | Image secret scan | Block promotion | Platform |
| Wikis, tickets and chat | Scanner integration where available | Report and redact | IT |
| Public internet (public repositories, paste sites) | Partner programmes of providers and external monitoring | Alert | SOC |
11.2 Leak response steps
- Triage (SOC). Confirm the value is a real secret and identify the inventory record and owner. Check validity where safe (for example a provider's verification endpoint).
- Revoke and replace (owner). Rotate the secret using the dual-secret method; if overlap is not possible, revoke immediately and accept the outage for S1.
- Investigate (SOC). Search store and target logs for use of the leaked secret from the time of exposure. Expand to an incident if any unexpected use is found.
- Remove the exposure (owner). Remove the secret from the location, purge caches and artefacts, and request removal from public sources. History rewriting is optional; revocation is mandatory.
- Learn (security engineering). Record the root cause (how the secret reached that location) and fix the path, for example by adding a scanner rule or moving to workload identity.
11.3 Leak response targets
| Situation | Revoke within (Example) | Severity starting point |
|---|
| Valid S1 secret exposed publicly | 1 hour | Major incident per Incident Severity Matrix (ops/incident-severity-matrix) |
| Valid S1 secret exposed internally, or S2 exposed publicly | 4 hours | High |
| Valid S2 secret exposed internally | 24 hours | Medium |
| S3 secret exposed anywhere | 5 business days | Low |
| Value confirmed invalid or a test fixture | No revocation; close with reason | Informational |
12. Break-glass access
- Maintain break-glass accounts only for: cloud organisation administration, the identity provider, and the vault itself (Example list).
- Store break-glass credentials outside the systems they recover, for example as split knowledge in sealed envelopes in two safes, or in a separate password manager tenant, with hardware MFA tokens held separately.
- Any use MUST raise a high-priority SOC alert automatically.
- Use requires two people, a declared incident or change, and a written log of actions taken.
- Rotate the credentials and re-seal after every use, and test access at least every [6] months (Example) without exposing the credential.
- Review the list of break-glass holders quarterly.
13. Audit, logging and compliance measurement
13.1 Audit logging
- Store audit logs (reads, writes, policy changes, authentication failures) are forwarded to the SIEM and retained per Security Logging Standard (
security/security-logging-standard).
- Alerts (Example): any S1 read; S2 reads from a new identity or network; bulk reads; policy changes outside change windows; disabled audit device.
13.2 Metrics
| Metric | Formula | Target (Example) |
|---|
| Inventory coverage | secrets in stores with an inventory record / secrets in stores | 100% |
| Static workload credentials | count of active static cloud keys and stored CI deploy keys | Down each quarter; 0 for new systems |
| Rotation compliance | S1 to S3 static secrets rotated within period / S1 to S3 static secrets | 98% |
| Repositories with push protection | repositories with protection on / active repositories | 100% |
| Mean time to revoke (valid leaks) | sum of (revocation time minus detection time) / valid leaks | Within targets in 11.3 |
| Push protection bypasses | bypasses in period, with reason recorded | Trend down; 100% with reason |
| Overdue rotation findings | count of secrets past rotation date by more than 14 days | 0 |
Example (Corvid Commerce, Q3): 1,240 secrets in stores, 1,215 with an
inventory record: coverage = 1,215 / 1,240 = 98.0%. 410 static secrets due
for rotation, 398 rotated in period: compliance = 398 / 410 = 97.1%.
13.3 Compliance checks
| Check | Method | Frequency |
|---|
| SM-01, SM-08 | Scanner reports and repository settings export | Continuous; monthly report |
| SM-02, SM-03 | Store metadata compared with inventory | Monthly |
| SM-05 | CSPM count of static workload keys | Monthly |
| SM-06 | Rotation dates in store metadata | Weekly |
| SM-10, SM-14 | SIEM alert tests | Quarterly |
14. Exceptions and risk acceptance
| Exception ID | Statement | System | Reason | Compensating controls | Approved by | Expiry |
|---|
| SMX-003 (Example) | SM-05 | Third-party ETL tool (3 machine-user keys; recorded in the posture review as EXC-019) | Supports only static access keys | Keys scoped to the ETL buckets with no administrative policy, network condition, 30-day rotation, alert on new source IP | [@ciso] | YYYY-MM-DD (90 days) |
| SMX-007 (Example) | SM-06 | Legacy payment terminal integration | Supplier requires manual key exchange | Key held in HSM, rotated annually by ceremony, supplier contract updated | [@ciso] | YYYY-MM-DD |
Rules: exceptions to MUST statements for S1 need CISO approval; all
exceptions expire within 12 months (Example); expired exceptions become
findings.
15. Related documents and control mapping
15.1 Control mapping
| Statement | NIST SP 800-53 Rev. 5 | Topic |
|---|
| SM-02, SM-07, SM-14 | IA-5 | Managing authenticators: initial values, protection, change and revocation |
| SM-06, SM-11 | IA-5, SC-12 | Authenticator refresh; establishing and managing cryptographic keys |
| SM-15 | SC-28 | Protecting stored information, including secrets at rest |
| SM-10 | AU-2, AU-12 | Selecting and generating audit events |
| SM-05 | IA-5, AC-6 | Fewer static authenticators; least privilege |
15.2 Related templates and documents
| Document | Relationship |
|---|
PKI and Certificate Architecture Template (RFC 3647, 47-Day TLS) (security/pki-certificate-architecture) | Certificate and CA key lifecycle |
IAM Solution Design Template (NIST SP 800-63-4, SSO, PAM) (security/iam-solution-design) | Workforce identity, privileged access, machine identities |
Cloud Security Reference Patterns Template (AWS SRA, MCSB, CCM v4.1) (security/cloud-security-reference-patterns) | Approved key management and workload identity patterns |
Security Architecture Document Template (NIST SP 800-160, STRIDE) (security/security-architecture) | Per-system secrets design (its section 10) |
Software Supply Chain Security Assessment Template (SLSA) (security/supply-chain-security) | CI/CD hardening |
Cloud Security Posture Review (security/cloud-security-posture-review) | Periodic measurement of static keys and key rotation |
Security Logging Standard (security/security-logging-standard) | Audit log retention |
Incident Severity Matrix (ops/incident-severity-matrix) | Severity of leak incidents |
Kubernetes Cluster Design (ops/kubernetes-cluster-design) | Cluster secret encryption and RBAC |
16. Glossary and references
16.1 Glossary
| Term | Meaning |
|---|
| Secret | A confidential value that grants access, proves identity or protects data |
| Static secret | A secret that stays valid until someone rotates or revokes it |
| Dynamic credential | A credential generated on request with a lease, revoked automatically when the lease ends |
| Workload identity | An identity the platform attaches to a workload, which it exchanges for short-lived tokens without a stored secret |
| Secret zero | The first credential a workload needs in order to fetch other secrets |
| Cryptoperiod | The time span during which a specific key is authorised for use (NIST SP 800-57 concept) |
| Push protection | A source platform feature that blocks a push containing a detected secret |
| Break-glass | Emergency access that bypasses normal controls, used only when they fail |
| HSM | Hardware security module: tamper-resistant hardware that generates and holds keys |
16.2 References
- OWASP Foundation, Secrets Management Cheat Sheet, OWASP Cheat Sheet Series (living document, CC BY-SA 4.0): https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html
- NIST SP 800-57 Part 1 Rev. 5, Recommendation for Key Management: Part 1, General, May 2020: https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final
- NIST SP 800-53 Rev. 5, Security and Privacy Controls for Information Systems and Organizations, Release 5.2.0 (27 August 2025), controls IA-5, SC-12, SC-28: https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final
- Kubernetes documentation, "Good practices for Kubernetes Secrets": https://kubernetes.io/docs/concepts/security/secrets-good-practices/
- Kubernetes documentation, "Encrypting Confidential Data at Rest": https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
Standard and licence note
Based on NIST SP 800-57 Part 1 Rev. 5 (May 2020) and NIST SP 800-53 Rev. 5
(Release 5.2.0, August 2025), which are works of the United States
Government; control identifiers are cited and their intent is paraphrased.
The topic coverage (general secrets management, CI/CD, cloud providers,
containers and orchestrators, detection, incident response) is informed by
the OWASP Secrets Management Cheat Sheet by the OWASP Foundation,
licensed under Creative Commons Attribution-ShareAlike 4.0 International
(CC BY-SA 4.0). If you adapt or redistribute material taken from the OWASP
cheat sheet, attribute OWASP and license that adapted material under CC
BY-SA 4.0 (ShareAlike). The wording of this template is original. Check the
current official versions at nist.gov and owasp.org before relying on this
standard, as updates may have been published. Product and platform names
are trademarks of their owners; this template is not affiliated with or
endorsed by them. Template licence: MIT.