<?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: Rohit Purkait</title>
    <description>The latest articles on DEV Community by Rohit Purkait (@codeswithroh).</description>
    <link>https://dev.to/codeswithroh</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%2F740213%2Fbac29546-69e3-48c8-8300-c4fff645040e.JPG</url>
      <title>DEV Community: Rohit Purkait</title>
      <link>https://dev.to/codeswithroh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codeswithroh"/>
    <language>en</language>
    <item>
      <title>What If the Blockchain Could Judge Your Bluff Without Seeing Your Dice?</title>
      <dc:creator>Rohit Purkait</dc:creator>
      <pubDate>Wed, 19 Aug 2026 09:07:15 +0000</pubDate>
      <link>https://dev.to/codeswithroh/what-if-the-blockchain-could-judge-your-bluff-without-seeing-your-dice-28lf</link>
      <guid>https://dev.to/codeswithroh/what-if-the-blockchain-could-judge-your-bluff-without-seeing-your-dice-28lf</guid>
      <description>&lt;p&gt;Liar’s Dice sounds like a perfect game to put onchain.&lt;/p&gt;

&lt;p&gt;The rules are simple, every move can be verified, and you don’t need a centralized game server deciding who won.&lt;/p&gt;

&lt;p&gt;There is just one problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchains are public. Liar’s Dice only works if your dice are private.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I simply stored every roll inside a normal smart contract, anyone could inspect the state and know exactly what everyone was holding.&lt;/p&gt;

&lt;p&gt;At that point, there is no bluffing.&lt;/p&gt;

&lt;p&gt;You would basically be playing poker with everyone's cards face up.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;FHE Liar’s Dice&lt;/strong&gt;, a decentralized version of the game where your dice remain encrypted while the game is being played.&lt;/p&gt;

&lt;p&gt;Not hidden behind a backend.&lt;/p&gt;

&lt;p&gt;Not stored privately in some database.&lt;/p&gt;

&lt;p&gt;Encrypted onchain.&lt;/p&gt;

&lt;p&gt;And the interesting part is that the smart contract can still use those encrypted dice to determine whether you are lying.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with putting hidden-information games onchain
&lt;/h2&gt;

&lt;p&gt;Most blockchain games actually benefit from transparency.&lt;/p&gt;

&lt;p&gt;If you're building something like chess, every player is supposed to know the complete state of the board.&lt;/p&gt;

&lt;p&gt;Liar’s Dice is different.&lt;/p&gt;

&lt;p&gt;Each player starts with five dice that only they should be able to see.&lt;/p&gt;

&lt;p&gt;Players then make public claims about the combined dice across the entire table.&lt;/p&gt;

&lt;p&gt;You might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are six 4s on the table.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The next player has two choices.&lt;/p&gt;

&lt;p&gt;Raise the bid.&lt;/p&gt;

&lt;p&gt;Or call your bluff.&lt;/p&gt;

&lt;p&gt;The entire game comes from the fact that nobody knows exactly what everyone else is holding.&lt;/p&gt;

&lt;p&gt;But a traditional smart contract has the opposite property.&lt;/p&gt;

&lt;p&gt;Its state is transparent.&lt;/p&gt;

&lt;p&gt;Even if the frontend refuses to display your dice, someone can simply inspect the contract, query the state, watch events, or build their own interface.&lt;/p&gt;

&lt;p&gt;Hiding something in the UI isn't privacy.&lt;/p&gt;

&lt;p&gt;I needed the actual game state itself to remain secret.&lt;/p&gt;

&lt;h2&gt;
  
  
  FHE turned out to be a very good fit for the game
&lt;/h2&gt;

&lt;p&gt;I built the game using &lt;strong&gt;Fhenix CoFHE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Fully Homomorphic Encryption is interesting because it allows computation to happen directly over encrypted values.&lt;/p&gt;

&lt;p&gt;Normally encryption gives you privacy while data is stored, but you need to decrypt the data before doing anything useful with it.&lt;/p&gt;

&lt;p&gt;With FHE, you can keep the value encrypted and still perform computations over it.&lt;/p&gt;

&lt;p&gt;That completely changes what an onchain game can do.&lt;/p&gt;

&lt;p&gt;In FHE Liar’s Dice, the contract generates each player's dice as encrypted values.&lt;/p&gt;

&lt;p&gt;Conceptually, instead of the contract storing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[2, 6, 4, 1, 3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it stores encrypted representations of those values.&lt;/p&gt;

&lt;p&gt;No plaintext die value is written into contract storage or emitted through an event while the round is active.&lt;/p&gt;

&lt;p&gt;Only the player who owns that hand can unseal it and see what they rolled.&lt;/p&gt;

&lt;p&gt;So your opponents can't read your dice.&lt;/p&gt;

&lt;p&gt;An indexer can't read your dice.&lt;/p&gt;

&lt;p&gt;And even the application operator doesn't get the plaintext values.&lt;/p&gt;

&lt;p&gt;That gives the game something I couldn't get from a normal smart contract:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;private state with public execution.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The weird part: checking a bluff without revealing the dice
&lt;/h2&gt;

&lt;p&gt;This was the part I found most interesting while building the game.&lt;/p&gt;

&lt;p&gt;Imagine I bid:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Six 4s.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Someone calls me a liar.&lt;/p&gt;

&lt;p&gt;Now the contract needs to inspect every active player's dice and determine how many 4s actually exist.&lt;/p&gt;

&lt;p&gt;In the version of Liar’s Dice I implemented, ones are wild, so they also count toward most bids.&lt;/p&gt;

&lt;p&gt;The obvious implementation would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;decrypt all dice
count the matches
compare count &amp;gt;= bid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that defeats the entire point.&lt;/p&gt;

&lt;p&gt;Instead, the contract performs the comparison over the encrypted values themselves.&lt;/p&gt;

&lt;p&gt;It checks every encrypted die, calculates whether it matches the bid, includes wild ones where appropriate, and builds the result without revealing the underlying hands.&lt;/p&gt;

&lt;p&gt;The final thing that needs to become public is essentially one bit of information:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was the bid valid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes or no.&lt;/p&gt;

&lt;p&gt;If the true encrypted count meets the bid, the challenger loses.&lt;/p&gt;

&lt;p&gt;If it doesn't, the bidder was lying and gets eliminated.&lt;/p&gt;

&lt;p&gt;The actual count doesn't need to be revealed to reach that verdict.&lt;/p&gt;

&lt;p&gt;That distinction is small, but it is the entire architecture of the game.&lt;/p&gt;

&lt;p&gt;The chain gets enough information to enforce the rules without learning information it doesn't need.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays private and what stays public
&lt;/h2&gt;

&lt;p&gt;I didn't want to make everything private.&lt;/p&gt;

&lt;p&gt;That would remove one of the reasons to build the game onchain in the first place.&lt;/p&gt;

&lt;p&gt;So I separated the game state into two categories.&lt;/p&gt;

&lt;p&gt;Things like these are public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who joined the table&lt;/li&gt;
&lt;li&gt;turn order&lt;/li&gt;
&lt;li&gt;every bid&lt;/li&gt;
&lt;li&gt;who challenged&lt;/li&gt;
&lt;li&gt;whether the bid was valid&lt;/li&gt;
&lt;li&gt;who was eliminated&lt;/li&gt;
&lt;li&gt;the final result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The active dice are private.&lt;/p&gt;

&lt;p&gt;That creates a nice split.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The strategy stays private. The execution stays verifiable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After a challenge resolves, the hands from that round can be revealed so everyone at the table can see what actually happened.&lt;/p&gt;

&lt;p&gt;Then the surviving players receive fresh encrypted hands for the next round.&lt;/p&gt;

&lt;p&gt;The last player standing wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I didn't just use a server
&lt;/h2&gt;

&lt;p&gt;The easy version of this project would have been straightforward.&lt;/p&gt;

&lt;p&gt;Generate the dice on a backend.&lt;/p&gt;

&lt;p&gt;Send each player their own hand.&lt;/p&gt;

&lt;p&gt;Have the server determine whether every challenge succeeds.&lt;/p&gt;

&lt;p&gt;From a game-development perspective, that works perfectly fine.&lt;/p&gt;

&lt;p&gt;But then the server becomes the dealer, referee, and source of truth.&lt;/p&gt;

&lt;p&gt;It knows everybody's dice.&lt;/p&gt;

&lt;p&gt;It could theoretically alter rolls.&lt;/p&gt;

&lt;p&gt;It could leak information.&lt;/p&gt;

&lt;p&gt;And players ultimately have to trust whoever operates it.&lt;/p&gt;

&lt;p&gt;That isn't particularly interesting to me.&lt;/p&gt;

&lt;p&gt;The point of the experiment was to see whether we could remove that trusted game master without destroying the hidden-information mechanics that make Liar’s Dice fun.&lt;/p&gt;

&lt;p&gt;FHE makes that possible.&lt;/p&gt;

&lt;p&gt;The smart contract becomes the referee without becoming the omniscient dealer.&lt;/p&gt;

&lt;h2&gt;
  
  
  I also built a completely offline practice mode
&lt;/h2&gt;

&lt;p&gt;One problem with building blockchain games is that people often need to connect a wallet before they even understand what the product does.&lt;/p&gt;

&lt;p&gt;I didn't want that.&lt;/p&gt;

&lt;p&gt;So FHE Liar’s Dice also has a practice mode.&lt;/p&gt;

&lt;p&gt;It uses the same basic bluffing loop but runs locally against bots.&lt;/p&gt;

&lt;p&gt;No wallet.&lt;/p&gt;

&lt;p&gt;No blockchain transaction.&lt;/p&gt;

&lt;p&gt;No encryption.&lt;/p&gt;

&lt;p&gt;You can understand the game first, then enter the actual onchain lobby when you want to play the privacy-preserving version against other people.&lt;/p&gt;

&lt;p&gt;The distinction is intentional.&lt;/p&gt;

&lt;p&gt;There is no reason to pretend the offline version is decentralized.&lt;/p&gt;

&lt;p&gt;It exists purely as an onboarding layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The game is still intentionally simple
&lt;/h2&gt;

&lt;p&gt;The current version is a prototype.&lt;/p&gt;

&lt;p&gt;There are no wagers.&lt;/p&gt;

&lt;p&gt;No ranked mode.&lt;/p&gt;

&lt;p&gt;No tournament system.&lt;/p&gt;

&lt;p&gt;No timers.&lt;/p&gt;

&lt;p&gt;I wanted to solve the harder primitive first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you run an actual hidden-information bluffing game through a smart contract without exposing the hidden information?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once that loop works, everything else becomes product design.&lt;/p&gt;

&lt;p&gt;One known tradeoff in the current implementation is dice generation.&lt;/p&gt;

&lt;p&gt;The dice are derived using an encrypted random &lt;code&gt;uint8&lt;/code&gt;, reduced modulo six and shifted into the 1–6 range.&lt;/p&gt;

&lt;p&gt;Because 256 isn't perfectly divisible by six, there is a very small distribution bias: faces 1 through 4 appear marginally more often than 5 and 6.&lt;/p&gt;

&lt;p&gt;For a casual prototype I accepted that tradeoff and documented it rather than hiding it.&lt;/p&gt;

&lt;p&gt;The contracts are also unaudited, so this is absolutely not something I would attach real-money wagering to in its current form.&lt;/p&gt;

&lt;h2&gt;
  
  
  What building this changed for me
&lt;/h2&gt;

&lt;p&gt;Before this project, it was easy for me to think about blockchain privacy mostly in terms of private transfers or private financial positions.&lt;/p&gt;

&lt;p&gt;Building a game made the idea much more tangible.&lt;/p&gt;

&lt;p&gt;There is a huge class of applications where you don't necessarily need to hide the entire system.&lt;/p&gt;

&lt;p&gt;You need to hide &lt;strong&gt;specific pieces of state while still allowing programs to compute over them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Games are one example.&lt;/p&gt;

&lt;p&gt;Auctions are another.&lt;/p&gt;

&lt;p&gt;Voting, identity, trading strategies and many financial applications have variations of the same problem.&lt;/p&gt;

&lt;p&gt;Public blockchains are extremely good at proving that computation happened according to known rules.&lt;/p&gt;

&lt;p&gt;FHE adds another interesting possibility:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;proving that rules were followed without forcing every input involved in those rules to become public.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Liar’s Dice happens to make that idea very easy to see.&lt;/p&gt;

&lt;p&gt;You have five dice.&lt;/p&gt;

&lt;p&gt;Nobody else should know them.&lt;/p&gt;

&lt;p&gt;The contract still needs to know whether your bluff worked.&lt;/p&gt;

&lt;p&gt;And somehow both things need to be true at the same time.&lt;/p&gt;

&lt;p&gt;That is what I wanted to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try bluffing against the blockchain
&lt;/h2&gt;

&lt;p&gt;The project is live here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fhe-liars-dice.vercel.app/" rel="noopener noreferrer"&gt;https://fhe-liars-dice.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can jump into practice mode without a wallet or create an onchain table and play the FHE version with other players.&lt;/p&gt;

&lt;p&gt;The simplest description of the project is still probably the one I started with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody sees your dice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everyone sees your lies.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>fhe</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>I built TraceGate because my AI agent demo passed, but the traces told a different story</title>
      <dc:creator>Rohit Purkait</dc:creator>
      <pubDate>Sun, 26 Jul 2026 12:46:53 +0000</pubDate>
      <link>https://dev.to/codeswithroh/i-built-tracegate-because-my-ai-agent-demo-passed-but-the-traces-told-a-different-story-36c2</link>
      <guid>https://dev.to/codeswithroh/i-built-tracegate-because-my-ai-agent-demo-passed-but-the-traces-told-a-different-story-36c2</guid>
      <description>&lt;p&gt;Most AI agent demos stop at the final answer.&lt;/p&gt;

&lt;p&gt;Mine did too at first. I had a support agent that could answer a refund question, call a policy tool, and avoid a prompt-injection path. From the outside, it looked fine.&lt;/p&gt;

&lt;p&gt;Then I asked a less comfortable question: if this agent broke in production, would I actually know what happened?&lt;/p&gt;

&lt;p&gt;That question became TraceGate.&lt;/p&gt;

&lt;p&gt;TraceGate is a release gate for AI agents built with OpenTelemetry and SigNoz. It runs agent scenarios, sends telemetry to SigNoz, then checks whether the run produced enough evidence to safely ship.&lt;/p&gt;

&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%2Fy5fpsn7gwie9fl0d0qqt.png" 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%2Fy5fpsn7gwie9fl0d0qqt.png" alt="tracegate flow" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;AI agents can pass a demo while still being hard to debug.&lt;/p&gt;

&lt;p&gt;A tool can retry three times and still return a successful answer. An LLM call can happen without cost metadata. A prompt-injection test can pass, but leave no trace of which safety path was used. Those are not product failures in the usual sense. They are observability failures.&lt;/p&gt;

&lt;p&gt;That is what I wanted TraceGate to catch.&lt;/p&gt;

&lt;p&gt;The idea is simple: before an agent ships, it should satisfy an observability contract. If the contract fails, the release is blocked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What TraceGate checks
&lt;/h2&gt;

&lt;p&gt;TraceGate uses a YAML contract to describe what a safe release run should include.&lt;/p&gt;

&lt;p&gt;Here is part of the contract I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TraceGate AI Agent Release Contract&lt;/span&gt;
&lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tracegate-demo-agent&lt;/span&gt;

&lt;span class="na"&gt;budgets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;maxRunCostUsd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.005&lt;/span&gt;
  &lt;span class="na"&gt;maxP95LatencyMs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2000&lt;/span&gt;
  &lt;span class="na"&gt;maxToolRetries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;span-agent-run&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required-span&lt;/span&gt;
    &lt;span class="na"&gt;spanName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent.run&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;span-llm-call&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required-span&lt;/span&gt;
    &lt;span class="na"&gt;spanName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;llm.call&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;attr-llm-model&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required-attribute&lt;/span&gt;
    &lt;span class="na"&gt;spanName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;llm.call&lt;/span&gt;
    &lt;span class="na"&gt;attribute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gen_ai.request.model&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;retry-budget-trace-lookup&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;max-tool-retries&lt;/span&gt;
    &lt;span class="na"&gt;toolName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;trace.lookup&lt;/span&gt;
    &lt;span class="na"&gt;maxRetries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default demo intentionally fails one check. The &lt;code&gt;trace.lookup&lt;/code&gt; tool retries three times, but the contract only allows one retry.&lt;/p&gt;

&lt;p&gt;That makes the demo useful because TraceGate is not pretending everything is healthy. It blocks the release and explains why.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TraceGate FAIL
Checks: 7/8 passed
Critical failures: 1
FAIL retry-budget-trace-lookup - Worst retry count for 'trace.lookup' was 3; limit 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&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%2F1juipzv0tq3ylkvijjvj.png" 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%2F1juipzv0tq3ylkvijjvj.png" alt="tracegate overview" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;The stack is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vite
React
TypeScript
Node.js
OpenTelemetry
SigNoz
OpenAI
YAML contracts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario -&amp;gt; Agent runner -&amp;gt; OpenTelemetry -&amp;gt; SigNoz -&amp;gt; TraceGate contract evaluator -&amp;gt; Pass or block
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Node runner executes the scenario. OpenTelemetry records spans, metrics, and logs. SigNoz receives the telemetry through OTLP. TraceGate reads the run result and evaluates it against the contract.&lt;/p&gt;

&lt;p&gt;For the OpenTelemetry setup, I used the OTLP HTTP exporters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:4318&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;sdk&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;NodeSDK&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;traceExporter&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;OTLPTraceExporter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&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;endpoint&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/traces`&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;logRecordProcessor&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;BatchLogRecordProcessor&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;OTLPLogExporter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;url&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;endpoint&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/logs`&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;metricReader&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;PeriodicExportingMetricReader&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;exporter&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;OTLPMetricExporter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;url&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;endpoint&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/metrics`&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="na"&gt;exportIntervalMillis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&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;In my local setup, SigNoz received spans for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent.run
llm.call
tool.ticket.lookup
tool.policy.search
tool.trace.lookup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&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%2Fies69f0xjz598gr7o4fr.png" 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%2Fies69f0xjz598gr7o4fr.png" alt="signoz overview" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A build issue I hit
&lt;/h2&gt;

&lt;p&gt;The part that took the most debugging was the local SigNoz setup.&lt;/p&gt;

&lt;p&gt;I used Foundry to run SigNoz locally. The first time I started everything, the UI was up, but the telemetry path was not useful. The collector looked alive, but the pipeline was effectively not sending the data I expected.&lt;/p&gt;

&lt;p&gt;The issue was in the generated local configuration around the OpAMP and MCP service wiring. I patched the generated setup so the ingester pointed to the actual SigNoz service and the MCP server pointed to the SigNoz UI service. After that, the OTLP export worked and I could verify spans in ClickHouse.&lt;/p&gt;

&lt;p&gt;That was the most “real” part of the project for me. The code for the gate was straightforward compared to proving that telemetry actually reached the backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workbench
&lt;/h2&gt;

&lt;p&gt;TraceGate has a landing page and a workbench.&lt;/p&gt;

&lt;p&gt;The landing page explains the idea: ship agents only when the traces agree.&lt;/p&gt;

&lt;p&gt;The workbench shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;latest release verdict
checks passed
critical failures
cost
latency
gate matrix
failed evidence
SigNoz investigation query
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gate matrix is the part I care about most. It turns vague release confidence into specific checks.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Root agent run span: pass
LLM calls traced: pass
Model attribute present: pass
Cost attribute present: pass
Cost budget: pass
Trace lookup retry budget: fail
Refund support scenario: pass
Prompt injection scenario: pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives a reviewer a much better starting point than “the demo worked on my machine.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Judge test mode
&lt;/h2&gt;

&lt;p&gt;I also added a judge-operated test mode because I did not want the hosted app to feel like a static mockup.&lt;/p&gt;

&lt;p&gt;A judge can enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service name
scenario
tool name
retry budget
observed retries
cost
latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then TraceGate generates a new verdict.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service: checkout-agent
tool: inventory.lookup
allowed retries: 1
observed retries: 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That blocks the release.&lt;/p&gt;

&lt;p&gt;If the observed retries are changed to &lt;code&gt;0&lt;/code&gt;, the release becomes ready.&lt;/p&gt;

&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%2F8y6wq7lrub3jlviha76d.png" 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%2F8y6wq7lrub3jlviha76d.png" alt="signoz workflow" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This makes the product easier to test without asking someone to set up my whole local environment first.&lt;/p&gt;

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

&lt;p&gt;The main thing I learned is that observability is more useful when it is tied to a decision.&lt;/p&gt;

&lt;p&gt;Before this project, I mostly treated observability as something I would open after a bug. With AI agents, that feels too late. If an agent takes a risky path, skips metadata, hides cost, or retries a flaky tool several times, I want to know during release validation.&lt;/p&gt;

&lt;p&gt;The second thing I learned is that “the agent worked” is too broad. I now split it into two questions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Did the agent produce the expected outcome?
Did the agent produce enough evidence to debug that outcome?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TraceGate focuses on the second question.&lt;/p&gt;

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

&lt;p&gt;The next version should have a visual contract editor. Writing YAML is fine for a hackathon, but a team should be able to create a release gate by choosing required spans, attributes, budgets, and scenarios in the UI.&lt;/p&gt;

&lt;p&gt;I would also add GitHub Actions support. The natural place for TraceGate is in CI, where it can block an agent release before merge.&lt;/p&gt;

&lt;p&gt;The final improvement would be deeper SigNoz artifacts. Each contract should generate a matching dashboard, alert, and investigation prompt so the release gate and the debugging workflow stay connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;TraceGate started from one uncomfortable question: if my AI agent fails later, will I have the evidence to understand it?&lt;/p&gt;

&lt;p&gt;SigNoz already gives teams a strong place to inspect telemetry. TraceGate adds a release workflow on top of that telemetry.&lt;/p&gt;

&lt;p&gt;The project is small, but the idea feels useful: agents should not ship only because the final answer looked good. They should ship when their behavior is traceable enough to trust.&lt;/p&gt;

</description>
      <category>opentelemetry</category>
      <category>observability</category>
      <category>ai</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Every AI-built site looks the same, so I built a skill that locks taste before any code is written</title>
      <dc:creator>Rohit Purkait</dc:creator>
      <pubDate>Sat, 18 Jul 2026 00:40:32 +0000</pubDate>
      <link>https://dev.to/codeswithroh/every-ai-built-site-looks-the-same-so-i-built-a-skill-that-locks-taste-before-any-code-is-written-4f6d</link>
      <guid>https://dev.to/codeswithroh/every-ai-built-site-looks-the-same-so-i-built-a-skill-that-locks-taste-before-any-code-is-written-4f6d</guid>
      <description>&lt;p&gt;I build a lot of side projects with AI coding tools. Mostly Claude Code. A few months ago I noticed something that kept bugging me. Every site I shipped looked the same. Same indigo gradient. Same default font. Same rounded cards with the same soft shadow.&lt;/p&gt;

&lt;p&gt;Then I started noticing it on other people's projects too. Demo days, launch posts, screenshots on social media. The indigo gradient is everywhere. It is basically a uniform at this point.&lt;/p&gt;

&lt;p&gt;This is not really the AI's fault. When you do not give a model a design direction, it picks the average of the internet. And the average of the internet is a Tailwind starter template with an indigo gradient and Inter. The model is doing exactly what it was trained to do. The problem is that nobody told it what you actually want.&lt;/p&gt;

&lt;p&gt;So I built tastemaker. It is a skill for Claude Code, and it also works with Cursor, Windsurf, and Codex. The idea is simple: lock the design system before the AI writes a single line of UI.&lt;/p&gt;

&lt;p&gt;Full disclosure before we go further: I built this. I am a solo builder. It is free and open source under the MIT license. I am posting it here because I want honest feedback, not because I have anything to sell you. There is nothing to buy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taste first, code second
&lt;/h2&gt;

&lt;p&gt;A skill is just a folder of instructions the AI reads before it starts working. tastemaker forces a design decision step at the beginning, with real constraints, instead of letting the model improvise the look as it goes.&lt;/p&gt;

&lt;p&gt;When you start a UI project with it installed, this is what gets locked before any code exists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A palette. 5 presets, each matched to a mood. Not random hex codes. Combinations that were picked to work together.&lt;/li&gt;
&lt;li&gt;Fonts. 24 curated Google Font pairings. A display font and a body font that actually belong on the same page.&lt;/li&gt;
&lt;li&gt;Real assets. Illustrator-grade illustrations, recolored to your palette. No gray placeholder boxes. No generic stock photo energy.&lt;/li&gt;
&lt;li&gt;A logo. A constructed geometric mark, plus a full favicon set, so the tab icon is not the framework default.&lt;/li&gt;
&lt;li&gt;Motion. GSAP and ScrollTrigger wired in by default, so scroll animation is a starting point, not a TODO you never get to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not that my taste is better than yours. The point is that any taste, written down and locked, beats no taste at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part where I failed
&lt;/h2&gt;

&lt;p&gt;This is my favorite part of the story, mostly because it is embarrassing.&lt;/p&gt;

&lt;p&gt;I picked the 5 palette presets by eye. They looked good to me. I was confident. Then, because I wanted to be thorough, I wrote a small Python script to check every text-on-background combination against WCAG contrast ratios.&lt;/p&gt;

&lt;p&gt;The first run failed 2 of my 5 presets.&lt;/p&gt;

&lt;p&gt;My eyes said the palettes were fine. The math said real people would struggle to read the text. The math was right. I went back, adjusted the failing colors, and kept running the check until everything passed. All 5 presets that ship today pass that contrast check.&lt;/p&gt;

&lt;p&gt;That little story is the whole argument for the project. Taste feels subjective until you write it down and test it. Once it is written down, you can check it, fix it, and reuse it. My eyeballs were wrong 40 percent of the time. A short Python script was right every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;One command, then restart Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/codeswithroh/tastemaker ~/.claude/skills/tastemaker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is the whole setup. No API keys. No config file. No account. Restart, start a UI project, and the design system gets locked before the AI starts guessing.&lt;/p&gt;

&lt;p&gt;More details on the site: &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://tastemaker-skill.online/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;tastemaker-skill.online&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Source code: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
&lt;br&gt;
  &lt;div class="readme-overview"&gt;
&lt;br&gt;
    &lt;h2&gt;
&lt;br&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;&lt;br&gt;
      &lt;a href="https://github.com/codeswithroh" rel="noopener noreferrer"&gt;&lt;br&gt;
        codeswithroh&lt;br&gt;
      &lt;/a&gt; / &lt;a href="https://github.com/codeswithroh/tastemaker" rel="noopener noreferrer"&gt;&lt;br&gt;
        tastemaker&lt;br&gt;
      &lt;/a&gt;&lt;br&gt;
    &lt;/h2&gt;
&lt;br&gt;
    &lt;h3&gt;
&lt;br&gt;
      A Claude Code skill that grounds AI-generated UI in real reference images and a persistent per-developer taste profile, instead of generic AI-slop defaults.&lt;br&gt;
    &lt;/h3&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="ltag-github-body"&gt;
&lt;br&gt;
    

&lt;div id="readme" class="md"&gt;&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/codeswithroh/tastemaker/.github/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fcodeswithroh%2Ftastemaker%2FHEAD%2F.github%2Fassets%2Fbanner.svg" alt="tastemaker" width="100%"&gt;&lt;/a&gt;
  &lt;p&gt;
    &lt;a href="https://github.com/codeswithroh/tastemaker/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/55d226870f5f6073e7e89152f835e2f9408d7a17571e2da5572c89b153e803d6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d3334443339393f7374796c653d666c61742d737175617265" alt="MIT License"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/codeswithroh/tastemaker/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/429513393d9a082cb7422cf517c1238b0c5dab86cea135bde9041fc784c60427/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f636f64657377697468726f682f74617374656d616b65723f7374796c653d666c61742d73717561726526636f6c6f723d333444333939266c6162656c3d7374617273" alt="Stars"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/codeswithroh/tastemaker/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c303fb350e3b9ca60df4cb74e20e8380edb106e2cd82361cc09cfce892b6fe0c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d3034373835373f7374796c653d666c61742d737175617265" alt="PRs welcome"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6a6efd47bf46ba77456682d3d6cb4f59ed9f8a0af08f65a1123671020c2ebf3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436c61756465253230436f64652d736b696c6c2d3334443339393f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/6a6efd47bf46ba77456682d3d6cb4f59ed9f8a0af08f65a1123671020c2ebf3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436c61756465253230436f64652d736b696c6c2d3334443339393f7374796c653d666c61742d737175617265" alt="Claude Code skill"&gt;&lt;/a&gt;
    &lt;a href="https://tastemaker-ai-skill.netlify.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e7f43dd9aba9f675224bd614673aee8da984b693d678b1e73c5031dd06e067dc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6976652d64656d6f2d3034373835373f7374796c653d666c61742d737175617265" alt="Live demo"&gt;&lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;&lt;b&gt;A skill that gives AI real design taste, so the UI it builds does not look AI-generated.&lt;/b&gt;&lt;/p&gt;
  &lt;p&gt;
    &lt;a href="https://github.com/codeswithroh/tastemaker#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
    &lt;a href="https://github.com/codeswithroh/tastemaker#why-ai-ui-all-looks-the-same" rel="noopener noreferrer"&gt;Why&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
    &lt;a href="https://github.com/codeswithroh/tastemaker#what-you-get" rel="noopener noreferrer"&gt;Features&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
    &lt;a href="https://github.com/codeswithroh/tastemaker#the-five-presets" rel="noopener noreferrer"&gt;Presets&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
    &lt;a href="https://github.com/codeswithroh/tastemaker#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
    &lt;a href="https://github.com/codeswithroh/tastemaker#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;&lt;a href="https://tastemaker-ai-skill.netlify.app" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;See it live and try the demo →&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What this is&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Tastemaker is a skill for coding agents (Claude Code, Cursor, Windsurf). You install it once and forget it. Whenever you ask your agent to build or style a UI, tastemaker steps in and gives it a real design system to work from, instead of the generic defaults every model reaches for.&lt;/p&gt;

&lt;p&gt;It is plain Markdown and small Python scripts. Everything runs on your machine. There is no hosted backend, no account, and no API key.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why AI UI all looks the same&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Ask any model to build a UI and you tend to get the same thing: an indigo to purple gradient, a soft shadow card, a generic…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/codeswithroh/tastemaker" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;A few things, in order of how much they surprised me.&lt;/p&gt;

&lt;p&gt;First, constraints make AI output better, not worse. I expected locking the palette and fonts to feel limiting. It did the opposite. The model stopped spending effort on design indecision and spent it on the actual product. The output got more interesting, not less.&lt;/p&gt;

&lt;p&gt;Second, the default look is a choice. Every time you skip the design conversation, you are choosing the average of the training data. That is still a design decision. It is just a boring one you made by accident.&lt;/p&gt;

&lt;p&gt;Third, scripts beat eyeballs. I trust my taste. My taste failed 2 out of 5 times on a basic readability check. Now I write the check first and pick the colors second, and I think that order matters more than people realize.&lt;/p&gt;

&lt;p&gt;Fourth, design debt starts at line one. Most of us treat design as a cleanup pass at the end of a project. With AI tools, the end never arrives, because there is always one more feature to generate. Deciding first is cheaper than fixing later.&lt;/p&gt;

&lt;p&gt;If you try tastemaker, tell me what broke. Feedback is genuinely welcome, in the comments here or as an issue on GitHub. And if it saves you a few hours, a star on the repo helps other people find it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>css</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Understanding Flow’s Lending Protocol Architecture</title>
      <dc:creator>Rohit Purkait</dc:creator>
      <pubDate>Fri, 12 Dec 2025 08:14:06 +0000</pubDate>
      <link>https://dev.to/codeswithroh/understanding-flows-lending-protocol-architecture-45gp</link>
      <guid>https://dev.to/codeswithroh/understanding-flows-lending-protocol-architecture-45gp</guid>
      <description>&lt;h3&gt;
  
  
  A Beginner Friendly Guide for Web3 Developers
&lt;/h3&gt;

&lt;p&gt;Lending protocols are one of the most important building blocks in decentralized finance. They let users borrow, lend, and build leveraged positions without intermediaries. Protocols like Aave and Compound defined the standard for collateralized on chain lending. Flow introduces a new approach through its Flow Credit Market (FCM) and the product built on top of it, Flow Yield Vaults (FYV).&lt;/p&gt;

&lt;p&gt;This guide explains the context behind Flow’s design, how traditional lending protocols work, and what Flow is doing differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What Is a Lending Protocol?
&lt;/h2&gt;

&lt;p&gt;A lending protocol is a smart contract system where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users deposit assets as collateral&lt;/li&gt;
&lt;li&gt;They borrow other assets against that collateral&lt;/li&gt;
&lt;li&gt;A health factor keeps the position safe&lt;/li&gt;
&lt;li&gt;Collateral is liquidated if health becomes too low&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Liquidation ensures the protocol does not end up with bad debt. But liquidation risk is one of the biggest user pain points in existing systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. How Existing Protocols Handle Liquidations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example: Aave
&lt;/h3&gt;

&lt;p&gt;A typical liquidation flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your collateral value falls&lt;/li&gt;
&lt;li&gt;A Keeper detects your unhealthy position&lt;/li&gt;
&lt;li&gt;The Keeper repays some of your debt using a flashloan&lt;/li&gt;
&lt;li&gt;The Keeper receives a large chunk of your collateral at a discount&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Problems with this approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Liquidations are large&lt;/li&gt;
&lt;li&gt;Keepers profit from user loss&lt;/li&gt;
&lt;li&gt;Liquidations can happen during brief volatility&lt;/li&gt;
&lt;li&gt;Positions can get wiped out instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This model works, but it is harsh and inefficient for users.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Flow’s Architecture: Two Layers Working Together
&lt;/h2&gt;

&lt;p&gt;Flow has two related but distinct systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Flow Credit Market (FCM)
&lt;/h3&gt;

&lt;p&gt;This is the base lending layer. It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Borrowing and collateral management&lt;/li&gt;
&lt;li&gt;Health factor logic&lt;/li&gt;
&lt;li&gt;Liquidation rules&lt;/li&gt;
&lt;li&gt;An automation framework for top ups and draw downs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FCM is similar to Aave in role, but with improvements in liquidation mechanics.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Flow Yield Vaults (FYV)
&lt;/h3&gt;

&lt;p&gt;This is a strategy built on top of FCM. FYV uses the automation hooks inside FCM to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuously monitor position health&lt;/li&gt;
&lt;li&gt;Sell a small portion of yield tokens when collateral drops&lt;/li&gt;
&lt;li&gt;Buy more yield tokens when collateral rises&lt;/li&gt;
&lt;li&gt;Maintain a stable health band so liquidation never occurs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FYV behaves like an automated rebalancing engine that runs continuously.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. How Flow Handles Liquidations Differently
&lt;/h2&gt;

&lt;p&gt;Flow’s liquidation system improves upon legacy designs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimal Liquidation
&lt;/h3&gt;

&lt;p&gt;Flow sells only the smallest amount of collateral needed to restore health.&lt;/p&gt;

&lt;h3&gt;
  
  
  DEX First Execution
&lt;/h3&gt;

&lt;p&gt;Liquidations are routed through a decentralized exchange:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Predictable pricing&lt;/li&gt;
&lt;li&gt;No dependency on external bots&lt;/li&gt;
&lt;li&gt;Best possible market rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a Keeper wants to liquidate, they must beat the DEX price.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Small Adjustments
&lt;/h3&gt;

&lt;p&gt;If the market keeps dropping, FCM performs several small corrections instead of one destructive liquidation.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Why FYV’s Automation Matters
&lt;/h2&gt;

&lt;p&gt;Flow Yield Vaults automate everything a user would manually do.&lt;/p&gt;

&lt;p&gt;Example behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If FLOW price drops ten percent, FYV sells ten percent of yield tokens&lt;/li&gt;
&lt;li&gt;If FLOW price rises fifteen percent, FYV buys fifteen percent more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maximally invested when safe&lt;/li&gt;
&lt;li&gt;Hedged when risky&lt;/li&gt;
&lt;li&gt;Protected from liquidation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simulations show FYV achieves higher returns than similar strategies on Aave because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It avoids liquidation loss&lt;/li&gt;
&lt;li&gt;It maintains safe leverage&lt;/li&gt;
&lt;li&gt;Automation captures more upside opportunities&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Key Takeaways for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lending protocols can be redesigned to be more user friendly
&lt;/h3&gt;

&lt;p&gt;Flow reduces liquidation pain and aligns incentives between the protocol and users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automation is becoming essential
&lt;/h3&gt;

&lt;p&gt;Instead of relying on keepers or manual adjustments, Flow builds automated risk management at the protocol layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deterministic liquidation improves user trust
&lt;/h3&gt;

&lt;p&gt;DEX based execution ensures transparent and predictable behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Traditional Lending Protocols&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large liquidations&lt;/li&gt;
&lt;li&gt;Keeper profit is user loss&lt;/li&gt;
&lt;li&gt;Sudden position wipeouts&lt;/li&gt;
&lt;li&gt;No built in protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Flow Credit Market + Flow Yield Vaults&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated health balancing&lt;/li&gt;
&lt;li&gt;Minimal liquidation&lt;/li&gt;
&lt;li&gt;DEX driven execution&lt;/li&gt;
&lt;li&gt;Continuous rebalance strategy&lt;/li&gt;
&lt;li&gt;Higher return with reduced risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flow builds a safer and more efficient foundation for leveraged yield strategies, especially for developers building products on top of lending primitives.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>tutorial</category>
      <category>architecture</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Adding Telegram Notifications to Your Application: A Step-by-Step Guide</title>
      <dc:creator>Rohit Purkait</dc:creator>
      <pubDate>Tue, 07 Jan 2025 13:30:49 +0000</pubDate>
      <link>https://dev.to/codeswithroh/adding-telegram-notifications-to-your-application-a-step-by-step-guide-26n0</link>
      <guid>https://dev.to/codeswithroh/adding-telegram-notifications-to-your-application-a-step-by-step-guide-26n0</guid>
      <description>&lt;p&gt;Telegram is a powerful and widely-used messaging platform that offers seamless integration with applications through its &lt;code&gt;Bot API&lt;/code&gt;. Whether you’re building a monitoring service, a trading bot, or a notification system, Telegram notifications can enhance user engagement by providing instant updates.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll walk you through the process of setting up a Telegram bot and enabling it to send notifications to your desired chat.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Telegram for Notifications?
&lt;/h3&gt;

&lt;p&gt;• &lt;strong&gt;Ease of Use&lt;/strong&gt;: Telegram bots are easy to set up and integrate with your application.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Instant Delivery&lt;/strong&gt;: Notifications are delivered in real-time.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Global Reach&lt;/strong&gt;: Telegram has millions of users worldwide.&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Customizable Experience&lt;/strong&gt;: You can tailor the bot to send messages in any format, including text, images, and even buttons.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Create a Telegram Bot
&lt;/h4&gt;

&lt;p&gt;The first step is to create a bot in Telegram using the BotFather:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open Telegram: Log into your Telegram account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for BotFather: In the search bar, type “BotFather” and select the verified bot.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start a Chat: Send the /start command to begin interacting with BotFather.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a New Bot: Use the /newbot command. You’ll be prompted to:&lt;br&gt;
• Choose a name: This is the display name for your bot.&lt;br&gt;
• Create a username: Must end with “bot” (e.g., MyNotificationBot).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Receive Your Bot Token: Once created, BotFather will provide a token that you’ll use to authenticate API calls. Save this token securely, as it’s your bot’s access key.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fwde3wxck0q8248jt1bmw.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fwde3wxck0q8248jt1bmw.png" alt="Botfather 2" width="799" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Get Your Chat ID&lt;/p&gt;

&lt;p&gt;Telegram needs to know which chat to send notifications to. To retrieve your chat ID:&lt;br&gt;
    1.  Start a Chat with Your Bot: Search for your bot’s username in Telegram and send a message (e.g., “Hello”).&lt;br&gt;
    2.  Use the Bot API: Use the following API endpoint to fetch updates and find your chat ID:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://api.telegram.org/bot" rel="noopener noreferrer"&gt;https://api.telegram.org/bot&lt;/a&gt;/getUpdates&lt;/p&gt;

&lt;p&gt;Replace  with the token provided by BotFather.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3.  Inspect the Response: The response will include a JSON object. Look for the chat field, which contains the id. This is your chat ID.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Step 3: Understanding the Telegram Bot API&lt;/p&gt;

&lt;p&gt;Telegram provides a simple HTTP-based API to interact with your bot. The endpoint to send a message is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://api.telegram.org/bot" rel="noopener noreferrer"&gt;https://api.telegram.org/bot&lt;/a&gt;/sendMessage&lt;/p&gt;

&lt;p&gt;Required Parameters&lt;br&gt;
    • chat_id: The ID of the chat where the message should be sent.&lt;br&gt;
    • text: The message content.&lt;/p&gt;

&lt;p&gt;Optional Parameters&lt;br&gt;
    • parse_mode: Format text using Markdown or HTML.&lt;br&gt;
    • disable_notification: Send messages silently (without sound).&lt;br&gt;
    • reply_markup: Add interactive buttons or keyboards.&lt;/p&gt;

&lt;p&gt;Step 4: Test Your Telegram Bot&lt;/p&gt;

&lt;p&gt;Once you have the bot token and chat ID, it’s time to test. You can use a tool like curl or Postman to send a sample message:&lt;/p&gt;

&lt;p&gt;Using curl&lt;/p&gt;

&lt;p&gt;curl -X POST "&lt;a href="https://api.telegram.org/bot" rel="noopener noreferrer"&gt;https://api.telegram.org/bot&lt;/a&gt;/sendMessage" \&lt;br&gt;
     -H "Content-Type: application/json" \&lt;br&gt;
     -d '{"chat_id": "", "text": "Hello from my bot!"}'&lt;/p&gt;

&lt;p&gt;Using Postman&lt;br&gt;
    1.  Set the method to POST.&lt;br&gt;
    2.  Use the URL: &lt;a href="https://api.telegram.org/bot" rel="noopener noreferrer"&gt;https://api.telegram.org/bot&lt;/a&gt;/sendMessage.&lt;br&gt;
    3.  In the body, use the JSON format:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
    "chat_id": "",&lt;br&gt;
    "text": "Hello from my bot!"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Step 5: Automating Notifications&lt;/p&gt;

&lt;p&gt;To integrate Telegram notifications into your application, you’ll need to:&lt;br&gt;
    1.  Capture the event or payload in your app that triggers a notification.&lt;br&gt;
    2.  Format the message content dynamically (e.g., using placeholders for data like symbols, signals, or confidence levels).&lt;br&gt;
    3.  Use the Telegram Bot API to send the message programmatically.&lt;/p&gt;

&lt;p&gt;Best Practices&lt;br&gt;
    • Secure Your Bot Token: Treat it like a password. Avoid hardcoding it in your application.&lt;br&gt;
    • Rate Limiting: Telegram has limits on API requests. Ensure your app respects these limits to avoid being blocked.&lt;br&gt;
    • Error Handling: Check the API response for errors and retry failed requests if necessary.&lt;br&gt;
    • Use Webhooks: For advanced integrations, consider setting up a webhook to receive real-time updates from Telegram.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Adding Telegram notifications to your application is a straightforward way to enhance communication with your users. By leveraging the Telegram Bot API, you can deliver real-time updates, alerts, or even automate workflows with minimal effort.&lt;/p&gt;

&lt;p&gt;This blog covered the setup process up to testing your bot. In the next part, we’ll dive into programmatically sending notifications using a backend service. Stay tuned!&lt;/p&gt;

&lt;p&gt;If you have any questions or need assistance, feel free to drop them in the comments below. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>coding</category>
    </item>
    <item>
      <title>Compiling 2025: My Roadmap for the Year Ahead</title>
      <dc:creator>Rohit Purkait</dc:creator>
      <pubDate>Thu, 02 Jan 2025 21:56:10 +0000</pubDate>
      <link>https://dev.to/codeswithroh/compiling-2025-my-roadmap-for-the-year-ahead-4bp8</link>
      <guid>https://dev.to/codeswithroh/compiling-2025-my-roadmap-for-the-year-ahead-4bp8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/newyear"&gt;2025 New Year Writing challenge&lt;/a&gt;: Compiling 2025.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As we step into 2025, I’m excited to share my personal roadmap for the year—a mix of new skills, ambitious projects, and career aspirations. It’s all about diving deeper into Web3, building tools to empower developers, and evolving my professional journey.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F2dx7tvcrtdwifw9t93zq.png" 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.amazonaws.com%2Fuploads%2Farticles%2F2dx7tvcrtdwifw9t93zq.png" alt="Web3 Journey" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  New Skill: Embracing Web3
&lt;/h3&gt;

&lt;p&gt;The buzz around Web3 continues to grow, and I believe 2025 will be its breakout year. To prepare, I’m delving headfirst into this transformative technology. My learning path includes mastering &lt;code&gt;Solidity&lt;/code&gt;, exploring &lt;code&gt;Move by Aptos&lt;/code&gt;, and diving into other Web3 tools and frameworks.&lt;/p&gt;

&lt;p&gt;Web3 represents the future of decentralized applications, and I’m thrilled to align my skillset with this rapidly evolving space. The potential is limitless, and I can’t wait to see where this journey leads.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Far3wifmc60pe8d26qw3i.png" 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.amazonaws.com%2Fuploads%2Farticles%2Far3wifmc60pe8d26qw3i.png" alt="Embracing Web3" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Side Projects: Building for the Community
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Sepolia Faucet
&lt;/h4&gt;

&lt;p&gt;One of my key projects is creating a Sepolia faucet where developers can purchase Sepolia tokens using INR. Currently, most faucets require 0.001 ETH on the mainnet—a barrier for newcomers just starting out.&lt;/p&gt;

&lt;p&gt;By offering a more accessible solution, my goal is to fuel creativity and innovation. Developers will be able to acquire Sepolia ETH with a minimal amount of INR, allowing them to focus on building and experimenting with their dApps. This project isn’t just about simplifying access—it’s about empowering the next wave of Web3 creators.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F7lpgdzbv02x3zs6cs25j.png" 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.amazonaws.com%2Fuploads%2Farticles%2F7lpgdzbv02x3zs6cs25j.png" alt="Sneak Peek" width="800" height="562"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Just a base sneak peek. Will be launching on 7th Jan, 2025.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Decentralized Identification (DeID)
&lt;/h4&gt;

&lt;p&gt;Another project close to my heart is building dApps around Decentralized Identification (DeID). Our current identification systems are outdated and ill-equipped for the modern era, where data breaches are increasingly common.&lt;/p&gt;

&lt;p&gt;Through DeID, I envision a system that allows individuals to securely verify their identity wherever they go, putting control back into the hands of the user. This project is a step toward a future where personal data is safe, accessible, and decentralized—a future I’m eager to help shape.&lt;/p&gt;




&lt;h3&gt;
  
  
  Career Aspirations: Shifting Focus to Smart Contracts
&lt;/h3&gt;

&lt;p&gt;As a Full Stack Developer, I’ve had the opportunity to work across the technology spectrum, but this year, I’m pivoting toward a specialized path: Smart Contract Development.&lt;/p&gt;

&lt;p&gt;My goal is to deepen my understanding of this crucial Web3 component and eventually transition into a dedicated role as a smart contract developer. This shift aligns perfectly with my passion for blockchain technology and the ever-expanding possibilities of decentralized solutions.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F4uthc4194z0gc8ek078t.png" 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.amazonaws.com%2Fuploads%2Farticles%2F4uthc4194z0gc8ek078t.png" alt="web3 dream" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Looking Ahead
&lt;/h3&gt;

&lt;p&gt;2025 is shaping up to be a pivotal year for me, full of learning, building, and growing. Whether it’s mastering new skills, developing impactful projects, or pursuing career aspirations, I’m excited for what lies ahead.&lt;/p&gt;

&lt;p&gt;To all my fellow developers, dreamers, and innovators—let’s make 2025 a year to remember!&lt;/p&gt;

&lt;p&gt;What’s on your 2025 roadmap? Share your journey and join the conversation!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>newyearchallenge</category>
      <category>career</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
