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

agasocial/video-generator-microsaas

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

30 files reviewed·July 31, 2026

View on GitHub

Low

Design risk in this codebase.

7issues
Serious & Moderate · top 5 shown below

Top fix

Replace raw error codes with a plain-language explanation for users

See the fix

Verdict

Auth flow engineering is solid, but every quiet moment leaks: raw error codes, silent waits, English text in translated skeletons. Fix the user-facing error message first, it's the fastest way to stop confusing and alarming people mid-flow.

Files Rams reviewed

app/[locale]/auth/callback/page.tsx

app/[locale]/auth/error/page.tsx

app/[locale]/auth/login/page.tsx

app/[locale]/auth/reset-password/page.tsx

app/[locale]/auth/sign-up-success/page.tsx

app/[locale]/auth/sign-up/page.tsx

app/[locale]/credits/page.tsx

app/[locale]/generate/page.tsx

app/[locale]/layout.tsx

app/[locale]/profile/page.tsx

app/auth/error/page.tsx

app/auth/login/page.tsx

app/auth/sign-up-success/page.tsx

app/auth/sign-up/page.tsx

app/credits/page.tsx

app/layout.tsx

app/profile/page.tsx

app/page.tsx

app/[locale]/page.tsx

app/globals.css

components/credit-packages.tsx

components/image-cropper.tsx

components/language-switcher.tsx

components/navigation.tsx

components/payment-success-handler.tsx

components/stripe-buy-button.tsx

components/theme-injector.tsx

components/theme-selector.tsx

components/ui/accordion.tsx

components/ui/alert-dialog.tsx

96/100

Components

2 serious
ComponentsSerious

app/[locale]/auth/login/page.tsx:254

Login page's loading skeleton flashes English text for every locale

In app/[locale]/auth/login/page.tsx, the Suspense fallback hardcodes `<CardTitle className="text-2xl">Sign in</CardTitle>` and "Enter your credentials to access your account", while the loaded LoginForm uses `t('signIn')` and `t('signInDesc')`. Non-English users briefly see English copy before the translated form mounts.

Why it matters

Every page load flashes the wrong language for non-English users, which reads as a broken or half-translated app rather than a deliberate loading state.

Fix

Pull the fallback strings from the same translation keys used in the loaded form.

<CardTitle className="text-2xl">Sign in</CardTitle>
              <CardDescription>
                Enter your credentials to access your account
              </CardDescription>
<CardTitle className="text-2xl">{t('signIn')}</CardTitle>
              <CardDescription>
                {t('signInDesc')}
              </CardDescription>
ComponentsSerious

app/[locale]/auth/login/page.tsx:209

Google button duplicates its own variant's default styling

The Google sign-in Button in app/[locale]/auth/login/page.tsx sets `variant="default"` and then adds `className="w-full bg-primary text-primary-foreground hover:bg-primary/90"`, which is the same background, text color, and hover state the default variant already provides.

Why it matters

If the default button token changes later (color, hover opacity), this instance won't pick it up because the values are pinned locally, causing silent visual drift between this button and every other default button in the app.

Fix

Remove the redundant color classes and let the default variant supply styling, keeping only the layout override (w-full).

variant="default"
                className="w-full bg-primary text-primary-foreground hover:bg-primary/90"
variant="default"
                className="w-full"
98/100

Color

1 serious
ColorSerious

app/[locale]/auth/login/page.tsx:150

Email field's white background breaks form field consistency

In app/[locale]/auth/login/page.tsx, the email Input uses `className={error ? "border-destructive border" : "border bg-white text-primary hover:bg-white/80"}` while the adjacent password Input two fields below only uses `className={error ? "border-destructive border" : "border"}`. The email field gets a hardcoded white fill and hover state the password field doesn't have.

Why it matters

Two inputs in the same form render with visibly different fills, which reads as a bug rather than a design choice and undermines trust in the form right before a sign-in submission.

Fix

Drop the one-off bg-white/hover override and let both inputs share the same default input styling.

className={error ? "border-destructive border" : "border bg-white text-primary hover:bg-white/80"}
className={error ? "border-destructive border" : "border"}

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

Motion

1 serious
MotionSerious

app/[locale]/auth/callback/page.tsx:63

Auth callback shows static text with no progress feedback

The callback screen at app/[locale]/auth/callback/page.tsx renders only `<span>{t('signingIn')}</span>` inside a centered flex container while the async session exchange runs in the background. There is no spinner, skeleton, or animated indicator, so the screen looks frozen during the redirect wait.

Why it matters

Users can't tell if the app is working or has stalled, and on a slow network they may reload or navigate away, aborting the auth flow mid-redirect.

Fix

Pair the loading text with a visible spinner so async work reads as in-progress rather than stuck.

<div className="flex items-center justify-center min-h-screen">
      <span>{t('signingIn')}</span>
    </div>
<div className="flex items-center justify-center min-h-screen gap-2">
      <Loader2 className="h-4 w-4 animate-spin" />
      <span>{t('signingIn')}</span>
    </div>
98/100

UX

1 serious
UXSerious

app/[locale]/auth/error/page.tsx:29

Raw error code shown to users with no explanation of what happened

On app/[locale]/auth/error/page.tsx, when a query error is present the description renders `${tGenerate("errorLabel")} ${error}`, a raw code like `callback_error` with no plain-language explanation. The only recovery action is a "Sign in" button; there's no retry, support link, or context for what went wrong.

Why it matters

Users hitting an OAuth failure see a code they don't understand and one path forward, so anyone whose error isn't fixed by re-signing-in (expired session, blocked provider) has no next step.

Fix

Map known error codes to human-readable messages and keep the raw code as secondary detail, not the primary message.

{error ? `${tGenerate("errorLabel")} ${error}` : tGenerate("authenticationErrorDesc")}
{error ? tGenerate(`errorMessages.${error}`, { fallback: tGenerate("authenticationErrorDesc") }) : tGenerate("authenticationErrorDesc")}

Accessibility

No issues found

Typography

No issues found

Spacing

No issues found

Craft

No issues found

Working well

  • Both submit buttons ("signInButton" and the Google button) disable during isLoading/isGoogleLoading and swap in a Loader2 spinner with translated loading text, giving clear async feedback and preventing double-submit.
  • Wrapping the OAuth callback logic in try/catch with a fallback redirect to the login page and an error query param gives users a recovery path instead of a stuck blank screen when the session exchange fails.
  • Using asChild on the Button wrapping the sign-in Link keeps the action a single semantic anchor with button styling instead of nesting two interactive elements.

Scored July 31, 2026 with Rams Engine v0.0.3 · Engine changelog

This page is an automated design review of agasocial/video-generator-microsaas’s UI code: 30 files read against 291 versioned rules covering accessibility, color, typography, spacing, components, UX, motion, and craft. The score is out of 100; any confirmed critical issue caps it at 59.

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