Rainboot is a personal finance and budgeting web application designed for everyday users in Vietnam.
This repository hosts the entire monorepo, including the frontend (Next.js), backend (NestJS), and shared packages.
The project aims to create a simple, trustworthy, and localized tool to help individuals and small families manage their daily expenses, track budgets, and gain better financial awareness — all without unnecessary complexity.
Rainboot focuses on:
- ✨ Ease of use – frictionless expense logging and budget tracking
- ☁️ Cloud sync – data accessible across devices
- 🇻🇳 Vietnam-first experience – localized currency, language, and UX
- 🔍 Transparency & insight – clear visual reports and spending summaries
rainboot/
├── apps/
│ ├── backend/ # NestJS API server
│ └── frontend/ # Next.js client application
├── packages/
│ └── shared/ # Shared types, constants, utilities
├── docker/ # Docker setup for local and production environments
├── .github/ # CI/CD workflows
├── pnpm-workspace.yaml
└── package.json
| Area | Stack |
|---|---|
| Frontend | Next.js 14, React 18, Tailwind CSS, Zustand, React Query, Shadcn UI |
| Backend | NestJS 10, Supabase, Redis (ioredis), Winston, Sentry |
| Shared | TypeScript types and constants |
| Tooling | pnpm, Docker, GitHub Actions, ESLint, Prettier |
This project uses a pnpm monorepo workspace. You can run the entire stack locally or through Docker.
# Clone the repository
git clone https://github.com/QingTian1927/rainboot.git
cd rainboot
# Install dependencies
pnpm installEnsure your root pnpm-workspace.yaml includes:
packages:
- 'apps/*'
- 'packages/*'pnpm devcd docker
cp .env.example .env
# Fill in environment variables (Supabase, Sentry, etc.)
docker-compose up --buildYou can monitor logs with:
docker-compose logs -f backend
docker-compose logs -f frontendTo rebuild a single service:
docker-compose up --build backend# Install dependencies
pnpm install
# Run both frontend and backend
pnpm dev
# Build all packages
pnpm build
# Run tests
pnpm test
# Clean build outputs
pnpm clean
# Lint all workspaces
pnpm lint- Framework: Next.js (App Router, TypeScript, TailwindCSS)
- UI System: Shadcn UI + custom design tokens
- State: Zustand & React Query
- Commands:
pnpm --filter @rainboot/frontend dev
pnpm --filter @rainboot/frontend build- Framework: NestJS 10
- Features: REST API, throttling, Redis caching, Supabase integration
- Logging: Winston + Sentry integration
- Commands:
pnpm --filter @rainboot/backend dev
pnpm --filter @rainboot/backend build- Purpose: Shared types, interfaces, and constants between frontend and backend.
- Commands:
pnpm --filter @rainboot/shared build
pnpm --filter @rainboot/shared dev- Development:
docker/docker-compose.yml - Production:
docker/docker-compose.prod.yml
Run development environment:
cd docker
docker-compose up --buildTear down:
docker-compose down -vGitHub Actions (.github/workflows/ci.yml) automatically runs:
- Linting
- Build
- Unit tests
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]- Fork the repository
- Create your feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'Add new feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request