<?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>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>
    <item>
      <title>Come post on our forums: the tsbb network is open</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:03:04 +0000</pubDate>
      <link>https://dev.to/chovy/come-post-on-our-forums-the-tsbb-network-is-open-2c52</link>
      <guid>https://dev.to/chovy/come-post-on-our-forums-the-tsbb-network-is-open-2c52</guid>
      <description>&lt;p&gt;We build a forum package called tsbb, a bulletin board written in TypeScript. It looks like the vBulletin boards a lot of us grew up on, and under the hood it is a modern web app with no build step. We run a handful of boards on it, and right now they have more topics than members. That is backwards, so this is an invitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boards
&lt;/h2&gt;

&lt;p&gt;All of them are listed, with live topic and post counts, at &lt;strong&gt;&lt;a href="https://tsbb.dev/boards" rel="noopener noreferrer"&gt;tsbb.dev/boards&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tsbb.dev" rel="noopener noreferrer"&gt;tsbb.dev&lt;/a&gt;&lt;/strong&gt;: the project's own board. Help, plugins, skins and what ships next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://bbs.hqtui.com" rel="noopener noreferrer"&gt;bbs.hqtui.com&lt;/a&gt;&lt;/strong&gt;: terminal UI talk, for people who build terminal UIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://c0upons.com/bbs" rel="noopener noreferrer"&gt;c0upons.com/bbs&lt;/a&gt;&lt;/strong&gt;: deals, coupon codes and freebies, posted by whoever found them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://w3bs.org/bbs" rel="noopener noreferrer"&gt;w3bs.org/bbs&lt;/a&gt;&lt;/strong&gt;: the W3BS community board.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Joining takes one field. Type your email, click the link we send, and you are in. There is no password to choose, and you can add a passkey afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a forum, in 2026
&lt;/h2&gt;

&lt;p&gt;Chat scrolls away. A thread on a board stays where you left it, has a URL, shows up in search and can be read by someone who arrives a year later. Every list on a tsbb board also has an RSS feed (each forum, each thread, each member, even a saved search), so you can follow a board from a feed reader without ever signing in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in tsbb
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No build step.&lt;/strong&gt; The whole thing runs as plain TypeScript on Node 24, which is what makes runtime plugins possible: drop a directory in and it loads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins&lt;/strong&gt; with filters, actions and slots, so a broken plugin cannot blank a page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No client script.&lt;/strong&gt; The board's CSP forbids inline script entirely; every page is complete as HTML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four ways in&lt;/strong&gt;: the web, a terminal client (&lt;code&gt;curl -fsSL https://tsbb.dev/install.sh | sh&lt;/code&gt; gets &lt;code&gt;tsbb&lt;/code&gt;, &lt;code&gt;tsbb-tui&lt;/code&gt; and &lt;code&gt;tsbb-mcp&lt;/code&gt;), a REST API and an MCP server for agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skins&lt;/strong&gt;, from a 2000s vBulletin look to a paper skin that sits inside an editorial site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIT licensed&lt;/strong&gt;, one Node process and a SQLite file (or Postgres).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run your own, and get listed
&lt;/h2&gt;

&lt;p&gt;Every tsbb board now has a &lt;code&gt;/boards&lt;/code&gt; page listing every other board in the network, so each one sends readers to the rest. If you run a board, open a pull request adding it to &lt;a href="https://github.com/profullstack/tsbb/blob/main/apps/server/src/boards.json" rel="noopener noreferrer"&gt;&lt;code&gt;apps/server/src/boards.json&lt;/code&gt;&lt;/a&gt; and it shows up on all of them. The list is also JSON at &lt;a href="https://tsbb.dev/api/v1/boards" rel="noopener noreferrer"&gt;tsbb.dev/api/v1/boards&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Come say hello. The first reply in any thread is yours.&lt;/p&gt;

</description>
      <category>community</category>
      <category>showdev</category>
      <category>typescript</category>
    </item>
    <item>
      <title>We want 100,000 c0mpute nodes. We have fewer than 10.</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:35:17 +0000</pubDate>
      <link>https://dev.to/chovy/we-want-100000-c0mpute-nodes-we-have-fewer-than-10-2bg2</link>
      <guid>https://dev.to/chovy/we-want-100000-c0mpute-nodes-we-have-fewer-than-10-2bg2</guid>
      <description>&lt;p&gt;c0mpute is the open compute network we have been building at Profullstack. Any machine can join it with one command, and once it is in, it serves AI inference, FFmpeg transcoding and storage jobs for whoever needs them. No account and no approval step, and you do not need to forward a port to join.&lt;/p&gt;

&lt;p&gt;The number we care about is 100,000 nodes. Pooled spare capacity at that size is enough to train and serve open-weight models in the open, on hardware owned by the people running it. Today the best models come from a few labs that own their own data centers. A volunteer network will not beat them next year, and I am not going to pretend it will. But it does not have to win on day one to be worth building. It has to get big enough to matter.&lt;/p&gt;

&lt;p&gt;Right now the live count is under 10 (7 this morning), and at least three of those are our own servers. That is the honest starting point, and the count is public at &lt;a href="https://c0mpute.com/nodes" rel="noopener noreferrer"&gt;c0mpute.com/nodes&lt;/a&gt;, so nobody has to take my word for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run one
&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://c0mpute.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That installs &lt;code&gt;c0mpute&lt;/code&gt;, plus &lt;code&gt;infernet&lt;/code&gt; for inference and &lt;code&gt;coinpay&lt;/code&gt; for payments, and starts the worker for you: a systemd service where it can, a background daemon where it can't. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;c0mpute worker status
c0mpute bench   &lt;span class="c"&gt;# one full run puts a score next to your node on the board&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs on Linux (x86_64 and arm64) and macOS, and on Windows inside WSL2. A GPU is detected and advertised if you have one, but it is not required. CPU nodes serve small models like qwen2.5:0.5b.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Paid inference goes through &lt;a href="https://infernetprotocol.com" rel="noopener noreferrer"&gt;Infernet&lt;/a&gt;, the inference plugin that ships with c0mpute. Clients pay through CoinPay in 16 coins or with PayPal, and you choose where your share lands with &lt;code&gt;infernet payout set &amp;lt;coin&amp;gt; &amp;lt;address&amp;gt;&lt;/code&gt;. Paid demand is early, so expect small and irregular earnings for now. I would rather say that than promise a number.&lt;/p&gt;

&lt;p&gt;You also get a spot on the board. And if you bring people, give them &lt;code&gt;https://c0mpute.com/r/&amp;lt;your-handle&amp;gt;&lt;/code&gt;: every node installed from that link shows your handle next to it. It is a scoreboard, not a payout.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I fixed while testing this
&lt;/h2&gt;

&lt;p&gt;Before writing this I ran the installer on a clean Ubuntu 24.04 container as a normal user, the way a stranger would. It took about two minutes, and it failed. The transcode step redirects &lt;code&gt;apt-get&lt;/code&gt; to &lt;code&gt;/dev/tty&lt;/code&gt; so sudo can prompt you, and with no terminal (ssh without -t, cloud-init, a container) that redirect fails before apt even runs. Because the installer runs under &lt;code&gt;set -e&lt;/code&gt; and that call was the last command in an &lt;code&gt;if&lt;/code&gt; body, the whole script exited with status 1 before it started the worker. So on exactly the kind of headless box that makes a good node, you got binaries and no node.&lt;/p&gt;

&lt;p&gt;Now the package manager only gets the terminal when there is one, and a missing ffmpeg only turns off transcode jobs instead of the install. The installer also serves as &lt;code&gt;text/x-shellscript&lt;/code&gt; now.&lt;/p&gt;

&lt;p&gt;The code is MIT and on &lt;a href="https://github.com/profullstack/c0mpute" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. If the installer breaks on your machine, open an issue with the output and I will fix it.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>selfhosted</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Free ads for indie sites while we launch</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 12:04:19 +0000</pubDate>
      <link>https://dev.to/chovy/free-ads-for-indie-sites-while-we-launch-4ci3</link>
      <guid>https://dev.to/chovy/free-ads-for-indie-sites-while-we-launch-4ci3</guid>
      <description>&lt;p&gt;We opened ad.network two days ago. It is a small ad network for indie sites, paid in crypto, and right now advertising on it costs nothing.&lt;/p&gt;

&lt;p&gt;Here is the honest state of it. The ads run on about two dozen of our own sites today (blogs, dev tools, a few directories). There are no outside publishers yet and no outside advertisers. That is the problem this post is trying to fix, so the offer is tilted hard in your favor.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want traffic
&lt;/h2&gt;

&lt;p&gt;Paste the page you want people to land on. That is the setup. ad.network reads the page and writes the ad for you: a headline, a line of text and a banner. No deposit, no card. Your ad starts running across the network the same day.&lt;/p&gt;

&lt;p&gt;Clicks are counted by crawlproof, which drops bots and repeat clicks before anything is counted. When paid ads open later, a click is about $0.20 and you never pay for views. Until then nothing is charged.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run a site
&lt;/h2&gt;

&lt;p&gt;Paste one tag before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;. It shows one small ad and counts visits. Add a USDC wallet (Polygon, Solana, Base or Ethereum) and you earn about 5 cents of every 20 cent paid click on your pages. Withdraw any time you have $5 or more. The money goes from crawlproof straight to your wallet. ad.network adds no fee.&lt;/p&gt;

&lt;p&gt;To be clear about the free period: free ads are free for the advertiser, so those clicks do not pay the publisher. You earn from paid clicks only. What you do get right away is the other half.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every publisher can advertise free
&lt;/h2&gt;

&lt;p&gt;If you put the tag on your site, you can also run an ad for that same site across the rest of the network, free. Small sites sending each other readers is the whole idea. It works better with more of you in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  For agents and terminals
&lt;/h2&gt;

&lt;p&gt;There is an API, a CLI and an MCP server:&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://ad.network.pit.world/install.sh | sh
adnetwork run https://your-site.example &lt;span class="nt"&gt;--daily&lt;/span&gt; 5
adnetwork site your-site.example

claude mcp add adnetwork &lt;span class="nt"&gt;--&lt;/span&gt; bunx @profullstack/adnetwork mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign in is through CoinPay. There is no separate account.&lt;/p&gt;

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

&lt;p&gt;Advertise: &lt;a href="https://ad.network.pit.world/advertise" rel="noopener noreferrer"&gt;https://ad.network.pit.world/advertise&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Publish: &lt;a href="https://ad.network.pit.world/publish" rel="noopener noreferrer"&gt;https://ad.network.pit.world/publish&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If something is confusing or broken, tell me. I would rather fix it this week while the network is small.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>indieweb</category>
      <category>crypto</category>
    </item>
    <item>
      <title>deadman.switch: so your crypto doesn't die with you</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 04:37:36 +0000</pubDate>
      <link>https://dev.to/chovy/deadmanswitch-so-your-crypto-doesnt-die-with-you-1f7</link>
      <guid>https://dev.to/chovy/deadmanswitch-so-your-crypto-doesnt-die-with-you-1f7</guid>
      <description>&lt;h1&gt;
  
  
  deadman.switch: so your crypto doesn't die with you
&lt;/h1&gt;

&lt;p&gt;Most people who hold crypto have the same quiet problem. The coins are safe because only they know where the keys are. That is also exactly why the coins are gone the day something happens to them. The family knows there was "some Bitcoin". Nobody knows there is a Ledger in the safe, or that the seed is split between a bank box and Mom's house, or which exchange the rest is on.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://deadman.switch.pit.world" rel="noopener noreferrer"&gt;deadman.switch&lt;/a&gt;.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Seal it.&lt;/strong&gt; Write down what your people would need: which wallets, where the hardware is, how the seed is stored, the exchange logins, who to call. Add files if you like. It is encrypted in your browser (PBKDF2 into AES-256-GCM) with a passphrase you choose. We store the locked box, never the key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give them the passphrase.&lt;/strong&gt; In your will, on paper in the safe, in person. You can leave a hint that only they will understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check in.&lt;/strong&gt; Every week, month or year we ask "still here?" by email and on your phone. One tap, and the clock starts again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you stop.&lt;/strong&gt; Three reminders spread across a grace period you pick, then, on the paid plan, a phone call. Only after all that, and at least a day after the last reminder, does each person you chose get their own link. They type the passphrase, and the bundle opens in their browser.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before it fires they have the key but no box. After it fires we have the box but still no key. There is nothing on our side for anyone to leak.&lt;/p&gt;

&lt;h2&gt;
  
  
  The details I cared about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Missing a check-in never fires anything at once. A server outage can't skip the warnings either: reminders are at least 12 hours apart, and the release waits a full day after the last one.&lt;/li&gt;
&lt;li&gt;Check-in links need a tap, so a mail scanner that opens links can't check in for you.&lt;/li&gt;
&lt;li&gt;If a paid plan lapses, your switches keep running. Protection never switches off because a renewal was missed.&lt;/li&gt;
&lt;li&gt;Going off-grid? Pause it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For the terminal and for agents
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bunx @profullstack/deadman status
bunx @profullstack/deadman checkin
bunx @profullstack/deadman seal &lt;span class="s2"&gt;"My crypto"&lt;/span&gt; note.md &lt;span class="nt"&gt;--hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"first dog, then the year"&lt;/span&gt;
claude mcp add deadman &lt;span class="nt"&gt;--&lt;/span&gt; bunx @profullstack/deadman mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a JSON API too. The MCP server can check in and manage switches, but sealing stays in your browser or the CLI, so an agent never touches the passphrase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price
&lt;/h2&gt;

&lt;p&gt;One switch for up to two people is free, forever. Keeper is $49 a year or $149 for life: ten switches, ten people each, 5 MB bundles (photos of seed cards, PDFs, key files), and the phone call on the last reminder. Paid in crypto through &lt;a href="https://coinpayportal.com" rel="noopener noreferrer"&gt;CoinPay&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The code is open: &lt;a href="https://github.com/moshcoder/deadman.switch" rel="noopener noreferrer"&gt;github.com/moshcoder/deadman.switch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Set one up: &lt;a href="https://deadman.switch.pit.world" rel="noopener noreferrer"&gt;deadman.switch.pit.world&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>privacy</category>
      <category>security</category>
      <category>web3</category>
    </item>
    <item>
      <title>Every pwamart app is now a PWA, CLI, API or MCP, and collections install in one command</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Mon, 19 Oct 2026 20:09:15 +0000</pubDate>
      <link>https://dev.to/chovy/every-pwamart-app-is-now-a-pwa-cli-api-or-mcp-and-collections-install-in-one-command-55m2</link>
      <guid>https://dev.to/chovy/every-pwamart-app-is-now-a-pwa-cli-api-or-mcp-and-collections-install-in-one-command-55m2</guid>
      <description>&lt;p&gt;pwamart.com started as an app store for PWAs. Most of the apps we list are more than a web page, though. Many ship a CLI, an HTTP API or an MCP server too, and an agent would rather use those than click through a browser.&lt;/p&gt;

&lt;p&gt;So every listing on pwamart now says which of the four it is: &lt;strong&gt;PWA&lt;/strong&gt;, &lt;strong&gt;CLI&lt;/strong&gt;, &lt;strong&gt;API&lt;/strong&gt;, &lt;strong&gt;MCP&lt;/strong&gt;. Each one it has comes with copy-paste instructions on the app page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt;: the publisher's own &lt;code&gt;curl -fsSL https://the.app/install.sh | sh&lt;/code&gt;. If the tool is in the &lt;a href="https://w3bs.org/packages" rel="noopener noreferrer"&gt;w3bs package catalog&lt;/a&gt;, you also get &lt;code&gt;w3bs install host/name&lt;/code&gt;, which keeps it current with &lt;code&gt;w3bs update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt;: a &lt;code&gt;claude mcp add --transport http …&lt;/code&gt; line, the &lt;code&gt;npx&lt;/code&gt; stdio command when there is one, and an &lt;code&gt;mcpServers&lt;/code&gt; block for Claude Desktop or Cursor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: the base URL and a link to the OpenAPI spec or llms.txt, so an agent can read the docs itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody fills in a form. Once a week the store looks at each app's own site for a shell script at &lt;code&gt;/install.sh&lt;/code&gt;, an MCP server that answers &lt;code&gt;initialize&lt;/code&gt; at &lt;code&gt;/mcp&lt;/code&gt; or &lt;code&gt;/api/mcp&lt;/code&gt; (or wherever its llms.txt says), and an OpenAPI file or documented &lt;code&gt;/api/&lt;/code&gt; routes. A 200 is not enough: an SPA answers every path with its HTML shell, so the script needs a &lt;code&gt;#!&lt;/code&gt; and the MCP server has to actually reply. Publishers can correct anything with &lt;code&gt;pwamart surfaces &amp;lt;slug&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The first sweep of 431 listings found 39 CLIs, 80 APIs and 51 MCP servers, and it is still going.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collections
&lt;/h2&gt;

&lt;p&gt;The other half is &lt;a href="https://pwamart.com/collections" rel="noopener noreferrer"&gt;collections&lt;/a&gt;, borrowed from bundl.run's idea of installing a whole workflow at once, but for agents instead of Mac apps. There are six workflows (agentic coding, agents that get paid, ops and security, growth, research, talking to humans), plus every MCP server, every CLI and every API.&lt;/p&gt;

&lt;p&gt;Each collection installs in one line:&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://pwamart.com/collections/agentic-coding/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That script runs each app's own installer in turn and keeps going if one fails. The same page gives you every MCP server as &lt;code&gt;claude mcp add&lt;/code&gt; lines or one &lt;code&gt;mcp.json&lt;/code&gt;, and an iPhone profile that adds every app to the home screen. Untick an app and the commands drop it.&lt;/p&gt;

&lt;p&gt;Agents get it too: &lt;code&gt;GET /api/v1/collections&lt;/code&gt;, the MCP tools &lt;code&gt;list_collections&lt;/code&gt; and &lt;code&gt;get_collection&lt;/code&gt;, and &lt;code&gt;pwamart collections&lt;/code&gt; in the CLI (0.7.0).&lt;/p&gt;

&lt;p&gt;If you have a PWA with a CLI or an MCP server, &lt;a href="https://pwamart.com/console/submit" rel="noopener noreferrer"&gt;list it free&lt;/a&gt; and it shows up in the right collection on its own.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>We built an affiliate program that tracks nobody</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Sun, 18 Oct 2026 14:40:47 +0000</pubDate>
      <link>https://dev.to/chovy/we-built-an-affiliate-program-that-tracks-nobody-2al7</link>
      <guid>https://dev.to/chovy/we-built-an-affiliate-program-that-tracks-nobody-2al7</guid>
      <description>&lt;p&gt;We built an affiliate program that tracks nobody. pit.world charges a $2/mo cover so you are not the product, and promoters keep 20% of everything their referrals spend across the network. Attribution is recorded only at signup, never per click, and no tracking cookie is set. Free 30-day trial. &lt;a href="https://pit.world/promote" rel="noopener noreferrer"&gt;https://pit.world/promote&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Þrøngva Radio: an AI band on the air all day, now with the words on screen</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Sat, 17 Oct 2026 21:05:48 +0000</pubDate>
      <link>https://dev.to/chovy/throngva-radio-an-ai-band-on-the-air-all-day-now-with-the-words-on-screen-5ed8</link>
      <guid>https://dev.to/chovy/throngva-radio-an-ai-band-on-the-air-all-day-now-with-the-words-on-screen-5ed8</guid>
      <description>&lt;h1&gt;
  
  
  Þrøngva Radio: an AI band on the air all day, now with the words on screen
&lt;/h1&gt;

&lt;p&gt;Þrøngva is a band we made. Every song was made with AI, and both albums now play around the clock on their own nixamp station:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://server1.chovy.nixamp.com:4321/station/rvhmw2dwv3?t=d0aTl-fRpO0BjPRRQ62wvA" rel="noopener noreferrer"&gt;Listen to Þrøngva Radio&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is one link. Open it in a browser and it plays. No account, no app.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;After the Winter of Want&lt;/strong&gt; (20 tracks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When the Ravens Lied&lt;/strong&gt; (12 tracks)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;32 songs, shuffled, at 192 kbps. Þrøngva started as the in-game band for our shooter nightcell7, and the station is where the music lives outside the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  New today: lyrics and cover art
&lt;/h2&gt;

&lt;p&gt;The station page now shows the words to the song that is playing, right under the player, and that song's cover art. Change of track, change of words. The lyrics come from the song file itself when it carries them, and otherwise from the nichedb.dev lyrics index.&lt;/p&gt;

&lt;p&gt;Try it on "Good as New": "Work, they say, is good for you. Resting keeps you good as new."&lt;/p&gt;

&lt;h2&gt;
  
  
  More stations like it
&lt;/h2&gt;

&lt;p&gt;Þrøngva Radio sits on the AI Radio dial at &lt;a href="https://live.streaming.pit.world/" rel="noopener noreferrer"&gt;live.streaming&lt;/a&gt;, next to Velocity Vibe and Meine Mutter, our other two AI bands. Every station on that dial plays AI-made music that we own.&lt;/p&gt;

&lt;p&gt;Want a station of your own? All it takes is a folder of music and &lt;a href="https://nixamp.com" rel="noopener noreferrer"&gt;nixamp&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>pay.agent: get paid in crypto with one link</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Sat, 17 Oct 2026 19:52:22 +0000</pubDate>
      <link>https://dev.to/chovy/payagent-get-paid-in-crypto-with-one-link-3pgo</link>
      <guid>https://dev.to/chovy/payagent-get-paid-in-crypto-with-one-link-3pgo</guid>
      <description>&lt;h1&gt;
  
  
  pay.agent: get paid in crypto with one link
&lt;/h1&gt;

&lt;p&gt;pay.agent gives you a link, &lt;code&gt;pay.agent/yourname&lt;/code&gt;, that anyone can pay in crypto. A person opens it, types an amount in dollars, picks a coin and scans a QR code. An agent does the same thing with one API call. The money goes to your own CoinPay wallet or CoinPay business. pay.agent never holds it.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://pay.agent.pit.world/" rel="noopener noreferrer"&gt;pay.agent.pit.world&lt;/a&gt;. On Moshpit DNS it is just &lt;a href="https://pay.agent" rel="noopener noreferrer"&gt;pay.agent&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up takes two choices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign in with CoinPay. No account yet? You make one on the way.&lt;/li&gt;
&lt;li&gt;Pick your name, and pick where money lands: your CoinPay wallet, or one of your CoinPay businesses.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole form. Behind it, pay.agent does the CoinPay side for you in one pass: it makes a small business to take your payments if you need one, adds the payout address you paste (if you have none yet), points the payment webhook at itself, and reads back which coins your link can take. You land on a page with your link, a QR code, and a list of exactly what it set up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paying someone
&lt;/h2&gt;

&lt;p&gt;Open their link, enter an amount, choose a coin (USDC on Solana, Polygon or Ethereum, USDT, BTC, ETH, SOL, and more), and send the exact amount shown to the address shown. The page turns green when CoinPay sees the payment. Each address is good for an hour.&lt;/p&gt;

&lt;p&gt;pay.agent adds no fee. CoinPay takes its normal fee when it forwards the payment, and the payer pays their own network fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for agents
&lt;/h2&gt;

&lt;p&gt;Every link is an API, and paying someone needs no key:&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;-X&lt;/span&gt; POST https://pay.agent.pit.world/api/v1/users/profullstack/payments &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"amount_usd": 5, "coin": "usdc_sol", "note": "thanks"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer is an address, an exact amount and an expiry. Poll &lt;code&gt;GET /api/v1/payments/:id&lt;/code&gt; until it says &lt;code&gt;confirmed&lt;/code&gt; or &lt;code&gt;forwarded&lt;/code&gt;. The same thing ships as a CLI and terminal UI (&lt;code&gt;bunx @profullstack/payagent profullstack 5 usdc_sol&lt;/code&gt;) and as an MCP server (&lt;code&gt;claude mcp add payagent -- bunx @profullstack/payagent mcp&lt;/code&gt;), so a coding agent can pay a person by name.&lt;/p&gt;

&lt;h2&gt;
  
  
  The onboarding is a package
&lt;/h2&gt;

&lt;p&gt;The one-pass setup is &lt;a href="https://github.com/profullstack/coinpay-onboard" rel="noopener noreferrer"&gt;@profullstack/coinpay-onboard&lt;/a&gt;. pay.agent is its first user, and every new site we launch runs it too: &lt;code&gt;coinpay-onboard site &amp;lt;name&amp;gt; --webhook &amp;lt;url&amp;gt;&lt;/code&gt; makes the site's CoinPay business, copies the payout wallets in, sets the webhook, and writes the keys into the site's vault. Taking payment is now part of launching, not a project after it.&lt;/p&gt;

&lt;p&gt;To make that possible, CoinPay's OAuth &lt;code&gt;merchant&lt;/code&gt; permission now covers adding payout addresses, importing them into a business and setting its webhook, so an app you sign in to can finish the setup instead of sending you to a dashboard. Routes that send money out stay dashboard-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;pay.agent is open source: &lt;a href="https://github.com/moshcoder/pay.agent" rel="noopener noreferrer"&gt;github.com/moshcoder/pay.agent&lt;/a&gt;. It is a Bun and Hono app with SQLite, and it is on the &lt;a href="https://pit.world/ring" rel="noopener noreferrer"&gt;Moshpit ring&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>payments</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>family.ancestry: a private, open-source family tree with a friends network built in</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:42:57 +0000</pubDate>
      <link>https://dev.to/chovy/familyancestry-a-private-open-source-family-tree-with-a-friends-network-built-in-5651</link>
      <guid>https://dev.to/chovy/familyancestry-a-private-open-source-family-tree-with-a-friends-network-built-in-5651</guid>
      <description>&lt;p&gt;I wanted somewhere to put my family's tree that wasn't a subscription and wasn't public. So I built family.ancestry. It's open source, it's free, and nobody sees a tree unless the owner invites them.&lt;/p&gt;

&lt;p&gt;It runs at &lt;a href="https://family.ancestry.pit.world" rel="noopener noreferrer"&gt;https://family.ancestry.pit.world&lt;/a&gt; (the native name, &lt;a href="https://family.ancestry" rel="noopener noreferrer"&gt;https://family.ancestry&lt;/a&gt;, resolves on the Moshpit network).&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Family trees.&lt;/strong&gt; People, parents, partners, children, siblings (full, half, adopted, foster, step), events, sources and photos. There's a pedigree chart, a descendants view, and "how are we related?" answered in words, like "your daughter's boyfriend" or "your second cousin once removed".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GEDCOM in and out.&lt;/strong&gt; Import the .ged file from Ancestry, FamilySearch or any other tree program. Export gives you everything back, and the privacy export leaves out living people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private by default.&lt;/strong&gt; There is no public tree setting. Someone who isn't in a tree gets a 404, so they can't even tell it exists. Invite people as viewers or editors. If you invite someone as a person in the tree, they manage their own profile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A network for people you actually know.&lt;/strong&gt; Every account has contacts sorted into family, friends, neighbors and business, with vCard import and export. On anyone's page in the tree you can add them to your network and send one email asking to connect. From your own page you can invite a friend. Messages only go between people who said yes or who share a tree. There are no public profiles, no follower counts and no "people you may know".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendations hand to hand.&lt;/strong&gt; Pass a plumber or a babysitter to one person you know. It lands in their inbox with a Save button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Family businesses, pets and a photo album.&lt;/strong&gt; Businesses get founders, owners and staff from the tree. Pets come with the one-time Family plan ($49 in crypto through CoinPay). Everything else is free.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Every surface
&lt;/h2&gt;

&lt;p&gt;There's the web app (a PWA), a JSON API, a CLI with a terminal UI, an MCP server so an assistant can work on your tree, and an Electron desktop app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; familyancestry
ancestry login
ancestry import ~/Downloads/family.ged
ancestry contact add &lt;span class="nt"&gt;--person&lt;/span&gt; &lt;span class="s2"&gt;"Aunt Rose"&lt;/span&gt; &lt;span class="nt"&gt;--email&lt;/span&gt; rose@example.com &lt;span class="nt"&gt;--connect&lt;/span&gt;
ancestry mcp    &lt;span class="c"&gt;# claude mcp add ancestry -- ancestry mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs on Bun, Hono and a single SQLite file, with the photos stored in the same file. Want to host your own? Run &lt;code&gt;ancestry serve&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/moshcoder/family.ancestry" rel="noopener noreferrer"&gt;https://github.com/moshcoder/family.ancestry&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
    <item>
      <title>seo.rank: a free SEO audit, and business listings anyone can claim on pit.world</title>
      <dc:creator>chovy</dc:creator>
      <pubDate>Sat, 17 Oct 2026 14:40:41 +0000</pubDate>
      <link>https://dev.to/chovy/seorank-a-free-seo-audit-and-business-listings-anyone-can-claim-on-pitworld-3pl2</link>
      <guid>https://dev.to/chovy/seorank-a-free-seo-audit-and-business-listings-anyone-can-claim-on-pitworld-3pl2</guid>
      <description>&lt;p&gt;Two launches today, and they fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  seo.rank
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/moshcoder/seo.rank" rel="noopener noreferrer"&gt;seo.rank&lt;/a&gt; audits one page for on-page SEO and tells you what to fix first. It checks about 25 things: title and meta description, headings, canonical, robots.txt and sitemap, noindex, HTTPS and HSTS, Open Graph and X cards, JSON-LD, hreflang, image alt text, internal links, response time and page weight. It also lists the words and phrases the page repeats most. You get a score out of 100, a grade, and a fix list sorted by impact.&lt;/p&gt;

&lt;p&gt;It is free for 10 audits a day per visitor and costs us almost nothing to run: no paid APIs, no headless Chrome, just a fetch and a parse. That is why the limit can stay free.&lt;/p&gt;

&lt;p&gt;Try it from any terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bunx seorank audit https://your-site.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is also a TUI (&lt;code&gt;seorank&lt;/code&gt;), a JSON API and an MCP server for your agents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add seorank &lt;span class="nt"&gt;--&lt;/span&gt; bunx seorank mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The web version lives at &lt;a href="https://seo.rank" rel="noopener noreferrer"&gt;https://seo.rank&lt;/a&gt;, a name on the Moshpit network. If your browser does not open it yet, &lt;a href="https://pit.world/connect" rel="noopener noreferrer"&gt;connect to Moshpit&lt;/a&gt; first. The CLI and MCP server find it on their own.&lt;/p&gt;

&lt;p&gt;seo.rank is MIT licensed. Read it, fork it, run your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business listings on pit.world
&lt;/h2&gt;

&lt;p&gt;Every website now has a listing on &lt;a href="https://pit.world" rel="noopener noreferrer"&gt;pit.world&lt;/a&gt;, the private search engine: &lt;code&gt;pit.world/b/your-domain.com&lt;/code&gt;. Until the owner claims it, it shows what the site's own homepage says about itself.&lt;/p&gt;

&lt;p&gt;Claiming takes a minute and needs no account:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your listing and press &lt;strong&gt;Claim this listing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add a DNS TXT record, or a meta tag on your homepage, with the code pit.world gives you.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Verify&lt;/strong&gt;. You get an edit key, shown once.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then write your listing yourself: what you do, hours, address, phone, links and your Moshpit name. When someone searches your domain on pit.world, your listing shows beside the results. Like the rest of pit.world: no cookies, no tracking, no email.&lt;/p&gt;

&lt;p&gt;From the terminal: &lt;code&gt;pit claim your-domain.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;seo.rank is the first claimed listing: &lt;a href="https://pit.world/b/seo.rank" rel="noopener noreferrer"&gt;pit.world/b/seo.rank&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build an app for $49
&lt;/h2&gt;

&lt;p&gt;While you are on pit.world: &lt;a href="https://pit.world/build" rel="noopener noreferrer"&gt;describe an app&lt;/a&gt; and an AI product team builds it on the open source Profullstack stack for $49, then keeps it online for $2 a month. Paid in crypto through CoinPay.&lt;/p&gt;

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