<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>SimpleFIN</title>
    <description>SimpleFIN is a protocol for simple financial aggregation.</description>
    <link>http://simplefin.org/</link>
    <atom:link href="http://simplefin.org/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Thu, 19 Mar 2026 14:04:58 +0000</pubDate>
    <lastBuildDate>Thu, 19 Mar 2026 14:04:58 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Budget from the Command Line</title>
        <description>&lt;p&gt;Now that the SimpleFIN Bridge is up, you can check on your finances from the command line.  Go sign up for the Alpha &lt;a href=&quot;https://bridge.simplefin.org&quot;&gt;here!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, generate a setup token.  We’ll use &lt;a href=&quot;https://bridge.simplefin.org/info/developer&quot;&gt;the demo one&lt;/a&gt; (so you folks at home can copy and paste away):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SETUP_TOKEN=&quot;aHR0cHM6Ly9icmlkZ2Uuc2ltcGxlZmluLm9yZy9zaW1wbGVmaW4vY2xhaW0vZGVtbw==&quot;
CLAIM_URL=$(echo SETUP_TOKEN | base64 -D)
echo ${CLAIM_URL}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we convert the setup token into an access url (this demo token can be converted any number of times, but real tokens can only be converted once):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ACCESS_URL=$(curl -X POST ${CLAIM_URL})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Save the access url:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;echo &quot;${ACCESS_URL}&quot; &amp;gt; ~/.simplefin-access
chmod 0600 ~/.simplefin-access
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can get a JSON dump of our transactions using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl $(cat ~/.simplefin-access)/accounts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;which makes:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&quot;accounts&quot;: [{&quot;transactions&quot;: [{&quot;posted&quot;: 1465286400, &quot;id&quot;: &quot;demo-1465286400&quot;, &quot;amount&quot;: &quot;-8.88&quot;, &quot;description&quot;: &quot;Grocery Store&quot;}, {&quot;posted&quot;: 1465315200, &quot;id&quot;: &quot;demo-1465315200&quot;, &quot;amount&quot;: &quot;-22.80&quot;, &quot;description&quot;: &quot;Rent&quot;}, ...snip...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or we can get the last few days’ transactions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python last_week.py
Mon --------------- --------
    Movie Theater     -11.60
    Clothing Store     -2.91
    Rent               -4.24
    Clothing Store     -7.29
    Clothing Store    -18.21
    Good Person Rew   -64.69
    Good Person Rew    27.94
    Grocery Store      -3.55
                      -84.55
Tue --------------- --------
    Grocery Store      -8.88
    Rent               -9.12
    Rent               -8.01
    Rent              -22.80
    Gas Station        -0.25
    Good Person Rew   -52.25
    Good Person Rew    19.02
    Clothing Store     -3.40
                      -85.69
Wed --------------- --------
    Clothing Store     -8.50
    Movie Theater      -9.49
    Grocery Store     -16.43
    Movie Theater     -23.74
    Gas Station       -11.84
    Good Person Rew   -52.00
    Good Person Rew    39.40
    Grocery Store      -3.29
                      -85.89
Thu --------------- --------
    Grocery Store      -8.21
    Gas Station       -12.60
    Grocery Store      -4.71
    Gas Station       -31.50
    Grocery Store     -16.17
    Good Person Rew   -44.82
    Good Person Rew    35.15
    Clothing Store     -5.41
                      -88.27
Fri --------------- --------
    Clothing Store    -13.52
    Gas Station        -0.50
    Movie Theater      -6.54
    Gas Station        -1.25
    Clothing Store    -18.88
    Good Person Rew   -70.02
    Good Person Rew    29.85
                      -80.86
-----------------------
           expenses  -576.62
             income   151.36
                net  -425.26
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;using this Python script:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#!/usr/bin/env python
from __future__ import print_function

import os
import requests
import time
from decimal import Decimal
from datetime import datetime
from collections import defaultdict

access_url = open(os.path.expanduser(&apos;~/.simplefin-access&apos;), &apos;rb&apos;).read().strip()
scheme, rest = access_url.split(&apos;//&apos;, 1)
auth, rest = rest.split(&apos;@&apos;, 1)
url = scheme + &apos;//&apos; + rest + &apos;/accounts&apos;
auth = tuple(auth.split(&apos;:&apos;, 1))

day = 24 * 60 * 60
today = time.mktime(datetime.now().date().timetuple())
week_ago = int(today - 3 * day)

by_day = defaultdict(list)

params = {&apos;start-date&apos;: week_ago}
response = requests.get(url, params=params, auth=auth)
data = response.json()

for account in data[&apos;accounts&apos;]:
    for trans in account[&apos;transactions&apos;]:
        trans[&apos;posted&apos;] = datetime.fromtimestamp(trans[&apos;posted&apos;])
        by_day[trans[&apos;posted&apos;].date()].append(trans)

pos_total = Decimal(&apos;0&apos;)
neg_total = Decimal(&apos;0&apos;)

for day in sorted(by_day)[1:]:
    print(&apos;{0} --------------- --------&apos;.format(day.strftime(&apos;%a&apos;)))
    transactions = sorted(by_day[day], key=lambda x:x[&apos;posted&apos;])
    pos = Decimal(&apos;0&apos;)
    neg = Decimal(&apos;0&apos;)
    for trans in transactions:
        amount = Decimal(trans[&apos;amount&apos;])
        this_neg = &apos;&apos;
        this_pos = &apos;&apos;
        if amount &amp;gt;= 0:
            this_pos = amount
            pos += amount
        else:
            this_neg = amount
            neg += amount
        print(&apos;    {memo:&amp;lt;15} {amount:&amp;gt;8}&apos;.format(
            memo=trans[&apos;description&apos;][:15],
            amount=amount,
        ))
    pos_total += pos
    neg_total += neg
    print(&apos;    {empty:&amp;lt;15} {amount:&amp;gt;8}&apos;.format(
        empty=&apos;&apos;,
        amount=neg+pos,
    ))

print(&apos;-&apos;*23)
print(&apos;    {0:&amp;gt;15} {1:&amp;gt;8}&apos;.format(&apos;expenses&apos;, neg_total))
print(&apos;    {0:&amp;gt;15} {1:&amp;gt;8}&apos;.format(&apos;income&apos;, pos_total))
print(&apos;    {0:&amp;gt;15} {1:&amp;gt;8}&apos;.format(&apos;net&apos;, neg_total + pos_total))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you want to see your real transaction data on the command line, sign up to be an Alpha tester on the &lt;a href=&quot;https://bridge.simplefin.org&quot;&gt;SimpleFIN Bridge.&lt;/a&gt;  It costs $0.50/bank/month billed 3 months at a time.&lt;/p&gt;

</description>
        <pubDate>Thu, 09 Jun 2016 00:00:00 +0000</pubDate>
        <link>http://simplefin.org/2016/06/09/last-week.html</link>
        <guid isPermaLink="true">http://simplefin.org/2016/06/09/last-week.html</guid>
        
        
      </item>
    
      <item>
        <title>Put you bank account balance in your bash prompt</title>
        <description>&lt;p&gt;Here’s a silly demo.&lt;/p&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://asciinema.org/a/1l749fb4u0ard6ziclabhym2i.js&quot; id=&quot;asciicast-1l749fb4u0ard6ziclabhym2i&quot; async=&quot;&quot; data-speed=&quot;3&quot; data-autoplay=&quot;true&quot;&gt;&lt;/script&gt;

&lt;p&gt;Sign up at &lt;a href=&quot;https://bridge.simplefin.org&quot;&gt;bridge.simplefin.org&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 07 Jul 2015 00:00:00 +0000</pubDate>
        <link>http://simplefin.org/2015/07/07/balance-in-prompt.html</link>
        <guid isPermaLink="true">http://simplefin.org/2015/07/07/balance-in-prompt.html</guid>
        
        
      </item>
    
  </channel>
</rss>
