Bumi - Accessibility Linter (WCAG/a11y)
Accessibility linter for React, Vue, Angular & HTML. Catch a11y issues while coding with WCAG 2.2 diagnostics, quick fixes, and detailed rationale.
Developed by: Flat Electronics Canada Limited
Website: bumi.ca
Features
Real-time Accessibility Diagnostics
Get instant feedback on accessibility issues directly in your editor:
- Squiggly underlines highlight potential issues
- Color-coded by severity (Critical, Serious, Moderate, Minor)
- Issues appear in the Problems panel
- Supports React (JSX/TSX), Vue, Angular, HTML, and Razor
Quick Fixes
One-click fixes for common accessibility issues:
- Add missing
alt attributes to images
- Add
aria-label to buttons and links
- Add keyboard accessibility attributes
- Fix role and tabindex issues
Hover over any issue to see:
- What is checked
- Why it matters
- Who is affected
- Limitations of the check
- Manual verification steps
Rule Explorer
Browse all 18 accessibility rules in the sidebar:
- Search by ID, title, or WCAG criterion
- Filter by framework, severity, or WCAG principle
- View detailed rule documentation
Report Export
Export accessibility reports for documentation:
- JSON format for CI/CD integration
- HTML format with accessible formatting
Supported File Types
| Framework |
Extensions |
| React |
.jsx, .tsx |
| Vue |
.vue |
| Angular |
.html (with Angular syntax) |
| HTML |
.html, .htm |
| Razor |
.cshtml, .razor |
Baseline Rules (18)
| Rule ID |
Description |
Severity |
IMG_MISSING_ALT |
Image missing alt attribute |
Critical |
IMG_SUSPICIOUS_ALT |
Suspicious alt text detected |
Moderate |
BUTTON_NO_NAME |
Button missing accessible name |
Critical |
LINK_NO_NAME |
Link missing accessible name |
Critical |
FORM_CONTROL_NO_LABEL |
Form control missing label |
Critical |
LABEL_FOR_MISMATCH |
Label for attribute mismatch |
Serious |
DUPLICATE_ID |
Duplicate ID detected |
Serious |
ARIA_INVALID_ATTR |
Invalid ARIA attribute |
Serious |
ARIA_INVALID_ROLE |
Invalid ARIA role |
Serious |
ARIA_REQUIRED_ATTR_MISSING |
Required ARIA attribute missing |
Serious |
INTERACTIVE_NON_INTERACTIVE |
Non-interactive element has click handler |
Serious |
MISSING_LANG_ATTR |
Missing lang attribute on html |
Serious |
HEADING_NO_H1 |
Page may be missing H1 |
Moderate |
HEADING_SKIP_LEVEL |
Heading level skipped |
Moderate |
INPUT_PLACEHOLDER_AS_LABEL |
Placeholder used as label |
Serious |
ONCLICK_NO_KEYBOARD_EQUIV |
Click handler may lack keyboard equivalent |
Moderate |
FOCUSABLE_HIDDEN |
Focusable element hidden from AT |
Serious |
ROLE_ON_NON_INTERACTIVE |
Interactive role on non-interactive element |
Serious |
Commands
| Command |
Description |
Bumi: Scan Current File |
Run accessibility scan on active file |
Bumi: Scan Workspace |
Scan all supported files in workspace |
Bumi: Fix Safe Issues in Current File |
Apply safe quick fixes |
Bumi: Open Rule Explorer |
Open the Rule Explorer sidebar |
Bumi: Toggle Auto-Scan on Save |
Enable/disable automatic scanning |
Bumi: Export Report (JSON) |
Export accessibility report as JSON |
Bumi: Export Report (HTML) |
Export accessible HTML report |
Settings
| Setting |
Default |
Description |
bumi.enabled |
true |
Enable/disable the extension |
bumi.scan.onSave |
true |
Scan files automatically on save |
bumi.scan.onType |
false |
Scan files as you type |
bumi.scan.debounceMs |
400 |
Debounce delay for on-type scanning |
bumi.wcag.version |
2.2 |
WCAG version (2.0, 2.1, 2.2) |
bumi.wcag.level |
AA |
Conformance level (A, AA, AAA) |
bumi.rules.disabled |
[] |
List of rule IDs to disable |
bumi.severityOverrides |
{} |
Override severity for specific rules |
bumi.frameworks.react |
true |
Enable React/JSX support |
bumi.frameworks.vue |
true |
Enable Vue support |
bumi.frameworks.angular |
true |
Enable Angular support |
bumi.frameworks.html |
true |
Enable HTML support |
bumi.frameworks.razor |
true |
Enable Razor support |
Configuration File
Create bumi.config.json in your project root for project-specific settings:
{
"rules": {
"disabled": ["HEADING_NO_H1"],
"severityOverrides": {
"IMG_SUSPICIOUS_ALT": "minor"
}
},
"ignore": ["dist/**", "build/**"],
"customComponents": {
"buttons": ["CustomButton", "IconButton"],
"links": ["NavLink", "RouterLink"]
}
}
Privacy & Principles
- Local-first: All scanning happens on your machine. No code is sent externally.
- Explainable: Every diagnostic includes WCAG mapping, rationale, and limitations.
- Conservative fixes: Quick fixes are safe and reversible.
- Fast: Designed for instant feedback on save.
- Non-absolute language: We use "may help identify" and "potential issue" rather than claiming guaranteed compliance.
Important Disclaimer
This extension is designed to assist developers in identifying potential accessibility issues during development. Automated accessibility testing may help identify approximately 30% of accessibility issues. Manual testing with assistive technologies is recommended for comprehensive accessibility evaluation.
This tool does not guarantee WCAG conformance. Consult with qualified accessibility professionals for complete assessments.
Publishing to VS Code Marketplace
Prerequisites
- Create a Microsoft Account at https://account.microsoft.com
- Create an Azure DevOps Organization at https://dev.azure.com
- Generate a Personal Access Token (PAT):
- Go to Azure DevOps > User Settings > Personal Access Tokens
- Create new token with:
- Organization: All accessible organizations
- Scopes: Marketplace > Manage
- Copy and save the token securely
Publishing Steps
Install vsce (VS Code Extension Manager):
npm install -g @vscode/vsce
Create a Publisher:
vsce create-publisher flat-electronics-canada
Follow the prompts and enter your PAT when asked.
Login to your Publisher:
vsce login flat-electronics-canada
Build the Extension:
cd vscode-extension
npm install
npm run compile
Package the Extension:
vsce package
This creates a .vsix file.
Publish to Marketplace:
vsce publish
Alternative: Manual Upload
- Go to https://marketplace.visualstudio.com/manage
- Sign in with your Microsoft account
- Click "New Extension" > "Visual Studio Code"
- Upload the
.vsix file
Version Updates
To publish updates:
- Update version in
package.json
- Run
vsce publish minor (or major/patch)
Or specify exact version:
vsce publish 1.0.1
License
MIT License
Copyright (c) 2024 Flat Electronics Canada Limited
Made in Canada 🍁
For support, contact: support@bumi.ca