.nvmrc.VITE_* in .env.example (API_URL, POSTHOG_KEY, SENTRY_DSN, FEATURE_FLAG_URL); real .env.* git‑ignored.src/config/index.ts exports typed import.meta.env values.main/release; feature branches; GitFlow or trunk‑based.├── .github/ # workflows: lint, test, build, storybook, analyze, security scans
├── .husky/ # Git hooks
├── .storybook/ # Storybook config & MSW addon
├── public/ # favicons, robots.txt, static images
├── scripts/ # custom scripts (e.g. svg→React)
├── src/
│ ├── assets/ # raw images/fonts/icons
│ ├── config/ # typed env + feature-flag wiring
│ │ └── index.ts
│ ├── styles/ # Tailwind entry, tokens & overrides
│ │ ├── globals.css
│ │ ├── tailwind.config.ts
│ │ └── tokens.ts
│ ├── utils/ # pure helpers (date, currency, debounce)
│ ├── hooks/ # generic hooks (useWebVitals, useFeatureFlag)
│ ├── services/ # API layer + validation
│ │ ├── api.ts # axios instance + interceptors
│ │ ├── schemas/ # Zod schemas per resource
│ │ └── hooks/ # React Query hooks
│ ├── store/ # optional global state (Zustand or Redux Toolkit)
│ ├── components/ # presentational (Atomic)
│ │ ├── atoms/ # Button, Input, Icon, Spinner
│ │ ├── molecules/ # FormField, Card, Tooltip
│ │ ├── organisms/ # DataList, Modal, Navbar
│ │ └── templates/ # Layouts (AuthLayout, DashboardLayout)
│ ├── containers/ # stateful pages (LoginPage, DashboardPage)
│ ├── features/ # domain modules (Auth, Accounts, Transfers)
│ ├── locales/ # i18n resources (en/, sw/, etc.)
│ ├── App.tsx # root with Router & Providers
│ └── main.tsx # bootstrap QueryClient, PostHog, WebVitals
├── cypress/ or playwright/ # E2E specs mirroring containers
├── plopfile.js # scaffold generators
├── tsconfig.json # strict + path aliases (@/* → src/*)
├── vite.config.ts # Vite plugins (React, Tailwind, visualizer, compression)
├── package.json # scripts & deps
└── README.md # setup, scripts, folder conventions, smoke tests<Routes> under layouts:/auth/* → AuthLayout/auth/login, /auth/register, /auth/forgot-password, /auth/mfa/app/* → DashboardLayout (protected)/app/home, /app/accounts, /app/accounts/:accountId,/app/transactions, /app/transactions/:txId,/app/transfer, /app/transfer/confirm,/app/kyc, /app/settings, /app/support* → NotFoundPage<ProtectedRoute> wrapper that checks auth & KYC status.React.lazy + Suspense fallback spinner.posthog.isFeatureEnabled.services/schemas/ (e.g. account.ts, transaction.ts).services/hooks/:useAccounts(), useAccount(accountId), useTransactions(), useTransfer()invalidateQueries.InsufficientFundsError) surfaced to UI./auth/mfa page, code input, resend.user, isAuthenticated, logout().main.tsx, key from config.track(event, props) to unify naming and batching.services/api.ts).clsx for conditional classNames.dark:.vite-plugin-compression.vite-imagetools or external CDN.vite-plugin-visualizer.vite-plugin-html.SameSite=Strict.npm audit in CI.DOMPurify for any rich text.main.extensions.json (Tailwind CSS IntelliSense, ESLint, Prettier, GitLens); settings.json (formatOnSave, import sorting).