<?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: DatanestDigital</title>
    <description>The latest articles on DEV Community by DatanestDigital (@datanestdigital).</description>
    <link>https://dev.to/datanestdigital</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%2F3835307%2Fdb509a94-7063-4ef5-90da-159d2182eef6.png</url>
      <title>DEV Community: DatanestDigital</title>
      <link>https://dev.to/datanestdigital</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datanestdigital"/>
    <language>en</language>
    <item>
      <title>I Built a Multi-Chain Token Safety Scanner for $0/Month on Cloudflare Workers</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Sat, 22 Aug 2026 20:40:15 +0000</pubDate>
      <link>https://dev.to/datanestdigital/i-built-a-multi-chain-token-safety-scanner-for-0month-on-cloudflare-workers-3kjc</link>
      <guid>https://dev.to/datanestdigital/i-built-a-multi-chain-token-safety-scanner-for-0month-on-cloudflare-workers-3kjc</guid>
      <description>&lt;p&gt;TL;DR: &lt;a href="https://rugradar.datanest-stores.com" rel="noopener noreferrer"&gt;RugRadar&lt;/a&gt; scans tokens across Ethereum, BSC, Polygon, Arbitrum and Base for honeypots, mint authority, owner concentration and liquidity traps. It runs entirely on Cloudflare's free tier with Workers KV, no SQL database, no servers, zero monthly cost. Here is the architecture and the parts that surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture in one paragraph
&lt;/h2&gt;

&lt;p&gt;A single Worker serves static assets (&lt;code&gt;public/&lt;/code&gt;) and a JSON API (&lt;code&gt;/api/*&lt;/code&gt;). Risk telemetry comes from GoPlus's free token-security endpoint; scoring is local, pure, and unit-tested so every finding maps to a concrete contract behavior. KV stores licenses, invoices, scan cache (6h TTL), soft rate-limit counters and daily metrics. Payments run on two rails: Stripe Payment Links (card), and a fully self-custody USDC-on-Base flow where a cron poller watches public-RPC transfer logs and auto-issues license keys. No email anywhere: keys are delivered on-page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surprise #1: GoPlus returns HTTP 200 when it rate-limits you
&lt;/h2&gt;

&lt;p&gt;The failure mode that cost me the most debugging time: from Cloudflare's shared egress IPs, GoPlus sometimes answers &lt;code&gt;200 OK&lt;/code&gt; with body &lt;code&gt;{"code": 4029}&lt;/code&gt; — rate limited. If you check HTTP status only, everything "works" while every scan dies.&lt;/p&gt;

&lt;p&gt;Fixes that made it robust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retry once with jitter on &lt;code&gt;code: 4029&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stale-if-error&lt;/strong&gt;: serve the last stored report (flagged as stale in the UI) rather than failing&lt;/li&gt;
&lt;li&gt;versioned cache keys (&lt;code&gt;v2:&lt;/code&gt;) so schema changes invalidate cleanly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Surprise #2: workers.dev embeds your account name
&lt;/h2&gt;

&lt;p&gt;The default &lt;code&gt;*.workers.dev&lt;/code&gt; URL contains your &lt;em&gt;account-level&lt;/em&gt; subdomain. For a pseudonymous product that is an identity leak you cannot rename (the subdomain is set once per account). Solution: attach a custom domain to the Worker — free on any zone already in your account — and disable the workers.dev route.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surprise #3: You do not need D1
&lt;/h2&gt;

&lt;p&gt;KV gets dismissed for anything relational, but licenses map naturally to keys: &lt;code&gt;lic:&amp;lt;key&amp;gt;&lt;/code&gt; for records, &lt;code&gt;idx_stripe:&amp;lt;session&amp;gt;&lt;/code&gt; for idempotent fulfillment lookups, &lt;code&gt;inv:&amp;lt;id&amp;gt;&lt;/code&gt; for invoices. Rate limiting on KV is eventually consistent — useless for billing precision, perfectly fine for abuse ceilings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoring honestly
&lt;/h2&gt;

&lt;p&gt;Every finding maps to a mechanism (honeypot simulation, mint capability, top-LP concentration, modifiable taxes...). Unknowns &lt;em&gt;lower&lt;/em&gt; the score instead of being ignored — conservative by design. A clean renounced token scores ~80-100; a mintable token with single-wallet liquidity lands in DANGER territory regardless of how nice its chart looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Costs
&lt;/h2&gt;

&lt;p&gt;$0/month: Workers free tier (100k req/day), KV free tier, GoPlus free endpoint, Stripe has no fixed fee. The only non-zero thing ever spent was my time.&lt;/p&gt;

&lt;p&gt;If you want to poke at it: &lt;a href="https://rugradar.datanest-stores.com" rel="noopener noreferrer"&gt;rugradar.datanest-stores.com&lt;/a&gt;. Scan your favorite bag; disagree with the machine in the comments — the findings link their reasoning precisely so you can.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cloudflare</category>
      <category>showdev</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>How to Spot a Honeypot Token Before You Buy (2026 Field Guide)</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Sat, 22 Aug 2026 20:40:10 +0000</pubDate>
      <link>https://dev.to/datanestdigital/how-to-spot-a-honeypot-token-before-you-buy-2026-field-guide-3dn3</link>
      <guid>https://dev.to/datanestdigital/how-to-spot-a-honeypot-token-before-you-buy-2026-field-guide-3dn3</guid>
      <description>&lt;p&gt;Every week, someone loses savings to a token they could not sell. Not because they picked wrong on fundamentals — because the contract was designed so that selling was never possible.&lt;/p&gt;

&lt;p&gt;Here is the mechanics-first guide I wish those people had read at 1 a.m., plus the exact checks I run before any trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a honeypot actually is
&lt;/h2&gt;

&lt;p&gt;A honeypot is a smart contract that allows buys but blocks sells for everyone except privileged wallets. The buy button works. The chart goes up. The sell button fails with vague errors — or silently does nothing.&lt;/p&gt;

&lt;p&gt;The trick is caller inspection: &lt;code&gt;transfer&lt;/code&gt; behaves differently depending on &lt;em&gt;who&lt;/em&gt; calls it. Sellers revert or get taxed at 100%; the owner's wallets move freely. Modern versions hide this behind proxies and external calls, which is why reading bytecode rarely saves you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 60-second pre-buy checklist
&lt;/h2&gt;

&lt;p&gt;Run these five checks on &lt;em&gt;every&lt;/em&gt; new token, especially ones trending on social feeds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sell simulation.&lt;/strong&gt; Can an unrelated wallet actually sell? This single test kills most traps. Simulation beats code reading because obfuscated logic still has to behave one way or another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mint authority.&lt;/strong&gt; If the contract can mint unlimited supply, your position can be diluted to dust in one transaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner concentration.&lt;/strong&gt; An active owner holding double-digit percentages of supply — or hidden ownership — means every rule you read today can change tonight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liquidity control.&lt;/strong&gt; $2M of liquidity held by one wallet is more dangerous than $20k burned forever. Concentration answers "who can pull"; depth only answers slippage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tax mutability.&lt;/strong&gt; Buy/sell taxes that are owner-modifiable are levers waiting for maximum holder count. Per-wallet slippage modification is the precision instrument of targeted traps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three or more red flags together are a pattern, not noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why your wallet never warns you
&lt;/h2&gt;

&lt;p&gt;Wallets sign transactions; they do not simulate outcomes. Nothing in MetaMask distinguishes a tradable token from a trap. Social proof does not help either — on meme-heavy chains, social consensus is literally the product being sold to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;You can do all five checks manually against explorers, or automate them. I use &lt;a href="https://rugradar.datanest-stores.com" rel="noopener noreferrer"&gt;RugRadar&lt;/a&gt; — full disclosure, I built it — which runs the sell-simulation, mint/ownership, LP-concentration and tax-mutability checks across Ethereum, BSC, Polygon, Arbitrum and Base, and explains every finding in plain language instead of raw flags. The scanner is free; there is a paid tier for bulk/API use, which matters if you degen more than occasionally.&lt;/p&gt;

&lt;p&gt;Whatever tool you use, the discipline is the same: &lt;strong&gt;simulation first, concentration second, taxes third — before size goes on.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable summary
&lt;/h2&gt;

&lt;p&gt;Most rug victims were not unlucky; they skipped thirty seconds of checking under hype pressure. The market pays for speed, but it collects from people who confuse speed with diligence.&lt;/p&gt;

&lt;p&gt;Stay safe out there. Paste the address before you paste your seed phrase into regret.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is informational, not financial advice. Always do your own research.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>security</category>
      <category>blockchain</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I built a fake logistics company to stop myself buying things — how Out for Never works under the hood</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Fri, 21 Aug 2026 18:30:34 +0000</pubDate>
      <link>https://dev.to/datanestdigital/i-built-a-fake-logistics-company-to-stop-myself-buying-things-how-out-for-never-works-under-the-okb</link>
      <guid>https://dev.to/datanestdigital/i-built-a-fake-logistics-company-to-stop-myself-buying-things-how-out-for-never-works-under-the-okb</guid>
      <description>&lt;p&gt;A few weeks ago I shipped &lt;a href="https://outfornever.com" rel="noopener noreferrer"&gt;&lt;strong&gt;Out for Never&lt;/strong&gt;&lt;/a&gt;, a web app whose entire premise is: &lt;em&gt;what if the fun part of online shopping — the checkout, the tracking page, the "it's on the way" dopamine — existed without the spending?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You enter the thing you nearly bought, a price, how strong the urge was. You run a theatrical fake checkout. Then a fictional logistics network takes over and ships your imaginary parcel to nowhere, with courier lore, absurd incidents and manual reroutes along the way. You keep the money.&lt;/p&gt;

&lt;p&gt;This post is for the dev crowd: the small stories of it being fun, then the parts I actually had to think about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fun stories first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The pigeon that wouldn't stop.&lt;/strong&gt; One courier is Pip, of &lt;em&gt;Pigeon Express&lt;/em&gt; — "fast in a straight line, has never chosen one." You pick a courier when you create a parcel, and their pickup line, mood and bio all render on the tracking page. Watching a pigeon with 3,500+ documented courier failures carry your imaginary €89 headphones through Luxembourg is genuinely better than the real tracking page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reroutes are deterministic chaos.&lt;/strong&gt; Every parcel gets a &lt;code&gt;seed&lt;/code&gt;. Incidents, "nearby updates" and final delays are all picked from static arrays via a seeded PRNG — so a given parcel always tells the same story, but different parcels diverge. One of mine got &lt;em&gt;"Paused for a tiny parade — seven ducks and an admirably small brass band have priority."&lt;/em&gt; You can also manually reroute it to a parade, an extra moon orbit, or duck traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The friends who don't know it's a joke.&lt;/strong&gt; The paid tier sends a cinematic tracking journey with a real personal message at the end — &lt;em&gt;"For someone lovely"&lt;/em&gt;, custom reveal chapters, no address, nothing ships. Sending one is the most chaotic thing I've done all year.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering
&lt;/h2&gt;

&lt;p&gt;It's a &lt;strong&gt;framework-free SPA&lt;/strong&gt; (&lt;code&gt;index.html&lt;/code&gt; + &lt;code&gt;app.js&lt;/code&gt; + &lt;code&gt;styles.css&lt;/code&gt;, no build step) served by a &lt;strong&gt;Cloudflare Worker&lt;/strong&gt; (&lt;code&gt;src/worker.js&lt;/code&gt;) running as Pages advanced-mode. Around 4,400 lines total. Here are the bits worth stealing.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Every parcel is an AES-GCM sealed token
&lt;/h3&gt;

&lt;p&gt;A tracking link like &lt;code&gt;/track/&amp;lt;token&amp;gt;&lt;/code&gt; is a self-contained, encrypted parcel. There's no server-side parcel table — the token &lt;em&gt;is&lt;/em&gt; the parcel. The Worker seals it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// derive a purpose-scoped key from the master secret&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;digest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SHA-256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`out-for-never:v2:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;purpose&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AES-GCM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;encrypt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;decrypt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRandomValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// AAD binds the ciphertext to the version + purpose, so a token&lt;/span&gt;
&lt;span class="c1"&gt;// minted for one purpose can't be replayed against another&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;additionalData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`out-for-never:v2:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;purpose&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encrypted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AES-GCM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;iv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;additionalData&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;plaintext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// wire format: v2.&amp;lt;base64url(iv || ciphertext)&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The details that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose-separated keys&lt;/strong&gt; — &lt;code&gt;parcel&lt;/code&gt;, &lt;code&gt;stripe-draft&lt;/code&gt; and &lt;code&gt;membership&lt;/code&gt; tokens each derive a &lt;em&gt;different&lt;/em&gt; key from the same master secret. A gift token can't be replayed as a membership token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AAD as a poor-man's type system&lt;/strong&gt; — the version + purpose string is passed as AES-GCM &lt;em&gt;additional authenticated data&lt;/em&gt;, so even a ciphertext minted with the right key but the wrong purpose fails to authenticate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canonical base64url only&lt;/strong&gt; — on open, the decoder re-encodes the bytes and rejects the token if the string isn't canonical (&lt;code&gt;bytesToBase64Url(bytes) !== value&lt;/code&gt;). That kills the classic mutability-token bug where two encodings decode to the same payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounded input&lt;/strong&gt; — tokens must be 29–14,000 bytes; all user text is normalized and length-limited server-side; locked gift answers are stored only as a hash inside the token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote this deliberately, because the free tier has no accounts. The &lt;em&gt;link&lt;/em&gt; is the identity, so the link has to be unforgeable.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The logistics are deterministic, not random
&lt;/h3&gt;

&lt;p&gt;The client has static arrays — &lt;code&gt;COURIERS&lt;/code&gt;, &lt;code&gt;INCIDENTS&lt;/code&gt;, &lt;code&gt;NEARBY_UPDATES&lt;/code&gt;, &lt;code&gt;FINAL_DELAYS&lt;/code&gt;, &lt;code&gt;REROUTES&lt;/code&gt; — and picks from them with a seeded PRNG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;seededPick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;random&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;seededRandom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Progress itself is pure time math against two timestamps baked into the parcel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startsAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arrivesAt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startsAt&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SVG route, the courier marker, the timeline stages and the status text all derive from that one &lt;code&gt;0..1&lt;/code&gt; value. The ETA countdown never hits zero — it renders &lt;code&gt;NEVER&lt;/code&gt; at completion. Non-delivery is the only guaranteed delivery.&lt;/p&gt;

&lt;p&gt;This design buys you a lot for free: parcels are stateless (shareable, cacheable), the story is stable across reloads and recipients, and there's no progress row to store anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The voucher system lives in KV
&lt;/h3&gt;

&lt;p&gt;Since the whole thing is one Worker, discount codes are just KV records — no Stripe coupon API needed for the product's own promo flow. A voucher is &lt;code&gt;ofn:voucher:&amp;lt;CODE&amp;gt;&lt;/code&gt; in the &lt;code&gt;OUT_FOR_NEVER_KV&lt;/code&gt; namespace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"percentOff"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxUses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"uses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Worker validates (&lt;code&gt;percentOff&lt;/code&gt; 0–100, &lt;code&gt;uses &amp;lt; maxUses&lt;/code&gt;, not expired), applies it to the computed price, and bumps &lt;code&gt;uses&lt;/code&gt; when the order actually confirms. A &lt;code&gt;scripts/voucher.mjs&lt;/code&gt; CLI creates, lists and deletes them against the Cloudflare API. Fun side effect: a 100%-off voucher is how you test the paid flow without touching real money — the Worker detects &lt;code&gt;totalCents &amp;lt;= 0&lt;/code&gt; and issues the gift directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The vault is aggressively local
&lt;/h3&gt;

&lt;p&gt;Every avoided purchase lands in a &lt;code&gt;localStorage&lt;/code&gt; vault — money kept per currency, streaks, a 28-day heatmap, category charts, CSV/JSON export. No account, no analytics, nothing phones home. That was a product decision as much as a technical one: a "spend less" tool that tracks you would be a joke at its own expense.&lt;/p&gt;

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

&lt;p&gt;The core ritual is free, no signup, no card. Build a fictional parcel, pick a courier, and watch it get lost somewhere south of reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For dev.to readers:&lt;/strong&gt; the launch voucher &lt;code&gt;DEVTOFOREVER&lt;/code&gt; gives &lt;strong&gt;50% off&lt;/strong&gt; any premium fictional gift (the shareable tracking story you send to someone). 25 redemptions, drop it in the &lt;em&gt;Voucher code&lt;/em&gt; field on the Send page.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://outfornever.com" rel="noopener noreferrer"&gt;outfornever.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if you send one to someone who also doesn't need a fourth pair of headphones — that's the whole point.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>security</category>
    </item>
    <item>
      <title>Out for Never — we built an anti-commerce app that helps you buy less</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Mon, 17 Aug 2026 12:35:00 +0000</pubDate>
      <link>https://dev.to/datanestdigital/out-for-never-we-built-an-anti-commerce-app-that-helps-you-buy-less-2bga</link>
      <guid>https://dev.to/datanestdigital/out-for-never-we-built-an-anti-commerce-app-that-helps-you-buy-less-2bga</guid>
      <description>&lt;p&gt;There is a whole class of purchases you make not because you need them, but because the moment of buying feels good. The checkout rush. The "it's on the way" dopamine. The tiny progress bar marching toward the shipping confirmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Out for Never&lt;/strong&gt; is the app I built to break that loop — and instead of a savings app that nags you, it gives you the &lt;em&gt;whole buying experience without the buying&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;You type in the thing you almost bought: the gadget, the impulse Amazon cart, the thing in your size at 2am. Pick a price, a category, how strong the temptation was.&lt;/p&gt;

&lt;p&gt;Then you place the order. Theatrically.&lt;/p&gt;

&lt;p&gt;Instead of a real charge, a completely fictional logistics network kicks in. Your "parcel" gets a tracking number. A courier picks it up. It travels across a route that doesn't exist, hits absurd incidents, gets manually rerouted, and eventually — beautifully — is never delivered.&lt;/p&gt;

&lt;p&gt;You keep the real money. The parcel goes nowhere. And somehow that scratch is &lt;em&gt;itched&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Every avoided purchase is recorded in a local vault: money kept, streaks, temptation intensity, a 28-day heatmap, categories, savings goals, even a CSV export and JSON backup. All in your browser's &lt;code&gt;localStorage&lt;/code&gt;. No account, no tracking, nothing leaves your device.&lt;/p&gt;

&lt;p&gt;You can also quarantine a temptation for 1–30 days instead of deciding right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it (it's free)
&lt;/h2&gt;

&lt;p&gt;The core intervention is completely free — no signup, no card. Go to &lt;strong&gt;&lt;a href="https://outfornever.com" rel="noopener noreferrer"&gt;outfornever.com&lt;/a&gt;&lt;/strong&gt;, run through your first fake order, and watch your parcel get lost somewhere south of reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The voucher for dev.to readers
&lt;/h2&gt;

&lt;p&gt;Because I'd rather you gift the experience than buy more stuff, there's a &lt;strong&gt;launch voucher&lt;/strong&gt; for the premium fictional gifts (a cinematic reveal story you can send to someone):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;DEVTOFOREVER&lt;/code&gt;&lt;/strong&gt; — &lt;strong&gt;50% off&lt;/strong&gt; any premium gift, valid for the first &lt;strong&gt;25 redemptions&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Drop it into the &lt;em&gt;Voucher code&lt;/em&gt; field on the Send page. It applies to the Spark, Cinematic and Grand Gesture tiers — no physical item is ever shipped, because nothing is shipped, because nothing exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  A weird but real behaviour change
&lt;/h2&gt;

&lt;p&gt;The product is deliberately absurd. But the mechanism is real: a lot of impulse buying is about the &lt;em&gt;anticipation&lt;/em&gt;, not the object. Giving that anticipation a fictional outlet — with courier lore and "ESTIMATED NON-ARRIVAL" countdowns — is, frankly, better entertainment than the real parcel will ever be.&lt;/p&gt;

&lt;p&gt;It's a Cloudflare Worker + a framework-free SPA, one of those "why not build the joke" weekend projects that refused to stay a joke.&lt;/p&gt;

&lt;p&gt;If you try it, send a fictional gift to someone who also needs to not buy a fourth pair of headphones. Use the code, keep the streak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://outfornever.com" rel="noopener noreferrer"&gt;Try Out for Never →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AgentStack MCP: one deterministic reasoning stack for AI agents (simulate + decide + compute)</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Tue, 11 Aug 2026 12:30:22 +0000</pubDate>
      <link>https://dev.to/datanestdigital/agentstack-mcp-one-deterministic-reasoning-stack-for-ai-agents-simulate-decide-compute-597p</link>
      <guid>https://dev.to/datanestdigital/agentstack-mcp-one-deterministic-reasoning-stack-for-ai-agents-simulate-decide-compute-597p</guid>
      <description>&lt;p&gt;&lt;em&gt;The fourth in a suite of deterministic MCP servers for AI agents — and the one that ties the first three together.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Over the last stretch I shipped three focused, deterministic MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://scenariosim-mcp.pages.dev" rel="noopener noreferrer"&gt;&lt;strong&gt;ScenarioSim&lt;/strong&gt;&lt;/a&gt; — what-if / scenario simulation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://decisionmatrix-mcp.pages.dev" rel="noopener noreferrer"&gt;&lt;strong&gt;DecisionMatrix&lt;/strong&gt;&lt;/a&gt; — multi-criteria decision analysis&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://precisioncalc-mcp.pages.dev" rel="noopener noreferrer"&gt;&lt;strong&gt;PrecisionCalc&lt;/strong&gt;&lt;/a&gt; — exact finance / business math&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're great on their own, but agents kept needing all three in the same task — and installing three servers, juggling three keys, and hand-gluing their outputs is friction. So here's &lt;strong&gt;AgentStack MCP&lt;/strong&gt;: one endpoint, one key, all three — plus composite tools that chain them.&lt;/p&gt;

&lt;h2&gt;
  
  
  simulate → decide → compute
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"agentstack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agentstack-mcp.pages.dev/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free tier: no key, 20 calls/day. The tools are namespaced so an agent always knows which engine it's calling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sim_*&lt;/code&gt; — ScenarioSim (run, sensitivity, break-even, compare, templates)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decide_*&lt;/code&gt; — DecisionMatrix (decide, score, sensitivity, compare_two, methods)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;calc_*&lt;/code&gt; — PrecisionCalc (metrics, currency, NPV, IRR, loan, depreciation, …)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The part that's actually new: composite tools
&lt;/h2&gt;

&lt;p&gt;These chain the engines to do reasoning &lt;strong&gt;no single server can&lt;/strong&gt;, deterministically end-to-end:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;evaluate_options_with_scenarios&lt;/code&gt;&lt;/strong&gt; (simulate → decide) — project each option as its own scenario, then rank the &lt;em&gt;outcomes&lt;/em&gt; against weighted criteria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evaluate_options_with_scenarios"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"saas_growth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"horizon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Aggressive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"new_customers_per_period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"churn_rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lean"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"new_customers_per_period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"churn_rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"metric"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ending_mrr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"benefit"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"metric"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"total_churned_customers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cost"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;plan_to_valuation&lt;/code&gt;&lt;/strong&gt; (simulate → compute) — project a plan, then value its cash-flow line: NPV, IRR, undiscounted total.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;stress_test_decision&lt;/code&gt;&lt;/strong&gt; (simulate × decide) — stress one scenario assumption across every option and report how often the chosen option survives (robustness) and where it flips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fighting tool bloat with profiles
&lt;/h2&gt;

&lt;p&gt;Bundling 24 tools risks drowning an agent's tool-selection. So the endpoint takes a &lt;code&gt;?profile=&lt;/code&gt; filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://agentstack-mcp.pages.dev/mcp?profile=finance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;finance&lt;/code&gt; → &lt;code&gt;calc_*&lt;/code&gt; + &lt;code&gt;plan_to_valuation&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decision&lt;/code&gt; → &lt;code&gt;decide_*&lt;/code&gt; + the two decision composites&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;simulation&lt;/code&gt; → &lt;code&gt;sim_*&lt;/code&gt; + all composites&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;all&lt;/code&gt; (default) → everything&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why it's built this way
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic&lt;/strong&gt;: everything runs through decimal.js at 40-digit precision. Same inputs → byte-identical output, across all three engines and the composites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No proxying&lt;/strong&gt;: AgentStack imports the &lt;em&gt;same&lt;/em&gt; engines directly, so there's zero added latency and no cascading failure — not three network hops behind one URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additive, not a replacement&lt;/strong&gt;: the three standalone servers keep running for single-domain use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One key, one quota&lt;/strong&gt;: ~half the price of subscribing to the three separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless + MIT&lt;/strong&gt;: self-host on Cloudflare Pages, Node, Deno, or Bun.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live endpoint:&lt;/strong&gt; &lt;a href="https://agentstack-mcp.pages.dev/mcp" rel="noopener noreferrer"&gt;https://agentstack-mcp.pages.dev/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site + docs:&lt;/strong&gt; &lt;a href="https://agentstack-mcp.pages.dev" rel="noopener noreferrer"&gt;https://agentstack-mcp.pages.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub (MIT):&lt;/strong&gt; &lt;a href="https://github.com/inity13/agentstack-mcp" rel="noopener noreferrer"&gt;https://github.com/inity13/agentstack-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Registry:&lt;/strong&gt; &lt;code&gt;io.github.inity13/agentstack-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agents plan, choose, and do the numbers, give them one calculator that does all three — and never drifts. Feedback welcome.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>ScenarioSim MCP: a deterministic what-if &amp; scenario simulation engine for AI agents</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Tue, 11 Aug 2026 11:11:13 +0000</pubDate>
      <link>https://dev.to/datanestdigital/scenariosim-mcp-a-deterministic-what-if-scenario-simulation-engine-for-ai-agents-3dle</link>
      <guid>https://dev.to/datanestdigital/scenariosim-mcp-a-deterministic-what-if-scenario-simulation-engine-for-ai-agents-3dle</guid>
      <description>&lt;p&gt;&lt;em&gt;The third in a suite of deterministic MCP servers for AI agents — after &lt;a href="https://precisioncalc-mcp.pages.dev" rel="noopener noreferrer"&gt;PrecisionCalc MCP&lt;/a&gt; (high-precision finance math) and &lt;a href="https://decisionmatrix-mcp.pages.dev" rel="noopener noreferrer"&gt;DecisionMatrix MCP&lt;/a&gt; (multi-criteria decision analysis).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Ask an LLM to "project 12 months of SaaS growth at 3% churn" and it will happily produce a table of numbers. Ask it twice and you'll get two different tables. Compounding, churn, elasticity, break-even — these are exactly the kind of multi-period arithmetic that language models drift on, and they can't show their work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ScenarioSim MCP&lt;/strong&gt; offloads that to an exact, explainable engine. Your agent hands over assumptions; it gets back projections over time, sensitivity analysis, and break-even solving — every number computed with 40-digit decimal precision, so identical inputs always produce &lt;strong&gt;byte-identical output&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect (free, no install)
&lt;/h2&gt;

&lt;p&gt;It runs as a remote MCP server on Cloudflare's edge over Streamable HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scenariosim"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://scenariosim-mcp.pages.dev/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free tier is 20 calls/day with no API key. Works in Cursor, Claude Desktop (via &lt;code&gt;mcp-remote&lt;/code&gt;), VS Code, Windsurf, and any Streamable-HTTP client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;run_scenario&lt;/code&gt;&lt;/strong&gt; — the main tool: project a template or a free-form model over time → per-period projections, headline key results, the exact assumptions used, methodology, and a plain-language explanation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sensitivity_analysis&lt;/code&gt;&lt;/strong&gt; — vary one or more inputs and see the impact on a target metric, with an elasticity estimate and a "most influential" ranking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;break_even&lt;/code&gt;&lt;/strong&gt; — solve for the input value that makes a metric hit a target (deterministic bisection).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;compare_scenarios&lt;/code&gt;&lt;/strong&gt; — run 2–3 scenarios side by side with deltas and an optional winner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;list_templates&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;health_check&lt;/code&gt;&lt;/strong&gt; — discovery + status.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Nine templates (plus a free-form model)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;saas_growth&lt;/code&gt;, &lt;code&gt;pricing_change&lt;/code&gt;, &lt;code&gt;churn_impact&lt;/code&gt;, &lt;code&gt;cost_reduction&lt;/code&gt;, &lt;code&gt;hiring_plan&lt;/code&gt;, &lt;code&gt;cash_runway&lt;/code&gt;, &lt;code&gt;unit_economics&lt;/code&gt;, &lt;code&gt;marketing_funnel&lt;/code&gt;, &lt;code&gt;compound_growth&lt;/code&gt; — or bring your own &lt;code&gt;metrics&lt;/code&gt; array for anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: solve for the churn you can tolerate
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"break_even"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"churn_impact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"starting_customers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"new_customers_per_period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"solve_for"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"churn_rate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"target_metric"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"retention_pct"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target_value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"horizon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;"To reach retention_pct = 0.9, 'churn_rate' must be 0.008742 (a change of -0.041258 from the baseline 0.05)."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Roughly 0.87%/month churn to keep 90% of customers over a year — solved exactly, with the residual reported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why deterministic matters for agents
&lt;/h2&gt;

&lt;p&gt;Every response is one consistent JSON envelope — &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;key_results&lt;/code&gt;, &lt;code&gt;projections&lt;/code&gt;, &lt;code&gt;assumptions_used&lt;/code&gt;, &lt;code&gt;methodology&lt;/code&gt;, &lt;code&gt;notes&lt;/code&gt;, &lt;code&gt;explanation&lt;/code&gt; — and errors come back as structured, actionable data (&lt;code&gt;{type, message, hint}&lt;/code&gt;), never raw exceptions. That's what lets an agent &lt;em&gt;reliably parse and act on&lt;/em&gt; the result instead of re-reading a prose paragraph.&lt;/p&gt;

&lt;p&gt;The engine is pure and stateless: no database, no sessions, no clocks, no randomness. Self-host it on Cloudflare Pages, Node, Deno, or Bun in one command.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live endpoint:&lt;/strong&gt; &lt;a href="https://scenariosim-mcp.pages.dev/mcp" rel="noopener noreferrer"&gt;https://scenariosim-mcp.pages.dev/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site + docs:&lt;/strong&gt; &lt;a href="https://scenariosim-mcp.pages.dev" rel="noopener noreferrer"&gt;https://scenariosim-mcp.pages.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub (MIT):&lt;/strong&gt; &lt;a href="https://github.com/inity13/scenariosim-mcp" rel="noopener noreferrer"&gt;https://github.com/inity13/scenariosim-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Registry:&lt;/strong&gt; &lt;code&gt;io.github.inity13/scenariosim-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agents make plans, give them a calculator that never drifts. Feedback welcome.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>DecisionMatrix MCP: give your AI agent a transparent, deterministic decision engine</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:34:33 +0000</pubDate>
      <link>https://dev.to/datanestdigital/decisionmatrix-mcp-give-your-ai-agent-a-transparent-deterministic-decision-engine-imh</link>
      <guid>https://dev.to/datanestdigital/decisionmatrix-mcp-give-your-ai-agent-a-transparent-deterministic-decision-engine-imh</guid>
      <description>&lt;p&gt;Ask an AI agent to pick between three vendors, or a database, or a job offer, and it will happily give you an answer. Ask it to &lt;em&gt;weigh five options against six weighted criteria&lt;/em&gt; and it quietly falls apart: inconsistent weights, arithmetic that drifts, and no way to see how it got there. "Decision-making" is exactly the kind of multi-step scoring LLMs are bad at — and exactly the kind of thing you don't want a black box for.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;DecisionMatrix MCP&lt;/strong&gt; — a deterministic &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; server that turns "which option is best?" into a transparent, reproducible calculation. You give it options and weighted criteria plus a score matrix; it returns a &lt;strong&gt;scored, ranked, and explained&lt;/strong&gt; result: the winner, the full ranking, per-criterion breakdowns, the method used, the weights applied, and a plain-language explanation. Every number runs through &lt;code&gt;decimal.js&lt;/code&gt; (&lt;strong&gt;never floats&lt;/strong&gt;), so identical inputs always produce identical output.&lt;/p&gt;

&lt;p&gt;It's live, free to start, and takes ~30 seconds to add.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add it to your agent
&lt;/h2&gt;

&lt;p&gt;Remote server over Streamable HTTP — no install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://decisionmatrix-mcp.pages.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generic client (Cursor, etc.):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decisionmatrix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://decisionmatrix-mcp.pages.dev/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Desktop (via the &lt;code&gt;mcp-remote&lt;/code&gt; bridge):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decisionmatrix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://decisionmatrix-mcp.pages.dev/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listed in the official MCP Registry as &lt;code&gt;io.github.inity13/decisionmatrix-mcp&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Six tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;create_decision&lt;/strong&gt; — the main one: rank options against weighted criteria, return the winner + full ranking + per-criterion breakdown + explanation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;score_options&lt;/strong&gt; — the normalized scored matrix and ranking, without the narrative&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sensitivity_analysis&lt;/strong&gt; — how robust is the winner? Sweeps each criterion's weight ±20% and tells you which criteria could flip the result, and at what weight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;compare_two&lt;/strong&gt; — head-to-head of two options with a per-criterion breakdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;list_methods&lt;/strong&gt; / &lt;strong&gt;health_check&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three scoring methods: &lt;strong&gt;weighted_sum&lt;/strong&gt;, &lt;strong&gt;weighted_product&lt;/strong&gt;, and &lt;strong&gt;TOPSIS&lt;/strong&gt; (distance to the ideal/anti-ideal solution). Criteria can be &lt;code&gt;benefit&lt;/code&gt; (higher is better) or &lt;code&gt;cost&lt;/code&gt; (lower is better).&lt;/p&gt;

&lt;h2&gt;
  
  
  What a call looks like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;create_decision&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MongoDB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DynamoDB"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cost"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scalability"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"team_familiarity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scores"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Postgres"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scalability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"team_familiarity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"MongoDB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scalability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"team_familiarity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DynamoDB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scalability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"team_familiarity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get back the winner, a ranked list with exact scores, a per-criterion breakdown showing where each option gained or lost, the weights used, and a sentence explaining &lt;em&gt;why&lt;/em&gt;. Change a weight and the result changes predictably — and you can prove it with &lt;code&gt;sensitivity_analysis&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why deterministic matters
&lt;/h2&gt;

&lt;p&gt;The whole point of offloading a decision to a tool is trust. DecisionMatrix is &lt;strong&gt;stateless&lt;/strong&gt; (no database, no sessions) and &lt;strong&gt;byte-for-byte reproducible&lt;/strong&gt;. The hosted endpoint is a Cloudflare Pages Function; the same engine also runs as a local stdio server you can self-host with a one-line Docker build. MIT licensed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt; — 15 calls/day, no key needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starter — $12/mo&lt;/strong&gt; — 5,000 calls/day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro — $39/mo&lt;/strong&gt; — 50,000 calls/day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an agent hits the free limit, the tool returns a structured error with the checkout URL, so an autonomous agent can surface the paywall and the user is two clicks from a key. Prefer to self-host? It's open source with a Dockerfile — run it with unlimited calls and your own keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Site + docs: &lt;a href="https://decisionmatrix-mcp.pages.dev" rel="noopener noreferrer"&gt;https://decisionmatrix-mcp.pages.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub (MIT): &lt;a href="https://github.com/inity13/decisionmatrix-mcp" rel="noopener noreferrer"&gt;https://github.com/inity13/decisionmatrix-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📇 &lt;code&gt;llms.txt&lt;/code&gt;: &lt;a href="https://decisionmatrix-mcp.pages.dev/llms.txt" rel="noopener noreferrer"&gt;https://decisionmatrix-mcp.pages.dev/llms.txt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agents make choices — vendor selection, architecture, prioritization, hiring — give it a try. I'm considering adding AHP (with a consistency ratio) and Pareto/efficiency-frontier tools next; tell me what you'd want.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built an MCP server that gives AI agents exact, high-precision finance math</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:13:46 +0000</pubDate>
      <link>https://dev.to/datanestdigital/i-built-an-mcp-server-that-gives-ai-agents-exact-high-precision-finance-math-40pl</link>
      <guid>https://dev.to/datanestdigital/i-built-an-mcp-server-that-gives-ai-agents-exact-high-precision-finance-math-40pl</guid>
      <description>&lt;p&gt;LLMs are shockingly bad at arithmetic. Ask an agent to chain a CAC payback with a churn-adjusted LTV, convert it to EUR, and discount three years of cash flows, and you will get an answer that &lt;em&gt;looks&lt;/em&gt; right and is quietly wrong. Floating point, dropped steps, and confident hallucination are a bad combination when the output is a number someone makes a decision on.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;PrecisionCalc MCP&lt;/strong&gt; — a deterministic &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; server that gives AI agents a calculator they can actually trust. Every monetary/financial value is computed with arbitrary-precision decimals (&lt;strong&gt;never floats&lt;/strong&gt;), and every response includes the exact value, the &lt;strong&gt;formula used&lt;/strong&gt;, the &lt;strong&gt;inputs&lt;/strong&gt;, the unit, and any assumptions — so the agent (and you) can audit it.&lt;/p&gt;

&lt;p&gt;It's live, free to start, and takes about 30 seconds to add.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add it to your agent
&lt;/h2&gt;

&lt;p&gt;It's a remote server over Streamable HTTP — no install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://precisioncalc-mcp.pages.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;) or any generic client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"precisioncalc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://precisioncalc-mcp.pages.dev/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Claude Desktop&lt;/strong&gt; (uses the &lt;code&gt;mcp-remote&lt;/code&gt; bridge):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"precisioncalc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://precisioncalc-mcp.pages.dev/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also works with VS Code, Windsurf, Cline, Zed, and anything speaking MCP. It's listed in the official MCP Registry as &lt;code&gt;io.github.inity13/precisioncalc-mcp&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;11 tools, all returning the same clean, parseable envelope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;calculate_metric&lt;/strong&gt; — 14 SaaS/business metrics: LTV, CAC, LTV:CAC, payback, gross margin, churn, MRR growth, ARR, break-even units, NRR, GRR, Rule of 40, magic number&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;currency_convert&lt;/strong&gt; — 9 major currencies, live + historical ECB rates (with an offline fallback)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;business_days&lt;/strong&gt; — add/count/next/previous business days with US/UK/EU holidays + custom holidays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;compound_growth&lt;/strong&gt; — future value, present value, CAGR (7 compounding frequencies incl. continuous)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;net_present_value&lt;/strong&gt; / &lt;strong&gt;internal_rate_of_return&lt;/strong&gt; — NPV/DCF and IRR (Newton + bisection)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;loan_amortization&lt;/strong&gt; — payment, total interest, payoff, full schedule&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;depreciation&lt;/strong&gt; — straight-line, declining-balance, sum-of-years-digits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;batch_calculate&lt;/strong&gt;, &lt;strong&gt;list_metrics&lt;/strong&gt;, &lt;strong&gt;health_check&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why it's trustworthy
&lt;/h2&gt;

&lt;p&gt;A call to &lt;code&gt;net_present_value&lt;/code&gt; with &lt;code&gt;rate=0.10, cashflows=[-10000, 3000, 4200, 6800]&lt;/code&gt; returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1307.2877535687..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formatted_value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$1,307.29"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formula"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NPV = sum(CF_t / (1 + rate)^t) for t = 0..n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputs_used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cashflows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-10000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"4200"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"6800"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Period 0 cashflow is not discounted."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full-precision &lt;code&gt;value&lt;/code&gt; is serialized as a string so no precision is lost in JSON transport. The engine is pure and deterministic — same inputs, same output, every time. It ships with a unit-test suite plus Hypothesis property tests that assert invariants like PV↔FV round-trips and NPV(IRR) ≈ 0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canonical server:&lt;/strong&gt; Python 3.11+ using the &lt;code&gt;decimal&lt;/code&gt; module and the official MCP SDK. Runs over stdio or streamable HTTP, with optional API-key auth, rate limiting, structured logging, and OpenTelemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosted edge server:&lt;/strong&gt; a Cloudflare Pages Function that mirrors the Python engine in &lt;code&gt;decimal.js&lt;/code&gt; — verified with 17/17 exact output parity against the Python implementation. That's what powers the free public endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt; — 15 calls/day, no key needed (static FX, no batch)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starter — $12/mo&lt;/strong&gt; — 5,000 calls/day, live FX + batch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro — $39/mo&lt;/strong&gt; — 50,000 calls/day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an agent hits the free limit, the tool returns a structured error containing the checkout URL — so an autonomous agent can surface the paywall and the user is two clicks from a key. Prefer to self-host? The whole thing is MIT-licensed with a Docker image and Fly.io/Render blueprints — run it with unlimited calls and your own keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Site + docs: &lt;a href="https://precisioncalc-mcp.pages.dev" rel="noopener noreferrer"&gt;https://precisioncalc-mcp.pages.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub (MIT): &lt;a href="https://github.com/inity13/precisioncalc-mcp" rel="noopener noreferrer"&gt;https://github.com/inity13/precisioncalc-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📇 &lt;code&gt;llms.txt&lt;/code&gt;: &lt;a href="https://precisioncalc-mcp.pages.dev/llms.txt" rel="noopener noreferrer"&gt;https://precisioncalc-mcp.pages.dev/llms.txt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build agents that touch money, give it a try and tell me what tool you'd want next. I'm considering bond pricing, WACC, and options (Black-Scholes).&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>python</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Price Freelance Work (Without Undercharging)</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Sun, 09 Aug 2026 15:17:46 +0000</pubDate>
      <link>https://dev.to/datanestdigital/how-to-price-freelance-work-without-undercharging-3ma7</link>
      <guid>https://dev.to/datanestdigital/how-to-price-freelance-work-without-undercharging-3ma7</guid>
      <description>&lt;p&gt;Figuring out how to price freelance work is the question that keeps most new freelancers up at night, and getting it wrong is how good businesses quietly burn out. This guide is for freelancers and consultants who suspect they’re undercharging and want a clear method: the pricing models, how to build a rate from your real numbers, how to research the market, and how to raise prices without losing sleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; Price freelance work by starting from the income and costs you need to cover, not from what feels polite to ask. Set a floor rate from your numbers, sanity-check it against what your niche charges, then quote per project or on value wherever you can so your pay isn’t capped by the clock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pricing feels impossible at first
&lt;/h2&gt;

&lt;p&gt;Pricing feels impossible at first because you’re trying to learn how to price freelance work while also worrying about scaring the client away. So most people pluck a number that sounds modest, the client says yes a little too quickly, and the quiet resentment starts on day one. Charging too little isn’t humble — it just means more hours to survive.&lt;/p&gt;

&lt;p&gt;The fix is to stop treating your rate as a personality trait and treat it as maths plus a little market research. Two freelancers with identical skills can charge very differently, and the one who did the numbers sleeps better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hourly vs project vs value pricing
&lt;/h2&gt;

&lt;p&gt;There are three common ways to charge, and most freelancers use a mix depending on the job. Hourly is simple and safe for open-ended work; project pricing rewards you for being fast and gives the client a fixed number; value pricing ties your fee to the outcome you create.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Watch out for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hourly&lt;/td&gt;
&lt;td&gt;Unclear or shifting scope, ongoing support, early days&lt;/td&gt;
&lt;td&gt;Your income is capped by hours; efficiency lowers your pay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per project&lt;/td&gt;
&lt;td&gt;Well-defined deliverables you can scope confidently&lt;/td&gt;
&lt;td&gt;Underestimating effort; needs a tight scope and change terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value / retainer&lt;/td&gt;
&lt;td&gt;Work tied to a clear business result, or steady monthly needs&lt;/td&gt;
&lt;td&gt;Requires trust and proof; harder to justify when you’re new&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of these is morally superior — they’re just tools. A sensible path is to start hourly to learn your speed, quote fixed project fees once you can estimate the work, and save value or retainer pricing for clients who trust you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculating your minimum viable rate
&lt;/h2&gt;

&lt;p&gt;Your minimum viable rate is the floor you can’t drop below without losing money, and it anchors everything else. To find it, work through your real numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Decide the annual income you actually need to live on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add your business costs — software, hardware, insurance, fees, and so on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a realistic amount for the tax you’ll owe on that income.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Divide the total by your billable hours — the smaller number left after selling, admin, holidays, and slow weeks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That figure often surprises people, because billable hours are far lower than they assume. This is a planning starting point, not tax advice — the costs and tax that apply depend on where you live, so confirm the numbers with a qualified professional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Researching the market
&lt;/h2&gt;

&lt;p&gt;Your floor tells you what you need; the market tells you what’s possible. Don’t invent a number or copy one loud person online — gather a range from several honest sources and look at the middle. Rates vary hugely by country, niche, and experience, so treat what you find as a signal, not a fixed fact.&lt;/p&gt;

&lt;p&gt;Good places to triangulate a realistic range include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Freelance job posts and briefs that list a budget for similar work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Public rate discussions in your industry’s communities and forums.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Peers you trust — many will share ballpark numbers privately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What agencies charge for the same deliverable, then adjust for your setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your floor sits above your target market, either move upmarket to clients who value the outcome more or lower your costs. If it sits below, you have room to raise your rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Presenting the price with confidence
&lt;/h2&gt;

&lt;p&gt;How you say the price matters almost as much as the number. State it plainly, without apologising or offering nervous discounts before the client has reacted. A calm “This project is X, which includes A, B, and C” beats a mumbled figure followed by “but I can be flexible.”&lt;/p&gt;

&lt;p&gt;Two habits help. First, tie the price to outcomes and deliverables rather than hours, so the conversation is about value, not your clock. Second, offer two or three packaged options — a good, better, best choice shifts the question from “yes or no” to “which one.”&lt;/p&gt;

&lt;h2&gt;
  
  
  When and how to raise rates
&lt;/h2&gt;

&lt;p&gt;Your first rate is not your forever rate. As you get faster, gather results, and build a waiting list, your price should climb to match. A simple rule: if no one ever pushes back on your price, you’re probably too cheap; if you’re consistently booked, go up.&lt;/p&gt;

&lt;p&gt;Raise rates deliberately: quote new clients at the higher number first, so you test it before touching existing relationships. For current clients, give notice, tie the change to the value you’ve delivered, and apply it at a natural break like a new project or year. Most good clients expect it; the ones who leave over a fair increase were usually the hardest to work with anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling 'that's too expensive'
&lt;/h2&gt;

&lt;p&gt;Sooner or later someone says the price is too high, and that’s not automatically a rejection — it’s the start of a negotiation. Don’t panic-discount. Ask what budget they had in mind, then decide whether you can meet it by reducing scope rather than doing the same work for less.&lt;/p&gt;

&lt;p&gt;When you need to flex, protect your rate and adjust what’s included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Trim the deliverables to fit their budget, so the per-unit price holds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Offer a smaller starter phase that proves value before the full project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be willing to walk away — a client who only wants the cheapest option is rarely a good fit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cutting scope keeps your pricing consistent and stops a rushed discount from becoming the norm. A good contract makes this easier, because the deliverables are written down — more on that in the &lt;a href="https://thesolostack.blogspot.com/2026/07/freelance-contract-basics.html" rel="noopener noreferrer"&gt;contract basics guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Should I charge hourly or per project?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hourly is safer when the scope is unclear or the work is ongoing, while per-project pricing rewards efficiency and gives the client a fixed number. Many freelancers start hourly to learn their speed, then move to project fees once they can estimate work confidently. Use whichever protects you for the job in front of you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know if I’m undercharging?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few signs: nearly every client says yes immediately, you feel resentful about the work, or your income doesn’t cover your real costs and tax. If price objections are rare and you’re fully booked, that’s usually a signal to raise your rate. Compare your floor against market research to confirm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I put my prices on my website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There’s no single right answer. Listing a starting price or range filters out mismatched leads and saves time, while quoting privately lets you tailor to each project. If you’re unsure, a “from” figure is a reasonable middle ground.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often should I raise my rates?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There’s no fixed schedule, but reviewing your rate at least once a year is a healthy habit, plus any time your skills, demand, or results jump. Raise new-client quotes first, then existing clients at a natural break. Small, regular increases beat one big shock.&lt;/p&gt;

&lt;p&gt;Pricing well isn’t about being greedy or brave — it’s about doing the arithmetic, checking the market, and then saying your number without flinching. Build your floor, choose the model that fits each job, and raise your rate as your proof grows. For the big picture, start with our &lt;a href="https://thesolostack.blogspot.com/2026/07/how-to-start-freelancing.html" rel="noopener noreferrer"&gt;cornerstone guide&lt;/a&gt;, then set a rate this week that you can defend with a straight face.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datanest-stores.com/freelancer-toolkit/" rel="noopener noreferrer"&gt;Want the full toolkit? Get Freelancer Toolkit on Datanest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now a book: The Calm Freelance Back Office&lt;/strong&gt;&lt;br&gt;
  The Solo Stack, organized into one calm operations handbook — pricing, finding clients, contracts, invoicing, and taxes without the panic. Paperback &amp;amp; Kindle.&lt;br&gt;
  &lt;a href="https://www.amazon.com/dp/B0HB91YRFV" rel="noopener noreferrer"&gt;Get it on Amazon →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on **The Solo Stack&lt;/em&gt;* — The practical playbook for freelancing and one-person businesses.*&lt;br&gt;&lt;br&gt;
&lt;em&gt;More guides on The Solo Stack.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefer a done-for-you toolkit?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/freelancer-toolkit/" rel="noopener noreferrer"&gt;Freelancer Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/saas-starter/" rel="noopener noreferrer"&gt;SaaS Starter Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/landing-lab/" rel="noopener noreferrer"&gt;Landing Lab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>freelance</category>
      <category>career</category>
      <category>business</category>
    </item>
    <item>
      <title>Docker for Beginners: Containers Made Simple</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Sun, 09 Aug 2026 15:17:12 +0000</pubDate>
      <link>https://dev.to/datanestdigital/docker-for-beginners-containers-made-simple-3onl</link>
      <guid>https://dev.to/datanestdigital/docker-for-beginners-containers-made-simple-3onl</guid>
      <description>&lt;p&gt;This guide to Docker for beginners exists because containers are the piece of modern infrastructure that finally makes “it works on my machine” stop being an excuse. If you can run a program in a terminal but have never packaged one to share, you’re exactly who I have in mind. I’ll explain what a container really is, how images differ from containers, the handful of commands you actually need, and the Dockerfile that ties it all together — no prior ops experience assumed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; Docker packages an app together with everything it needs to run — code, libraries, and settings — into a portable unit called a container. That container behaves the same on your laptop, a teammate’s machine, and a production server, which is why “works on my machine” stops being a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 'works on my machine' problem
&lt;/h2&gt;

&lt;p&gt;Every developer has shipped code that ran perfectly on their laptop and then broke the moment someone else tried it. The usual culprit is environment drift: a different language version, a missing system library, an unset variable. The reason Docker for beginners is worth learning early is that it attacks this problem head-on — instead of hoping two machines match, you ship the environment along with the code.&lt;/p&gt;

&lt;p&gt;Before containers, teams wrote long setup documents and still lost hours to “works on my machine.” A container replaces that document with something executable. When the environment is defined in a file and built into an image, everyone runs the exact same thing, down to the patch version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a container is (vs a VM)
&lt;/h2&gt;

&lt;p&gt;A container is an isolated process that carries its own filesystem, libraries, and dependencies while sharing the host machine’s operating system kernel. That shared kernel is the key difference from a virtual machine. A VM boots an entire guest operating system on top of a hypervisor; a container skips all of that and starts in a fraction of the time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Container&lt;/th&gt;
&lt;th&gt;Virtual machine&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Startup&lt;/td&gt;
&lt;td&gt;A second or less&lt;/td&gt;
&lt;td&gt;Tens of seconds to minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Megabytes&lt;/td&gt;
&lt;td&gt;Gigabytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation&lt;/td&gt;
&lt;td&gt;Process level, shared kernel&lt;/td&gt;
&lt;td&gt;Full OS, hardware level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overhead&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Heavier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither is strictly better. Containers are lighter and faster, which is why they dominate application deployment, while VMs give stronger isolation. For the full comparison, see &lt;a href="https://the-ship-log.blogspot.com/2026/07/docker-for-beginners.html" rel="noopener noreferrer"&gt;containers vs virtual machines&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Images vs containers
&lt;/h2&gt;

&lt;p&gt;This is the distinction that trips up almost everyone at first. An &lt;strong&gt;image&lt;/strong&gt; is the blueprint — a read-only, versioned package of your app and its environment. A &lt;strong&gt;container&lt;/strong&gt; is a running instance of that image. One image can start many containers, the same way one class can create many objects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Image&lt;/strong&gt; — built once, stored, shared, and versioned by a tag; you never edit it, you rebuild it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Container&lt;/strong&gt; — a live process started from an image; cheap to create, stop, and throw away.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Internalize that images are immutable and containers are disposable, and most Docker commands suddenly make sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  The handful of commands you need
&lt;/h2&gt;

&lt;p&gt;You can be productive with a small set of commands. Everything below is a &lt;code&gt;docker &amp;lt;command&amp;gt;&lt;/code&gt;, and you rarely need more than these on day one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker pull &amp;lt;image&amp;gt;&lt;/code&gt; — download an image from a registry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker run &amp;lt;image&amp;gt;&lt;/code&gt; — start a container from an image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; — list running containers; add &lt;code&gt;-a&lt;/code&gt; to see stopped ones too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker build -t &amp;lt;name&amp;gt; .&lt;/code&gt; — build an image from a Dockerfile in the current folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker stop &amp;lt;id&amp;gt;&lt;/code&gt; and &lt;code&gt;docker rm &amp;lt;id&amp;gt;&lt;/code&gt; — stop and then remove a container.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A classic first run is &lt;code&gt;docker run -p 8080:80 nginx&lt;/code&gt;, which starts a web server and maps port 80 inside the container to 8080 on your machine. Open the browser and it’s there — with nothing installed on the host.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Dockerfile, line by line
&lt;/h2&gt;

&lt;p&gt;A Dockerfile is a plain-text recipe for building an image. Each line is an instruction, and Docker runs them top to bottom. Here is the shape of a typical one for a small app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;FROM node:20-slim&lt;/code&gt; — start from an official base image instead of building from nothing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;WORKDIR /app&lt;/code&gt; — set the working directory inside the image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;COPY package.json .&lt;/code&gt; — copy the dependency manifest first so Docker can cache the install.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;RUN npm install&lt;/code&gt; — install dependencies during the build.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;COPY . .&lt;/code&gt; — copy the rest of your source in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;CMD ["node", "server.js"]&lt;/code&gt; — the command that runs when a container starts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ordering matters for speed. Because Docker caches each layer, copying &lt;code&gt;package.json&lt;/code&gt; before your source means editing a line of code doesn’t force a full reinstall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where images live: registries
&lt;/h2&gt;

&lt;p&gt;Once you’ve built an image, you need somewhere to store and share it. That’s a registry — think of it as a package repository for container images. Docker Hub is the default public one, and every major cloud offers a private registry of its own.&lt;/p&gt;

&lt;p&gt;The workflow is short: &lt;code&gt;docker build&lt;/code&gt; locally, &lt;code&gt;docker push&lt;/code&gt; to a registry, then &lt;code&gt;docker pull&lt;/code&gt; anywhere you want to run it. Your delivery automation usually does the push, and each deploy target pulls the same image by its tag. That handoff is exactly where containers meet your &lt;a href="https://the-ship-log.blogspot.com/2026/07/cicd-pipeline-explained.html" rel="noopener noreferrer"&gt;CI/CD pipeline&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common beginner mistakes
&lt;/h2&gt;

&lt;p&gt;A few mistakes show up again and again. None are serious, and knowing them upfront saves an afternoon.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storing data inside the container&lt;/strong&gt; — containers are disposable, so anything not written to a mounted volume vanishes when they’re removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Relying on the &lt;code&gt;latest&lt;/code&gt; tag&lt;/strong&gt; — it moves under you; pin a specific version so builds stay reproducible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bloated images&lt;/strong&gt; — start from a &lt;code&gt;slim&lt;/code&gt; or &lt;code&gt;alpine&lt;/code&gt; base and copy only what you need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Running as root&lt;/strong&gt; — add a non-root user; it’s a small change that closes a real security gap.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you outgrow starting containers by hand, an orchestrator takes over — see &lt;a href="https://the-ship-log.blogspot.com/2026/07/kubernetes-basics.html" rel="noopener noreferrer"&gt;Kubernetes basics&lt;/a&gt; for where that road leads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Docker free to use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Engine, the core runtime, is open source and free. Docker Desktop is free for personal use, education, and small businesses, but larger companies need a paid subscription. Many teams simply run the engine directly on Linux at no cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to learn Docker before Kubernetes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In practice, yes. Kubernetes orchestrates containers, so it assumes you already understand images and containers. Get comfortable building and running a few containers first, then move on to &lt;a href="https://the-ship-log.blogspot.com/2026/07/kubernetes-basics.html" rel="noopener noreferrer"&gt;Kubernetes basics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between an image and a container?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An image is the static, versioned package; a container is a running instance of it. You build an image once and can start, stop, and delete many containers from it without ever changing the image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are containers secure enough for production?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Containers run in production everywhere, but they aren’t as strong a boundary as a full VM because they share the host kernel. Follow the basics — run as a non-root user, keep base images patched, and pin versions — and they’re solid for most workloads.&lt;/p&gt;

&lt;p&gt;Docker rewards a small amount of upfront learning with a skill you’ll use on nearly every project: package once, run anywhere, and stop chasing phantom environment bugs. Build one image, push it, and run it somewhere else to feel it click. For how that image becomes an automated release, start with our &lt;a href="https://the-ship-log.blogspot.com/2026/07/cicd-pipeline-explained.html" rel="noopener noreferrer"&gt;cornerstone guide&lt;/a&gt; to CI/CD.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datanest-stores.com/devops-toolkit/" rel="noopener noreferrer"&gt;Want the full toolkit? Get DevOps Toolkit on Datanest&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on **The Ship Log&lt;/em&gt;* — How software actually ships: CI/CD, containers, cloud, and staying up.*&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://the-ship-log.blogspot.com/2026/07/docker-for-beginners.html" rel="noopener noreferrer"&gt;Read more on The Ship Log →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefer a done-for-you toolkit?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/devops-toolkit/" rel="noopener noreferrer"&gt;DevOps Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/cloud-architecture/" rel="noopener noreferrer"&gt;Cloud Architecture Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/sre-platform/" rel="noopener noreferrer"&gt;SRE Platform Kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
      <category>docker</category>
    </item>
    <item>
      <title>How LLMs Actually Work (No Math Required)</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Sun, 09 Aug 2026 15:16:38 +0000</pubDate>
      <link>https://dev.to/datanestdigital/how-llms-actually-work-no-math-required-3jl6</link>
      <guid>https://dev.to/datanestdigital/how-llms-actually-work-no-math-required-3jl6</guid>
      <description>&lt;p&gt;If you have ever wondered how LLMs work without wading through linear algebra, you are in the right kitchen. This guide is for developers and curious builders who want a clear mental model of large language models — enough to use them well and to debug them when they misbehave. No math and no mysticism, just the handful of ideas that make everything else click.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; An LLM is a very large pattern-matcher trained to predict the next chunk of text — a “token” — over and over, using patterns it absorbed from huge amounts of writing. That one trick is enough to answer questions, write code, and hold a conversation, and it also explains the model’s quirks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an LLM is, in one honest sentence
&lt;/h2&gt;

&lt;p&gt;The honest one-liner: a large language model is a program that, given some text, predicts the most likely next token, then does it again with its own answer folded back in. That loop is genuinely most of how LLMs work — the rest is scale and careful training. Think of it as autocomplete on steroids: the same idea as your phone suggesting the next word, but trained on far more text and much better at staying on topic.&lt;/p&gt;

&lt;p&gt;What it is &lt;em&gt;not&lt;/em&gt; is a database or a search engine. It does not look up facts in a table; it reconstructs likely-sounding text from patterns. That single distinction explains both why these models feel so fluent and why they can state a wrong fact with total confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokens: how models see text
&lt;/h2&gt;

&lt;p&gt;Models do not read letters or whole words — they read &lt;strong&gt;tokens&lt;/strong&gt;, which are common chunks of text. A token is often a whole word, but long or rare words get split into pieces. As a rough guide, one token is about four characters of English, or roughly three-quarters of a word.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;“cat”&lt;/strong&gt; — a single token.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;“unbelievable”&lt;/strong&gt; — often two or three tokens stitched together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A short paragraph&lt;/strong&gt; — roughly 60–80 tokens.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything the model reads and writes is measured in tokens, which is why they matter for both cost and memory. We go deeper in our guide to &lt;a href="https://the-model-kitchen.blogspot.com/2026/07/how-llms-work-explained.html" rel="noopener noreferrer"&gt;tokens and context windows&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next-token prediction, the whole trick
&lt;/h2&gt;

&lt;p&gt;When you send a prompt, the model turns it into tokens and produces a probability for every possible next token — tens of thousands of candidates. It picks one, appends it, and repeats until it decides to stop. That loop, run over and over, is the entire engine behind every chatbot answer.&lt;/p&gt;

&lt;p&gt;Because it predicts one token at a time, the model has no finished plan for the whole answer before it starts writing. It composes on the fly, which is why the exact wording of your prompt nudges the whole trajectory — small changes in phrasing can lead to noticeably different results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Training vs inference
&lt;/h2&gt;

&lt;p&gt;There are two very different phases. &lt;strong&gt;Training&lt;/strong&gt; is the one-time, enormously expensive process where the model reads a huge slice of text and slowly adjusts billions of internal numbers — its &lt;em&gt;weights&lt;/em&gt; — to get better at predicting the next token. &lt;strong&gt;Inference&lt;/strong&gt; is what happens when you use it: the weights are frozen and the model simply runs its prediction loop on your input.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Training&lt;/th&gt;
&lt;th&gt;Inference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;When&lt;/td&gt;
&lt;td&gt;Once, before release&lt;/td&gt;
&lt;td&gt;Every time you send a prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Huge, one-time&lt;/td&gt;
&lt;td&gt;Small, per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changes the model?&lt;/td&gt;
&lt;td&gt;Yes — it sets the weights&lt;/td&gt;
&lt;td&gt;No — weights stay fixed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical upshot: a base model’s knowledge is frozen at training time. It does not learn from your chat unless the provider deliberately adds new data or gives it tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bigger models feel smarter
&lt;/h2&gt;

&lt;p&gt;Scale is the surprising part of the story. As you increase the training data, the number of weights, and the compute used, models get steadily better across a wide range of tasks — sometimes picking up abilities their smaller siblings simply did not have. That is why a frontier model can follow multi-step instructions that a tiny one fumbles.&lt;/p&gt;

&lt;p&gt;Bigger is not automatically better for your project, though. Larger models cost more and respond slower, and a smaller, well-prompted model often wins on narrow tasks. “Smarter” here means better at predicting useful text — not conscious understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they hallucinate
&lt;/h2&gt;

&lt;p&gt;Because the model generates plausible text rather than retrieving verified facts, it will sometimes produce confident, well-formed statements that are simply wrong. We call these &lt;strong&gt;hallucinations&lt;/strong&gt;, and they are a side effect of how the system works, not a stray bug you can fully patch out.&lt;/p&gt;

&lt;p&gt;The model has no built-in sense of “I do not actually know this.” If the most likely continuation looks like a citation or a statistic, it will happily write one — real or not. The fix is to give it grounding in real sources and to verify anything that matters, which we cover in &lt;a href="https://the-model-kitchen.blogspot.com/2026/07/hallucinations-explained.html" rel="noopener noreferrer"&gt;why LLMs hallucinate&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they can and can't do
&lt;/h2&gt;

&lt;p&gt;It helps to hold both sides in your head at once.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong at:&lt;/strong&gt; drafting and rewriting text, summarizing, translation, brainstorming, explaining code, and turning messy input into clean structured output.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shaky at:&lt;/strong&gt; exact arithmetic, up-to-the-minute facts, precise citations, and anything that needs guaranteed accuracy without a check.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful rule of thumb: LLMs are excellent first-draft engines and unreliable sources of truth. Pair them with tools — a calculator, a search index, your own database — when correctness matters, and keep a human in the loop for high-stakes calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;p&gt;With the mental model in place, here are the three best follow-ups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://the-model-kitchen.blogspot.com/2026/07/prompt-engineering-basics.html" rel="noopener noreferrer"&gt;Prompt engineering basics&lt;/a&gt; — how to ask so you reliably get what you want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://the-model-kitchen.blogspot.com/2026/07/tokens-and-context-windows.html" rel="noopener noreferrer"&gt;Tokens and context windows&lt;/a&gt; — the model’s memory and your bill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://the-model-kitchen.blogspot.com/2026/07/hallucinations-explained.html" rel="noopener noreferrer"&gt;Why LLMs hallucinate&lt;/a&gt; — and how to keep answers grounded.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do LLMs actually understand what they are saying?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not in the human sense. They model the statistical patterns in language extremely well, which can look like understanding, but there is no inner awareness or intent behind the words. It is more accurate to say they are very good at producing text that fits — useful, but not comprehension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is an LLM the same thing as ChatGPT?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. The LLM is the underlying model, while a product like a chat assistant wraps it with an interface, safety filters, memory, and sometimes tools like web search. Two products can even share the same base model, so a chat session uses the whole system, not the raw model alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do LLMs know things if they only predict text?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During training the model reads enormous amounts of writing and encodes recurring facts and patterns into its weights. So “knowing” is really compressed pattern memory rather than a lookup table. That is also why a model has a knowledge cutoff and can be fuzzy or out of date on specifics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I trust an LLM’s answers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Treat them like a fast, well-read intern who never admits being unsure. They are great for drafts and explanations, but verify anything factual, numerical, or high-stakes against a real source. Grounding it with your own documents helps, but never makes the output perfect.&lt;/p&gt;

&lt;p&gt;Once you see an LLM as a next-token prediction loop scaled up until it is genuinely useful, the magic gives way to something better: intuition. You can predict where it will shine, anticipate where it will drift, and design around both. Pick one of the follow-up guides above and start building — the best way to understand these tools is to use them with your eyes open.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datanest-stores.com/ai-llm-toolkit/" rel="noopener noreferrer"&gt;Want the full toolkit? Get AI &amp;amp; LLM Toolkit on Datanest&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on **The Model Kitchen&lt;/em&gt;* — Clear recipes for building with AI and large language models.*&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://the-model-kitchen.blogspot.com/2026/07/how-llms-work-explained.html" rel="noopener noreferrer"&gt;Read more on The Model Kitchen →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefer a done-for-you toolkit?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/ai-llm-toolkit/" rel="noopener noreferrer"&gt;AI &amp;amp; LLM Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/ai-toolkit/" rel="noopener noreferrer"&gt;AI Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/ai-ml-starter/" rel="noopener noreferrer"&gt;AI/ML Starter Kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>Personal Knowledge Management: A Simple Guide</title>
      <dc:creator>DatanestDigital</dc:creator>
      <pubDate>Sun, 09 Aug 2026 15:16:03 +0000</pubDate>
      <link>https://dev.to/datanestdigital/personal-knowledge-management-a-simple-guide-2ehp</link>
      <guid>https://dev.to/datanestdigital/personal-knowledge-management-a-simple-guide-2ehp</guid>
      <description>&lt;p&gt;Personal knowledge management is the quiet practice of capturing what you learn so it’s there when you need it — instead of lost in a browser tab you’ll never reopen. This guide is for anyone who reads, researches, or thinks for a living and feels the good ideas slipping away faster than they arrive. You’ll get a plain, low-effort system you can start this week, without buying an app or adopting anyone’s rigid method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; Personal knowledge management (PKM) is a simple loop — you capture ideas in one place, organize them lightly, and use them to make things. Keep the loop small and it survives; over-engineer it and it quietly collapses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What personal knowledge management means
&lt;/h2&gt;

&lt;p&gt;Personal knowledge management is the habit of collecting, connecting, and reusing the information that matters to your work and life — from a quote you want to remember to the research behind next quarter’s decision. The point isn’t to hoard information; it’s to make your future self’s job easier.&lt;/p&gt;

&lt;p&gt;Most people already run a rough version of this: a notes app here, some bookmarks there, a document full of half-finished ideas. A real system just makes that instinct deliberate and reliable, so a note you jot today can still help you a year from now. It usually has three moving parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A capture tool&lt;/strong&gt; — where ideas land the second you have them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A place to keep them&lt;/strong&gt; — notes, documents, or an app you actually open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A reason to return&lt;/strong&gt; — projects, writing, or decisions that pull the notes back out.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why most note systems collapse
&lt;/h2&gt;

&lt;p&gt;The usual reason a personal knowledge management setup falls apart isn’t laziness — it’s friction and fantasy. We build elaborate structures for the person we wish we were, then abandon them the first genuinely busy week. The failure points are predictable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Too many inboxes.&lt;/strong&gt; Notes scattered across five apps means you trust none of them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organizing before capturing.&lt;/strong&gt; Perfect folders on day one, empty by day ten.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collecting without using.&lt;/strong&gt; A vault of saved articles you never reopen is just tidy clutter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool-hopping.&lt;/strong&gt; Switching apps every month resets the habit each time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The aim is something humble enough to keep working on your most distracted days — not a showpiece you admire for a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  The capture-organize-use loop
&lt;/h2&gt;

&lt;p&gt;Underneath every method — Zettelkasten, PARA, bullet journaling — sits the same simple loop. You capture something, organize it just enough to find it again, and use it to make or decide something. Everything else is decoration on those three steps.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Keep it light&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Capture&lt;/td&gt;
&lt;td&gt;Where does this go right now?&lt;/td&gt;
&lt;td&gt;One inbox, no sorting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organize&lt;/td&gt;
&lt;td&gt;How will I find it later?&lt;/td&gt;
&lt;td&gt;Tags or links, not deep folders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use&lt;/td&gt;
&lt;td&gt;What am I making with it?&lt;/td&gt;
&lt;td&gt;Pull notes into real work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Think of it as a loop, not a staircase: you cycle through these stages every week, and the system stays alive because you keep using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capture: one inbox
&lt;/h2&gt;

&lt;p&gt;Capture is where personal knowledge management lives or dies, and the rule is almost boringly simple: pick one inbox and send everything there first. It might be a notes app, a plain text file, or a paper notebook — the tool matters far less than the discipline of a single destination.&lt;/p&gt;

&lt;p&gt;The reason is trust. When there’s exactly one place ideas land, you never burn energy deciding where something goes, and you never wonder later where you put it.&lt;/p&gt;

&lt;p&gt;Lower the friction as much as you can with a shortcut, a hotkey, or a widget. If capturing a thought takes more than a few seconds, you’ll stop doing it and the whole system quietly starves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organize: light structure beats folders
&lt;/h2&gt;

&lt;p&gt;Once things are captured, resist the urge to build a filing cabinet. Deep folder trees feel productive but punish you later, because every note forces a decision about where it belongs — and most ideas belong in several places at once.&lt;/p&gt;

&lt;p&gt;Lighter tools age better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; for themes you search by, like writing, health, or work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt; between related notes, so one idea leads naturally to the next.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A few broad buckets&lt;/strong&gt; — Tiago Forte’s PARA (Projects, Areas, Resources, Archive) is a popular, low-maintenance version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test is simple: can you find a note in under ten seconds? If yes, your structure is good enough. Anything fancier is usually organizing for its own sake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use: notes are for output
&lt;/h2&gt;

&lt;p&gt;Here’s the part most guides skip: notes are only worth keeping if they feed something. Personal knowledge management isn’t about the collection — it’s about what it helps you produce, whether an essay, a plan, or a better decision.&lt;/p&gt;

&lt;p&gt;So point your system at real output. Before you save an article, ask which project or question it serves. When you start a piece of writing, open your notes first and see what past-you already gathered. A note that shows up at the right moment has paid for itself many times over.&lt;/p&gt;

&lt;p&gt;This also keeps the system honest. If a whole category of notes never gets used, that’s useful feedback — stop collecting it. A &lt;a href="https://the-focus-files.blogspot.com/2026/07/personal-knowledge-management-guide.html" rel="noopener noreferrer"&gt;weekly review&lt;/a&gt; is a natural time to notice what’s pulling its weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to start this week
&lt;/h2&gt;

&lt;p&gt;You don’t need a weekend retreat to begin. A working personal knowledge management habit can start in an afternoon and grow from there. Keep the first version almost embarrassingly small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pick one inbox&lt;/strong&gt; — the notes app you already own is fine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capture ten things&lt;/strong&gt; you’d normally forget: an idea, a quote, a task, a link.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add two or three tags&lt;/strong&gt;, not twenty folders.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Link one note to another&lt;/strong&gt; and notice how it feels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Book fifteen minutes on Friday&lt;/strong&gt; to tidy and reread.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tiny loop you run every day beats an elaborate system you admire once and abandon. When the habit sticks, layer on a specific method like &lt;a href="https://the-focus-files.blogspot.com/2026/07/how-to-take-better-notes.html" rel="noopener noreferrer"&gt;better note-taking&lt;/a&gt; or a &lt;a href="https://the-focus-files.blogspot.com/2026/07/second-brain-explained.html" rel="noopener noreferrer"&gt;second brain&lt;/a&gt; — but the loop always comes first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is personal knowledge management just note-taking?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Note-taking is one part of it. Personal knowledge management also covers organizing notes so you can find them and, crucially, using them to make things. Think of note-taking as the capture step, and PKM as the full capture–organize–use loop around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the best app for PKM?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best app is the one you’ll actually open every day. Notion, Obsidian, Apple Notes, and even a plain text file can all work well; the habit matters far more than the feature list. Start with what you have and only switch when a real limitation forces it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is PKM different from a “second brain”?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They overlap almost completely. “Second brain” is a friendlier, popular name for a personal knowledge management system, brought into the mainstream by Tiago Forte. The underlying idea is the same — keep what matters usable outside your head.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much time should PKM take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Less than you’d expect. Capture should be near-instant, and a short weekly tidy of fifteen to thirty minutes is usually enough. If the system starts to feel like a second job, treat that as a signal to simplify.&lt;/p&gt;

&lt;p&gt;Personal knowledge management isn’t a personality or a purchase — it’s a small, repeatable loop that respects how memory actually works. Capture in one place, organize just enough, and keep pulling your notes into real work, and the good ideas stop slipping away. Everything else on this site — note methods, focus techniques, weekly reviews — is just a variation on that one humane idea.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datanest-stores.com/notion-templates/" rel="noopener noreferrer"&gt;Want the full toolkit? Get Notion Templates on Datanest&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on **The Focus Files&lt;/em&gt;* — Productivity and note-taking that survive real life.*&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://the-focus-files.blogspot.com/2026/07/personal-knowledge-management-guide.html" rel="noopener noreferrer"&gt;Read more on The Focus Files →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefer a done-for-you toolkit?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/notion-templates/" rel="noopener noreferrer"&gt;Notion Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/spreadsheet-tools/" rel="noopener noreferrer"&gt;Spreadsheet Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datanest-stores.com/pm-toolkit/" rel="noopener noreferrer"&gt;PM Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>notes</category>
      <category>pkm</category>
    </item>
  </channel>
</rss>
