<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jukka Blomberg</title>
    <description>The latest articles on DEV Community by Jukka Blomberg (@jukkablomberg).</description>
    <link>https://dev.to/jukkablomberg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3895384%2F0c293cd0-50ed-4fa7-b481-d0815937e7b6.jpeg</url>
      <title>DEV Community: Jukka Blomberg</title>
      <link>https://dev.to/jukkablomberg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jukkablomberg"/>
    <language>en</language>
    <item>
      <title>Wine stocks rose 4.3% in October. In euros it was 5.9%. Same 22 companies, one CSV.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Fri, 06 Nov 2026 01:44:11 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/wine-stocks-rose-43-in-october-in-euros-it-was-59-same-22-companies-one-csv-2m3c</link>
      <guid>https://dev.to/jukkablomberg/wine-stocks-rose-43-in-october-in-euros-it-was-59-same-22-companies-one-csv-2m3c</guid>
      <description>&lt;p&gt;The VINCAP WINE index tracks 22 listed wine companies, weighted by market value, based to 100 on 3 July 2026. It publishes one row per trading day, in three currencies, in a public CSV.&lt;/p&gt;

&lt;p&gt;October 2026, from that file (30 September close → 30 October close):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;currency&lt;/th&gt;
&lt;th&gt;30 Sep&lt;/th&gt;
&lt;th&gt;30 Oct&lt;/th&gt;
&lt;th&gt;October&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US dollar&lt;/td&gt;
&lt;td&gt;106.26&lt;/td&gt;
&lt;td&gt;110.81&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+4.28%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;euro&lt;/td&gt;
&lt;td&gt;107.03&lt;/td&gt;
&lt;td&gt;113.36&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+5.92%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;each stock's own currency&lt;/td&gt;
&lt;td&gt;106.37&lt;/td&gt;
&lt;td&gt;111.08&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+4.43%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same companies, same days. The gap between the rows is the currency, not the wine business: the euro lost ground against the dollar over the month, so a euro-based holder saw more of the gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recompute it yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://vincap.co/data/levels/wine.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parse_dates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;set_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;octo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;level_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;level_eur&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;level_local&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;octo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output on the file as served today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;level_usd 4.28 %
level_eur 5.92 %
level_local 4.43 %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The file checks itself
&lt;/h2&gt;

&lt;p&gt;Every row since 1 October carries &lt;code&gt;prev_sha256&lt;/code&gt; and &lt;code&gt;row_sha256&lt;/code&gt;, so each day points at the one before it. If anyone (including us) quietly edits an old level, the chain breaks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row_sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;breaks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prev_sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row_sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chain breaks:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breaks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The month high was 112.38 on 16 October, the low 105.55 on 1 October.&lt;/p&gt;

&lt;p&gt;Chart, levels file and the October numbers, free to use with credit: &lt;a href="https://vincap.co/press/wine-october-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=vc-october-currencies-devto" rel="noopener noreferrer"&gt;vincap.co/press/wine-october-2026&lt;/a&gt;. Method and coverage rules: &lt;a href="https://vincap.co/methodology?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=vc-october-currencies-devto" rel="noopener noreferrer"&gt;vincap.co/methodology&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Information, not investment advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>pandas</category>
      <category>opendata</category>
      <category>dataset</category>
    </item>
    <item>
      <title>Fleet Report #2: ChatGPT sent one page 515 readers in a week. My agents built it a door, then hid it.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Fri, 06 Nov 2026 01:43:06 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/fleet-report-2-chatgpt-sent-one-page-515-readers-in-a-week-my-agents-built-it-a-door-then-hid-2oif</link>
      <guid>https://dev.to/jukkablomberg/fleet-report-2-chatgpt-sent-one-page-515-readers-in-a-week-my-agents-built-it-a-door-then-hid-2oif</guid>
      <description>&lt;p&gt;I run a small studio where AI agents do most of the work: 13 standing agents, one human (me). Every item an agent handles gets one line in a handover ledger. This weekly issue is written only from that ledger and the files beside it, so nothing in it can be backfilled later.&lt;/p&gt;

&lt;p&gt;Week: Friday 30 October to Thursday 5 November 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The week in one number: 72
&lt;/h2&gt;

&lt;p&gt;72 items marked BUILT, on all seven days. The week before: 81.&lt;/p&gt;

&lt;p&gt;The ledger counts handled items, not effort or value, so a smaller number doesn't mean a worse week. I'm not going to invent a reason.&lt;/p&gt;

&lt;p&gt;Two other numbers moved more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google search impressions&lt;/strong&gt; across the portfolio (last 28 days): 23,001 → 32,533, up 41% in a week. Most of it is one site, UsePhysics (27,059).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI agents querying our data servers:&lt;/strong&gt; 383 times this week. CoinBucha's (bitcoin data) went 2,182 → 2,505. VINCAP's (listed wine companies) tripled, 28 → 88. It joined the official MCP Registry on 27 October.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The number that changed a decision: 7 → 515
&lt;/h2&gt;

&lt;p&gt;One of the sites, MonitoringRoom, has a page on the US midterms that shows what prediction markets priced. In the 7 days to 5 November, ChatGPT sent that page 515 visitors. The 7 days before: 7.&lt;/p&gt;

&lt;p&gt;Nobody marketed it. An AI assistant started citing it.&lt;/p&gt;

&lt;p&gt;So on 2 November the agents decided the page needed a way to keep those readers: one box, "Get the result beside what was priced", one email field. It was live on 3 November.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What went wrong
&lt;/h2&gt;

&lt;p&gt;On a phone, the box sat 3,902 pixels down the page. Almost nobody scrolls that far.&lt;/p&gt;

&lt;p&gt;The builder agent flagged it in its own check, and on 4 November moved the box to sit right under the first market (about 1,000 pixels down). So far, 173 people have seen the box and 1 has clicked it. ChatGPT can send you readers. It can't make them stay. The real grade comes on 17 November.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A gate that fired
&lt;/h2&gt;

&lt;p&gt;The agents wrote the one result email for the people who followed that page, then stopped. Emailing a list is a send, and sends are mine.&lt;/p&gt;

&lt;p&gt;My answer, 5 November: "mr-send: go". The send itself runs with me in the room, not from a schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Three things that shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://monitoringroom.com/us-midterms-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-2" rel="noopener noreferrer"&gt;Every midterm market, the price the night before beside the result&lt;/a&gt;: 10 markets, each one dated.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vincap.co/press/wine-october-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-2" rel="noopener noreferrer"&gt;Listed wine stocks in October 2026&lt;/a&gt;: +4.28% for 22 listed wine companies. Chart and daily levels file, free to use with credit.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://northpoint.fi/regulations/mica/rules?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-2" rel="noopener noreferrer"&gt;MiCA marketing rules, one record each&lt;/a&gt;: 16 rules from the EU crypto law, each with ad copy that breaks it and a version that doesn't.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Press this week: 1 angle prepared (the wine number above), 3 notes drafted, 0 sent, 0 replies.&lt;/p&gt;




&lt;p&gt;Every count comes from the ledger described at &lt;a href="https://jukkablomberg.com/operating-system?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-2" rel="noopener noreferrer"&gt;jukkablomberg.com/operating-system&lt;/a&gt;. How I'd set this up inside your company: &lt;a href="https://jukkablomberg.com/ai?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-2" rel="noopener noreferrer"&gt;jukkablomberg.com/ai&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>startup</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>"No fees. Ever." and 15 other crypto ad lines that MiCA rules out, with the rewrite for each</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Thu, 05 Nov 2026 01:40:17 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/no-fees-ever-and-15-other-crypto-ad-lines-that-mica-rules-out-with-the-rewrite-for-each-133m</link>
      <guid>https://dev.to/jukkablomberg/no-fees-ever-and-15-other-crypto-ad-lines-that-mica-rules-out-with-the-rewrite-for-each-133m</guid>
      <description>&lt;p&gt;If you write marketing for a crypto company in the EU, the rules on your copy are not spread across MiCA. They sit in five places: Articles 6, 7, 29, 53 and 66 of Regulation (EU) 2023/1114. Sixteen provisions in all.&lt;/p&gt;

&lt;p&gt;We wrote each one up as a single record (what it requires, who it binds, the line that breaks it, a rewrite) and read every citation on ESMA's own Interactive Single Rulebook. The full set is at &lt;a href="https://northpoint.fi/regulations/mica/rules?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=np-mica-sixteen-lines-devto" rel="noopener noreferrer"&gt;northpoint.fi/regulations/mica/rules&lt;/a&gt;. Here is the short version: one line that fails, one that holds up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every crypto-asset that is not a stablecoin (Article 7)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;provision&lt;/th&gt;
&lt;th&gt;the line that breaks it&lt;/th&gt;
&lt;th&gt;a version that holds up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;7(1)(a) identifiable as marketing&lt;/td&gt;
&lt;td&gt;"My honest take on [Token] after a month of using it — no hype, just facts." (paid, no label)&lt;/td&gt;
&lt;td&gt;"Ad · Paid partnership with [Offeror]. What [Token] does, what it does not, and the white paper link."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7(1)(b) fair, clear, not misleading&lt;/td&gt;
&lt;td&gt;"Risk-free staking. Your crypto works while you sleep."&lt;/td&gt;
&lt;td&gt;"Staking rewards vary and are not guaranteed. The value of [Token] can fall, and you can lose the amount you stake."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7(1)(c) consistent with the white paper&lt;/td&gt;
&lt;td&gt;"[Token] holders vote on treasury spending and share in fees."&lt;/td&gt;
&lt;td&gt;"[Token] gives access to [service], as described in section [X] of the white paper. It carries no right to fees or profits."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7(1)(d) white paper + contact details&lt;/td&gt;
&lt;td&gt;"Buy [Token] today. Questions? DM us."&lt;/td&gt;
&lt;td&gt;"A crypto-asset white paper for [Token] has been published at [website]. Contact: [phone] · [email]."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7(1)(e) the not-approved statement&lt;/td&gt;
&lt;td&gt;"Fully regulated and approved under MiCA."&lt;/td&gt;
&lt;td&gt;"This crypto-asset marketing communication has not been reviewed or approved by any competent authority in any Member State of the European Union…"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7(2) nothing before the white paper&lt;/td&gt;
&lt;td&gt;"Presale spots are going fast — reserve yours before the white paper drops."&lt;/td&gt;
&lt;td&gt;"The white paper is published at [website]. The offer opens on [date]."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Exchanges, brokers and other licensed firms (Article 66)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;provision&lt;/th&gt;
&lt;th&gt;the line that breaks it&lt;/th&gt;
&lt;th&gt;a version that holds up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;66(2) no misleading advantages&lt;/td&gt;
&lt;td&gt;"Top analysts agree: [Token] is set to explode. Buy now on [Exchange]."&lt;/td&gt;
&lt;td&gt;"Now listed on [Exchange]: [Token]. Read the white paper before you trade. Crypto-asset prices are volatile and you can lose money."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66(3) risk warning + white paper link&lt;/td&gt;
&lt;td&gt;"Buy [Token] in seconds. No fuss."&lt;/td&gt;
&lt;td&gt;"Crypto-assets are volatile and you can lose all of the money you put in. Read the [Token] white paper before you buy."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66(4) fee policy public&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;"No fees. Ever."&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"0% trading commission on [pairs]. A spread and network fees apply — see our fee policy."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66(5) green claims&lt;/td&gt;
&lt;td&gt;"100% green crypto. Zero impact."&lt;/td&gt;
&lt;td&gt;"[Token] uses proof of stake. Its estimated energy use and other environmental indicators are published here."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "zero fees" headline is the one to look at twice: 66(4) says pricing, cost and fee policies are public and prominent on the website, so a "zero fees" headline has to survive a reader opening that page. A spread or a network fee the ad does not mention is the contradiction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stablecoins (Articles 29 and 53)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;provision&lt;/th&gt;
&lt;th&gt;the line that breaks it&lt;/th&gt;
&lt;th&gt;a version that holds up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;29(1) asset-referenced token marketing&lt;/td&gt;
&lt;td&gt;"Fully backed, always stable, zero risk."&lt;/td&gt;
&lt;td&gt;"[ART] references [basket]. Reserve composition and redemption terms are in the white paper at [website]."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29(2) the redemption right&lt;/td&gt;
&lt;td&gt;"Sell [ART] any time on the open market."&lt;/td&gt;
&lt;td&gt;"Every holder of [ART] has a right of redemption against [Issuer] at any time."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53(1) e-money token marketing&lt;/td&gt;
&lt;td&gt;"Better than a bank account: [EMT] pays you to hold it."&lt;/td&gt;
&lt;td&gt;"[EMT] is an e-money token issued by [Issuer]. A crypto-asset white paper is published at [website]."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53(2) redemption at par&lt;/td&gt;
&lt;td&gt;"[EMT] usually trades close to €1."&lt;/td&gt;
&lt;td&gt;"All holders of [EMT] have a right of redemption against [Issuer] at any time and at par value."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The white paper itself (Article 6)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;provision&lt;/th&gt;
&lt;th&gt;the line that breaks it&lt;/th&gt;
&lt;th&gt;a version that holds up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6(4) no future-value claims&lt;/td&gt;
&lt;td&gt;"Get in before [Token] hits $10."&lt;/td&gt;
&lt;td&gt;"[Token] gives access to [service]. Its value can go down as well as up, and it may lose its value in full."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6(5) the standard warnings&lt;/td&gt;
&lt;td&gt;"Fully protected. Always liquid. Never worth less than you paid."&lt;/td&gt;
&lt;td&gt;"[Token] may lose its value in part or in full, may not always be transferable or liquid, and is not covered by any investor-compensation scheme…"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;6(4) reaches your ads through 7(1)(c): marketing must be consistent with the white paper, and the white paper may make no claim about future value, so a price target in an ad claims what the white paper is not allowed to say.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own copy
&lt;/h2&gt;

&lt;p&gt;Paste a landing page URL or a block of copy into the free &lt;a href="https://northpoint.fi/check/mica?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=np-mica-sixteen-lines-devto" rel="noopener noreferrer"&gt;MiCA marketing check&lt;/a&gt;. It screens five core Article 7 and 66 rules: risk warnings, guaranteed-return language, superlatives, identifiability and past performance.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Information, not legal advice. Every record links its ESMA source; confirm your own marketing with qualified counsel.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>marketing</category>
      <category>compliance</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Prediction markets priced 10 midterm questions the night before. All 10 favourites won. That proves less than you think.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Thu, 05 Nov 2026 01:39:23 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/prediction-markets-priced-10-midterm-questions-the-night-before-all-10-favourites-won-that-proves-3o90</link>
      <guid>https://dev.to/jukkablomberg/prediction-markets-priced-10-midterm-questions-the-night-before-all-10-favourites-won-that-proves-3o90</guid>
      <description>&lt;p&gt;On the eve of the US midterms (read at 00:41 UTC on 3 November 2026) we froze the prices of ten Polymarket markets on Congress. Yesterday they resolved. Every market's favourite won.&lt;/p&gt;

&lt;p&gt;Here is the whole record, eve price beside the result, as &lt;a href="https://monitoringroom.com/us-midterms-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=mr-priced-vs-happened-devto" rel="noopener noreferrer"&gt;MonitoringRoom&lt;/a&gt; now shows it on the page:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;market (Polymarket)&lt;/th&gt;
&lt;th&gt;priced on the eve&lt;/th&gt;
&lt;th&gt;resolved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Democrats control the House&lt;/td&gt;
&lt;td&gt;94.5 %&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Republicans control the House&lt;/td&gt;
&lt;td&gt;5.5 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Democrats control the Senate&lt;/td&gt;
&lt;td&gt;75.5 %&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Republicans control the Senate&lt;/td&gt;
&lt;td&gt;24.5 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power: D Senate, D House&lt;/td&gt;
&lt;td&gt;75.5 %&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power: R Senate, D House&lt;/td&gt;
&lt;td&gt;18.5 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power: R Senate, R House&lt;/td&gt;
&lt;td&gt;5.5 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power: D Senate, R House&lt;/td&gt;
&lt;td&gt;0.4 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power: Other&lt;/td&gt;
&lt;td&gt;0.1 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Republican trifecta with a Senate supermajority&lt;/td&gt;
&lt;td&gt;0.5 %&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Outcomes were read from Polymarket's own market records on 5 November 2026 (00:46 UTC). The eve prices were frozen two days earlier and never rewritten.&lt;/p&gt;

&lt;h2&gt;
  
  
  "The markets were right" is the wrong lesson
&lt;/h2&gt;

&lt;p&gt;Ten for ten sounds like a perfect night. It is less impressive than it looks, and the reason is the most useful thing to know about reading odds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most of these were not hard calls.&lt;/strong&gt; Six of the ten were priced at 5.5 % or less, or 94.5 % or more. A market that says 95 % is supposed to be right 19 times in 20. Getting those right is the expected result, not a feat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Senate was the real question.&lt;/strong&gt; At 75.5 %, the market was saying: Democrats take the Senate about three times in four. That also means the other outcome should happen about one time in four. If you saw ten different 75 % calls and all ten came true, you should start to suspect the prices were too &lt;em&gt;low&lt;/em&gt;, not celebrate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One night cannot show a market is well calibrated.&lt;/strong&gt; Calibration means that across many questions, things priced at 75 % happen about 75 % of the time. You learn that from hundreds of resolved markets, not from one election.&lt;/p&gt;

&lt;h2&gt;
  
  
  A score that is honest about it
&lt;/h2&gt;

&lt;p&gt;The standard way to grade probability forecasts is the Brier score: for each question, take (price − outcome)², with the outcome as 1 or 0, and average. 0 is perfect. Saying "50 %" to everything scores 0.25.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;eve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.945&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.055&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.755&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.755&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.185&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.055&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0055&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;won&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;won&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eve&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# 0.0223...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;0.022 is a very good score. About 80 % of the penalty comes from just three markets, the ones that hung on the Senate at 75.5 % / 24.5 %: each still costs 0.06 even though the favourite won, because the market left a one-in-four chance on the table. That is the point. A good forecaster is not someone who is never surprised. It is someone whose 75 % calls come true about 75 % of the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read the next one
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read the price as a frequency.&lt;/strong&gt; 62 % means "about 6 times in 10", not "probably yes".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look at the close calls.&lt;/strong&gt; The 25–75 % markets are where the information is. The 95 % ones mostly confirm what everyone knew.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the eve price.&lt;/strong&gt; Prices move as results come in, so the only fair test is the price before anyone knew. That is why we froze it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The page keeps the eve price beside each result for good: &lt;a href="https://monitoringroom.com/us-midterms-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=mr-priced-vs-happened-devto" rel="noopener noreferrer"&gt;monitoringroom.com/us-midterms-2026&lt;/a&gt;. There is also a plain guide to &lt;a href="https://monitoringroom.com/how-prediction-markets-work?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=mr-priced-vs-happened-devto" rel="noopener noreferrer"&gt;how prediction-market odds work&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Information only — not betting or political advice. MonitoringRoom reads public market prices; it takes no positions and sells no picks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>predictionmarkets</category>
      <category>statistics</category>
      <category>datascience</category>
      <category>python</category>
    </item>
    <item>
      <title>A physics MCP server that shows its working: 31 calculators, 34 CODATA constants, no key</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Wed, 04 Nov 2026 01:40:14 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/a-physics-mcp-server-that-shows-its-working-31-calculators-34-codata-constants-no-key-11ac</link>
      <guid>https://dev.to/jukkablomberg/a-physics-mcp-server-that-shows-its-working-31-calculators-34-codata-constants-no-key-11ac</guid>
      <description>&lt;p&gt;If you are building a homework helper or a tutoring agent, the hard part of a physics question is rarely the arithmetic. It is the formula, the units and the steps a student can follow. Language models are good at explaining and still slip on numbers, so we gave our physics calculators a door that agents can call directly.&lt;/p&gt;

&lt;p&gt;Since yesterday (3 November 2026) the &lt;a href="https://usephysics.com/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=up-mcp-show-work-devto" rel="noopener noreferrer"&gt;UsePhysics&lt;/a&gt; MCP server is listed in the official MCP Registry as &lt;code&gt;com.usephysics/physics-calculators&lt;/code&gt;. It is a remote server (Streamable HTTP), free, and it needs no key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://usephysics.com/api/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What is behind it
&lt;/h2&gt;

&lt;p&gt;Four read-only tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;tool&lt;/th&gt;
&lt;th&gt;what it returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_calculators&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;every calculator: id, formula, input keys with units and defaults, page URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;calculate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the results with units, the formula, the worked steps where the engine can derive them, and a link to the solved page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_constant&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;one CODATA 2022 constant as NIST prints it, with its uncertainty (or "exact") and the NIST source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_constants&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the constants we keep, in groups&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As served today: &lt;strong&gt;31 calculators&lt;/strong&gt; in seven categories (15 of them mechanics: free fall, projectile motion, torque, tension, terminal velocity and so on) and &lt;strong&gt;34 constants&lt;/strong&gt; in six groups, from the seven SI defining constants to particle masses.&lt;/p&gt;

&lt;h2&gt;
  
  
  One call, end to end
&lt;/h2&gt;

&lt;p&gt;No SDK needed. This is plain Python against the live endpoint, and the output below is what it printed this morning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;

&lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://usephysics.com/api/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculator_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;free-fall&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;show_work&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_constant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;planck constant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value_as_printed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['h=20']
Given: h = 20 m
Formula: t = √(2h/g)
Substitute: t = √(2 × 20 / 9.80665)
Result: t = 2.02 s
6.626 070 15 × 10^-34
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same answer also carries the impact speed (19.81 m/s, or 71.3 km/h) and a link that reopens the solved calculator with the inputs filled in: &lt;a href="https://usephysics.com/calculators/free-fall?h=20&amp;amp;utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=up-mcp-show-work-devto" rel="noopener noreferrer"&gt;usephysics.com/calculators/free-fall?h=20&lt;/a&gt;. That link is the useful bit for a tutoring agent: the student gets a page they can change and re-run, not just a number in a chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things worth knowing before you wire it in
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Call &lt;code&gt;list_calculators&lt;/code&gt; first and use its keys.&lt;/strong&gt; The free-fall height is &lt;code&gt;h&lt;/code&gt;, kinetic energy takes &lt;code&gt;m&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;. Inputs are in the units listed next to each key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read back the &lt;code&gt;inputs&lt;/code&gt; array.&lt;/strong&gt; Every answer echoes the values it actually used, including any default it filled in for a key you did not send. If an echoed value is not the one you meant, your key name was wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worked steps are not there for every calculator yet.&lt;/strong&gt; Free fall returns Given → Formula → Substitute → Result; some calculators return the result and the formula with &lt;code&gt;show_work: null&lt;/code&gt;. The formula is always there, so an agent can still explain the step itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Constants come straight from NIST's 2022 CODATA listing (retrieved 26 July 2026), and exact constants say so: Planck's constant comes back with &lt;code&gt;"exact": true&lt;/code&gt; and no uncertainty, because since 2019 it defines the kilogram.&lt;/p&gt;

&lt;p&gt;The answers are educational calculations from the formula shown. They are good for homework and for checking your own working, not for engineering sign-off. The full calculator list, with formulas, is also in &lt;a href="https://usephysics.com/llms.txt" rel="noopener noreferrer"&gt;usephysics.com/llms.txt&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>physics</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>US spot bitcoin ETFs hold 1,280,733 BTC. For six of the eleven, the newest official count is from June 30.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Tue, 03 Nov 2026 01:40:05 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/us-spot-bitcoin-etfs-hold-1280733-btc-for-six-of-the-eleven-the-newest-official-count-is-from-45hg</link>
      <guid>https://dev.to/jukkablomberg/us-spot-bitcoin-etfs-hold-1280733-btc-for-six-of-the-eleven-the-newest-official-count-is-from-45hg</guid>
      <description>&lt;p&gt;We keep a small table of the US spot bitcoin ETFs on &lt;a href="https://coinbucha.com/etfs?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=cb-etf-june-devto" rel="noopener noreferrer"&gt;coinbucha.com/etfs&lt;/a&gt;: how much bitcoin each fund holds, how many shares are out, and a source link for every number. Since this week the same table is a CSV with one row per fund and a source URL in every row.&lt;/p&gt;

&lt;p&gt;The total across 11 funds today: &lt;strong&gt;1,280,733 BTC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The interesting part is not the total. It is the dates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;funds&lt;/th&gt;
&lt;th&gt;BTC&lt;/th&gt;
&lt;th&gt;share of total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;holdings dated &lt;strong&gt;late October&lt;/strong&gt;, from the issuer's own page or holdings file&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1,070,926&lt;/td&gt;
&lt;td&gt;84 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;holdings dated &lt;strong&gt;30 June 2026&lt;/strong&gt;, from a quarterly SEC filing&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;209,807&lt;/td&gt;
&lt;td&gt;16 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The five fresh ones are BlackRock's IBIT (814,874 BTC, 29 Oct), Grayscale's GBTC and Mini Trust, Bitwise and ARK 21Shares. Each publishes a holdings figure on its own site or in a downloadable file, so we can read it within days.&lt;/p&gt;

&lt;p&gt;For the other six (Fidelity FBTC, VanEck HODL, CoinShares BRRR, Franklin EZBC, Invesco Galaxy BTCO and WisdomTree BTCW) we could not find a current holdings number on the issuer's page that we could cite. So the table falls back to the newest number the fund has formally filed: the 10-Q for the quarter that ended on 30 June. Fidelity's FBTC, the second-largest fund, sits there at &lt;strong&gt;174,383 BTC as of June 30&lt;/strong&gt;, four months old.&lt;/p&gt;

&lt;p&gt;That is a choice worth explaining. We could have estimated today's FBTC holdings from its share count and NAV. We didn't, because then the table would carry a number nobody published. A dated number from a filing is less fresh but it is real, and the date sits right next to it, so a reader can decide how much to trust it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://coinbucha.com/data/listed-etfs.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextIOWrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;btc_held&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;btc_held_as_of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;stale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 1280733 ['FBTC', 'HODL', 'BRRR', 'EZBC', 'BTCO', 'BTCW']  (as served 3 Nov 2026)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every row also carries &lt;code&gt;btc_held_source_url&lt;/code&gt; and the date we accessed it, so you can check any figure against the document it came from.&lt;/p&gt;

&lt;p&gt;When a fund starts publishing a current figure we can cite, its row moves up into the first group. Information only, not financial advice.&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>data</category>
      <category>python</category>
      <category>opendata</category>
    </item>
    <item>
      <title>ChatGPT sent 116 people to one of our pages last week. The week before, it sent 7.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Tue, 03 Nov 2026 01:39:53 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/chatgpt-sent-116-people-to-one-of-our-pages-last-week-the-week-before-it-sent-7-272k</link>
      <guid>https://dev.to/jukkablomberg/chatgpt-sent-116-people-to-one-of-our-pages-last-week-the-week-before-it-sent-7-272k</guid>
      <description>&lt;p&gt;I run a small studio of websites, mostly built and maintained by AI agents. One of them, Monitoring Room, has a page that tracks what prediction markets price for the 2026 US midterms: &lt;a href="https://monitoringroom.com/us-midterms-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=mr-chatgpt-arrivals-devto" rel="noopener noreferrer"&gt;monitoringroom.com/us-midterms-2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our analytics feed splits arrivals by source every night. Here is what it read this morning (3 November, election day), for the whole site:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;source&lt;/th&gt;
&lt;th&gt;last 7 days&lt;/th&gt;
&lt;th&gt;7 days before&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;chatgpt.com&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;116&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;direct&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google organic&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;all our X posts together&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Over 28 days, 119 human sessions landed on that one midterms page straight from ChatGPT, and 75 of them were engaged in Google Analytics' sense (10+ seconds on the page, or a second page). Perplexity showed up for the first time this week with 2. The readers came from the US (23 %), South Korea (15 %) and Germany (7 %) first.&lt;/p&gt;

&lt;p&gt;We did not pitch anything to anyone. Nobody here knows exactly why the assistant started citing this page. Here is what I can tell you, and it is all checkable on the page itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the page has that an assistant can quote
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A number with a timestamp.&lt;/strong&gt; Each market shows its price, when it was read, and the 7-day change written out with both ends: "65.5 % at 27 Oct 01:58 UTC → 75.5 % at 3 Nov 01:33 UTC".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Its own gaps.&lt;/strong&gt; Every market lists how many samples it has (the House market: 4,521 since 16 September) and where the tracker went blind: "longest 16.7 d (16 Sep → 3 Oct)". It is unusual for a page to print its own holes, and it means a quoted number comes with its caveat attached.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A source link per row&lt;/strong&gt; back to the market it was read from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A frozen eve-of-vote record.&lt;/strong&gt; Last night at 00:41 UTC the page froze what each market priced the night before the vote, so after the results nobody (including us) can quietly move the "before" number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A one-line entry in &lt;code&gt;/llms.txt&lt;/code&gt;&lt;/strong&gt; saying what the page is: market-implied Senate and House control, read from Polymarket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that was built for ChatGPT. It was built so a reader could check us. It may be the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we changed this morning
&lt;/h2&gt;

&lt;p&gt;A page that an assistant sends 100+ people a week to had no way to keep any of them. As of today it has one small box under the board: leave an email and get one message when these markets resolve, with the result next to what was priced on the eve. One field, one consent line, one-click unsubscribe. We'll see whether a reader who came from an AI answer wants the follow-up.&lt;/p&gt;

&lt;p&gt;The page is information only: market prices are observations, not forecasts, and nothing here is betting or political advice.&lt;/p&gt;

&lt;p&gt;If you run content sites, the thing I'd check this week is your own analytics for &lt;code&gt;chatgpt.com&lt;/code&gt; as a source. Ours went from a rounding error to our biggest single source in seven days, on a page with a hard date in it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>My AI builder had 12 jobs last night. The 4 it didn't do are the part I'd pay for.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Mon, 02 Nov 2026 01:37:55 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/my-ai-builder-had-12-jobs-last-night-the-4-it-didnt-do-are-the-part-id-pay-for-291p</link>
      <guid>https://dev.to/jukkablomberg/my-ai-builder-had-12-jobs-last-night-the-4-it-didnt-do-are-the-part-id-pay-for-291p</guid>
      <description>&lt;p&gt;I run a small company where most of the work is done by AI agents on a schedule. One of them, the builder, wakes at 02:40 Helsinki time, reads a ranked list of jobs, builds what it can, and writes one line per job into a ledger before it goes back to sleep.&lt;/p&gt;

&lt;p&gt;Last night (2 November) the list had 12 jobs. The ledger says: 6 built or done, 2 not reached for lack of time, and &lt;strong&gt;4 where it stopped and wrote down why&lt;/strong&gt; (in one of them it still built the parts that cost nothing). Here are the four, in the ledger's own terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It wouldn't spend $4 without asking
&lt;/h2&gt;

&lt;p&gt;Job: prepare two iPhone apps for a store launch on Tuesday. That needs a cloud build. The build budget for the month is $45 and it already stood at $78. A pair of iOS builds costs about $4.&lt;/p&gt;

&lt;p&gt;It didn't build. It checked whether I had written an over-budget approval anywhere it can read (it greps for it), found none, filed one yes/no question for me, and built the two parts of the job that cost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. It wouldn't pretend to be a browser
&lt;/h2&gt;

&lt;p&gt;Job: re-read a few wine companies' annual reports. One company's server answers our probe with "405, not allowed". The suggested fix was to retry with a browser-style user agent.&lt;/p&gt;

&lt;p&gt;It refused: that is getting past a site's bot block by pretending to be someone else. It recorded the 405 as evidence and asked for the job to be re-scoped.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. It killed 39 pages its own rule said not to publish
&lt;/h2&gt;

&lt;p&gt;Job: give every forecasting question on one of our sites its own search-friendly page, &lt;strong&gt;but only for questions with at least 10 forecasters&lt;/strong&gt;. It read the live data first: 39 questions, the busiest had 1 forecaster. Zero qualified. Building anyway would have published 39 thin pages. Job killed, with the condition for re-opening it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. It wouldn't half-build a newsletter
&lt;/h2&gt;

&lt;p&gt;Job: publish issue 2 of a monthly brief. Sized as small. On reading the sources it turned out to be about 45 sourced rows of editorial work. It marked the job "medium", said so, and left it for a dedicated slot instead of shipping half an issue to subscribers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'd keep these over the 6 that worked
&lt;/h2&gt;

&lt;p&gt;Building is the easy part to automate. What makes it safe to let agents run while I sleep is that they stop at the right lines: money, other people's systems, quality rules, and anything that would go out half-done. Those lines are written down, and every stop leaves a line in the ledger I can check in the morning.&lt;/p&gt;

&lt;p&gt;My company runs 29 jobs this way: 23 done by agents, 5 kept by me (anything that sends, spends, signs, holds a password, or touches a close relationship), 1 nobody does on purpose. The whole table, generated from the system itself: &lt;a href="https://jukkablomberg.com/ai?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=jb-agent-refusals-devto" rel="noopener noreferrer"&gt;jukkablomberg.com/ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're running agents in production, the question I'd ask of yours: what did it refuse last night, and where is that written down?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The day before the US midterms, three separate Polymarket markets agree with each other to within half a point</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Mon, 02 Nov 2026 01:37:27 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/the-day-before-the-us-midterms-three-separate-polymarket-markets-agree-with-each-other-to-within-3b74</link>
      <guid>https://dev.to/jukkablomberg/the-day-before-the-us-midterms-three-separate-polymarket-markets-agree-with-each-other-to-within-3b74</guid>
      <description>&lt;p&gt;Polymarket runs several markets on who will control Congress after Tuesday's US midterms. They are separate order books with separate traders: one for the House, one for the Senate, and one "balance of power" market that prices the four combinations.&lt;/p&gt;

&lt;p&gt;That makes a nice consistency test. If the combination market says "Democrats win both" and "Republicans win the Senate, Democrats win the House", then adding those two should give you roughly what the House market says on its own.&lt;/p&gt;

&lt;p&gt;So we checked, on the morning of 2 November (prices as read at 01:18 UTC).&lt;/p&gt;

&lt;h2&gt;
  
  
  What each market priced
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Market&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;House&lt;/td&gt;
&lt;td&gt;Democrats control&lt;/td&gt;
&lt;td&gt;94.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Senate&lt;/td&gt;
&lt;td&gt;Democrats control&lt;/td&gt;
&lt;td&gt;71.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power&lt;/td&gt;
&lt;td&gt;Democrats win both&lt;/td&gt;
&lt;td&gt;70.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power&lt;/td&gt;
&lt;td&gt;Republican Senate, Democratic House&lt;/td&gt;
&lt;td&gt;23.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power&lt;/td&gt;
&lt;td&gt;Republicans win both&lt;/td&gt;
&lt;td&gt;5.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance of power&lt;/td&gt;
&lt;td&gt;Democratic Senate, Republican House&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Rebuild the House and Senate from the combinations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;House, Democrats&lt;/strong&gt; = "both" 70.5 + "R Senate, D House" 23.5 = &lt;strong&gt;94.0%&lt;/strong&gt;. The House market says &lt;strong&gt;94.5%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Senate, Democrats&lt;/strong&gt; = "both" 70.5 + "D Senate, R House" 0.5 = &lt;strong&gt;71.0%&lt;/strong&gt;. The Senate market says &lt;strong&gt;71.5%&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Half a point apart, both times, on markets that don't share an order book. The four combinations (plus a 0.1% "Other") add up to 100.1%. That's about as tidy as a crowd gets.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that moved
&lt;/h2&gt;

&lt;p&gt;The House barely moved this week: 91.5% → 94.5% (+3 points). The Senate moved more than twice as much: &lt;strong&gt;64.5% → 71.5% (+7 points)&lt;/strong&gt; between 26 October and 2 November. If you only watch one number on election night, the Senate is where the market still has doubt left.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do it yourself
&lt;/h2&gt;

&lt;p&gt;MonitoringRoom reads these markets every minute and serves them as plain JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://monitoringroom.com/api/us-midterms-2026&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chamber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;probability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

&lt;span class="n"&gt;both&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Senate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Democrats Sweep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;r_sen_d_h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Senate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;R Senate, D House&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;d_sen_r_h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Senate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D Senate, R House&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;House D, rebuilt:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;both&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;r_sen_d_h&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;House&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Democratic Party&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Senate D, rebuilt:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;both&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;d_sen_r_h&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Senate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Democratic Party&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;as of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;asOf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prices change all day, so your numbers will differ from ours. That's the point of writing down the time.&lt;/p&gt;

&lt;p&gt;The live board, with every market's 7-day change and how long each has been tracked: &lt;a href="https://monitoringroom.com/us-midterms-2026?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=mr-midterms-eve-devto" rel="noopener noreferrer"&gt;monitoringroom.com/us-midterms-2026&lt;/a&gt;. If you're new to reading these: &lt;a href="https://monitoringroom.com/us-midterms-2026/whats-priced?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=mr-midterms-eve-devto" rel="noopener noreferrer"&gt;what's priced, House vs Senate vs balance of power&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Market-implied probabilities are what traders are pricing, not a forecast by us and not an endorsement of any party or candidate. Information only — not betting advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>api</category>
      <category>opendata</category>
    </item>
    <item>
      <title>BlackRock's bitcoin ETF holds 76% of the bitcoin that spot ETFs publish. Fidelity's page didn't say.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Fri, 30 Oct 2026 01:40:55 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/blackrocks-bitcoin-etf-holds-76-of-the-bitcoin-that-spot-etfs-publish-fidelitys-page-didnt-say-240f</link>
      <guid>https://dev.to/jukkablomberg/blackrocks-bitcoin-etf-holds-76-of-the-bitcoin-that-spot-etfs-publish-fidelitys-page-didnt-say-240f</guid>
      <description>&lt;p&gt;If you want to know how much bitcoin a US spot bitcoin ETF holds, the obvious place to look is the issuer's own fund page. So that's the only place we looked.&lt;/p&gt;

&lt;p&gt;On 28 October we read eleven issuer pages. Five printed both the bitcoin held and the shares outstanding, with a date:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fund&lt;/th&gt;
&lt;th&gt;Issuer&lt;/th&gt;
&lt;th&gt;BTC held&lt;/th&gt;
&lt;th&gt;as of&lt;/th&gt;
&lt;th&gt;BTC per share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IBIT&lt;/td&gt;
&lt;td&gt;iShares (BlackRock)&lt;/td&gt;
&lt;td&gt;813,039.85&lt;/td&gt;
&lt;td&gt;2026-10-27&lt;/td&gt;
&lt;td&gt;0.000567&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GBTC&lt;/td&gt;
&lt;td&gt;Grayscale&lt;/td&gt;
&lt;td&gt;125,262.33&lt;/td&gt;
&lt;td&gt;2026-10-26&lt;/td&gt;
&lt;td&gt;0.000772&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTC&lt;/td&gt;
&lt;td&gt;Grayscale (Mini)&lt;/td&gt;
&lt;td&gt;63,128.96&lt;/td&gt;
&lt;td&gt;2026-10-27&lt;/td&gt;
&lt;td&gt;0.000442&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BITB&lt;/td&gt;
&lt;td&gt;Bitwise&lt;/td&gt;
&lt;td&gt;37,084.60&lt;/td&gt;
&lt;td&gt;2026-10-26&lt;/td&gt;
&lt;td&gt;0.000543&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARKB&lt;/td&gt;
&lt;td&gt;ARK / 21Shares&lt;/td&gt;
&lt;td&gt;30,795&lt;/td&gt;
&lt;td&gt;2026-10-28&lt;/td&gt;
&lt;td&gt;0.000332&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Together: &lt;strong&gt;1,069,311 BTC&lt;/strong&gt;. BlackRock's IBIT alone is 76% of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six we couldn't count
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FBTC (Fidelity):&lt;/strong&gt; the page read that day printed no bitcoin held and no share count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HODL (VanEck)&lt;/strong&gt; and &lt;strong&gt;EZBC (Franklin Templeton):&lt;/strong&gt; the figures load by script; the copy we read carried none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BRRR (CoinShares):&lt;/strong&gt; printed 5,720.32 BTC, but no shares outstanding, so no per-share number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BTCO (Invesco / Galaxy):&lt;/strong&gt; neither figure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BTCW (WisdomTree):&lt;/strong&gt; figures dated July 2024, and no bitcoin held.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that means those funds hold nothing. It means their own page, on that day, didn't say.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two rules if you build on this kind of data
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A missing number is not a zero.&lt;/strong&gt; We print "no primary source yet" with the reason and the date we checked, instead of borrowing a figure from an aggregator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per share is not per dollar.&lt;/strong&gt; GBTC holds more bitcoin per share than IBIT, but the shares cost different amounts, so the per-share column tells you nothing about which is "cheaper".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Same goes for flows: no issuer publishes a spot-ETF flow document we can source, so the page serves "absent", not 0.&lt;/p&gt;

&lt;p&gt;The table and each fund's own page: &lt;a href="https://coinbucha.com/etfs?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=cb-etf-sources-devto" rel="noopener noreferrer"&gt;coinbucha.com/etfs&lt;/a&gt;. And if you're wondering how an ETF share differs from a share of a bitcoin treasury company like Strategy: &lt;a href="https://coinbucha.com/learn/spot-bitcoin-etf-vs-treasury-company?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=cb-etf-sources-devto" rel="noopener noreferrer"&gt;what a share actually holds&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Information, not financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>data</category>
      <category>finance</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Fleet Report #1: my AI agents built 81 things this week. One script went blind for a day.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Fri, 30 Oct 2026 01:39:42 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/fleet-report-1-my-ai-agents-built-81-things-this-week-one-script-went-blind-for-a-day-14om</link>
      <guid>https://dev.to/jukkablomberg/fleet-report-1-my-ai-agents-built-81-things-this-week-one-script-went-blind-for-a-day-14om</guid>
      <description>&lt;p&gt;I run a small studio where AI agents do most of the work: 13 standing agents, one human (me). Every item an agent handles gets one line in a handover ledger. This is the first weekly issue written only from that ledger and the files beside it, so nothing in it can be backfilled later.&lt;/p&gt;

&lt;p&gt;Week: Friday 23 to Thursday 29 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The week in one number: 81
&lt;/h2&gt;

&lt;p&gt;81 items marked BUILT, on all seven days. The week before: 144.&lt;/p&gt;

&lt;p&gt;Fewer, and the ledger doesn't say why. It counts handled items, not effort or value, so I'm not going to invent a reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The number that changed a decision: 3 vs 2,068
&lt;/h2&gt;

&lt;p&gt;Two of the sites run MCP servers that AI agents can query. CoinBucha's (bitcoin data) has been in the official MCP Registry since June: 2,068 registered tool calls by 26 October. VINCAP's (listed wine companies) wasn't listed anywhere: 3.&lt;/p&gt;

&lt;p&gt;So on 27 October we published VINCAP to the registry. As of today it has had 31. Anonymous, so that's queries, not who.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What went wrong
&lt;/h2&gt;

&lt;p&gt;The script that watches two inboxes for replies crashed on the label of a new email batch (&lt;code&gt;BATCH-G1&lt;/code&gt;). Its pattern expected a number there. For about a day, replies to those two addresses went unread.&lt;/p&gt;

&lt;p&gt;The nightly agent flagged the crash. The maintenance agent fixed the pattern and added a test the next morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A gate that fired
&lt;/h2&gt;

&lt;p&gt;The agents drafted five emails to named companies and stopped, because a company batch needed my word. My answer, 28 October: "I don't need to click for a send. You can do it and you should do it."&lt;/p&gt;

&lt;p&gt;All five went out the next morning. Replies so far: zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Three things that shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://coinbucha.com/etfs?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-1" rel="noopener noreferrer"&gt;Spot bitcoin ETFs, from the issuers' own files&lt;/a&gt;: five funds, 1,069,311 BTC, each figure dated.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://monitoringroom.com/situation/crypto-hack?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-1" rel="noopener noreferrer"&gt;"Was it hacked?"&lt;/a&gt;: a checker over 1,329 recorded crypto exploits.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vincap.co/rankings?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-1" rel="noopener noreferrer"&gt;Wine stock rankings&lt;/a&gt;: all 48 listed wine companies, on the two measures you pick.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Every count comes from the ledger described at &lt;a href="https://jukkablomberg.com/operating-system?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-1" rel="noopener noreferrer"&gt;jukkablomberg.com/operating-system&lt;/a&gt;. How I'd set this up inside your company: &lt;a href="https://jukkablomberg.com/ai?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=fleet-report-1" rel="noopener noreferrer"&gt;jukkablomberg.com/ai&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>automation</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Europe's newest licensed crypto firms aren't exchanges. They're German village banks.</title>
      <dc:creator>Jukka Blomberg</dc:creator>
      <pubDate>Thu, 29 Oct 2026 01:39:34 +0000</pubDate>
      <link>https://dev.to/jukkablomberg/europes-newest-licensed-crypto-firms-arent-exchanges-theyre-german-village-banks-3p64</link>
      <guid>https://dev.to/jukkablomberg/europes-newest-licensed-crypto-firms-arent-exchanges-theyre-german-village-banks-3p64</guid>
      <description>&lt;p&gt;On 20 October, ESMA's register of crypto firms licensed under MiCA grew by eight names. Not one was an exchange, a wallet or a startup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raiffeisenbank Eifel eG&lt;/li&gt;
&lt;li&gt;Sparda-Bank Baden-Württemberg eG&lt;/li&gt;
&lt;li&gt;Volksbank in der Hohen Mark eG&lt;/li&gt;
&lt;li&gt;Volksbank in der Region eG&lt;/li&gt;
&lt;li&gt;Volksbank in Ostwestfalen eG&lt;/li&gt;
&lt;li&gt;Volksbank Mittlerer Neckar eG&lt;/li&gt;
&lt;li&gt;Volksbank Niederrhein eG&lt;/li&gt;
&lt;li&gt;Volksbank Oberberg eG&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All eight are German cooperative banks, all supervised by BaFin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zoom out and it's the whole pattern
&lt;/h2&gt;

&lt;p&gt;The register file dated 2026-10-20 lists &lt;strong&gt;384 authorised crypto-asset service providers&lt;/strong&gt; (distinct entity + authority pairs). By home country:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Licensed firms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;France&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netherlands&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cyprus&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Malta&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spain&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Of Germany's 114, &lt;strong&gt;63 are cooperative banks&lt;/strong&gt; (the "eG" in the name). The names most people would guess are there too (Coinbase via Luxembourg, Revolut, eToro, OKX, Bitstamp, N26, Robinhood via Lithuania), but by count, Europe's licensed crypto industry is mostly regional banks adding a crypto service for their own customers.&lt;/p&gt;

&lt;p&gt;One oddity worth knowing if you parse the file: ESMA's CSV carries authorisation notification dates &lt;em&gt;after&lt;/em&gt; the file date for some rows (Volksbank Oberberg: 2026-11-19, in a file dated 2026-10-20). Treat that column as "as recorded", not as "already live".&lt;/p&gt;

&lt;h2&gt;
  
  
  The other register points the other way
&lt;/h2&gt;

&lt;p&gt;ESMA also publishes a register of &lt;strong&gt;non-compliant&lt;/strong&gt; entities. The file dated 2026-10-15 has 178 rows, and 166 of them were listed by Italy's CONSOB. Being listed there is a published regulatory listing about authorisation, not a finding of wrongdoing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.esma.europa.eu/sites/default/files/2024-12/CASPS.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_bad_lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# find the home-member-state and entity-name columns, then:
# df.groupby(&amp;lt;home member state column&amp;gt;).size().sort_values(ascending=False).head(6)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ESMA republishes the file weekly and changes column names now and then, so we diff each new file against the last and keep a dated log of what was added and removed: &lt;a href="https://northpoint.fi/regulations/mica/casp-register-changes?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=np-volksbank-devto" rel="noopener noreferrer"&gt;the MiCA register change log&lt;/a&gt;, with the same data as &lt;a href="https://northpoint.fi/data/register-changelog.json?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=np-volksbank-devto" rel="noopener noreferrer"&gt;JSON&lt;/a&gt; and an Atom feed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information, not legal advice. Counts as served from ESMA's own register files on the dates above; always confirm a firm's current entry on the ESMA register.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>opendata</category>
      <category>python</category>
      <category>fintech</category>
    </item>
  </channel>
</rss>
