# Codebase Structure ## Directory Layout ``` SimpleFinanceDash/ ├── backend/ # Go backend application │ ├── cmd/server/ # Application entrypoint │ │ └── main.go # Server init, embeds frontend & migrations │ ├── internal/ │ │ ├── api/ # HTTP handlers and routing │ │ │ ├── router.go # Chi router setup, route definitions │ │ │ └── handlers.go # All HTTP request handlers (~480 lines) │ │ ├── auth/ # Authentication logic │ │ │ └── auth.go # JWT/session, bcrypt hashing │ │ ├── db/ # Database layer │ │ │ ├── db.go # Connection pool, migration runner │ │ │ └── queries.go # All database queries (~350 lines, 22 functions) │ │ └── models/ # Domain types │ │ └── models.go # User, Category, Budget, BudgetItem, BudgetTotals │ ├── migrations/ # SQL migration files │ │ └── 001_initial.sql # Initial schema (5 tables, indexes, enums) │ ├── go.mod # Go module (v1.25.0) │ └── go.sum # Dependency lockfile │ ├── frontend/ # React + Vite + TypeScript │ ├── src/ │ │ ├── App.tsx # Root component with routing │ │ ├── main.tsx # React 19 entry point │ │ ├── index.css # Global styles, Tailwind + CSS variables │ │ ├── components/ # UI and feature components │ │ │ ├── ui/ # shadcn/ui components (18 files) │ │ │ │ ├── button.tsx, card.tsx, dialog.tsx, input.tsx │ │ │ │ ├── select.tsx, table.tsx, tabs.tsx, sidebar.tsx │ │ │ │ ├── avatar.tsx, badge.tsx, chart.tsx, separator.tsx │ │ │ │ ├── dropdown-menu.tsx, scroll-area.tsx, sheet.tsx │ │ │ │ ├── skeleton.tsx, spinner.tsx, tooltip.tsx │ │ │ └── [Feature components] │ │ │ ├── AppLayout.tsx # Main layout wrapper │ │ │ ├── BudgetSetup.tsx # Budget creation form │ │ │ ├── BillsTracker.tsx # Bills tracking │ │ │ ├── VariableExpenses.tsx │ │ │ ├── DebtTracker.tsx │ │ │ ├── FinancialOverview.tsx │ │ │ ├── ExpenseBreakdown.tsx │ │ │ └── AvailableBalance.tsx │ │ ├── pages/ # Route-level views │ │ │ ├── DashboardPage.tsx # Main dashboard │ │ │ ├── CategoriesPage.tsx # Category management │ │ │ ├── LoginPage.tsx # Login form │ │ │ ├── RegisterPage.tsx # Registration form │ │ │ └── SettingsPage.tsx # User settings │ │ ├── hooks/ # Custom React hooks │ │ │ ├── useAuth.ts # Auth state management │ │ │ ├── useBudgets.ts # Budget data fetching & selection │ │ │ └── use-mobile.ts # Mobile detection │ │ ├── lib/ # Utilities and API client │ │ │ ├── api.ts # Typed REST client │ │ │ ├── utils.ts # cn() className utility │ │ │ └── format.ts # Currency formatting │ │ └── i18n/ # Internationalization │ │ ├── index.ts # i18next setup │ │ ├── en.json # English translations │ │ └── de.json # German translations │ ├── package.json # Dependencies (bun) │ ├── vite.config.ts # Build config + API proxy │ ├── tsconfig.json # TypeScript config │ ├── eslint.config.js # ESLint config │ ├── components.json # shadcn/ui config │ └── bun.lock # Bun lockfile │ ├── compose.yml # Docker Compose (PostgreSQL + app) ├── Dockerfile # Multi-stage build ├── CLAUDE.md # Project guidance ├── PRD.md # Product Requirements Document └── README.md # Project overview ``` ## Key File Locations | Component | Location | Purpose | |-----------|----------|---------| | Server Entrypoint | `backend/cmd/server/main.go` | DB pool init, migrations, embed frontend | | API Routes | `backend/internal/api/router.go` | Chi router, middleware, route definitions | | HTTP Handlers | `backend/internal/api/handlers.go` | Auth, categories, budgets, settings handlers | | Database Layer | `backend/internal/db/db.go` | Connection pool, migration runner | | Queries | `backend/internal/db/queries.go` | 22 database functions using pgx | | Models | `backend/internal/models/models.go` | User, Category, Budget, BudgetItem, BudgetTotals | | Auth | `backend/internal/auth/auth.go` | JWT generation/validation, bcrypt | | Migrations | `backend/migrations/001_initial.sql` | PostgreSQL schema | | Frontend Root | `frontend/src/App.tsx` | React router, auth check, page routes | | API Client | `frontend/src/lib/api.ts` | Typed REST client | | i18n | `frontend/src/i18n/index.ts` | i18next setup (en, de) | | Styling | `frontend/src/index.css` | Tailwind + CSS variables (dark/light) | ## Naming Conventions ### Backend (Go) - **Packages**: lowercase, single word (`api`, `auth`, `db`, `models`) - **Exported functions**: PascalCase (`GetBudget`, `CreateUser`) - **Private functions**: camelCase - **Constants**: PascalCase (`CategoryBill`, `userIDKey`) - **Files**: snake_case (`handlers.go`, `router.go`, `queries.go`) - **Types**: PascalCase (`User`, `BudgetItem`) ### Frontend (TypeScript/React) - **Components**: PascalCase (`DashboardPage.tsx`, `BudgetSetup.tsx`) - **Pages**: PascalCase with "Page" suffix (`LoginPage.tsx`, `CategoriesPage.tsx`) - **Hooks**: camelCase with "use" prefix (`useAuth.ts`, `useBudgets.ts`) - **Utilities**: camelCase (`utils.ts`, `format.ts`) - **UI components**: kebab-case matching shadcn convention (`button.tsx`, `dropdown-menu.tsx`) - **i18n keys**: nested dot notation (`auth.login`, `dashboard.financialOverview`) ## Configuration Files | File | Purpose | |------|---------| | `backend/go.mod` | Go 1.25.0, 6 main dependencies | | `frontend/package.json` | Node deps, bun package manager | | `frontend/vite.config.ts` | Vite build, React plugin, API proxy to :8080 | | `frontend/tsconfig.json` | Path alias: `@/*` → `./src/*` | | `frontend/components.json` | shadcn/ui config (radix-nova, Lucide icons) | | `frontend/eslint.config.js` | TypeScript + React hooks rules | | `compose.yml` | PostgreSQL 16 + Go app services | | `Dockerfile` | Multi-stage: bun → Go → Alpine |