taxing
Tax deduction automation for Australian households.
Ingests bank & trading platform data, classifies transactions, calculates deductions, and optimizes capital gains sequencing across tax brackets.
Quick Start
# Test
just test
# Lint + format
just lint
just format
# Full CI
just ci
Structure
src/
core/ Pure domain logic (classify, deduce, capital gains)
io/ I/O adapters (bank converters, ingest, persist)
pipeline.py Orchestration (ingest → classify → deduce)
cli/ CLI entry points
docs/
context.md Active session entry point
architecture.md Deep design reference (principles, patterns, data flow)
phase_2b_design.md Phase 2b bracket-aware sequencing design
TAX_OG_PORTING_ANALYSIS.md Feature comparison with tax-og
rules/
*.txt Rule files for classification (54 categories)
tests/
unit/ Pure logic tests
integration/ Full pipeline tests
Architecture
Phase 1 (complete): Transaction pipeline
- Ingest: Multi-bank support (ANZ, CBA, Beem, Wise)
- Classify: Rule-based categorization (54 categories)
- Deduce: Percentage-based deductions
- Persist: CSV outputs (transactions, deductions, summary)
- Status: 114 tests, zero lint
Phase 2a (complete): Capital gains core
- FIFO with loss harvesting prioritization
- CGT discount (50% for holdings >365 days)
- Trade ingestion (ingest_trades, ingest_trades_dir)
- Integrated into pipeline
- Status: 29 tests, parity validated vs tax-og
Phase 2b (complete): Bracket-aware deduction optimizer
- Greedy algorithm: allocate to lowest-bracket persons first
- CLI:
taxing optimize --fy 25 --persons alice,bob - Reads Phase 1 outputs (deductions per person)
- Pools and optimally allocates to minimize total tax
- See
docs/phase_2b_cli.md - Status: 8 tests
Phase 3a (complete): Property expense aggregator
- Aggregates rent, water, council, strata from CSV files
- CLI:
taxing property --fy 25 --person alice - PropertyExpensesSummary with category totals
- See
docs/phase_3a_property.md - Status: 19 tests
Phase 3b (complete): Holdings model
- Ticker, units, cost_basis, current_price
- Current value & unrealized gain properties
- Load from holdings.csv
- Supports fractional & large positions
- Status: 18 tests
Phase 2c (complete): Multi-year capital gains planning
- Loss carryforward tracking indefinitely across years
- Realize gains in lowest-bracket years first
- Harvest losses to offset current & future gains
- CLI:
taxing gains-plan --projection 25:30%,26:45% --gains [...] --losses [...] - Status: 18 tests, 205 tests total
Data Model
Money(amount: Decimal, currency: Currency)
Transaction(date, amount, description, source_bank, source_person, category?, is_transfer?)
Trade(date, code, action, units, price, fee, source_person)
Gain(fy, raw_profit, taxable_gain, action)
Type-safe, immutable, no silent bugs. See docs/architecture.md for full details.
Design Principles
- Pure functions: No side effects, testable without I/O
- Immutability: Frozen dataclasses, prevents accidental mutations
- Contracts: Protocols define behavior, tests verify compliance
- No globals: Config passed as arguments
- Agent-friendly: Modular, type-hinted, well-tested
Next Steps
- Phase 3c: Rental income + depreciation tracking
- Phase 2d: Advanced constraints (Medicare Levy, HELP, ILP)
- Phase 3d: Portfolio rebalancing optimization
See docs/context.md for quick reference, docs/architecture.md for deep design.
Metadata
Release files for taxing 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| taxing-0.1.0.tar.gz | 37.0 kB | Without provenance | Details for taxing-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| taxing-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for taxing-0.1.0-py3-none-any.whl |
Total release size: 90.2 kB
Release files / taxing-0.1.0.tar.gz
| Download URL | taxing-0.1.0.tar.gz |
|---|---|
| Size | 37.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c707055851d233267ba1908c0cfe35c29601aa2a180415f09ea4f41590c77cc3
|
|
BLAKE2b-256 checksum How to use checksums |
44e8c05b6a2b238f6f7478fc999b68806cad7b5e19d40077dd7076eb8c7ff328
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.3 CPython/3.12.10 Darwin/24.5.0
|
Release files / taxing-0.1.0-py3-none-any.whl
| Download URL | taxing-0.1.0-py3-none-any.whl |
|---|---|
| Size | 53.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0effbe965d404a84ae58b3204290fe0074e06abce8ba3de71801fa417435cd54
|
|
BLAKE2b-256 checksum How to use checksums |
84699d3d53ad4dbc17baef0c8b1fa6031d7c087150672b3684862c60940bc56d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.3 CPython/3.12.10 Darwin/24.5.0
|
Security for taxing 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.