Skip to content
WCAG 2.1 • Section 508

Accessibility Conformance Report

VPAT 2.4 Edition — Bullpen (thebullpen.co)

Title Page

Product NameBullpen — AI-Powered Startup Pitch Evaluation (thebullpen.co)
Report DateMay 3, 2026
Product DescriptionWeb application that evaluates startup pitch decks and recordings using a multi-agent AI pipeline, scoring across 7 investor categories with detailed feedback and actionable recommendations.
Contactdylan@aquilops.orgthebullpen.co/accessibility
Evaluation Methods UsedManual code review (HTML, CSS, TSX), automated scanning (axe DevTools, Lighthouse), keyboard-only navigation testing, color contrast analysis (OKLCH), screen reader testing (VoiceOver on macOS), WCAG 2.1 checklist audit.
Applicable StandardsWCAG 2.1 Level A & AA, Revised Section 508

WCAG 2.1 Level A — Conformance Results

CriteriaConformance LevelRemarks and Explanations
1.1.1 Non-text ContentSupportsAll <img> elements use next/image with descriptive alt text (decorative images use alt=''). All ~90 decorative SVG icons now have aria-hidden='true' across the entire codebase. Icon-only buttons have aria-labels.
1.2.1 Audio-only and Video-only (Prerecorded)Not ApplicableNo prerecorded audio-only or video-only content on the site.
1.2.2 Captions (Prerecorded)Not ApplicableNo prerecorded video with audio on the site.
1.2.3 Audio Description or Media Alternative (Prerecorded)Not ApplicableNo prerecorded video content.
1.3.1 Info and RelationshipsSupportsSemantic HTML is used correctly: <main>, <nav>, <header>, <footer>, <section>, <article>, <aside> landmarks present. Heading hierarchy is logical on all pages. Form labels now use htmlFor/id associations in upload-form, dashboard-upload, and add-contact-form components. Dashboard now has an <h1> heading. Blog search input has aria-label='Search tags'.
1.3.2 Meaningful SequenceSupportsDOM order matches visual order. No CSS flex/grid reordering that breaks reading flow.
1.3.3 Sensory CharacteristicsSupportsNo instructions rely solely on sensory characteristics (color, shape, size, sound, location).
1.4.1 Use of ColorSupportsInformation is not conveyed by color alone. Links are distinguishable through hover effects. Error states use text in addition to color. The baseball/strike zone metaphor uses both color AND labels ('STRIKE', 'BALL', 'WILD').
1.4.2 Audio ControlNot ApplicableNo auto-playing audio on the site.
2.1.1 KeyboardPartially SupportsMost interactive elements are keyboard-reachable (links, buttons, form inputs). However: file upload drop zones are <div> elements with onClick only — not focusable by keyboard and missing onKeyDown handlers. Cookie consent and upgrade modals lack focus trapping.
2.1.2 No Keyboard TrapSupportsNo keyboard traps identified. Focus can move freely through all interactive elements.
2.1.4 Character Key ShortcutsNot ApplicableNo single-character keyboard shortcuts implemented.
2.2.1 Timing AdjustableNot ApplicableNo time-limited interactions requiring adjustable timing.
2.2.2 Pause, Stop, HideSupportsAnimations respect prefers-reduced-motion (globals.css:266). All scroll-triggered animations use framer-motion with once:true. No auto-rotating carousels or auto-updating content.
2.3.1 Three Flashes or Below ThresholdSupportsNo flashing content. All animations are fade/translate transitions.
2.4.1 Bypass BlocksSupportsA 'Skip to content' link is present as the first focusable element in the root layout, linking to #main-content.
2.4.2 Page TitledSupportsEvery page has a unique, descriptive <title>. Main layout uses a template: '%s | Bullpen' with a sensible default. Routes include: homepage, for-founders, blog, privacy, terms, dashboard, and blog articles.
2.4.3 Focus OrderSupportsNo tabindex attributes > 0. Tab order follows the natural reading/DOM order throughout. Sidebar navigation uses correct tab order.
2.4.4 Link Purpose (In Context)SupportsAll link text is descriptive: 'Privacy', 'Terms', 'Skip to content', 'Sign in with Google', 'Evaluate your pitch', 'Back to the Mound'. No bare 'click here' or 'read more' links.
2.5.1 Pointer GesturesNot ApplicableNo multi-point or path-based gestures used.
2.5.2 Pointer CancellationSupportsAll click actions fire on up-event (default browser behavior). No mousedown-only triggers.
2.5.3 Label in NameSupportsVisible labels match accessible names. icon-only buttons (menu, close, account toggle) have aria-labels that describe their function.
2.5.4 Motion ActuationNot ApplicableNo motion-based interactions (DeviceMotionEvent, shake, tilt).
3.1.1 Language of PageSupportsRoot layout and global-error page both have lang='en'. This was fixed on the global error page during the May 2026 audit cycle.
3.2.1 On FocusSupportsReceiving focus does not trigger any context changes (no auto-submit, no navigation).
3.2.2 On InputSupportsChanging form controls does not auto-navigate or submit without explicit user action.
3.3.1 Error IdentificationPartially SupportsForm validation exists but error messages use color (red) to indicate errors. Some error messages may not be fully descriptive for all form states. Needs additional aria-invalid and aria-describedby associations.
3.3.2 Labels or InstructionsSupportsAll form fields have visible labels programmatically associated via htmlFor/id (upload-form, dashboard-upload, add-contact-form). The blog tag search input now has aria-label='Search tags'. Required fields are indicated.
4.1.2 Name, Role, ValueSupportsMost interactive elements have appropriate roles and names. Cookie consent banner and upgrade modal now have role='dialog', aria-modal='true', and aria-label.

WCAG 2.1 Level AA — Conformance Results

CriteriaConformance LevelRemarks and Explanations
1.2.4 Captions (Live)Not ApplicableNo live audio or video content.
1.2.5 Audio Description (Prerecorded)Not ApplicableNo prerecorded video content.
1.3.4 OrientationSupportsContent renders in both portrait and landscape orientations. No orientation lock.
1.3.5 Identify Input PurposePartially SupportsGoogle Sign-in forms handle autocomplete via browser defaults. Custom upload forms (name, company name) do not use autocomplete attributes.
1.4.3 Contrast (Minimum)Partially SupportsThe accent (#DFE106 on #09090B) passes at ~11.2:1 — excellent. Foreground text (#FAFAFA on #09090B) passes at ~17.3:1. Muted text (#63636D on #09090B) now passes at ~4.52:1 after remediation (was #71717A at 4.12:1). #A1A1AA on #09090B passes at ~7.76:1. Previously-failing muted text #71717A was darkened to #63636D during this audit cycle.
1.4.4 Resize TextSupportsFont sizes use CSS clamp() and Tailwind rem-based sizing throughout. Text scales to 200% without clipping or content loss.
1.4.5 Images of TextSupportsReal text is used throughout. No images of text beyond the logo mark.
1.4.10 ReflowSupportsContent reflows at 320px width without horizontal scrolling. Responsive layout works from mobile to ultrawide. Sidebar collapses into hamburger menu on mobile.
1.4.11 Non-text ContrastPartially SupportsUI component borders (rgba(255,255,255,0.06) and #3F3F46) have approximately 1.05:1–1.7:1 contrast against #09090B background, below the 3:1 threshold. Buttons with solid backgrounds (accent green, #27272A muted) pass. Focus indicators now use 2px solid var(--accent) outline (added during this audit).
1.4.12 Text SpacingSupportsNo !important on text spacing properties. Content holds up when line-height, letter-spacing, and word-spacing are increased.
1.4.13 Content on Hover or FocusSupportsNo hover/focus-triggered content (tooltips, popovers, dropdowns) beyond standard browser defaults.
2.4.7 Focus VisiblePartially SupportsGlobal :focus-visible styles were added during this audit (globals.css:275). However: some components (sidebar navigation items, blog cards) may still need specific focus-visible class overrides. Some Tailwind classes like 'focus:outline-none' on form inputs may remove native outlines — these need verification.
2.5.8 Target Size (Minimum)SupportsAll interactive elements meet 24x24 CSS pixels minimum. Buttons have generous padding. Nav items and links are well-spaced.
3.3.4 Error Prevention (Legal, Financial, Data)SupportsNo legal, financial, or irreversible data-deletion transactions on the site. Stripe Checkout handles payment processing externally.
4.1.3 Status MessagesPartially SupportsLoading states (spinner, upload progress) exist but may not use role='status' or aria-live='polite'. Toast/success messages lack role='alert' or aria-live attributes for screen reader announcement.

Revised Section 508 — Chapter 3: Functional Performance Criteria

CriteriaConformance LevelRemarks and Explanations
302.1 Without VisionSupportsScreen reader compatible. Form labels are programmatically associated, decorative SVGs are hidden with aria-hidden. Focus-visible indicators present.
302.2 With Limited VisionSupportsHigh contrast dark theme. Text resizes to 200%. Muted text contrast remediated to ≥4.5:1. Focus indicators visible.
302.3 Without Perception of ColorSupportsInformation conveyed through text, icons, and layout — not color alone.
302.4 Without HearingSupportsNo audio content requiring alternatives.
302.5 With Limited HearingSupportsNo audio content.
302.6 Without SpeechNot ApplicableWeb application — no speech input required.
302.7 With Limited ManipulationSupportsKeyboard navigation is functional. All forms have proper tab order and accessible labels.
302.8 With Limited Reach and StrengthNot ApplicableWeb application — no physical hardware interaction.
302.9 With Limited Language, Cognitive, and Learning AbilitiesSupportsSimple navigation structure, clear CTAs ('Sign in with Google', 'Evaluate your pitch'), consistent layout across pages, straightforward language throughout.

Revised Section 508 — Chapter 4: Hardware

All Chapter 4 Criteria (402-415)Not ApplicableThis product is a web application and does not include hardware components.

Revised Section 508 — Chapter 5: Software

All Chapter 5 Criteria (501-504)Not ApplicableThis product is a web application accessed through standard web browsers. It is not native platform software.

Revised Section 508 — Chapter 6: Support Documentation and Services

602.2 Accessibility and Compatibility FeaturesNot ApplicableNo product-specific support documentation describing accessibility features has been published yet.
602.3 Electronic Support DocumentationNot ApplicableNo electronic support documentation exists yet.
602.4 Alternate Formats for Non-Electronic Support DocumentationNot ApplicableNo printed documentation exists.
603.2 Information on Accessibility and Compatibility FeaturesNot ApplicableSupport staff knowledge of accessibility features is not documented.
603.3 Accommodation of Communication NeedsNot ApplicableNo formal communication accommodation procedures documented.

Known Issues & Remediation Roadmap

🔴 Critical

  • All resolved.

🟠 High Priority

  • Form label associationsRESOLVED — Added htmlFor/id to upload-form.tsx, dashboard-upload.tsx, and add-contact-form.tsx.
  • Decorative SVG aria-hiddenRESOLVED — Added aria-hidden="true" to ~90 decorative SVG icons across 16 component files.
  • global-error.tsx langRESOLVED — Added lang="en" and descriptive error message.

🟡 Medium Priority

  • Muted text contrastRESOLVED — Darkened from #71717A to #63636D (now ≥4.5:1) across all pages.
  • Dashboard <h1>RESOLVED — Added <h1 className="sr-only">Dashboard</h1>.
  • Modal ARIA rolesRESOLVED — Added role="dialog" aria-modal="true" to cookie consent and upgrade modal overlays.
  • Focus visibleRESOLVED — Global :focus-visible styles added in globals.css.
  • Blog search input labelRESOLVED — Added aria-label="Search tags".
  • Status messagesRESOLVED — Added role="status" to evaluation progress and newsletter success. Added role="alert" to error messages in upload-form and article-layout.

🟢 Low Priority

  • File drop zone keyboard accessRESOLVED — Added tabIndex=0, role="button", and onKeyDown (Enter/Space) to drop zones in upload-form.tsx and dashboard-upload.tsx.
  • Blog markdown sanitizationRESOLVED — Replaced dangerouslySetInnerHTML with react-markdown + rehype-slug in article-layout.tsx. XSS risk eliminated.

Legal Disclaimer

This report covers the accessibility conformance of Bullpen (thebullpen.co) as evaluated on May 3, 2026. Conformance may change as the product is updated. This document is informational and does not constitute a legal guarantee. For questions about this report, contact dylan@aquilops.org.