Claude and Taxes
Last year, I filed my tax return in October. Technically, you're supposed to send them out by April 15th; procrastinating on doing them is definitely easier though, and that was the second deadline you can catch.
Admittedly, some might consider the way I'm doing taxes to be... somewhat unnatural? See also: Shell Scripts, Emacs and Taxes; it's text files, processed by OpenTaxSolver, invoked by a build script. Just to quote that other article though:
If your main job is not filing tax returns, you will typically forget what and how to file by the time the next return is due. With this approach, you can just copy over the previous year's build.sh script to the current one; search and replace "2022" with "2023", adjust some page numbers, and fill in the fresh numbers to the templates. It's easy to notice that you had some number in a line last year & this year's is still missing.
... well, and then patch up OpenTaxSolver to handle the kind of cap gains that they didn't consider anyone would want to report. And write various Python scripts, parsing broker transaction CSVs. Does TurboTax do this for you though...? or do you have to fill this out, by hand...?
There is, though, a point where hit the point of no return. (... assuming you do want to file a... return, after all.) It's almost done, just dig up that stupid table from there and adjust the cost basis there, it's 11pm already, next day is work and you still need to print all the pages... so even if you switched over to TurboTax, it'd be a lot more work. So you just push through.
And there is something rewarding in the printer spitting out the reams of completed forms, engulfing itself in a slight smell of ozone. You've done it.
The article was written ages ago though. 1.5 years, to be exact. And doing this even last year, there were some signs of... changes to come.
Enter Claude
... but in this world nothing can be said to be certain, except death and taxes.
And, possibly, tax returns.
Tax returns?
Well. Some of the process doesn't change. For example, where you write a checklist of tax docs to collect, w2s etc, and then...
... OK just kidding. Writing checklists... by hand?? "hey Claude, let's look at last year's tax return; what exactly do we need for this?"
You go over the list, log into all the websites (that's the hardest part), and throw all the pdfs you find into a directory.
Then... you just tell Claude to grab the latest OpenTaxSolver, copy over the input templates...
{ ---- Income ---- }
{ -- Wages from W-2 forms Box-1. -- }
L1a 42345.00 ; { Frobnicator Inc. W-2 box 1 }
L1b ; { Household employee wages not reported on Form(s) W-2. }
L1c ; { Tip income not reported on line 1a. }
L1d ; { Medicaid waiver payments not reported on Form(s) W-2. }
L1e ; { Taxable dependent care benefits from Form 2441, line 26. }
L1f ; { Employer-provided adoption benefits from Form 8839, line 29. }
L1g ; { Wages from Form 8919, line 6. }
L1h ; { Other earned income. }
L1h_type: { Type of other earned income. }
L1i ; { Nontaxable combat pay election. }
..fill them out (it could get around that whitespace parsing bug in OTS that has been there for a long time), and... generally take care of things.
Out come the tax forms.
It reads the build script. It knows how to update the build script. It counts the pages in the pdfs and fixes the part that stitches them together wrong. Guess who wrote the detailed comments in the one below:
#!/bin/bash
set -e
OTS=/path/to/OpenTaxSolver2025_23.06_linux64
(cd $OTS/src/; make)
# Generate transaction CSVs from brokerage 1099-B export
python3 convert_transactions.py
mkdir -p build
cd build
cp ../transactions_AD.csv .
# HSA
cp ../HSA_Form_8889_2025.txt .
$OTS/bin/taxsolve_HSA_f8889 HSA_Form_8889_2025.txt
# Federal
cp ../US_1040_2025.txt .
$OTS/bin/taxsolve_US_1040_2025 US_1040_2025.txt
# State
cp ../CA_540_2025.txt .
$OTS/bin/taxsolve_CA_540_2025 CA_540_2025.txt
# Generate PDFs from the solved text forms
$OTS/bin/universal_pdf_file_modifier \
$OTS/src/formdata/f1040_meta.dat \
US_1040_2025_out.txt \
$OTS/src/formdata/f1040_pdf.dat \
-o US_1040_2025_out.pdf
$OTS/bin/universal_pdf_file_modifier \
$OTS/src/formdata/f8889_meta.dat \
HSA_Form_8889_2025_out.txt \
$OTS/src/formdata/f8889_pdf.dat \
-o HSA_8889_out.pdf
$OTS/bin/universal_pdf_file_modifier \
$OTS/src/formdata/CA_540_meta.dat \
CA_540_2025_out.txt \
$OTS/src/formdata/CA_540_pdf.dat \
-o CA_540_2025_out.pdf
# Extract W-2 pages (federal copy vs state copy)
pdftk "../w2_2025.pdf" cat 1 output w2_federal.pdf
pdftk "../w2_2025.pdf" cat 2 output w2_state.pdf
# Assemble final federal return:
# 1-2: 1040 main form
# 3-4: Schedule 1
# 5-6: Schedule A (itemized deductions)
# 7-8: Schedule B (interest & dividends)
# 9-10: Schedule D (capital gains)
# 11-12: Form 8949 (short-term & long-term sales)
pdftk US_1040_2025_out.pdf cat 1-4 10-15 output US_1040_2025_forms.pdf
pdftk \
US_1040_2025_forms.pdf \
w2_federal.pdf \
HSA_8889_out.pdf \
cat output final_2025_federal.pdf
pdftk \
US_1040_2025_forms.pdf \
w2_state.pdf \
HSA_8889_out.pdf \
CA_540_2025_out.pdf \
cat output final_2025_state.pdf
It's still March. Tax returns are done. Sure, will need to double-check everything, but it was, still, a single evening.
Reminds me of... the end of Vernor Vinge's Fast Times at Fairmont High (it & Rainbows End is really good too, read it):
(...) As with Ms. Wilson's math exam, the faculty has dug up some hoary piece of business that no reasonable person would ever bother with. For the vocational test, the topic would be a work specialty.
And today... it was Regna 5.
When Regna had been hot, back in Pa's day, tech schools had taken three years of training to turn out competent Regna practicioners.
It was a snap. Juan spent a couple hours scanning through the manuals, integrating the skills, and then he was ready for the programming task, some cross-corporate integration nonsense.
He was out by noon with an A.
It's soon 2027. No FedEx package cannons. No AR contact lenses. Self-driving cars... aren't boring yet.
We're getting there with the cross-corporate integration nonsense though.