De-jargon user-facing model/API-key copy

✅ merged · #10 · foolish-bandit/gary ← foolish-bandit/gary · opened 19d ago by foolish-bandit · merged 19d ago by foolish-bandit · self · +24-24 across 4 files · ↗ on GitHub

From the PR description

Summary

Frontend-only copy cleanup. Removes the remaining user-facing developer/model/provider language so the app reads like GaryOSS - a private legal AI workspace - rather than a configurable developer tool. No identifiers, file names, MIME types, localStorage keys, env vars, or backend contracts were renamed; those carry behavior and were intentionally left alone per the brief.

A. User-facing copy changed

File Before After
account/layout.tsx tab "Models & API Keys" tab "AI configuration"
account/models/page.tsx H2 "Model Preferences" H2 "Default assistant"
account/models/page.tsx label "Tabular review model" label "Assistant for tabular reviews"
account/models/page.tsx H2 "API Keys" H2 "AI service keys"
account/models/page.tsx "You must provide your own API keys for the app to work or add your API keys into the .env file..." "GaryOSS connects to an outside AI service to answer questions. Add a service key below to enable answers, or add the keys to a .env file if you are running your own instance."
account/models/page.tsx "Title generation automatically routes to the cheapest model of whichever provider you've configured..." "Chat titles use the cheapest assistant from whichever service you have configured."
account/models/page.tsx "Anthropic (Claude) API Key" / "Google (Gemini) API Key" "Anthropic (Claude) key" / "Google (Gemini) key"
account/models/page.tsx tooltip Add a {vendor} API key to use this model Add a {vendor} key in AI configuration to use this assistant
account/models/page.tsx placeholder "Select a model" "Select an assistant"
ApiKeyMissingModal.tsx title "API key required" "GaryOSS isn't configured yet"
ApiKeyMissingModal.tsx body "You haven't added a {provider} API key yet. Add one in your account settings to use this model." "GaryOSS isn't connected to {service} yet. Open AI configuration to add a key."
ApiKeyMissingModal.tsx button "Go to account settings" "Open AI configuration"
ModelToggle.tsx title "API key missing for selected model" / "Choose model" "No key set for this assistant" / "Choose assistant"
ModelToggle.tsx aria-label "API key missing" "No key set"
ModelToggle.tsx fallback label "Model" "Assistant"

GaryOSS branding (README, root layout <title>, error/global-error titles, schema header) was already consistent before this PR - nothing else to update there.

B. Internal references intentionally left alone (and why)

These are identifiers, file names, MIME types, types, and persistent storage keys. Renaming them would either break the app or silently lose user data.

Surface Reason kept
MikeIcon JSX symbol + mike-icon.tsx filename Imported by 9 files; renaming touches the whole tree without changing what the user sees.
mikeApi.ts filename + Mike API client JSDoc header Imported as mikeApi everywhere; not user-visible.
MikeMessage, MikeChat, MikeProject, MikeDocument, MikeFolder, MikeWorkflow, MikeCitationAnnotation types Used in ~325 places across frontend and backend. Pure type names, never rendered.
application/mike-doc, application/mike-folder drag-and-drop MIME types Cross-component contract between drag sources and drop targets. Renaming requires changing every source and target atomically - risky housekeeping that's invisible to users.
mike.selectedModel localStorage key Persists user's chosen assistant across sessions. Renaming silently resets every existing user's preference.
mike-${editIdx}-${Date.now()} change ID prefix in backend/src/lib/docxTrackedChanges.ts Internal Word-doc tracked-changes ID; not user-visible.
ApiKeyField, ApiKeyMissingModal component names; apiKey... props/profile fields; claude_api_key / gemini_api_key Supabase columns Internal symbols and DB schema; touching schema is explicitly out of scope.
ModelToggle / ModelOption / MODELS / ModelProvider exports and the model field on MikeMessage Code-level naming for the assistant picker; only the user-visible labels were changed.

C. Technical settings still reachable but de-emphasized

These remain functional but no longer announce themselves with developer language:

  • /account/models - the route URL is unchanged (a redirect would be a separate PR). The tab label is now "AI configuration"; the H2s are "Default assistant" and "AI service keys"; vendor names ("Anthropic (Claude)", "Google (Gemini)") are kept on the key fields because the user still needs to know which key matches which assistant when they paste it in.
  • ModelToggle dropdown in ChatView - still shows model names ("Claude Opus 4.7", "Gemini 3.1 Pro"). PR #6 already hid it from the home empty state. The trigger title is now "Choose assistant" / "No key set for this assistant".
  • ApiKeyMissingModal - still surfaces when a user picks an assistant they have no key for, but now reads "GaryOSS isn't configured yet" with an "Open AI configuration" CTA.

Provider / API / model language status

  • Eliminated from normal UI: "API key", "API key required", "API key missing", "Choose model", "Select a model", "Model Preferences", "Models & API Keys", standalone "Model" fallback, "provider" prose in body copy.
  • Kept (vendor names, not jargon): "Anthropic (Claude)" and "Google (Gemini)" remain on the configuration page key fields; "Claude" / "Gemini" remain in the assistant dropdown labels (real product names the lawyer needs to recognise to paste the right key).
  • Dropped silently: RAG, vector, embedding, token, BYOK, OpenRouter - none of these appeared in user-facing UI to begin with; final sweep is empty.

Backend files touched

None. git diff main..HEAD -- backend/ is empty.

Final grep summary

Run after the changes:

=== User-facing 'API key' / 'API Key' in JSX/strings === (none)
=== User-facing 'Model' / 'model' in JSX text === (none)
=== Mike (user-facing only - JSX text/string literals) === (none)
=== MikeOSS anywhere === (none)
=== mike. user-prefix strings ===
frontend/src/app/hooks/useSelectedModel.ts:6:const STORAGE_KEY = "mike.selectedModel";   # intentionally left

Internal Mike* symbol counts (unchanged): 325 occurrences across frontend/backend (types, components, MIME types, JSDoc).

Build / lint / tests

  • npx tsc --noEmit - clean.
  • npm run lint - 107 problems on main, 107 after (identical baseline).
  • npm run build - same fonts.googleapis.com sandbox network failure on main and on this branch; environmental. Workers Builds will run the real build on the PR.
  • No test scripts in either package.json.

Test plan

  • Workers Build for this PR succeeds.
  • Sign in. Open /account → settings tab now reads AI configuration.
  • Click it → page shows Default assistant and AI service keys sections; key fields say "(Claude) key" / "(Gemini) key"; explanation paragraph mentions GaryOSS connecting to an outside AI service.
  • On /assistant/chat/{id}, hover the assistant dropdown without a key - tooltip says "No key set for this assistant"; with a key - "Choose assistant".
  • Pick an assistant whose key is missing in the chat - modal title is "GaryOSS isn't configured yet" with Open AI configuration CTA.
  • Verify the modal CTA still routes to /account/models and the page renders.

https://claude.ai/code/session_019pRkhcGDRKQWHjzAnV5yCL


Generated by Claude Code

Our analysis

Strip developer jargon from GaryOSS user-facing copy — read the full analysis →

Think the analysis missed something the PR description covers?

Commits in this PR (1)

SHA Subject Author Date
2ea104bd De-jargon user-facing model/API-key copy Claude 2026-05-07 ↗ GitHub
commit body
Frontend-only copy cleanup. No identifiers, file names, MIME types,
localStorage keys, env vars, or backend contracts were renamed -
those carry behavior and were intentionally left alone.

User-facing changes:
- Account settings tab "Models & API Keys" → "AI configuration".
- /account/models page:
  - "Model Preferences" → "Default assistant"
  - "Tabular review model" → "Assistant for tabular reviews"
  - "API Keys" → "AI service keys"
  - Body copy rewritten to plain English ("GaryOSS connects to an
    outside AI service to answer questions...").
  - "Anthropic (Claude) API Key" → "Anthropic (Claude) key"
  - "Google (Gemini) API Key" → "Google (Gemini) key"
  - Tooltip "Add a {vendor} API key to use this model" →
    "Add a {vendor} key in AI configuration to use this assistant"
  - Placeholder "Select a model" → "Select an assistant"
- ApiKeyMissingModal:
  - Title "API key required" → "GaryOSS isn't configured yet"
  - Body softened to "GaryOSS isn't connected to {service} yet.
    Open AI configuration to add a key."
  - CTA "Go to account settings" → "Open AI configuration"
- ModelToggle:
  - title "API key missing for selected model" → "No key set for
    this assistant"
  - title "Choose model" → "Choose assistant"
  - aria-label "API key missing" → "No key set"
  - Fallback label "Model" → "Assistant"

GaryOSS branding is already consistent in README, layouts, and
schema header. No backend files touched. License unchanged.

https://claude.ai/code/session_019pRkhcGDRKQWHjzAnV5yCL

Capture this PR into my fork

Download a Markdown prompt that tells Claude how to port every commit in this PR into your working tree. Run it via claude -p < capture-pull-10.md from inside the repo you want the changes in.

⬇ Download capture-pull-10.md