A portfolio project demonstrating financial reconciliation and variance analysis using SQL, dbt, and Python.
FinReconciler is a work-in-progress financial reconciliation pipeline that reconciles Accounts Payable (AP) invoices against General Ledger (GL) postings, identifies variance, and surfaces unmatched items for investigation.
Goal: Showcase SQL proficiency, scalable data architecture, and test automation for a portfolio.
Data: Uses realistic mock data generated with Polars that simulates real-world financial scenarios, including intentional mismatches and variance patterns to test reconciliation logic.
- Project folder structure
- Dependencies configured (DuckDB, Polars, Streamlit, Altair)
- Project documentation (CLAUDE.md, TASKS.md, skills.md)
- dbt setup
- Test data generation
- SQL models (staging → intermediate → marts)
- dbt tests
- Streamlit dashboard
- dbt Setup — Add dbt to dependencies, configure profiles.yml
- Data Generation — Create 100K realistic records (AP, AR, GL) with intentional mismatches
- SQL Models — Build staging, intermediate, and mart models
- Tests — Add dbt tests for data quality
- Streamlit Dashboard — Visualize reconciliation findings
| Component | Tech | Purpose |
|---|---|---|
| Database | DuckDB | Columnar OLAP for fast aggregations |
| Data Generation | Polars | Create realistic test data |
| Transformation | dbt + SQL | Data pipeline (staging → marts) |
| Frontend | Streamlit | Interactive dashboard |
| Visualization | Altair | Charts and graphs |
- Python 3.13+
- uv (dependency manager)
# Clone and navigate
git clone <repo>
cd finreconciler
# Install dependencies
uv syncfinreconciler/
├── finreconciler_dbt/ → dbt project (models, tests, macros)
├── scripts/ → Python scripts (data generation, init)
├── streamlit_app/ → Streamlit dashboard
├── data/ → Raw data and seeds
└── docs/ → Documentation
- CLAUDE.md — Project manual and guidelines
- TASKS.md — Task backlog and templates
- skills.md — Claude Code capabilities
This is a learning project for portfolio purposes. It will be updated regularly as features are added.