Common Missing Content Descriptions in Portfolio Apps: Causes and Fixes

Portfolio apps showcase work—photos, project cards, resume sections, and interactive galleries. Developers often overlook accessibility labels because the visual design feels self‑explanatory. The roo

March 17, 2026 · 4 min read · Common Issues

What causes missing content descriptions in portfolio apps

Portfolio apps showcase work—photos, project cards, resume sections, and interactive galleries. Developers often overlook accessibility labels because the visual design feels self‑explanatory. The root causes are usually technical rather than intentional:

In each scenario, the missing label survives code reviews because the visual mockup passes, leaving the app vulnerable to accessibility violations that SUSA flags during autonomous exploration.

Real‑world impact

SUSA’s persona‑based testing surface these issues early. The “elderly” and “accessibility” personas routinely encounter missing descriptions, generating FAIL verdicts that appear in the CI report.

5‑7 specific examples of how missing content descriptions manifests in portfolio apps

#ExampleSymptomWhy it matters
1Project thumbnail carousel – each slide is an with src="project-3.jpg" but no alt attribute.Screen readers announce “image” repeatedly, providing no context.Users cannot differentiate projects, breaking the app’s core navigation.
2Filter chips – “Design”, “Development”, “Video” tags rendered via Chip component without accessibilityLabel.VoiceOver reads “button, Design” – ambiguous for non‑visual users.Filtering becomes impossible without visual cues.
3Resume download button – native Android Button set with android:text="Download" but missing android:contentDescription.TalkBack says “Button”. No file type or size disclosed.Users cannot verify what they are downloading.
4Interactive project detail modalAlertDialog title omitted, relying on visual title text.Screen reader jumps straight to body content.Context loss leads to confusion about project scope.
5Social share overlay – icons for Facebook, Twitter, LinkedIn lack aria-label.Users hear “share icon” only.Unable to target specific platforms.
6Search result snippetsTextView displaying project description trimmed to 30 characters, no contentDescription fallback.Partial information read, missing key keywords.SEO and discoverability suffer.
7Video playback controls – play/pause button rendered by third‑party SDK without accessibilityLabel.VoiceOver announces “button”. No playback state communicated.Reduces video showcase usability.

SUSA’s autonomous crawler will click each carousel slide, tap every chip, and attempt to navigate modals, automatically recording missing descriptions as accessibility violations.

How to detect missing content descriptions (tools, techniques, what to look for)

  1. SUSA autonomous scan
  1. Static analysis
  1. Dynamic testing
  1. Manual verification

Detection is most effective when combined: SUSA’s autonomous exploration catches runtime gaps, while linting catches compile‑time omissions before a build reaches CI.

How to fix each example (code‑level guidance where applicable)

1. Project thumbnail carousel – add alt text

Android (XML):


<ImageView
    android:id="@+id/projectImage"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:contentDescription="@string project_3_description"
    android:src="@drawable/project_3" />

iOS (Swift):


imageView.isAccessibilityElement = true
imageView.accessibilityLabel = NSLocalizedString("project_3_description", comment: "")

React Native:


<Image
  source={{ uri: 'project-3.jpg' }}
  accessibilityLabel="Project 3: UI redesign for banking app"
  accessible={true}
/>

2. Filter chips – set accessibilityLabel on chip component

Flutter:


Chip(
  label: const Text('Design'),
  onSelected: (_) {},
  materialTapTargetSize: MaterialTapTargetSize.padded,
  // Add accessibility label
  semanticContainer: true,
  semanticsLabel: 'Filter by Design category',
)

Android (Material Chip):


Chip chip = new Chip.Builder(context)
    .setText("Design")
    .setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE)
    .setContentDescription("Filter by Design category")
    .build();

3. Resume download button – map native contentDescription

Android (Compose):


Button(
    onClick = { downloadResume() },
    contentDescription = "Download resume PDF, 1.2 MB"
) {
    Text("Download")
}

iOS (UIKit):


 UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
 [btn setTitle:@"Download" forState:UIControlStateNormal];
 btn.accessibilityLabel = @"Download resume PDF, 1.2 MB";

4. Interactive project detail modal – provide AlertDialog title via setTitle or title prop

Android (MaterialAlertDialog):


new MaterialAlertDialogBuilder(this)
    .setTitle("Project Alpha – Case Study")
    .setMessage("...")
    .show();

React Native:


<Modal transparent={true}>
  <View accessibilityLabel="Project Alpha – Case Study">
    <Text>...</Text>
  </View>
</Modal>

5. Social share overlay – add aria-label to each icon

Web (React):


<a href="https://facebook.com" aria-label="Share on Facebook">
  <FacebookIcon />
</a>

Android (SVG):


<ImageView
    android:contentDescription="Share on Facebook"
    android:src="@drawable/ic_facebook" />

6. Search result snippets – ensure contentDescription matches trimmed text or provide full description

**Android

Test Your App Autonomously

Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.

Try SUSA Free