Skip to content

Commit 1c864b2

Browse files
Merge pull request #927 from twbs/main
Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also
2 parents c9e3956 + e170268 commit 1c864b2

File tree

196 files changed

+3829
-2920
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

196 files changed

+3829
-2920
lines changed

.github/CONTRIBUTING.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ restrictions:
2727
Use [GitHub's "reactions" feature](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/)
2828
instead. We reserve the right to delete comments which violate this rule.
2929

30-
- Please **do not** open issues regarding the official themes offered on <https://themes.getbootstrap.com/>.
31-
Instead, please email any questions or feedback regarding those themes to `themes AT getbootstrap DOT com`.
32-
3330

3431
## Issues assignment
3532

.github/INCIDENT_RESPONSE.md

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
# Incident response plan
2+
3+
This document describes how the Bootstrap maintainers respond to and manage security or operational incidents affecting the project, its website, or its distributed releases. This plan is public to promote transparency and community trust. Operational details (e.g., private contacts, credentials, or internal coordination tools) are maintained separately in the maintainers’ private documentation.
4+
5+
---
6+
7+
## 1. Purpose & Scope
8+
9+
This plan defines how Bootstrap maintainers will:
10+
11+
- Identify, triage, and manage security or integrity incidents affecting project code, releases, or infrastructure.
12+
- Communicate with the community and downstream consumers during and after an incident.
13+
- Record lessons learned and update processes to reduce future risk.
14+
15+
It applies to:
16+
17+
- The Bootstrap source code, documentation, and build pipelines.
18+
- Release artifacts (npm, CDN, GitHub releases).
19+
- The main website ([https://getbootstrap.com](https://getbootstrap.com)).
20+
- Any official Bootstrap GitHub organization infrastructure.
21+
22+
It does **not** cover unrelated third-party forks or integrations.
23+
24+
---
25+
26+
## 2. Definitions
27+
28+
- **Incident**: Any event that could compromise the confidentiality, integrity, or availability of Bootstrap code, releases, or users. Examples include:
29+
- A discovered security vulnerability.
30+
- A compromised GitHub account or CI/CD token.
31+
- A malicious dependency or injected code in a release.
32+
- Website defacement or unauthorized modification of documentation.
33+
- Leaked secrets related to the project infrastructure.
34+
35+
- **Incident Commander (IC)**: The maintainer responsible for coordinating the overall response.
36+
37+
---
38+
39+
## 3. Roles & Responsibilities
40+
41+
| Role | Responsibilities |
42+
|------|-------------------|
43+
| **Incident Commander (IC)** | Coordinate the response, assign tasks, ensure timely communication. |
44+
| **Security Maintainers** | Triage reported vulnerabilities, assess impact, create fixes, handle embargoes. |
45+
| **Infrastructure Lead** | Manage CI/CD, website, and release infrastructure. |
46+
| **Communications Lead** | Manage public announcements, blog posts, and social updates. |
47+
| **Contributors & Community** | Promptly report suspected security issues and follow responsible disclosure guidelines. |
48+
49+
In practice, Bootstrap’s core team fulfills these roles collectively, assigning an IC on a per-incident basis.
50+
51+
---
52+
53+
## 4. Incident workflow
54+
55+
### 4.1 Detection & Reporting
56+
57+
- All security issues should be **privately reported** via the contact method in [`SECURITY.md`](../SECURITY.md) or through GitHub’s Security Advisory mechanism.
58+
- Maintainers also monitor:
59+
- Automated dependency scanners (e.g., Dependabot, npm audit).
60+
- GitHub notifications and vulnerability alerts.
61+
- Community channels for suspicious activity.
62+
63+
### 4.2 Initial triage
64+
65+
Upon receiving a report:
66+
67+
1. A maintainer acknowledges receipt within 3 business days (or sooner, when possible).
68+
Bootstrap is maintained by a small volunteer team; response times may vary slightly outside normal working hours.
69+
2. The IC assesses severity and impact:
70+
- **Critical:** immediate compromise of release infrastructure or code integrity.
71+
- **High:** exploitable vulnerability in distributed assets.
72+
- **Medium:** minor vulnerability or low-likelihood attack vector.
73+
- **Low:** informational, no direct risk.
74+
3. If confirmed as an incident, the IC opens a private coordination channel for maintainers and begins containment.
75+
76+
### 4.3 Containment & Eradication
77+
78+
- Revoke or rotate any affected credentials.
79+
- Disable compromised infrastructure or build pipelines if necessary.
80+
- Patch affected branches or dependencies.
81+
- Verify integrity of artifacts and releases.
82+
83+
### 4.4 Communication
84+
85+
- Keep the reporting party informed (when applicable).
86+
- For major incidents, the Communications Lead drafts a public advisory describing:
87+
- What happened
88+
- What was impacted
89+
- How users can verify or mitigate
90+
- What actions were taken
91+
- Communications occur after containment to avoid amplifying risk.
92+
93+
Public disclosures are posted via:
94+
95+
- GitHub Security Advisory if appropriate
96+
- [blog.getbootstrap.com/](https://blog.getbootstrap.com/)
97+
- [Bootstrap GitHub discussions](https://github.com/orgs/twbs/discussions)
98+
- [@getbootstrap](https://x.com/getbootstrap) on X (formerly Twitter) for critical security notices.
99+
100+
### 4.5 Recovery
101+
102+
- Validate all systems and releases are secure.
103+
- Resume normal operations.
104+
- Tag patched releases and notify affected users.
105+
106+
### 4.6 Post-incident review
107+
108+
Within two weeks after resolution:
109+
110+
- Conduct an internal debrief.
111+
- Record:
112+
- Root cause
113+
- What worked / what didn’t
114+
- Remediation steps
115+
- Documentation or automation updates needed
116+
- Summarize lessons learned in the private maintainers’ wiki (with optional public summary if appropriate).
117+
118+
---
119+
120+
## 5. Severity levels & Response targets
121+
122+
| Severity | Example | Target response (volunteer team) |
123+
|-----------|----------|----------------------------------|
124+
| **Critical** | Compromised release, stolen signing keys | Acknowledge ≤ 24h (best effort), containment ≤ 48h, fix ideally ≤ 14d |
125+
| **High** | Vulnerability enabling arbitrary code execution | Acknowledge ≤ 3 business days, fix ideally ≤ 14–21d |
126+
| **Medium** | XSS or content injection on docs site | Acknowledge ≤ 5 business days, fix in next release cycle |
127+
| **Low** | Minor issue with limited risk | Acknowledge ≤ 7 business days, fix as scheduled |
128+
129+
**Note:** Timelines represent good-faith targets for a small volunteer core team, not hard SLAs. The maintainers will always prioritize public safety and transparency, even if timing varies.
130+
131+
---
132+
133+
## 6. Public disclosure principles
134+
135+
Bootstrap follows a responsible disclosure approach:
136+
137+
- Work privately with reporters and affected parties before publishing details.
138+
- Never name reporters without consent.
139+
- Coordinate embargo periods with downstream consumers when needed.
140+
- Publish advisories only after patches or mitigations are available.
141+
142+
---
143+
144+
## 7. Communication Channels
145+
146+
| Purpose | Channel |
147+
|----------|----------|
148+
| Private reporting | Email address in [`SECURITY.md`](./SECURITY.md) or GitHub advisory form |
149+
| General updates | [blog.getbootstrap.com/](https://blog.getbootstrap.com/) blog |
150+
| Security advisories | GitHub Security Advisory dashboard |
151+
| Social alerts | [@getbootstrap](https://x.com/getbootstrap) |
152+
| GitHub discussion alerts | [github.com/orgs/twbs/discussions](https://github.com/orgs/twbs/discussions) |
153+
154+
---
155+
156+
## 8. Plan Maintenance
157+
158+
This plan is reviewed at least annually or after any major incident. Changes are approved by the Core Team and recorded in Git history.
159+
160+
---
161+
162+
_The Bootstrap maintainers are committed to transparency, user trust, and continuous improvement in our security and response practices._

.github/dependabot.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ updates:
77
day: tuesday
88
time: "12:00"
99
timezone: Europe/Athens
10+
groups:
11+
github-actions:
12+
patterns:
13+
- "*"
1014
- package-ecosystem: npm
1115
directory: "/"
1216
labels:

.github/workflows/browserstack.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010
env:
1111
FORCE_COLOR: 2
12-
NODE: 20
12+
NODE: 22
1313

1414
permissions:
1515
contents: read
@@ -22,12 +22,12 @@ jobs:
2222

2323
steps:
2424
- name: Clone repository
25-
uses: actions/checkout@v4
25+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2626
with:
2727
persist-credentials: false
2828

2929
- name: Set up Node.js
30-
uses: actions/setup-node@v4
30+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
3131
with:
3232
node-version: "${{ env.NODE }}"
3333
cache: npm

.github/workflows/bundlewatch.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010
env:
1111
FORCE_COLOR: 2
12-
NODE: 20
12+
NODE: 22
1313

1414
permissions:
1515
contents: read
@@ -20,12 +20,12 @@ jobs:
2020

2121
steps:
2222
- name: Clone repository
23-
uses: actions/checkout@v4
23+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2424
with:
2525
persist-credentials: false
2626

2727
- name: Set up Node.js
28-
uses: actions/setup-node@v4
28+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
2929
with:
3030
node-version: "${{ env.NODE }}"
3131
cache: npm

.github/workflows/calibreapp-image-actions.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ jobs:
2222
pull-requests: write
2323
steps:
2424
- name: Clone repository
25-
uses: actions/checkout@v4
25+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2626
with:
2727
persist-credentials: false
2828

2929
- name: Compress Images
30-
uses: calibreapp/image-actions@1.1.0
30+
uses: calibreapp/image-actions@f32575787d333b0579f0b7d506ff03be63a669d1 # v1.4.1
3131
with:
32-
githubToken: ${{ secrets.GITHUB_TOKEN }}
32+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/codeql.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,21 @@ jobs:
2424

2525
steps:
2626
- name: Checkout repository
27-
uses: actions/checkout@v4
27+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2828
with:
2929
persist-credentials: false
3030

3131
- name: Initialize CodeQL
32-
uses: github/codeql-action/init@v3
32+
uses: github/codeql-action/init@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
3333
with:
3434
config-file: ./.github/codeql/codeql-config.yml
3535
languages: "javascript"
3636
queries: +security-and-quality
3737

3838
- name: Autobuild
39-
uses: github/codeql-action/autobuild@v3
39+
uses: github/codeql-action/autobuild@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
4040

4141
- name: Perform CodeQL Analysis
42-
uses: github/codeql-action/analyze@v3
42+
uses: github/codeql-action/analyze@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
4343
with:
4444
category: "/language:javascript"

.github/workflows/cspell.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ jobs:
2323

2424
steps:
2525
- name: Clone repository
26-
uses: actions/checkout@v4
26+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2727
with:
2828
persist-credentials: false
2929

3030
- name: Run cspell
31-
uses: streetsidesoftware/cspell-action@v7
31+
uses: streetsidesoftware/cspell-action@3294df585d3d639e30f3bc019cb11940b9866e95 # v8.0.0
3232
with:
3333
config: ".cspell.json"
3434
files: "**/*.{md,mdx}"

.github/workflows/css.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010
env:
1111
FORCE_COLOR: 2
12-
NODE: 20
12+
NODE: 22
1313

1414
permissions:
1515
contents: read
@@ -20,12 +20,12 @@ jobs:
2020

2121
steps:
2222
- name: Clone repository
23-
uses: actions/checkout@v4
23+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2424
with:
2525
persist-credentials: false
2626

2727
- name: Set up Node.js
28-
uses: actions/setup-node@v4
28+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
2929
with:
3030
node-version: "${{ env.NODE }}"
3131
cache: npm

.github/workflows/docs.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010
env:
1111
FORCE_COLOR: 2
12-
NODE: 20
12+
NODE: 22
1313

1414
permissions:
1515
contents: read
@@ -20,12 +20,12 @@ jobs:
2020

2121
steps:
2222
- name: Clone repository
23-
uses: actions/checkout@v4
23+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
2424
with:
2525
persist-credentials: false
2626

2727
- name: Set up Node.js
28-
uses: actions/setup-node@v4
28+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
2929
with:
3030
node-version: "${{ env.NODE }}"
3131
cache: npm
@@ -42,9 +42,9 @@ jobs:
4242
run: npm run docs-vnu
4343

4444
- name: Run linkinator
45-
uses: JustinBeckwith/linkinator-action@v1
45+
uses: JustinBeckwith/linkinator-action@af984b9f30f63e796ae2ea5be5e07cb587f1bbd9 # v2.3
4646
with:
4747
paths: _site
4848
recurse: true
4949
verbosity: error
50-
skip: "^(?!http://localhost)"
50+
skip: "^http://localhost"

0 commit comments

Comments
 (0)