<?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: Mr Zack</title>
    <description>The latest articles on DEV Community by Mr Zack (@tactful_anvil).</description>
    <link>https://dev.to/tactful_anvil</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%2F4073833%2F554e6257-7bf5-41c3-a0e1-15f1d0e45abe.png</url>
      <title>DEV Community: Mr Zack</title>
      <link>https://dev.to/tactful_anvil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tactful_anvil"/>
    <language>en</language>
    <item>
      <title>Immunefi lists $150M+ in bug bounties. The board doesn't tell you which ones are worth your weekend</title>
      <dc:creator>Mr Zack</dc:creator>
      <pubDate>Wed, 12 Aug 2026 00:37:46 +0000</pubDate>
      <link>https://dev.to/tactful_anvil/immunefi-lists-150m-in-bug-bounties-the-board-doesnt-tell-you-which-ones-are-worth-your-weekend-1i8l</link>
      <guid>https://dev.to/tactful_anvil/immunefi-lists-150m-in-bug-bounties-the-board-doesnt-tell-you-which-ones-are-worth-your-weekend-1i8l</guid>
      <description>&lt;p&gt;Immunefi's board lists ~190 bug bounty programs and ~60 audit competitions, with top bounties up to &lt;strong&gt;$15,000,000&lt;/strong&gt; (LayerZero). If you hunt Web3 bugs, you've scrolled it. And you've probably noticed the sort order: by vault TVL. That's a fine number for Immunefi to showcase — it's just not &lt;em&gt;your&lt;/em&gt; number.&lt;/p&gt;

&lt;p&gt;Your number is: &lt;strong&gt;how much friction stands between me and getting paid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the board hides the expensive part in each program's fine print:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KYC required?&lt;/strong&gt; Excludes anonymous researchers entirely. On today's data: 132 of 248 programs require it, 116 don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-to-submit fee?&lt;/strong&gt; Some programs charge USDC just to file a report. 30 programs do; most researchers find out at submit time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof of concept:&lt;/strong&gt; "not required" vs "required" vs "runnable" is the difference between an evening and a week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invite-only?&lt;/strong&gt; You can't even join.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparing that across 248 programs means opening 248 pages. So I scraped it — the data is all public, HTTP-only, no login.&lt;/p&gt;

&lt;h2&gt;
  
  
  One row per program
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/tactful_anvil/immunefi-bug-bounty-audit-competition-scraper" rel="noopener noreferrer"&gt;Immunefi Bug Bounty &amp;amp; Audit Competition Scraper&lt;/a&gt; pulls both boards in ~5 seconds and computes two scores per program:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;frictionScore&lt;/code&gt; (0–100, lower = easier to get paid):&lt;/strong&gt; KYC 35%, pay-to-submit fee 25%, PoC requirement 25%, invite-only 15%. Normalized over what the program actually publishes — unknown fields don't fake a score.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;opportunityScore&lt;/code&gt; (0–100, "worth my weekend?"):&lt;/strong&gt; bounty size 45% (log-scaled — bounties span four orders of magnitude), low friction 25%, program upkeep 15% (freshly updated = actually maintained), payout assurance 15% (funded vault + Safe Harbor + Immunefi Standard).&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;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sky"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"board"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bug-bounty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxBountyUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kycRequired"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payToSubmit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proofOfConceptType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inviteOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"frictionScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"daysSinceUpdate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;21.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;"opportunityScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;88.8&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;A $10M max bounty &lt;strong&gt;with no KYC and no submit fee&lt;/strong&gt; is a very different object from a $10M bounty behind KYC + $500 USDC + runnable PoC. The default board renders them identically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three queries the board can't answer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Anonymous-friendly, big money":&lt;/strong&gt; &lt;code&gt;{ "kycRequired": false, "minMaxBountyUsd": 1000000, "sortBy": "opportunity" }&lt;/code&gt; — today that's a shortlist of 16 programs, Sky's $10M at the top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Live audit competitions with a deadline":&lt;/strong&gt; competitions carry &lt;code&gt;rewardsPoolUsd&lt;/code&gt;, &lt;code&gt;endDate&lt;/code&gt; and &lt;code&gt;daysUntilEnd&lt;/code&gt; — deadline-driven work with a fixed pool, deduplicated against the bounty board.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Recently maintained only":&lt;/strong&gt; &lt;code&gt;daysSinceUpdate&lt;/code&gt; filters out programs nobody has touched in a year. A stale program page is a weak signal the triage queue is stale too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedule it
&lt;/h2&gt;

&lt;p&gt;The board changes daily (Immunefi updates program metrics every day, and competitions open/close on deadlines). One scheduled run per morning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actor page → ⋯ → &lt;strong&gt;Schedule&lt;/strong&gt;, cron &lt;code&gt;0 7 * * *&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Input: &lt;code&gt;{ "sortBy": "opportunity", "excludeInviteOnly": true }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Full run over 248 programs costs about $0.30 (pay-per-event, from $1.20/1k results).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Actor ships a typed output schema and works over MCP, so an AI agent can call it as a tool — "find me no-KYC bounties over $1M updated this month" becomes a filter, not a scraping project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fair-use note
&lt;/h2&gt;

&lt;p&gt;Everything scraped is on Immunefi's public pages — no login, no private program data, no vulnerability reports, and the Actor doesn't help you &lt;em&gt;bypass&lt;/em&gt; anything (the friction fields tell you the rules; they don't break them). Rate is one HTTP request per board per run.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://apify.com/tactful_anvil/immunefi-bug-bounty-audit-competition-scraper" rel="noopener noreferrer"&gt;https://apify.com/tactful_anvil/immunefi-bug-bounty-audit-competition-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Found a program with wrong data, or want another field (languages, ecosystems and vault balances are already in there)? Issues tab on the Actor page — parser bugs get fixed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>web3</category>
      <category>webscraping</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Most "big budget" clipping campaigns never pay. Here's how to spot them from one scrape</title>
      <dc:creator>Mr Zack</dc:creator>
      <pubDate>Wed, 12 Aug 2026 00:17:25 +0000</pubDate>
      <link>https://dev.to/tactful_anvil/most-big-budget-clipping-campaigns-never-pay-heres-how-to-spot-them-from-one-scrape-2ip0</link>
      <guid>https://dev.to/tactful_anvil/most-big-budget-clipping-campaigns-never-pay-heres-how-to-spot-them-from-one-scrape-2ip0</guid>
      <description>&lt;p&gt;If you clip short-form video for money, you know Whop Content Rewards: hundreds of live campaigns paying $0.15–$20 per 1,000 views. The discover page lets you sort by budget. That sort is quietly costing you nights of work.&lt;/p&gt;

&lt;p&gt;Here's the number that changed how I pick campaigns: &lt;strong&gt;on the live board right now, 21% of active campaigns have never paid out a single cent.&lt;/strong&gt; Big banner budget, $0 actually spent. A "$30,000 budget" campaign that has paid nobody in three weeks is not a $30,000 opportunity — it's a landing page.&lt;/p&gt;

&lt;p&gt;The problem: the board doesn't show you payout speed. You can see &lt;code&gt;budget&lt;/code&gt; and &lt;code&gt;budget left&lt;/code&gt;, but not &lt;em&gt;how fast the money is actually moving&lt;/em&gt; — and that's the only number that separates a campaign that pays from a campaign that poses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trick: the page already contains everything you need
&lt;/h2&gt;

&lt;p&gt;Every campaign card on Whop publishes three things: when it was funded, how much has been spent, and how many creators joined. From one snapshot — no monitoring, no state between runs — you can derive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dailyBurnUsd        = budgetSpent / daysSinceFunded     → is money moving?
estimatedDaysLeft   = budgetLeft / dailyBurnUsd         → will it still be there?
payoutPerCreatorUsd = budgetSpent / creators            → what did the average clipper earn?
budgetPace          = "draining" | "healthy" | "slow" | "stalled"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last field is the shortcut. On today's board of 456 campaigns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;pace&lt;/th&gt;
&lt;th&gt;meaning&lt;/th&gt;
&lt;th&gt;what to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draining&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;3 days of budget left&lt;/td&gt;
&lt;td&gt;skip — gone before your clip gains traction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;healthy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3–60 days&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;this is where you clip&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;60–180 days&lt;/td&gt;
&lt;td&gt;fine, but budget may outlive the campaign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stalled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt;180 days at current burn&lt;/td&gt;
&lt;td&gt;the "big budget" mirage — money posted, almost nobody paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;zero paid out so far&lt;/td&gt;
&lt;td&gt;unproven; could be brand new, could be dead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Real example from today: two campaigns, both showing ~$30K budget. One burns $255/day and has paid the average creator &lt;strong&gt;$75&lt;/strong&gt;. The other burns $19/day — at that rate its budget lasts &lt;em&gt;four years&lt;/em&gt;, which is a polite way of saying nobody is getting paid. On the default board they look identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  I packaged this as an Apify Actor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/tactful_anvil/whop-content-rewards-scraper" rel="noopener noreferrer"&gt;Whop Content Rewards Scraper&lt;/a&gt; pulls the full board (~456 campaigns) in about 5 seconds, HTTP-only, and computes all of the above per row, plus an &lt;code&gt;opportunityScore&lt;/code&gt; that ranks by reward rate (35%), budget headroom (25%), competition (25%) and payout velocity (15%).&lt;/p&gt;

&lt;p&gt;One honesty note, because it's the part I got wrong first: an early version of the score treated empty campaigns as "low competition" and ranked them near the top. That's backwards — a campaign nobody has joined &lt;em&gt;and&lt;/em&gt; that has never paid is not uncontested, it's &lt;strong&gt;untested&lt;/strong&gt;, and the data can't tell those apart. The current version gives no free marks for emptiness: unproven campaigns still rank, they just can't outrank a campaign that demonstrably pays. The scoring weights are documented in the README so you can argue with them.&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WINNA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rewardPerThousandViews"&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;"budgetLeftUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;11659.17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dailyBurnUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;272.67&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"estimatedDaysLeft"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42.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;"budgetPace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"healthy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payoutPerCreatorUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;75.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;"creators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;164&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"opportunityScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;71.1&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;h2&gt;
  
  
  The daily recipe
&lt;/h2&gt;

&lt;p&gt;The actual decision — "where do I clip tonight?" — as one scheduled run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Input: &lt;code&gt;{ "sortBy": "opportunity", "minEstimatedDaysLeft": 3, "minPayoutPerCreatorUsd": 5 }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Schedule it daily in Apify Console (Actor → ⋯ → Schedule; cron &lt;code&gt;0 7 * * *&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Read the top 10 rows with your coffee. Campaigns that pay real money to real creators, ranked.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A full-board run costs well under a dollar (pay-per-event, from $1.50/1k results). Once a day is plenty — the board moves daily, not by the second.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents
&lt;/h2&gt;

&lt;p&gt;The Actor ships a typed output schema and works over MCP, so an agent can answer "which clipping campaigns are actually paying right now?" by calling it as a tool and filtering &lt;code&gt;budgetPace == "healthy"&lt;/code&gt; — no scraping code inside your agent.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://apify.com/tactful_anvil/whop-content-rewards-scraper" rel="noopener noreferrer"&gt;https://apify.com/tactful_anvil/whop-content-rewards-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I clip too. This exists because I got tired of finding out a "$30K budget" was a mirage after posting to it. Bug reports and field requests: Issues tab on the Actor page.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>automation</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
