Installation
Requirements
- Node.js v24.12.0 or later
- pnpm >= 11.1.2
- Supabase CLI (for local Supabase)
- Docker (for Supabase and PowerSync)
Installation
Clone the repository
git clone https://github.com/ilkome/finapp.git
cd finapp
Install dependencies
pnpm install
Configure environment variables
Copy the example env file and fill in your values:
cp app/.env.example app/.env
VITE_SUPABASE_URL=http://localhost:54321
VITE_SUPABASE_ANON_KEY=<anon key from supabase start output>
VITE_POWERSYNC_URL=http://localhost:8080
For local development, supabase start prints the API URL (use as VITE_SUPABASE_URL) and anon key (use as VITE_SUPABASE_ANON_KEY). VITE_POWERSYNC_URL is the PowerSync service started in the next step.
Start the local backend
Run these three commands once from the app/ directory. After the initial setup you only need to start the containers again if they are stopped.
1. Start Supabase (Postgres + Auth on port 54321):
supabase start
2. Apply the PowerSync replication setup:
docker exec -i supabase_db_app psql -U postgres -d postgres < supabase/powersync_setup.sql
This creates a powersync_role with replication privileges and a powersync publication scoped to the five Finapp tables.
3. Start the PowerSync service (port 8080):
docker compose -f powersync/docker-compose.yaml up -d
Start the development server
pnpm dev
The app will be available at http://localhost:3050.
A design system playground is available at http://localhost:3050/dev during development (hidden in production).
Google sign-in (optional)
The login screen has a Sign in with Google button. Email/password works without any of this - set up Google only to test that flow locally.
Create a Google OAuth client
In the Google Cloud Console, create an OAuth 2.0 Client ID (Web application) and add the local Supabase callback as an authorized redirect URI:
http://127.0.0.1:54321/auth/v1/callback
Add the credentials to app/.env
SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID=<client id>
SUPABASE_AUTH_EXTERNAL_GOOGLE_SECRET=<client secret>
The Supabase CLI loads .env from the directory you run it in. These feed env() in app/supabase/config.toml and are not exposed to the client (no VITE_ prefix).
Restart Supabase
supabase stop && supabase start
The Google provider is already enabled in config.toml ([auth.external.google], skip_nonce_check = true for local), with the dev origin http://localhost:3050 in additional_redirect_urls.
Production Build
pnpm build
pnpm generate
pnpm preview