Imported from RajanthaR/web-manus-showmoney (
AGENTS.md). Install upstream withnpx skills add RajanthaR/web-manus-showmoney. Copyright stays with the author.
AGENTS.md — web-manus-showmoney
What This App Is
ShowMoney is a "brutally honest" financial calculator for student visa requirements: pick a country (UK, Canada, USA, Australia, etc.), and it computes the exact bank-balance evidence needed (living costs + tuition + extras) with live currency conversion, in a neo-brutalist high-contrast UI. Fully client-side.
Tech Stack
- Frontend: React 19 + TypeScript 5.6, Vite 7, Tailwind CSS 4, shadcn/ui (Radix primitives), wouter (routing), framer-motion, recharts, react-hook-form + zod
- Backend: Express (static file serving only — no API layer)
- Tooling: pnpm 10 (required —
pnpm-lock.yaml+ patched deps), Prettier, esbuild
Commands
| Command | Purpose |
|---|---|
pnpm install |
Install dependencies (pnpm only) |
pnpm dev |
Vite dev server (vite --host) at http://localhost:5173 |
pnpm build |
vite build + esbuild server bundle → dist/ |
pnpm start |
Production server (serves dist/public, SPA fallback) on PORT (default 3000) |
pnpm preview |
Vite preview |
pnpm check |
TypeScript type check (tsc --noEmit) |
pnpm format |
Prettier write |
Prerequisites: Node 18+, pnpm.
No test script is configured — vitest is in devDependencies but there is no test script and no test files. ESLint is not configured either (Prettier only).
Architecture & Directory Map
client/
index.html
public/images/ Flag + hero images (brutalist style)
src/
main.tsx / App.tsx Entry + wouter routes (Home, NotFound)
pages/Home.tsx Main calculator screen
components/VisaCalculator.tsx Core calculation UI
components/ui/ shadcn primitives (generated — compose, don't hand-edit)
components/ ErrorBoundary, AppDialog, Map (template leftover)
hooks/ useComposition, useMobile, usePersistFn
contexts/ThemeContext.tsx
lib/utils.ts cn() helper
const.ts App constants
server/
index.ts Express: static serving + SPA fallback only (no API)
shared/const.ts Client+server constants
patches/wouter@3.7.1.patch Applied via pnpm patchedDependencies — do not delete
ideas.md Design brainstorming (Neo-Brutalism rationale)
Data flow: entirely client-side — visa requirement data lives in the client code (per-country constants); calculations happen in the browser. No backend API.
Where to Make Changes (Conventions)
- Visa data/calculation logic: country constants + math inside
client/src/components/VisaCalculator.tsx/pages/Home.tsx - New pages:
client/src/pages/+ wouter route inclient/src/App.tsx - Design: follow the Neo-Brutalism system documented in
ideas.md(thick borders, high contrast, neon accents) - Server changes are rarely needed — no API layer exists
- Do NOT delete
patches/wouter@3.7.1.patch(declared inpnpm.patchedDependencies)
Environment Variables
No .env.example; nothing beyond PORT/NODE_ENV is read.
Ports & URLs
- Dev: http://localhost:5173 (Vite)
- Production: http://localhost:3000 (Express;
PORToverridable)
Build & Deploy
pnpm build → dist/public (client) + dist/index.js (server); pnpm start runs NODE_ENV=production node dist/index.js.
Repo-Specific Notes
- Pure client-side app: no database, no auth, no persistence
- Visa thresholds are hard-coded from official government sources — cite-and-update them in one place when policy changes
Map.tsx/AppDialog.tsxare unused template leftovers