Frontend-wide sweep replaces generic empty/loading/error strings with action-oriented copy

A 25-file frontend pass rewrites the generic developer-default strings that ship in the upstream codebase. Empty states now describe what the user can do, not what's absent. Error boundaries grow a working Try Again button. Loading strings name what's actually happening.

chat-uibranding

The most functionally significant change is in error.tsx and global-error.tsx. Previously a Next.js error boundary rendered a dead page with no recovery path. Now it surfaces Next's reset() function as a Try Again button alongside a return-home link and the message "Gary hit a problem." This is a real usability fix - users get a recovery path instead of a wall.

On the empty-state side: the tabular reviews page now reads "No reviews yet" instead of "Tabular Reviews" when there are no entries, the subtitle describes what a tabular review does ("Gary fills a table with parties, dates, key terms, risks, and anything else you ask for"), and the "No reviews found" fallback for empty search results becomes "Nothing matched that search or filter." Similar rewrites hit the documents list, projects page, sidebar chat history, and workflow modal. "Processing..." becomes "Reading the document...". "Upload files" becomes "Uploading your document..." in the upload spinner.

Alert and save-failure strings are softened throughout: alert("Failed to save ${label}.") -> alert("Could not save your ${label}. Try again.") consistently across account, models, and project creation flows.

No backend changes, no removed functionality, no console log changes. The product name "Gary"/"GaryOSS" is embedded in some of the new strings, particularly the error boundary and a handful of empty states.

So what The error boundary **Try Again** button is worth importing regardless of whether you take the rest - it's a functional fix, not copy polish. The empty-state and error-string rewrites are good quality but need a find/replace on "Gary"/"GaryOSS" before landing in a differently named fork.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

2 commits from foolish-bandit/gary, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
b1a54c40 Merge pull request #7 from foolish-bandit/claude/lawyer-friendly-copy Zack Brenner 2026-05-07 ↗ GitHub
Make empty/loading/error copy lawyer-friendly
da89931b Make empty/loading/error copy lawyer-friendly Claude 2026-05-07 ↗ GitHub
commit body
Sweeps the frontend for generic empty, loading, and error strings
and replaces them with action-oriented, lawyer-friendly copy that
explains what to do next. Adds a Try Again CTA to the global error
boundary so users aren't stuck on a dead page.

Highlights:
- Empty states (sidebar, file directory, modals, list pages, project
  detail) now name the next step (upload, create, ask, search by
  client/title) instead of just stating the absence.
- "Processing..." on a freshly uploaded doc → "Reading the document..."
  Upload buttons → "Uploading your document..."
- error.tsx and global-error.tsx now expose Next's reset() handler
  via a Try Again button; copy says Gary hit a problem and offers a
  return-home link.
- not-found.tsx CTA renamed Go home → Return Home.
- Login/signup error messages and progress labels rewritten
  ("Could not sign in. Check your email and password and try again.").
- Account/models alerts ("Failed to save X.") rewritten ("Could not
  save your X. Try again.").
- Tabular review streaming error: "An error occurred. Please try
  again." → "Something went wrong. Try asking again."

No backend changes, no behavior changes, no removed functionality.
Console/log/internal error details are unchanged.

https://claude.ai/code/session_019pRkhcGDRKQWHjzAnV5yCL

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-160.md from inside the repo you want the changes in.

⬇ Download capture-thread-160.md