<?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: Peter Sjolin</title>
    <description>The latest articles on DEV Community by Peter Sjolin (@pigfox).</description>
    <link>https://dev.to/pigfox</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%2F164220%2Fa2a6adfe-e026-424b-8843-7dcf7c5d2986.png</url>
      <title>DEV Community: Peter Sjolin</title>
      <link>https://dev.to/pigfox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pigfox"/>
    <language>en</language>
    <item>
      <title>What eight live testnet contracts taught me about testing, gas, and putting an LLM in a settlement path</title>
      <dc:creator>Peter Sjolin</dc:creator>
      <pubDate>Wed, 05 Aug 2026 13:35:44 +0000</pubDate>
      <link>https://dev.to/pigfox/what-eight-live-testnet-contracts-taught-me-about-testing-gas-and-putting-an-llm-in-a-settlement-2nhj</link>
      <guid>https://dev.to/pigfox/what-eight-live-testnet-contracts-taught-me-about-testing-gas-and-putting-an-llm-in-a-settlement-2nhj</guid>
      <description>&lt;p&gt;Most write-ups about smart contract work show you the parts that worked. This one includes the parts that didn't, because those are the ones worth reading.&lt;/p&gt;

&lt;p&gt;Seven contracts, deployed to Base Sepolia. Eight pages that read chain state on every request. No forks, no local Anvil node dressed up as a network, no screenshot standing in for a transaction. Contract addresses print on the page and open on Basescan. You can connect a wallet and make any of them do something.&lt;/p&gt;

&lt;p&gt;Here's what I found building them.&lt;/p&gt;

&lt;h2&gt;
  
  
  One pipeline, seven repos, one definition of green
&lt;/h2&gt;

&lt;p&gt;Each repo vendors a shared pipeline as a submodule and calls its reusable workflow. A fix to a gate lands once instead of seven times.&lt;/p&gt;

&lt;p&gt;Order matters more than people give it credit for. &lt;code&gt;forge lint&lt;/code&gt; and Solhint run first, because linting takes seconds and fuzzing takes minutes. Then Foundry unit, fuzz and invariant tests on a pinned toolchain — a skipped test is a red build, not a yellow one. Then Slither at &lt;code&gt;fail-on low&lt;/code&gt;, with every excluded detector argued in writing. Then Echidna and Medusa, two independent fuzzers running one shared &lt;code&gt;Properties.sol&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The interesting bit is why the property count is a Solidity literal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A stale build artifact once shrank a property set and reported a smaller green run.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The suite went green with fewer properties registered and nothing said so. Now the expected count is declared in the source and four independent checks must agree with the literal before a build passes. The harness audits itself.&lt;/p&gt;

&lt;p&gt;The coverage gate is 100% line, statement, branch and function on every file under &lt;code&gt;src&lt;/code&gt;. The only exclusions are snarkjs-generated verifier contracts, excluded by name and printed on every run rather than folded into a percentage. A percentage hides an exclusion; a printed name doesn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pigfox.com/how-smart-contracts-are-tested?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=testing-pipeline" rel="noopener noreferrer"&gt;How the contracts are tested&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two of four gas optimizations are basically noise
&lt;/h2&gt;

&lt;p&gt;One contract, deployed twice. One ordinary version, one with four optimizations, and a compiler-enforced identical ABI so signature drift fails the build. A runner calls both in a single transaction, so both face the same block, the same base fee and the same caller. Figures come out of the receipt.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;technique&lt;/th&gt;
&lt;th&gt;saving&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;packed struct on &lt;code&gt;writeRecord&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;71.8%&lt;/strong&gt; (92,195 → 25,976 gas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bitmap replacing a &lt;code&gt;bool&lt;/code&gt; mapping on &lt;code&gt;setFlagRange&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.6%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;calldata over memory&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;custom error over revert string&lt;/td&gt;
&lt;td&gt;1.9%, reverting path only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last two stay in the table. Calldata-over-memory is swamped by the cold storage writes in the same call. The custom error saves nothing on any path that doesn't revert. A demo where every technique wins is a curated demo.&lt;/p&gt;

&lt;p&gt;And the counterpoint sits on the same page: the optimized contract costs &lt;strong&gt;10.1% more to deploy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pigfox.com/demos/gas-optimization?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=gas-optimization" rel="noopener noreferrer"&gt;Race an operation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Chainlink guard in everyone's consumer code that never fires
&lt;/h2&gt;

&lt;p&gt;Protocols rarely lose money because an oracle got attacked. They lose it because the consuming contract called &lt;code&gt;latestRoundData&lt;/code&gt;, took the answer, and used a price that was already stale, or negative, or from a round that never finished.&lt;/p&gt;

&lt;p&gt;A contract reads four live feeds and names which of six failure states applies, reporting the most severe when several apply at once.&lt;/p&gt;

&lt;p&gt;Two things fell out of building it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-feed staleness thresholds are not optional.&lt;/strong&gt; The three crypto feeds republish every few minutes on price deviation. USDC moves on a roughly 24-hour heartbeat — I measured it across two intervals before writing the contract. One estate-wide threshold describes neither feed correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;answeredInRound &amp;gt;= roundId&lt;/code&gt; is dead code.&lt;/strong&gt; That guard is still copied into consumer code today. On all four aggregators it returns equal to &lt;code&gt;roundId&lt;/code&gt;, so it never fires. It's a comfort check.&lt;/p&gt;

&lt;p&gt;One testing note: the staleness boundary is inclusive, and the property harness constructs both sides of the threshold on every run. Interior sampling never catches a &lt;code&gt;&amp;gt;&lt;/code&gt; swapped for a &lt;code&gt;&amp;gt;=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pigfox.com/demos/oracle-health-explorer?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=oracle-health-explorer" rel="noopener noreferrer"&gt;Read the feeds&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting a language model in the settlement path
&lt;/h2&gt;

&lt;p&gt;This is where the AI and blockchain overlap gets interesting, and it's mostly a division-of-labor problem. A chain records a decision permanently and makes no judgment of its own. A model makes judgment calls and remembers nothing. Two demos draw that line in public.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZK escrow.&lt;/strong&gt; Funds release one of two ways. A Groth16 proof of a delivery secret releases them without revealing the secret — the commitment is Poseidon of the secret, derived on your own machine by a script in the repo, so the secret never crosses the wire. A contested delivery goes to an AI arbiter whose ruling and full reasoning are written to chain in the clear.&lt;/p&gt;

&lt;p&gt;Two design decisions I'd defend anywhere. Settlements are never pushed — every outcome credits a pull-payment balance, so a recipient refusing a transfer never blocks a settlement. And the proof authorizes the release rather than the sender, bound to one escrow by a nullifier, so anyone can broadcast the transaction.&lt;/p&gt;

&lt;p&gt;There's also a scar in the proxy's history: a UUPS upgrade added arbiter rotation after a dispute stranded behind an arbiter address with no known private key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pigfox.com/demos/zk-escrow?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=zk-escrow" rel="noopener noreferrer"&gt;Browse the escrows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI parametric insurance.&lt;/strong&gt; Parametric means the payout follows a defined condition rather than an assessed loss — and that distinction is the entire reason a model belongs in the loop. &lt;em&gt;Did the stated condition occur&lt;/em&gt; has a checkable answer. &lt;em&gt;What is this loss worth&lt;/em&gt; does not, and this system never asks it.&lt;/p&gt;

&lt;p&gt;Three adjudicators sign, each pinned to a different model, duplicates rejected at construction. Two agreeing verdicts settle a claim. The evidence hash lands on chain when the claim is filed, before any adjudicator sees anything, and a verdict carrying a different hash is refused rather than discounted. The decision is an enum, never prose, so a re-run compares. The adjudicator set has no owner and no setter, because an operator who can swap signers manufactures any majority after seeing the first verdict.&lt;/p&gt;

&lt;p&gt;Here's the part I'd most want another engineer to argue with. Within three days of writing down the procedure, &lt;strong&gt;two of the pinned models changed behavior underneath their own identifiers.&lt;/strong&gt; One started rejecting the &lt;code&gt;temperature&lt;/code&gt; field outright. One started wrapping its JSON in a code fence. None of that shows up in a published hash. Pinning a model identifier does not pin model behavior, so the page calls this a multi-signer oracle rather than a trustless one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pigfox.com/demos/ai-parametric-insurance?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=ai-parametric-insurance" rel="noopener noreferrer"&gt;Read the verdicts&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The other three
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RWA tokenization.&lt;/strong&gt; An ERC-3643-inspired token where fractions of an asset trade as an ERC-20 and every mint and transfer passes an on-chain KYC whitelist. Four seeded transactions, and the third is the point: a correctly formed transfer of 500 tokens to an address with no KYC record, reverted by the token itself. Contracts are hand-rolled, no T-REX suite vendored. &lt;a href="https://pigfox.com/demos/rwa-tokenization?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=rwa-tokenization" rel="noopener noreferrer"&gt;Try the transfer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZK KYC pass.&lt;/strong&gt; Same compliance outcome, no identity list. A holder proves in zero knowledge they hold a valid credential from an approved issuer without revealing the issuer or any identifying data. On chain there's a Merkle root and a set of spent nullifiers — nothing enumerable. The proof binds to the redeemer's address, so a stolen proof is worthless, and rotating the root re-issues the whole credential set in one transaction. &lt;a href="https://pigfox.com/demos/zk-kyc-pass?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=zk-kyc-pass" rel="noopener noreferrer"&gt;See the private gate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interest rate model.&lt;/strong&gt; The kinked curve most lending protocols run on, deployed with every parameter fixed at construction — no owner, no setter, no upgrade path. Eight invariants are claimed for the entire valid parameter space, not the one deployed curve, so the harness builds six curves including a kink one wei above zero and one wei below full. The page shows the borrow rate one wei either side of the kink, where two formulas have to agree to the wei. They return the same integer. &lt;a href="https://pigfox.com/demos/interest-rate-model?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=demos-2026-08&amp;amp;utm_content=interest-rate-model" rel="noopener noreferrer"&gt;Move the slider&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the failures are on the pages
&lt;/h2&gt;

&lt;p&gt;Every page prints its contracts, links its repository, links its CI run, and reads its numbers off the chain while you watch. The gas demo keeps two losing techniques in the table. The AI adjudication demo says at the top of the page, not in a footnote, that the operator holds every key.&lt;/p&gt;

&lt;p&gt;That isn't modesty. A demo that only shows wins tells you nothing about the person's judgment, which is the thing you actually wanted to know. If you build something similar, write down the parts you are &lt;em&gt;not&lt;/em&gt; claiming — it's the cheapest credibility available.&lt;/p&gt;

&lt;p&gt;All repos are public at &lt;a href="https://github.com/pigfox" rel="noopener noreferrer"&gt;github.com/pigfox&lt;/a&gt;. Corrections welcome, particularly on the multi-signer oracle design.&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>testing</category>
      <category>blockchain</category>
      <category>ai</category>
    </item>
    <item>
      <title>I built 27 tools and an AI arbiter that settles escrow disputes on-chain</title>
      <dc:creator>Peter Sjolin</dc:creator>
      <pubDate>Sun, 26 Jul 2026 15:22:47 +0000</pubDate>
      <link>https://dev.to/pigfox/i-built-27-tools-and-an-ai-arbiter-that-settles-escrow-disputes-on-chain-4mo6</link>
      <guid>https://dev.to/pigfox/i-built-27-tools-and-an-ai-arbiter-that-settles-escrow-disputes-on-chain-4mo6</guid>
      <description>&lt;p&gt;I run &lt;a href="https://pigfox.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=intro" rel="noopener noreferrer"&gt;pigfox.com&lt;/a&gt; as a one-person shop. It's two things now: &lt;strong&gt;27 tools, 16 of them free&lt;/strong&gt;, covering OSINT, email security, TLS and document forensics — and &lt;strong&gt;three live smart-contract demos&lt;/strong&gt; on Base Sepolia, one of which lets a language model decide who gets the money.&lt;/p&gt;

&lt;p&gt;Both halves follow the same rule, and that rule is the actual subject of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule: evidence first, interpretation second
&lt;/h2&gt;

&lt;p&gt;There's a genre of tool I refused to build — paste a domain in a box, a model hallucinates a paragraph, you get a confident answer nobody can verify.&lt;/p&gt;

&lt;p&gt;Every tool here hits real infrastructure first. DNS. WHOIS. TLS handshakes. Certificate-transparency logs. Raw EXIF bytes. Raw &lt;code&gt;Received:&lt;/code&gt; headers. PDF object tables. The output shows you the signals it collected so you can check them yourself.&lt;/p&gt;

&lt;p&gt;Five of the 27 call a model at all — and only &lt;em&gt;after&lt;/em&gt; the evidence is on the table. Six more are metered without touching a model, because reverse-image lookups and WHOIS history cost money per query whether or not an LLM is involved. The other 16 are free and staying that way.&lt;/p&gt;

&lt;p&gt;Now watch what happens when you take that rule on-chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demos: where a model's output becomes a transaction
&lt;/h2&gt;

&lt;p&gt;Three interactive demos, all live, all against &lt;strong&gt;Base Sepolia (chain 84532)&lt;/strong&gt; — deployed contracts, real testnet transactions, hashes you can open in a block explorer.&lt;/p&gt;

&lt;p&gt;There's a doctrine behind that: &lt;strong&gt;no forking.&lt;/strong&gt; No &lt;code&gt;--fork-url&lt;/code&gt;, no mainnet simulation, no mocked chain state. If a demo says something settled, there's a transaction hash. The Playwright E2E suite runs against the live chain too — slower, occasionally flaky, worth it. A test that passes against a mock proves nothing about a contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZK Escrow Explorer — the AI arbiter
&lt;/h3&gt;

&lt;p&gt;Two parties lock funds in an escrow contract. Something goes wrong. One opens a dispute. &lt;strong&gt;An AI arbiter reads the case and issues a ruling — and that ruling settles on-chain, moving funds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which is precisely the thing you should be nervous about. A language model deciding who gets paid is a terrible idea if the model is a trusted oracle with an open-ended mandate. So it isn't one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The action space is enumerated in the contract.&lt;/strong&gt; The arbiter selects from a fixed set of settlements. It cannot invent an outcome, cannot pay a third party, cannot move an amount nobody escrowed. The worst case is a wrong pick from a short list — not an arbitrary transfer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The evidence is frozen before the model runs.&lt;/strong&gt; Same rule as the tools. Case material is assembled first, the model reasons over it second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Groth16 circuit carries the proof obligation&lt;/strong&gt;, so a claim can be verified without the verifier seeing the private inputs behind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UUPS proxy&lt;/strong&gt; for upgradeability, because "we found a bug in the arbiter integration" has to be survivable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nine disputes have run end to end on-chain. Every one is inspectable.&lt;/p&gt;

&lt;p&gt;That's what bounded AI means concretely: the model's role is narrow, its inputs are fixed, and the thing that executes its decision is a contract that structurally cannot do what the model was never allowed to ask for. The model proposes within a grammar. The chain disposes.&lt;/p&gt;

&lt;p&gt;Compare that to the default posture — hand the model a tool that can call any function with any argument and hope the system prompt holds. That's the on-chain equivalent of vibe coding, and it's how you lose a treasury.&lt;/p&gt;

&lt;h3&gt;
  
  
  RWA Tokenization Explorer
&lt;/h3&gt;

&lt;p&gt;An ERC-3643-style permissioned token. The interesting part versus a plain ERC-20: transfers are conditional. The contract checks an on-chain identity and compliance registry, and a transfer to an unverified address &lt;strong&gt;reverts&lt;/strong&gt;. Tokenized real-world assets don't get to be bearer instruments — the restriction has to live in the token, not in a database somewhere off to the side.&lt;/p&gt;

&lt;p&gt;Built with Foundry, pushed through Slither and Echidna.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZK Compliance Pass
&lt;/h3&gt;

&lt;p&gt;Prove you satisfy a compliance requirement without handing over the data that proves it. Same cryptographic primitive as the escrow circuit, aimed at KYC-shaped problems: the verifier learns &lt;em&gt;you qualify&lt;/em&gt;, and nothing else.&lt;/p&gt;

&lt;p&gt;Queued behind these: a gas-optimization demo with measured before/after deltas, and an adversarial lab — intentionally vulnerable contracts, Foundry proof-of-concept exploits, and patched versions side by side.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools: what's new
&lt;/h2&gt;

&lt;p&gt;The bulk of the recent tool work is a cluster built around one question — &lt;em&gt;is this person, offer, document, or company what it claims to be?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Job-Offer Legitimacy Check&lt;/strong&gt; (AI) surfaces signals to investigate in a recruiter message, including the sender domain's real age. &lt;strong&gt;Candidate Photo Verify&lt;/strong&gt; does reverse-image evidence: where else that photo appears online. &lt;strong&gt;Timeline Discrepancy Checker&lt;/strong&gt; (AI) reads a résumé for internal-consistency signals — overlapping roles, date-vs-total mismatches, impossible tech or certification dates. &lt;strong&gt;Website Legit Check&lt;/strong&gt; rolls domain age, TLS, redirects, email-security DNS and headers into one pass. &lt;strong&gt;Counterparty Due-Diligence Check&lt;/strong&gt; vets a supplier before you wire anything. &lt;strong&gt;Document Authenticity Check&lt;/strong&gt; scans a PDF's structure for integrity signals — incremental updates, appended content, cross-reference and date anomalies. &lt;strong&gt;Username Cross-Platform Check&lt;/strong&gt; reports presence of a handle across a curated platform set.&lt;/p&gt;

&lt;p&gt;Note what the résumé and document checkers &lt;em&gt;don't&lt;/em&gt; do: they don't render a verdict on a person. They surface structural anomalies and hand them to you. A date gap is a question to ask, not a conviction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The free tier, in full
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OSINT &amp;amp; security (13 free)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/tracecheck?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;TraceCheck&lt;/a&gt; — score a public footprint from live search signals.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/domain-recon?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Domain Recon&lt;/a&gt; — passive recon from public records.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/exif-metadata-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;EXIF Metadata Check&lt;/a&gt; — the camera, edit history and GPS a photo still carries.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/fake-recruiter-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Fake Recruiter Check&lt;/a&gt; — does this message match known scam patterns.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/email-header-analyzer?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Email Header Analyzer&lt;/a&gt; — full &lt;code&gt;Received:&lt;/code&gt; hop chain plus SPF, DKIM, DMARC.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/phishing-analyzer?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Phishing &amp;amp; BEC Email Analyzer&lt;/a&gt; — scored for payment-redirect patterns.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/dns-security-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;DNS Email-Security Check&lt;/a&gt; — more below.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/breach-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Data-Breach &amp;amp; Exposure Check&lt;/a&gt; — does this address appear in known breaches.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/cert-subdomain-finder?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Certificate-Transparency Subdomain Finder&lt;/a&gt; — subdomains from public CT logs. No scanning, no traffic to the target.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/prompt-injection-tester?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Prompt-Injection &amp;amp; System-Prompt-Leak Tester&lt;/a&gt; — test your own system prompt against the OWASP LLM Top 10.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/username-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Username Checker&lt;/a&gt; — does this handle exist.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/security-headers-grader?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Security Headers Grader&lt;/a&gt; — CSP, HSTS, framing, nosniff.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/ssl-certificate-checker?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;SSL/TLS Certificate Checker&lt;/a&gt; — issuer, SANs, expiry, chain, negotiated version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SEO &amp;amp; marketing (2 free)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/ai-access-checker?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;AI-Access Checker&lt;/a&gt; — which AI crawlers your &lt;code&gt;robots.txt&lt;/code&gt; allows, whether you have an &lt;code&gt;llms.txt&lt;/code&gt;, whether your content is trapped behind JS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/og-preview-checker?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Open Graph / Social Preview Checker&lt;/a&gt; — OG and Twitter Card tags plus a rendered preview.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Utilities (1 free)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pigfox.com/redirect-chain-tracer?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=freelist" rel="noopener noreferrer"&gt;Redirect Chain Tracer&lt;/a&gt; — every hop, with HTTPS→HTTP downgrades, loops and meta-refresh flagged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full index including the paid tools: &lt;strong&gt;&lt;a href="https://pigfox.com/tools?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=toolindex" rel="noopener noreferrer"&gt;pigfox.com/tools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The one tool I use every week
&lt;/h2&gt;

&lt;p&gt;SPF allows a maximum of &lt;strong&gt;10 DNS lookups&lt;/strong&gt; during evaluation. Blow past it and the record fails — silently, from the sender's side. Most orgs find out when a quarter of their mail lands in spam.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pigfox.com/dns-security-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=spf-deepdive" rel="noopener noreferrer"&gt;DNS Email-Security Check&lt;/a&gt; counts the lookups and shows you where you sit against the ceiling. It parses DMARC properly (&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;pct&lt;/code&gt;, &lt;code&gt;rua&lt;/code&gt;, &lt;code&gt;sp&lt;/code&gt; — subdomain policy is the one everybody forgets), auto-probes common DKIM selectors instead of making you guess them, pulls MX, and returns a plain-language deliverability verdict instead of a wall of TXT records.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go monolith.&lt;/strong&gt; One binary, &lt;code&gt;html/template&lt;/code&gt; server-side, no SPA. Registry-driven, so adding a tool is a struct plus a handler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for everything, including the credit ledger behind the metered tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;River&lt;/strong&gt; for background jobs. Periodic jobs, not cron.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solidity + Foundry&lt;/strong&gt; for the contracts; Slither and Echidna in the loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; for hosting, &lt;strong&gt;Playwright&lt;/strong&gt; for E2E — including against the live chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Magic-link auth&lt;/strong&gt; and &lt;strong&gt;Cloudflare Turnstile&lt;/strong&gt;. Nobody needs another password.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unglamorous recent work, since this is a developer audience: burned a &lt;code&gt;golangci-lint&lt;/code&gt; backlog from 840 findings to zero, moved every template off &lt;code&gt;text/template&lt;/code&gt; to &lt;code&gt;html/template&lt;/code&gt; (a real P1 XSS), put CSP into enforce mode, and rotated a deployer key after pasting it somewhere it shouldn't have gone. That last one is the most useful thing in this post: assume you will do it too, and have the rotation path ready before you need it.&lt;/p&gt;




&lt;p&gt;Try the &lt;a href="https://pigfox.com/demos?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=cta-demo" rel="noopener noreferrer"&gt;ZK Escrow Explorer&lt;/a&gt; and open one of the settlements in a block explorer. Then run &lt;a href="https://pigfox.com/dns-security-check?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zk-arbiter-2026-07&amp;amp;utm_content=cta-dns" rel="noopener noreferrer"&gt;DNS Email-Security Check&lt;/a&gt; against your own domain.&lt;/p&gt;

&lt;p&gt;Feedback, bug reports, and "this tool is wrong about my domain" all welcome — that last one especially.&lt;/p&gt;

</description>
      <category>go</category>
      <category>blockchain</category>
      <category>security</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a Go App That Scores Business Ideas Before You Waste Months Building Them</title>
      <dc:creator>Peter Sjolin</dc:creator>
      <pubDate>Wed, 03 Jun 2026 20:00:22 +0000</pubDate>
      <link>https://dev.to/pigfox/i-built-a-go-app-that-scores-business-ideas-before-you-waste-months-building-them-57l4</link>
      <guid>https://dev.to/pigfox/i-built-a-go-app-that-scores-business-ideas-before-you-waste-months-building-them-57l4</guid>
      <description>&lt;p&gt;Developers are very good at building.&lt;/p&gt;

&lt;p&gt;The problem is that we often build before we know whether the idea is worth building.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://marketverdict.app/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=build_in_public_2026" rel="noopener noreferrer"&gt;Market Verdict&lt;/a&gt; because I needed it myself.&lt;/p&gt;

&lt;p&gt;I could not get the kind of job I wanted, so I started looking seriously at a career pivot. But even as a veteran coder, I had a hard time figuring out what was realistic.&lt;/p&gt;

&lt;p&gt;Should I build a SaaS?&lt;/p&gt;

&lt;p&gt;Should I create a product?&lt;/p&gt;

&lt;p&gt;Should I start a service business?&lt;/p&gt;

&lt;p&gt;Should I focus on AI, local businesses, SEO, automation, or something else?&lt;/p&gt;

&lt;p&gt;I did not need generic motivation.&lt;/p&gt;

&lt;p&gt;I needed something that could look at an idea and help me judge whether it had a realistic path forward.&lt;/p&gt;

&lt;p&gt;That is how Market Verdict was born.&lt;/p&gt;

&lt;p&gt;I wanted a tool that could take a business idea and return a structured, practical analysis before I spent months building the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Market Verdict does
&lt;/h2&gt;

&lt;p&gt;Market Verdict analyzes a business idea and returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A viability score&lt;/li&gt;
&lt;li&gt;Market signals&lt;/li&gt;
&lt;li&gt;Competitor signals&lt;/li&gt;
&lt;li&gt;Risk factors&lt;/li&gt;
&lt;li&gt;Break-even estimate&lt;/li&gt;
&lt;li&gt;Suggested pivots&lt;/li&gt;
&lt;li&gt;Execution plan&lt;/li&gt;
&lt;li&gt;Saved idea history&lt;/li&gt;
&lt;li&gt;Exportable reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to magically predict the future.&lt;/p&gt;

&lt;p&gt;The goal is to reduce bad guesses.&lt;/p&gt;

&lt;p&gt;Most business ideas fail because the founder starts with enthusiasm but not enough evidence. Market Verdict is meant to slow that process down just enough to ask better questions before committing serious time and money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it in Go
&lt;/h2&gt;

&lt;p&gt;The backend is written in Go.&lt;/p&gt;

&lt;p&gt;I chose Go because I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast server-side rendering&lt;/li&gt;
&lt;li&gt;Simple deployment&lt;/li&gt;
&lt;li&gt;Strong standard library&lt;/li&gt;
&lt;li&gt;Easy concurrency&lt;/li&gt;
&lt;li&gt;Clean HTTP handlers&lt;/li&gt;
&lt;li&gt;Predictable performance&lt;/li&gt;
&lt;li&gt;Low operational complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another major reason was goroutines.&lt;/p&gt;

&lt;p&gt;A lot of the system depends on background work. Goroutines are a natural fit for that.&lt;/p&gt;

&lt;p&gt;I use them for background processes, automation, long-tail SEO workflows, and other jobs that need to run without blocking the main user experience.&lt;/p&gt;

&lt;p&gt;For example, I have built systems around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-generated blog content&lt;/li&gt;
&lt;li&gt;Long-tail SEO pages&lt;/li&gt;
&lt;li&gt;Background processing&lt;/li&gt;
&lt;li&gt;Internal automation&lt;/li&gt;
&lt;li&gt;Scheduled content workflows&lt;/li&gt;
&lt;li&gt;Search-oriented landing pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, I have generated nearly &lt;strong&gt;50,000 URLs with unique content&lt;/strong&gt; as part of the broader Market Verdict SEO system.&lt;/p&gt;

&lt;p&gt;That kind of background workload is one of the reasons Go fits the project well.&lt;/p&gt;

&lt;p&gt;The app uses a traditional web architecture instead of a heavy frontend framework. The frontend is mostly server-rendered HTML with HTMX and vanilla JavaScript where needed.&lt;/p&gt;

&lt;p&gt;That keeps the product fast, simple, and easier to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;The current stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go backend&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;HTMX&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;li&gt;HTML templates&lt;/li&gt;
&lt;li&gt;Stripe for payments&lt;/li&gt;
&lt;li&gt;Magic-link authentication&lt;/li&gt;
&lt;li&gt;Server-side sessions&lt;/li&gt;
&lt;li&gt;PDF and TXT exports&lt;/li&gt;
&lt;li&gt;Docker-based local development&lt;/li&gt;
&lt;li&gt;Render deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted the app to feel lightweight but still behave like a real SaaS product.&lt;/p&gt;

&lt;p&gt;That meant adding the less glamorous parts too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth&lt;/li&gt;
&lt;li&gt;Payment flow&lt;/li&gt;
&lt;li&gt;Saved ideas&lt;/li&gt;
&lt;li&gt;User limits&lt;/li&gt;
&lt;li&gt;Free analysis tracking&lt;/li&gt;
&lt;li&gt;Export routes&lt;/li&gt;
&lt;li&gt;Tests&lt;/li&gt;
&lt;li&gt;Error pages&lt;/li&gt;
&lt;li&gt;Privacy and terms pages&lt;/li&gt;
&lt;li&gt;Sitemap and robots files&lt;/li&gt;
&lt;li&gt;Basic abuse prevention&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing the product seriously
&lt;/h2&gt;

&lt;p&gt;One thing I did not want was a fragile demo.&lt;/p&gt;

&lt;p&gt;Market Verdict has more than &lt;strong&gt;90% unit test coverage&lt;/strong&gt; and close to &lt;strong&gt;300 Playwright tests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Playwright tests cover the actual user flows, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Magic-link auth&lt;/li&gt;
&lt;li&gt;Idea submission&lt;/li&gt;
&lt;li&gt;Analysis generation&lt;/li&gt;
&lt;li&gt;Saved ideas&lt;/li&gt;
&lt;li&gt;Payment-related routes&lt;/li&gt;
&lt;li&gt;Export routes&lt;/li&gt;
&lt;li&gt;Error states&lt;/li&gt;
&lt;li&gt;Public pages&lt;/li&gt;
&lt;li&gt;Auth-gated pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a SaaS product, especially one with payments and authentication, the boring parts matter.&lt;/p&gt;

&lt;p&gt;It is not enough for the main feature to work once on your machine.&lt;/p&gt;

&lt;p&gt;The full user flow has to keep working after changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part: scoring without pretending to be magic
&lt;/h2&gt;

&lt;p&gt;One of the hardest parts was deciding how to score an idea.&lt;/p&gt;

&lt;p&gt;A business idea is not like a math problem where there is one correct answer.&lt;/p&gt;

&lt;p&gt;So the score has to be useful without pretending to be absolute truth.&lt;/p&gt;

&lt;p&gt;The approach I took was to combine multiple signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How clear the idea is&lt;/li&gt;
&lt;li&gt;Who the customer is&lt;/li&gt;
&lt;li&gt;Whether the problem is painful&lt;/li&gt;
&lt;li&gt;Whether competitors already exist&lt;/li&gt;
&lt;li&gt;Whether there is obvious demand&lt;/li&gt;
&lt;li&gt;Whether the business can plausibly make money&lt;/li&gt;
&lt;li&gt;Whether the execution path is realistic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The score is useful only when paired with the explanation.&lt;/p&gt;

&lt;p&gt;A number by itself is not enough.&lt;/p&gt;

&lt;p&gt;A good analysis should tell the user:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This might work, but here are the weak spots.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This idea is too broad. Narrow the audience and test a smaller version first.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the real value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I avoided making it just another chatbot
&lt;/h2&gt;

&lt;p&gt;A user could technically ask an AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is my business idea good?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the answer will usually be too broad unless the user knows exactly what to ask.&lt;/p&gt;

&lt;p&gt;Market Verdict is designed to produce a structured answer every time.&lt;/p&gt;

&lt;p&gt;Instead of an open-ended chat, the app gives users a repeatable report format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;li&gt;Score&lt;/li&gt;
&lt;li&gt;Market analysis&lt;/li&gt;
&lt;li&gt;Competitor context&lt;/li&gt;
&lt;li&gt;Revenue assumptions&lt;/li&gt;
&lt;li&gt;Risks&lt;/li&gt;
&lt;li&gt;Suggested next steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes it more useful for comparing multiple ideas.&lt;/p&gt;

&lt;p&gt;It also helps non-technical founders who do not want to engineer prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building it
&lt;/h2&gt;

&lt;p&gt;A few lessons stood out.&lt;/p&gt;

&lt;p&gt;First, people do not just want “AI output.”&lt;/p&gt;

&lt;p&gt;They want decisions.&lt;/p&gt;

&lt;p&gt;A wall of text is less useful than a clear recommendation, a score, and next steps.&lt;/p&gt;

&lt;p&gt;Second, business validation needs to be specific.&lt;/p&gt;

&lt;p&gt;“Start a coffee shop” is not enough.&lt;/p&gt;

&lt;p&gt;“Start a coffee shop near a university with late-night study hours and subscription coffee plans” is much more useful to analyze.&lt;/p&gt;

&lt;p&gt;Third, simple UX matters.&lt;/p&gt;

&lt;p&gt;The app needs to feel like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter idea&lt;/li&gt;
&lt;li&gt;Get answer&lt;/li&gt;
&lt;li&gt;Save or export&lt;/li&gt;
&lt;li&gt;Improve the idea&lt;/li&gt;
&lt;li&gt;Try again&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anything more complicated creates friction.&lt;/p&gt;

&lt;p&gt;Fourth, distribution matters as much as code.&lt;/p&gt;

&lt;p&gt;Building the product is only one part of the work.&lt;/p&gt;

&lt;p&gt;The rest is SEO, content, testing, onboarding, pricing, positioning, and trust.&lt;/p&gt;

&lt;p&gt;That is why I have also invested in long-tail SEO, automated content workflows, and thousands of targeted pages designed around specific business questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current monetization model
&lt;/h2&gt;

&lt;p&gt;Market Verdict currently has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 free analyses per email&lt;/li&gt;
&lt;li&gt;A single paid analysis option&lt;/li&gt;
&lt;li&gt;A monthly subscription option&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I added the free tier because users need to see value before paying.&lt;/p&gt;

&lt;p&gt;I added single purchase because not everyone wants a subscription.&lt;/p&gt;

&lt;p&gt;I added subscription because some users will want to test many ideas over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would improve next
&lt;/h2&gt;

&lt;p&gt;The next areas I am thinking about are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better competitor discovery&lt;/li&gt;
&lt;li&gt;More local market signals&lt;/li&gt;
&lt;li&gt;More industry-specific scoring&lt;/li&gt;
&lt;li&gt;Better reports for investors&lt;/li&gt;
&lt;li&gt;Business idea comparison&lt;/li&gt;
&lt;li&gt;More language support&lt;/li&gt;
&lt;li&gt;Deeper execution plans&lt;/li&gt;
&lt;li&gt;More realistic revenue modeling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest challenge is making the analysis more factual without making the product slow or expensive to run.&lt;/p&gt;

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

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketverdict.app/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=build_in_public_2026" rel="noopener noreferrer"&gt;https://marketverdict.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would be interested in feedback from other developers, founders, and people building SaaS products.&lt;/p&gt;

&lt;p&gt;The question I am trying to answer is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a structured validation tool help people avoid wasting months on weak business ideas?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>startup</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
