<?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: chovy</title>
    <description>The latest articles on DEV Community by chovy (@chovy).</description>
    <link>https://dev.to/chovy</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%2F380499%2Fdc7e67ea-7c66-4ee6-87cb-b5efea914c1c.jpeg</url>
      <title>DEV Community: chovy</title>
      <link>https://dev.to/chovy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chovy"/>
    <language>en</language>
    <item>
      <title>c0mpute nodes now charge AI crawlers for the files they host</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Wed, 11 Nov 2026 06:13:22 +0000</pubDate>
      <link>https://dev.to/chovy/c0mpute-nodes-now-charge-ai-crawlers-for-the-files-they-host-986</link>
      <guid>https://dev.to/chovy/c0mpute-nodes-now-charge-ai-crawlers-for-the-files-they-host-986</guid>
      <description>&lt;p&gt;c0mpute nodes now charge AI crawlers for the files they host&lt;/p&gt;

&lt;p&gt;Every c0mpute node runs a gateway that serves hosted sites to the public. Most of what fetches those files in bulk is AI training crawlers. As of c0mpute v0.3.33, a node can charge them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;A training crawler (GPTBot, ClaudeBot, CCBot, Bytespider and the rest) that asks a gateway for a hosted file gets HTTP 402 with an x402 offer. It pays USDC on Base, Polygon or Ethereum through CoinPay and gets back a signed day pass. People, search engines and assistant bots like ChatGPT-User and Claude-User are never charged.&lt;/p&gt;

&lt;p&gt;The money goes straight to the node operator. The node does not need a wallet in its config: it asks CoinPay which wallet the operator's account uses (a new &lt;code&gt;GET /api/x402/pay-to&lt;/code&gt; endpoint) and checks again every hour, so changing the wallet in CoinPay changes it on every node.&lt;/p&gt;

&lt;p&gt;It is off by default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="k"&gt;[x402]&lt;/span&gt;
&lt;span class="na"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;# CoinPay key (x402 scope) in $C0MPUTE_X402_COINPAY_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs on our own nodes today. You can see the offer a bot gets at &lt;a href="https://gateway.c0mpute.com/_x402/crawl" rel="noopener noreferrer"&gt;https://gateway.c0mpute.com/_x402/crawl&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ThreatCrush on every node
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;c0mpute plugin install threatcrush&lt;/code&gt; makes the gateway write an access log with the real client address and registers it with ThreatCrush, which scores requests against attack rules and bans repeat offenders. A test XSS probe against each of our three nodes showed up as a critical event within a second.&lt;/p&gt;

&lt;p&gt;Getting there turned up two ThreatCrush fixes. Its docs described extra log paths that the daemon never actually read (fixed in 0.13.77). And its 2 million row event cap had grown one node's database to 3.2 GB, which left the daemon stuck re-reading its own file. The default is now 250k rows (0.13.78).&lt;/p&gt;

&lt;h2&gt;
  
  
  A CoinPay audit along the way
&lt;/h2&gt;

&lt;p&gt;Wiring the nodes to CoinPay showed that an x402 key, meant only to settle payments, could list every business on the account with its API key. That led to an audit of all 126 routes a business API key can reach. 28 let one business's key act as the whole account, including registering a passkey on the owner's login and creating the secrets vault. All 28 are fixed and deployed.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/profullstack/c0mpute" rel="noopener noreferrer"&gt;c0mpute&lt;/a&gt;, &lt;a href="https://github.com/profullstack/threatcrush" rel="noopener noreferrer"&gt;ThreatCrush&lt;/a&gt;, &lt;a href="https://github.com/profullstack/coinpayportal" rel="noopener noreferrer"&gt;CoinPay&lt;/a&gt;. Drafted with AI help, checked by me.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>crypto</category>
      <category>llm</category>
      <category>web3</category>
    </item>
    <item>
      <title>Inference on Infernet is pay as you go, and the price follows the market</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Thu, 05 Nov 2026 11:19:05 +0000</pubDate>
      <link>https://dev.to/chovy/inference-on-infernet-is-pay-as-you-go-and-the-price-follows-the-market-141l</link>
      <guid>https://dev.to/chovy/inference-on-infernet-is-pay-as-you-go-and-the-price-follows-the-market-141l</guid>
      <description>&lt;p&gt;Infernet inference used to be free and rate limited. You got 20 requests an hour per IP, and that was the whole billing system. Meanwhile the network had a real prepaid balance sitting right there, built for paid batch inference: money in micro dollars, a top up rail through CoinPay or x402, per model prices, and node earnings usable as a funding source. None of it was reachable unless you submitted a batch.&lt;/p&gt;

&lt;p&gt;So a customer with money on their account could not spend it on a chat message, and an operator who had earned money could not spend those earnings on anything except a batch. That is fixed now, and the price of a model is no longer a number somebody typed once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your balance pays for inference
&lt;/h2&gt;

&lt;p&gt;Interactive inference now draws the same prepaid balance paid batches use. That covers the chat playground, the OpenAI compatible endpoint at /v1/chat/completions, the CLI, and c0mpute.com's chat.&lt;/p&gt;

&lt;p&gt;A request is charged once when it finishes, keyed on the job id, so a retried completion or two completion paths racing the same job charge exactly once. There is no hold taken up front. Tokens are only known after the work is done, so a thin balance can be overrun by a long answer; the charge is capped at whatever the balance holds and the remainder is recorded. The worst case is a fraction of a cent the house absorbs, instead of a customer in debt.&lt;/p&gt;

&lt;p&gt;The free tier did not go away. An anonymous caller is served free and rate limited exactly as before, and a signed in account with an empty balance falls back to that same free tier rather than getting a 402. Metering was never meant to shut the front door.&lt;/p&gt;

&lt;h2&gt;
  
  
  What your nodes earned can pay for what you use
&lt;/h2&gt;

&lt;p&gt;If you run a node, the money it earned can pay for your own inference. No top up, no withdrawal, no round trip through an exchange.&lt;/p&gt;

&lt;p&gt;The important half of that is what stops it being a hole. When earnings move into a compute balance, the transfer writes a negative earnings row, so the same dollars drop out of what a payout can claim. A withdrawal request for money already spent on compute is refused by the database, not by a code path somebody might forget. We tested exactly that: a node with a cent earned, two tenths of a cent spent on inference, and a payout request for the full cent was refused while a request for the remainder went through.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;infernet billing spend-earnings&lt;/code&gt; moves earnings across on demand, and metered requests pull from them automatically when the prepaid balance cannot cover a charge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The price moves with supply and demand
&lt;/h2&gt;

&lt;p&gt;This is a compute market, so a price nobody set should follow the market rather than sit still.&lt;/p&gt;

&lt;p&gt;Every model now resolves through three layers. An operator sets the price for the models their own node serves, and that number is never touched. Below that is the house rate card per model. Below that is a default, which exists so a model nobody has priced is never served for free. That last part was a real leak: nine of the twelve models the network was serving, including our own fine tuned agents, were being given away because they were missing from the rate card.&lt;/p&gt;

&lt;p&gt;Whichever of those two house layers applies gets scaled by the market:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;multiplier = 1 + sensitivity x (utilization - target)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Utilization is how much of the capacity that can serve the model is busy right now. Under the target the model gets cheaper, over it the model gets dearer, and a model only one node can serve gets a nudge upward so a second node is worth bringing online.&lt;/p&gt;

&lt;p&gt;Here is the network a few minutes ago:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model                nodes  util   mult   price per 1M output
qwen2.5:7b               1   75%   1.65x  $0.33
qwen3.5-abliterated:9b   3   25%   0.65x  $0.156
qwen2.5:0.5b             6   17%   0.50x  $0.02
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A 7b served by one busy node costs more than its card price. A 0.5b served by six idle nodes costs less than half. A 9b still costs more than a 4b, because the market scales the card instead of replacing it, which is the mistake we made first and had to go back and fix. Applying the market only to unpriced models made the whole thing dead code the moment the rate card covered everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounded, stable, and checkable
&lt;/h2&gt;

&lt;p&gt;A price that floats needs guardrails, or it is not fit to charge anyone with.&lt;/p&gt;

&lt;p&gt;It is bounded twice. The multiplier is clamped, and the resulting price is clamped again into the same band an operator price has to sit in. An operator price outside that band is refused when they set it, and clamped again when it is read, so narrowing the band later cannot leave a stale price outside it.&lt;/p&gt;

&lt;p&gt;It is stable. Multipliers are quantized to a step, so a hundred busy slots versus a hundred and one out of four hundred is noise rather than a price change, and the market snapshot is cached briefly so a burst of requests sees one price.&lt;/p&gt;

&lt;p&gt;It is checkable, and this is the part that matters most. The price list is public and needs no account:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl https://infernetprotocol.com/api/v1/pricing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Every row carries the base it was scaled from, the multiplier, how many nodes serve the model, their capacity, how much is busy, and why the price moved. Base times multiplier equals the published price, which is arithmetic anyone can do for themselves. A market whose price you can only discover by being charged is not a market anybody should trust.&lt;/p&gt;

&lt;p&gt;And every failure path lands on a price rather than on free. An unreadable market is one times the plain base. A malformed operator price falls back to the card. A billing outage serves the free tier instead of taking inference down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to look
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;infernet billing balance            what you can spend
infernet billing spend-earnings     move node earnings across
infernet price list                 what your node charges
infernet price set &amp;lt;model&amp;gt; --out    set your own price
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Operators: &lt;code&gt;infernet price list&lt;/code&gt; shows your models, the band you have to price inside, and whether each price came from you, the card, or the market.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>crypto</category>
      <category>llm</category>
      <category>web3</category>
    </item>
    <item>
      <title>MeshHook now runs your workflows on c0mpute</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:54:02 +0000</pubDate>
      <link>https://dev.to/chovy/meshhook-now-runs-your-workflows-on-c0mpute-5f6f</link>
      <guid>https://dev.to/chovy/meshhook-now-runs-your-workflows-on-c0mpute-5f6f</guid>
      <description>&lt;h1&gt;
  
  
  MeshHook now runs your workflows on c0mpute
&lt;/h1&gt;

&lt;p&gt;MeshHook is our MIT-licensed, webhook-first workflow engine: you drag nodes onto a canvas, wire them up, and a webhook starts a run. As of today the steps in those runs execute on &lt;a href="https://c0mpute.com" rel="noopener noreferrer"&gt;c0mpute&lt;/a&gt;, our peer-to-peer compute network. Think n8n, except the work happens on other people's machines instead of yours.&lt;/p&gt;

&lt;p&gt;Try it at &lt;a href="https://meshhook.com" rel="noopener noreferrer"&gt;meshhook.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What runs where
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI steps&lt;/strong&gt; call open models on c0mpute nodes through the Infernet open market. They are peer-only: a step never falls back to a paid hosted model. The default is qwen2.5:1.5b, then 0.5b, because several nodes serve them and a JSON-shaped prompt comes back in about 10 seconds. You can pick a bigger model per node if you can wait for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JMESPath transforms and HTTP calls&lt;/strong&gt; are auctioned as &lt;code&gt;workflow.step&lt;/code&gt; jobs. Any c0mpute worker on 0.2.56 or later bids on them by default. The winner runs the step and returns a result MeshHook checks by hash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branches, loops, delays and template transforms&lt;/strong&gt; stay on the MeshHook server. They are cheap, and they need the run's state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real run from this afternoon: webhook, then an AI step on a node in Vienna, then a transform and an HTTP call on a c0mpute worker. 25 seconds end to end, and the run log records which worker ran each step and what it cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your credentials stay home
&lt;/h2&gt;

&lt;p&gt;A worker sees the whole step it runs, so MeshHook keeps an HTTP call on its own server whenever it carries anything secret: an &lt;code&gt;Authorization&lt;/code&gt; or cookie header, anything that looks like a key or token, &lt;code&gt;user:pass@&lt;/code&gt; in the URL, or a secret template. To send those steps to the network anyway, pin your own workers in the workflow settings.&lt;/p&gt;

&lt;p&gt;Workers refuse to fetch private, loopback, link-local and cloud metadata addresses. They pin the connection to the address they checked and re-check every redirect.&lt;/p&gt;

&lt;p&gt;If the network cannot do something (nobody bids, the bridge is down, or an API answers 402, which only MeshHook's x402 key can pay), the step runs on the server. The log says why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick per workflow
&lt;/h2&gt;

&lt;p&gt;The editor has a &lt;strong&gt;Runs on&lt;/strong&gt; menu with four options: Auto, c0mpute network, This server, or Private. Private means nothing but AI steps leaves the server, whatever the default is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a worker
&lt;/h2&gt;

&lt;p&gt;Every c0mpute worker on 0.2.56 or later serves workflow steps. Install one with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://c0mpute.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every node you add makes everyone's workflows faster. The protocol details are in DIP 0030, in the c0mpute repo.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/profullstack/meshhook" rel="noopener noreferrer"&gt;github.com/profullstack/meshhook&lt;/a&gt; and &lt;a href="https://github.com/profullstack/c0mpute" rel="noopener noreferrer"&gt;github.com/profullstack/c0mpute&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How would you use a workflow engine whose steps run on a peer network instead of a server you pay for?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Train a business strategy model from links, on c0mpute, and publish it to Hugging Face</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 02 Nov 2026 11:08:31 +0000</pubDate>
      <link>https://dev.to/chovy/train-a-business-strategy-model-from-links-on-c0mpute-and-publish-it-to-hugging-face-5bk3</link>
      <guid>https://dev.to/chovy/train-a-business-strategy-model-from-links-on-c0mpute-and-publish-it-to-hugging-face-5bk3</guid>
      <description>&lt;p&gt;We trained saas-business-strategist-agent today: a small business and SaaS strategy model, trained on a CPU from a list of links, and published it on Hugging Face. You can train your own the same way.&lt;/p&gt;

&lt;p&gt;Model: &lt;a href="https://huggingface.co/profullstack/saas-business-strategist-agent" rel="noopener noreferrer"&gt;https://huggingface.co/profullstack/saas-business-strategist-agent&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links in, model out
&lt;/h2&gt;

&lt;p&gt;The c0mpute example takes links and turns them into a training corpus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rssamplifier.com topic pages, now with comma lists: &lt;a href="https://rssamplifier.com/topics/business,saas,crypto" rel="noopener noreferrer"&gt;https://rssamplifier.com/topics/business,saas,crypto&lt;/a&gt; pulls every blog and news feed filed under any of the three (2,087 blogs).&lt;/li&gt;
&lt;li&gt;pit.world searches: &lt;a href="https://pit.world/search?q=saas,business,crypto" rel="noopener noreferrer"&gt;https://pit.world/search?q=saas,business,crypto&lt;/a&gt; runs each term on the web, news and scholar tabs and fetches every result page.&lt;/li&gt;
&lt;li&gt;Single feeds, any web page, or a pasted list of links on stdin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No API keys. rssamplifier and pit.world both have open APIs and MCP servers, so the harvester is one Node script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node harvest.mjs https://rssamplifier.com/topics/business,saas,crypto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://pit.world/search?q=saas,business,crypto'&lt;/span&gt; &lt;span class="nt"&gt;--full&lt;/span&gt; &lt;span class="nt"&gt;--out&lt;/span&gt; data/saas-business.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Train it on c0mpute, or on your own CPU
&lt;/h2&gt;

&lt;p&gt;c0mpute 0.2.50 runs LoRA fine-tunes as a network job: workers bid, the winner trains, you watch a live progress bar, and the adapter's sha256 is checked against the receipt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;c0mpute infernet text train &lt;span class="nt"&gt;--job&lt;/span&gt; job-saas.json &lt;span class="nt"&gt;--dataset&lt;/span&gt; data/saas-business.jsonl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; out/saas-business-strategist-agent &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.venv/bin/python train.py job.json &lt;span class="nt"&gt;--name&lt;/span&gt; saas-business-strategist-agent &lt;span class="nt"&gt;--dataset&lt;/span&gt; data/saas-business.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Base model: Qwen2.5-0.5B-Instruct, a rank 8 LoRA (about 1.1M trainable parameters), bf16.&lt;/li&gt;
&lt;li&gt;Corpus: 3,615 posts (business 1,514, crypto 1,471, SaaS 630), 1,447 of them full articles.&lt;/li&gt;
&lt;li&gt;400 steps on 4 CPU threads, 2.4 GB peak RAM. Held-out perplexity went from 44.5 to 28.6.&lt;/li&gt;
&lt;li&gt;The adapter is 4.4 MB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first version used a 135M model. It echoed questions back. 0.5B answers on topic: asked how a 3-person SaaS should price its first plan, it said "one monthly price, one annual price at 10 times the monthly, and no other discounts" and cited three SaaS pricing guides.&lt;/p&gt;

&lt;p&gt;A sub-1B model learns the voice, not the facts. So the agent searches pit.world for each question and puts the top pages in the prompt. The facts come from search and the tune supplies the register.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things that bit us
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;torch uses one thread per core by default. On a busy 32-core box that ran at 22 tokens a second. Four threads ran at about 330.&lt;/li&gt;
&lt;li&gt;earlyoom kills big processes on a shared box with exit code 143 and no traceback. The trainer now saves a checkpoint every 25 steps and resumes when rerun, so a kill costs minutes instead of the run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Also shipped today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;pit.world search results show short, readable snippets instead of page dumps, and each result has a Summarize button that runs on c0mpute (5 an hour without an account, 60 signed in). The Images, Videos, Live, News, Music and Places tabs work again on free sources.&lt;/li&gt;
&lt;li&gt;rssamplifier.com takes comma lists everywhere a topic goes: pages, the JSON API, RSS and Atom feeds, and MCP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The example, with the harvester, trainer, chat and Hugging Face publisher: &lt;a href="https://github.com/profullstack/c0mpute/tree/master/examples/business-strategist-agent" rel="noopener noreferrer"&gt;https://github.com/profullstack/c0mpute/tree/master/examples/business-strategist-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Swap the links for your own topics and give it a name.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>huggingface</category>
      <category>saas</category>
    </item>
    <item>
      <title>Build an Agent-Ready App Starter with the Profullstack Stack Builder</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Fri, 30 Oct 2026 21:45:12 +0000</pubDate>
      <link>https://dev.to/chovy/build-an-agent-ready-app-starter-with-the-profullstack-stack-builder-502f</link>
      <guid>https://dev.to/chovy/build-an-agent-ready-app-starter-with-the-profullstack-stack-builder-502f</guid>
      <description>&lt;p&gt;Starting an app with a coding agent should not mean rebuilding the same project skeleton. This walkthrough uses Web + API + MCP to start a small status service with a browser app, an HTTP API and an MCP tool. The Stack Builder exports a source ZIP. It does not deploy a finished application.&lt;/p&gt;

&lt;p&gt;Step 1: Choose the surfaces. Open the free builder, name the project, then select Web, API and MCP. Add only modules that fit the project. The module list changes with the selected surfaces.&lt;/p&gt;

&lt;p&gt;Step 2: Export and inspect. Download the ZIP and read README.md, AGENTS.md and CLAUDE.md first. The agent instruction files match. For this selection, app/ contains the Next.js web app, src/api/server.ts contains the Hono server on Bun, src/mcp/server.ts starts the MCP server over stdio, and src/core/index.ts contains the shared status function.&lt;/p&gt;

&lt;p&gt;Step 3: Run the starter. From the project root, run bun install. Start bun run dev for the web app on port 3000 and bun run api for the standalone API on port 3001. Run bun run mcp in a separate terminal when you want to use the MCP server. The web app also mounts the API under /api. Run bun test before changing the starter.&lt;/p&gt;

&lt;p&gt;Step 4: Give your coding agent one bounded task. Ask it to read AGENTS.md and CLAUDE.md, then add one project-specific feature in src/core and expose it through the API and MCP server. Ask for a test alongside the feature, run bun test, and review the generated files before you continue.&lt;/p&gt;

&lt;p&gt;The ZIP is scaffolding. Configure secrets and external services, review the code, and test the application before deployment. Try the builder at &lt;a href="https://profullstack.com/stack/build?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=stack_builder_launch_20261030" rel="noopener noreferrer"&gt;https://profullstack.com/stack/build?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=stack_builder_launch_20261030&lt;/a&gt; and tell us which module should come next.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ten-Second Agent Standups: Agile Feedback Every 2 to 4 Hours</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Thu, 29 Oct 2026 08:38:29 +0000</pubDate>
      <link>https://dev.to/chovy/ten-second-agent-standups-agile-feedback-every-2-to-4-hours-4bm0</link>
      <guid>https://dev.to/chovy/ten-second-agent-standups-agile-feedback-every-2-to-4-hours-4bm0</guid>
      <description>&lt;p&gt;When you run a fleet of coding agents, a daily stand-up is too slow to surface a stuck task and a live meeting is the wrong way to pull a dozen agents out of work. Give each active agent a ten-second asynchronous stand-up every 2 to 4 hours. The goal is a shorter feedback loop between a task changing state and the sysop acting on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract
&lt;/h2&gt;

&lt;p&gt;Every update has three fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Done:&lt;/strong&gt; the last verifiable checkpoint, with a commit, preview or artifact when there is one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next:&lt;/strong&gt; one small, verifiable slice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocked:&lt;/strong&gt; the dependency and the decision or person needed, or &lt;code&gt;none&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write it in ten seconds or less. Report a result, not a mood. If nothing changed, say &lt;code&gt;No state change. Still working on [the next slice].&lt;/code&gt; Put the update beside the task and its artifacts, where the sysop can act on it.&lt;/p&gt;

&lt;p&gt;The 2 to 4 hour clock starts at the agent's last update. An idle agent has nothing to report. A blocked agent does not wait for the clock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shorten the feedback loop
&lt;/h2&gt;

&lt;p&gt;The 2020 Scrum Guide describes the Daily Scrum as a way to inspect progress toward a Sprint Goal and adapt the plan. A fleet has a different clock. An agent can hit a missing credential, a failed build or a bad assumption hours before a daily meeting. A compact update lets the sysop reassign the work, answer a question or stop a duplicate task while there is still time in the work cycle.&lt;/p&gt;

&lt;p&gt;That is the agile part: keep the goal visible, make work small enough to verify, and change the next step when new evidence arrives. The update does not make code faster by itself. It reduces the time work sits blocked or invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it asynchronous
&lt;/h2&gt;

&lt;p&gt;A stand-up every few hours becomes another interruption if it summons everyone into a call. Software engineering research has found that task switching can disrupt developer work. One analysis of 4,910 recorded tasks from 17 professional developers, paired with a survey of 132 developers, found self-interruptions were more disruptive than external interruptions and negatively affected the interrupted tasks. The stand-up should therefore be a short log entry, not a context switch.&lt;/p&gt;

&lt;p&gt;If an agent is in the middle of a safe, bounded operation, let it finish that slice and post at the checkpoint. Do not make it wait for other agents. Surface urgent blockers immediately. If a task goes four hours without a useful update, mark it stale and ask whether it should continue, split or stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure whether it helps
&lt;/h2&gt;

&lt;p&gt;Try the cadence for a week. Track how long blockers wait for the sysop, how many completed checkpoints get reviewed, and how many active tasks have no clear next step. If the updates change no assignment, priority or review decision, make them shorter or less frequent. The point is not to produce more status. The point is to keep the next useful action obvious.&lt;/p&gt;

&lt;p&gt;The Scrum Guide: &lt;a href="https://scrumguides.org/scrum-guide.html" rel="noopener noreferrer"&gt;https://scrumguides.org/scrum-guide.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Task interruption study: &lt;a href="https://arxiv.org/abs/1805.05508" rel="noopener noreferrer"&gt;https://arxiv.org/abs/1805.05508&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My AI agent hosts a podcast now, and you can be on it</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 26 Oct 2026 18:14:20 +0000</pubDate>
      <link>https://dev.to/chovy/my-ai-agent-hosts-a-podcast-now-and-you-can-be-on-it-13c2</link>
      <guid>https://dev.to/chovy/my-ai-agent-hosts-a-podcast-now-and-you-can-be-on-it-13c2</guid>
      <description>&lt;p&gt;Off The Record is a long-form podcast with no human host. riotcoder, the agent that ships most of my code, calls the guest on the phone and runs the interview. It works off a recorded group.call line, uses an ElevenLabs voice, and calls a clock tool every ten minutes so it wraps up on time.&lt;/p&gt;

&lt;p&gt;I was the guest on episode 1, "Running 300 Repos with AI Agents on Bare Metal": &lt;a href="https://offtherecord.podcast.pit.world/e/1" rel="noopener noreferrer"&gt;https://offtherecord.podcast.pit.world/e/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it takes other guests, and it is free. If you are building something with AI agents, running a fleet, or working on the new internet, leave your number here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://offtherecord.podcast.pit.world/guest" rel="noopener noreferrer"&gt;https://offtherecord.podcast.pit.world/guest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the whole signup. You give your name, a phone number, two or three sentences about what you build, and a topic if you have one. When your episode is booked your phone rings. Press 1 and the host joins. You don't need an app, a link or a studio.&lt;/p&gt;

&lt;p&gt;The host reads what you wrote before the call, and it is told that this is the only thing on the record about you, so it asks instead of guessing. The formats range from a 35 minute sprint to about two hours. A person listens to every recording before it goes out, and your number is never published.&lt;/p&gt;

&lt;p&gt;Feed: &lt;a href="https://offtherecord.podcast.pit.world/feed.xml" rel="noopener noreferrer"&gt;https://offtherecord.podcast.pit.world/feed.xml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>podcast</category>
    </item>
    <item>
      <title>group.call: a party line for people and AI agents</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 26 Oct 2026 16:17:49 +0000</pubDate>
      <link>https://dev.to/chovy/groupcall-a-party-line-for-people-and-ai-agents-1n2j</link>
      <guid>https://dev.to/chovy/groupcall-a-party-line-for-people-and-ai-agents-1n2j</guid>
      <description>&lt;h1&gt;
  
  
  group.call: a party line for people and AI agents
&lt;/h1&gt;

&lt;p&gt;Today we launched &lt;a href="https://group.call.pit.world" rel="noopener noreferrer"&gt;group.call&lt;/a&gt;. Make a room, get a four-digit code, and everyone dials one number: &lt;strong&gt;510-616-9327&lt;/strong&gt; (510-616-W3BS). No app, no link, no browser tab. A landline works. So does a car.&lt;/p&gt;

&lt;p&gt;The part we built it for: &lt;strong&gt;AI agents phone in too.&lt;/strong&gt; Ask an agent into the room and it dials the same number, keys the code with touch tones, says who it is, and takes part in the call out loud. Ours are riotcoder and cha0spunk. They hear everyone, answer when they are spoken to, and stay quiet when people are talking to each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made it hard
&lt;/h2&gt;

&lt;p&gt;Putting a language model on a phone call is easy. Making it a decent participant in a group call took most of a day of live testing with real people on the line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One voice at a time.&lt;/strong&gt; Agents take turns with a shared floor, wait for two seconds of silence before they speak, and stop the moment a person talks over them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They hear the room the way the room heard it.&lt;/strong&gt; Every leg is transcribed separately, so each line has a speaker. Agents read that, not their own muddy mix of the call, so they know who asked what.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory.&lt;/strong&gt; The room's transcript is the agents' memory. If an agent drops off the call, it is dialled back in, reads what it missed, and carries on without introducing itself again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploys do not touch a live call.&lt;/strong&gt; Who is in which conference is saved and restored on restart, and the proxy holds webhooks while the app restarts. We shipped a dozen releases today with people on the line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web and phone:&lt;/strong&gt; sign in with CoinPay at &lt;a href="https://group.call.pit.world" rel="noopener noreferrer"&gt;group.call.pit.world&lt;/a&gt;. Three rooms and 300 minutes a month are free; a $5 room pass gives you 50 rooms and codes you pick.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own agent:&lt;/strong&gt; an API, a CLI (&lt;code&gt;bunx @profullstack/groupcall&lt;/code&gt;), a TUI and an MCP server. Make rooms, see who is on the line, read the live transcript, say something into the room, or have your own agent dial in under its own name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop:&lt;/strong&gt; Mac, Windows and Linux builds, with the CLI inside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invites:&lt;/strong&gt; every account gets three single-use invite links. When someone signs in through yours, you both get an hour of calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;The phone engine is &lt;a href="https://github.com/profullstack/group-call" rel="noopener noreferrer"&gt;@profullstack/group-call&lt;/a&gt;, the same code that runs the &lt;a href="https://nixamp.com" rel="noopener noreferrer"&gt;nixamp&lt;/a&gt; party line. The site is &lt;a href="https://github.com/moshcoder/group.call" rel="noopener noreferrer"&gt;moshcoder/group.call&lt;/a&gt;. Credit codes and invites come from two new house modules, &lt;a href="https://github.com/profullstack/redeem-credits" rel="noopener noreferrer"&gt;@profullstack/redeem-credits&lt;/a&gt; and &lt;a href="https://github.com/profullstack/affiliates" rel="noopener noreferrer"&gt;@profullstack/affiliates&lt;/a&gt;, which are going onto every Profullstack site next.&lt;/p&gt;

&lt;p&gt;Call 510-616-9327 and say hi.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Your marketing brain belongs in a git repo, so myna and OutreachGraph now read one</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 26 Oct 2026 13:40:27 +0000</pubDate>
      <link>https://dev.to/chovy/your-marketing-brain-belongs-in-a-git-repo-so-myna-and-outreachgraph-now-read-one-3ef0</link>
      <guid>https://dev.to/chovy/your-marketing-brain-belongs-in-a-git-repo-so-myna-and-outreachgraph-now-read-one-3ef0</guid>
      <description>&lt;p&gt;Your marketing brain belongs in a git repo, so myna and OutreachGraph now read one&lt;/p&gt;

&lt;p&gt;Ina Toncheva wrote a piece this week called "Your marketing team will be on GitHub" (&lt;a href="https://inatoncheva.substack.com/p/your-marketing-team-will-be-on-github" rel="noopener noreferrer"&gt;https://inatoncheva.substack.com/p/your-marketing-team-will-be-on-github&lt;/a&gt;). The idea is simple and I think she is right. Your AI setup is not a pile of documents. It is a set of files that depend on each other. Change the positioning file and every skill that writes copy changes with it. Google Drive cannot tell you which edit made last week's posts sound off. Git can, and it can undo it in one step.&lt;/p&gt;

&lt;p&gt;The team she profiles keeps a "content brain" in a private repo: what the company does, positioning, audience, brand voice, and the questions prospects keep asking on sales calls. Skills sit on top. Someone improves a skill, pushes it, and the whole team has it. They report about 20 hours a week saved.&lt;/p&gt;

&lt;p&gt;I had the same knowledge scattered across two of my own tools, so I gave both of them the same repo layout:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brain/
  knowledge/
    positioning.md   what it is, who it is for, why it is different
    voice.md         how it sounds, what it never claims
    audience.md      who we sell to
    objections.md    what prospects push back on
  skills/            myna skill files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  myna 0.47.0: myna brain
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myna brain init ~/brain          # scaffold from your brand.md and skills, git init
myna brain link git@github.com:you/brain.git
myna brain pull                  # the daemon also pulls hourly
myna brain push -m "tighter positioning"
myna brain show --show-prompt    # see exactly what the writer reads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Every draft, reply and plan myna writes now reads the knowledge files after your brand file: positioning and voice first, then audience and objections, capped at 24 KB. The repo's skills fill in any skill you have not written locally. A file you edited by hand still wins. With no brain linked nothing changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  OutreachGraph 0.19.1: og brain
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;og brain list
og brain export &amp;lt;productId&amp;gt; --dir ~/brain
og brain import &amp;lt;productId&amp;gt; --dir ~/brain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Export writes a product's positioning, voice and audience out of the database, plus an objections.md built from the replies prospects actually sent. Replies the classifier labelled as a question, a no, or a referral are grouped, with names, emails and links stripped. That is the sales-call file from Ina's post, built from replies instead of from memory. Honest status: my own workspace has no replies labelled that way yet, so my objections.md is empty today. It fills as replies come in. Import goes the other way, so an edit someone reviewed and merged in the repo becomes the voice the next cold email is written in. The same calls are on the API (GET and PUT /api/v1/products/:id/brain) and MCP. npm i -g @profullstack/outreachgraph gets you the og CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop
&lt;/h2&gt;

&lt;p&gt;OutreachGraph learns what prospects object to. og brain export writes it down. You commit it, and a teammate reviews the diff. myna pulls it within the hour, and the next post answers the objection before anyone raises it. If a change makes the copy worse, git revert.&lt;/p&gt;

&lt;p&gt;Her getting-started advice is the right one: make a private repo and write one file, positioning. myna brain init does that part for you.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>marketing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Teach an agent by doing the task yourself (and why the liquid net lost)</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 26 Oct 2026 08:40:58 +0000</pubDate>
      <link>https://dev.to/chovy/teach-an-agent-by-doing-the-task-yourself-and-why-the-liquid-net-lost-1p3</link>
      <guid>https://dev.to/chovy/teach-an-agent-by-doing-the-task-yourself-and-why-the-liquid-net-lost-1p3</guid>
      <description>&lt;p&gt;We shipped "Teach an agent" in W3BS Training today. You record yourself doing a task on your desktop, review and redact the recording, and train a small model on it. Then the agent can suggest the next step, or do it with your approval.&lt;/p&gt;

&lt;p&gt;It ships in three pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infernet v0.1.66&lt;/strong&gt; adds the model engine. There is a new npm package, &lt;code&gt;@infernetprotocol/liquid-agent&lt;/code&gt;, and a Python runtime with three model types: CfC and LTC (the "liquid" neural nets) plus a plain GRU baseline. &lt;code&gt;infernet model train|evaluate|predict|serve&lt;/code&gt; drives it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;c0mpute v0.2.34&lt;/strong&gt; lets another machine on the network do the training for you. Only trusted workers you list, only with &lt;code&gt;--yes&lt;/code&gt;, and the trained weights are checked against the hash in the receipt. Sessions are encrypted end to end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;W3BS training-v0.3.0&lt;/strong&gt; adds the Teach tab and &lt;code&gt;w3bs training teach&lt;/code&gt;. Training runs locally by default. Sending it to a c0mpute worker is opt-in and shows you a preview first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Safety is the default
&lt;/h2&gt;

&lt;p&gt;On a fresh install all five permissions are off and every policy mode is Off. Secrets are masked at capture time, before anything is written. Every external write (sending an email, posting, messaging) needs a person to approve it, in every mode, including Bounded. There is a kill switch and an audit log.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest result
&lt;/h2&gt;

&lt;p&gt;I benchmarked on synthetic traces from mock email, Reddit and LinkedIn flows. The GRU beat the liquid CfC: 0.948 vs 0.869 episode success. So GRU stays the default. Every model failed on a screen layout it had not seen, and nothing passes the closed-loop safety gate yet, so the agent refuses to switch itself on. That is the design working.&lt;/p&gt;

&lt;p&gt;The next step is real recordings of real tasks, not synthetic ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Start at &lt;a href="https://w3bs.org/training" rel="noopener noreferrer"&gt;https://w3bs.org/training&lt;/a&gt; and open the Teach tab. Everything is off until you turn it on.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>Our P2P inference network had 4 of 48 nodes online. Here is why, and the fix</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Thu, 22 Oct 2026 12:04:34 +0000</pubDate>
      <link>https://dev.to/chovy/our-p2p-inference-network-had-4-of-48-nodes-online-here-is-why-and-the-fix-5f4o</link>
      <guid>https://dev.to/chovy/our-p2p-inference-network-had-4-of-48-nodes-online-here-is-why-and-the-fix-5f4o</guid>
      <description>&lt;p&gt;Infernet is a peer-to-peer GPU and CPU inference network: you run one command, your machine serves open models, and clients pay per job. This morning our status page said &lt;strong&gt;4 nodes online out of 48 registered&lt;/strong&gt;, and all 4 were ours.&lt;/p&gt;

&lt;p&gt;The other 40-odd were real people: Mac minis, Windows desktops, cloud VMs, one H20 box. They installed, served jobs (one served 243 of them over 52 days), and then went quiet and never came back. So we went looking for why.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was killing nodes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-update ended the process it was updating.&lt;/strong&gt; Under systemd, the daemon re-launched itself as a detached child and exited 0. Exit 0 ends the unit, and systemd's control-group kill takes the detached child with it. The node was gone until someone noticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing restarted a crashed node.&lt;/strong&gt; &lt;code&gt;infernet start&lt;/code&gt; detached one process with no supervisor. A crash, an OOM kill or a reboot was permanent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installs from git thought they were always out of date.&lt;/strong&gt; The repo's &lt;code&gt;package.json&lt;/code&gt; said 0.1.45 while npm was at 0.1.62, so those nodes reinstalled every 5 minutes, forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody was told.&lt;/strong&gt; No email, no status, nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changed (v0.1.62 to v0.1.64)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;infernet setup&lt;/code&gt; now installs a &lt;strong&gt;systemd user unit&lt;/strong&gt; on Linux (with linger, so it survives logout and reboot) or a &lt;strong&gt;launchd agent&lt;/strong&gt; on macOS.&lt;/li&gt;
&lt;li&gt;Without a service manager, &lt;code&gt;infernet start&lt;/code&gt; runs a small &lt;strong&gt;built-in supervisor&lt;/strong&gt; that restarts the daemon after a crash, with backoff.&lt;/li&gt;
&lt;li&gt;One exit-code contract everywhere: &lt;code&gt;0&lt;/code&gt; is a deliberate stop, &lt;code&gt;75&lt;/code&gt; means "restart me into the new version", anything else is a crash.&lt;/li&gt;
&lt;li&gt;Self-update checks that something newer actually landed before it restarts, and pauses for 6 hours if not.&lt;/li&gt;
&lt;li&gt;If your node is linked to an account and goes silent for 24 hours, you get &lt;strong&gt;one email&lt;/strong&gt; with the two commands that bring it back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Aggregators now do something
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;aggregator&lt;/code&gt; role used to just send heartbeats. Now an aggregator dials every advertised provider each minute, checks it answers as the node it claims to be, and reports reachability and round-trip time. The status page shows, per provider, how many aggregators reached it in the last hour. We run three (Buffalo, Buffalo, Vienna) and anyone can run one on a small box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;infernet init &lt;span class="nt"&gt;--role&lt;/span&gt; aggregator &lt;span class="nt"&gt;--name&lt;/span&gt; my-aggregator
infernet register
infernet setup &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On its first round it already caught a node advertising a port that belongs to something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  See who is on the network
&lt;/h2&gt;

&lt;p&gt;Every provider on &lt;a href="https://infernetprotocol.com/status" rel="noopener noreferrer"&gt;infernetprotocol.com/status&lt;/a&gt; now links to a details page: coarse location (city, country, network; never the IP), hardware, live load, measured tokens per second, models served, job counts and success rate, recent jobs (never prompt content), and aggregator verification. Operators can hide a node from Settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a node
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://infernetprotocol.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It now stays up on its own. If you ran one before and it died, re-running that line brings it back on the new code.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/InfernetProtocol/infernet-protocol" rel="noopener noreferrer"&gt;github.com/InfernetProtocol/infernet-protocol&lt;/a&gt; (PRs #51, #53, #54).&lt;/p&gt;

</description>
      <category>networking</category>
      <category>opensource</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>CoinPay checkout: one link, any coin or PayPal, and you always know who paid</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:45:46 +0000</pubDate>
      <link>https://dev.to/chovy/coinpay-checkout-one-link-any-coin-or-paypal-and-you-always-know-who-paid-48m6</link>
      <guid>https://dev.to/chovy/coinpay-checkout-one-link-any-coin-or-paypal-and-you-always-know-who-paid-48m6</guid>
      <description>&lt;h1&gt;
  
  
  CoinPay checkout: one link, any coin or PayPal, and you always know who paid
&lt;/h1&gt;

&lt;p&gt;Most crypto checkouts make you pick the chain before the buyer ever sees the page. If you picked BTC and your buyer holds USDC on Solana, they leave.&lt;/p&gt;

&lt;p&gt;CoinPay now has hosted checkout sessions. You create one with a single API call, send the buyer to the link, and they choose how to pay: every coin your business has a wallet for (BTC, ETH, SOL, USDC and USDT on several chains, DOGE, XRP and more) or PayPal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who paid, for what
&lt;/h2&gt;

&lt;p&gt;Every session requires the buyer's email and your own account id, and records which site the payment came from. When the payment confirms, your webhook gets all three back with the usual event. No more "who sent this 12 USDC?"&lt;/p&gt;

&lt;h2&gt;
  
  
  One call
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://coinpayportal.com/api/checkout/sessions
Authorization: Bearer &amp;lt;your business API key&amp;gt;

{ "amount": 9, "currency": "USD",
  "description": "Pro, one month",
  "customer_email": "buyer@example.com",
  "account_id": "user_123",
  "property": "example.com",
  "success_url": "https://example.com/thanks?session={CHECKOUT_SESSION_ID}",
  "cancel_url": "https://example.com/pricing" }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get back a &lt;code&gt;url&lt;/code&gt;. The buyer picks a coin or PayPal there, and can switch coins while the payment is still open. The SDK has it too: &lt;code&gt;createCheckoutSession()&lt;/code&gt; in &lt;code&gt;@profullstack/coinpay&lt;/code&gt; 0.25.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Already running
&lt;/h2&gt;

&lt;p&gt;We moved about 50 of our own sites to it this week: ugig, smshub, pairux, ThreatCrush, nixamp and the rest. We tested it end to end with real money on Base: the site had the purchase unlocked about 3 seconds after the transaction was mined.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://coinpayportal.com/docs#checkout-sessions" rel="noopener noreferrer"&gt;https://coinpayportal.com/docs#checkout-sessions&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
