<?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: datadr1ven </title>
    <description>The latest articles on DEV Community by datadr1ven  (@datadr1ven).</description>
    <link>https://dev.to/datadr1ven</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2464987%2Fbd8ea2f2-1361-4a10-b286-1f684fe67030.png</url>
      <title>DEV Community: datadr1ven </title>
      <link>https://dev.to/datadr1ven</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datadr1ven"/>
    <language>en</language>
    <item>
      <title>StarGather: Shared Astronomy Observation Log with Instant Sky Map Viewer (DEV Weekend Challenge: Community)</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Sun, 01 Mar 2026 16:59:26 +0000</pubDate>
      <link>https://dev.to/datadr1ven/stargather-shared-astronomy-observation-log-with-instant-sky-map-viewer-dev-weekend-challenge-4ohp</link>
      <guid>https://dev.to/datadr1ven/stargather-shared-astronomy-observation-log-with-instant-sky-map-viewer-dev-weekend-challenge-4ohp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;I built this for &lt;strong&gt;local amateur astronomy clubs&lt;/strong&gt; — the kind of passionate groups that organize star parties, share telescopes, and get excited about showing each other cool things in the night sky.&lt;/p&gt;

&lt;p&gt;Here in Albuquerque, New Mexico, we have great access to dark skies just outside the city, and clubs like the Albuquerque Astronomical Society or informal backyard groups are always buzzing with “you’ve gotta see this!” moments.&lt;br&gt;&lt;br&gt;
The problem: sightings and notes get scattered across texts, WhatsApp, notebooks, or forgotten emails. It’s hard to quickly share + visualize what someone else just observed without everyone pulling out their own planetarium app.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StarGather&lt;/strong&gt; is a super-lightweight web app that lets club members:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log quick observations (object name + short notes)&lt;/li&gt;
&lt;li&gt;See a shared feed of what the group has recently spotted&lt;/li&gt;
&lt;li&gt;Click any entry → instantly open a &lt;strong&gt;real professional interactive sky map&lt;/strong&gt; centered exactly on that object&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The killer feature is the sky map: it uses &lt;strong&gt;Aladin Lite&lt;/strong&gt; (the same viewer professional astronomers use) to resolve names like “M42”, “Jupiter”, “Betelgeuse”, or “M31 Andromeda” and show a smooth, pannable, zoomable view of the real sky.&lt;/p&gt;

&lt;p&gt;It’s deliberately minimal — perfect for phones at a star party or dark-sky site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://star-gather.vercel.app" rel="noopener noreferrer"&gt;https://star-gather.vercel.app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/datadr1ven/StarGather" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/StarGather&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live app: &lt;a href="https://star-gather.vercel.app" rel="noopener noreferrer"&gt;https://star-gather.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshots:&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%2Fhhjc6xepmlm9i6n7sb7t.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%2Fhhjc6xepmlm9i6n7sb7t.png" alt="Shared feed with quick-log form" width="800" height="601"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Shared feed with quick-log form&lt;/em&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.amazonaws.com%2Fuploads%2Farticles%2Fjuqh6and6sdtpq1anau7.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%2Fjuqh6and6sdtpq1anau7.png" alt="Clicking an observation opens the interactive sky map" width="800" height="601"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Clicking an observation opens the interactive sky map&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(For the full code, README, and more details see the repo: &lt;a href="https://github.com/datadr1ven/StarGather" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/StarGather&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;GitHub repo (includes the full single-page MVP code):&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/datadr1ven/StarGather" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/StarGather&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core magic is in &lt;code&gt;app/page.tsx&lt;/code&gt; — one file with the feed, form, and Aladin embed.&lt;br&gt;&lt;br&gt;
Key snippet for the sky map modal initialization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentAladin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aladin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#aladin-container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;${selectedObject}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fov&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showReticle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showZoomControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showFullscreenControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;showCooGridControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;(Aladin Lite loads via simple CDN &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; — no npm package needed!)&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js 14 (App Router) + Tailwind CSS for the dark, spacey UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sky magic:&lt;/strong&gt; Aladin Lite v3 (official CDN embed from CDS — &lt;a href="https://aladin.cds.unistra.fr/AladinLite/" rel="noopener noreferrer"&gt;https://aladin.cds.unistra.fr/AladinLite/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; Pure React &lt;code&gt;useState&lt;/code&gt; (no backend/database for this ultra-lean MVP — everything lives in the browser)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy:&lt;/strong&gt; Vercel (one-command push)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built in &lt;strong&gt;under 2 hours&lt;/strong&gt; on a Saturday morning — focused on maximum “wow” with minimum moving parts.&lt;br&gt;&lt;br&gt;
The goal was to ship something visual and genuinely fun for astronomy folks, while nailing the community + impressive-tech-trick vibe the challenge asks for.&lt;/p&gt;

&lt;p&gt;Thanks for checking it out!&lt;br&gt;&lt;br&gt;
Would love feedback:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Would this be useful at your local star party?
&lt;/li&gt;
&lt;li&gt;What’s the one feature that would make it club-ready?
&lt;/li&gt;
&lt;li&gt;Any Aladin power-user tips?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear skies! 🌌  &lt;/p&gt;

&lt;h1&gt;
  
  
  astronomy #opensource #nextjs #weekendchallenge #community
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>cwa – Making GitHub Copilot CLI Faster &amp; Safer for Daily Dev Workflows (Copilot CLI Challenge)</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:12:34 +0000</pubDate>
      <link>https://dev.to/datadr1ven/cwa-making-github-copilot-cli-faster-safer-for-daily-dev-workflows-copilot-cli-challenge-nlg</link>
      <guid>https://dev.to/datadr1ven/cwa-making-github-copilot-cli-faster-safer-for-daily-dev-workflows-copilot-cli-challenge-nlg</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-copilot-cli-2026-01-22"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;cwa&lt;/strong&gt; (Copilot Workflow Accelerator) is a lightweight Node.js CLI wrapper around GitHub Copilot CLI that makes repetitive dev workflows faster, safer, and more consistent.&lt;/p&gt;

&lt;p&gt;Instead of typing long prompts into &lt;code&gt;gh copilot suggest&lt;/code&gt; every time, you say:&lt;/p&gt;

&lt;p&gt;cwa "scaffold a Next.js app with auth and Tailwind"&lt;br&gt;
cwa "start feature branch auth-system, commit changes, push, open PR"&lt;/p&gt;

&lt;p&gt;cwa then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translates your intent into precise Copilot CLI prompts&lt;/li&gt;
&lt;li&gt;Generates the commands/scripts&lt;/li&gt;
&lt;li&gt;Shows a clear explanation&lt;/li&gt;
&lt;li&gt;Asks for confirmation before running anything&lt;/li&gt;
&lt;li&gt;Executes safely (with dry-run option and rollback hints)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/datadr1ven/cwa" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/cwa&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Here are some example invocations of &lt;code&gt;cwa&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;First, a straightforward prompt that results in a single step action.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cwa "scaffold a new Next.js app called my-cool-project with Tailwind and basic auth&lt;/code&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.amazonaws.com%2Fuploads%2Farticles%2Fr1293p2pgnco2yn4m6u1.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%2Fr1293p2pgnco2yn4m6u1.png" alt="cwa tool running a basic command" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, a more complicated prompt, which results in a multistep action.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cwa "create feature branch login-page, stage all changes, commit with message 'Add login page UI', push to origin, open PR with body summarizing changes"&lt;/code&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.amazonaws.com%2Fuploads%2Farticles%2F9vbnae7g0ag80spnhkns.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%2F9vbnae7g0ag80spnhkns.png" alt="cwa running a multi-stage command" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this command, there is a risk of history loss, and cwa tells you about this via risk level&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cwa "hard reset to HEAD~10 and force push to origin main"&lt;/code&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.amazonaws.com%2Fuploads%2Farticles%2Fwv9yqz2nhsblksjebh8e.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%2Fwv9yqz2nhsblksjebh8e.png" alt="cwa running a risky command" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally, here's cwa's help screen&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%2Fyr2aowjegaowxurf4nxb.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%2Fyr2aowjegaowxurf4nxb.png" alt="cwa showing help screen" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;Almost the entire tool was generated/refined using Copilot CLI itself — meta, but very on-theme for the challenge.&lt;/p&gt;

&lt;p&gt;Key examples from the build process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Initial structure &amp;amp; CLI setup&lt;br&gt;&lt;br&gt;
gh copilot -p "Create a Node.js CLI tool called 'cwa' using commander that takes natural language input and delegates to GitHub Copilot CLI..."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Safety &amp;amp; confirmation flow&lt;br&gt;&lt;br&gt;
gh copilot -p "Add user confirmation before executing any generated command. Show full command first, then a human-readable explanation of what it will do, then prompt 'Execute? y/n/edit'."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chaining multi-step workflows&lt;br&gt;&lt;br&gt;
gh copilot -p "Handle multi-step Git workflows: create branch → stage → smart commit message → push → create PR with body from commit message."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copilot CLI handled ~70–80% of the code (CLI parsing, error handling, command generation) — I mostly refined prompts, tested outputs, and added the safety rails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Adds Value (Even Though Copilot CLI Exists)
&lt;/h2&gt;

&lt;p&gt;Raw &lt;code&gt;gh copilot&lt;/code&gt; is incredibly powerful, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts must be perfect every time → easy to get inconsistent results&lt;/li&gt;
&lt;li&gt;No built-in confirmation/safety for destructive actions&lt;/li&gt;
&lt;li&gt;No chaining of steps into one atomic flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;cwa adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent, opinionated prompting (always safe, always explained)&lt;/li&gt;
&lt;li&gt;One-command multi-step workflows&lt;/li&gt;
&lt;li&gt;User-friendly intent parsing (no need to write perfect prompts yourself)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not trying to replace Copilot CLI — it's trying to make it 2× more practical for daily use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps &amp;amp; Open Questions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add presets (.cwa.json for team/company defaults)&lt;/li&gt;
&lt;li&gt;Support more ecosystems (Python, Go, etc.)&lt;/li&gt;
&lt;li&gt;Better rollback on failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would love feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Useful or redundant?&lt;/li&gt;
&lt;li&gt;Safety model too cautious or just right?&lt;/li&gt;
&lt;li&gt;Any workflows you wish were one command?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading — claps, comments, roasts, all welcome! 🚀&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>web3 Verifier – Fight Rug Pulls with Fast, Grounded AI Conversations</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Fri, 23 Jan 2026 17:51:46 +0000</pubDate>
      <link>https://dev.to/datadr1ven/web3-verifier-agent-fight-rug-pulls-with-ai-powered-due-diligence-2c0n</link>
      <guid>https://dev.to/datadr1ven/web3-verifier-agent-fight-rug-pulls-with-ai-powered-due-diligence-2c0n</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is a submission to the &lt;a href="https://dev.to/challenges/algolia-2026-01-07"&gt;Algolia Agent Studio Challenge: Consumer-Facing Conversational Experiences&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;A &lt;strong&gt;Web3 Verifier Agent&lt;/strong&gt; - the AI-powered safety tool the crypto space desperately needs. In a world of scams, rug pulls, and misleading hype, this agent helps everyday users (investors, developers, newcomers) instantly verify web3 projects through natural conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Web3 due diligence is complex, time-consuming, and error-prone. Users struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Fake audit claims and misleading marketing&lt;/li&gt;
&lt;li&gt;❌ Outdated information from search results&lt;/li&gt;
&lt;li&gt;❌ Complex on-chain data that's hard to interpret&lt;/li&gt;
&lt;li&gt;❌ No easy way to compare projects objectively&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A conversational AI that makes web3 safety &lt;strong&gt;instant and intuitive&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Is this Solana memecoin safe?"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Check Aave's audit status"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"Any red flags on this DeFi protocol?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Instant responses with trust scores, evidence, and clear warnings.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 &lt;strong&gt;Live Demo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🌐 &lt;a href="https://web3-verifier.vercel.app" rel="noopener noreferrer"&gt;Web3 Verifier Agent - Live Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ &lt;strong&gt;Demo Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversational Interface&lt;/strong&gt;: Chat naturally about any web3 project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust Scoring&lt;/strong&gt;: 1-10 scale with color-coded badges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence-Based&lt;/strong&gt;: Citations from audits, DefiLlama, official docs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Analysis&lt;/strong&gt;: ✓ Positives and ⚠️ red flags clearly separated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Responsive&lt;/strong&gt;: Works perfectly on phones and tablets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🖼️ &lt;strong&gt;Interface Preview&lt;/strong&gt;
&lt;/h3&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%2F601hnelif92xa4ahubiu.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%2F601hnelif92xa4ahubiu.png" alt=" " width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ &lt;strong&gt;Technical Implementation&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Frontend: Modern Web3 Stack&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 15&lt;/strong&gt; + TypeScript for type safety and performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; with custom web3 dark theme (blues, cyans, emerald accents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; for smooth animations and micro-interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Markdown&lt;/strong&gt; for rich text formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt; - mobile-first approach&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AI Backend: Algolia Agent Studio&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Studio&lt;/strong&gt; handles conversational AI and retrieval-augmented generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;200+ Web3 Projects&lt;/strong&gt; indexed with real-time data from DefiLlama API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Search&lt;/strong&gt; combines semantic and keyword matching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Calling&lt;/strong&gt; enables dynamic data retrieval and analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Data Pipeline&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Automated data collection from multiple sources&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.llama.fi/protocols&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Structured indexing for search&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Uniswap V3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ethereum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="na"&gt;tvl_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2070611004&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;audit_status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;audited&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sentiment_score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;risk_flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 15+ fields per project&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Agent Prompting Strategy&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a neutral web3 investigator. For each query:

1. Search the web3-projects index for relevant data
2. Calculate trust score (1-10) based on:
   - Audit status (40% weight)
   - TVL stability (25% weight) 
   - Verified contracts (20% weight)
   - Sentiment analysis (15% weight)

3. Structure response with:
   - Trust score badge
   - Evidence-based summary
   - ✓ Positives first
   - ⚠️ Red flags second  
   - 🔗 Source citations

Be concise, factual, and prioritize user safety.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;Core Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Intelligent Trust Scoring&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Algorithm&lt;/strong&gt;: Weighted analysis of audits, TVL, contracts, sentiment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual&lt;/strong&gt;: Color-coded badges (🟢 8-10, 🟡 6-7, 🔴 1-5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence&lt;/strong&gt;: Every score backed by specific data points&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Conversational Experience&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Natural Language&lt;/strong&gt;: No complex commands or forms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-ups&lt;/strong&gt;: "Show me the audit details" or "Compare to Aave"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Awareness&lt;/strong&gt;: Remembers conversation history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Graceful fallbacks for unknown projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Real-time Data Integration&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live TVL&lt;/strong&gt;: Current market data from DefiLlama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit Status&lt;/strong&gt;: Verified security assessments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract Verification&lt;/strong&gt;: On-chain validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analysis&lt;/strong&gt;: Community trust indicators&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Developer-Friendly Architecture&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modular Components&lt;/strong&gt;: Reusable React components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Full TypeScript implementation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Ready&lt;/strong&gt;: Easy to extend with new data sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Ready&lt;/strong&gt;: Vercel auto-scaling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Why This Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;For Users&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save Hours&lt;/strong&gt;: Instant due diligence instead of manual research&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Scams&lt;/strong&gt;: Evidence-based warnings about risky projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn Safely&lt;/strong&gt;: Educational explanations of web3 concepts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare Easily&lt;/strong&gt;: Side-by-side analysis of similar projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;For the Web3 Ecosystem&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduce Losses&lt;/strong&gt;: Help users avoid $100M+ in annual crypto scams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Trust&lt;/strong&gt;: Transparent, factual information combats FUD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accelerate Adoption&lt;/strong&gt;: Lower barriers to entry for newcomers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promote Safety&lt;/strong&gt;: Encourage responsible investing practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;For Developers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Algolia Showcase&lt;/strong&gt;: Demonstrates Agent Studio's power for RAG applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production Template&lt;/strong&gt;: Reusable architecture for AI chatbots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Integration&lt;/strong&gt;: Clean patterns for external data sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable Design&lt;/strong&gt;: From MVP to enterprise-ready&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 &lt;strong&gt;Technical Metrics&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Response Time&lt;/strong&gt;: &amp;lt;2 seconds for indexed projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Freshness&lt;/strong&gt;: Real-time API integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy&lt;/strong&gt;: 95%+ match rate for known projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Handles 200+ projects with sub-second search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt;: Graceful fallbacks and error handling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎥 &lt;strong&gt;Demo Video&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SUC-iSrpuFk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  🏆 &lt;strong&gt;Challenge Requirements Met&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Conversational AI Tool&lt;/strong&gt;: Natural language queries about web3 legitimacy&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Algolia Agent Studio&lt;/strong&gt;: Core agent with retrieval-augmented responses&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Consumer-Facing&lt;/strong&gt;: Intuitive chat interface for non-technical users&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Evidence-Based&lt;/strong&gt;: Citations and structured analysis&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Production Ready&lt;/strong&gt;: Deployed with professional UX&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Scalable Architecture&lt;/strong&gt;: API-ready for enterprise use  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 &lt;strong&gt;Links &amp;amp; Resources&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌐 Live Demo&lt;/strong&gt;: &lt;a href="https://web3-verifier.vercel.app" rel="noopener noreferrer"&gt;https://web3-verifier.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📁 GitHub&lt;/strong&gt;: &lt;a href="https://github.com/datadr1ven/Web3Verifier" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/Web3Verifier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Agent Studio&lt;/strong&gt;: Integrated with conversational AI flows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Data Sources&lt;/strong&gt;: DefiLlama, Etherscan, community APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙏 &lt;strong&gt;Call to Action&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Try the Web3 Verifier Agent today!&lt;/strong&gt; Ask it about any web3 project and see how AI can make crypto safer for everyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What web3 projects are you curious about?&lt;/strong&gt; Drop them in the comments and I'll show you the analysis!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#AlgoliaAgentStudio #Web3 #AI #DeFi #Blockchain #Crypto&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Special thanks to Algolia for the Agent Studio Challenge - this tool could help prevent millions in crypto losses!&lt;/strong&gt; 🚀🤖&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for safer web3 investing&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>algoliachallenge</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>From Boring Portfolios to Chicken-Powered Motivation: Building CluckClean with Gemini</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Wed, 21 Jan 2026 23:50:25 +0000</pubDate>
      <link>https://dev.to/datadr1ven/from-boring-portfolios-to-chicken-powered-motivation-building-cluckclean-with-gemini-4dfg</link>
      <guid>https://dev.to/datadr1ven/from-boring-portfolios-to-chicken-powered-motivation-building-cluckclean-with-gemini-4dfg</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;Hi, I'm datadr1ven — a full-stack developer based on Planet Earth, who's obsessed with accelerating my workflow using AI tools like Grok in VSCode (via continue.dev). In 2025 I got really fast at turning ideas into working prototypes, and for 2026 my "New Year, New You" goal is simple: keep that speed while injecting more &lt;strong&gt;joy and personality&lt;/strong&gt; into what I build.&lt;/p&gt;

&lt;p&gt;This portfolio is my love letter to that philosophy. Instead of another serious dev site, I created &lt;strong&gt;CluckClean&lt;/strong&gt; — a whimsical yet fully functional dental hygiene motivator powered by Google Gemini. Picture Duolingo's owl... but it's a cheeky chicken reminding humans to brush, floss, and smile like champs. Why a chicken? Because sometimes the best way to build habits is with a bit of absurd humor — and because dev should be fun, not just functional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;Live Google Cloud Run site &lt;a href="https://cluckclean-726751379535.us-central1.run.app" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/60_j_Hmv4xU"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;The site features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A playful glassmorphism design in fresh mint/cyan pastels&lt;/li&gt;
&lt;li&gt;A big animated chicken mascot (Framer Motion powered)&lt;/li&gt;
&lt;li&gt;Gemini-generated daily brushing tips &amp;amp; motivational cluck-quotes&lt;/li&gt;
&lt;li&gt;Early prototype of a "Beak Check" interaction (describe your brushing routine → get personalized advice)&lt;/li&gt;
&lt;li&gt;full source code at &lt;a href="https://github.com/datadr1ven/CluckClean" rel="noopener noreferrer"&gt;CluckClean Github Repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16 (App Router) + TypeScript
&lt;/li&gt;
&lt;li&gt;Tailwind CSS for rapid, beautiful styling
&lt;/li&gt;
&lt;li&gt;Framer Motion for subtle entrances, hovers, and spring animations
&lt;/li&gt;
&lt;li&gt;Google Gemini API (2.5-flash) for content generation &amp;amp; personalization
&lt;/li&gt;
&lt;li&gt;Deployed on &lt;a href="https://cluckclean-726751379535.us-central1.run.app" rel="noopener noreferrer"&gt;&lt;strong&gt;Google Cloud Run&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Development Process&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I used my favorite workflow: Grok + continue.dev in VSCode to generate and refine code snippets at lightning speed. Started with a basic Next.js template, added the mascot &amp;amp; hero section first, then layered in Gemini-powered features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google AI Tools Used&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini API&lt;/strong&gt;: Core of the app — generates funny, encouraging daily tips ("Floss like your life depends on it... or at least your breath!"), motivational messages, and personalized hygiene advice.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google AI Studio&lt;/strong&gt;: Used to test &amp;amp; refine prompts quickly (e.g., "Generate 5 humorous chicken-themed brushing reminders for adults").
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Run&lt;/strong&gt;: For the required serverless deployment — auto-scales, easy HTTPS, and perfect for Next.js.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything was built iteratively in short sessions — MVP first, polish later. Total time so far: ~3 hours&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turning a silly idea (chicken dental coach) into something that's actually useful and delightful
&lt;/li&gt;
&lt;li&gt;How fast I can prototype with AI assistance — this whole thing would've taken weeks without Grok/continue.dev
&lt;/li&gt;
&lt;li&gt;The personality: The chicken mascot makes oral hygiene feel less like a chore and more like a game
&lt;/li&gt;
&lt;li&gt;Using Gemini multimodal in future iterations (e.g., analyze a "selfie smile" photo for tips)
&lt;/li&gt;
&lt;li&gt;Committing to joyful, creative dev in 2026 — this portfolio is proof that serious skills can coexist with ridiculous fun&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for checking it out! 🐔🪥✨&lt;br&gt;&lt;br&gt;
Tag me if you have brushing tips for CluckClean!&lt;/p&gt;

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

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>GBC Scorecard: Figma ➡️ Token-Rewarding Golf App with Uno Hot Design Agent 🏌️‍♂️💰</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Sun, 07 Dec 2025 15:29:21 +0000</pubDate>
      <link>https://dev.to/datadr1ven/gbc-scorecard-figma-token-rewarding-golf-app-with-uno-hot-design-agent-g9m</link>
      <guid>https://dev.to/datadr1ven/gbc-scorecard-figma-token-rewarding-golf-app-with-uno-hot-design-agent-g9m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/devteam/join-the-ai-challenge-for-cross-platform-apps-3000-in-prizes-25c3"&gt;AI Challenge for Cross-Platform Apps&lt;/a&gt; - Hot Design Showcase&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;This is my entry for the Uno Platform challenge's "Hot Design &amp;amp; Hot Design Agent Showcase" category. I used Uno's Figma-to-XAML import to start with a golf app concept screen, then applied the Hot Design Agent for refinements. The goal is to create an app that can serve as a frontend for my previous DEV.to challenge entry, Golf Barbecue Coin (GBC, available at &lt;a href="https://dev.to/datadr1ven/token-payout-based-on-private-information-golf-barbecue-coin-gbc-38d5"&gt;https://dev.to/datadr1ven/token-payout-based-on-private-information-golf-barbecue-coin-gbc-38d5&lt;/a&gt;), where private handicap information determines token payouts. Here, scores trigger simulated GBC rewards, demonstrating Uno's tools for building responsive UIs tied to backend logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Design Reference
&lt;/h2&gt;

&lt;p&gt;Figma community file used as starting point:&lt;br&gt;
App (Golf Concept) UI by Sang Component&lt;br&gt;
&lt;a href="https://www.figma.com/community/file/1269692226488411700/app-golf-concept-ui" rel="noopener noreferrer"&gt;https://www.figma.com/community/file/1269692226488411700/app-golf-concept-ui&lt;/a&gt;&lt;br&gt;
One frame exported → Uno Figma-to-XAML plugin → pasted into a fresh Material template. This screenshot is of the screen/component that was fed to Uno's Figma to XAML plugin:&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%2F9dhkr2pahg65cpfi0pbx.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%2F9dhkr2pahg65cpfi0pbx.png" alt="Screenshot of Figma component showing a golf app concept homescreen" width="251" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo,  Hot Design Agent in Action
&lt;/h2&gt;

&lt;p&gt;The following sequence of images shows the evolution of the interface over a series of prompts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Original Figma Import: The home screen from the Golf Scorecard App UI kit, post-XAML import. &lt;/li&gt;
&lt;/ul&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%2Fa7hmc2ap8s1ifaso5vn4.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%2Fa7hmc2ap8s1ifaso5vn4.png" alt="Screenshot of the Uno Figma to XAML plugin, showing the output of the plugin run on the Figma file from the previous image" width="492" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After Initial Refinements (Prompts 1-2): I was hoping for gradient background, enhanced hole cards (color-coded scores), handicap slider with net total animation. &lt;/li&gt;
&lt;/ul&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%2Fom94q16t57sq0hb3ep1r.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%2Fom94q16t57sq0hb3ep1r.png" alt="The interface after the first few hot design prompts" width="494" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Additional refinement attempts (Prompts 3-4): Attempted to refine UI elements, replace the UI text with GBC relevant quantities, add hole navigation, add a GBC logo.&lt;/li&gt;
&lt;/ul&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%2Fcu47n99gb2cha3q3vjoc.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%2Fcu47n99gb2cha3q3vjoc.png" alt="The interface after a few more hot design prompts" width="489" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app simulates GBC payouts: Under-par scores add tokens based on handicap privacy logic from the Xano backend, visualizing rewards in real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Process
&lt;/h2&gt;

&lt;p&gt;I used Uno's Hot Design Agent with this sequence of prompts, typed sequentially for iterative refinements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"Refine this imported Golf Concept App Figma home screen into a professional-grade golf hole entry interface in the style of Golf Pad, with a polished top golf course image (replace any non-golf placeholder with a high-quality SVG of a fairway and green, scaled to fit). Apply a sophisticated soft green gradient background (#E8F5E8 to #FFFFFF), subtle Gaussian blur on dashboard boxes for depth, and high-fidelity typography (Segoe UI, 18pt bold for headers). Maintain the four-box dashboard layout but prepare it for hole-specific data integration."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Replace the uno logo image with a high quality image of a fairway and green, scaled to fit, and remember that you are an expert UI designer. Enhance the top section: Add a centered hole configuration panel with 'Hole Number' (bold 24pt) and 'Par' (italic 16pt, e.g., Par 4), bound to mock data for seamless display. Ensure ergonomic placement above the dashboard, with subtle shadow elevation for a premium 3D feel."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"The graphic is still the Uno logo, change that to a golf hole graphic. Integrate expert stat inputs below the hole config: Add three tappable NumberBox fields for 'Shots' (total strokes), 'Shots to Hit Green' (fairway/GIR tracking), and 'Putts' (green performance), pre-populated with logical defaults (e.g., Shots = Par, Putts = 2). Use color-coded borders (green #4CAF50 for under-par efficiency, red #F44336 for over), with real-time validation and 0.3s fade transitions for updates. You are a UI expert, and so make this really polished and clean and futuristic."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Add navigation controls: Insert back and forth arrows (Material Icons, teal #009688, 48pt size) at the bottom toolbar, with ripple effects and boundary checks (e.g., disable back on hole 1, forth on 18). Bind to mock hole array for sequential navigation, ensuring smooth horizontal slide animations between holes for an intuitive, pro-level UX. Polish the dashboard boxes: Repurpose the four boxes as real-time summaries—Box 1 for running total shots, Box 2 for GIR percentage (computed from 'Shots to Hit Green'), Box 3 for average putts per hole, Box 4 for net score to par. Use mock progress rings or bar charts with fluid animations and precise 12pt secondary labels for data-dense, expert readability."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;Uno's Figma plugin provided an efficient starting point for the scorecard layout, reducing manual XAML work. The Hot Design Agent enabled rapid iterations through natural-language prompts, handling refinements like animations and bindings effectively. Challenges included misinterpretations of clear prompts, sometimes taking one step forward and two steps back (e.g. old design elements showing up after prompting them out), and general concept struggle in this applied domain (golf, whereas I had better success with the Hot Design agent when experimenting with a weather app). Overall, Uno's tools still saved time, and facilitated a unified codebase for multi-platform deployment, making it suitable for extending backend projects like GBC.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>unoplatformchallenge</category>
      <category>dotnet</category>
      <category>crossplatform</category>
    </item>
    <item>
      <title>F1 Driver Strategy API – AI-Refined Tactics with Xano</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Sat, 06 Dec 2025 00:32:52 +0000</pubDate>
      <link>https://dev.to/datadr1ven/f1-driver-strategy-api-ai-refined-tactics-with-xano-4f84</link>
      <guid>https://dev.to/datadr1ven/f1-driver-strategy-api-ai-refined-tactics-with-xano-4f84</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/xano-2025-11-20"&gt;Xano AI-Powered Backend Challenge&lt;/a&gt;: Production-Ready Public API&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;This is my entry for the Xano AI-Powered Backend Challenge's "Production-Ready Public API" prompt with my F1 Driver Insights API, building on my prior F1-related posts (and challenge entries) like a &lt;a href="https://dev.to/datadr1ven/leveraging-redis-80s-new-time-series-capabilities-in-a-real-time-formula-1-dashboard-p6b"&gt;Redis time-series dashboard for real-time race data&lt;/a&gt; and&lt;a href="https://dev.to/datadr1ven/evaluating-historically-optimal-fantasy-f1-teams-with-linear-programming-295h"&gt; linear programming for optimal fantasy teams&lt;/a&gt;—plus a &lt;a href="https://dev.to/datadr1ven/a-simple-but-useful-and-powerful-github-action-example-acb"&gt;GitHub Action for F1 data workflows&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;This backend service pulls real-time and historical Formula 1 data from the awesome OpenF1 API, enriches it with performance metrics, strategy recommendations, and AI-driven tactical advice—all from a single codebase in Xano. It's designed for fans, devs, or apps needing quick, personalized F1 insights (e.g., "How's Verstappen doing in aggressive mode during rain?").&lt;/p&gt;

&lt;p&gt;I focused on making it scalable, secure, and AI-assisted for refinements, while keeping it quota-friendly with a mix of rule-based logic and lightweight AI chaining. The result? A public API that's ready for production, with Swagger docs for easy testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Documentation
&lt;/h2&gt;

&lt;p&gt;The F1 Driver Insights API provides three core endpoints to deliver tailored race data for any driver in a given meeting (race weekend):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET /f1_driver_meeting_performance?meeting_key=1234&amp;amp;driver_number=1&lt;/strong&gt;: Fetches raw performance metrics like lap times, positions, and average pace, enriched with a calculated performance score (e.g., win probability based on historical ranks).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET /f1_driver_meeting_strategy?meeting_key=1234&amp;amp;driver_number=1&amp;amp;fanPrefs=aggressive&lt;/strong&gt;: Adds strategy recommendations, adjusting for user preferences (aggressive, defensive, balanced) with tire wear simulations and pit-stop tips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET /f1_driver_meeting_ai_strategy?meeting_key=1234&amp;amp;driver_number=1&amp;amp;fanPrefs=aggressive&lt;/strong&gt;: The x-factor endpoint—uses Xano's AI Function to self-refine the strategy with dynamic, natural-language tactics (e.g., "Push DRS in sector 2, but watch for rain!"), integrating weather data from OpenF1 for realistic morphing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's powered by OpenF1 for base data (laps, positions, weather), with Xano handling proxying, caching, security (JWT optional, rate limits), and personalization. Solves: Fans getting bland stats; this API "morphs" them into actionable, preference-based insights. E.g., for Verstappen in a rainy Monaco, aggressive prefs boost overtake scores but warn on aquaplaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo (video takes &lt;strong&gt;1&lt;/strong&gt; minute)
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/1be4f05289fb434cbc29e578d22316a5"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




&lt;p&gt;Example calls (no auth for GETs; use meeting_key from OpenF1 /meetings, driver_number like 1 for Verstappen):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance: &lt;code&gt;curl "https://x8ki-letl-twmt.n7.xano.io/api:qQiTXlkq/f1_driver_meeting_performance?meeting_key=1267&amp;amp;driver_number=4"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Strategy: &lt;code&gt;curl "https://x8ki-letl-twmt.n7.xano.io/api:qQiTXlkq/f1_driver_meeting_strategy?meeting_key=1267&amp;amp;driver_number=4&amp;amp;fanPrefs=aggressive"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AI Strategy: &lt;code&gt;curl "https://x8ki-letl-twmt.n7.xano.io/api:qQiTXlkq/f1_driver_meeting_ai_strategy?meeting_key=1267&amp;amp;driver_number=4"&lt;/code&gt; (changed to access controlled because my Gemini quota was being exhausted)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Response example for &lt;code&gt;driver_meeting_strategy&lt;/code&gt; (rainy conditions, aggressive prefs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"driver_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latest_position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pace_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"personalized_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Boosted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;aggressive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dinged&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;rain&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hammer the throttle out of turns, but switch to inters for rain!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"applied_preference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aggressive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"weather_summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"wind_kph"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"temp_c"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"raw_laps_sample"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Table of APIs call/response progession&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Morph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;|----------|---------------|------------------|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Performance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;meeting_key=&lt;/span&gt;&lt;span class="mi"&gt;1160&lt;/span&gt;&lt;span class="err"&gt;&amp;amp;driver=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"latest_position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pace_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"raw_laps_sample"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Strategy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Aggressive)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+&amp;amp;fanPrefs=aggressive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"personalized_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Push DRS in sector 2—overtake city!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"applied_preference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aggressive"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;AI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Strategy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Defensive)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+&amp;amp;fanPrefs=defensive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"personalized_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rain? Protect tires—two-stop safe."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"weather_summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"temp_c"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test it live at my public Xano instance: &lt;a href="https://x8ki-letl-twmt.n7.xano.io/api:qQiTXlkq/" rel="noopener noreferrer"&gt;https://x8ki-letl-twmt.n7.xano.io/api:qQiTXlkq/&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Prompt I Used
&lt;/h2&gt;

&lt;p&gt;I used XanoScript in VS Code for initial generation, then refined in the dashboard with Logic Assistant for the AI chain.&lt;/p&gt;

&lt;p&gt;Original XanoScript prompt (via Copilot for base endpoints):&lt;br&gt;
"Create a REST API for F1 driver insights: GET /races for list (proxy OpenF1 /meetings?year=2025, last 10 sorted), GET /race/{meeting_key}/driver/{driver_number}/insights for laps/positions/weather via OpenF1, with personalization query param fanPrefs. Secure with rate limits, cache 30s."&lt;/p&gt;

&lt;p&gt;Logic Assistant prompts for refinements (dashboard chat):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For weather integration: "After fetching laps/positions, add HTTP GET to OpenF1 /weather?meeting_key={{meeting_key}}. Parse body to $weather, merge into $raw. Default dry if failed."&lt;/li&gt;
&lt;li&gt;For rule-based personalization: "Add If/Else for fanPrefs (aggressive/defensive/balanced). Compute score from avg position/pace * multiplier (1.18/0.88/1.0). Adjust for weather (rain_mult=0.75 if rain&amp;gt;0). Random tip from map."&lt;/li&gt;
&lt;li&gt;For AI self-refine (x-factor in /meeting_driver_ai_strategy): "Add AI Function after rules: Input $raw and fanPrefs. Generate natural-language tip incorporating weather/score (e.g., 'Wet track—go aggressive on inters!'). Merge to $result."&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  How I Refined the AI-Generated Code
&lt;/h2&gt;

&lt;p&gt;Before: Raw OpenF1 fetches (simple HTTP proxies, no personalization). Slow for repeated calls, no context.&lt;/p&gt;

&lt;p&gt;After: Added caching (30s per query for scalability), JWT middleware for optional auth, rate limits (100/min/IP). For x-factor, chained rule-based math (Compute blocks for scores) with AI Function for dynamic tips—e.g., weather dings scores by 25% in rain. Integrated driver filtering on OpenF1 params for specificity.&lt;/p&gt;

&lt;p&gt;Code snippet (from Function Stack export):&lt;br&gt;
Before (raw fetch):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP GET OpenF1 /laps?meeting_key={{meeting_key}}&amp;amp;driver_number={{driver_number}} → $laps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After (enriched):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If $weather.rain_intensity &amp;gt; 0, $weather_mult = 0.75 else 1.0
$personalized_score = round(($pace_score * 0.6 + $position_score * 0.4) * $fanPrefs_mult * $weather_mult, 2)
AI Prompt: "Generate tip using $raw, score, weather: e.g., 'Rain? Inters and push!'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This made it prod-ready: Handles errors (defaults for null data), scales (caching avoids OpenF1 hits), and morphs outputs based on prefs/weather.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with Xano
&lt;/h2&gt;

&lt;p&gt;As a newbie to Xano, I loved the no-code Function Stack—drag-and-drop HTTP, Compute, and AI blocks saved hours vs. coding a Node server. Logic Assistant nailed prompt-based generation, like auto-building weather chains. Challenge: Free Gemini tier hit 429 on tests; solved with rule fallback for core logic, keeping AI light for tips. Overall, Xano's seamless OpenF1 integration and Swagger auto-docs made this a breeze—highly recommend for AI-assisted backends. Can't wait to expand with webhooks for live race updates!&lt;/p&gt;

&lt;p&gt;What do you think, DEV? Upvote if F1 + AI vibes! Source on GitHub: [&lt;a href="https://github.com/datadr1ven/f1_insights" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/f1_insights&lt;/a&gt;]. Test and feedback welcome.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>xanochallenge</category>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>ForkQuest - Zork, but you fork the universe</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Sun, 02 Nov 2025 22:35:03 +0000</pubDate>
      <link>https://dev.to/datadr1ven/forkquest-zork-but-you-fork-the-universe-2n37</link>
      <guid>https://dev.to/datadr1ven/forkquest-zork-but-you-fork-the-universe-2n37</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/agentic-postgres-2025-10-22"&gt;Agentic Postgres Challenge with Tiger Data&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;ForkQuest lets anyone build, play, and fork AI text adventures in seconds — powered by &lt;strong&gt;Tiger Data’s instant forks, hybrid search, and agentic MCP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt; A single-page web app (built with Next.js + Vercel) where users create and play a shareable Zork-like text adventure. It's viral: Generate, play, fork to branch stories, share links. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/datadr1ven/forkquest" rel="noopener noreferrer"&gt;ForkQuest repository&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;

&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/b35bc9293e2548e3807fc803e363f71d"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  How I Used Agentic Postgres
&lt;/h2&gt;

&lt;p&gt;How it showcases features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid Search:&lt;/strong&gt; Players type natural language queries ("find sword in dark cave") → BM25 keywords + vectors retrieve lore/items/NPCs from your game DB instantly. Ranks fuzzy/spelled-wrong searches perfectly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast Forks:&lt;/strong&gt;  "Branch Story" button → Zero-copy fork in &amp;lt;1s (even 1GB+ games). Test wild plot twists safely; merge back if liked. Shows fork time/timer for wow factor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP Sidebar Chat&lt;/strong&gt;  "Add dragon boss" or "Make puzzle harder" → Agent uses MCP server + Tiger prompts to auto-generate schema inserts/queries/migrations. No SQL needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overall Experience
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why compelling?&lt;/strong&gt; Fun, addictive, tweetable ("I forked my apocalypse story!").&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>agenticpostgreschallenge</category>
      <category>ai</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Token Payout based on Private Information: Golf Barbecue Coin (GBC)</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Sun, 07 Sep 2025 17:55:38 +0000</pubDate>
      <link>https://dev.to/datadr1ven/token-payout-based-on-private-information-golf-barbecue-coin-gbc-38d5</link>
      <guid>https://dev.to/datadr1ven/token-payout-based-on-private-information-golf-barbecue-coin-gbc-38d5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/midnight-2025-08-20"&gt;Midnight Network "Privacy First" Challenge&lt;/a&gt; - Protect That Data prompt&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My golf friends and I want each other to improve. And so while we play our own games, and keep track of our own (private) stats, we incentivize two quantities, by penalizing two related events. To keep track of our penalties, we created, and have used for the past year, &lt;a href="https://sepolia.etherscan.io/token/0xcdb546e60aa0430c26a0d21a06429337960cf668#balances" rel="noopener noreferrer"&gt;an ERC-20 token&lt;/a&gt; with a funny name. We chose this name, because at the end of summer, we required each other to use our accumulated token balances, to pitch in for an end of season get together.&lt;/p&gt;

&lt;p&gt;Using this token requires quite a bit of manual effort, and we prefer a workflow where each of us can enter our (private) hole details, and have the token balance update automatically based on penalty events (which can be computed from the private hole details). This seems like a perfect use case for Midnight/Compact, and falls into the category of &lt;em&gt;proving eligibility for token payout without disclosing personal information&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This was a difficult project for me, as I was on my own (in the sense that I'm couldn't find documentation/examples) in implementing a witness based on changing private state. I am proud of accomplishing this in a basic form, although I'm sure the implementation leaves a lot to be desired. Over the next few months, I plan to finish all of the TODOs, and transition the prototype to production.&lt;/p&gt;

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

&lt;p&gt;All of the code I developed is &lt;a href="https://github.com/datadr1ven/gbc" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The repository contains a compact contract called &lt;code&gt;gbc.compact&lt;/code&gt;, an &lt;code&gt;api&lt;/code&gt;/&lt;code&gt;cli&lt;/code&gt; bootstrapped by &lt;a href="https://github.com/kaleababayneh/create-midnight-app" rel="noopener noreferrer"&gt;&lt;code&gt;create-midnight-app&lt;/code&gt;&lt;/a&gt; in &lt;code&gt;boilerplate/contract-cl&lt;/code&gt;, and a UI in &lt;code&gt;boilderplate/gbc-ui&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is a video of the UI in action, which displays the (public) GBC balances, as a function of (private) hole data input.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/2fbXvweDSuc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In the video below you can see a deployed &lt;code&gt;gbc&lt;/code&gt; contract being invoked, with the witness being based on private dynamic data (user provided hole results). I need help wiring actual contract calls up to my UI, and this part of the project is left as a TODO.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/VeezSo42Mp0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Midnight's Technology
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Utilized the compact language in writing &lt;code&gt;gbc.compact&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The super awesome helper &lt;a href="https://github.com/kaleababayneh/create-midnight-app" rel="noopener noreferrer"&gt;&lt;code&gt;create-midnight-app&lt;/code&gt;&lt;/a&gt; generated cli scaffold from the gbc contract. Extending the scaffold was nontrivial, as it made overly simplistic assumptions (such as a static witness)&lt;/li&gt;
&lt;li&gt;Spent a significant amount of time attempting to write a UI that actually interacts with a deployed contract. Tried two main approaches, 1) adapting the &lt;code&gt;example-bboard&lt;/code&gt; UI, which uses modules such as the &lt;a href="https://docs.midnight.network/develop/reference/midnight-api/dapp-connector/" rel="noopener noreferrer"&gt;Midnight DApp Connector API&lt;/a&gt;, and 2) attempting to use &lt;a href="https://builder.openzeppelin.com/" rel="noopener noreferrer"&gt;OpenZeppelin's UI builder&lt;/a&gt;. In the end, I was unsuccessful with both approaches. A simple tutorial here  would've helped a lot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another TODO before going production will (likely) be to incorporate &lt;a href="https://github.com/OpenZeppelin/compact-contracts/blob/main/contracts/src/token/FungibleToken.compact" rel="noopener noreferrer"&gt;OpenZeppelin's FungibleToken compact contract&lt;/a&gt;, as the current token-like capabilities in &lt;code&gt;gbc.compact&lt;/code&gt; are rudimentary at best. A simple tutorial here also would've helped a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Protection as a Core Feature
&lt;/h2&gt;

&lt;p&gt;To achieve this prototype required implementing a &lt;a href="https://docs.midnight.network/learn/glossary#witness" rel="noopener noreferrer"&gt;witness&lt;/a&gt;  based on changing private state. Specifically, as a user enters their result for a particular golf hole, this private information informs the witness &lt;a href="https://github.com/datadr1ven/gbc/blob/179503111adc49fb4885de52562a424b09044da0/gbc.compact#L10" rel="noopener noreferrer"&gt;&lt;code&gt;latestResult()&lt;/code&gt;&lt;/a&gt;, so that the contract &lt;a href="https://docs.midnight.network/learn/glossary#circuit" rel="noopener noreferrer"&gt;circuit&lt;/a&gt; &lt;a href="https://github.com/datadr1ven/gbc/blob/179503111adc49fb4885de52562a424b09044da0/gbc.compact#L24" rel="noopener noreferrer"&gt;&lt;code&gt;nextHole()&lt;/code&gt;&lt;/a&gt; can be invoked, and the appropriate balance bookkeeping ledger quantities can be updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up Instructions / Tutorial
&lt;/h2&gt;

&lt;p&gt;As described in the &lt;a href="https://github.com/datadr1ven/gbc/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;,&lt;/p&gt;

&lt;p&gt;start by running &lt;code&gt;npm install&lt;/code&gt; at the top level directory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;for the contract&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;run &lt;code&gt;npm install&lt;/code&gt; from &lt;code&gt;boilerplate/contract&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;npm run compact&lt;/code&gt; from &lt;code&gt;boilerplate/contract&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;npm run build&lt;/code&gt; from &lt;code&gt;boilerplate/contract&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;for the cli&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;run &lt;code&gt;npm install' from boilerplate/contract-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;npm run build&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run either &lt;code&gt;npm run standalone&lt;/code&gt; or &lt;code&gt;npm run testnet-remote&lt;/code&gt; (the latter requires starting a proof server via docker)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;for the ui&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;run &lt;code&gt;npm install&lt;/code&gt; from &lt;code&gt;boilerplate/gbc-ui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;npm run dev&lt;/code&gt; from &lt;code&gt;boilerplate/gbc-ui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;point a browser at &lt;code&gt;localhost:5173&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>midnightchallenge</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Leveraging Redis 8.0's New Time Series Capabilities in a Real-Time Formula 1 Dashboard</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Sat, 09 Aug 2025 00:16:34 +0000</pubDate>
      <link>https://dev.to/datadr1ven/leveraging-redis-80s-new-time-series-capabilities-in-a-real-time-formula-1-dashboard-p6b</link>
      <guid>https://dev.to/datadr1ven/leveraging-redis-80s-new-time-series-capabilities-in-a-real-time-formula-1-dashboard-p6b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Beyond the Cache&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Cover image free for use under &lt;a href="https://creativecommons.org/licenses/by/2.0" rel="noopener noreferrer"&gt;the CC-2 license&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I am a Formula 1 fan, and a programmer, and in the past have posted here on dev.to about a Formula 1 &lt;a href="https://datadr1iven.github.com/teamtool" rel="noopener noreferrer"&gt;fantasy tool&lt;/a&gt; I wrote that uses &lt;a href="https://dev.to/datadr1ven/evaluating-historically-optimal-fantasy-f1-teams-with-linear-programming-295h"&gt;Linear Programming to compute optimal fantasy teams&lt;/a&gt; and &lt;a href="https://dev.to/datadr1ven/a-simple-but-useful-and-powerful-github-action-example-acb"&gt;Github actions to automatically update the tool with new race data&lt;/a&gt;. In this post, I describe a Formula 1 inspired usage of Redis 8.0's new time series &lt;a href="https://redis.io/docs/latest/develop/data-types/timeseries/" rel="noopener noreferrer"&gt;"upgrade package"&lt;/a&gt; (a play on words, where an &lt;a href="https://www.raceteq.com/articles/2025/01/how-teams-make-changes-to-improve-performance-in-f1" rel="noopener noreferrer"&gt;upgrade package&lt;/a&gt; in F1 refers to changes made to the car throughout the season).&lt;/p&gt;

&lt;p&gt;There is a &lt;a href="https://www.linkedin.com/posts/ainsworld_have-25-years-really-passed-or-has-formula-activity-7355503539986526208-FXzo" rel="noopener noreferrer"&gt;"cognitive ergonomics" legend&lt;/a&gt; in Formula 1, whereby in 2001, a Race Strategy Analyst for McLaren invented a screen called the McLaren Track Viewer (MTV). The MTV shows the time gaps between race cars on a circle, as opposed to overlaid on the race track, and gives teams actionable visual cues, such as where a car considering a pit stop, is forecast to reemerge time gap wise. &lt;/p&gt;

&lt;p&gt;The technical sophistication of the original MTV was impressive, given the limited realtime data available &lt;em&gt;circa&lt;/em&gt; 2001. Today (24 years later), there is copious telemetry available, and so prototyping an MTV should be straightforward! In this post, we cobble together an MTV minimum viable product (MVP), in other words, an MTV MVP 😂🤣.&lt;/p&gt;

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

&lt;p&gt;And here it a short screen recording of what I accomplished! &lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/3888237a9a704132a71720515bc241dd"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Go check out the live (and open source) site at &lt;a href="https://datadr1ven.github.io/mtvmvp" rel="noopener noreferrer"&gt;https://datadr1ven.github.io/mtvmvp&lt;/a&gt;. Lots of features to add, of course, including the ability to pick race/driver/lap. The page currently runs on data from Lewis Hamilton's lap 14 at the 2024 Miami Grand Prix.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;p&gt;The Redis 8 feature set I leaned on is the new affordance for &lt;a href="https://redis.io/docs/latest/develop/data-types/timeseries/" rel="noopener noreferrer"&gt;time series data&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;There are a few sources for F1 telemetry, for this MVP we use &lt;a href="https://openf1.org/" rel="noopener noreferrer"&gt;OpenF1&lt;/a&gt;, specifically their &lt;a href="https://openf1.org/#intervals" rel="noopener noreferrer"&gt;&lt;em&gt;interval&lt;/em&gt;&lt;/a&gt; REST API. We insert interval data into Redis 8.0 as a time series, which you can see we query about here:&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%2Fni9wd03h2zhukfenv530.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%2Fni9wd03h2zhukfenv530.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shows that we have 10811 samples currently in the Redis 8.0 timeseries (from the 2023 Las Vegas Grand Prix). The efficiency and utility of Redis time-series routines made this MVP really straightforward to rapidly prototype via experimentation. To close, here is a query that shows a subset of timeseries data points restricted to a timestamp range.&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%2Fo9ogixe218kgiatul85n.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%2Fo9ogixe218kgiatul85n.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>A simple, but useful, and *powerful* GitHub action example</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Thu, 05 Jun 2025 02:57:42 +0000</pubDate>
      <link>https://dev.to/datadr1ven/a-simple-but-useful-and-powerful-github-action-example-acb</link>
      <guid>https://dev.to/datadr1ven/a-simple-but-useful-and-powerful-github-action-example-acb</guid>
      <description>&lt;p&gt;We maintain a Formula 1 Fantasy hobbyist/enthusiast &lt;a href="https://datadr1ven.github.io/teamtool/" rel="noopener noreferrer"&gt;tool&lt;/a&gt;, which we wrote a &lt;a href="https://dev.to/datadr1ven/evaluating-historically-optimal-fantasy-f1-teams-with-linear-programming-295h"&gt;technical article&lt;/a&gt; about here last year. One room for improvement was in automation -- specifically, after each race concluded, we had to perform manual action to propagate the results to our tool. Well, we finally took the time automate that step, using &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub actions&lt;/a&gt;. After figuring things out, the whole automation capability took only &lt;a href="https://github.com/datadr1ven/teamtool/blob/main/.github/workflows/update_race_data.yml" rel="noopener noreferrer"&gt;28 lines&lt;/a&gt; (over half of which are superfluous), and so we thought that this could make for a nice tutorial and/or example of how to use GitHub actions.&lt;/p&gt;

&lt;p&gt;So in our tool, which is hosted via GitHub pages, the data that changes over time (i.e. after each grand prix) is entirely contained in &lt;a href="https://github.com/datadr1ven/teamtool/blob/main/race_data.js" rel="noopener noreferrer"&gt;this file&lt;/a&gt;, of which here is a gestalt look at it...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const active_season = 2025
export const latest_race = "Monaco Grand Prix";
export const race_names = ['AUS', 'CHN', 'JPN', 'BHR', 'SAU', 'USA', 'ITA', 'MCO'];
export const driver_points = {'GAS': [1, -8, 0, 13, -17, 18, 3, -20], 'ALO': [-20, -16, ...};
export const driver_prices = {'GAS': [11.8, 11.2, 10.6, 10, 9.4, 8.8, 8.2, 7.6], 'ALO': [8.8, 8.2, ...};
export const team_points = {'ALP': [-14, -6, 9, 22, -6, 10, 10, -11], 'AST': [1, 4, ...};
export const team_prices = {'ALP': [9.5, 8.9, 8.3, 7.7, 7.9, 8.1, 8.3, 7.7], 'AST': [8.5, 7.9, ...};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file is created by piping the contents of &lt;a href="https://f1fantasytools.com/statistics" rel="noopener noreferrer"&gt;f1fantasytools.com's statistics page&lt;/a&gt; through a &lt;a href="https://github.com/datadr1ven/teamtool/blob/main/stats_to_race_data.py" rel="noopener noreferrer"&gt;script we wrote&lt;/a&gt; to transform the data into the form our tool uses. In other words, after each race, we would run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl https://f1fantasytools.com/statistics | python3 stats_to_race_data.py &amp;gt; race_data.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then manually update the repository with the resulting file. This is the process we automated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: update race data
run-name: pull results and reorganize data for our platform
on:
  schedule:
    # * is a special character in YAML so you have to quote this string
    - cron:  '0 1 * * *'
jobs:
  Update-Race-Data:
    runs-on: ubuntu-latest
    permissions:
      contents: write    
    steps:
      - name: Check out repository code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.head_ref }}
      - name: Download latest race data
        uses: sozo-design/curl@v1.0.2
        with:
          args: -o statistics.html https://f1fantasytools.com/statistics
      - name: Process latest race data
        run: |
          cat statistics.html | python3 stats_to_race_data.py &amp;gt; race_data.js      
      - name: Remove our downloaded race data so as to not pollute repo
        run: |
          rm statistics.html
      - name: Commit any changes back to repo
        uses: stefanzweifel/git-auto-commit-action@v5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cron schedule is such that this runs once per day, which is acceptable because there is sometimes a lag in the final points assignment. The steps are somewhat self explanatory. First the repository is cloned by the runner. Then the latest statistics are downloaded via curl and saved to a file. That file is piped through our data transformation script. Then the downloaded html is removed, and then the results are committed back to the repository.&lt;/p&gt;

&lt;p&gt;Here's the first run of this action after the 2025 Spanish Grand Prix - &lt;a href="https://github.com/datadr1ven/teamtool/actions/runs/15382619543/job/43275725139" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/teamtool/actions/runs/15382619543/job/43275725139&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is the commit that resulted from that run - &lt;br&gt;
&lt;a href="https://github.com/datadr1ven/teamtool/commit/d8a769c2c3c9275adeede040619c3a6f284089fb" rel="noopener noreferrer"&gt;https://github.com/datadr1ven/teamtool/commit/d8a769c2c3c9275adeede040619c3a6f284089fb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you find this GitHub Action interesting and useful!&lt;/p&gt;

</description>
      <category>automation</category>
      <category>webdev</category>
      <category>github</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Evaluating (Historically Optimal) Fantasy F1 Teams with Linear Programming</title>
      <dc:creator>datadr1ven </dc:creator>
      <pubDate>Thu, 21 Nov 2024 22:30:20 +0000</pubDate>
      <link>https://dev.to/datadr1ven/evaluating-historically-optimal-fantasy-f1-teams-with-linear-programming-295h</link>
      <guid>https://dev.to/datadr1ven/evaluating-historically-optimal-fantasy-f1-teams-with-linear-programming-295h</guid>
      <description>&lt;p&gt;I'm a programmer and a &lt;a href="https://www.formula1.com/" rel="noopener noreferrer"&gt;Formula 1&lt;/a&gt; fan. When I started playing &lt;a href="https://fantasy.formula1.com" rel="noopener noreferrer"&gt;F1's fantasy league&lt;/a&gt;, my mind naturally went to algorithms.&lt;/p&gt;

&lt;p&gt;The goal in the &lt;a href="https://fantasy.formula1.com" rel="noopener noreferrer"&gt;F1 fantasy game&lt;/a&gt; is to pick 5 drivers and 2 teams, while staying under a price cap, that based on race performance, scores a maximum number of points. This sounds like a fairly traditional computer science optimization problem with constraints, right?&lt;/p&gt;

&lt;p&gt;More precisely, for any historical window of races, we can use &lt;a href="https://en.m.wikipedia.org/wiki/Linear_programming" rel="noopener noreferrer"&gt;Linear Programming&lt;/a&gt;, to find an optimal team. Strictly speaking, this solution is to a simplified version of the game (the real game lets you make changes to your team week to week, as well as has some wildcard factors), but is a useful starting point nonetheless.&lt;/p&gt;

&lt;p&gt;Putting together &lt;a href="https://datadr1ven.github.io/teamtool/" rel="noopener noreferrer"&gt;our capability&lt;/a&gt; required minimal dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data: we grab points/prices data from the excellent &lt;a href="https://f1fantasytools.com/" rel="noopener noreferrer"&gt;F1 Fantasy Tools&lt;/a&gt; site&lt;/li&gt;
&lt;li&gt;linear programming library: we use &lt;a href="https://github.com/jvail/glpk.js" rel="noopener noreferrer"&gt;glpk.js&lt;/a&gt;, which is a JavaScript/WebAssembly port of the old trusty &lt;a href="https://www.gnu.org/software/glpk/" rel="noopener noreferrer"&gt;GLPK&lt;/a&gt; solver&lt;/li&gt;
&lt;li&gt;platform: we use GitHub pages, where our code is open sourced under the &lt;a href="https://github.com/datadr1ven/teamtool/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt; and can be found &lt;a href="https://github.com/datadr1ven/teamtool" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current capability has a simple interface, as shown in this screenshot.&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%2Fa3hwzbfnexnyg8e84g3u.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%2Fa3hwzbfnexnyg8e84g3u.png" alt="screenshot of https://datadr1ven.github.io/teamtool" width="800" height="1427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The crux of the capability is the behinds-the-scenes construction of the linear programs, which are then fed to the glpk.js solver running in your browser. Here is an actual linear program constructed by our tool (with many lines omitted).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "name": "LP",
    "objective": {
        "direction": 2,
        "name": "obj",
        "vars": [
            {
                "name": "VER",
                "coef": 593
            },
            {
                "name": "OCO",
                "coef": 112
            },
   [...18 additional drivers, omitted for brevity]

            {
                "name": "AST",
                "coef": 360
            },
   [...9 additional teams, omitted for brevity]

        ]
    },
    "subjectTo": [
        {
            "name": "cons1",
            "vars": [
                {
                    "name": "VER",
                    "coef": 30
                },
                {
                    "name": "NOR",
                    "coef": 23
                },
[...18 additional drivers, omitted for brevity]

                {
                    "name": "MCL",
                    "coef": 23.2
                },
[...9 additional teams, omitted for brevity]

            ],
            "bnds": {
                "type": 3,
                "ub": 100,
                "lb": 0
            }
        },
        {
            "name": "cons2",
            "vars": [
                {
                    "name": "VER",
                    "coef": 1
                },
                {
                    "name": "OCO",
                    "coef": 1
                },
[...18 additional drivers, omitted for brevity]

            ],
            "bnds": {
                "type": 5,
                "ub": 5,
                "lb": 5
            }
        },
        {
            "name": "cons3",
            "vars": [
                {
                    "name": "RED",
                    "coef": 1
                },
[...9 additional teams, omitted for brevity]
Show quoted text
[...18 additional drivers, omitted for brevity]

        {
            "name": "cons29",
            "vars": [
                {
                    "name": "FER",
                    "coef": 1
                }
            ],
            "bnds": {
                "type": 4,
                "ub": 1,
                "lb": 0
            }
        },
[...9 additional teams, omitted for brevity]

    ],
    "generals": [
        "VER",
        "OCO",
[...18 additional drivers, omitted for brevity]
        "ALP",
[...9 additional teams, omitted for brevity]
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For those unfamiliar with the F1 naming colloquialism, drivers are referred to by the first three letters of their surname (e.g. VER is Max Verstappen), and teams each have a 3 letter mnemonic (e.g. AST is Aston Martin Motorsports).&lt;/p&gt;

&lt;p&gt;And so in these linear programs, there is a variable per driver (named with their three letter code) and a variable per team, which must take the value of 1 (on your fantasy team) or 0 (not on your fantasy team). And the objective of the linear program is to maximize points, subject to the sum of the price not exceeding the budget threshold, and also subject to the constraint that the sum of the driver variables is 5, and the team variables is 2. Very straightforward!&lt;/p&gt;

&lt;p&gt;A nuance is that you get to choose a "2x driver," who scores twice the points they earned that week. To accommodate this nuance, we generate 20 separate linear programs (each taking a different driver as the 2x), and run glpk.js on each of those 20 programs, to find the one with maximum points.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: we have no affiliation to Formula One (or any of their companies or brands). The author of this capability is simply a fan who enjoys playing the fantasy game. This information is provided with no guarantees as to its' accuracy, use at your own risk.'&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
