<?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: Fadhlullah Mustapha</title>
    <description>The latest articles on DEV Community by Fadhlullah Mustapha (@blvckninja).</description>
    <link>https://dev.to/blvckninja</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%2F4159693%2Fd9c5ddfb-77c1-4007-bba3-43ec42e3d7fa.png</url>
      <title>DEV Community: Fadhlullah Mustapha</title>
      <link>https://dev.to/blvckninja</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blvckninja"/>
    <language>en</language>
    <item>
      <title>Onebar: You're on a ridge with one bar of signal and no data.</title>
      <dc:creator>Fadhlullah Mustapha</dc:creator>
      <pubDate>Sun, 11 Oct 2026 13:44:01 +0000</pubDate>
      <link>https://dev.to/blvckninja/onebar-youre-on-a-ridge-with-one-bar-of-signal-and-no-data-34p0</link>
      <guid>https://dev.to/blvckninja/onebar-youre-on-a-ridge-with-one-bar-of-signal-and-no-data-34p0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;OneBar is a low-bandwidth weather assistant for hikers. Ask a question like “when should I turn back?” and it replies with one SMS-length message based on the forecast for your location.&lt;/p&gt;

&lt;p&gt;The language model writes the sentence, but it does not calculate the weather facts. Code computes details such as sunset, gust speed, and turnaround time; a separate checker verifies that the reply is under 160 SMS characters, includes the facts the question needs, and doesn’t introduce unsupported numbers or contradict the forecast. If a draft fails, OneBar retries once, then uses a checked template.&lt;/p&gt;

&lt;p&gt;It’s for people who need a quick, readable answer on the trail, especially when a full weather app is inconvenient on a weak connection. OneBar is not a rescue service or a replacement for an official mountain forecast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;url: &lt;a href="https://onebar-v46s.onrender.com" rel="noopener noreferrer"&gt;https://onebar-v46s.onrender.com&lt;/a&gt; ,demo video:&lt;a href="https://youtu.be/KurEtVshOIM" rel="noopener noreferrer"&gt;https://youtu.be/KurEtVshOIM&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/JUICEWRLD998/onebar" rel="noopener noreferrer"&gt;https://github.com/JUICEWRLD998/onebar&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I fine-tuned the open-weight Qwen3-8B with LoRA for the specific task of writing short, forecast-grounded replies. The dataset contains 3,290 training examples and 514 validation examples, built from mountain locations and forecast scenarios. I evaluated it on 414 held-out questions, with locations separated by map cell from the training data.&lt;/p&gt;

&lt;p&gt;On that test set, the tuned model passed OneBar’s checks on its first draft 98.1% of the time, compared with 56.8% for the base Qwen3-8B. It had no template fallbacks in that evaluation. Every answer still goes through the checker; those results are not a guarantee that a forecast or answer is always correct.&lt;/p&gt;

&lt;p&gt;The application uses Python and FastAPI for the facts and checking pipeline, React and TypeScript for the web interface, Open-Meteo for forecast data, and Temporal for durable trip timers and overdue-contact alerts. Tinker was used to fine-tune and serve the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open-weight models let me adapt the model to a narrow, measurable task instead of treating a general-purpose assistant as a black box. I could fine-tune Qwen3-8B, compare it against the untuned model and a larger model on the same held-out questions, and build the product around the behavior the task needs: short answers that use facts computed by the application.&lt;/p&gt;

&lt;p&gt;The model is only one part of the safety approach. OneBar keeps the facts and validation in ordinary code, so a model response must pass explicit checks before it is sent. That separation makes the system easier to inspect and improve than relying on a model provider’s answer alone&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Featured Category: Tinker&lt;br&gt;
Partner Category: Temporal&lt;br&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%2F53v6rqj7l7gf61xpibff.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%2F53v6rqj7l7gf61xpibff.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Solo Builder: Mustapha Fadhlullah&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Cue: a drum machine whose song is a Sanity dataset</title>
      <dc:creator>Fadhlullah Mustapha</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:24:01 +0000</pubDate>
      <link>https://dev.to/blvckninja/cue-a-drum-machine-whose-song-is-a-sanity-dataset-3o7k</link>
      <guid>https://dev.to/blvckninja/cue-a-drum-machine-whose-song-is-a-sanity-dataset-3o7k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Cue is a drum machine whose song is a Sanity document. There are no audio files. The browser reads the numbers in the dataset and plays them as sound.&lt;/p&gt;

&lt;p&gt;A DJ cues the next track in headphones while the room hears the current one. A Sanity document already has that split: a draft and a published version. Cue makes it literal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Floor is a public page. It plays the published song, with no token.&lt;/li&gt;
&lt;li&gt;The Deck is a Sanity App SDK app. It edits the draft and plays it in a Cue channel that only the DJ hears.&lt;/li&gt;
&lt;li&gt;Drop publishes the draft. Every open Floor switches to the new song on the next bar line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Published is the room. Drafts are the headphones. Publishing is the drop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;link: &lt;a href="https://youtu.be/E2ly2dM5tJo" rel="noopener noreferrer"&gt;https://youtu.be/E2ly2dM5tJo&lt;/a&gt; &lt;br&gt;
url:&lt;a href="https://cue-steel-seven.vercel.app/" rel="noopener noreferrer"&gt;https://cue-steel-seven.vercel.app/&lt;/a&gt;&lt;br&gt;
Live Deck (needs a sign-in to the Sanity organization): &lt;a href="https://www.sanity.io/@o4h8r4fp1/application/hfqfe4stqbkn23mv9qs3bryp" rel="noopener noreferrer"&gt;https://www.sanity.io/@o4h8r4fp1/application/hfqfe4stqbkn23mv9qs3bryp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/JUICEWRLD998/cue" rel="noopener noreferrer"&gt;https://github.com/JUICEWRLD998/cue&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;Drafts, published versions, perspectives and real-time listening are the instrument, not storage behind it. Nothing else in the project holds state, and there is no server of mine between the DJ and the room.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Floor reads the song with perspective: 'published', useCdn: false and no token. It listens with client.listen() and polls every 2 seconds as a fallback.&lt;/li&gt;
&lt;li&gt;The Deck uses the App SDK: useEditDocument changes the draft, and publishDocument is the Drop.&lt;/li&gt;
&lt;li&gt;Sounds are synthesised in the browser from parameters stored in voice documents (pitch, decay, tone, gain).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The schema, and a trap I designed around&lt;/p&gt;

&lt;p&gt;voice   (document)  name, kind, pitch, decay, tone, gain&lt;br&gt;
song    (document)  title, bpm, swing, sections[]&lt;br&gt;
section (object)    title, kind, bars, lanes[]&lt;br&gt;
lane    (object)    voice -&amp;gt; reference(voice), steps[]&lt;br&gt;
step    (object)    index 0-15, velocity, probability, nudge (ms)&lt;/p&gt;

&lt;p&gt;The obvious model makes sections and lanes separate documents that the song references. That breaks the Drop. Publishing a document does not publish the documents it references, so the song would go live while its patterns stayed in draft, and the room would play a half-new song. I embedded sections, lanes and steps in the one song document, so a Drop is a single commit. Voices stay as references because they are a shared kit that rarely changes.&lt;/p&gt;

&lt;p&gt;Steps are objects, not a string like x...x...x.... A string cannot be queried. With objects, GROQ can ask "which lanes hit the off-beat", and each hit carries velocity, probability and a nudge in milliseconds.&lt;/p&gt;

&lt;p&gt;Time without a server clock. Every device computes the step from the wall clock, so two tabs or a phone and a laptop stay in step without talking to each other. Measured in real Chrome against the live dataset: a publish was noticed after 1.4 to 1.9 s, and the new song started on the next bar, about 3.2 s after the publish at 118 bpm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project ID: jwc6peq5&lt;/li&gt;
&lt;li&gt;Dataset: production (public, read-only)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;Supported tools include Claude Code&lt;/p&gt;

&lt;p&gt;Made by Mustapha Fadhlullah - Software Developer&lt;br&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%2Fob8ocb052tqb27jz18v0.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%2Fob8ocb052tqb27jz18v0.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Derica: new tin prices the moment the bag price changes</title>
      <dc:creator>Fadhlullah Mustapha</dc:creator>
      <pubDate>Sun, 04 Oct 2026 13:46:06 +0000</pubDate>
      <link>https://dev.to/blvckninja/derica-new-tin-prices-the-moment-the-bag-price-changes-20h1</link>
      <guid>https://dev.to/blvckninja/derica-new-tin-prices-the-moment-the-bag-price-changes-20h1</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%2F5xla7wbpy31xaufajtwr.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%2F5xla7wbpy31xaufajtwr.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Derica is for my friend Amina, who sells rice, beans, garri and groundnut in a Nigerian market. She buys by the 50kg bag and sells by the derica, mudu and paint (three local tins). When her supplier raises the bag price, she has to redo the maths for every tin by hand. Her tin prices usually change late, and she earns less on every sale in between.&lt;/p&gt;

&lt;p&gt;She pastes the supplier's WhatsApp message, for example "Rice 50kg now 78k". Derica reads it and shows what it understood. It then works out the new price for each tin, keeping her profit the same and rounding up to the next ₦50. One tap makes a price card picture she can share on WhatsApp.&lt;/p&gt;

&lt;p&gt;Example: the bag goes from ₦78,000 to ₦82,000, and her ₦2,900 mudu becomes ₦3,050.&lt;/p&gt;

&lt;p&gt;The AI only reads the message and never sets a price. Normal code does all the maths. If the AI reads something absurd, such as ₦15,000,000 for a bag, Derica refuses to show it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Demo video:&lt;a href="https://youtu.be/Md6PzFtvtso" rel="noopener noreferrer"&gt;https://youtu.be/Md6PzFtvtso&lt;/a&gt; url:&lt;a href="https://derica.onrender.com/" rel="noopener noreferrer"&gt;https://derica.onrender.com/&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/JUICEWRLD998/Derica" rel="noopener noreferrer"&gt;https://github.com/JUICEWRLD998/Derica&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I trained a small AI model (Qwen3.5-4B) on Tinker with about 3,500 practice messages I generated. Training took about 19 minutes and cost under a dollar.&lt;/li&gt;
&lt;li&gt;Python with FastAPI serves the app. The page is plain HTML, CSS and JavaScript.&lt;/li&gt;
&lt;li&gt;The price maths uses exact fractions, so there are no rounding surprises.&lt;/li&gt;
&lt;li&gt;Render hosts it.&lt;/li&gt;
&lt;li&gt;Amina's real messages (18) were the base for the tests. I also wrote two harder sets of 39 and 29 messages and locked them before testing. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Derica reads messy WhatsApp price messages, like "Beans no dey cheap again, 92k now". That job needs a model that knows Nigerian Pidgin and local measures such as the derica, mudu and paint. A general closed API would need a long prompt full of rules and examples on every call.&lt;/p&gt;

&lt;p&gt;Open weights let me fine-tune a small model, Qwen3.5-4B, on about 3,500 practice messages. Open models also let me test honestly. I compared my model against two other models and a plain rules reader, with test sets locked before scoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tinker. I fine-tuned the model and served it through Tinker, and the app calls it live.&lt;/li&gt;
&lt;li&gt;Render. The app is deployed there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Team Submissions: Solo builder- Mustapha Fadhlullah&lt;/p&gt;

&lt;p&gt;Thanks for participating!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built a Chatbot That Remembers You Across Devices — 6 Things I Learned</title>
      <dc:creator>Fadhlullah Mustapha</dc:creator>
      <pubDate>Sat, 03 Oct 2026 13:29:21 +0000</pubDate>
      <link>https://dev.to/blvckninja/i-built-a-chatbot-that-remembers-you-across-devices-6-things-i-learned-3ehp</link>
      <guid>https://dev.to/blvckninja/i-built-a-chatbot-that-remembers-you-across-devices-6-things-i-learned-3ehp</guid>
      <description>&lt;p&gt;I built Pickup, a chatbot that remembers users across browsers and devices using Walrus mainnet.&lt;/p&gt;

&lt;p&gt;I thought the hard part would be storing and retrieving memories.&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;The real challenge was making decentralized storage work smoothly behind a chatbot. These were the six things I learned.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Memory can't be allowed to freeze the chatbot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If memory retrieval is slow, the whole chat shouldn't have to wait.&lt;/p&gt;

&lt;p&gt;I added an 8-second timeout. If memory doesn't come back in time, the chatbot answers normally and tells the user that it answered without the latest memory.&lt;/p&gt;

&lt;p&gt;The chatbot should still work when memory doesn't.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't make users wait for writes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One Walrus mainnet write took 36 seconds in my testing.&lt;/p&gt;

&lt;p&gt;Waiting 36 seconds after every message obviously isn't acceptable.&lt;/p&gt;

&lt;p&gt;So I changed the flow:&lt;/p&gt;

&lt;p&gt;Reply first → save memory afterward.&lt;/p&gt;

&lt;p&gt;The user gets the response immediately while the memory is saved in the background.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't remember everything&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Saving every message creates a lot of useless memory.&lt;/p&gt;

&lt;p&gt;I added a simple filter that skips short conversations and messages that don't contain useful information about the user.&lt;/p&gt;

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

&lt;p&gt;"Why does it 429?" → skip&lt;/p&gt;

&lt;p&gt;"I'm running v0.1.8 and getting 429 errors." → save&lt;/p&gt;

&lt;p&gt;The goal isn't to remember everything.&lt;/p&gt;

&lt;p&gt;It's to remember the right things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A successful write may not be immediately readable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I ran into an interesting consistency issue.&lt;/p&gt;

&lt;p&gt;A memory could be successfully saved, but the next recall wouldn't find it because the index hadn't caught up yet.&lt;/p&gt;

&lt;p&gt;So I temporarily keep recently saved memories on the client and include them in recall results until the server catches up.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;Written ≠ immediately readable.&lt;/p&gt;

&lt;p&gt;That's something I had to design around.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Queue your writes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sending several writes at once caused rate-limit failures.&lt;/p&gt;

&lt;p&gt;The fix was simple:&lt;/p&gt;

&lt;p&gt;One namespace, one write at a time.&lt;/p&gt;

&lt;p&gt;Instead of firing every write immediately, I queue them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Show the user what the chatbot remembered&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pickup shows the memories used for each response and how old they are.&lt;/p&gt;

&lt;p&gt;This turned memory from a black box into something I could actually inspect.&lt;/p&gt;

&lt;p&gt;When the chatbot gives an unexpected answer, I can see whether it used the wrong memory, an old memory, or no memory at all.&lt;/p&gt;

&lt;p&gt;One limitation&lt;/p&gt;

&lt;p&gt;The SDK I'm using currently doesn't provide a delete method.&lt;/p&gt;

&lt;p&gt;So I didn't add a fake delete button.&lt;/p&gt;

&lt;p&gt;Instead, the UI warns users not to store secrets or sensitive information in persistent memory.&lt;/p&gt;

&lt;p&gt;I'd rather be honest about the limitation than pretend deletion is guaranteed.&lt;/p&gt;

&lt;p&gt;The main lesson&lt;/p&gt;

&lt;p&gt;Building persistent AI memory taught me that storage is only part of the problem.&lt;/p&gt;

&lt;p&gt;Once storage sits behind a real-time chatbot, you also have to think about:&lt;/p&gt;

&lt;p&gt;Latency. Consistency. Rate limits. Memory quality. Observability.&lt;/p&gt;

&lt;p&gt;That's where most of the interesting engineering happened.&lt;/p&gt;

&lt;p&gt;Pickup was built for Walrus Sessions 8.&lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
&lt;a href="https://github.com/JUICEWRLD998/pickup" rel="noopener noreferrer"&gt;https://github.com/JUICEWRLD998/pickup&lt;/a&gt;&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%2F2lje6oqacklhlodo0704.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%2F2lje6oqacklhlodo0704.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>productivity</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
