tax-organizer
Maintain year-by-year tax document folders, track which institution documents are missing, file incoming documents automatically, and provide URLs to retrieve missing documents.
What this skill does
# Tax Organizer Maintain a flat, year-by-year tax document folder structure. Track which institutions need documents each year, identify what's missing, file incoming documents, and provide retrieval URLs. If `$ARGUMENTS` is provided, interpret as an action: - A year (e.g., `2025`) — show status for that tax year - `status` — show status for all years - `file` — process incoming folder - `setup` — initialize a new tax year - `setup 2025` — initialize a specific year ## Paths ``` BASE_DIR = ~/Library/CloudStorage/[email protected]/My Drive/TRAVIS_Taxes/ ``` | Path | Purpose | |---|---| | `BASE_DIR/<YYYY>/` | Tax documents for that year (flat — no subfolders) | | `BASE_DIR/incoming/` | Drop zone for new documents to be filed | | `BASE_DIR/.tax-organizer/tax_tracker.sqlite` | Tracking database | ## Folder Structure (Flat) Each year folder is **flat** — no subfolders. Files are named with a consistent prefix pattern: ``` <YYYY>/ <institution>-<doc_type>-<detail>.pdf <institution>-<doc_type>-<detail>.pdf ... ``` ### File Naming Convention ``` <institution>-<doc_type>[-<detail>].<ext> ``` **institution** (lowercase): `amex`, `chase`, `etrade`, `schwab`, `fidelity`, `paypal`, `venmo`, `amazon`, `godaddy`, `aws`, `lowes`, `usaa`, `irs`, `texas`, `travis-county`, `hays-county`, `williamson-county`, etc. **doc_type** (lowercase): | Type | Description | |---|---| | `1099-int` | Interest income | | `1099-div` | Dividends | | `1099-b` | Brokerage/capital gains | | `1099-r` | Retirement distributions | | `1099-misc` | Miscellaneous income | | `1099-nec` | Nonemployee compensation | | `1099-k` | Payment card/third-party network | | `1098` | Mortgage interest | | `1098-t` | Tuition | | `w2` | Wage statement | | `1095-a/b/c` | Health coverage | | `5498` | IRA contributions | | `statement-annual` | Year-end statement | | `statement-q1/q2/q3/q4` | Quarterly statements | | `statement-01..12` | Monthly statements | | `property-tax` | Property tax bill/receipt | | `property-insurance` | Insurance declaration page | | `hoa` | HOA annual statement | | `k1` | Partnership/S-corp schedule | | `receipt` | Business receipt | | `summary` | Annual summary | | `sales-report` | Sales tax report (for eBay/resale) | **detail** (optional): account last 4, property address slug, etc. ### Examples ``` 2024/ amex-statement-annual-9878.pdf amex-1099-int.pdf chase-statement-annual-4589.pdf chase-1099-int.pdf etrade-1099-b.pdf etrade-1099-div.pdf etrade-5498.pdf paypal-1099-k.pdf ebay-1099-k.pdf irs-1040-filed.pdf texas-franchise-tax.pdf travis-county-property-tax-7207.pdf hays-county-property-tax-1913.pdf usaa-1098-7207.pdf usaa-1098-1913.pdf gravhl-k1.pdf tmctech-k1.pdf ``` ## Database **Path**: `BASE_DIR/.tax-organizer/tax_tracker.sqlite` Use `sqlite3` CLI or Python `sqlite3` module. ### Schema ```sql CREATE TABLE IF NOT EXISTS institutions ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL UNIQUE, -- 'amex', 'chase', 'etrade' name TEXT NOT NULL, -- 'American Express', 'Chase Bank' institution_type TEXT NOT NULL, -- 'bank', 'brokerage', 'payment', 'government', 'insurance', 'employer', 'property' portal_url TEXT, -- URL to log in and download docs doc_retrieval_notes TEXT, -- step-by-step instructions first_year INTEGER, -- first year this institution appears last_year INTEGER, -- NULL = still active discontinued_at TEXT, -- date user said "no longer have" ask_until_year INTEGER, -- stop asking after this year (discontinued_at year + 3) created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS institution_docs ( id INTEGER PRIMARY KEY AUTOINCREMENT, institution_id INTEGER NOT NULL REFERENCES institutions(id), doc_type TEXT NOT NULL, -- '1099-int', 'statement-annual', 'property-tax' description TEXT, -- 'Interest income statement' is_required BOOLEAN DEFAULT 1, -- required for tax filing? is_conditional BOOLEAN DEFAULT 0, -- only needed if threshold met (e.g., 1099-K > $600) condition_notes TEXT, -- 'Only issued if payments > $600' UNIQUE(institution_id, doc_type) ); CREATE TABLE IF NOT EXISTS year_institutions ( id INTEGER PRIMARY KEY AUTOINCREMENT, year INTEGER NOT NULL, institution_id INTEGER NOT NULL REFERENCES institutions(id), status TEXT DEFAULT 'expected', -- 'expected', 'received', 'not-applicable', 'waived' notes TEXT, UNIQUE(year, institution_id) ); CREATE TABLE IF NOT EXISTS year_documents ( id INTEGER PRIMARY KEY AUTOINCREMENT, year INTEGER NOT NULL, institution_id INTEGER NOT NULL REFERENCES institutions(id), doc_type TEXT NOT NULL, filename TEXT, -- actual filename in the year folder status TEXT DEFAULT 'missing', -- 'missing', 'received', 'not-applicable', 'waived' received_at TEXT, -- date filed notes TEXT, UNIQUE(year, institution_id, doc_type) ); CREATE TABLE IF NOT EXISTS filing_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, year INTEGER NOT NULL, filename TEXT NOT NULL, institution_code TEXT, doc_type TEXT, action TEXT NOT NULL, -- 'filed', 'renamed', 'skipped' source_filename TEXT, -- original name from incoming/ filed_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS discontinuation_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, institution_id INTEGER NOT NULL REFERENCES institutions(id), year_asked INTEGER NOT NULL, response TEXT NOT NULL, -- 'confirmed-gone', 'still-active', 'deferred' asked_at DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE(institution_id, year_asked) ); CREATE TABLE IF NOT EXISTS brokerage_accounts ( id INTEGER PRIMARY KEY AUTOINCREMENT, institution_id INTEGER NOT NULL REFERENCES institutions(id), account_last4 TEXT NOT NULL, account_name TEXT NOT NULL, -- 'LOGI', 'MJoint', 'TRoth' account_type TEXT NOT NULL, -- 'brokerage', 'bank', 'ira-roth', 'ira-traditional' owner TEXT, -- 'Travis', 'Melissa', 'Joint' full_account TEXT, -- full account number if known migrated_from TEXT, -- old account last4 for migration tracking notes TEXT, first_year INTEGER, last_year INTEGER, UNIQUE(institution_id, account_last4) ); ``` ### Seed Data — Known Institutions Seed these on first run (adjust URLs to match actual portals): ```sql -- Financial Institutions INSERT INTO institutions (code, name, institution_type, portal_url, doc_retrieval_notes, first_year) VALUES ('amex', 'American Express', 'bank', 'https://www.americanexpress.com/us/customer-service/statements-tax-forms.html', 'Login > Statements & Activity > Tax Forms > Download 1099', 2021), ('chase', 'Chase Bank', 'bank', 'https://www.chase.com/digital/login', 'Login > Statements > Tax Documents > Download', 2021), ('etrade', 'E*TRADE / Morgan Stanley', 'brokerage', 'https://us.etrade.com/etx/pxy/my-account/tax-center', 'Login > Tax Center > Tax Forms > Download all', 2021), ('paypal', 'PayPal', 'payment', 'https://www.paypal.com/myaccount/taxes/', 'Login > Activity > Statements & Tax > Tax Documents', 2021), ('venmo', 'Venmo', 'payme
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.