The Problem

Freelancers and small businesses deal with a constant stream of receipts, invoices, and bank statements. Manually extracting dates, amounts, vendors, and line items into a spreadsheet is slow, error-prone, and scales poorly. TaxHacker addresses this by using LLMs to automate the extraction and categorization of financial documents into a structured, queryable database.

What This Does

TaxHacker is a self-hosted web application built with React and TypeScript (134 TSX files, 45 TS files) that uses AI to parse uploaded documents. The core logic lives in ai/analyze.ts and ai/schema.ts, which define the extraction pipeline and output structure. The app supports multiple LLM providers (ai/providers/llmProvider.ts) and lets users define custom extraction fields via app/(app)/settings/fields/page.tsx and the forms/settings.ts schema.

The app handles the full accounting workflow: document upload and preview (app/(app)/files/), AI analysis with progress tracking (components/unsorted/analyze-form.tsx, hooks/use-progress.tsx), transaction management (app/(app)/transactions/), and CSV import/export (app/(app)/import/csv/, app/(app)/export/). Multi-currency support with historical rates is handled by components/agents/currency-converter.tsx and lib/llm-providers.ts. The app/(app)/apps/invoices/ module can generate invoice PDFs.

How To Use It

The repo is designed for Docker-based deployment. Three compose files exist: docker-compose.yml, docker-compose.build.yml, and docker-compose.production.yml. The Dockerfile and docker-entrypoint.sh script handle the container build and startup.

Setup: Clone and copy environment config git clone <repo-url> cp .env.example .env Edit .env with your LLM provider keys (OpenAI, Gemini, or Mistral)

Configuration: Required environment variables are documented in .env.example. At minimum, you'll need an LLM provider API key and database connection settings. The lib/config.ts file reads these at runtime.

Running it: Development docker compose up

Production build

docker compose -f docker-compose.production.yml up -d

The app serves a Next.js frontend with an auth flow (app/(auth)/). The README indicates this is early-stage software, so production use carries risk.

Real-World Use

A freelancer uploads a photo of a restaurant receipt. TaxHacker's AI extracts the date, total, and line items, converts the currency to the user's base currency using historical rates, and categorizes the expense. The transaction appears in the dashboard with all fields populated, ready for tax filing. The user can also set up custom fields—for example, "client project code"—via app/(app)/settings/fields/ to extract project-specific data from every invoice.

Code Health & Issues

High - Single test file: With 200 files, only 1 test file exists. Core AI parsing and transaction logic (ai/analyze.ts, app/(app)/transactions/actions.ts) is untested. This is a real risk for an accounting app. Med - Early-stage maturity: The README explicitly states "still in early development. Use at your own risk!" The docs/migrate-0.3-0.5.md file confirms significant schema changes between versions. Med - Stripe integration complexity: The presence of app/api/stripe/checkout/, portal/, and webhook/ routes suggests a hosted SaaS tier. This adds deployment complexity for self-hosters who don't need billing. Low - No obvious secrets in repo: .env.example and .gitignore are present, suggesting proper env handling. CI via GitHub Actions (docker-latest.yml, docker-release.yml) is configured.

The Bottom Line

TaxHacker is a well-structured, feature-rich accounting tool that genuinely leverages AI to solve a real problem. The codebase is organized and the Docker deployment path is clear. However, with one test file and an explicit early-stage warning, it's not ready for production accounting use without significant validation. Suited for technically comfortable freelancers or small teams willing to accept risk and contribute fixes; not appropriate for businesses requiring audit-grade reliability.