<?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: Neeraj Ciju</title>
    <description>The latest articles on DEV Community by Neeraj Ciju (@neeraj_ciju).</description>
    <link>https://dev.to/neeraj_ciju</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4068557%2Fad9be9c7-c250-4ad1-9e07-c4e651f2e3b5.jpg</url>
      <title>DEV Community: Neeraj Ciju</title>
      <link>https://dev.to/neeraj_ciju</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neeraj_ciju"/>
    <language>en</language>
    <item>
      <title>Building VtoB: Turning YouTube Videos into Technical Blog Posts with a Multi-Stage AI Pipeline</title>
      <dc:creator>Neeraj Ciju</dc:creator>
      <pubDate>Sun, 16 Aug 2026 14:35:47 +0000</pubDate>
      <link>https://dev.to/neeraj_ciju/building-vtob-turning-youtube-videos-into-technical-blog-posts-with-a-multi-stage-ai-pipeline-1mng</link>
      <guid>https://dev.to/neeraj_ciju/building-vtob-turning-youtube-videos-into-technical-blog-posts-with-a-multi-stage-ai-pipeline-1mng</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Meta Description:&lt;/strong&gt; How I built VtoB, a full-stack AI application that converts YouTube videos into structured, SEO-ready Markdown articles using LangGraph, Gemini, Groq, and FastAPI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Writing a good technical article from a long YouTube video is a surprisingly repetitive workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;watch → take notes → organize → write → edit → optimize.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;VtoB&lt;/strong&gt; to automate that workflow.&lt;/p&gt;

&lt;p&gt;The idea is simple: paste a YouTube URL and get a structured Markdown article generated through a multi-stage AI pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/7fZG5F7BM5Q" rel="noopener noreferrer"&gt;Demo Video&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-stage generation:&lt;/strong&gt; VtoB separates transcription, planning, writing, and SEO refinement into independent pipeline stages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph orchestration:&lt;/strong&gt; The backend uses a &lt;code&gt;StateGraph&lt;/code&gt; to pass shared state between processing nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model specialization:&lt;/strong&gt; Gemini 3.1 Flash-Lite handles structure and refinement, while Llama 3.3 70B handles long-form drafting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack workflow:&lt;/strong&gt; A Next.js frontend communicates with a FastAPI backend and renders the final Markdown with copy and download actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The system has two main layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next.js 16 Frontend
        |
        | POST /generate
        v
FastAPI Backend
        |
        v
LangGraph StateGraph
        |
        +--&amp;gt; Fetch Transcript
        |
        +--&amp;gt; Generate Outline
        |
        +--&amp;gt; Write Draft
        |
        +--&amp;gt; SEO Refine
        |
        v
Final Markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend uses &lt;strong&gt;Next.js 16.3.1, React 19, TypeScript, Tailwind CSS 4, Motion, GSAP, OGL, and react-markdown&lt;/strong&gt;. The backend is built with &lt;strong&gt;FastAPI, LangGraph, LangChain, Gemini, Groq, Pydantic, and youtube-transcript-api&lt;/strong&gt;. ([GitHub][2])&lt;/p&gt;

&lt;p&gt;[INSERT: ARCHITECTURE SCREENSHOT]&lt;/p&gt;

&lt;h2&gt;
  
  
  Why LangGraph?
&lt;/h2&gt;

&lt;p&gt;The main design decision was to avoid treating the entire task as one giant LLM prompt.&lt;/p&gt;

&lt;p&gt;Instead, VtoB models the workflow as a graph with four explicit nodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START
  |
  v
Fetch Transcript
  |
  v
Generate Outline
  |
  v
Write Draft
  |
  v
SEO Refine
  |
  v
END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The graph is compiled with LangGraph's &lt;code&gt;StateGraph&lt;/code&gt;, and each node reads from and writes to a shared &lt;code&gt;BlogState&lt;/code&gt;. ([GitHub][1])&lt;/p&gt;

&lt;p&gt;The state contains:&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlogState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;video_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;blog_draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;seo_blog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes each stage independently understandable and easier to modify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 1: Extracting the Transcript
&lt;/h2&gt;

&lt;p&gt;The first node extracts the YouTube video ID from either a normal YouTube URL or a &lt;code&gt;youtu.be&lt;/code&gt; URL.&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="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YouTubeTranscriptApi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;transcript_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;transcript_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;transcript_list&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transcript is then stored in the graph state for the next stage. An empty transcript raises an error instead of allowing the pipeline to continue with invalid input. ([GitHub][3])&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2: Turning a Transcript into an Outline
&lt;/h2&gt;

&lt;p&gt;A transcript is not automatically a good article.&lt;/p&gt;

&lt;p&gt;Spoken content contains repetition, tangents, and loosely connected ideas, so VtoB first sends the transcript to &lt;strong&gt;Gemini 3.1 Flash-Lite&lt;/strong&gt; for structural planning.&lt;/p&gt;

&lt;p&gt;The prompt specifically asks the model to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reorganize the spoken content into a coherent narrative&lt;/li&gt;
&lt;li&gt;Target technical developers&lt;/li&gt;
&lt;li&gt;Create Markdown heading hierarchy&lt;/li&gt;
&lt;li&gt;Attach factual notes to each section&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means the writing model doesn't have to figure out the article structure and the prose simultaneously. ([GitHub][1])&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw Transcript
      |
      v
Gemini 3.1 Flash-Lite
      |
      v
Structured Outline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Stage 3: Writing the Article
&lt;/h2&gt;

&lt;p&gt;Once the structure exists, VtoB sends the outline plus a transcript excerpt to &lt;strong&gt;Llama 3.3 70B through Groq&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The implementation deliberately limits the transcript context to the first &lt;strong&gt;8,000 characters&lt;/strong&gt; as a token-safety buffer.&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="n"&gt;transcript_excerpt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transcript&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The writer is instructed to produce GitHub-Flavored Markdown, maintain proper heading structure, use Markdown code blocks, and avoid referring to the source material as a "video" inside the generated article. ([GitHub][1])&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transcript
    |
    +----&amp;gt; Outline
    |
    v
Llama 3.3 70B
    |
    v
Technical Draft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important architectural idea here is &lt;strong&gt;model specialization&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini plans. Llama writes.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 4: SEO Refinement
&lt;/h2&gt;

&lt;p&gt;The final node takes the generated draft and sends it back to &lt;strong&gt;Gemini 3.1 Flash-Lite&lt;/strong&gt; for formatting and SEO refinement.&lt;/p&gt;

&lt;p&gt;The formatter enforces things such as:&lt;br&gt;
&lt;/p&gt;

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

&amp;gt; Meta Description

## Key Takeaways

## Section
### Subsection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also ensures consistent paragraph spacing and Markdown structure. ([GitHub][1])&lt;/p&gt;

&lt;p&gt;This gives the pipeline a final quality-control stage rather than returning the first generated draft directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;The entire pipeline is exposed through a single endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /generate
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.youtube.com/watch?v=..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend returns the intermediate and final artifacts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transcript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blog_draft"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"seo_blog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful during development because the system exposes more than just the final answer. You can inspect each stage independently and see where generation quality changes. ([GitHub][1])&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Frontend
&lt;/h2&gt;

&lt;p&gt;The frontend keeps the interaction deliberately simple.&lt;/p&gt;

&lt;p&gt;The user enters a YouTube URL and is redirected to the generation page with the URL passed as a query parameter.&lt;/p&gt;

&lt;p&gt;The generation page then calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://127.0.0.1:8000/generate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;videoUrl&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The UI also generates the YouTube thumbnail directly from the extracted video ID and displays the final response as rendered Markdown. ([GitHub][3])&lt;/p&gt;

&lt;p&gt;[INSERT: FRONTEND SCREENSHOT]&lt;/p&gt;

&lt;h2&gt;
  
  
  Exporting the Result
&lt;/h2&gt;

&lt;p&gt;The generated article isn't just displayed on screen.&lt;/p&gt;

&lt;p&gt;The frontend supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copying the final Markdown to the clipboard&lt;/li&gt;
&lt;li&gt;Downloading the article as a &lt;code&gt;.md&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Rendering the Markdown directly in the browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The downloaded filename is generated from the article title, making the output immediately usable in another editor or publishing workflow. ([GitHub][3])&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js 16, React 19, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI / Animation&lt;/td&gt;
&lt;td&gt;Motion, GSAP, OGL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;react-markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM — Structure&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Flash-Lite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM — Writing&lt;/td&gt;
&lt;td&gt;Llama 3.3 70B via Groq&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transcript&lt;/td&gt;
&lt;td&gt;youtube-transcript-api&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The current backend dependency set confirms FastAPI, LangChain, LangGraph, Gemini integration, Groq integration, Pydantic, and &lt;code&gt;youtube-transcript-api&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;The interesting part of this project wasn't generating text with an LLM.&lt;/p&gt;

&lt;p&gt;It was designing the &lt;strong&gt;pipeline around the LLM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A single prompt can generate an article, but separating the workflow into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Extraction
   ↓
Planning
   ↓
Generation
   ↓
Refinement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;makes the system easier to reason about, debug, and extend.&lt;/p&gt;

&lt;p&gt;For example, the outline model can be replaced without touching the writing node. The SEO stage can be modified independently. The frontend can inspect intermediate outputs without changing the graph itself.&lt;/p&gt;

&lt;p&gt;That separation is what makes VtoB feel more like an actual application than a wrapper around an LLM API.&lt;/p&gt;

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

&lt;p&gt;Some natural extensions would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for videos without available captions using an audio transcription model&lt;/li&gt;
&lt;li&gt;Better long-video handling through transcript chunking and hierarchical summarization&lt;/li&gt;
&lt;li&gt;Persistent job tracking for asynchronous generation&lt;/li&gt;
&lt;li&gt;User accounts and article history&lt;/li&gt;
&lt;li&gt;Direct publishing integrations for platforms such as Dev.to&lt;/li&gt;
&lt;li&gt;Evaluation of generated articles against the source transcript for factual consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;VtoB started with a simple idea: &lt;strong&gt;turn a YouTube URL into a usable technical article.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The implementation ended up being a small exercise in AI system design:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YouTube
   ↓
Transcript
   ↓
Gemini
   ↓
Outline
   ↓
Llama
   ↓
Draft
   ↓
Gemini
   ↓
SEO Markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The biggest takeaway for me was that useful AI applications are rarely just about the model.&lt;/p&gt;

&lt;p&gt;They are about &lt;strong&gt;how you structure the work around the model&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;GitHub: &lt;a href="https://github.com/iPrq/VlogToBlog" rel="noopener noreferrer"&gt;https://github.com/iPrq/VlogToBlog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building Aegis: An AI-Powered Healthcare Companion</title>
      <dc:creator>Neeraj Ciju</dc:creator>
      <pubDate>Sun, 16 Aug 2026 08:25:30 +0000</pubDate>
      <link>https://dev.to/neeraj_ciju/building-aegis-an-ai-powered-healthcare-companion-4j7f</link>
      <guid>https://dev.to/neeraj_ciju/building-aegis-an-ai-powered-healthcare-companion-4j7f</guid>
      <description>&lt;p&gt;Aegis is a healthcare companion designed to help senior citizens with medication, safety, and accessing information.&lt;/p&gt;

&lt;p&gt;The project combines &lt;strong&gt;AI, computer vision, Wi-Fi sensing, real-time communication, and mobile development&lt;/strong&gt; into a single application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3yonc2rf5f4kd2wgv0k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3yonc2rf5f4kd2wgv0k.jpg" alt="Home Page" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Aegis is built with &lt;strong&gt;Next.js, React, TypeScript, and Tailwind CSS&lt;/strong&gt;, packaged for Android using &lt;strong&gt;Capacitor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend is built with &lt;strong&gt;Python and FastAPI&lt;/strong&gt;, exposing REST and WebSocket APIs for the different AI and ML services.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next.js + React
       |
   Capacitor
       |
    Android
       |
    FastAPI
       |
 ┌─────┼──────────┐
 |     |          |
Gemini Groq    CSI + ANN
 |     |          |
Medical Chat   Fall Detection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AI-Powered Prescription Scanner
&lt;/h2&gt;

&lt;p&gt;One of the main features is the medical document scanner.&lt;/p&gt;

&lt;p&gt;A user can photograph a prescription and send it to the backend. &lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; analyzes the image and converts it into structured information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Medication name and dosage&lt;/li&gt;
&lt;li&gt;Medication schedule&lt;/li&gt;
&lt;li&gt;Instructions&lt;/li&gt;
&lt;li&gt;Locations for procedures&lt;/li&gt;
&lt;li&gt;Safety restrictions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of displaying a raw AI response, this information is converted into structured data that the frontend can use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prescription Image
       ↓
Gemini 2.5 Flash
       ↓
Structured JSON
       ↓
Medication + Safety Information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftyyinbvmd5kh3skknreh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftyyinbvmd5kh3skknreh.jpg" alt="Scan Page" width="800" height="1778"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faa64vqk43bvqq0wa5y0b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faa64vqk43bvqq0wa5y0b.jpg" alt="Generated Result" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context-Aware Medical Chat
&lt;/h2&gt;

&lt;p&gt;The extracted prescription can then be used as context for a chatbot.&lt;/p&gt;

&lt;p&gt;The backend uses &lt;strong&gt;Llama 3.3 70B through Groq&lt;/strong&gt; to answer questions using the available prescription context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prescription
     ↓
Structured Context
     ↓
User Question
     ↓
Llama 3.3 70B
     ↓
Context-Aware Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the chatbot specific to the user's uploaded medical information instead of functioning as a completely generic assistant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy95mkrcj3edkimalv3um.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy95mkrcj3edkimalv3um.jpg" alt="ChatBot" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Camera-Less Fall Detection
&lt;/h2&gt;

&lt;p&gt;The most experimental part of Aegis is its fall-detection system.&lt;/p&gt;

&lt;p&gt;Instead of relying on cameras, the system uses &lt;strong&gt;Wi-Fi Channel State Information (CSI)&lt;/strong&gt; to detect changes caused by movement.&lt;/p&gt;

&lt;p&gt;The backend processes CSI data from 20 subcarriers and extracts statistical and signal-processing features such as variance, standard deviation, signal energy, skewness, and kurtosis.&lt;/p&gt;

&lt;p&gt;These features are passed through a scaler and an &lt;strong&gt;ANN classifier&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wi-Fi CSI
   ↓
Signal Window
   ↓
Feature Extraction
   ↓
Scaler
   ↓
ANN
   ↓
FALL / NO_FALL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is streamed to the frontend using &lt;strong&gt;WebSockets&lt;/strong&gt;, allowing the application to monitor the prediction in real time.&lt;/p&gt;

&lt;p&gt;When a fall is detected, Aegis can trigger an emergency notification to a configured caretaker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxmp9r9prsr32bbts11w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxmp9r9prsr32bbts11w.jpg" alt="CSI Fall Detection" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-Powered Web Intelligence
&lt;/h2&gt;

&lt;p&gt;Aegis also includes a browser extension that can extract webpage content and send it to the backend.&lt;/p&gt;

&lt;p&gt;The backend generates a summary using Llama 3.3 70B. That summary can then be used as context for a chatbot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Webpage
   ↓
Browser Extension
   ↓
AI Summary
   ↓
Context
   ↓
Chat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows users to ask questions about the webpage rather than manually searching through it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1xp8tziqpudp7oupoeyd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1xp8tziqpudp7oupoeyd.jpg" alt="WebPage AI" width="800" height="1778"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3d31fkfdt9eva7umy3y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3d31fkfdt9eva7umy3y.jpg" alt="Safety Net" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;Since the application is designed with senior citizens in mind, the UI focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large touch targets&lt;/li&gt;
&lt;li&gt;High-contrast text&lt;/li&gt;
&lt;li&gt;Simple navigation&lt;/li&gt;
&lt;li&gt;Voice output&lt;/li&gt;
&lt;li&gt;Multilingual support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aegis also includes AI-powered text-to-speech and translation functionality.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js, React, TypeScript, Tailwind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile&lt;/td&gt;
&lt;td&gt;Capacitor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python, FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vision AI&lt;/td&gt;
&lt;td&gt;Gemini 2.5 Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM&lt;/td&gt;
&lt;td&gt;Llama 3.3 70B via Groq&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fall Detection&lt;/td&gt;
&lt;td&gt;Wi-Fi CSI + ANN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time&lt;/td&gt;
&lt;td&gt;WebSockets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTS&lt;/td&gt;
&lt;td&gt;Orpheus via Groq&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;The main challenge wasn't integrating individual AI models. It was connecting them into useful workflows.&lt;/p&gt;

&lt;p&gt;Aegis combines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vision → Structured Data → Chat
Wi-Fi → ML → Real-Time Alert
Webpage → AI Summary → Contextual Chat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project taught me that building an AI application is less about adding as many models as possible and more about &lt;strong&gt;connecting intelligence to a meaningful user workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/iPrq/Aegis-App" rel="noopener noreferrer"&gt;https://github.com/iPrq/Aegis-App&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ReClaim — Scalable, Campus-Centric Property Recovery via High-Dimensional Visual Search</title>
      <dc:creator>Neeraj Ciju</dc:creator>
      <pubDate>Sun, 16 Aug 2026 07:41:27 +0000</pubDate>
      <link>https://dev.to/neeraj_ciju/reclaim-scalable-campus-centric-property-recovery-via-high-dimensional-visual-search-2106</link>
      <guid>https://dev.to/neeraj_ciju/reclaim-scalable-campus-centric-property-recovery-via-high-dimensional-visual-search-2106</guid>
      <description>&lt;p&gt;Lost-and-found systems on campuses are difficult to scale. Lost items are usually described with vague text, while found items often sit in administrative offices with little to no structured metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ReClaim&lt;/strong&gt; tackles this problem by turning lost-and-found into a &lt;strong&gt;computer-vision-powered visual search system&lt;/strong&gt; built specifically for campus communities.&lt;/p&gt;

&lt;p&gt;Instead of relying solely on descriptions like &lt;em&gt;"black water bottle lost near the library,"&lt;/em&gt; users can upload photos of an item and let an AI-powered visual search pipeline identify visually similar items across the campus.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Upload → Search visually → Find a match → Reclaim your property.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flaqyggjbptrfn7a0swpb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flaqyggjbptrfn7a0swpb.jpg" alt="Get Started" width="382" height="800"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoxuz4cusyq2nv56m2pa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoxuz4cusyq2nv56m2pa.jpg" alt="Login" width="390" height="800"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnquczjpr437o24pa2sa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnquczjpr437o24pa2sa.jpg" alt="Home" width="378" height="800"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffebpt6a2pkt02ax1r6ov.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffebpt6a2pkt02ax1r6ov.jpg" alt="Upload Image" width="375" height="800"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv62v74k9djz13u8zoddj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv62v74k9djz13u8zoddj.jpg" alt="Database" width="382" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;ReClaim combines a mobile-first reporting experience with a vision inference pipeline and campus-scoped vector search.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────┐
│     Image Capture       │
│       3:4 Crop          │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│    FastAPI Backend      │
│     Python + PyTorch    │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│    CLIP Vision Model    │
│   Image → Embedding     │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│  Cosine Similarity      │
│   Vector Comparison     │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│   Match Thresholding    │
│     &amp;gt; 90% Similarity    │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│ Firestore + Notification│
│      Match Found        │
└─────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Technical Architecture
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Mobile Frontend
&lt;/h3&gt;

&lt;p&gt;Built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next js + Capacitor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Custom camera modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The camera workflow enforces a &lt;strong&gt;3:4 aspect-ratio crop&lt;/strong&gt;, creating standardized visual inputs before they reach the inference pipeline.&lt;/p&gt;

&lt;p&gt;Users can upload &lt;strong&gt;up to 6 photos per item&lt;/strong&gt;, allowing the system to capture different perspectives, textures, colors, and identifying characteristics.&lt;/p&gt;




&lt;h3&gt;
  
  
  AI Inference Service
&lt;/h3&gt;

&lt;p&gt;The backend is powered by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FastAPI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLIP (Contrastive Language-Image Pre-training)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Images are processed through the CLIP vision encoder to generate dense visual embeddings.&lt;/p&gt;

&lt;p&gt;These embeddings capture high-level visual characteristics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shape and geometry&lt;/li&gt;
&lt;li&gt;Color distribution&lt;/li&gt;
&lt;li&gt;Texture&lt;/li&gt;
&lt;li&gt;Object appearance&lt;/li&gt;
&lt;li&gt;Visual similarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than storing only human-written descriptions, ReClaim creates a machine-readable representation of the item's visual identity.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI-Powered Visual Matching Pipeline
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Image Preprocessing
&lt;/h2&gt;

&lt;p&gt;When a user reports an item, the uploaded images are normalized through the camera pipeline.&lt;/p&gt;

&lt;p&gt;The standardized &lt;strong&gt;3:4 crop&lt;/strong&gt; helps reduce irrelevant background information and creates more consistent model inputs.&lt;/p&gt;

&lt;p&gt;Users can provide multiple images to improve the representation of the object.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Dense Embedding Extraction
&lt;/h2&gt;

&lt;p&gt;Each image is passed through the CLIP vision transformer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input Image
     │
     ▼
CLIP Vision Encoder
     │
     ▼
Visual Features
     │
     ▼
Dense Embedding Vector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting embedding represents the visual characteristics of the object in a high-dimensional numerical space.&lt;/p&gt;

&lt;p&gt;For our implementation, the generated representation is treated as a &lt;strong&gt;512-dimensional embedding vector&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Similarity Search
&lt;/h2&gt;

&lt;p&gt;When a new lost or found item is submitted, its embedding is compared against active items within the same campus.&lt;/p&gt;

&lt;p&gt;The backend calculates &lt;strong&gt;cosine similarity&lt;/strong&gt; between the target embedding and candidate embeddings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Target Item
     │
     ▼
Embedding A ─────────┐
                     │
                     ▼
              Cosine Similarity
                     ▲
                     │
Embedding B ─────────┘
     │
     ▼
Similarity Score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;High-scoring candidates are surfaced as potential matches.&lt;/p&gt;

&lt;p&gt;A configurable similarity threshold is used to filter low-confidence results, with the current workflow targeting matches above &lt;strong&gt;90% similarity&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Campus-Scoped Search
&lt;/h1&gt;

&lt;p&gt;One of ReClaim's key design decisions is &lt;strong&gt;campus-level isolation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of searching a massive global database, queries are restricted to the user's verified campus.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 │
 ▼
RV University
 │
 ├── Lost Items
 ├── Found Items
 └── Reclaimed Items
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This significantly reduces the search space while making the results more relevant.&lt;/p&gt;

&lt;p&gt;A lost laptop at one university should not be compared against thousands of unrelated laptops reported across an entire city.&lt;/p&gt;




&lt;h1&gt;
  
  
  Firestore Data Architecture
&lt;/h1&gt;

&lt;p&gt;ReClaim uses &lt;strong&gt;Firebase&lt;/strong&gt; as its backend platform.&lt;/p&gt;

&lt;p&gt;The system leverages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firestore&lt;/strong&gt; for document storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Authentication&lt;/strong&gt; for campus OAuth / SSO&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase App Distribution&lt;/strong&gt; for Android testing and release cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core Firestore structure is organized around campuses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/campuses/{campusId}/items/{itemId}

  ├── itemId: String
  ├── reporterId: String
  ├── status: LOST | FOUND | RECLAIMED
  ├── name: String
  ├── description: String
  ├── locationFound: String
  ├── dropoffDestination: String
  ├── imageURLs: Array[String]
  └── embeddings: Array[Float]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Potential matches are stored separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/campuses/{campusId}/matches/{matchId}

  ├── targetItemId: String
  ├── candidateItemId: String
  ├── similarityScore: Float
  └── timestamp: Timestamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation allows the system to maintain the original item records while independently tracking generated match relationships.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dark-Mode UX
&lt;/h1&gt;

&lt;p&gt;Despite the complexity of the AI backend, ReClaim is designed around a simple principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The user shouldn't need to understand the AI.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The interface is optimized for fast reporting and high-visibility interaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Location Scoping
&lt;/h3&gt;

&lt;p&gt;A verified campus badge such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RV University • Main Campus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;makes the search boundary explicit to the user.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎮 Action Router
&lt;/h3&gt;

&lt;p&gt;The home screen immediately separates the two primary workflows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Lost Something?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Found Something?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The retro pixel-art cards create a distinctive visual identity while making the application's primary actions immediately recognizable.&lt;/p&gt;




&lt;h3&gt;
  
  
  Report Workflow
&lt;/h3&gt;

&lt;p&gt;Users can provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Item name&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Photos&lt;/li&gt;
&lt;li&gt;Location&lt;/li&gt;
&lt;li&gt;Drop-off information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Found-item reports can also specify a physical destination such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Admin Block Reception&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This connects the digital discovery system with the physical lost-and-found process.&lt;/p&gt;




&lt;h3&gt;
  
  
  Match Feed
&lt;/h3&gt;

&lt;p&gt;Potential matches are presented as image cards containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Item photos&lt;/li&gt;
&lt;li&gt;Lost / Found status&lt;/li&gt;
&lt;li&gt;Similarity confidence&lt;/li&gt;
&lt;li&gt;Relevant metadata&lt;/li&gt;
&lt;li&gt;Match information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows users to visually inspect potential matches instead of manually searching through hundreds of text-based reports.&lt;/p&gt;




&lt;h1&gt;
  
  
  Authentication &amp;amp; Campus Trust
&lt;/h1&gt;

&lt;p&gt;ReClaim is designed around &lt;strong&gt;verified campus communities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Authentication through Firebase allows the platform to associate reports with authenticated users while maintaining campus-level boundaries.&lt;/p&gt;

&lt;p&gt;This creates a more trustworthy environment than a completely open lost-and-found marketplace.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Visual Search?
&lt;/h1&gt;

&lt;p&gt;Traditional lost-and-found systems depend heavily on metadata.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Black bottle"
"Lost near library"
"Found in Block B"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is that users rarely describe objects consistently.&lt;/p&gt;

&lt;p&gt;Two users might describe the same object as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Black Hydro Flask"
"Black water bottle"
"Metal bottle"
"Black flask with sticker"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A visual embedding provides another layer of information.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Did someone use the exact same words?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ReClaim asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Does this object look like the one someone reported?"&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Key Technical Challenges
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. Visual Ambiguity
&lt;/h3&gt;

&lt;p&gt;Many campus objects look extremely similar.&lt;/p&gt;

&lt;p&gt;Two black water bottles may have nearly identical shapes but belong to different people.&lt;/p&gt;

&lt;p&gt;Because of this, similarity scores should be treated as &lt;strong&gt;candidate matches rather than absolute proof&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Background Noise
&lt;/h3&gt;

&lt;p&gt;Photos can contain desks, floors, people, walls, and other irrelevant visual information.&lt;/p&gt;

&lt;p&gt;The standardized &lt;strong&gt;3:4 cropping workflow&lt;/strong&gt; helps make the object itself more prominent within the model input.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Multiple Perspectives
&lt;/h3&gt;

&lt;p&gt;A single photograph may not capture enough information to distinguish an object.&lt;/p&gt;

&lt;p&gt;Supporting up to &lt;strong&gt;6 photos per report&lt;/strong&gt; allows ReClaim to build a stronger visual representation from multiple viewpoints.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Search Scalability
&lt;/h3&gt;

&lt;p&gt;As the number of reports grows, comparing every new image against every stored embedding becomes increasingly expensive.&lt;/p&gt;

&lt;p&gt;The current architecture establishes the foundation for eventually introducing dedicated vector-search infrastructure and approximate nearest-neighbor indexing for much larger campuses.&lt;/p&gt;




&lt;h1&gt;
  
  
  Future Improvements
&lt;/h1&gt;

&lt;p&gt;ReClaim's current architecture can be extended in several directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Approximate Nearest Neighbor (ANN) vector search&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Dedicated vector databases such as FAISS or Qdrant&lt;/li&gt;
&lt;li&gt;Multimodal text + image retrieval&lt;/li&gt;
&lt;li&gt;OCR for serial numbers and labels&lt;/li&gt;
&lt;li&gt;Object detection before embedding generation&lt;/li&gt;
&lt;li&gt;Duplicate report detection&lt;/li&gt;
&lt;li&gt;Push notifications for newly discovered matches&lt;/li&gt;
&lt;li&gt;Cross-campus federation&lt;/li&gt;
&lt;li&gt;Admin dashboards for lost-and-found offices&lt;/li&gt;
&lt;li&gt;Human verification before confirming a reclamation&lt;/li&gt;
&lt;li&gt;Confidence calibration using real campus data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A particularly interesting future direction is &lt;strong&gt;multimodal retrieval&lt;/strong&gt;, where both the uploaded image and the user's textual description contribute to the final ranking.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Makes ReClaim Different?
&lt;/h1&gt;

&lt;p&gt;ReClaim isn't simply another lost-and-found form.&lt;/p&gt;

&lt;p&gt;It combines:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Computer Vision + Vector Embeddings + Campus Authentication + Real-World Item Recovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;into a single workflow.&lt;/p&gt;

&lt;p&gt;The system connects the entire process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Physical Object
      ↓
Photo
      ↓
AI Embedding
      ↓
Campus-Scoped Search
      ↓
Potential Match
      ↓
User Verification
      ↓
Physical Reclamation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ultimate goal is to make lost-and-found systems &lt;strong&gt;searchable, scalable, and intelligent&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Built For Campus Communities
&lt;/h1&gt;

&lt;p&gt;ReClaim is designed around a simple observation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lost-and-found desks already have the objects. The problem is finding the right person.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By turning physical objects into searchable visual representations, ReClaim aims to bridge that gap.&lt;/p&gt;

&lt;p&gt;Instead of manually browsing lists of vague descriptions, students can simply show the system what they're looking for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;See it. Search it. Reclaim it.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mobile&lt;/td&gt;
&lt;td&gt;React Native, Expo, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python, FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI / ML&lt;/td&gt;
&lt;td&gt;PyTorch, CLIP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Firebase Auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Firestore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distribution&lt;/td&gt;
&lt;td&gt;Firebase App Distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search&lt;/td&gt;
&lt;td&gt;Dense Vector Embeddings + Cosine Similarity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  ReClaim
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;A campus-centric visual search engine for lost and found property.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't describe what you lost. Show us.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>firebase</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built an Agentic AI Stock Research Terminal with LangChain</title>
      <dc:creator>Neeraj Ciju</dc:creator>
      <pubDate>Sat, 08 Aug 2026 09:01:54 +0000</pubDate>
      <link>https://dev.to/neeraj_ciju/i-built-an-agentic-ai-stock-research-terminal-with-langchain-36p2</link>
      <guid>https://dev.to/neeraj_ciju/i-built-an-agentic-ai-stock-research-terminal-with-langchain-36p2</guid>
      <description>&lt;p&gt;What if you could type a stock ticker and get more than just its current price?&lt;/p&gt;

&lt;p&gt;I wanted to build something that could combine &lt;strong&gt;real financial data, fundamental valuation, and recent market information&lt;/strong&gt; into one place.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;StockAny AI&lt;/strong&gt; — an AI-powered equity research and valuation terminal.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/iPrq/Stock-Market-Analyser" rel="noopener noreferrer"&gt;https://github.com/iPrq/Stock-Market-Analyser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enter a ticker → fetch financial data → calculate intrinsic value → research recent developments → generate an investment thesis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the interesting part is that the AI isn't responsible for doing everything.&lt;/p&gt;

&lt;p&gt;The financial calculations happen in the backend, while Gemini is used to interpret the data and research recent developments.&lt;/p&gt;




&lt;h2&gt;
  
  
  What does StockAny AI actually do?
&lt;/h2&gt;

&lt;p&gt;For any stock ticker, the application performs four main steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches live financial data&lt;/li&gt;
&lt;li&gt;Calculates an estimated intrinsic value using a DCF model&lt;/li&gt;
&lt;li&gt;Calculates the margin of safety&lt;/li&gt;
&lt;li&gt;Uses Gemini + web search to generate an investment thesis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The final result gives you things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current stock price&lt;/li&gt;
&lt;li&gt;Estimated intrinsic value&lt;/li&gt;
&lt;li&gt;Margin of safety&lt;/li&gt;
&lt;li&gt;BUY / HOLD / SELL recommendation&lt;/li&gt;
&lt;li&gt;AI-generated investment thesis&lt;/li&gt;
&lt;li&gt;Bull case&lt;/li&gt;
&lt;li&gt;Bear case&lt;/li&gt;
&lt;li&gt;Recent developments and catalysts&lt;/li&gt;
&lt;li&gt;Sources used for the research&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal wasn't to build another stock-price dashboard.&lt;/p&gt;

&lt;p&gt;I wanted it to feel more like a &lt;strong&gt;mini equity research terminal&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Architecture
&lt;/h1&gt;

&lt;p&gt;The application is split into two major parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌─────────────────────┐
                 │    Next.js Frontend │
                 │   React 19 + TS     │
                 └──────────┬──────────┘
                            │
                     POST /api/analyze
                            │
                            ▼
                 ┌─────────────────────┐
                 │    FastAPI Backend  │
                 │      Python         │
                 └──────────┬──────────┘
                            │
             ┌──────────────┴──────────────┐
             │                             │
             ▼                             ▼
      Financial Data                 DCF Valuation
        FMP API                     Intrinsic Value
             │                             │
             └──────────────┬──────────────┘
                            ▼
                  ┌──────────────────┐
                  │ Gemini 3.1 Flash │
                  │      Lite        │
                  └────────┬─────────┘
                           │
                           ▼
                    Tavily Web Search
                           │
                           ▼
                  Structured Analysis
                           │
                           ▼
                    Next.js Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend is built with &lt;strong&gt;Next.js 16, React 19 and Tailwind CSS v4&lt;/strong&gt;, while the backend uses &lt;strong&gt;Python, FastAPI and Uvicorn&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why not just ask an LLM?
&lt;/h1&gt;

&lt;p&gt;This was one of the most important design decisions.&lt;/p&gt;

&lt;p&gt;If you simply ask an LLM:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is NVIDIA a good investment?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you'll get an answer, but there are several problems.&lt;/p&gt;

&lt;p&gt;The model shouldn't be responsible for inventing financial numbers or performing the entire valuation itself.&lt;/p&gt;

&lt;p&gt;Instead, StockAny separates the responsibilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  The backend handles the numbers
&lt;/h3&gt;

&lt;p&gt;Financial Modeling Prep provides data such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stock price&lt;/li&gt;
&lt;li&gt;Market capitalization&lt;/li&gt;
&lt;li&gt;P/E ratio&lt;/li&gt;
&lt;li&gt;Free cash flow&lt;/li&gt;
&lt;li&gt;Shares outstanding&lt;/li&gt;
&lt;li&gt;Sector information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend then uses this data for the actual valuation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini handles interpretation
&lt;/h3&gt;

&lt;p&gt;Gemini is given the financial context and uses Tavily to research recent information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Earnings&lt;/li&gt;
&lt;li&gt;Company developments&lt;/li&gt;
&lt;li&gt;Competitive threats&lt;/li&gt;
&lt;li&gt;Catalysts&lt;/li&gt;
&lt;li&gt;Recent news&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a much more useful separation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Financial APIs
      ↓
Reliable numerical data
      ↓
DCF calculation
      ↓
Financial context
      ↓
Gemini + web research
      ↓
Human-readable investment thesis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Building the DCF Model
&lt;/h1&gt;

&lt;p&gt;The core of the valuation system is a &lt;strong&gt;two-stage Discounted Cash Flow model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The first stage projects free cash flow for five years.&lt;/p&gt;

&lt;p&gt;The default assumptions are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Growth rate:       8%
Discount rate:     9%
Terminal growth:  2.5%
Projection period: 5 years
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The projected cash flows are discounted back to their present value.&lt;/p&gt;

&lt;p&gt;Then we calculate a terminal value based on perpetual growth.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              FCF₁     FCF₂     FCF₃     FCF₄     FCF₅
               │        │        │        │        │
               ▼        ▼        ▼        ▼        ▼
             Discount each cash flow to present value
                              │
                              ▼
                     Terminal Value
                              │
                              ▼
                  Discount terminal value
                              │
                              ▼
                ┌───────────────────────┐
                │ Enterprise/Equity     │
                │ Value Estimate        │
                └───────────┬───────────┘
                            ▼
                     Shares Outstanding
                            │
                            ▼
                   Intrinsic Value/Share
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intrinsic value per share is then compared with the current market price.&lt;/p&gt;




&lt;h1&gt;
  
  
  Margin of Safety
&lt;/h1&gt;

&lt;p&gt;One of the most useful outputs is the &lt;strong&gt;margin of safety&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Margin of Safety =
(Intrinsic Value - Current Price)
--------------------------------- × 100
          Current Price
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, if a stock is trading at &lt;code&gt;$100&lt;/code&gt; and the calculated intrinsic value is &lt;code&gt;$130&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(130 - 100) / 100 × 100
= 30%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application can then visually show the gap between the current market price and the estimated intrinsic value.&lt;/p&gt;

&lt;p&gt;This gives the AI something quantitative to reason about instead of simply asking it to make a prediction.&lt;/p&gt;




&lt;h1&gt;
  
  
  Adding Web Research with Tavily
&lt;/h1&gt;

&lt;p&gt;Financial numbers alone aren't enough.&lt;/p&gt;

&lt;p&gt;A company's valuation can look attractive while something important has changed recently.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A major competitor launches a new product&lt;/li&gt;
&lt;li&gt;Earnings guidance changes&lt;/li&gt;
&lt;li&gt;A company loses an important customer&lt;/li&gt;
&lt;li&gt;Regulation affects an industry&lt;/li&gt;
&lt;li&gt;Management announces a major acquisition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I added &lt;strong&gt;Tavily Search&lt;/strong&gt; to the pipeline.&lt;/p&gt;

&lt;p&gt;The AI can search for recent information about the company before generating its thesis.&lt;/p&gt;

&lt;p&gt;The resulting workflow becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Financial fundamentals
        +
DCF valuation
        +
Recent web information
        ↓
    Gemini
        ↓
Investment thesis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is also why the output includes source links.&lt;/p&gt;

&lt;p&gt;The goal isn't to have an AI confidently hallucinate an explanation.&lt;/p&gt;

&lt;p&gt;The goal is to give it &lt;strong&gt;real inputs and let it synthesize them&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Structured AI Output
&lt;/h1&gt;

&lt;p&gt;Instead of asking Gemini to return a giant block of text, the backend expects structured information.&lt;/p&gt;

&lt;p&gt;Something conceptually like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BUY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thesis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bull_case"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bear_case"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the frontend much easier to build.&lt;/p&gt;

&lt;p&gt;The UI can independently render:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────┐
│          BUY                │
│                             │
│ Current Price     $100      │
│ Intrinsic Value   $130      │
│ Margin of Safety  +30%      │
└─────────────────────────────┘

Investment Thesis
─────────────────────────────
...

Bull Case
─────────────────────────────
...

Bear Case
─────────────────────────────
...

Sources
─────────────────────────────
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more flexible than trying to parse arbitrary AI-generated text on the frontend.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tech Stack
&lt;/h1&gt;

&lt;p&gt;The project currently uses:&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16&lt;/li&gt;
&lt;li&gt;React 19&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS v4&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;Uvicorn&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gemini 2.5 Flash Lite&lt;/li&gt;
&lt;li&gt;LangChain&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data &amp;amp; Research
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Financial Modeling Prep&lt;/li&gt;
&lt;li&gt;Tavily Search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also uses Inter for typography and a video background for the landing page.&lt;/p&gt;




&lt;h1&gt;
  
  
  Project Structure
&lt;/h1&gt;

&lt;p&gt;The repository is organized roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stock-Market-Analyser/
│
├── app/
│   ├── main.py
│   ├── requirements.txt
│   └── pyproject.toml
│
└── stockany/
    ├── app/
    │   ├── page.tsx
    │   ├── layout.tsx
    │   └── globals.css
    │
    ├── public/
    │   └── *.mp4
    │
    ├── next.config.ts
    └── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The FastAPI backend contains the API routes, LangChain tooling and DCF logic, while the Next.js application handles the user interface and results page.&lt;/p&gt;




&lt;h1&gt;
  
  
  Running It Locally
&lt;/h1&gt;

&lt;p&gt;You'll need API keys for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Financial Modeling Prep&lt;/li&gt;
&lt;li&gt;Google AI Studio / Gemini&lt;/li&gt;
&lt;li&gt;Tavily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FMP_API_KEY=your_fmp_key_here
GOOGLE_API_KEY=your_gemini_key_here
TAVILY_API_KEY=your_tavily_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;app

pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The FastAPI server will run on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;stockany

npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The complete setup instructions are available in the repository.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Learned
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from this project was that &lt;strong&gt;AI applications don't necessarily need to let the LLM do everything&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A much better approach is often:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional software
        +
APIs
        +
Deterministic calculations
        +
LLM reasoning
        +
Web research
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The DCF calculation is deterministic.&lt;/p&gt;

&lt;p&gt;Financial data comes from an API.&lt;/p&gt;

&lt;p&gt;Web research comes from a search system.&lt;/p&gt;

&lt;p&gt;The LLM sits on top of those components and turns the information into something humans can understand.&lt;/p&gt;

&lt;p&gt;That architecture makes the application considerably more grounded than simply prompting an LLM for a stock prediction.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;There are several things I'd like to improve:&lt;/p&gt;

&lt;h3&gt;
  
  
  Historical valuation
&lt;/h3&gt;

&lt;p&gt;Instead of only looking at the current valuation, I'd like to compare the stock against its historical multiples.&lt;/p&gt;

&lt;h3&gt;
  
  
  More valuation models
&lt;/h3&gt;

&lt;p&gt;Adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;P/E valuation&lt;/li&gt;
&lt;li&gt;EV/EBITDA&lt;/li&gt;
&lt;li&gt;Price-to-Free-Cash-Flow&lt;/li&gt;
&lt;li&gt;Comparable company analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;would make the valuation more robust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better AI reasoning
&lt;/h3&gt;

&lt;p&gt;The next step would be giving the model access to more structured financial statements and letting it explicitly explain &lt;strong&gt;which assumptions drive the valuation&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Portfolio analysis
&lt;/h3&gt;

&lt;p&gt;Eventually, I'd like to allow users to enter multiple tickers and compare them side-by-side.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;StockAny AI started as an experiment in combining &lt;strong&gt;financial analysis with agentic AI&lt;/strong&gt;, but it ended up teaching me something more important about building AI products.&lt;/p&gt;

&lt;p&gt;The interesting part isn't just calling an LLM API.&lt;/p&gt;

&lt;p&gt;It's designing a system where the LLM has access to the &lt;strong&gt;right tools, the right data, and the right constraints&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For this project, that meant combining:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FMP → financial data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DCF → valuation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tavily → recent information&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini → reasoning and synthesis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FastAPI → backend orchestration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js → user experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The result is a small but complete example of how traditional software and generative AI can work together.&lt;/p&gt;

&lt;p&gt;If you want to check out the implementation:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/iPrq/Stock-Market-Analyser" rel="noopener noreferrer"&gt;https://github.com/iPrq/Stock-Market-Analyser&lt;/a&gt;&lt;br&gt;
👉 &lt;strong&gt;Youtube:&lt;/strong&gt; &lt;a href="https://youtu.be/XbrxvaP-FYk" rel="noopener noreferrer"&gt;https://youtu.be/XbrxvaP-FYk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear what you'd add to the project next.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: StockAny AI is an educational and informational project. Its outputs are not financial advice, and investment decisions should always involve independent research.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>computerscience</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
