<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Ken Okabe · {:ok, software engineer} - Blog</title>
    <subtitle>Elixir-loving software engineer based in Tokyo, Japan. Experienced in embedded systems and web development, focusing on creating meaningful solutions from scratch.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://kenokabe.com/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://kenokabe.com/blog/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-28T00:00:00+00:00</updated>
    <id>https://kenokabe.com/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>How much do I owe Kickstarter? A Livebook tells me.</title>
        <published>2026-04-28T00:00:00+00:00</published>
        <updated>2026-04-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kenokabe.com/blog/20260428-kickstarter-budget-notebook/"/>
        <id>https://kenokabe.com/blog/20260428-kickstarter-budget-notebook/</id>
        
        <content type="html" xml:base="https://kenokabe.com/blog/20260428-kickstarter-budget-notebook/">&lt;p&gt;How much will I owe Kickstarter this month? For a long time, I had no idea.&lt;&#x2F;p&gt;
&lt;p&gt;I back a lot of campaigns on Kickstarter. Enough that the platform calls me a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kickstarter.com&#x2F;profile&#x2F;kenokabe&quot;&gt;superbacker&lt;&#x2F;a&gt;, which is what they call you when your backing count crosses some threshold (though I’m not exactly sure what that threshold is). Sometimes a dozen or so of my pledges are still active, in a handful of foreign currencies, due on irregular dates spread across the next few months.&lt;&#x2F;p&gt;
&lt;p&gt;What I always wanted was a single number. Across all those active pledges, in JPY (my home currency), after my bank&#x27;s foreign-transaction fee — what am I going to owe over the next few months? Useful for budgeting. Useful for deciding whether to back a thing.&lt;&#x2F;p&gt;
&lt;p&gt;But the number doesn&#x27;t exist anywhere. Kickstarter doesn&#x27;t aggregate. (Probably good for Kickstarter creators; clearly inconvenient for backers.) Notion templates assume one currency. Budget SaaS assume monthly recurring charges. Nothing I tried knew what to do with one-off pledges that hit the card months later in mixed currencies plus an FTF.&lt;&#x2F;p&gt;
&lt;p&gt;So I built a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;livebook.dev&#x2F;&quot;&gt;Livebook&lt;&#x2F;a&gt; notebook that does the math. (Livebook is a free desktop app for interactive Elixir notebooks — you don&#x27;t need to know Elixir to use one.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h2&gt;
&lt;p&gt;Everything runs entirely locally — no login, no financial data uploaded anywhere. A small bookmarklet (included) reads the Kickstarter backings page into JSON. We paste the JSON into the notebook, pick a home currency, and it shows us:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A live, reactive table grouped by deadline month&lt;&#x2F;li&gt;
&lt;li&gt;Per-pledge currency conversion into whatever home currency we chose&lt;&#x2F;li&gt;
&lt;li&gt;A foreign-transaction-fee adjustment, tweakable in real time (3% by default)&lt;&#x2F;li&gt;
&lt;li&gt;Per-month totals and a grand total across everything active&lt;&#x2F;li&gt;
&lt;li&gt;Checkboxes to toggle individual pledges on and off, so we can play out different combinations while we&#x27;re deciding what to back next&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;kenokabe&#x2F;livebooks&#x2F;src&#x2F;branch&#x2F;main&#x2F;kickstarter_budget.livemd&quot;&gt;&lt;strong&gt;The notebook lives here on Codeberg →&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-a-livebook-not-an-app&quot;&gt;Why a Livebook, not an app?&lt;&#x2F;h2&gt;
&lt;p&gt;I picked a notebook over the alternatives because each alternative demanded something. A web app wants a server, users, eventually a privacy policy. A CLI wants someone to know it exists. Even a desktop app wants packaging and updates. A notebook just sits there as a &lt;code&gt;.livemd&lt;&#x2F;code&gt; file. You open it, you run it, you fork it if you want to tweak the defaults. There&#x27;s nothing for me to maintain on anyone else&#x27;s behalf.&lt;&#x2F;p&gt;
&lt;p&gt;And it keeps me honest about scope. An app would slowly grow features. A notebook is what it is: this is what it does, this is the code that does it, that&#x27;s all. No v2.&lt;&#x2F;p&gt;
&lt;p&gt;Most Livebook content I run across is data analysis or ML demos, which makes sense — it&#x27;s what Livebook was built for. But it works just as well as a way to ship small personal tools. The notebook &lt;em&gt;is&lt;&#x2F;em&gt; the documentation; someone who wants to use the thing reads how it works in the same place they run it. I think more people should try this shape for the everyday stuff the big apps don&#x27;t bother with.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;&#x2F;h2&gt;
&lt;p&gt;If you also back Kickstarter campaigns, give it a spin. I&#x27;m on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.social&#x2F;@kenokabe&quot;&gt;Mastodon&lt;&#x2F;a&gt; — happy to chat or hear about edge cases the notebook doesn&#x27;t yet handle. There&#x27;s also an &lt;a href=&quot;&#x2F;blog&#x2F;atom.xml&quot;&gt;RSS feed&lt;&#x2F;a&gt; if you&#x27;d like to know when more posts go up.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hello, world</title>
        <published>2026-04-20T00:00:00+00:00</published>
        <updated>2026-04-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kenokabe.com/blog/20260420-hello-world/"/>
        <id>https://kenokabe.com/blog/20260420-hello-world/</id>
        
        <content type="html" xml:base="https://kenokabe.com/blog/20260420-hello-world/">&lt;p&gt;It felt right to start this the way every program does.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been away from programming for a while — long enough to forget half my Vim commands and most of what I once knew about Phoenix. Putting both back is the quiet work of these recent weeks, and I figured I might as well write it down as I go.&lt;&#x2F;p&gt;
&lt;p&gt;So this is a notebook, not a magazine. Expect short posts — some tiny, some a little longer — about Elixir, embedded things from earlier in my career, the occasional machine-learning detour, and the small tools that make a developer&#x27;s day smoother. Nothing here is meant as a definitive guide; think of it as working out loud.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;d like to follow along, the &lt;a href=&quot;&#x2F;blog&#x2F;atom.xml&quot;&gt;RSS feed&lt;&#x2F;a&gt; is the most reliable way, and you can also find me on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.social&#x2F;@kenokabe&quot;&gt;Mastodon&lt;&#x2F;a&gt;. Corrections are welcome — I learn fastest when someone tells me I&#x27;m wrong.&lt;&#x2F;p&gt;
&lt;p&gt;More soon.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
