Thanks for the mortgage example, I set my escrow to a specific amount 
instead of null and it works now. I'm looking forward to updates!


On Monday, February 16, 2026 at 3:07:46 PM UTC-7 [email protected] wrote:

> Chris - thanks for sharing your experience here. I have two thoughts:
>
>    1. Claude went kinda nuts and didn't clean up old code. The call out 
>    of the check on line 552 is absolutely correct. There's a lot of "old" 
> code 
>    that can and should be cleaned up. I have this on my todo list - to 
>    basically "un-AI" it.
>    2. For amortization, there are two ways to set it up: static and 
>    stateful, which are mostly effectively explained here 
>    
> <https://github.com/slimslickner/beanschedule/blob/main/README.md#loan-amortization>.
>  
>    Agree that POSTING_ROLES.md is not there and that's a gap in 
> documentation, 
>    there also doesn't seem to be very good documentation in the code for how 
>    the amortization roles work (sorry!). Can you see if my example below is 
>    helpful for now?
>
> Here's my mortgage schedule yaml:
> id: loan-123-main-st
> enabled: true
> match:
> account: Assets:Banking:Checking:Joint-Ally-Spending
> payee_pattern: Chase Bank
> amount_tolerance: 0.0
> amount_min: null
> amount_max: null
> date_window_days: 5
> recurrence:
> frequency: MONTHLY
> start_date: 2024-01-01
> end_date: null
> day_of_month: 4
> amortization:
> payment_day_of_month: 1
> balance_from_ledger: true
> annual_rate: 0.055
> monthly_payment: 2310.25
> compounding: MONTHLY
> transaction:
> payee: Chase Bank (Mortgage)
> narration: Mortgage Payment
> tags:
> - property-123-main-st
> metadata:
> schedule_id: loan-123-main-st
> property: 123-main-st
> postings:
> - account: Assets:Banking:Checking:Joint-Ally-Spending
> amount: null
> narration: null
> role: payment
> - account: Expenses:House:Escrow
> amount: 323.31
> narration: Escrow
> role: escrow
> - account: Expenses:House:Mortgage-Interest
> amount: null
> narration: Mortgage Interest
> role: interest
> - account: Liabilities:Loans:Mortgage:123-Main-St
> amount: null
> narration: Mortgage Principal
> role: principal
> missing_transaction:
> create_placeholder: true
> flag: "!"
> narration_prefix: "[MISSING]"
>
> and the beanschedule amortize loan-123-main-st --ledger main.bean command 
> returns this:
>
> INFO: Loading schedules from directory: schedules
>
> INFO: Loaded 45 schedules (44 enabled) from directory: schedules
>
> Schedule: loan-123-main-st
>
> Mode: Stateful (balance from ledger)
>
> Liability Account: Liabilities:Loans:Mortgage:123-Main-St
>
> Balance as of 2026-02-03: $321,494.23
>
> Interest Rate: 5.500% (MONTHLY)
>
> Monthly Payment: $2,310.25
>
> Forecast Horizon: 12 months (12 payments)
>
>
> Total Interest: $20,685.41
>
> Total Principal: $7,037.59
>
> Total Paid: $27,723.00
>
> Interest/Principal Ratio: 293.9%
>
>
>    #         Date      Payment    Principal     Interest        Balance
>
> -----------------------------------------------------------------------
>
>    1   2026-03-01 $   2,310.25 $     571.83 $   1,738.42 $   378,720.07
>
>    2   2026-04-01 $   2,310.25 $     574.45 $   1,735.80 $   378,145.62
>
>    3   2026-05-01 $   2,310.25 $     577.08 $   1,733.17 $   377,568.54
>
>    4   2026-06-01 $   2,310.25 $     579.73 $   1,730.52 $   376,988.81
>
>    5   2026-07-01 $   2,310.25 $     582.38 $   1,727.87 $   376,406.43
>
>    6   2026-08-01 $   2,310.25 $     585.05 $   1,725.20 $   375,821.38
>
>    7   2026-09-01 $   2,310.25 $     587.74 $   1,722.51 $   375,233.64
>
>    8   2026-10-01 $   2,310.25 $     590.43 $   1,719.82 $   374,643.21
>
>    9   2026-11-01 $   2,310.25 $     593.14 $   1,717.11 $   374,050.07
>
>   10   2026-12-01 $   2,310.25 $     595.85 $   1,714.40 $   373,454.22
>
>   11   2027-01-01 $   2,310.25 $     598.58 $   1,711.67 $   372,855.64
>
>   12   2027-02-01 $   2,310.25 $     601.33 $   1,708.92 $   372,254.31
> *Note that the amortization calendar specifically excludes escrow, so the 
> escrow amount would be added as a posting in addition to principal, 
> interest, and the paying account.*
>
> Give me some time this week and I'll follow up when this has been cleaned 
> up a bit. I can also include some better unit tests for amortization and 
> leverage the example schedules in the unit tests. The next version has 
> support for one-time transactions (e.g. I just went to Costco and want to 
> write out all my splits now, then merge that with an imported transaction 
> when that comes in a few days). I'll make sure to include some readme 
> cleanup and some of my use cases in that release too.
>
> Thanks,
> Tim
>
> On Monday, February 16, 2026 at 4:15:27 PM UTC-5 [email protected] wrote:
>
>> Thanks for creating and sharing this Tim! I spent some time trying to get 
>> it to work for me. The initial create command worked well on my ledger. I 
>> culled through it and arrived at a minimum set of 13 to play with. They all 
>> pass CLI beanschedule validate, but the schedule plugin fails in a couple 
>> of spots:
>>
>>
>>    1. The docs indicate that multiple postings with amount:null are 
>>    valid (schedules/rent.yaml example). This made sense to me for 
>> double-entry 
>>    bookkeeping when there are two postings. The code doesn't support it 
>> though 
>>    ("At most one posting can have a null amount (the balancing posting).": 
>>    
>> https://github.com/slimslickner/beanschedule/blob/c160278ee3ffab5c5af32db98a90750d54be4382/beanschedule/plugins/schedules.py#L543
>>  
>>    As a side note, the subsequent check on line 552 isn't going to catch 
>>    postings with more than one null amount since that will be caught by the 
>>    previous check.
>>    2. I set up two amortized accounts with postings for payment, 
>>    principal, escrow and interest, but I get an error: "For amortization 
>>    schedules, postings with 'amount: null' must have an explicit 'role' 
>> field. 
>>    Valid roles: 'payment', 'interest', 'principal', 'escrow'. See 
>>    POSTING_ROLES.md for details." Another side note here - I could not find 
>>    POSTING_RULES.md. :-)
>>
>>
>>
>> On Saturday, February 7, 2026 at 10:04:10 AM UTC-7 [email protected] 
>> wrote:
>>
>>> Hi all - 
>>>
>>> I wanted to share a scheduled transaction repo I've been vibe coding as 
>>> I learned Beancount over the past few months. It's still a work in progress 
>>> but I've been using it consistently.
>>>
>>> beanschedule <https://github.com/slimslickner/beanschedule> provides 
>>> two primary features: a plugin for forecasting scheduled transactions and a 
>>> hook for augmenting imported transactions.
>>>
>>> Every schedule is defined as a yaml file with match logic, recurrence 
>>> rules, and expected postings. Currently, the only "dynamic" posting is loan 
>>> amortization which would include accounts like Interest and Principal; the 
>>> basic match is just a cost range.
>>>
>>> Beangulp Import Hook
>>> If you use the import hook, then imported transactions will be matched 
>>> with metadata and postings applied. Missing schedules are logged as part of 
>>> the beangulp logging.
>>>
>>> Schedules Plugin
>>> If you use the plugin, then forward looking transactions are added to 
>>> the ledger in the same style as the `beanlabs.plugins.forecast.py` 
>>> transactions with a `#` flag. I currently have this commented out most of 
>>> the time because past forecasted transactions (e.g. the transaction hasn't 
>>> posted yet) will mess with balance assertions, but it can be helpful to see 
>>> cash flow (obviously, doesn't capture non-scheduled transactions).
>>>
>>> CLI
>>> Beanschedule provides a CLI, `beanschedule`, with a few commands for 
>>> viewing loan amortization, detecting existing recurring transactions, 
>>> summarizing configured schedules, and a few more commands (see the docs and 
>>> code).
>>>
>>> Roadmap
>>> The roadmap is mostly administrative, specifically improving the 
>>> formatting and making the repo more Ruff-compliant.
>>>
>>> --- 
>>>
>>> This is my first "real" open repo so I'd love to get any feedback! I'd 
>>> love feedback on the repo, documentation, or feature requests! I know there 
>>> are some *similar* implementations and some of the stuff that's been 
>>> built here may not be super beancount-esque, so I'd love to hear about how 
>>> I can improve the style. To be clear, this is *heavily vibe coded*, I 
>>> don't want to claim credit for most of the code, but wanted to share with 
>>> the community in case something like this is helpful for someone else.
>>>
>>> It's very much a set-and-forget library, once schedules are onboarded, 
>>> it's a pretty easy maintenance process.
>>>
>>> ---
>>>
>>> Thanks all!
>>> Tim
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/beancount/e8250c2a-5faf-4e2d-b3e9-ccbf6273f203n%40googlegroups.com.

Reply via email to