Clone and configure
Clone the repository, copy .env.example to .env, and fill in your Plaid credentials, database URL, and session secret.
git clone https://github.com/aidandevv/powerhour
cd powerhour
npm install
npm run setupPowerhour runs on your own infrastructure. You own the database, the credentials, and the data. Follow these steps to get up and running.
Clone the repository, copy .env.example to .env, and fill in your Plaid credentials, database URL, and session secret.
git clone https://github.com/aidandevv/powerhour
cd powerhour
npm install
npm run setupDocker Engine with Compose v2 is the one hard infrastructure requirement. It runs Postgres for you — no local database install needed.
docker compose -f docker/docker-compose.yml up db -dApply the Drizzle schema, then run the dev server. Demo mode is available if you don't have Plaid credentials yet.
npm run db:push
npm run devFor a real deployment, skip the source checkout entirely: pull a versioned, checksum-verified image from GHCR and run the bundled production Compose file with its migrate service.
export POWERHOUR_VERSION=v1.0.0
curl -fsSLO "https://github.com/aidandevv/powerhour/releases/download/${POWERHOUR_VERSION}/docker-compose.yml"
curl -fsSLo .env.example "https://github.com/aidandevv/powerhour/releases/download/${POWERHOUR_VERSION}/env.example"
curl -fsSLO "https://github.com/aidandevv/powerhour/releases/download/${POWERHOUR_VERSION}/checksums.sha256"
sha256sum -c checksums.sha256
docker compose --profile tools run --rm migrate
docker compose up -dCopy .env.example to .env and fill in the following:
| Variable | Description |
|---|---|
DATABASE_URL | PostgreSQL connection string |
PLAID_CLIENT_ID | From the Plaid dashboard |
PLAID_SECRET | Environment-specific Plaid secret |
PLAID_ENV | sandbox, development, or production |
SESSION_SECRET | 32+ character random string for iron-session |
DEMO_MODE | Set to true to seed demo data on startup (optional) |
The recommended production path uses a versioned, checksum-verified image from GHCR and never requires a source checkout or Node.js on the server.
export POWERHOUR_VERSION=v1.0.0
curl -fsSLO "https://github.com/aidandevv/powerhour/releases/download/${POWERHOUR_VERSION}/docker-compose.yml"
curl -fsSLo .env.example "https://github.com/aidandevv/powerhour/releases/download/${POWERHOUR_VERSION}/env.example"
curl -fsSLO "https://github.com/aidandevv/powerhour/releases/download/${POWERHOUR_VERSION}/checksums.sha256"
sha256sum -c checksums.sha256
docker compose --profile tools run --rm migrate
docker compose up -dThe app binds to 127.0.0.1:3000 by default — put Caddy, nginx, Traefik, or Cloudflare Tunnel in front for internet access. If you build from source instead, the bundled docker/docker-compose.yml ships an opt-in nginx + Let's Encrypt profile (--profile tls).
Daily backups are a one-line cron job: docker compose exec -T db pg_dump piped through gpg encryption. Restore with the same command in reverse.