powerhour dashboard
Next.js 14TypeScriptPostgreSQLGemini AIPlaid API

powerhour

A self-hosted personal finance dashboard with AI-powered insights, real-time bank sync, and on-demand PDF reports.

Tech Stack

Next.js 14 (App Router)
TypeScript (strict)
PostgreSQL 16
Drizzle ORM
Gemini 2.5 Flash Lite
Vercel AI SDK v6
Plaid API
iron-session
PDFKit
shadcn/ui
Tailwind CSS
Docker Compose
nginx

By the Numbers

AI Agent Tools24
Database Tables16
API Routes35+
Dashboard Pages8
PDF Report Sections9

Project Overview

powerhour is a self-hosted personal finance dashboard that connects to your bank accounts via Plaid and layers AI on top of your real transaction data. It aggregates spending, balances, and recurring expenses across every linked institution into a single dashboard — then gives you two conversational AI agents that can answer questions about your money, generate PDF reports, plan travel budgets, and help you cut spending.

The Problem

Existing finance apps are either too simple (no AI, no reports) or too locked down (no self-hosting, no data ownership). I wanted something that combined real-time bank data with conversational AI and full control over my own financial data.

The Solution

A full-stack Next.js application with Plaid for bank sync, PostgreSQL for storage, and two Gemini-powered AI agents — one embedded in the dashboard for quick queries, and a dedicated Budget Planner with web search grounding for travel and savings planning.

The Outcome

A production-grade, Docker-deployable finance platform with 24 AI agent tools, on-demand PDF reports, subscription auditing, smart budget goals, and a security model built around encrypted tokens and database-layer isolation.

Architecture

Ticker AI Agent

A ReAct-style conversational agent embedded directly in the dashboard. Ticker has access to 15 tools that query spending summaries, account balances, transaction history, recurring expenses, cash flow forecasts, anomaly detection, debt payoff timelines, and more. It streams responses via SSE with an 8-step iteration cap and 30-second timeout.

Spending SummaryAccount BalancesTransaction SearchRecurring AuditCash Flow ForecastAnomaly DetectionDebt PayoffNet Worth History

Budget Planner Agent

A separate AI agent with a 16-step cap, 120-second timeout, and Google Search grounding for real-world cost research. Detects user intent to route between three modes: travel budgets with low/mid/high estimates, savings goals that calculate feasibility against recurring expenses, and spending analysis that suggests category-level budget caps.

Travel BudgetsSavings GoalsCut SpendingWeb Search Grounding

Plaid Integration & Data Pipeline

Bank accounts connect through Plaid Link, with access tokens encrypted at rest using AES-256-GCM. A cursor-based sync pulls transactions and balance snapshots daily via an in-process cron scheduler. Plaid webhooks are verified with JWK-based JWT signatures and SHA-256 body hashing. Recurring expense detection uses frequency analysis to classify charges as weekly, biweekly, monthly, or annual.

Development Process

Research & Requirements

Started with a deep dive into Plaid's API surface, financial data modeling, and the security requirements of handling bank credentials. Defined a four-phase roadmap: security foundation and agent tools, dashboard and data visualization, AI agents and reports, and production hardening with Docker deployment.

Security-First Foundation

Built the security layer before any features: AES-256-GCM encryption for Plaid tokens, database views that structurally exclude sensitive columns from AI agent queries, layered rate limiting across nginx and application middleware, iron-session with encrypted httpOnly cookies, and a pre-commit hook for secret scanning via Husky.

AI Agent Development

Designed and implemented 24 agent tools using the Vercel AI SDK v6, each backed by parameterized PostgreSQL queries through Drizzle ORM. The Ticker agent uses a ReAct loop with streaming SSE, while the Budget Planner integrates Google Search grounding for real-time cost research. Both agents operate exclusively through security views that cannot access raw tokens or credentials.

Production Deployment

Containerized with Docker Compose (app, PostgreSQL, nginx reverse proxy) with Let's Encrypt TLS. Built a demo mode that seeds realistic fake data for showcasing without Plaid credentials. Added automated daily syncs, weekly AI digests, audit logging, and encrypted database backups.

Key Features

Real-Time Bank Sync

Plaid-powered connection to checking, savings, and credit accounts across multiple institutions. Cursor-based transaction sync with daily automated pulls and webhook-triggered updates.

On-Demand PDF Reports

Nine-section financial reports generated entirely in-memory with PDFKit — including an AI-written narrative summary, spending breakdowns by category and merchant, net worth history, and anomaly highlights.

Subscription Auditing

Automatically flags recurring charges with no activity in 90+ days and calculates potential monthly savings if cancelled. Recurring detection classifies charges by frequency — weekly, biweekly, monthly, or annual.

Smart Budget Goals

AI-generated spending caps per category with progress tracking, based on 3-month spending history and month-over-month trends. Savings targets with feasibility checks against recurring expenses.

Security by Design

AES-256-GCM token encryption, database views that structurally exclude sensitive data from AI queries, JWK-verified Plaid webhooks, layered rate limiting, HSTS/CSP headers, and an immutable audit log.

Docker-Ready Deployment

Full Docker Compose stack with the app, PostgreSQL 16, and nginx reverse proxy. Let's Encrypt TLS, automated encrypted backups, and a demo mode that seeds realistic data for showcasing without bank credentials.

Interested in working together?

Feel free to reach out — I'm always open to discussing new projects and opportunities.