<?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: Joshua</title>
    <description>The latest articles on DEV Community by Joshua (@keepdotcoffee).</description>
    <link>https://dev.to/keepdotcoffee</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%2F4009070%2F1c62cf37-1e95-4862-b0af-b6f9db685ff7.png</url>
      <title>DEV Community: Joshua</title>
      <link>https://dev.to/keepdotcoffee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/keepdotcoffee"/>
    <language>en</language>
    <item>
      <title>Introducing Keepedia — a community encyclopedia for AI builders</title>
      <dc:creator>Joshua</dc:creator>
      <pubDate>Thu, 09 Jul 2026 03:52:39 +0000</pubDate>
      <link>https://dev.to/keepdotcoffee/introducing-keepedia-a-community-encyclopedia-for-ai-builders-1dmp</link>
      <guid>https://dev.to/keepdotcoffee/introducing-keepedia-a-community-encyclopedia-for-ai-builders-1dmp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focoot7w8wctjppr8uj9i.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focoot7w8wctjppr8uj9i.webp" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
A community encyclopedia of AI-builder projects — before they raise.&lt;/p&gt;

&lt;p&gt;Most AI builders are invisible until the day they launch a token.&lt;/p&gt;

&lt;p&gt;There’s the launch-day thread, the price chart, the rush — and before all of that, months of quiet, real work that almost no one can see. If you’re building, there’s no neutral place to put yourself on the map early. If you’re looking for what’s being built, there’s no map to read.&lt;/p&gt;

&lt;p&gt;We think that’s backwards. The interesting part isn’t the launch. It’s everything that leads up to it. So we built Keepedia — a community-maintained encyclopedia of AI-builder projects. It’s live now at keep.coffee/keepedia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wikipedia, but for projects&lt;/strong&gt;&lt;br&gt;
A Keepedia page is a public profile for a project: what it is, who’s building it, links, milestones, screenshots, a demo video. Like Wikipedia, anyone can start a page and anyone can improve one — and every edit is recorded, so the history is always there to check.&lt;/p&gt;

&lt;p&gt;Become a Medium member&lt;br&gt;
You don’t need a wallet to read. You don’t need permission to contribute. And no project pays to be listed or ranked — there are no featured slots and no paid placement, and there never will be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claim yours, prove who you are&lt;/strong&gt;&lt;br&gt;
Open contribution is the start, not the end. The value comes from projects claiming their own page and proving who they are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claim with X.&lt;/strong&gt; The builder verifies control of the project’s official X account with a public post. Once claimed, only that wallet can edit the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify your website&lt;/strong&gt;. Add a link back from your official domain and we confirm it — a second checkmark that’s much harder to fake than an X handle alone.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more a project has proven, the higher it ranks. A page that’s website-verified sits above one that’s only X-claimed, which sits above an anonymous stub. Verification costs something real to obtain, which is exactly why it’s the thing we rank on — not edit recency, not vote counts, not anything you can farm for free. Prove who you are, and you rise. Stay anonymous, and you sink.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the community adds&lt;/strong&gt;&lt;br&gt;
Once a project has a page, the people around it can weigh in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A crowdsourced valuation.&lt;/strong&gt; One wallet, one estimate, with a reason attached. We show the community’s median — as a signal of what people think a project might be worth, not a price and not advice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Estimates from verified reviewers.&lt;/strong&gt; Operators, investors and researchers who’ve verified their identity can be recognized as reviewers, and their estimates show by name, next to their reasoning — their word riding on their own reputation, in public.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Discussion, milestones and media.&lt;/strong&gt; Wallet-signed comments, progress a verified team can post, and screenshots or a demo video hosted on the project’s page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of it is an endorsement by us. Keepedia is a place for the community to build a shared, honest record — not a leaderboard we curate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why we built it&lt;/strong&gt;&lt;br&gt;
Keep is onchain fundraising for AI builders — a way to raise from the people who’d actually use what you’re building, without touching anyone’s money along the way. But fundraising is only the wedge.&lt;/p&gt;

&lt;p&gt;Fundraising is the wedge. Discovery is the platform.&lt;/p&gt;

&lt;p&gt;The lasting thing isn’t any single raise. It’s the map underneath: who’s building, who’s credible, who backed whom, and how it turned out. That map can’t be bought or gamed into existence — it has to be earned, one verified project and one honest track record at a time. Keepedia is where it starts to form.&lt;/p&gt;

&lt;p&gt;When a project is ready to raise, Keep does that part too: backers pay the contract directly, the token is tradable the moment the raise settles, and if the raise doesn’t work out, the contract refunds the backers automatically. But a project doesn’t have to be raising to have a home here. It just has to be real, and be willing to show it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add yours&lt;/strong&gt;&lt;br&gt;
Keepedia is early, and it grows the way any encyclopedia does — one page at a time, from the people closest to the work.&lt;/p&gt;

&lt;p&gt;Add a project you think deserves to be found. Or claim your own and put it on the map: keep.coffee/keepedia.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>reviews</category>
      <category>startup</category>
    </item>
    <item>
      <title>I built a fundraising platform for indie devs — where backers get their money back if it flops</title>
      <dc:creator>Joshua</dc:creator>
      <pubDate>Tue, 30 Jun 2026 07:54:41 +0000</pubDate>
      <link>https://dev.to/keepdotcoffee/i-built-a-fundraising-platform-for-indie-devs-where-backers-get-their-money-back-if-it-flops-4of1</link>
      <guid>https://dev.to/keepdotcoffee/i-built-a-fundraising-platform-for-indie-devs-where-backers-get-their-money-back-if-it-flops-4of1</guid>
      <description>&lt;p&gt;&lt;em&gt;Refundable, non-custodial onchain fundraising on Solana — built for small teams and independent builders.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Raising money as a small team or a solo dev usually comes down to two bad options: chase VCs who want a board seat, or run a token sale where your backers eat the entire downside if it flops. I wanted a third one — so I built &lt;strong&gt;Keep&lt;/strong&gt;, a way for independent builders to raise from their own users, where a raise that &lt;strong&gt;fails refunds its backers automatically, from the protocol itself.&lt;/strong&gt; No company holds the money, and no human decides whether you get paid.&lt;/p&gt;

&lt;p&gt;This post is the engineering teardown: how that refund actually works, why the incentives hold, and the parts that were genuinely hard to build. Every on-chain read below is something you can verify yourself with &lt;a href="https://www.npmjs.com/package/@keep-coffee/sdk" rel="noopener noreferrer"&gt;&lt;code&gt;@keep-coffee/sdk&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup: a fixed-price raise, then a real market
&lt;/h2&gt;

&lt;p&gt;A builder opens a raise against a fixed USDC target. Backers &lt;code&gt;back&lt;/code&gt; the raise at a fixed price during the fundraising window. The token supply is split up front:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;60% to backers&lt;/strong&gt;, distributed at the fixed price&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30% seeded into a Raydium pool&lt;/strong&gt; when the raise fills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10% to the founder&lt;/strong&gt;, success-path vesting only (180 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the target is hit, the protocol bootstraps a Raydium CPMM pool with &lt;strong&gt;half the raised USDC + the 30% token allocation&lt;/strong&gt;, and keeps &lt;strong&gt;the other half of the USDC as a reserve&lt;/strong&gt;. From that moment the token trades on the open market like any other. Two judgments follow — at day 7 and day 30 — each comparing a &lt;strong&gt;1-hour TWAP&lt;/strong&gt; against a per-project success gate (default &lt;strong&gt;0.85× the launch price&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Everything after this branches on one question: did the market hold the gate?&lt;/p&gt;

&lt;h2&gt;
  
  
  Success: it's just an open market
&lt;/h2&gt;

&lt;p&gt;If the day-30 TWAP clears the gate, the raise &lt;strong&gt;succeeds&lt;/strong&gt;: the reserve pays the platform fee and the project's funding, and &lt;strong&gt;100% of the LP is locked forever&lt;/strong&gt;. There is no refund on a successful raise — it graduated into a normal market, and a normal market is not principal-protected. That distinction matters and we keep it sharp everywhere: the refund is a &lt;em&gt;failure backstop&lt;/em&gt;, not a money-back guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure: the refund funds itself
&lt;/h2&gt;

&lt;p&gt;If the gate fails (at day 7 or day 30), the protocol does something most launchpads can't, because they never kept the money on-chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unwind 100% of the LP.&lt;/strong&gt; The pool is dissolved back to the protocol — USDC on one side, project tokens on the other. The returned project tokens are &lt;strong&gt;burned&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seed a ClaimPool.&lt;/strong&gt; The recovered USDC (plus the untouched reserve, net of a time-decay haircut) becomes a refund pool for the holders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burn-to-claim.&lt;/strong&gt; A backer burns their tokens and receives USDC pro-rata from the pool. The protocol's only cut is a time-decay &lt;strong&gt;haircut — 5% on a day-7 failure, 15% on day-30&lt;/strong&gt; — paid to the platform and project, never to a custodian. A raise that fails near the gate returns close to the full raise minus the haircut; a deeper failure recovers less USDC overall — but the holders who stayed split all of it (see below).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No custody. No "we'll process your refund." The USDC that refunds you is the USDC the pool gave back, moved by the program under its own authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that makes the incentives hold
&lt;/h2&gt;

&lt;p&gt;Here's the design decision we're proudest of. When a raise fails, the refund pool is split only among the tokens that are &lt;strong&gt;still held&lt;/strong&gt; — not the full supply. Tokens that were &lt;strong&gt;dumped during the hold period don't count toward it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So the backers who held (and the arbitrageurs who bought the dumped tokens cheap) split the &lt;strong&gt;entire&lt;/strong&gt; refund pool among themselves. A backer who panic-sold into the decline already took their USDC out at the market price, and &lt;strong&gt;forfeits their share of the refund&lt;/strong&gt; to the people still holding.&lt;/p&gt;

&lt;p&gt;This flips the usual failure dynamic. In a normal token, dumping early is the rational move and holders are left bag-holding. Here, &lt;strong&gt;dumping is self-defeating&lt;/strong&gt;: you trade a near-full refund for a fire-sale price, and you hand your refund share to whoever stayed. The mechanism pays the patient — and it does it without anyone choosing who deserves it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the gate is a TWAP, and why 0.85
&lt;/h2&gt;

&lt;p&gt;Two non-obvious choices:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time-weighted, not spot.&lt;/strong&gt; The judgment reads a 1-hour TWAP, not the instantaneous price. A single-transaction spike — a flash-loan pump or a last-second wick — moves a cumulative-price average by ~0, so you can't fake the verdict atomically. Faking a &lt;em&gt;sustained&lt;/em&gt; price means burning real capital against arbitrage for an hour. The window has to &lt;strong&gt;deter&lt;/strong&gt;, not fortress, because the manipulation is already economically weak (forcing a failure means selling the very tokens you'd need to burn for a refund).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gate equals one minus the haircut.&lt;/strong&gt; The default gate is 0.85× — exactly the day-30 refund rate. At that price a backer is &lt;em&gt;indifferent&lt;/em&gt; between holding the token and taking the failure refund. Below it, the refund is strictly better, so the protocol must not declare success there. Pinning the gate to the haircut makes that an on-chain invariant rather than a tuned guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parts that were genuinely hard
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The 4 KB stack frame.&lt;/strong&gt; Solana's SBF runtime caps the per-instruction stack at 4 KB. Creating the launchpad, the mint, two vaults, and minting the supply in one instruction blew the frame (undefined behavior that corrupted a just-deserialized argument). Project creation is split across &lt;code&gt;create_project&lt;/code&gt; → &lt;code&gt;init_vaults&lt;/code&gt;, and the deposit instruction stopped initializing the backer's token account inline — the caller creates it idempotently in the same transaction instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never trap the exit.&lt;/strong&gt; The emergency-freeze and the day-7/day-30 finalize are &lt;em&gt;path-aware&lt;/em&gt;: a freeze pauses success-side payouts but must never block the failure refund, because &lt;code&gt;finalize&lt;/code&gt; is the only instruction that creates the ClaimPool a refund needs. Freezing it across a hold window would lock backer refunds — so the failure branch and &lt;code&gt;claim_refund&lt;/code&gt; stay reachable even when the protocol is frozen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A failure that returns ~95%, exactly.&lt;/strong&gt; The LP unwind enforces a 95% slippage floor on each leg so a front-run can't shrink the refund pool, and the ClaimPool quote drains to integer-division dust rather than stranding USDC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honesty (the part most posts skip)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Non-custodial.&lt;/strong&gt; Backers pay the on-chain program directly. The protocol never holds or moves your money on a balance sheet; the refund is the reserve and the unwound LP, moved by code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refundable only on the failure paths.&lt;/strong&gt; If a raise doesn't fill, every backer is refunded in full. If it fills and then fails its price check, the contract refunds automatically from the mechanism, with a 5% (day-7) / 15% (day-30) haircut — the realized amount depends on recovered liquidity and how many holders stayed. A &lt;em&gt;successful&lt;/em&gt; raise is an open market — not protected, not a guarantee. Buying on that open market afterward carries no refund at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify it yourself.&lt;/strong&gt; Don't take this post's word for it — read the launchpad and ClaimPool state straight from the chain (the SDK's &lt;code&gt;getRaise&lt;/code&gt; / &lt;code&gt;getClaimPool&lt;/code&gt; decode them right out of the account bytes) and check the rules against what's claimed here.&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @keep-coffee/sdk @solana/web3.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@solana/web3.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KeepClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@keep-coffee/sdk&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;keep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KeepClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mainnet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;connection&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;Connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;RPC&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;raise&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;keep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRaise&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="c1"&gt;// decode a live raise from chain&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pool&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;keep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getClaimPool&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="c1"&gt;// null unless it failed a gate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK is MIT and non-custodial — every write returns an unsigned transaction you sign yourself. Source: &lt;a href="https://github.com/keep-coffee/keep-sdk" rel="noopener noreferrer"&gt;github.com/keep-coffee/keep-sdk&lt;/a&gt;. It's built for AI builders and agents; a LangChain tool example ships in the repo.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>typescript</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
