<?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: Chijioke Osadebe</title>
    <description>The latest articles on DEV Community by Chijioke Osadebe (@iamceejay).</description>
    <link>https://dev.to/iamceejay</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%2F2012776%2F9eb11008-f18c-4865-80f5-97dbb9085370.jpeg</url>
      <title>DEV Community: Chijioke Osadebe</title>
      <link>https://dev.to/iamceejay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamceejay"/>
    <language>en</language>
    <item>
      <title>Rememberly: Helping dementia patients reconnect with their cherished moments.</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Sun, 01 Mar 2026 19:53:43 +0000</pubDate>
      <link>https://dev.to/iamceejay/rememberly-helping-dementia-patients-reconnect-with-their-cherished-moments-57bh</link>
      <guid>https://dev.to/iamceejay/rememberly-helping-dementia-patients-reconnect-with-their-cherished-moments-57bh</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 Rememberly for families caring for loved ones with dementia and memory loss, especially in Lagos, Nigeria where I live. As a student doctor, I see this struggle daily. Patients forget familiar faces while families watch helplessly.&lt;/p&gt;

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

&lt;p&gt;Rememberly is an AI ecosystem that acts as a compassionate companion for individuals experiencing memory loss. It transforms a lifetime of scattered digital memories into interactive, narrative experiences.&lt;/p&gt;

&lt;p&gt;Rememberly has two parts that work together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Family &amp;amp; Caregivers:&lt;/strong&gt; A simple interface lets the support network upload and organize photos, videos, voice notes, and written stories into one shared library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the Patient:&lt;/strong&gt; A gentle interface becomes their personal memory companion. They can ask questions and browse memories. The AI proactively surfaces relevant moments from their life.&lt;/p&gt;

&lt;p&gt;Both parts are powered by &lt;strong&gt;Mistral&lt;/strong&gt; and &lt;strong&gt;Vectara&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://rememberly-sigma.vercel.app" rel="noopener noreferrer"&gt;Live Project Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Instructions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; Onboard as a new patient, upload pictures, videos or text to build your library. With that you can test the complete workflow&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Use pre-configured test accounts to experience the patient/caregiver workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Accounts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Email: &lt;a href="mailto:james5@gmail.com"&gt;james5@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Password: qahket-pumde6-Rosdub&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;There's a helpful sequence diagram in the &lt;a href="https://github.com/CijeTheCreator/rememberly.git" rel="noopener noreferrer"&gt;README&lt;/a&gt; that illustrates how everything works.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/rememberly" rel="noopener noreferrer"&gt;
        rememberly
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Rememberly is an AI ecosystem that acts as a compassionate companion for individuals experiencing memory loss.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Rememberly&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Rememberly is an AI-powered memory companion for families caring for loved ones with dementia and memory loss. It transforms scattered photos, videos, and stories into an interactive memory library with two interfaces: one for caregivers to upload and organize content, and one for patients to explore memories through natural conversation and AI-generated "Cinematic Shows."&lt;/p&gt;
&lt;p&gt;The system uses Mistral AI for intelligent reasoning and content generation, Vectara for secure RAG-based memory retrieval (with isolated knowledge boxes per patient), Deepgram for speech synthesis, and Convex for serverless functions and database management. Each patient's memories are kept completely private and isolated.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sequence Diagram&lt;/h2&gt;
&lt;/div&gt;

  &lt;div class="js-render-enrichment-target"&gt;
    &lt;div class="render-plaintext-hidden"&gt;
      &lt;pre&gt;sequenceDiagram
    participant Caregiver
    participant Patient
    participant Convex
    participant Mistral
    participant Vectara
    participant Deepgram
    Note over Caregiver,Vectara: Media Upload Flow
    Caregiver-&amp;gt;&amp;gt;Convex: Upload media (images/videos/text)
    Convex-&amp;gt;&amp;gt;Mistral: Extract tags &amp;amp; generate description
    Mistral--&amp;gt;&amp;gt;Convex: Return tags &amp;amp; description
    Convex-&amp;gt;&amp;gt;Vectara: Ingest document to patient corpus
    Convex-&amp;gt;&amp;gt;Convex: Store media with tags
    Note over Patient,Deepgram:&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/rememberly" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




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

&lt;p&gt;I built Rememberly with a security-first approach. Despite the short length and hacky nature of the hackathon, the sensitive nature of memory and health data demanded this from the start.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vectara&lt;/strong&gt; powers the RAG pipeline. For maximum security, each patient gets their own isolated knowledge box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mistral AI&lt;/strong&gt; powers the agent at the core. It reasons, orchestrates, and decides how to present memories. Sometimes it responds with simple text. Other times it creates immersive &lt;strong&gt;Cinematic Shows&lt;/strong&gt;. When images are uploaded, an AI agent tags them for future use. These tags enable the &lt;strong&gt;Cinematic Shows&lt;/strong&gt; and help answer patient questions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deepgram&lt;/strong&gt; handles speech-to-text conversion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Convex&lt;/strong&gt; serves as the database and runs all serverless functions. Everything works together to keep data private while delivering a seamless experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>MammoAI: Transform mammograms into clear diagnoses and actionable care.</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Sun, 09 Nov 2025 23:21:49 +0000</pubDate>
      <link>https://dev.to/iamceejay/mammoai-transform-mammograms-into-clear-diagnoses-and-actionable-care-1nf2</link>
      <guid>https://dev.to/iamceejay/mammoai-transform-mammograms-into-clear-diagnoses-and-actionable-care-1nf2</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;blockquote&gt;
&lt;p&gt;Breast cancer is the most common cancer among women worldwide. Early detection can drastically improve survival rates, yet delayed mammogram interpretation leaves many women waiting weeks without guidance.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;MammoAI revolutionizes breast cancer diagnostics by transforming mammograms into clear, evidence-based reports with actionable next steps. The app addresses critical delays in analysis and limited specialist access, providing faster, clinically informed insights directly from medical imaging and literature.&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%2F58cxa8gpqwy1v66w9ywj.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%2F58cxa8gpqwy1v66w9ywj.png" alt="Architecture Diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mammogram Upload &amp;amp; Preprocessing&lt;/strong&gt; – Users can upload images in common medical formats; the app prepares the image for analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annotation + Notes&lt;/strong&gt; – Health specialists can optionally mark areas of interest and add notes to guide the analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Diagnosis &amp;amp; Treatment Reports&lt;/strong&gt; – Fine-tuned models and LLM-powered agents analyze images and notes, querying specialized medical knowledge bases to generate actionable insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Final Report&lt;/strong&gt; – Combines mammogram findings, diagnosis, recommended next steps, and practitioner notes into a single, clear report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MammoAI achieves the simplest workflow for breast cancer analysis while integrating AI-assisted interpretation and evidence-backed recommendations.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://mammoai-tiger.vercel.app" rel="noopener noreferrer"&gt;Live Project Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CijeTheCreator/mammoai-tiger.git" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/4hELf-mGuaA"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Instructions
&lt;/h2&gt;

&lt;p&gt;Use the following publicly available mammogram images for testing purposes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Images
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tiger-agenticpostgress-bucket.s3.eu-north-1.amazonaws.com/mammograms/IMG001.png" rel="noopener noreferrer"&gt;Sample Mammogram 1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tiger-agenticpostgress-bucket.s3.eu-north-1.amazonaws.com/mammograms/IMG002.png" rel="noopener noreferrer"&gt;Sample Mammogram 2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tiger-agenticpostgress-bucket.s3.eu-north-1.amazonaws.com/mammograms/IMG003.png" rel="noopener noreferrer"&gt;Sample Mammogram 3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I started by authenticating with the Tiger CLI to get access to manage my services.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs1urwopae8nbcymg7w3.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%2Fxs1urwopae8nbcymg7w3.png" alt="CLI Authentication"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Claude code, I created a new service through the Tiger MCP. The service spun up smoothly, but the MCP couldn’t import my documents, so I uploaded them manually via the UI.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfp0ny90h3ic6h1j4r3p.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%2Fvfp0ny90h3ic6h1j4r3p.png" alt="Service Creation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the data was in, I created a fork of the service and filtered it to include only articles I had curated on treatment.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2x725pr72xoxiq5n29xo.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%2F2x725pr72xoxiq5n29xo.png" alt="Treatment Fork"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also filtered the original service with articles I provided on diagnosis. Using the CLI, I confirmed both services were up and running.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fas3sqcgw67ca6ji4hvm1.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%2Fas3sqcgw67ca6ji4hvm1.png" alt="Diagnosis Filter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the end, I had two focused services, each tailored to a specific set of insights, ready to explore.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7csalcj6ipa4ljbiy43.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%2Ft7csalcj6ipa4ljbiy43.png" alt="Services CLI"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;My overall experience was just fair. I was unable to import the documents I needed using the Tiger MCP, which may have been due to a skill gap on my part. However, I was able to comfortably perform forks and filter the database tables within the MCP.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>agenticpostgreschallenge</category>
      <category>ai</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Consultify: Your Doctor Speaks Every Language</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Sun, 28 Sep 2025 22:11:50 +0000</pubDate>
      <link>https://dev.to/iamceejay/consultify-your-doctor-speaks-every-language-png</link>
      <guid>https://dev.to/iamceejay/consultify-your-doctor-speaks-every-language-png</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kendoreact-2025-09-10"&gt;KendoReact Free Components Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Healthcare in Africa faces critical accessibility challenges. Millions of lives are lost because patients cannot effectively communicate their symptoms to healthcare providers. With 1,500 to 3,000 languages spoken across Africa, language barriers between patients and healthcare providers create significant obstacles to quality care.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Consultify revolutionizes telemedicine by enabling context-aware RAG and multilingual communication. The platform addresses the critical language barrier problem in African healthcare through intelligent symptom understanding, automated doctor selection, and real-time multilingual consultation capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Symptom Clerking&lt;/strong&gt; - Users describe symptoms to an AI agent with vectorized access to medical textbooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Doctor Selection&lt;/strong&gt; - Automatically matches patients with the most suitable specialists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual Consultation&lt;/strong&gt; - Real-time translation allowing patients and doctors to communicate in their native languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prescription Assistance&lt;/strong&gt; - AI-powered prescription recommendations using the British National Formulary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The platform achieves the simplest onboarding experience in telemedicine while providing seamless multilingual communication and prescription assistance for healthcare providers.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://consultify-kendo.vercel.app" rel="noopener noreferrer"&gt;Live Project Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CijeTheCreator/consultify-kendo.git" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Instructions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; Onboard as a new patient and create a consultation to test the complete clerking workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Use pre-configured test accounts to experience the multilingual consultation feature:&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Doctor (English):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email: &lt;a href="mailto:testdoctor@gmail.com"&gt;testdoctor@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Password: 12345678&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Patient (French):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email: &lt;a href="mailto:testpatient@gmail.com"&gt;testpatient@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Password: 12345678&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quick Test:&lt;/strong&gt; Log in with either account, navigate to "Previous Consultations," and select the existing test consultation to see real-time multilingual communication in action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Open the second account in a private/incognito window to test the multilingual chat between both users simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  KendoReact Components Used
&lt;/h2&gt;

&lt;p&gt;Button, Data Grid, Date Input, DropDown, Badge, Input, TextArea, Progress Bar, Avatar, Notification&lt;/p&gt;

&lt;h3&gt;
  
  
  Hero Page
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; Button, Avatar (Navbar)&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%2Flj1ksq34id24ptxegx25.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%2Flj1ksq34id24ptxegx25.png" alt="Hero Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hero page features prominent action buttons for getting started and navigating the platform, with avatar components in the navigation bar for user identification.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onboarding Pages
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; DropDown, Input, Progress Bar&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%2Fj8aa5z67jrp2zwwx1hpz.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%2Fj8aa5z67jrp2zwwx1hpz.png" alt="Onboarding Page Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The onboarding flow utilizes dropdown components for specialty selection, input fields for user information, and progress bars to guide users through the multi-step registration process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Patient and Doctor Dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; Button, Data Grid, Avatar (Navbar)&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%2F0e9wcx6n0vycvc6gjqhf.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%2F0e9wcx6n0vycvc6gjqhf.png" alt="Dashboard Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both patient and doctor dashboards feature data grids for displaying consultation history and appointments, with action buttons for quick navigation and avatar components in the navigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consultations Page
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; Data Grid&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%2F1xopxv4vbnj64yaetjlc.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%2F1xopxv4vbnj64yaetjlc.png" alt="Consultations Page Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The consultations page uses data grid components to display comprehensive consultation records with filtering and sorting capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consultation Chat Page
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; Button, Badge, TextArea, Avatar&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%2Fw6mlbsfuob6gkx0n3lkk.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%2Fw6mlbsfuob6gkx0n3lkk.png" alt="Consultation Chat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real-time chat interface includes text area components for message input, badges for status indicators, avatars for participant identification, and action buttons for consultation management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prescription Modal
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; Date Input&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%2Fkrtx050neka0k2gffwdn.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%2Fkrtx050neka0k2gffwdn.png" alt="Prescription Modal Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The prescription creation modal incorporates date input components for medication scheduling and prescription validity periods.&lt;/p&gt;

&lt;h3&gt;
  
  
  Toast Notifications
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components Used:&lt;/strong&gt; Notification&lt;/p&gt;

&lt;p&gt;Notification components are implemented throughout the application for user feedback on actions like successful logins, prescription submissions, and system updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  [Optional: RAGs to Riches prize category] Nuclia Integration
&lt;/h2&gt;

&lt;p&gt;Consultify leverages Nuclia's RAG-as-a-service infrastructure to power its intelligent medical consultation system. The integration includes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medical Knowledge Base:&lt;/strong&gt; Vectorized access to authoritative medical resources including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The British National Formulary for evidence-based drug information&lt;/li&gt;
&lt;li&gt;"Microbiology, Pharmacology, and Immunology for Pre-Clinical Students" textbook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Intelligent Workflows:&lt;/strong&gt; Two primary RAG-powered agents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Symptom Clerking Agent&lt;/strong&gt; - Analyzes patient symptoms against medical literature to recommend appropriate specialists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prescription Assistant Agent&lt;/strong&gt; - Reviews patient-doctor conversations to suggest evidence-based prescriptions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every response from the RAG workflow is grounded with information from these medical textbooks, ensuring clinically accurate and contextually appropriate recommendations for both symptom assessment and prescription guidance.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Maillet: The World's First Mail-Based EVM Wallet</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Mon, 09 Jun 2025 06:52:19 +0000</pubDate>
      <link>https://dev.to/iamceejay/maillet-the-worlds-first-mail-based-evm-wallet-o9b</link>
      <guid>https://dev.to/iamceejay/maillet-the-worlds-first-mail-based-evm-wallet-o9b</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/postmark"&gt;Postmark Challenge: Inbox Innovators&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;I created &lt;strong&gt;Maillet&lt;/strong&gt; — an &lt;strong&gt;EVM wallet&lt;/strong&gt; designed to be operated completely through &lt;strong&gt;mail&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maillet&lt;/strong&gt; lets you do everything a traditional crypto wallet can—through &lt;strong&gt;email&lt;/strong&gt;. Users can send transactions and check their Ethereum balances just by sending a message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every email address becomes a wallet with Maillet.&lt;/strong&gt; You can send funds to friends, co-workers, or anyone using just their email, whether they’ve signed up or not. When they onboard, the funds are already waiting for them.&lt;/p&gt;

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

&lt;p&gt;You can try Maillet by sending an email with your intentions to &lt;a href="mailto:transactions@maillet.tech"&gt;transactions@maillet.tech&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Things you can try:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a wallet&lt;/li&gt;
&lt;li&gt;Transfer ether to any email address&lt;/li&gt;
&lt;li&gt;Get your transaction history&lt;/li&gt;
&lt;li&gt;Get your balance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can visit the live site for Maillet too &lt;a href="https://maillet.vercel.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegmalzusutvfrs2m69yr.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%2Fegmalzusutvfrs2m69yr.png" alt="Account creation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizzrdhr680fglg0nim8g.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%2Fizzrdhr680fglg0nim8g.png" alt="Balance inquiry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6rqr6rl08kj7asiviiaw.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%2F6rqr6rl08kj7asiviiaw.png" alt="Transfer Ether"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhep7ob30kvqdzx8u1af.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%2Fhhep7ob30kvqdzx8u1af.png" alt="Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing
&lt;/h2&gt;

&lt;p&gt;To try out Maillet, just send an email to &lt;a href="mailto:transactions@maillet.tech"&gt;transactions@maillet.tech&lt;/a&gt;. You'll receive 0.0025 test ETH to explore its features.&lt;/p&gt;

&lt;p&gt;If you prefer using a dashboard, onboard &lt;a href="https://maillet.vercel.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt; with the same email address you used to create your account.&lt;/p&gt;

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

&lt;p&gt;Check out the complete source code for Maillet on GitHub! The repo includes everything you need — installation instructions, well-commented code, and all logic behind the scenes.&lt;/p&gt;

&lt;p&gt;Feel free to explore, fork, contribute, or adapt it for your own use. The project is regularly maintained, and all pull requests are welcome!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/maillet" rel="noopener noreferrer"&gt;
        maillet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An EVM wallet designed to be operated completely through mail.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Maillet&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An EVM wallet designed to be operated completely through mail.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Things you can do&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Send/Receive funds to any email address&lt;/li&gt;
&lt;li&gt;Send/Receive funds to any wallet address&lt;/li&gt;
&lt;li&gt;Fetch your balance&lt;/li&gt;
&lt;li&gt;Fetch your transaction history&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quickstart&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Host System Package Dependencies&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;After system dependencies are installed, clone this repository:&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; clone and enter repo&lt;/span&gt;
git clone https://github.com/CijeTheCreator/maillet&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; fill out .env.example&lt;/span&gt;
mv .env.example .env&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-dotenv notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-v"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;ENCRYPTION_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;RPC_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;NEXTAUTH_SECRET&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;

&lt;span class="pl-v"&gt;NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;CLERK_SECRET_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;CLERK_WEBHOOK_SIGNING_SECRET&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;

&lt;span class="pl-v"&gt;COINGECKO_API_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;ETHERSCAN_API_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;

&lt;span class="pl-v"&gt;FAUCET_PRIVATE_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;


&lt;span class="pl-v"&gt;GOOGLE_API_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;SENDGRID_API_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;ETH_RATE&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;
&lt;span class="pl-v"&gt;WALLET_API_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;VALUE_HERE&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker build -t maillet &lt;span class="pl-c1"&gt;.&lt;/span&gt;
docker run -d --name maillet -p 3000:3000 -p 5000:5000 maillet_app --env-file .env
&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The Next.js client will run on localhost:3000.&lt;/li&gt;
&lt;li&gt;The flask server (for parsing mails) will run on localhost:5000.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Contributions are welcome! Please feel free to submit a Pull…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/maillet" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;I built &lt;strong&gt;Maillet&lt;/strong&gt; as a simple &lt;strong&gt;mail-based Ethereum wallet&lt;/strong&gt; for the hackathon. It lets users send an email to &lt;strong&gt;&lt;a href="mailto:transactions@maillet.tech"&gt;transactions@maillet.tech&lt;/a&gt;&lt;/strong&gt; to interact with the Ethereum blockchain. They can create an account, check their balance, or send funds—either to another Maillet user or to a wallet address using a public key. Everything is done by writing a plain email.&lt;/p&gt;

&lt;p&gt;When a user sends a message, Postmark parses the email and sends the content to my Inbound Webhook at &lt;code&gt;/postmark-webhook&lt;/code&gt;. I then pass the message to Google Gemini’s LLM, which figures out what the user wants to do—like send ETH or check their balance. Once the intent is clear, the transaction is handled on-chain.&lt;/p&gt;

&lt;p&gt;Maillet sends a confirmation email back to the user with the result. Since I couldn’t get my Postmark account verified in time, I used a different mail service to send those receipts.&lt;/p&gt;

&lt;p&gt;You can view the code for the webhook &lt;a href="https://github.com/CijeTheCreator/maillet/blob/main/maillet-py/app.py#L18" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/postmark-webhook&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;postmark_webhook&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Endpoint to receive Postmark webhooks and print the request body
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;received_email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;from_account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;received_email&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;From&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;received_email&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Subject&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;received_email&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TextBody&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;user_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sender: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;from_account&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Subject: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;generate_system_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_account&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;]}&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Webhook received&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error processing webhook: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)}),&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Architecture
&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%2Fraw3ophmxxg7c97a9tor.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%2Fraw3ophmxxg7c97a9tor.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweaiaocc0m9ue89l0a43.gif" 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%2Fweaiaocc0m9ue89l0a43.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>postmarkchallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Travel Genie: An AI-Powered Agent to Help Tourists Plan Smarter and Effortlessly Cut Trip Costs Using BrightData's MCP Server</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Mon, 26 May 2025 06:46:56 +0000</pubDate>
      <link>https://dev.to/iamceejay/travel-genie-an-ai-powered-agent-to-help-tourists-plan-smarter-and-effortlessly-cut-trip-costs-15ep</link>
      <guid>https://dev.to/iamceejay/travel-genie-an-ai-powered-agent-to-help-tourists-plan-smarter-and-effortlessly-cut-trip-costs-15ep</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/brightdata-2025-05-07"&gt;Bright Data AI Web Access Hackathon&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I created &lt;strong&gt;Travel Genie&lt;/strong&gt; — an AI-powered agent designed to help tourists plan smarter and cut down &lt;strong&gt;trip costs&lt;/strong&gt; effortlessly.&lt;/p&gt;

&lt;p&gt;Travel Genie identifies cost-saving opportunities by fetching real-time flight and hotel data, calculates total expenses based on trip duration, and converts it all into the user’s local currency. It then &lt;strong&gt;scrapes real-time sentiment and trending activities&lt;/strong&gt; from across the web to &lt;strong&gt;generate a personalized itinerary&lt;/strong&gt;, presented as a calendar that seamlessly &lt;strong&gt;integrates with Google Calendar, Spplr, and other app&lt;/strong&gt;s.&lt;/p&gt;

&lt;p&gt;Manual planning can be tedious and often leads to overspending. &lt;strong&gt;Travel Genie automates the process&lt;/strong&gt;, delivering smart, data-driven travel itineraries in minutes.&lt;/p&gt;

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

&lt;p&gt;The demo GIF highlights the core features of Travel Genie — showing how it fetches live pricing, analyzes real-time sentiment about the destination, and builds a comprehensive itinerary to help users make the most of their adventure.&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%2F7jszsshncz1h1jza9r9n.gif" 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%2F7jszsshncz1h1jza9r9n.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer: The GIF is sped up to shorten the Bright Data tool calls. In real time, scraping requests can take up to 2 minutes — or even longer if the agent chooses not to execute them in parallel.&lt;/strong&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%2Fgsgc8s41jvn8mbzr7qhy.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%2Fgsgc8s41jvn8mbzr7qhy.png" alt="Visa Requirements"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ek4a7mjiyw5u6uckrg8.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%2F1ek4a7mjiyw5u6uckrg8.png" alt="Things to do"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fook75u4a5y75krzez998.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%2Fook75u4a5y75krzez998.PNG" alt="Calendar Integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxo433d3m69frgw6rg679.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%2Fxo433d3m69frgw6rg679.png" alt="Welcome Page"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Real-time flight pricing
&lt;/li&gt;
&lt;li&gt;Real-time hotel pricing
&lt;/li&gt;
&lt;li&gt;Sentiment analysis on destination (from Reddit)
&lt;/li&gt;
&lt;li&gt;Reddit-powered itinerary planning based on recent tourist experiences
&lt;/li&gt;
&lt;li&gt;Easy calendar integration (Google Calendar, Spplr, etc.)
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 Code Repository
&lt;/h3&gt;

&lt;p&gt;Check out the complete source code for Travel Genie on GitHub! The repo includes everything you need — installation instructions, well-commented code, and all logic behind the scenes.&lt;/p&gt;

&lt;p&gt;Feel free to explore, fork, contribute, or adapt it for your own use. The project is regularly maintained, and all pull requests are welcome!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/travelgenie-brightdata" rel="noopener noreferrer"&gt;
        travelgenie-brightdata
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An AI-powered agent designed to help tourists plan smarter and cut down trip costs effortlessly
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Travel Genie&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An AI-powered agent designed to help tourists plan smarter and cut down trip costs effortlessly&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Real-time flight pricing&lt;/li&gt;
&lt;li&gt;Real-time hotel pricing&lt;/li&gt;
&lt;li&gt;Sentiment analysis on destination (updated live)&lt;/li&gt;
&lt;li&gt;Reddit-powered itinerary planning based on recent tourist experiences&lt;/li&gt;
&lt;li&gt;Easy calendar integration (Google Calendar, Spplr, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quickstart&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Host System Package Dependencies&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;After system dependencies are installed, clone this repository:&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; clone and enter repo&lt;/span&gt;
git clone https://github.com/CijeTheCreator/travelgenie-brightdata&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Start the services&lt;/span&gt;
docker-compose up&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The Client will be running on localhost:3000
The Agent Server will be running on localhost:8000
The Travel Genie MCP Server will be running on localhost:80/
The Calendar file server will be running on localhost:3030/calendars/
The Brightdata Agent will be running on localhost:5000&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation (If you don't want to use Docker)&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;LangGraph server&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; agent/
poetry install
poetry run server&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;MCP Servers&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; mcp-servers/calandar-mcp
uv sync
uv run python calendar-mcp-server.py sse&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Next.js client&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; client/
npm&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/travelgenie-brightdata" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  🌐 Live Site
&lt;/h3&gt;

&lt;p&gt;You can try Travel Genie live!&lt;br&gt;
Log in with the following demo credentials:&lt;br&gt;
Username: &lt;code&gt;newuser&lt;/code&gt;&lt;br&gt;
Password: &lt;code&gt;2025BrightDataDevChallenge&lt;/code&gt;&lt;br&gt;
&lt;a href="https://travelgenie-brightdata.vercel.app/" rel="noopener noreferrer"&gt;TravelGenie Live Site&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ How I Used Bright Data’s Infrastructure
&lt;/h2&gt;

&lt;p&gt;Bright Data’s MCP server was key to enabling Travel Genie’s scraping capabilities using just natural language instructions — no browser automation needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scraping Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Public Sentiment Discovery
Travel Genie uses Bright Data MCP to gather real-time sentiment about the destination with this prompt:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
You are a web scraping agent tasked with gathering and analyzing public sentiment about [LOCATION] as a tourism destination, using Reddit as the primary data source.

1. Search Reddit for the most recent and relevant posts, comments, and discussions mentioning [LOCATION] in the context of travel, tourism, vacations, or visitor experiences.

2. Extract the main text content from each reddit page

3. Analyze the text to identify sentiments about:
   - Accommodation and facilities
   - Local culture and people
   - Safety and accessibility
   - Food and dining experiences

4. Summarize the overall sentiment into a report covering:
   - Most frequently praised aspects
   - Common complaints or warnings
   - General travel advice and tips shared by Reddit users
   - Overall sentiment score or conclusion regarding [LOCATION] as a tourism spot

Return the summary as the final output.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Finding Top Activities Based on Tourist Feedback
With this prompt, the agent uncovers popular activities recent visitors have enjoyed:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Your task is to gather information about things to do for tourists in a specific location.

    Start by searching Reddit for recent and relevant posts, comments, or threads that mention activities, attractions, or recommendations for tourists in the target location.

    Extract the URLs of the most relevant Reddit posts (e.g., from subreddits like r/travel, r/solotravel, r/AskReddit, r/CityName, or any other local subreddits).

    For each URL, retrieve the full page content, including the main text of posts and top comments that describe tourist activities or attractions.

    Additionally, if available and relevant, collect external links mentioned in those Reddit posts that lead to other tourism-related content.

    Summarize the key findings into a concise list of recommended things to do in the location, emphasizing popular activities and unique local experiences mentioned by Reddit users.

    Return the summary along with the source URLs used for the information.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Visa Requirement Extraction from visahq.com
Travel Genie retrieves real-time visa info using the prompt:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Go to https://www.visahq.com/
Navigate to https://www.visahq.com/
Click on the element with the css selector "#s2id_s2-country-citizens-top"
Type [ORIGIN_COUNTRY] into the input element with the css selector "#s2id_autogen1_search"
Click on the element with the css selector "#s2id_s2-country-dest-top"
Type [DESTINATION_COUNTRY] into the input element with the css selector "#s2id_autogen2_search"
Click on the button element with css selector "#submit-cntr-dest2-top"
Wait for the page to navigate
Summarize the contents of the new page


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All this was accomplished without writing a single line of browser automation code — just natural language prompts through Bright Data’s MCP Server.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Performance Improvements
&lt;/h2&gt;

&lt;p&gt;Access to real-time web data brought a major upgrade to Travel Genie. It now delivers up-to-the-minute insights into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local moods
&lt;/li&gt;
&lt;li&gt;Safety concerns or political unrest
&lt;/li&gt;
&lt;li&gt;Upcoming festivals or local events
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For instance, spotting negative posts about safety may suggest adjusting the itinerary, while a surge of excitement around a local festival might lead to a last-minute detour — creating a smarter, more responsive travel plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 Use Case &amp;amp; Impact
&lt;/h2&gt;

&lt;p&gt;Travel Genie solves real-world travel planning pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cuts down travel costs:&lt;/strong&gt; Helping users spend less on logistics and more on memorable experiences&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automates itinerary creation:&lt;/strong&gt; Ensuring travelers make the most of their trip with minimal manual effort&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Lessons Learned Working with Bright Data MCP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Time and Framing Matter&lt;/li&gt;
&lt;li&gt;Iteration Is Key&lt;/li&gt;
&lt;li&gt;Clear Prompts = Predictable Output&lt;/li&gt;
&lt;li&gt;Specify full URLs when navigating&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>brightdatachallenge</category>
      <category>ai</category>
      <category>webdata</category>
    </item>
    <item>
      <title>Bloom – A Privacy-Focused Women’s Health App</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Mon, 24 Mar 2025 05:07:59 +0000</pubDate>
      <link>https://dev.to/iamceejay/bloom-a-privacy-focused-womens-health-app-41ie</link>
      <guid>https://dev.to/iamceejay/bloom-a-privacy-focused-womens-health-app-41ie</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kendoreact"&gt;KendoReact Free Components Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Empowering Women with Knowledge, Not Ads&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Millions of women—especially those in under-served communities—struggle to access accurate reproductive health information. Many existing apps are cluttered with intrusive ads, making it difficult to learn, track cycles, and make informed health decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bloom&lt;/strong&gt; is a free, ad-free, and privacy-first reproductive health app designed to change that. It provides reliable information and intuitive tools to help women track their menstrual cycle, ovulation, and pregnancy—without compromising their data privacy.&lt;/p&gt;

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

&lt;p&gt;Bloom is a &lt;strong&gt;secure and AI-powered reproductive health app&lt;/strong&gt; that functions similarly to Flo but &lt;strong&gt;without intrusive ads or data privacy concerns&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complete Data Privacy&lt;/strong&gt;: All calculations are done &lt;strong&gt;on your device&lt;/strong&gt;, not our servers. The only time your data ever leaves your device is if you explicitly choose to share it with a partner through Bloom’s encrypted system—ensuring that just you and your partner can access your personal information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless, Easy Onboarding&lt;/strong&gt;: Bloom features a &lt;strong&gt;streamlined onboarding process&lt;/strong&gt;, built using KendoReact’s Stepper component, making it effortless for users to get started.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🎥 &lt;a href="https://vimeo.com/1068732939?share=copy#t=0" rel="noopener noreferrer"&gt;&lt;strong&gt;Demo Video&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://kendo-bloom.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;Live Demo&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://github.com/CijeTheCreator/kendo-bloom" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub Repo&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4wfsmsc41cyo1fpmmu2.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%2Fa4wfsmsc41cyo1fpmmu2.png" alt="Hero" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4mgo4uq5pntcrsj9vfk.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%2Fi4mgo4uq5pntcrsj9vfk.png" alt="Tracker" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Inspiration Behind Bloom&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As a medical student in a developing country, I’ve participated in numerous medical outreach programs to support underprivileged communities. On &lt;strong&gt;World Women’s Day&lt;/strong&gt;, I had the opportunity to educate young girls in local villages about reproductive health—and I was shocked by how many of them had little to no knowledge about their own bodies.&lt;/p&gt;

&lt;p&gt;When I discovered the &lt;strong&gt;KendoReact Challenge&lt;/strong&gt;, I saw an opportunity to build something meaningful. Leveraging KendoReact’s Calendar and DataGrid components, I developed &lt;strong&gt;Bloom&lt;/strong&gt;—an app that not only simplifies cycle tracking but also empowers women with accurate, accessible reproductive health information.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;My KendoReact Experience&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Bloom utilizes &lt;strong&gt;KendoReact’s free components&lt;/strong&gt; to deliver a sleek, professional, and user-friendly experience:&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Window&lt;/strong&gt; – Used for secondary windows (e.g., logging details)&lt;br&gt;
✔ &lt;strong&gt;Calendar&lt;/strong&gt; – Enables seamless date selection across the app&lt;br&gt;
✔ &lt;strong&gt;Stepper&lt;/strong&gt; – Powers Bloom’s streamlined onboarding process&lt;br&gt;
✔ &lt;strong&gt;AppBar&lt;/strong&gt; – Main navigation&lt;br&gt;
✔ &lt;strong&gt;Avatar&lt;/strong&gt; – Displays user profiles&lt;br&gt;
✔ &lt;strong&gt;Button&lt;/strong&gt; – Aids in interactions across the UI&lt;br&gt;
✔ &lt;strong&gt;Card&lt;/strong&gt; – Displays reproductive health tips and guides&lt;br&gt;
✔ &lt;strong&gt;Input&lt;/strong&gt; – Handles text input fields&lt;br&gt;
✔ &lt;strong&gt;DataGrid&lt;/strong&gt; – Displays logged symptoms, moods, and cycle data&lt;br&gt;
✔ &lt;strong&gt;Tooltip&lt;/strong&gt; – Provides helpful in-app guidance&lt;/p&gt;

&lt;p&gt;Although KendoReact had a steep learning curve at first, once I grasped its core concepts, it became an incredibly powerful tool in building &lt;strong&gt;Bloom’s intuitive user experience&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Bloom Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Many period-tracking apps claim to support women’s health but often &lt;strong&gt;lock critical health insights behind paywalls&lt;/strong&gt; or &lt;strong&gt;instill fear-based tactics&lt;/strong&gt; to push premium subscriptions. As one user on Reddit put it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“It’s frustrating that a period app—something meant to help us—forces us to pay just to access accurate information about our own bodies.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bloom is different. &lt;strong&gt;It’s free, ad-free, and built with women’s autonomy in mind.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What You Can Do with Bloom&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;🌸 &lt;strong&gt;Track Your Cycle&lt;/strong&gt;&lt;br&gt;
Always be prepared—know when your period is about to start.&lt;/p&gt;

&lt;p&gt;🤍 &lt;strong&gt;Understand Your Fertility&lt;/strong&gt;&lt;br&gt;
Track ovulation and maximize your chances of conception.&lt;/p&gt;

&lt;p&gt;💬 &lt;strong&gt;Ask Questions&lt;/strong&gt;&lt;br&gt;
Get personalized answers from &lt;strong&gt;BloomAI&lt;/strong&gt;, trained on menstruation-related topics.&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Log Your Symptoms &amp;amp; Mood&lt;/strong&gt;&lt;br&gt;
View a full breakdown of your symptoms and emotions over time, visualized using the &lt;strong&gt;KendoReact DataGrid&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;❤️ &lt;strong&gt;Share Bloom with a Partner&lt;/strong&gt;&lt;br&gt;
Help your partner understand your cycle and provide better support.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;AI That Understands You&lt;/strong&gt;&lt;br&gt;
BloomAI integrates a &lt;strong&gt;fine-tuned Google Gemini model&lt;/strong&gt; to deliver accurate, context-aware answers tailored to your logs and patterns.&lt;/p&gt;




&lt;p&gt;Bloom is more than just a period tracker—it’s a &lt;strong&gt;safe space for women to learn, track, and take control of their reproductive health&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s build technology that truly serves women. 💜&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>FraudWatch: Helping You Avoid Financial Fraud and Making a Positive Social Impact through AI</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Mon, 27 Jan 2025 07:54:24 +0000</pubDate>
      <link>https://dev.to/iamceejay/fraudwatch-helping-you-avoid-financial-fraud-and-making-a-positive-social-impact-through-ai-255a</link>
      <guid>https://dev.to/iamceejay/fraudwatch-helping-you-avoid-financial-fraud-and-making-a-positive-social-impact-through-ai-255a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://srv.buysellads.com/ads/long/x/T6EK3TDFTTTTTT6WWB6C5TTTTTTGBRAPKATTTTTTWTFVT7YTTTTTTKPPKJFH4LJNPYYNNSZL2QLCE2DPPQVCEI45GHBT" rel="noopener noreferrer"&gt;Agent.ai&lt;/a&gt; Challenge: Full-Stack Agent (&lt;a href="https://dev.to/challenges/agentai"&gt;See Details&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Financial fraud is a rising global problem, costing billions of dollars and hurting millions of people every year. Personal accounts about scams and false calls emphasize the emotional and financial costs of these crimes. This project aims to create a prototype that resembles a Fraud Protection agent and can assist ordinary individuals, particularly those who are less aware and new digital users, in avoiding scam calls and messages.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Our major goal in designing FraudWatch was to provide a solid solution that was targeted to the specific needs of the people who are most vulnerable to these scams.&lt;br&gt;
Such people may include senior citizens, teenagers with new digital bank accounts, people from rural areas who are becoming the emerging digital banking customer segment, people who are not fluent in English or are not very tech savvy, and so on, though recent reports suggest that well-informed individuals in senior private and public sector roles have also fallen victim to such fraud.&lt;/p&gt;

&lt;p&gt;Our application integrates Whatsapp with AgentAI to transcribe fraud calls, summarize the fraud calls, identify the possibility of fraud, analyze a potential fraud, categorize it according to RBI (Reserve Bank of India) fraud classification guidelines, assist in generating an incident report of the possible fraud and finally submit the incident with a single message via automated API integration to the agencies in charge of enforcing law enforcement.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;According to Backlinko, WhatsApp is the world's leading messaging platform, available in over 180 countries and 16 languages. It is the most popular messaging app in over 100 countries, with 2.7 billion active users globally. Remarkably, 33% of its customers are 50 and older, making it the most convenient platform for my application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even though Agent.ai's dashboard provides an excellent user experience, managing everything directly through WhatsApp on the phone makes it far more accessible to people who require it the most.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agent.ai/agent/analysis-agent" rel="noopener noreferrer"&gt;Scam call detection via WhatsApp. &lt;/a&gt;&lt;br&gt;
You can send an audio recording of any suspicious call, and it will be transcribed. In the background, a webhook activates an Agent.ai process that analyzes and categorizes the nature of the scam, providing you with clear next steps to take.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agent.ai/agent/fraud-chatbot-agent" rel="noopener noreferrer"&gt;General Fraud Chatbot.  &lt;/a&gt;&lt;br&gt;
If a user sends a question about fraud instead of an audio recording, a webhook activates another Agent.ai process to deliver answers tailored to meet the user's needs as accurately as possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agent.ai/agent/3z9ylgnmh2sexyvf" rel="noopener noreferrer"&gt;Fraud Reporting.&lt;/a&gt;&lt;br&gt;
After identifying a call as fraudulent, users can ask the AI agent to generate and submit a report through a simple text message. The agent will review the call transcript and create a well-structured draft that is ready for submission to the appropriate authorities.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2F8vtkhu79gpnneky5w96n.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%2F8vtkhu79gpnneky5w96n.png" alt="Image description" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Composer Agent&lt;br&gt;
This agent is the brains of FraudWatch and is in charge of digesting all incoming inputs from the Whatsapp chatbot. It assesses if the message is a fraud call recording or a question connected to fraud, and then passes it to the relevant AI agent for further action.&lt;/p&gt;

&lt;p&gt;Fraud Chatbot Agent&lt;br&gt;
This agent gives users clear and meaningful responses to their fraud-related concerns.&lt;/p&gt;

&lt;p&gt;Reporting Agent&lt;br&gt;
A dedicated AI agent designed to assist in drafting reports. It helps refine the user's report, ensuring the generated content accurately describes the details of the fraudulent call.&lt;/p&gt;

&lt;p&gt;Find the agents here&lt;br&gt;
&lt;a href="https://agent.ai/agent/fraudwatch-composer" rel="noopener noreferrer"&gt;https://agent.ai/agent/fraudwatch-composer&lt;/a&gt;&lt;br&gt;
&lt;a href="https://agent.ai/agent/fraud-chatbot-agent" rel="noopener noreferrer"&gt;https://agent.ai/agent/fraud-chatbot-agent&lt;/a&gt;&lt;br&gt;
&lt;a href="https://agent.ai/agent/analysis-agent" rel="noopener noreferrer"&gt;https://agent.ai/agent/analysis-agent&lt;/a&gt;&lt;br&gt;
&lt;a href="https://agent.ai/agent/3z9ylgnmh2sexyvf" rel="noopener noreferrer"&gt;https://agent.ai/agent/3z9ylgnmh2sexyvf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In addition to the AI Agents, I developed a WhatsApp chatbot, which serves as the main interface for users to interact with FraudWatch. It acts as an API Gateway, forwarding user requests—whether as text or voice notes—directly to the AI agents for processing.&lt;/p&gt;

&lt;p&gt;I supplied an example scam call retrieved from YouTube for testing reasons here: Please find the &lt;a href="https://github.com/CijeTheCreator/agentai_server/blob/468759f01fb40791f8868210ae629d3f12c301ef/.github/audio/call_scam_sample1.mp3" rel="noopener noreferrer"&gt;Sample Scam call for testing&lt;/a&gt; link below.&lt;br&gt;
Test the implementation here: &lt;a href="https://wa.link/ehvq9q" rel="noopener noreferrer"&gt;Whatsapp Implementation&lt;/a&gt; link here.&lt;br&gt;
Explore the chatbot's implementation here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/agentai_server" rel="noopener noreferrer"&gt;
        agentai_server
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      DESCRIPTION
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Simple Flask AWS S3 Uploader&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Simple and quick AWS S3 upload capability for Flask using Boto3 &amp;amp; env variables&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Download and install locally&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git clone git@github.com:jelmerdejong/simple-flask-s3-uploader.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd simple-flask-s3-uploader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkvirtualenv simple-flask-s3-uploader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Set local environment variables&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Open your environments postactive file (&lt;code&gt;nano $VIRTUAL_ENV/bin/postactivate&lt;/code&gt;) and add the following lines:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;cd ~/Projects/simple-flask-s3-uploader
export APP_SETTINGS="config.DevelopmentConfig"
export SECRET_KEY="your-random-secret-key"
export S3_BUCKET="your-bucket-name"
export S3_KEY="your-aws-secret-key"
export S3_SECRET_ACCESS_KEY="your-aws-secret-access-key"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it!&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;export FLASK_APP=app.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flask run&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;



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


&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The user sends a scam call recording or fraud-related question via WhatsApp.&lt;br&gt;
The WhatsApp bot forwards the message to an AI Composer via a webhook.&lt;br&gt;
The composer analyzes the input and determines the appropriate next step.&lt;/p&gt;

&lt;p&gt;Depending on the input, different AI agents are triggered to:&lt;br&gt;
Transcribe call recordings.&lt;br&gt;
Analyze call recordings for fraud.&lt;br&gt;
Generate an initial draft of a report for the relevant authorities.&lt;br&gt;
Answer Questions related to fraud.&lt;/p&gt;

&lt;p&gt;The Agent uses AssemblyAI to produce transcriptions behind the scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent.ai Experience
&lt;/h2&gt;

&lt;p&gt;Using Agent AI was a game-changer for my project. I was able to quickly build an advanced agent without writing an enormous codebase, I appreciate its intuitive drag-and-drop interface for ordering actions. I was amazed at how quickly I could deploy the bot to start interacting with users.&lt;/p&gt;

&lt;p&gt;However, I encountered some issues:&lt;br&gt;
I found the Email function a little wonky and difficult to use. The formatting kept getting in the way. It put placeholders for the Recipient's Name, my name, and contact address, I couldn't find anything in the docs on how to stop it.&lt;br&gt;
Secondly, collecting files uploaded to agent AI proved very difficult. I eventually found a way of sending the files, but the file object wasn't structured JSON. My workaround was to send the file object as plain text, and manually correct it in my server.&lt;/p&gt;

&lt;p&gt;Apart from that the experience was bliss.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;As FraudWatch continues to evolve, the focus remains on improving accessibility to the people who need it the most. Looking ahead, future improvements include expanding to other platforms like Telegram and Facebook Messenger, Incorporating feedback from real-world users and parties involved in the ecosystem, and collaborating with government agencies and regulatory bodies, such as the EFCC Economic and Financial Crimes Commission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Potential Social Impact:
&lt;/h2&gt;

&lt;p&gt;We were able to give aspirational shape and form to an idea to counter financial scams and were able to build a strong foundation for a self-evolving ecosystem that can be fed and nurtured through collaboration and contribution of all players and institutions interested in the fight against financial fraud. The project has demonstrated that AI can pave the way for a more coordinated and comprehensive approach to combating financial crime.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>agentaichallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>RepodAI: An AI-Powered Podcasting Platform with Transcription, Summarization, and Interactive Features 🎙️</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Mon, 25 Nov 2024 00:44:14 +0000</pubDate>
      <link>https://dev.to/iamceejay/repodai-an-ai-powered-podcasting-platform-with-transcription-summarization-and-interactive-7eg</link>
      <guid>https://dev.to/iamceejay/repodai-an-ai-powered-podcasting-platform-with-transcription-summarization-and-interactive-7eg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/assemblyai"&gt;AssemblyAI Challenge &lt;/a&gt;: Sophisticated Speech-to-Text, No More Monkey Business&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;RepodAI&lt;/strong&gt;, an AI-powered podcasting platform designed to harness the capabilities of AssemblyAI’s Universal-2 Speech-to-Text Model. RepodAI is more than just a transcription tool—it integrates conversational intelligence, natural language processing, and sentiment analysis to enhance the podcast creation and consumption experience. From transcription to sentiment analysis, speaker identification, and translation, RepodAI empowers podcasters and listeners alike with rich features and seamless usability.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Screenshots:
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/EeIQIBNa6cM"&gt;
&lt;/iframe&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%2Fx7937chywe3imcqu81zh.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%2Fx7937chywe3imcqu81zh.png" alt="Image description" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wj2zu0pa5vcidsne3p4.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%2F4wj2zu0pa5vcidsne3p4.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8y0pxamk9ec6zs7itgi.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%2Fi8y0pxamk9ec6zs7itgi.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36ce59ctmvpm8k322iyw.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%2F36ce59ctmvpm8k322iyw.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51yysypnk91dfc49oqmn.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%2F51yysypnk91dfc49oqmn.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazrcrx8464rd98o63h3x.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%2Fazrcrx8464rd98o63h3x.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgj64i5zz2za0tkc7cpx.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%2Fdgj64i5zz2za0tkc7cpx.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffarrd0jqtj4jmro5npgo.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%2Ffarrd0jqtj4jmro5npgo.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0rrjtbm07uu4raljvfx.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%2Fo0rrjtbm07uu4raljvfx.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Live Demo:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://repodai.vercel.app/" rel="noopener noreferrer"&gt;RepodAI&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Repository:
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/Repod" rel="noopener noreferrer"&gt;
        Repod
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A powerpacked podcasting platform built around AssemblyAI.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;RepodAI: An AI-Powered Podcasting Platform with Transcription, Summarization, and Interactive Features 🎙️&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/thumb.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2Fthumb.png" alt="RepodAI: An AI-Powered Podcasting Platform with Transcription, Summarization, and Interactive Features 🎙️" title="RepodAI: An AI-Powered Podcasting Platform with Transcription, Summarization, and Interactive Features 🎙️"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧰 Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Make sure &lt;strong&gt;Git&lt;/strong&gt; and &lt;strong&gt;NodeJS&lt;/strong&gt; is installed.&lt;/li&gt;
&lt;li&gt;Clone this repository to your local computer.&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;.env&lt;/code&gt; file in &lt;strong&gt;root&lt;/strong&gt; directory.&lt;/li&gt;
&lt;li&gt;Contents of &lt;code&gt;.env&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-dotenv notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; .env&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; neon db uri&lt;/span&gt;
&lt;span class="pl-v"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;postgresql://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;:&amp;lt;post&amp;gt;/lingo?sslmode=require&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; openai api key&lt;/span&gt;
&lt;span class="pl-v"&gt;OPENAI_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;sk-###############################################################&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; pinata secrets&lt;/span&gt;
&lt;span class="pl-v"&gt;PINATA_JWT&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;###############################################################&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-v"&gt;NEXT_PUBLIC_GATEWAY_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;###############################################################&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📷 Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%201.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25201.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%202.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25202.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%203.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25203.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%204.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25204.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%205.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25205.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%206.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25206.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%207.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25207.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%208.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25208.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%209.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%25209.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/CijeTheCreator/Repod/.github/images/Podcast%20Screenshot%2010.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCijeTheCreator%2FRepod%2F.github%2Fimages%2FPodcast%2520Screenshot%252010.png" alt="Screenshot" title="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;AssemblyAI References&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-ts notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;async&lt;/span&gt; &lt;span class="pl-k"&gt;function&lt;/span&gt; &lt;span class="pl-en"&gt;getTranscript&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;
  &lt;span class="pl-s1"&gt;audioUrl&lt;/span&gt;: &lt;span class="pl-smi"&gt;string&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-s1"&gt;podcastId&lt;/span&gt;: &lt;span class="pl-smi"&gt;number&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-kos"&gt;{&lt;/span&gt; basic_details&lt;span class="pl-kos"&gt;,&lt;/span&gt; redaction&lt;span class="pl-kos"&gt;,&lt;/span&gt; speakers &lt;span class="pl-kos"&gt;}&lt;/span&gt;: &lt;span class="pl-smi"&gt;TOverallForm&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
&lt;span class="pl-kos"&gt;)&lt;/span&gt;: &lt;span class="pl-smi"&gt;Promise&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-smi"&gt;any&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;redactionKeys&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-v"&gt;Object&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;keys&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;redaction&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
  &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;redactionList&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;redactionKeys&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;filter&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;value&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s1"&gt;index&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-s1"&gt;redaction&lt;/span&gt;&lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-s1"&gt;value&lt;/span&gt; &lt;span class="pl-k"&gt;as&lt;/span&gt; &lt;span class="pl-k"&gt;keyof&lt;/span&gt; &lt;span class="pl-k"&gt;typeof&lt;/span&gt; &lt;span class="pl-s1"&gt;redaction&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-k"&gt;as&lt;/span&gt; &lt;span class="pl-smi"&gt;PiiPolicy&lt;/span&gt;&lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
  &lt;span class="pl-k"&gt;let&lt;/span&gt; &lt;span class="pl-s1"&gt;transcript&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-k"&gt;await&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/Repod" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;RepodAI began as a vision for a sophisticated podcasting platform that brings conversational intelligence to the forefront. Leveraging AssemblyAI’s Universal-2 model as the foundation, RepodAI transforms how users interact with audio content. Here’s how I incorporated AssemblyAI’s Speech-to-Text capabilities into this project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Audio Upload and Transcription&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profanity Filtering&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speaker Identification and Sentiment Analysis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chapter Segmentation and Summarization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advanced Search and Navigation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-Powered Interaction superchared by Lemur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Language Translation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic and Interactive Player&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable Themes and Mobile Responsiveness&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Prompts I Worked On
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sophisticated Speech-to-Text&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I utilized AssemblyAI’s transcription API for two main use cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transcribing the Main Podcast&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   This step involved converting the uploaded audio file into text, ensuring that the podcast's spoken content was accurately captured and ready for processing by features such as summarization and sentiment analysis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function getTranscript(
  audioUrl: string,
  podcastId: number,
  { basic_details, redaction, speakers }: TOverallForm,
): Promise&amp;lt;any&amp;gt; {
  const redactionKeys = Object.keys(redaction);
  const redactionList = redactionKeys.filter((value, index) =&amp;gt; {
    return redaction[value as keyof typeof redaction];
  }) as PiiPolicy[];
  let transcript = await client.transcripts.transcribe({
    audio: audioUrl,
    speaker_labels: true,
    auto_chapters: true,
    redact_pii_audio: true,
    filter_profanity: basic_details.filter_profanity,
    redact_pii_policies: redactionList,
    sentiment_analysis: true,
    format_text: true,
    speakers_expected: speakers.speakers.split(",").length,
  });
  await updatePodcastTranscriptionId(podcastId, transcript.id);
  const sentencesResponse = await client.transcripts.sentences(transcript.id);
  const sentences = sentencesResponse.sentences;
  return sentences;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Converting Asked Questions to Text&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Questions asked to RepodAI's chatbot (via voice input) are transcribed into text before being processed by &lt;strong&gt;LeMUR&lt;/strong&gt;, enabling precise and context-aware responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  *&lt;em&gt;No More Monkey Business *&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;I also employed LeMUR for the following key features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RepodAI’s Chatbot&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The chatbot generates insightful answers to user questions about the podcast by processing transcriptions of both the podcast and the user’s query.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Creating the Initial Podcast Summary&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
During the upload process, RepodAI uses the transcribed content to generate an initial summary of the podcast, providing a quick overview for users.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tech Stack 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; 🖥️: For building the UI and backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ShadcnUI&lt;/strong&gt; 🎨: Component library for consistent and elegant UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neon Postgres&lt;/strong&gt; 🐘: To store user-generated podcasts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three.js&lt;/strong&gt; 🎧: For audio visualization when asking AI questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal-2&lt;/strong&gt; 🗣️: Powering sophisticated speech-to-text transcription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LeMUR&lt;/strong&gt; 🤖: Intelligent LLM-powered interaction with spoken data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI TTS&lt;/strong&gt; 🗨️: For text-to-speech conversion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;The algorithm for RepodAI's audio visulaization(when recording) is from &lt;a href="https://codepen.io/prakhar625" rel="noopener noreferrer"&gt;Prakhar625&lt;/a&gt; 's audio visualiser codepen in which I altered the source code a little to suit my style of design and way of function for this project.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>assemblyaichallenge</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>FilmGuru: Your AI-Powered Movie Companion 🎬</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Mon, 11 Nov 2024 01:04:45 +0000</pubDate>
      <link>https://dev.to/iamceejay/filmguru-your-ai-powered-movie-companion-1p94</link>
      <guid>https://dev.to/iamceejay/filmguru-your-ai-powered-movie-companion-1p94</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/pgai"&gt;Open Source AI Challenge with pgai and Ollama &lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;FilmGuru is an AI movie recommendation engine designed to help you discover the perfect film from a curated database of over 8,000 IMDb movies. Whether you’re in the mood for another mind-bender after watching &lt;em&gt;Inception&lt;/em&gt; or just want to try something similar to the last masterpiece you enjoyed, FilmGuru’s got you covered!&lt;/p&gt;

&lt;h3&gt;
  
  
  Why FilmGuru?
&lt;/h3&gt;

&lt;p&gt;Ever found yourself scrolling endlessly, unable to decide on your next movie? FilmGuru solves that by understanding what you enjoyed in your last watch and recommending something with a similar vibe. Think of it as your personal movie guru! With FilmGuru, a recommendation isn’t just a list—it’s a hand-picked suggestion designed to turn "meh" into "2 hours of pure bliss." &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%2Ff8cgdujueg2ikehge1gv.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%2Ff8cgdujueg2ikehge1gv.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a sneak peek at a recommendation! With FilmGuru, finding your next favorite film is as easy as pressing play.&lt;/p&gt;

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

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

&lt;p&gt;You can try the app out &lt;a href="https://filmguru-omega.vercel.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;br&gt;
Thank you for exploring FilmGuru!&lt;/p&gt;
&lt;h2&gt;
  
  
  Tools Used
&lt;/h2&gt;

&lt;p&gt;NextJS&lt;br&gt;
pgai&lt;br&gt;
pgvector&lt;br&gt;
pgvectorizer&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/filmguru-frontend" rel="noopener noreferrer"&gt;
        filmguru-frontend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Frontend for FilmGuru
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/pgai" rel="nofollow"&gt;Open Source AI Challenge with pgai and Ollama &lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What I Built | FilmGuru&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;FilmGuru is an AI movie recommendation engine designed to help you discover the perfect film from a curated database of over 8,000 IMDb movies. Whether you’re in the mood for another mind-bender after watching &lt;em&gt;Inception&lt;/em&gt; or just want to try something similar to the last masterpiece you enjoyed, FilmGuru’s got you covered!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Why FilmGuru?&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Ever found yourself scrolling endlessly, unable to decide on your next movie? FilmGuru solves that by understanding what you enjoyed in your last watch and recommending something with a similar vibe. Think of it as your personal movie guru! With FilmGuru, a recommendation isn’t just a list—it’s a hand-picked suggestion designed to turn "meh" into "2 hours of pure bliss."&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9321f3dc199c11750525ff666d7fa00d22e83204adc10881558adc36880f096d/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f6638636764756a75656732696b656867653167762e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/9321f3dc199c11750525ff666d7fa00d22e83204adc10881558adc36880f096d/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f6638636764756a75656732696b656867653167762e706e67" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here’s a sneak peek at a recommendation! With FilmGuru, finding your next favorite film is as easy…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/filmguru-frontend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/filmguru-backend" rel="noopener noreferrer"&gt;
        filmguru-backend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/pgai" rel="nofollow"&gt;Open Source AI Challenge with pgai and Ollama &lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What I Built | FilmGuru&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;FilmGuru is an AI movie recommendation engine designed to help you discover the perfect film from a curated database of over 8,000 IMDb movies. Whether you’re in the mood for another mind-bender after watching &lt;em&gt;Inception&lt;/em&gt; or just want to try something similar to the last masterpiece you enjoyed, FilmGuru’s got you covered!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Why FilmGuru?&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Ever found yourself scrolling endlessly, unable to decide on your next movie? FilmGuru solves that by understanding what you enjoyed in your last watch and recommending something with a similar vibe. Think of it as your personal movie guru! With FilmGuru, a recommendation isn’t just a list—it’s a hand-picked suggestion designed to turn "meh" into "2 hours of pure bliss."&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9321f3dc199c11750525ff666d7fa00d22e83204adc10881558adc36880f096d/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f6638636764756a75656732696b656867653167762e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/9321f3dc199c11750525ff666d7fa00d22e83204adc10881558adc36880f096d/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f6638636764756a75656732696b656867653167762e706e67" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here’s a sneak peek at a recommendation! With FilmGuru, finding your next favorite film is as easy…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/filmguru-backend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fih0icp8ku0wyuo4uwy8o.jpeg" 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%2Fih0icp8ku0wyuo4uwy8o.jpeg" alt="Image description" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FilmGuru’s journey begins with my movie database, a CSV file sourced from &lt;a href="https://www.kaggle.com/code/payamamanat/imdb-movies/input" rel="noopener noreferrer"&gt;Kaggle&lt;/a&gt;, containing 8,000 movie records with details like descriptions, year, and other metadata. Here’s how it all comes together:&lt;/p&gt;

&lt;p&gt;I started by uploading the CSV to Timescale as a new service, which took just 2 minutes to complete.&lt;br&gt;
Using the SQL editor, I added a primary key column to the table—this is crucial for utilizing Timescale’s pgvectorizer functionality.&lt;br&gt;
I then used the vectorizer with OpenAI’s embedding model (small) to generate embeddings instantly across the entire database, creating a vector representation for each movie entry to allow FilmGuru to find the best matches based on your preferences.&lt;/p&gt;

&lt;p&gt;The original CSV file included fields for title, description, year, duration, rating, and stars, among others. I kept only these essential fields, discarding the rest. &lt;strong&gt;Since the movie descriptions were quite lengthy, I divided them into chunks, adding key contextual fields to each chunk to retain as much relevant information as possible&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Vectorizer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`
      SELECT ai.create_vectorizer(
      'public.imdb_numbered_votes'::regclass,
      embedding=&amp;gt;ai.embedding_openai('text-embedding-3-small', 1536, api_key_name=&amp;gt;'OPENAI_API_KEY'),
      chunking=&amp;gt;ai.chunking_recursive_character_text_splitter('description'),
      formatting=&amp;gt;ai.formatting_python_template('title: $title description: $chunk, year: $year, duration: $duration, rating: $rating, stars: $stars')
      );
      `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;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;success&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;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;failed&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Behind the Scenes of Your Recommendation Journey
&lt;/h3&gt;

&lt;p&gt;When you enter a prompt (like "I want something like Inception"), it’s sent to the backend server.&lt;br&gt;
The server uses pg AI to create a unique embedding for your query with the help of OpenAI's text-embedding-3-small, transforming it into a vector.&lt;br&gt;
FilmGuru then uses pgvector to search the database for movies with similar embeddings, delivering the closest match as your next recommendation.&lt;/p&gt;

&lt;p&gt;It’s seamless, fast, and incredibly fun!&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The project came up smooth. I only had one dependency in my back end. That was the pg library for postgres. Kinda cool that I could build the entire backend just with one library.&lt;/p&gt;

&lt;p&gt;I’m planning to add an agent that fetches images for each movie, making recommendations even more visually engaging. Stay tuned!&lt;/p&gt;

&lt;p&gt;All the Extensions&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>pgaichallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>NEONDB-NextJS-Typescript Ultimate Starter Pack</title>
      <dc:creator>Chijioke Osadebe</dc:creator>
      <pubDate>Sun, 01 Sep 2024 22:23:51 +0000</pubDate>
      <link>https://dev.to/iamceejay/neondb-nextjs-typescript-ultimate-starter-pack-35cn</link>
      <guid>https://dev.to/iamceejay/neondb-nextjs-typescript-ultimate-starter-pack-35cn</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/neon"&gt;Neon Open Source Starter Kit Challenge &lt;/a&gt;: Ultimate Starter Kit&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Kit
&lt;/h2&gt;

&lt;p&gt;This starter pack is designed to accelerate the development of modern web applications by providing a robust foundation. It includes a comprehensive setup with Next.js, TypeScript, Hasura, Auth0, Express, Husky, Jest, Prettier, and more. The pack is pre-configured with industry-standard tools and workflows, ensuring a smooth development experience, and what truly sets it apart is how it enables you to &lt;strong&gt;get an industry-standard CI/CD pipeline, leveraging NEONDB’s database branching, up and running in just 5 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to Kit
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CijeTheCreator" rel="noopener noreferrer"&gt;
        CijeTheCreator
      &lt;/a&gt; / &lt;a href="https://github.com/CijeTheCreator/NeonDB-Ultimate-Starter-Kit" rel="noopener noreferrer"&gt;
        NeonDB-Ultimate-Starter-Kit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ultimate Starter Kit for Next.js, Express.js, TypeScript, Prisma, and NeonDB ⚡️ Engineered for a superior developer experience: Next.js + TypeScript + Express.js + Hasura + Auth0 + Prisma + NeonDB + Vercel + Jest + Husky + Prettier + Helmet + Morgan + Nodemon + GitHub Actions CI/CD + Automated Initialization Script for seamless project setup
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/CijeTheCreator/NeonDB-Ultimate-Starter-Kit/main/Images/coverphoto.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCijeTheCreator%2FNeonDB-Ultimate-Starter-Kit%2Fmain%2FImages%2Fcoverphoto.png" alt="Cover"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NEONDB-NextJS-Typescript Ultimate Starter Pack&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This starter pack is designed to accelerate the development of modern web applications by providing a robust foundation. It includes a comprehensive setup with Next.js, TypeScript, Hasura, Auth0, Express, Husky, Jest, Prettier, and more. The pack is pre-configured with industry-standard tools and workflows, ensuring a smooth development experience, and what truly sets it apart is how it enables you to &lt;strong&gt;get an industry-standard CI/CD pipeline, leveraging NEONDB’s database branching, up and running in just 5 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Developer Experience&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js &amp;amp; TypeScript 🖥️📜&lt;/strong&gt;: Build scalable and maintainable frontend applications with TypeScript support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express.js 🌐&lt;/strong&gt;: A well-structured backend with Helmet for security and Morgan for logging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hasura ⚡&lt;/strong&gt;: Integrated GraphQL engine for instant backend with PostgreSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth0 🔐&lt;/strong&gt;: Authentication and authorization with Auth0, configured for secure and easy user management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prisma &amp;amp; NeonDB 🗄️🚀&lt;/strong&gt;: Database ORM with Prisma, optimized for NeonDB, and…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CijeTheCreator/NeonDB-Ultimate-Starter-Kit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Your Journey
&lt;/h2&gt;

&lt;p&gt;I chose this stack because it's what I use the most. Throughout the process, I learned about Hasura for instant GraphQL backend integration and GitHub Actions for streamlined CI/CD workflows.&lt;/p&gt;

&lt;p&gt;Chijioke Osadebe &lt;br&gt;
Username: chijioke_osadebe_c6d2e7f7&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>neonchallenge</category>
      <category>postgres</category>
      <category>database</category>
    </item>
  </channel>
</rss>
