<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>wbnns / notes</title>
    <link>https://wbnns.com/notes/</link>
    <description>Misc. et al.</description>
    <atom:link href="https://wbnns.com/notes/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Three seams in a twelve-second loop</title>
      <link>https://wbnns.com/notes/three-seams-in-a-twelve-second-loop/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/three-seams-in-a-twelve-second-loop/</guid>
      <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
      <description>An animated mark that visibly restarted. Every fix exposed the next seam underneath it.</description>
    </item>
    <item>
      <title>Two deduplication windows, because the idle notice arrives late</title>
      <link>https://wbnns.com/notes/two-dedupe-windows-and-an-idle-notice-that-arrives-late/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/two-dedupe-windows-and-an-idle-notice-that-arrives-late/</guid>
      <pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate>
      <description>A notifier for agent sessions cannot use one dedupe window. A finished turn and a permission prompt do not arrive on the same clock.</description>
    </item>
    <item>
      <title>An undocumented ceiling, and the only paging on offer</title>
      <link>https://wbnns.com/notes/an-undocumented-ceiling-and-the-only-paging-on-offer/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/an-undocumented-ceiling-and-the-only-paging-on-offer/</guid>
      <pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate>
      <description>One route showed 58 departure dates out of 181, and the board drew the rest as no flight. The answer was truncated, not empty.</description>
    </item>
    <item>
      <title>Six weeks looking for a signal, and what was left when there wasn't one</title>
      <link>https://wbnns.com/notes/six-weeks-looking-for-a-signal-and-what-was-left/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/six-weeks-looking-for-a-signal-and-what-was-left/</guid>
      <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
      <description>No tradable direction in these pools, and a fee side that nets to nothing. What is left is the emissions.</description>
    </item>
    <item>
      <title>Redacting network identifiers from a debug report</title>
      <link>https://wbnns.com/notes/redacting-network-identifiers-from-a-debug-report/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/redacting-network-identifiers-from-a-debug-report/</guid>
      <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
      <description>Stop omarchy-debug output from carrying the reporter's access point, LAN devices and paired hardware into a public issue.</description>
    </item>
    <item>
      <title>The two-pointer merge that never reached the chart file</title>
      <link>https://wbnns.com/notes/the-two-pointer-merge-that-never-reached-the-chart-file/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/the-two-pointer-merge-that-never-reached-the-chart-file/</guid>
      <pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate>
      <description>One page took ten seconds to render. The fix was already written, commented and shipped in a sibling file.</description>
    </item>
    <item>
      <title>Four sets of vendor claims, and why none of them can be ranked</title>
      <link>https://wbnns.com/notes/hearwrite-vs-the-hosted-transcribers/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/hearwrite-vs-the-hosted-transcribers/</guid>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <description>One transcription system measured properly against four sets of published numbers, almost none of which compare to each other.</description>
    </item>
    <item>
      <title>Streaming transcription, speaker labels and endpointing from open weights on a CPU</title>
      <link>https://wbnns.com/notes/streaming-transcription-speaker-labels-endpointing-open/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/streaming-transcription-speaker-labels-endpointing-open/</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <description>Get what Meta's Muse Voice Transcribe does from one closed model, words, speaker labels, endpoints, out of separate open components, on a CPU, with the audio never leaving the machine.</description>
    </item>
    <item>
      <title>Forking the Farcaster client: what you actually need</title>
      <link>https://wbnns.com/notes/forking-the-farcaster-client/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/forking-the-farcaster-client/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>The client is open source. The API is not. What actually sits between the protocol and a working app.</description>
    </item>
    <item>
      <title>Mail configuration as desired state, with a credential-free drift gate</title>
      <link>https://wbnns.com/notes/mail-configuration-desired-state-credential-free-drift-gate/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/mail-configuration-desired-state-credential-free-drift-gate/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>Put mail configuration under version control, and have something tell me when the live system no longer matches what is committed.</description>
    </item>
    <item>
      <title>Measuring oracle staleness against a market that never closes</title>
      <link>https://wbnns.com/notes/measuring-oracle-staleness-against-market-never-closes/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/measuring-oracle-staleness-against-market-never-closes/</guid>
      <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
      <description>Tokenized stocks trade 24/7 on Base. The Chainlink oracle pricing them updates on a deviation trigger with no off-hours heartbeat. Find out how big that gap actually gets, and publish it.</description>
    </item>
    <item>
      <title>Testing a content corpus like code, so an unsourced fact fails the build</title>
      <link>https://wbnns.com/notes/testing-content-corpus-like-code-so-unsourced-fact-fails/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/testing-content-corpus-like-code-so-unsourced-fact-fails/</guid>
      <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
      <description>An independent guide to Pico Island that does two jobs and no others: rank in search, and get cited by answer engines. Everything that served neither came off.</description>
    </item>
    <item>
      <title>Selling placement instead of advice, in a directory companies claim by domain</title>
      <link>https://wbnns.com/notes/selling-placement-instead-advice-directory-companies-claim/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/selling-placement-instead-advice-directory-companies-claim/</guid>
      <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
      <description>Legal and immigration advice is a reserved act in Portugal, so the obvious business is closed. Be the reference people check first instead, and sell placement in a directory rather than advice.</description>
    </item>
    <item>
      <title>One page, seven files, and the two that decide whether it deploys</title>
      <link>https://wbnns.com/notes/one-page-seven-files-two-decide-whether-deploys/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/one-page-seven-files-two-decide-whether-deploys/</guid>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
      <description>A single page, no build step, no dependencies.</description>
    </item>
    <item>
      <title>Custom domains on GitHub Pages: five absolute URLs and one DNS setting</title>
      <link>https://wbnns.com/notes/custom-domains-github-pages-five-absolute-urls-one-dns/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/custom-domains-github-pages-five-absolute-urls-one-dns/</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <description>A prototype for Pico: live webcam views, current conditions, and what islanders are reporting right now. Fog on the crossings, caravelas in the pools, whales off Lajes. A *vigia* was the cliff-top tower where a spotter watched for whales and signalled the boats.</description>
    </item>
    <item>
      <title>A daily report on a systemd timer instead of a crontab line</title>
      <link>https://wbnns.com/notes/a-daily-report-on-a-systemd-timer-instead-of-a-crontab-line/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-daily-report-on-a-systemd-timer-instead-of-a-crontab-line/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>A daily go-to-market report that runs itself and puts the numbers somewhere I will actually see them.</description>
    </item>
    <item>
      <title>Manifest V3 never killed cosmetic filtering</title>
      <link>https://wbnns.com/notes/manifest-v3-never-killed-cosmetic-filtering/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/manifest-v3-never-killed-cosmetic-filtering/</guid>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
      <description>Chrome's Manifest V2 removal killed uBlock Origin, and with it years of hand-written cosmetic filters people had tuned to their own annoyances. uBlock Origin Lite is declarative by design: no custom filters, no element picker. Get the custom filters back.</description>
    </item>
    <item>
      <title>Keeping the model out of the verdict path</title>
      <link>https://wbnns.com/notes/keeping-the-model-out-of-the-verdict-path/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/keeping-the-model-out-of-the-verdict-path/</guid>
      <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
      <description>Measure which online communities actually produce paying customers, and withhold a verdict until the evidence supports one. *Madrugar* is Portuguese for rising before dawn.</description>
    </item>
    <item>
      <title>One command that decides whether the work is done</title>
      <link>https://wbnns.com/notes/one-command-that-decides-whether-the-work-is-done/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/one-command-that-decides-whether-the-work-is-done/</guid>
      <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
      <description>A One Shot build where the thing worth recording is not the kit but the gate.</description>
    </item>
    <item>
      <title>A Rails starter whose Stripe billing runs with zero external accounts</title>
      <link>https://wbnns.com/notes/rails-starter-whose-stripe-billing-runs-zero-external/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/rails-starter-whose-stripe-billing-runs-zero-external/</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
      <description>Every prototype needs the same six things before it can do the one thing it exists for. Ship those done, so the work is the actual product.</description>
    </item>
    <item>
      <title>Hotwire Native, and deciding which screens stop being web views</title>
      <link>https://wbnns.com/notes/hotwire-native-deciding-which-screens-stop-being-web-views/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/hotwire-native-deciding-which-screens-stop-being-web-views/</guid>
      <pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate>
      <description>The working repo for One Shot. Same kit as shiponeshot; the piece specific here is mobile/.</description>
    </item>
    <item>
      <title>One Stripe account, and every endpoint gets every event</title>
      <link>https://wbnns.com/notes/one-stripe-account-and-every-endpoint-gets-every-event/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/one-stripe-account-and-every-endpoint-gets-every-event/</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
      <description>Stripe warned that one product's webhook was failing. The events breaking it belonged to a different product entirely.</description>
    </item>
    <item>
      <title>The lever on agent token cost is turns, not transport</title>
      <link>https://wbnns.com/notes/the-lever-on-agent-token-cost-is-turns-not-transport/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/the-lever-on-agent-token-cost-is-turns-not-transport/</guid>
      <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
      <description>Switching a messaging agent from polling to streaming is supposed to cut cost. Past a certain arrival rate it does the opposite.</description>
    </item>
    <item>
      <title>Assembling a reproducible exam from a bank that cannot satisfy every constraint</title>
      <link>https://wbnns.com/notes/assembling-reproducible-exam-bank-cannot-satisfy-every/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/assembling-reproducible-exam-bank-cannot-satisfy-every/</guid>
      <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
      <description>Train people for the CIPLE, the official A2-level European Portuguese certificate, as a subscription platform. Reading and writing in v1.</description>
    </item>
    <item>
      <title>Twenty lines of shell that sync a notes repo and never shout about it</title>
      <link>https://wbnns.com/notes/twenty-lines-shell-sync-notes-repo-never-shout-about/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/twenty-lines-shell-sync-notes-repo-never-shout-about/</guid>
      <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
      <description>Keep a notes repo in sync across machines on a timer, and never interrupt me about it.</description>
    </item>
    <item>
      <title>Two operating systems, one dotfiles repo, no conditionals</title>
      <link>https://wbnns.com/notes/two-operating-systems-one-dotfiles-repo-no-conditionals/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/two-operating-systems-one-dotfiles-repo-no-conditionals/</guid>
      <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
      <description>One dotfiles repo for macOS workstations and Linux servers, without scattering OS conditionals through twenty files.</description>
    </item>
    <item>
      <title>Serving one documentation corpus to people and to agents</title>
      <link>https://wbnns.com/notes/serving-one-documentation-corpus-to-people-and-to-agents/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/serving-one-documentation-corpus-to-people-and-to-agents/</guid>
      <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
      <description>Documentation is increasingly read by something that is not a person. Serve that reader properly instead of wrapping content in navigation chrome.</description>
    </item>
    <item>
      <title>A static site with exactly one server route</title>
      <link>https://wbnns.com/notes/a-static-site-with-exactly-one-server-route/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-static-site-with-exactly-one-server-route/</guid>
      <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
      <description>Find out whether anyone wanted a CIPLE course before building one.</description>
    </item>
    <item>
      <title>Edge-triggered alerting for a registration window that closes in minutes</title>
      <link>https://wbnns.com/notes/edge-triggered-alerting-registration-window-closes-minutes/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/edge-triggered-alerting-registration-window-closes-minutes/</guid>
      <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
      <description>CIPLE A2 registration in Portugal fills within minutes of opening, with no notification, no waitlist and no published time. Get told the moment it opens.</description>
    </item>
    <item>
      <title>When browser LCP measures the wrong thing on a feed</title>
      <link>https://wbnns.com/notes/when-browser-lcp-measures-the-wrong-thing-on-a-feed/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/when-browser-lcp-measures-the-wrong-thing-on-a-feed/</guid>
      <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
      <description>Largest Contentful Paint was measuring the wrong thing on an image feed, so measure the right one.</description>
    </item>
    <item>
      <title>Designing the type first and building the whole dashboard against mocks</title>
      <link>https://wbnns.com/notes/designing-type-first-building-whole-dashboard-against-mocks/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/designing-type-first-building-whole-dashboard-against-mocks/</guid>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
      <description>An operator dashboard for a trading bot that reads and never acts.</description>
    </item>
    <item>
      <title>The two places an Astro site can put an image, and why it matters</title>
      <link>https://wbnns.com/notes/two-places-astro-site-can-put-image-why-matters/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/two-places-astro-site-can-put-image-why-matters/</guid>
      <pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate>
      <description>My CV and photography. The repo dates to October 2017; the Astro site in it was written in February 2026, and everything before that was a different site under the same name.</description>
    </item>
    <item>
      <title>Four agent lifecycles, one markdown file format</title>
      <link>https://wbnns.com/notes/four-agent-lifecycles-one-markdown-file-format/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/four-agent-lifecycles-one-markdown-file-format/</guid>
      <pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate>
      <description>Autonomous agent management for Claude Code, where every agent is a markdown file you can read, grep and edit.</description>
    </item>
    <item>
      <title>Symlinking dependencies so N worktrees do not mean N node_modules</title>
      <link>https://wbnns.com/notes/symlinking-dependencies-so-n-worktrees-do-not-mean-n-node/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/symlinking-dependencies-so-n-worktrees-do-not-mean-n-node/</guid>
      <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
      <description>Run several Claude Code sessions in parallel without paying for a full checkout each time.</description>
    </item>
    <item>
      <title>Hand-written API docs, and the drift they cannot detect</title>
      <link>https://wbnns.com/notes/hand-written-api-docs-and-the-drift-they-cannot-detect/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/hand-written-api-docs-and-the-drift-they-cannot-detect/</guid>
      <pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate>
      <description>Document a small API by writing the docs, rather than generating a reference from a spec.</description>
    </item>
    <item>
      <title>A trailing stop whose distance is a function of realized profit</title>
      <link>https://wbnns.com/notes/trailing-stop-whose-distance-function-realized-profit/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/trailing-stop-whose-distance-function-realized-profit/</guid>
      <pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate>
      <description>A trading bot for Zora markets where the risk management, not the signal, is the product.</description>
    </item>
    <item>
      <title>A weekly release digest that ran for a year</title>
      <link>https://wbnns.com/notes/a-weekly-release-digest-that-ran-for-a-year/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-weekly-release-digest-that-ran-for-a-year/</guid>
      <pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate>
      <description>Framed as an OP Stack consulting site. What actually accumulated is _posts/: a year of weekly OP Stack release digests.</description>
    </item>
    <item>
      <title>Duplicate detection without an API</title>
      <link>https://wbnns.com/notes/duplicate-detection-without-an-api/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/duplicate-detection-without-an-api/</guid>
      <pubDate>Sat, 06 Sep 2025 00:00:00 GMT</pubDate>
      <description>Submit to Hacker News in one keystroke without breaking the guidelines or posting a duplicate.</description>
    </item>
    <item>
      <title>The parts an indexer grows: a rate limiter, a verify queue, and a WAL-safe backup</title>
      <link>https://wbnns.com/notes/parts-indexer-grows-rate-limiter-verify-queue-wal-safe/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/parts-indexer-grows-rate-limiter-verify-queue-wal-safe/</guid>
      <pubDate>Sat, 16 Aug 2025 00:00:00 GMT</pubDate>
      <description>Ingest Zora markets into a queryable local database, and keep it correct while it runs.</description>
    </item>
    <item>
      <title>Serving a PWA manifest and service worker through the Rails view layer</title>
      <link>https://wbnns.com/notes/serving-pwa-manifest-service-worker-through-rails-view-layer/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/serving-pwa-manifest-service-worker-through-rails-view-layer/</guid>
      <pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate>
      <description>The app itself. The README is the stock Rails placeholder, so the tree is the record.</description>
    </item>
    <item>
      <title>A reader with no account, and the post identity problem that creates</title>
      <link>https://wbnns.com/notes/reader-no-account-post-identity-problem-creates/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/reader-no-account-post-identity-problem-creates/</guid>
      <pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate>
      <description>Only what you follow, nothing else. A reader for public Instagram and Twitter accounts over RSS, with no account and no server.</description>
    </item>
    <item>
      <title>Magic-link auth: the decisions the gem does not make for you</title>
      <link>https://wbnns.com/notes/magic-link-auth-the-decisions-the-gem-does-not-make-for-you/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/magic-link-auth-the-decisions-the-gem-does-not-make-for-you/</guid>
      <pubDate>Fri, 23 May 2025 00:00:00 GMT</pubDate>
      <description>A Rails 8 starting template with the authentication decisions already made rather than left to the gem.</description>
    </item>
    <item>
      <title>Thread-local SQLite connections, and the write lock underneath them</title>
      <link>https://wbnns.com/notes/thread-local-sqlite-connections-write-lock-underneath-them/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/thread-local-sqlite-connections-write-lock-underneath-them/</guid>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <description>Index Base contract deployers and count activity per contract.</description>
    </item>
    <item>
      <title>Turning a week of GitHub activity into Notion blocks</title>
      <link>https://wbnns.com/notes/turning-a-week-of-github-activity-into-notion-blocks/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/turning-a-week-of-github-activity-into-notion-blocks/</guid>
      <pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate>
      <description>Building in public should not require remembering to write anything down. Pull the week's GitHub activity and post it to Notion automatically.</description>
    </item>
    <item>
      <title>Partial success as the default outcome of a cross-post</title>
      <link>https://wbnns.com/notes/partial-success-as-the-default-outcome-of-a-cross-post/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/partial-success-as-the-default-outcome-of-a-cross-post/</guid>
      <pubDate>Thu, 21 Nov 2024 00:00:00 GMT</pubDate>
      <description>The cost of posting is not the typing, it is opening three apps designed to keep you there. Send one Telegram message and have it fan out to Bluesky, Farcaster and X.</description>
    </item>
    <item>
      <title>A frame image written as JSX, rendered on the response path</title>
      <link>https://wbnns.com/notes/a-frame-image-written-as-jsx-rendered-on-the-response-path/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-frame-image-written-as-jsx-rendered-on-the-response-path/</guid>
      <pubDate>Sat, 05 Oct 2024 00:00:00 GMT</pubDate>
      <description>Build a Farcaster frame with Frog, where the frame image is written as JSX rather than drawn.</description>
    </item>
    <item>
      <title>A todo list that lives in contract storage</title>
      <link>https://wbnns.com/notes/a-todo-list-that-lives-in-contract-storage/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-todo-list-that-lives-in-contract-storage/</guid>
      <pubDate>Fri, 16 Aug 2024 00:00:00 GMT</pubDate>
      <description>A todo list where tasks live in contract storage instead of a database, so people can see what you are working on without you publishing anything.</description>
    </item>
    <item>
      <title>Publishing a snapshot's size without hosting the snapshot</title>
      <link>https://wbnns.com/notes/publishing-a-snapshots-size-without-hosting-the-snapshot/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/publishing-a-snapshots-size-without-hosting-the-snapshot/</guid>
      <pubDate>Thu, 08 Aug 2024 00:00:00 GMT</pubDate>
      <description>Node operators need to know how much disk a Base node takes when restoring from a snapshot, before they provision. The number moves weekly and was published nowhere convenient.</description>
    </item>
    <item>
      <title>Reading a directory from its own JSON instead of its HTML</title>
      <link>https://wbnns.com/notes/reading-a-directory-from-its-own-json-instead-of-its-html/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/reading-a-directory-from-its-own-json-instead-of-its-html/</guid>
      <pubDate>Tue, 06 Aug 2024 00:00:00 GMT</pubDate>
      <description>Get every project URL out of base.org/ecosystem in one click.</description>
    </item>
    <item>
      <title>Where an ecosystem ends, and the headline number that moves with it</title>
      <link>https://wbnns.com/notes/where-ecosystem-ends-headline-number-moves/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/where-ecosystem-ends-headline-number-moves/</guid>
      <pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate>
      <description>Keep Base's entry current in the dataset behind everyone's developer-count charts.</description>
    </item>
    <item>
      <title>Two block explorers, one address graph, and a result cap that truncates silently</title>
      <link>https://wbnns.com/notes/two-block-explorers-one-address-graph-result-cap-truncates/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/two-block-explorers-one-address-graph-result-cap-truncates/</guid>
      <pubDate>Sun, 02 Jun 2024 00:00:00 GMT</pubDate>
      <description>Get every address that sent a transaction to a target address, across Ethereum and Base, as a CSV. Useful for allowlists and for seeing who actually interacted with something.</description>
    </item>
    <item>
      <title>MTProto is not the Bot API, and the session file is a credential</title>
      <link>https://wbnns.com/notes/mtproto-not-bot-api-session-file-credential/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/mtproto-not-bot-api-session-file-credential/</guid>
      <pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate>
      <description>Export your Telegram chat titles to CSV so they can go into a spreadsheet.</description>
    </item>
    <item>
      <title>Keeping the raw payload next to the derived report</title>
      <link>https://wbnns.com/notes/keeping-the-raw-payload-next-to-the-derived-report/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/keeping-the-raw-payload-next-to-the-derived-report/</guid>
      <pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate>
      <description>Check a token's security and rug-pull risk, and keep what the check said.</description>
    </item>
    <item>
      <title>A CI check that reads a diff and validates it against another repo</title>
      <link>https://wbnns.com/notes/ci-check-reads-diff-validates-against-another-repo/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/ci-check-reads-diff-validates-against-another-repo/</guid>
      <pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate>
      <description>Stop a wrong token definition reaching the Base bridge by checking it in CI.</description>
    </item>
    <item>
      <title>A UNIQUE constraint as the idempotency mechanism</title>
      <link>https://wbnns.com/notes/a-unique-constraint-as-the-idempotency-mechanism/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-unique-constraint-as-the-idempotency-mechanism/</guid>
      <pubDate>Fri, 09 Feb 2024 00:00:00 GMT</pubDate>
      <description>Poll Farcaster casts, extract links, and process each cast exactly once.</description>
    </item>
    <item>
      <title>One guild setting as an anti-scam control</title>
      <link>https://wbnns.com/notes/one-guild-setting-as-an-anti-scam-control/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/one-guild-setting-as-an-anti-scam-control/</guid>
      <pubDate>Wed, 07 Feb 2024 00:00:00 GMT</pubDate>
      <description>New members of a crypto-adjacent Discord get DMed within minutes by someone pretending to be support, and the server's moderation never sees it because it does not happen in the server. Turn member-to-member DMs off, through the API.</description>
    </item>
    <item>
      <title>A Farcaster frame is meta tags and a POST handler</title>
      <link>https://wbnns.com/notes/a-farcaster-frame-is-meta-tags-and-a-post-handler/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-farcaster-frame-is-meta-tags-and-a-post-handler/</guid>
      <pubDate>Sun, 28 Jan 2024 00:00:00 GMT</pubDate>
      <description>Find out how small the Farcaster Frames protocol actually is by building one on plain Flask.</description>
    </item>
    <item>
      <title>Minting from a button press, and the verification that has to sit behind it</title>
      <link>https://wbnns.com/notes/minting-button-press-verification-has-sit-behind/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/minting-button-press-verification-has-sit-behind/</guid>
      <pubDate>Sat, 27 Jan 2024 00:00:00 GMT</pubDate>
      <description>Mint an NFT from a button press inside a Farcaster feed.</description>
    </item>
    <item>
      <title>On-chain randomness you can read before you guess</title>
      <link>https://wbnns.com/notes/on-chain-randomness-you-can-read-before-you-guess/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/on-chain-randomness-you-can-read-before-you-guess/</guid>
      <pubDate>Thu, 25 Jan 2024 00:00:00 GMT</pubDate>
      <description>A guess-the-number game with a prize pot, and why the number was never actually hidden.</description>
    </item>
    <item>
      <title>The block number is the token id</title>
      <link>https://wbnns.com/notes/the-block-number-is-the-token-id/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/the-block-number-is-the-token-id/</guid>
      <pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate>
      <description>Make the scarce thing the block, not the artwork. Be the first person to mint an NFT in each new Base block.</description>
    </item>
    <item>
      <title>A contract project caught halfway between Truffle and Hardhat</title>
      <link>https://wbnns.com/notes/contract-project-caught-halfway-between-truffle-hardhat/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/contract-project-caught-halfway-between-truffle-hardhat/</guid>
      <pubDate>Mon, 08 Jan 2024 00:00:00 GMT</pubDate>
      <description>A contract project caught halfway between Truffle and Hardhat.</description>
    </item>
    <item>
      <title>What an indexer has to solve that a node does not</title>
      <link>https://wbnns.com/notes/what-an-indexer-has-to-solve-that-a-node-does-not/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/what-an-indexer-has-to-solve-that-a-node-does-not/</guid>
      <pubDate>Sun, 19 Nov 2023 00:00:00 GMT</pubDate>
      <description>Build a Base indexer from scratch, to understand what an indexer has to solve that a node does not.</description>
    </item>
    <item>
      <title>Two package.json files, one repo, no workspace</title>
      <link>https://wbnns.com/notes/two-package-json-files-one-repo-no-workspace/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/two-package-json-files-one-repo-no-workspace/</guid>
      <pubDate>Tue, 26 Sep 2023 00:00:00 GMT</pubDate>
      <description>Onchain insights and analytics for Base, as an Express backend and a Create React App frontend.</description>
    </item>
    <item>
      <title>A gateway websocket and a web server in one process</title>
      <link>https://wbnns.com/notes/a-gateway-websocket-and-a-web-server-in-one-process/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-gateway-websocket-and-a-web-server-in-one-process/</guid>
      <pubDate>Sat, 02 Sep 2023 00:00:00 GMT</pubDate>
      <description>Capture Discord server metrics over time and serve them from a small web app in the same process.</description>
    </item>
    <item>
      <title>Bridging an ERC-20 to Base with cast and nothing else</title>
      <link>https://wbnns.com/notes/bridging-an-erc-20-to-base-with-cast-and-nothing-else/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/bridging-an-erc-20-to-base-with-cast-and-nothing-else/</guid>
      <pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate>
      <description>Write down the handful of Base operations worth doing from the command line, where nothing is hidden.</description>
    </item>
    <item>
      <title>Adding a network to a token list that moves real funds</title>
      <link>https://wbnns.com/notes/adding-a-network-to-a-token-list-that-moves-real-funds/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/adding-a-network-to-a-token-list-that-moves-real-funds/</guid>
      <pubDate>Wed, 19 Jul 2023 00:00:00 GMT</pubDate>
      <description>Add the Base mainnet definition to the Optimism token list, the file bridges and interfaces read to resolve a token.</description>
    </item>
    <item>
      <title>The nonce is not the transaction count</title>
      <link>https://wbnns.com/notes/the-nonce-is-not-the-transaction-count/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/the-nonce-is-not-the-transaction-count/</guid>
      <pubDate>Tue, 30 May 2023 00:00:00 GMT</pubDate>
      <description>Extract bits of onchain information about Base from the shell.</description>
    </item>
    <item>
      <title>A faucet whose reward scales with what you hold</title>
      <link>https://wbnns.com/notes/a-faucet-whose-reward-scales-with-what-you-hold/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-faucet-whose-reward-scales-with-what-you-hold/</guid>
      <pubDate>Mon, 22 May 2023 00:00:00 GMT</pubDate>
      <description>An ETH faucet that pays by merit rather than a flat drip, and the three places that idea leaks.</description>
    </item>
    <item>
      <title>&quot;Has this person committed anything&quot; has no correct answer</title>
      <link>https://wbnns.com/notes/has-this-person-committed-anything-has-no-correct-answer/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/has-this-person-committed-anything-has-no-correct-answer/</guid>
      <pubDate>Mon, 08 May 2023 00:00:00 GMT</pubDate>
      <description>Answer &quot;has this GitHub username committed anything, and how much&quot; as a package.</description>
    </item>
    <item>
      <title>A queue in front of a simulcast, and the double-post it invites</title>
      <link>https://wbnns.com/notes/queue-front-simulcast-double-post-invites/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/queue-front-simulcast-double-post-invites/</guid>
      <pubDate>Thu, 04 May 2023 00:00:00 GMT</pubDate>
      <description>Queue posts and simulcast them to Farcaster and Twitter.</description>
    </item>
    <item>
      <title>Link rot in a curated list</title>
      <link>https://wbnns.com/notes/link-rot-in-a-curated-list/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/link-rot-in-a-curated-list/</guid>
      <pubDate>Fri, 28 Apr 2023 00:00:00 GMT</pubDate>
      <description>There was no list of Base ecosystem links, so make one.</description>
    </item>
    <item>
      <title>A security policy for a repo that runs other people's nodes</title>
      <link>https://wbnns.com/notes/a-security-policy-for-a-repo-that-runs-other-peoples-nodes/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-security-policy-for-a-repo-that-runs-other-peoples-nodes/</guid>
      <pubDate>Fri, 24 Feb 2023 00:00:00 GMT</pubDate>
      <description>Give the repository that runs Base nodes a security policy and contribution guidelines.</description>
    </item>
    <item>
      <title>Setting public_folder twice, and the silent 404 that follows</title>
      <link>https://wbnns.com/notes/setting-public-folder-twice-and-the-silent-404-that-follows/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/setting-public-folder-twice-and-the-silent-404-that-follows/</guid>
      <pubDate>Thu, 07 Apr 2022 00:00:00 GMT</pubDate>
      <description>Two small Sinatra experiments, one of which contains a bug worth keeping.</description>
    </item>
    <item>
      <title>A trustless FIL to WFIL bridge, and the liquidity bound at its centre</title>
      <link>https://wbnns.com/notes/trustless-fil-wfil-bridge-liquidity-bound-centre/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/trustless-fil-wfil-bridge-liquidity-bound-centre/</guid>
      <pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate>
      <description>Propose a trustless, bidirectional FIL to WFIL bridge, and get Filecoin to fund it.</description>
    </item>
    <item>
      <title>One index.html, 730 bytes, and the floor of shipping on the web</title>
      <link>https://wbnns.com/notes/one-index-html-730-bytes-floor-shipping-web/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/one-index-html-730-bytes-floor-shipping-web/</guid>
      <pubDate>Sat, 26 Jun 2021 00:00:00 GMT</pubDate>
      <description>One index.html, 730 bytes, nothing else.</description>
    </item>
    <item>
      <title>Talking to an Ethereum node from Ruby, where the transport options are the API</title>
      <link>https://wbnns.com/notes/talking-ethereum-node-ruby-where-transport-options-api/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/talking-ethereum-node-ruby-where-transport-options-api/</guid>
      <pubDate>Tue, 06 Apr 2021 00:00:00 GMT</pubDate>
      <description>Ruby had almost nothing for talking to an Ethereum node, so Rails apps wanting chain state were writing raw JSON-RPC by hand. Fix that.</description>
    </item>
    <item>
      <title>Translating a curriculum made mostly of English links</title>
      <link>https://wbnns.com/notes/translating-a-curriculum-made-mostly-of-english-links/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/translating-a-curriculum-made-mostly-of-english-links/</guid>
      <pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate>
      <description>Everything a person needs to get started or level up as a web developer, free, based on The Odin Project's open curriculum by Erik Trautman, credited throughout. Published as a GitBook and translated: codelibro in Spanish, codelivre in French.</description>
    </item>
    <item>
      <title>Aggregating a price from several APIs, and deciding what to do when they disagree</title>
      <link>https://wbnns.com/notes/aggregating-price-several-apis-deciding-what-do-when-they/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/aggregating-price-several-apis-deciding-what-do-when-they/</guid>
      <pubDate>Sun, 28 Mar 2021 00:00:00 GMT</pubDate>
      <description>Pull the bitcoin price from several APIs at once, so one bad feed cannot mislead an app.</description>
    </item>
    <item>
      <title>Mounting React inside Rails, and the initial-state seam</title>
      <link>https://wbnns.com/notes/mounting-react-inside-rails-and-the-initial-state-seam/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/mounting-react-inside-rails-and-the-initial-state-seam/</guid>
      <pubDate>Fri, 26 Mar 2021 00:00:00 GMT</pubDate>
      <description>A cryptocurrency portfolio tracker, built as Rails with React inside it.</description>
    </item>
    <item>
      <title>Three sources for one NFT listing, and why scraping is the worst</title>
      <link>https://wbnns.com/notes/three-sources-one-nft-listing-why-scraping-worst/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/three-sources-one-nft-listing-why-scraping-worst/</guid>
      <pubDate>Wed, 24 Mar 2021 00:00:00 GMT</pubDate>
      <description>A proof of concept for scraping an NFT marketplace, which mostly became an argument for not doing it.</description>
    </item>
    <item>
      <title>Ethernaut level one: a fallback function is a public entry point</title>
      <link>https://wbnns.com/notes/ethernaut-level-one-fallback-function-public-entry-point/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/ethernaut-level-one-fallback-function-public-entry-point/</guid>
      <pubDate>Sun, 21 Feb 2021 00:00:00 GMT</pubDate>
      <description>Work the Ethernaut levels rather than read the writeups.</description>
    </item>
    <item>
      <title>Forking a Jekyll theme you intend to keep editing</title>
      <link>https://wbnns.com/notes/forking-a-jekyll-theme-you-intend-to-keep-editing/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/forking-a-jekyll-theme-you-intend-to-keep-editing/</guid>
      <pubDate>Sat, 23 Jan 2021 00:00:00 GMT</pubDate>
      <description>A site for the Congo Developers Club, an online place where developers across Congo and central Africa exchange ideas and opportunities.</description>
    </item>
    <item>
      <title>Reporting three change windows without storing any history</title>
      <link>https://wbnns.com/notes/reporting-three-change-windows-without-storing-any-history/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/reporting-three-change-windows-without-storing-any-history/</guid>
      <pubDate>Fri, 30 Oct 2020 00:00:00 GMT</pubDate>
      <description>Post the WBTC price and its 1-hour, 24-hour and 7-day changes for assets with option markets on Siren.</description>
    </item>
    <item>
      <title>A JSON schema as the entire product</title>
      <link>https://wbnns.com/notes/a-json-schema-as-the-entire-product/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-json-schema-as-the-entire-product/</guid>
      <pubDate>Tue, 18 Aug 2020 00:00:00 GMT</pubDate>
      <description>A token list registry for the Superchain, where the product is the JSON schema.</description>
    </item>
    <item>
      <title>Rails application templates, and the ordering problem everyone hits</title>
      <link>https://wbnns.com/notes/rails-application-templates-ordering-problem-everyone-hits/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/rails-application-templates-ordering-problem-everyone-hits/</guid>
      <pubDate>Thu, 13 Aug 2020 00:00:00 GMT</pubDate>
      <description>Make my Rails defaults one flag instead of a checklist.</description>
    </item>
    <item>
      <title>Anti-tracking blocked the signup form, so the form moved in-house</title>
      <link>https://wbnns.com/notes/anti-tracking-blocked-signup-form-so-form-moved-house/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/anti-tracking-blocked-signup-form-so-form-moved-house/</guid>
      <pubDate>Mon, 03 Aug 2020 00:00:00 GMT</pubDate>
      <description>Brave and Firefox block MailChimp's embedded signup script under anti-tracking rules, so the Scyberia waiting list silently collected nothing. Replace the embed with a form we own.</description>
    </item>
    <item>
      <title>Measuring 60+ support desks by hand, and publishing the correspondence</title>
      <link>https://wbnns.com/notes/measuring-60-support-desks-hand-publishing-correspondence/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/measuring-60-support-desks-hand-publishing-correspondence/</guid>
      <pubDate>Fri, 19 Jun 2020 00:00:00 GMT</pubDate>
      <description>Nobody knew which bitcoin exchanges actually answer their support email, so measure it: 60+ exchanges, June 2020.</description>
    </item>
    <item>
      <title>Rendering MediaWiki-format proposals as a static site</title>
      <link>https://wbnns.com/notes/rendering-mediawiki-format-proposals-as-a-static-site/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/rendering-mediawiki-format-proposals-as-a-static-site/</guid>
      <pubDate>Tue, 09 Jun 2020 00:00:00 GMT</pubDate>
      <description>Render the Bitcoin Improvement Proposals as a browsable static site.</description>
    </item>
    <item>
      <title>The storage number nobody warns you about when you run an explorer</title>
      <link>https://wbnns.com/notes/storage-number-nobody-warns-you-about-when-you-run-explorer/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/storage-number-nobody-warns-you-about-when-you-run-explorer/</guid>
      <pubDate>Tue, 26 May 2020 00:00:00 GMT</pubDate>
      <description>Stand up a Bitcoin block explorer on Blockstream's Esplora frontend and electrs backend.</description>
    </item>
    <item>
      <title>A form that posts without leaving the page, and the gate that actually enforces</title>
      <link>https://wbnns.com/notes/form-posts-without-leaving-page-gate-actually-enforces/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/form-posts-without-leaving-page-gate-actually-enforces/</guid>
      <pubDate>Sun, 26 Apr 2020 00:00:00 GMT</pubDate>
      <description>The Congo Developers Club site before the Jekyll rebuild, with a jQuery signup form and a launch countdown.</description>
    </item>
    <item>
      <title>.cache committed to git, and the stale build it can cause</title>
      <link>https://wbnns.com/notes/cache-committed-to-git-and-the-stale-build-it-can-cause/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/cache-committed-to-git-and-the-stale-build-it-can-cause/</guid>
      <pubDate>Tue, 21 Jan 2020 00:00:00 GMT</pubDate>
      <description>A Gatsby site, with .cache/ committed to git.</description>
    </item>
    <item>
      <title>Heading typography in a long-form archive</title>
      <link>https://wbnns.com/notes/heading-typography-in-a-long-form-archive/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/heading-typography-in-a-long-form-archive/</guid>
      <pubDate>Sun, 05 Jan 2020 00:00:00 GMT</pubDate>
      <description>Improve heading typography on the Satoshi index at the Nakamoto Institute.</description>
    </item>
    <item>
      <title>A build script that renders PHP to static HTML</title>
      <link>https://wbnns.com/notes/a-build-script-that-renders-php-to-static-html/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-build-script-that-renders-php-to-static-html/</guid>
      <pubDate>Fri, 18 Oct 2019 00:00:00 GMT</pubDate>
      <description>A personal site where PHP is the template language and what gets deployed is static HTML.</description>
    </item>
    <item>
      <title>A bitcoin.conf for a machine that does not have the RAM</title>
      <link>https://wbnns.com/notes/a-bitcoin-conf-for-a-machine-that-does-not-have-the-ram/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-bitcoin-conf-for-a-machine-that-does-not-have-the-ram/</guid>
      <pubDate>Sat, 01 Jun 2019 00:00:00 GMT</pubDate>
      <description>Run a Bitcoin node on a machine that does not have the RAM, and write down what each setting actually costs.</description>
    </item>
    <item>
      <title>Eight community health files, and how GitHub resolves them</title>
      <link>https://wbnns.com/notes/eight-community-health-files-and-how-github-resolves-them/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/eight-community-health-files-and-how-github-resolves-them/</guid>
      <pubDate>Fri, 31 May 2019 00:00:00 GMT</pubDate>
      <description>Collect the eight community health files a new repository should start with, and learn how GitHub actually resolves them.</description>
    </item>
    <item>
      <title>A Sphinx theme is not a stylesheet</title>
      <link>https://wbnns.com/notes/a-sphinx-theme-is-not-a-stylesheet/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-sphinx-theme-is-not-a-stylesheet/</guid>
      <pubDate>Thu, 16 May 2019 00:00:00 GMT</pubDate>
      <description>Change the Sphinx theme on the Bitcoin developer documentation.</description>
    </item>
    <item>
      <title>The loop and the closed form</title>
      <link>https://wbnns.com/notes/the-loop-and-the-closed-form/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/the-loop-and-the-closed-form/</guid>
      <pubDate>Thu, 25 Apr 2019 00:00:00 GMT</pubDate>
      <description>Start Project Euler in Ruby.</description>
    </item>
    <item>
      <title>Escrow is the whole product in a peer-to-peer exchange</title>
      <link>https://wbnns.com/notes/escrow-is-the-whole-product-in-a-peer-to-peer-exchange/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/escrow-is-the-whole-product-in-a-peer-to-peer-exchange/</guid>
      <pubDate>Fri, 15 Mar 2019 00:00:00 GMT</pubDate>
      <description>Replicate LocalBitcoins for Latin America, in Spanish. Shipped as BitMae.</description>
    </item>
    <item>
      <title>Volume floors, and why percent-change rankings are noise without them</title>
      <link>https://wbnns.com/notes/volume-floors-why-percent-change-rankings-noise-without-them/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/volume-floors-why-percent-change-rankings-noise-without-them/</guid>
      <pubDate>Tue, 11 Dec 2018 00:00:00 GMT</pubDate>
      <description>Three bots posting CoinMarketCap movers: top ten, biggest gainers, biggest losers.</description>
    </item>
    <item>
      <title>Deriving a cross rate through a base you did not ask for</title>
      <link>https://wbnns.com/notes/deriving-a-cross-rate-through-a-base-you-did-not-ask-for/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/deriving-a-cross-rate-through-a-base-you-did-not-ask-for/</guid>
      <pubDate>Fri, 07 Dec 2018 00:00:00 GMT</pubDate>
      <description>Post the Costa Rican colón to US dollar rate with 7-day, 30-day and 1-year comparisons, in Spanish.</description>
    </item>
    <item>
      <title>HMAC request signing, and the clock skew that looks like an auth failure</title>
      <link>https://wbnns.com/notes/hmac-request-signing-clock-skew-looks-like-auth-failure/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/hmac-request-signing-clock-skew-looks-like-auth-failure/</guid>
      <pubDate>Wed, 21 Nov 2018 00:00:00 GMT</pubDate>
      <description>Post the average bitcoin price across exchanges, in Spanish. The English-language price bots were everywhere and there were very few for Spanish-speaking audiences.</description>
    </item>
    <item>
      <title>Percent change: the sign convention and the zero denominator</title>
      <link>https://wbnns.com/notes/percent-change-the-sign-convention-and-the-zero-denominator/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/percent-change-the-sign-convention-and-the-zero-denominator/</guid>
      <pubDate>Wed, 21 Nov 2018 00:00:00 GMT</pubDate>
      <description>Two small Ruby utilities, one of which has a bug that outlives beginners.</description>
    </item>
    <item>
      <title>gets.chomp.to_i returns 0, and beginners never find out</title>
      <link>https://wbnns.com/notes/gets-chomp-to-i-returns-0-and-beginners-never-find-out/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/gets-chomp-to-i-returns-0-and-beginners-never-find-out/</guid>
      <pubDate>Tue, 13 Nov 2018 00:00:00 GMT</pubDate>
      <description>Work through Chris Pine's *Learn to Program* in Ruby.</description>
    </item>
    <item>
      <title>Hundreds of emoji PNGs, and the advice HTTP/2 reversed</title>
      <link>https://wbnns.com/notes/hundreds-of-emoji-pngs-and-the-advice-http-2-reversed/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/hundreds-of-emoji-pngs-and-the-advice-http-2-reversed/</guid>
      <pubDate>Fri, 19 Oct 2018 00:00:00 GMT</pubDate>
      <description>VA services for hodlers, as a one-page site carrying hundreds of emoji PNGs.</description>
    </item>
    <item>
      <title>Quoting a price you are willing to be held to</title>
      <link>https://wbnns.com/notes/quoting-a-price-you-are-willing-to-be-held-to/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/quoting-a-price-you-are-willing-to-be-held-to/</guid>
      <pubDate>Sun, 22 Jul 2018 00:00:00 GMT</pubDate>
      <description>An over-the-counter desk that provides quotes and executes trades, in Flask.</description>
    </item>
    <item>
      <title>A Flask app for Costa Rican market data that was never written</title>
      <link>https://wbnns.com/notes/flask-app-costa-rican-market-data-never-written/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/flask-app-costa-rican-market-data-never-written/</guid>
      <pubDate>Sat, 02 Jun 2018 00:00:00 GMT</pubDate>
      <description>Costa Rican market data as a Flask app.</description>
    </item>
    <item>
      <title>normalize.css, and the dependency nobody audits</title>
      <link>https://wbnns.com/notes/normalize-css-and-the-dependency-nobody-audits/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/normalize-css-and-the-dependency-nobody-audits/</guid>
      <pubDate>Sun, 15 Apr 2018 00:00:00 GMT</pubDate>
      <description>An interactive page as a front-end exercise: index.html, app.js, main.css and normalize.css.</description>
    </item>
    <item>
      <title>Fetch, render and send as three modules</title>
      <link>https://wbnns.com/notes/fetch-render-and-send-as-three-modules/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/fetch-render-and-send-as-three-modules/</guid>
      <pubDate>Sat, 31 Mar 2018 00:00:00 GMT</pubDate>
      <description>Email a weather forecast on a schedule, split into three modules that each do one thing.</description>
    </item>
    <item>
      <title>What adding one clause to MIT costs you downstream</title>
      <link>https://wbnns.com/notes/what-adding-one-clause-to-mit-costs-you-downstream/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/what-adding-one-clause-to-mit-costs-you-downstream/</guid>
      <pubDate>Sun, 01 Oct 2017 00:00:00 GMT</pubDate>
      <description>Write a licence for software that moves money, so users acknowledge market risk rather than inferring a promise.</description>
    </item>
    <item>
      <title>Optimising inside a build environment that forbids plugins</title>
      <link>https://wbnns.com/notes/optimising-inside-a-build-environment-that-forbids-plugins/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/optimising-inside-a-build-environment-that-forbids-plugins/</guid>
      <pubDate>Sat, 22 Jul 2017 00:00:00 GMT</pubDate>
      <description>A Jekyll blog for bitcoin development writing, with a Sass tree, a projects data file, and one post reviewing SegWit2x.</description>
    </item>
    <item>
      <title>One landing-page template, eight sites, eight years</title>
      <link>https://wbnns.com/notes/one-landing-page-template-eight-sites-eight-years/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/one-landing-page-template-eight-sites-eight-years/</guid>
      <pubDate>Tue, 04 Apr 2017 00:00:00 GMT</pubDate>
      <description>The Digital Currency Depository &amp; Trust site, and the landing-page template I reused for the next eight years.</description>
    </item>
    <item>
      <title>A support matrix that has to say what &quot;supports SegWit&quot; means</title>
      <link>https://wbnns.com/notes/a-support-matrix-that-has-to-say-what-supports-segwit-means/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/a-support-matrix-that-has-to-say-what-supports-segwit-means/</guid>
      <pubDate>Tue, 28 Mar 2017 00:00:00 GMT</pubDate>
      <description>Add a Bitcoin Ruby library to the SegWit support list on bitcoincore.org.</description>
    </item>
    <item>
      <title>HTTP 402 as a working payment channel</title>
      <link>https://wbnns.com/notes/http-402-as-a-working-payment-channel/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/http-402-as-a-working-payment-channel/</guid>
      <pubDate>Tue, 15 Nov 2016 00:00:00 GMT</pubDate>
      <description>Wrap an existing API so that requests pay you bitcoin.</description>
    </item>
    <item>
      <title>Reselling a metered API for satoshis</title>
      <link>https://wbnns.com/notes/reselling-a-metered-api-for-satoshis/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/reselling-a-metered-api-for-satoshis/</guid>
      <pubDate>Wed, 12 Oct 2016 00:00:00 GMT</pubDate>
      <description>Resell News API access, priced per request in satoshis, across 43 sources.</description>
    </item>
    <item>
      <title>Charging for a public-good data feed</title>
      <link>https://wbnns.com/notes/charging-for-a-public-good-data-feed/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/charging-for-a-public-good-data-feed/</guid>
      <pubDate>Tue, 04 Oct 2016 00:00:00 GMT</pubDate>
      <description>Sell parsed National Hurricane Center data through a bitcoin-paid endpoint.</description>
    </item>
    <item>
      <title>Selling stock quotes over an endpoint Google never documented</title>
      <link>https://wbnns.com/notes/selling-stock-quotes-over-endpoint-google-never-documented/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/selling-stock-quotes-over-endpoint-google-never-documented/</guid>
      <pubDate>Tue, 06 Sep 2016 00:00:00 GMT</pubDate>
      <description>Sell NYSE price lookups for 720 satoshis a call.</description>
    </item>
    <item>
      <title>The same service, one string different</title>
      <link>https://wbnns.com/notes/the-same-service-one-string-different/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/the-same-service-one-string-different/</guid>
      <pubDate>Tue, 06 Sep 2016 00:00:00 GMT</pubDate>
      <description>The same service as NYSE-Ticker against a different exchange.</description>
    </item>
    <item>
      <title>Normalising free-text ingredients, and selling the ranking</title>
      <link>https://wbnns.com/notes/normalising-free-text-ingredients-and-selling-the-ranking/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/normalising-free-text-ingredients-and-selling-the-ranking/</guid>
      <pubDate>Mon, 05 Sep 2016 00:00:00 GMT</pubDate>
      <description>Provide some ingredients, get recipe suggestions, pay in bitcoin.</description>
    </item>
    <item>
      <title>Pricing a security answer by value, not by cost</title>
      <link>https://wbnns.com/notes/pricing-a-security-answer-by-value-not-by-cost/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/pricing-a-security-answer-by-value-not-by-cost/</guid>
      <pubDate>Sun, 04 Sep 2016 00:00:00 GMT</pubDate>
      <description>Check whether a link might be malicious, for 2700 satoshis.</description>
    </item>
    <item>
      <title>Payment taken, extraction failed</title>
      <link>https://wbnns.com/notes/payment-taken-extraction-failed/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/payment-taken-extraction-failed/</guid>
      <pubDate>Wed, 24 Aug 2016 00:00:00 GMT</pubDate>
      <description>A paid media extraction endpoint, and the failure mode that made it unworkable.</description>
    </item>
    <item>
      <title>Selling a search whose negative result means nothing</title>
      <link>https://wbnns.com/notes/selling-a-search-whose-negative-result-means-nothing/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/selling-a-search-whose-negative-result-means-nothing/</guid>
      <pubDate>Mon, 22 Aug 2016 00:00:00 GMT</pubDate>
      <description>Sell trademark lookups through a paid endpoint.</description>
    </item>
    <item>
      <title>Account-existence oracles, sold by the request</title>
      <link>https://wbnns.com/notes/account-existence-oracles-sold-by-the-request/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/account-existence-oracles-sold-by-the-request/</guid>
      <pubDate>Sun, 21 Aug 2016 00:00:00 GMT</pubDate>
      <description>Yellow pages are for businesses, white pages for people. Orange pages return the social media accounts associated with an email address, paid in bitcoin.</description>
    </item>
    <item>
      <title>Bitcoin bounties for GitHub work, escrowed in 2-of-3 multisig</title>
      <link>https://wbnns.com/notes/bitcoin-bounties-for-github-work-escrowed-in-2-of-3-multisig/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/bitcoin-bounties-for-github-work-escrowed-in-2-of-3-multisig/</guid>
      <pubDate>Wed, 24 Feb 2016 00:00:00 GMT</pubDate>
      <description>A platform for working from anywhere and getting paid in bitcoin, with 2-of-3 multisig escrow holding the bounties.</description>
    </item>
    <item>
      <title>Five years maintaining bitcoin.org</title>
      <link>https://wbnns.com/notes/five-years-maintaining-bitcoin-org/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/five-years-maintaining-bitcoin-org/</guid>
      <pubDate>Mon, 06 Jul 2015 00:00:00 GMT</pubDate>
      <description>Five years maintaining bitcoin.org, from July 2015 to June 2020.</description>
    </item>
    <item>
      <title>Maintaining a translated document corpus in OpenDocument</title>
      <link>https://wbnns.com/notes/maintaining-a-translated-document-corpus-in-opendocument/</link>
      <guid isPermaLink="true">https://wbnns.com/notes/maintaining-a-translated-document-corpus-in-opendocument/</guid>
      <pubDate>Wed, 29 Jan 2014 00:00:00 GMT</pubDate>
      <description>Maintain the bitcoin whitepaper in many languages, with each translated PDF matching the layout of the 2008 original.</description>
    </item>
  </channel>
</rss>