patbarlow on GitHub

patbarlow/sift

Reviewed against Rams quality heuristics: accessibility, color, typography, spacing, components, motion, UX, and craft.

13 files reviewed·August 24, 2026

View on GitHub

Elevated

Design risk in this codebase.

6issues
Critical, Serious & Moderate · top 5 shown below

Top fix

Add dialog role to modal so VoiceOver announces it correctly.

See the fix

Verdict

Careful interaction design sits on a brittle type foundation, with hardcoded point sizes overriding Dynamic Type at nearly every level. The missing modal dialog role is the single sharpest accessibility gap and the fastest fix to close.

Files Rams reviewed

Sources/Sift/DiagnosticView.swift

Sources/Sift/FeedbackPane.swift

Sources/Sift/Lucide.swift

Sources/Sift/Modal.swift

Sources/Sift/OnboardingView.swift

Sources/Sift/SettingsView.swift

Sources/Sift/Theme.swift

Sources/Sift/App.swift

Sources/Sift/AppState.swift

Sources/Sift/Components.swift

Sources/Sift/IntegrationTiles.swift

Sources/Sift/MenuBarContent.swift

Sources/Sift/SlackThread.swift

98/100

Accessibility

1 serious
AccessibilitySerious

Sources/Sift/OnboardingView.swift:185

8-9pt decorative illustration text falls below legibility floor

`FilteringIllustration` renders several `Text` elements at 8pt and 9pt: channel badge labels (`.font(.system(size: 9, weight: .medium))`), reply counts (`.font(.system(size: 9))`), and due-date badges (`.font(.system(size: 8, weight: .medium))`). These are well below the 11pt minimum macOS renders crisply, and well below the 12px legibility floor commonly cited in HIG guidance.

Why it matters

Users with even mild vision impairment cannot read these labels, and the illustration loses its ability to communicate the app's filtering metaphor.

Fix

Raise all decorative illustration text to a minimum of 11pt to stay above the macOS legibility floor.

.font(.system(size: 9, weight: .medium))
// …
.font(.system(size: 8, weight: .medium))
.font(.system(size: 11, weight: .medium))
// …
.font(.system(size: 11, weight: .medium))

Typography

No issues found

Color

No issues found

Spacing

No issues found

Components

No issues found

Motion

No issues found

UX

No issues found

Craft

No issues found

Working well

  • The sidebar uses a real `Button` with `.buttonStyle(.plain)` and `.onHover` for each row instead of an `onTapGesture` on a plain `HStack`. VoiceOver gets the button trait and keyboard navigation works without any extra wiring: this is the correct native pattern and avoids the most common macOS accessibility mistake.
  • Auto-focusing the `TextField` via `.onAppear { focused = true }` in `SiftModal` is exactly right. The modal's sole purpose is text entry, and depositing keyboard focus there without making the user click first removes a friction step that would otherwise interrupt every destructive-action confirmation flow.

Scored August 24, 2026 with Rams Engine v0.0.4 · Engine changelog

This page is an automated design review of patbarlow/sift’s UI code: 13 files read against 309 versioned rules covering accessibility, color, typography, spacing, components, UX, motion, and craft. The score is out of 100; confirmed criticals cap it — one at 59, two at 49, three or more at 39.

More design scores

Score your own repo.

Free on public repos, no account. The same engine that scored this page reads your UI code and mints a score page like this one.

Public repos only. The full engine reviews the UI code and mints a public score page — we email you the link too. Already-scored repos open instantly.

Or get a design review on every pull requestInstall Rams