Open Finapp
Development

Installation

Get started with Finapp - clone, configure env vars, start the local backend, and run the dev server.

Requirements

Installation

Clone the repository

Terminal
git clone https://github.com/ilkome/finapp.git
cd finapp

Install dependencies

Terminal
pnpm install

Configure environment variables

Copy the example env file and fill in your values:

Terminal
cp app/.env.example app/.env
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):

Terminal - from app/
supabase start

2. Apply the PowerSync replication setup:

Terminal - from app/
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):

Terminal - from app/
docker compose -f powersync/docker-compose.yaml up -d

Start the development server

Terminal
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

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

Terminal - from app/
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