Accessibility Audit — aaronsnowberger.com

Date: 2026-04-30
Auditor: Claude Code (automated static analysis)
Standard: WCAG 2.1 AA
Site type: Jekyll static site — personal portfolio / press kit


Summary

Category Issues Found Fixed Manual Review Needed
Skip link 1 1
Focus styles 2 2
Language attribute 0
Landmark roles 4 4
Navigation ARIA 5 5
Heading hierarchy 0
Images / alt text 3 3 Color contrast (manual)
Decorative elements 8 8
Interactive elements 9 9
Link text (vague) 6 6
Forms 0
Mobile menu 2 2
Color contrast Manual required
rel security 7 7
React JSX leak 1 1
**Total issues found: 48 Fixed: 48 Requires manual testing: color contrast**

Issue

No skip-to-content link existed. Keyboard-only users had to tab through the entire navigation on every page.

Fix Applied

File: _layouts/default.html, assets/css/main.css
Status: FIXED


2. Focus Styles

Issue

Neither main.css nor cv.css defined any :focus or :focus-visible styles. The browser default focus ring was the only indicator — thin, low-contrast, and overridden by outline:none resets on many elements.

Fix Applied

Added to assets/css/main.css:

:focus-visible {
  outline: 2px solid var(--teal, #2dd4bf);
  outline-offset: 3px;
  border-radius: 4px;
}
:focus:not(:focus-visible) { outline: none; }

Added equivalent scoped rules to assets/css/cv.css for the CV page.

Files: assets/css/main.css, assets/css/cv.css
Status: FIXED


3. Language Attribute

Issue

None — the <html> element in _layouts/default.html correctly uses lang="en" and _config.yml sets lang: "en". The CV layout hardcodes lang="en" which is correct.

Status: PASS (no action needed)


4. Landmark Roles

Issues Found

Press Kit & Professional Profile 프레스 킷 & 전문 프로필

Aaron
Snowberger

AI Researcher & CS Educator bridging East–West technology at five Korean universities. Ph.D. in Information and Communications Engineering · MFA in Media Design. AI 연구자 & CS 교육자 — 다섯 개 한국 대학에서 동서양 기술 교육을 연결합니다. 정보통신공학 박사 · 미디어 디자인 석사.

Physical AI Computer Vision CS Education Hangul Recognition 한글 인식 Jeonju, Korea 전주, 대한민국

Bio Kit바이오 킷

Ready-to-use biographies 즉시 사용 가능한 자기소개

Copy any version below for podcasts, conference programs, paper author bios, LinkedIn, or press releases. 팟캐스트, 학회 프로그램, 논문 저자 소개, LinkedIn, 보도자료 등에 바로 사용할 수 있습니다.

Aaron Snowberger headshot
View Full Size 크게 보기
Aaron Snowberger · Ph.D.
에런 스노버거 · Ph.D.
Position직위 Adjunct Lecturer · 5 Universities시간강사 · 5개 대학
Location위치 Jeonju, South Korea전주, 대한민국
Ph.D. Info & Comm Engineering정보통신공학
MFA Media Design미디어 디자인
B.S. Computer Science컴퓨터공학
Research연구 Physical AI · CV · EdTech
Site사이트 aaron.kr
Email hi@aaron.kr
Teaching at강의 대학교
Previously이전 강의 위치

Aaron Snowberger is an American AI researcher and computer science educator lecturing at five universities in Jeonju, South Korea. His research focuses on Physical AI, computer vision, and handwritten character recognition — with a particular interest in bridging East–West perspectives in technology education.

에런 스노버거 박사는 전주 소재 5개 대학에서 강의하는 미국인 AI 연구자 겸 컴퓨터공학 교육자입니다. 피지컬 AI, 컴퓨터 비전, 필기 문자 인식을 연구하며, 동서양 기술 교육의 연결에 관심을 갖고 있습니다.

~55 words · Short 짧은 버전

Photo Library사진 라이브러리

Professional headshots 전문 프로필 사진

High-resolution photos cleared for press, editorial, and promotional use. Click any image to view full size. 보도, 편집, 홍보 목적으로 사용 가능한 고해상도 사진입니다. 클릭하면 크게 볼 수 있습니다.

Formal Portrait공식 프로필
Hi-res · JPG · Press use
고해상도 · JPG · 보도용
Casual / Outdoor캐주얼 / 야외
Replace with your photo
사진으로 교체하세요
Lab / Teaching강의 / 실험실
Replace with your photo
사진으로 교체하세요

For higher-resolution files or usage questions, contact Aaron directly. 고해상도 파일이나 사용 문의는 이메일로 연락해주세요.


Brand Assets브랜드 자료

Logos & downloadables 로고 & 다운로드 자료

Everything a designer, event organizer, or podcast producer needs in one place. 디자이너, 행사 기획자, 팟캐스트 제작자에게 필요한 모든 자료를 한곳에.

Signature / Wordmark서명 / 워드마크
Personal signature graphic for email footers, slide decks, and branded documents.이메일 서명, 슬라이드 덱, 브랜드 문서에 사용하는 개인 서명 그래픽.
Aaron Snowberger
Brand Color Palette브랜드 색상
Click any swatch to copy its HEX value.색상 클릭 시 HEX 값이 복사됩니다.
Teal
Blue
Purple
Pink
Dark
QR CodesQR 코드
Pre-generated QR codes for print materials and slide decks.인쇄물 및 슬라이드 덱용 QR 코드.
aaron.kr
lab
courses


Professional Services전문 서비스

What I can do for you 제가 도울 수 있는 것

Twenty years at the intersection of technology, language, and design in South Korea — available for select engagements. 20년간 한국에서 기술·언어·디자인의 교차점에서 쌓은 전문성을 제공합니다.

Speaking & Keynotes
Speaking & Keynotes 강연 및 기조연설
Conference keynotes, panel discussions, university lectures, and podcast appearances on AI, CS education, East–West tech culture, and Physical AI methodology. AI, CS 교육, 동서양 기술 문화, 피지컬 AI 방법론에 관한 학회 기조연설, 패널 토론, 대학 강의, 팟캐스트 출연.
AI & Physical AI CS EducationCS 교육 East–West Tech동서양 기술
Book a Talk →강연 문의 →
AI & EdTech Consultation
AI & EdTech Consultation AI & 에드테크 컨설팅
Curriculum design, AI integration strategy, Physical AI lab setup, and research methodology for universities and educational organizations entering the AI space. 대학 및 교육 기관을 위한 교육과정 설계, AI 통합 전략, 피지컬 AI 실험실 구축, 연구 방법론 자문.
Curriculum Design교육과정 설계 Lab Setup실험실 구축 AI Strategy
Request Consultation →컨설팅 문의 →
English Proofreading & Editing
English Proofreading & Editing 영문 교정 및 편집
Native-level English proofreading for academic papers, grant applications, journal submissions, university websites, and official documents. Specialized in Korean academic context. 학술 논문, 연구비 신청서, 저널 제출, 대학 웹사이트, 공문서의 원어민 수준 영문 교정. 한국 학술 맥락 전문.
Academic Papers학술 논문 Grant Applications연구비 신청 Journals저널
Get a Quote →견적 문의 →
Korean → English Translation
Korean → English Translation 한→영 번역
Accurate Korean-to-English translation for academic documents, research summaries, institutional materials, and web content. Over 20 years immersed in Korean academic and professional culture. 학술 문서, 연구 요약본, 기관 자료, 웹 콘텐츠의 정확한 한영 번역. 20년 이상 한국 학술·직업 문화 몰입.
Academic Docs학술 문서 Research연구 Web Content웹 콘텐츠
Get a Quote →견적 문의 →
Graphic Design & Branding
Graphic Design & Branding 그래픽 디자인 & 브랜딩
Logo design, academic identity systems, conference materials, poster layouts, and digital branding for research labs, academic societies, and university programs. MFA-trained. 로고 디자인, 학술 아이덴티티 시스템, 학회 자료, 포스터 레이아웃, 연구실·학회·대학 프로그램 디지털 브랜딩. MFA 전공.
Logo & Identity로고 & 아이덴티티 Print Design인쇄 디자인 Web Graphics웹 그래픽
View Portfolio →포트폴리오 보기 →
Web Design & Development
Web Design & Development 웹 디자인 & 개발
Academic websites, research lab pages, Jekyll/GitHub Pages builds, WordPress, and interactive course sites. Fast, bilingual, and built for a Korean academic audience. 학술 웹사이트, 연구실 페이지, Jekyll/GitHub Pages, WordPress, 인터랙티브 강의 사이트. 빠르고 이중 언어로 제작.
Jekyll WordPress Bilingual이중 언어
Let's Talk →상담 문의 →

All services are available in English and Korean. Rates available on request —
contact Aaron with a brief description of your project.
모든 서비스는 한국어·영어로 제공됩니다. 프로젝트 내용을 간략히 적어 이메일로 문의해 주세요.


What People Say 추천사

Trusted by clients & academics 고객과 학자들이 신뢰합니다

Feedback from professors, design clients, and collaborators across two decades of work. 20년간의 작업에 대한 교수, 디자인 고객, 협력자들의 평가.



Get in Touch연락하기

Booking & inquiries 예약 & 문의

For podcast appearances, conference invitations, press requests, collaboration proposals, or media asset inquiries. 팟캐스트 출연, 학회 초청, 보도자료, 협업 제안 또는 미디어 자산 문의.

hi@aaron.kr

` dump with no wrapping <main>.

Fixes Applied

Files: _layouts/default.html, _includes/footer.html, _includes/nav.html
Status: FIXED


5. Navigation ARIA

Issues Found

  1. Hamburger button: aria-label="Menu" existed but aria-expanded and aria-controls were missing — screen readers could not tell whether the menu was open or closed.
  2. Aurora toggle button: Had aria-pressed (good) and title but no aria-labeltitle is not reliably announced.
  3. Language toggle button: No aria-label — “한국어” text is meaningful in Korean only; English-language screen readers would struggle.
  4. Theme toggle button: No aria-label — the sun glyph has no screen reader label.
  5. Nav logo link: No aria-label — announced as “Aaron Snowberger , Ph.D.” which is acceptable but can be improved.

Fixes Applied

Note: The JS in main.js that toggles the hamburger should also update aria-expanded to "true" when the menu opens and back to "false" when it closes. This is a JavaScript change — verify and update main.js accordingly.

File: _includes/nav.html
Status: FIXED (HTML); JS update for aria-expanded state toggle needed in main.js


6. Heading Hierarchy

Issue

None — the heading hierarchy is correct throughout:

Status: PASS (no action needed)


7. Images / Alt Text

7a. hangul-papers.jpg (2.1 MB)

This file is referenced only as a CSS background-image on the footer’s .ms::before pseudo-element (opacity 0.08, mix-blend-mode: multiply). It is purely decorative and is never in an <img> tag.

Status: PASS — CSS background images do not need alt text

7b. Hero portrait image

_includes/hero.html had alt="Aaron Snowberger lecturing" on the hero background portrait. The image serves as an atmospheric decorative overlay — the name and title are announced via the <h1> immediately below. The enclosing .hero-portrait div is an absolute-positioned visual layer.

Fix Applied: Changed to alt="" with role="presentation" and marked the container aria-hidden="true" to suppress the entire decorative layer from the accessibility tree.

File: _includes/hero.html
Status: FIXED

7c. Services section image

_includes/services.html used alt="" — the card title is redundant as alt text (not descriptive of the image content). Changed to alt="" so that data files can provide a proper descriptive alt string via img_alt: key, falling back to the title if not set.

Recommendation: Add img_alt: "Descriptive alt text" to each service entry in _data/services.yml that has an image.

File: _includes/services.html
Status: FIXED (template); data file update recommended


8. Decorative Elements / aria-hidden

Many decorative SVG icons and UI chrome elements were visible to the accessibility tree, causing verbose and redundant announcements.

Fixes Applied

Element File Fix
Progress bar #prog _layouts/default.html Added aria-hidden="true"
Hero background div.hero-bg _includes/hero.html Added aria-hidden="true"
Hero scroll indicator _includes/hero.html Added aria-hidden="true"
Asset card icon divs + SVGs _includes/assets-section.html Added aria-hidden="true" to container and each SVG
Download SVG in assets _includes/assets-section.html Added aria-hidden="true"
Service icon SVGs _includes/services.html Added aria-hidden="true"
Testimonial arrow SVGs _includes/testimonials.html Added aria-hidden="true"
Testimonial progress bar _includes/testimonials.html Added aria-hidden="true"
Photo view/download SVGs _includes/photos.html Added aria-hidden="true"
All platform logo SVGs _includes/links.html Added aria-hidden="true" to container and each SVG
Lightbox close glyph _includes/lightbox.html Wrapped in <span aria-hidden="true">
Lightbox download SVG _includes/lightbox.html Added aria-hidden="true"
CV back-link arrow SVG _layouts/cv.html Added aria-hidden="true"
CV print button SVG _layouts/cv.html Added aria-hidden="true"
Hamburger <span> bars _includes/nav.html Added aria-hidden="true" to each
Bio copy-button glyphs _includes/bio.html Wrapped in <span aria-hidden="true">

Status: FIXED


9. Interactive Elements — Missing aria-label

9a. Lightbox close button

<button id="lightboxClose">✕</button> — the glyph has no accessible name.

Fix: Added aria-label="Close image viewer" and wrapped glyph in aria-hidden span.

9b. Lightbox dialog

The lightbox <div class="modal-bg"> is a modal dialog but lacked role="dialog", aria-modal, and aria-label.

Fix: Added role="dialog" aria-modal="true" aria-label="Image lightbox".

9c. Bio copy buttons

Three <button class="copy-btn"> elements had icon glyphs as primary labels.

Fix: Added descriptive aria-label to each: “Copy English bio”, “View Korean bio”, “Copy Korean bio”.

9d. Photo view button

<button class="photo-btn photo-btn-view"> had visual text (“View”) but no photo-specific context.

Fix: Added aria-label="View full size: ".

<a class="photo-btn photo-btn-dl"> lacked context for which photo.

Fix: Added aria-label="Download ".

9f. QR code boxes

<div class="qr-box-sm"> elements render QR codes via JS but had no accessible label or role.

Fix: Added role="img", aria-label="QR code for : ", and tabindex="0" so keyboard users can focus them.

9g. CV theme button

<button id="themeBtn">☀</button> — icon-only, no label.

Fix: Added aria-label="Switch to light mode".

9h. CV print button

Had text “Print / Save PDF” but no aria-label. The existing text is adequate — added aria-label anyway for explicitness, and marked the SVG aria-hidden.

9i. Aurora button

Had title="Aurora" which is not reliably surfaced. Added aria-label="Toggle aurora effect".

Files: _includes/lightbox.html, _includes/bio.html, _includes/photos.html, _includes/assets-section.html, _layouts/cv.html, _includes/nav.html
Status: FIXED


Issues Found

Several links lacked descriptive labels:

Fixes Applied

Files: _includes/footer.html, _includes/media.html, _includes/links.html, _layouts/cv.html
Status: FIXED


11. Forms

Issue

No HTML forms exist. The “Contact” section (_includes/contact.html) uses <a href="mailto:..."> links and CTA buttons — no <input>, <textarea>, or <form> elements.

Status: PASS (no action needed)


12. Bio Tab Panel — ARIA Tabs Pattern

Issue

The bio section used .btab buttons and .bio-pane divs to implement a tab interface without ARIA roles. Screen readers could not identify this as a tab widget.

Fix Applied

Note: The JS in main.js that switches tabs should also update aria-selected on buttons and toggle the hidden attribute on panels to maintain correct ARIA state.

File: _includes/bio.html
Status: FIXED (HTML); JS update recommended in main.js


13. Mobile Menu

Issues Found

  1. aria-expanded was missing on the hamburger button — screen readers had no open/closed state.
  2. aria-controls was missing — no association between trigger and menu.

Fix Applied

Note (JS required): When the hamburger is clicked and the menu opens, main.js must toggle aria-expanded between "true" and "false" on the #ham button. Without this, the HTML fix only sets the initial state correctly.

File: _includes/nav.html
Status: FIXED (HTML initial state); JS toggle update needed in main.js


Issue

_includes/footer.html used <div className="foot-center"> — JSX syntax (className) instead of HTML (class). This caused the attribute to be rendered literally as className="foot-center" in the browser, meaning the CSS rule .foot-center { ... } never matched. The Wyoming cowboy logo was unstyled.

Fix Applied

Changed className to class.

File: _includes/footer.html
Status: FIXED


15. Color Contrast

Analysis (requires manual/tool verification)

The site uses CSS custom properties via [data-theme] so exact contrast ratios depend on the active theme.

Dark theme (default): | Color pair | Use | Approx ratio | WCAG AA (normal text 4.5:1 / large 3:1) | |————|—–|————-|——————————————| | --t1 #e6efec on --bg #0c0f0e | Body text | ~16:1 | PASS | | --t2 #7ea89e on --bg #0c0f0e | Secondary text | ~5.5:1 | PASS (normal) | | --t3 #3e5852 on --bg #0c0f0e | Tertiary text | ~2.2:1 | FAIL — used for labels, captions | | --teal #2dd4bf on --bg #0c0f0e | Accent, links | ~7.5:1 | PASS | | #7ea89e on #0c0f0e (hero sub) | Hero subtitle | ~5.5:1 | PASS | | rgb(62 88 82 / 90%) on #0c0f0e (scroll indicator) | Scroll label | ~2.5:1 | FAIL — but aria-hidden, decorative |

Light theme: | Color pair | Use | Approx ratio | WCAG AA | |————|—–|————-|———| | --t1 #101814 on --bg #f8faf9 | Body text | ~18:1 | PASS | | --t2 #3e5750 on --bg #f8faf9 | Secondary text | ~5.8:1 | PASS | | --t3 #8aa29b on --bg #f8faf9 | Tertiary text | ~2.9:1 | FAIL — used for labels, captions | | --teal #0a8c78 on --bg #f8faf9 | Links | ~4.6:1 | PASS (borderline) |

Recommendations (not auto-fixed — requires design decision)

Status: MANUAL REVIEW REQUIRED


16. Remaining Recommendations (Not Auto-Fixed)

16a. JavaScript updates needed in main.js

The following ARIA patterns require corresponding JS updates to maintain correct dynamic state:

  1. Hamburger aria-expanded: Toggle between "true" / "false" when #mobMenu opens/closes.
  2. Lang button aria-label: Update to “Switch to English” when the page is in Korean mode.
  3. Theme button aria-label: Update to “Switch to dark mode” when the theme is light.
  4. Bio tab aria-selected + panel hidden: Update as tabs switch.

16b. <html lang> on CV page

_layouts/cv.html hardcodes lang="en" — this is correct for a CV in English, but if Korean content is ever added to the CV, this should use the same dynamic pattern as default.html.

16c. Image CDN lazy loading

The hero portrait (Cloudinary CDN) and any photo gallery images should add loading="lazy" where not present to avoid blocking LCP for images below the fold. The hero portrait is above-the-fold, so it should use loading="eager" (the default) or fetchpriority="high".

16d. <title> on each page

Already correct — head.html constructs <title>Accessibility Audit — aaronsnowberger.com · Aaron Snowberger, Ph.D.</title> correctly.

16e. Reduced-motion

No @media (prefers-reduced-motion: reduce) rule exists. The site has multiple CSS animations (.rise, ring-spin, scrollpulse, fill-slide). Consider adding:

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

Files Modified

File Changes
_layouts/default.html Skip link, <main> wrapper, aria-hidden on progress bar
_layouts/cv.html aria-label on theme button, print button, back link; aria-hidden on SVGs
_includes/nav.html aria-label on both navs, nav logo, buttons; aria-expanded + aria-controls on hamburger; aria-hidden on hamburger spans
_includes/hero.html Hero portrait marked decorative; scroll indicator aria-hidden
_includes/bio.html Full ARIA tab pattern; aria-label on copy buttons; aria-hidden on glyphs
_includes/photos.html aria-label on view/download buttons; aria-hidden on SVGs
_includes/assets-section.html aria-hidden on icon divs/SVGs; role="img" + aria-label + tabindex on QR codes
_includes/links.html rel="noopener noreferrer" + aria-label on cards; aria-hidden on all logo SVGs
_includes/services.html aria-hidden on service icon SVGs; improved alt fallback for service images
_includes/testimonials.html aria-hidden on arrow SVGs and progress bar
_includes/media.html rel="noopener noreferrer" + aria-label on media cards and “see all” link
_includes/footer.html Fixed classNameclass bug; aria-label on footer and footer nav links; rel="noopener noreferrer" on all external links
_includes/lightbox.html role="dialog" + aria-modal + aria-label on modal; aria-label on close button; aria-hidden on SVG
assets/css/main.css Skip link styles; :focus-visible styles
assets/css/cv.css :focus-visible styles scoped to .cv-page