<?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: DevCalebR</title>
    <description>The latest articles on DEV Community by DevCalebR (@devcalebr).</description>
    <link>https://dev.to/devcalebr</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%2F2694701%2F1b417402-c6c0-46b0-b61b-cf5d86226b2b.png</url>
      <title>DEV Community: DevCalebR</title>
      <link>https://dev.to/devcalebr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devcalebr"/>
    <language>en</language>
    <item>
      <title>Building a Self-Hosted PDF-to-AI Pipeline with FastAPI and Next.js</title>
      <dc:creator>DevCalebR</dc:creator>
      <pubDate>Tue, 14 Jul 2026 00:00:36 +0000</pubDate>
      <link>https://dev.to/devcalebr/building-a-self-hosted-pdf-to-ai-pipeline-with-fastapi-and-nextjs-422p</link>
      <guid>https://dev.to/devcalebr/building-a-self-hosted-pdf-to-ai-pipeline-with-fastapi-and-nextjs-422p</guid>
      <description>&lt;p&gt;&lt;strong&gt;## Building a Self-Hosted PDF-to-AI Pipeline with FastAPI and Next.js&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpkp216qg5tl556kelso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpkp216qg5tl556kelso.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Every time I started building an AI application that needed to work with PDFs, I ran into the same problem.&lt;br&gt;
The document parser wasn't the difficult part.&lt;br&gt;
Everything around it was.&lt;br&gt;
I needed to build:&lt;br&gt;
Upload handling&lt;br&gt;
Background processing&lt;br&gt;
Export pipelines&lt;br&gt;
Packaging&lt;br&gt;
Progress tracking&lt;br&gt;
Download workflows&lt;br&gt;
A frontend&lt;br&gt;
By the time I finished all of that, I'd spent more time building infrastructure than building the AI application I actually cared about.&lt;br&gt;
Why local processing mattered&lt;br&gt;
Another requirement I had was keeping document processing under my own control.&lt;br&gt;
Many document workflows involve:&lt;br&gt;
Internal documentation&lt;br&gt;
Research&lt;br&gt;
Contracts&lt;br&gt;
Proprietary manuals&lt;br&gt;
Company knowledge bases&lt;br&gt;
For those kinds of documents, I preferred running the processing locally or on infrastructure I control rather than sending files to a third-party service.&lt;br&gt;
What I built&lt;br&gt;
To solve that problem, I built RelayWorks.&lt;br&gt;
RelayWorks is a self-hosted FastAPI and Next.js application that prepares documents for downstream AI workflows.&lt;br&gt;
It generates:&lt;br&gt;
Markdown&lt;br&gt;
HTML&lt;br&gt;
JSON&lt;br&gt;
Plain text&lt;br&gt;
Extracted images&lt;br&gt;
Processing reports&lt;br&gt;
Downloadable output packages&lt;br&gt;
Instead of spending days assembling a complete document-processing workflow, I wanted a toolkit that was already organized and ready to customize.&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%2Fkx1uvr89c7i78duov6jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkx1uvr89c7i78duov6jj.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Who it's for&lt;br&gt;
RelayWorks is designed for developers building:&lt;br&gt;
Retrieval-Augmented Generation (RAG) systems&lt;br&gt;
Internal AI tools&lt;br&gt;
Knowledge bases&lt;br&gt;
Document automation workflows&lt;br&gt;
Lessons learned&lt;br&gt;
A few things surprised me while building the project.&lt;br&gt;
The parser isn't the hard part.&lt;br&gt;
The surrounding infrastructure usually takes significantly longer than extracting text.&lt;br&gt;
Clean outputs matter.&lt;br&gt;
Generating structured Markdown and JSON saves a lot of downstream cleanup when preparing data for AI systems.&lt;br&gt;
User experience matters.&lt;br&gt;
Progress indicators, downloadable packages, and clear outputs dramatically improve usability compared to command-line-only workflows.&lt;br&gt;
Closing thoughts&lt;br&gt;
Building RelayWorks taught me that the biggest challenge wasn't extracting text from documents—it was turning that extraction into a workflow developers could actually use.&lt;br&gt;
I'd be interested to hear how others are approaching document ingestion today.&lt;br&gt;
If you've built RAG systems or AI document pipelines, what's been the biggest challenge in your workflow?&lt;br&gt;
Website:&lt;br&gt;
&lt;a href="https://getrelayworks.com" rel="noopener noreferrer"&gt;https://getrelayworks.com&lt;/a&gt;&lt;br&gt;
GitHub Showcase:&lt;br&gt;
&lt;a href="https://github.com/DevCalebR/relayworks-document-processing-showcase" rel="noopener noreferrer"&gt;https://github.com/DevCalebR/relayworks-document-processing-showcase&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
