Rams MCP · The full engine, now in your coding agent
mirajchokshi on GitHub

mirajchokshi/agentacta

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

2 files reviewed·July 25, 2026

View on GitHub

Elevated

Design risk in this codebase.

5issues
Critical & Serious

Top fix

Make sidebar navigation keyboard-accessible with proper focus and labels

See the fix

Verdict

A clean multi-theme token system sits on top of a navigation that keyboard users can't operate at all. The badge and color layer looks disciplined until you check the edges, where hardcoded hex and undeclared tokens quietly break the pattern.

Files Rams reviewed

public/index.html

public/style.css

94/100

Color

3 serious
ColorSerious

public/style.css:1010

Confusion badge dark-mode override never applies in default theme

".confusion-green" ships light pastel colors (#dcfce7 background, #166534 text) with a "[data-theme=\"dark\"]" override intended to darken it. But dark is this app's unattributed default state in :root, while the file's theme switches are [data-theme="light"] and [data-theme="oled"]. The dark-theme selector for .confusion-green never matches, so the badge renders light-mode pastel colors against the dark background by default.

Why it matters

The confusion-severity badge is meant to be color-coded status information; on the default dark theme it shows washed-out pastel colors against a dark surface, degrading contrast and the color signal users rely on to read severity at a glance.

Fix

Put the dark-mode values in the unattributed default (:root) and reserve the attribute selector for the light-theme override.

.confusion-green  { background: #dcfce7; color: #166534; }
[data-theme="dark"] .confusion-green  { background: #14532d; color: #86efac; }
.confusion-green { background: #14532d; color: #86efac; }
[data-theme="light"] .confusion-green { background: #dcfce7; color: #166534; }
ColorSerious

public/style.css:617

Session project badge hardcodes color while sibling badges use tokens

".session-project" sets "color: #7fb4ff" and "background: rgba(39, 94, 182, 0.18)" directly, while its siblings ".session-model" and ".session-agent" use "color: var(--purple); background: var(--purple-soft)" and "color: var(--teal); background: var(--teal-soft)" respectively.

Why it matters

Every other status badge in this group re-themes automatically through its token when the app switches to light or oled mode; this one badge is frozen at its dark-mode blue and will clash or lose contrast when the theme changes.

Fix

Replace hardcoded hex/rgba values with the same -soft token pattern used by sibling badges.

.session-project {
  font-size: 11px;
  font-weight: 500;
  color: #7fb4ff;
  background: rgba(39, 94, 182, 0.18);
  padding: 2px 10px;
  border-radius: 10px;
}
.session-project {
  font-size: 11px;
  font-weight: 500;
  color: var(--blue);
  background: var(--blue-soft);
  padding: 2px 10px;
  border-radius: 10px;
}
ColorSerious

public/style.css:891

Settings gear, insight hover, and callout divider reference undeclared tokens

The gear icon color, the .insight-row hover background, and the .insight-callout border all reference --text-muted, --hover-bg, and --border-color respectively. None of these custom properties are declared in :root or in the theme override blocks visible in this file, which use --text-tertiary, --bg-hover, and --border-subtle instead.

Why it matters

An undeclared custom property resolves to its initial value (usually transparent or unset), so the gear icon, hover feedback, and callout divider silently disappear or render invisibly instead of the intended muted tone.

Fix

Reference only tokens that are declared in :root and the theme override blocks.

.settings-gear { color: var(--text-muted); }
.insight-row:hover { background: var(--hover-bg); }
.insight-callout { border-bottom: 1px solid var(--border-color); }
.settings-gear { color: var(--text-tertiary); }
.insight-row:hover { background: var(--bg-hover); }
.insight-callout { border-bottom: 1px solid var(--border-subtle); }
97/100

Accessibility

1 critical
AccessibilityCritical

public/index.html:32

Sidebar navigation is unusable without a mouse

The five primary nav items "Overview", "Sessions", "Insights", "Timeline", and "Files" are all rendered as plain <div class="nav-item" data-view="..."> elements with no role, no tabindex, and no keydown handler visible in the markup. There is no way to Tab to these or activate them from the keyboard.

Why it matters

Keyboard-only and screen reader users cannot switch views at all, which locks them out of the app's core navigation, not a degraded experience but a total blocker.

Fix

Use native <button> elements for interactive controls so focus, keyboard activation, and accessible role come for free.

<div class="nav-item active" data-view="overview">
  <svg .../>
  <span>Overview</span>
</div>
<button class="nav-item active" data-view="overview" type="button">
  <svg .../>
  <span>Overview</span>
</button>

Get this score on every PR.

Rams reviews each pull request on your repo and posts inline one-click fixes — about a minute per review.

Install Rams free
98/100

Typography

1 serious
TypographySerious

public/index.html:9

Inter and JetBrains Mono load from Google's CDN, not self-hosted

The <head> loads "Inter" and "JetBrains Mono" via a fonts.googleapis.com stylesheet link rather than self-hosted font files served alongside style.css.

Why it matters

The extra DNS lookup and round trip to a third-party origin delays when the intended typeface paints, so text renders in a fallback font and reflows once Inter/JetBrains Mono arrive.

Fix

Self-host font files and reference them locally to remove the third-party round trip.

<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/fonts/fonts.css">

Spacing

No issues found

Components

No issues found

Motion

No issues found

UX

No issues found

Craft

No issues found

Working well

  • The badge system (.badge-message, .badge-user, .badge-assistant, .badge-tool_call) consistently pairs each semantic color with its own -soft background token, keeping status color coded and theme-aware in one place, which is exactly what the session-model and session-agent badges do correctly.
  • The three-theme token architecture (:root, [data-theme="light"], [data-theme="oled"]) cleanly remaps the full palette per theme rather than inverting values, which is the right way to build multi-theme color systems.
  • Icon-only buttons like "#theme-toggle", "#settings-btn", and "#cmdkBtn" all carry both aria-label and title, giving screen reader and mouse users a clear name for controls that have no visible text.

Scored July 25, 2026 with Rams Engine v0.0.3 · Engine changelog
First scored July 22, 2026: 59/100. This rescore on v0.0.3: 59/100.

This page is an automated design review of mirajchokshi/agentacta’s UI code: 2 files read against 291 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