<?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: Tejas Rawool</title>
    <description>The latest articles on DEV Community by Tejas Rawool (@tejasrawool186).</description>
    <link>https://dev.to/tejasrawool186</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%2F3755019%2F0e3f4a9c-5c48-49c8-8bf8-c15f94432a39.png</url>
      <title>DEV Community: Tejas Rawool</title>
      <link>https://dev.to/tejasrawool186</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tejasrawool186"/>
    <language>en</language>
    <item>
      <title>I Built Autonomiq: A Local AI Research Agent That Lets You Walk Away</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:33:03 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/i-built-autonomiq-a-local-ai-research-agent-that-lets-you-walk-away-2180</link>
      <guid>https://dev.to/tejasrawool186/i-built-autonomiq-a-local-ai-research-agent-that-lets-you-walk-away-2180</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Research can turn into hours of switching between browser tabs, collecting sources, extracting information, comparing findings, and writing reports. I wanted to explore a different workflow: what if I could delegate that process to an AI agent, leave my desk, and return when the work was ready?&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;Autonomiq&lt;/strong&gt;, a local-first autonomous AI research workspace built for students, developers, and researchers who want to automate repetitive knowledge work without constantly watching a chat window.&lt;/p&gt;

&lt;p&gt;Autonomiq takes a research objective, prepares a plan, searches for sources, extracts content, indexes evidence for retrieval, analyzes the collected material with a local language model, and generates a structured Markdown report. It can also generate an audio digest so the user can listen to the summary away from the screen.&lt;/p&gt;

&lt;p&gt;I designed the experience around three principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Delegate, don't babysit.&lt;/strong&gt; A task should have a lifecycle independent of the browser interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the AI replaceable.&lt;/strong&gt; Local model inference should not depend on a single proprietary LLM API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the work inspectable.&lt;/strong&gt; Users should be able to see execution stages, sources, and generated artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to create another chatbot that encourages longer conversations. It is to make the time spent supervising repetitive research shorter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/TejasRawool186" rel="noopener noreferrer"&gt;
        TejasRawool186
      &lt;/a&gt; / &lt;a href="https://github.com/TejasRawool186/Autonomiq" rel="noopener noreferrer"&gt;
        Autonomiq
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Autonomiq is a local-first autonomous AI workspace designed to execute digital tasks on a user's computer while minimizing the need for continuous human supervision.
    &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;Autonomiq&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A Local-First Autonomous AI Workspace&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"Your AI works. You live."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Built for Hacktoberfest 2026 Open-Source AI Challenge.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Autonomiq executes long-running digital research tasks on your computer while minimizing continuous screen time. Users submit tasks in natural language, review an execution plan, and the system autonomously conducts web research, document parsing, RAG embeddings, analysis, and report generation in the background.&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;Away Mode&lt;/strong&gt; and durable execution (via Temporal), you can submit a task, close your browser, leave your desk, and return to completed source-backed reports and an audio digest.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏗️ Architecture &amp;amp; Modules&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Autonomiq/
├── backend/                       # FastAPI Server &amp;amp; AI Execution Engine
│   ├── app/
│   │   ├── api/                   # REST Endpoints (Tasks, Documents, Health)
│   │   ├── models/                # SQLite State &amp;amp; Entity Models
│   │   ├── schemas/               # Request/Response Data Contracts
│   │   ├── agent/                 # LangGraph Multi-Node Workflow
│   │   │   └── nodes/             #&lt;/code&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/TejasRawool186/Autonomiq" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository contains a React and TypeScript frontend, a FastAPI backend, task and artifact storage, research workflow modules, local vector retrieval, and integrations for search, model inference, tracing, and audio generation.&lt;/p&gt;

&lt;p&gt;The implementation and setup notes are available in the repository, including the environment configuration example and the software requirements specification.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Imagine researching open-weight AI models for a project. You need to find relevant pages, compare model capabilities, extract hardware requirements, organize the evidence, and turn everything into a report.&lt;/p&gt;

&lt;p&gt;A conventional workflow requires repeated manual steps. A chat-based AI workflow can help with individual steps, but the user may still need to collect sources, provide documents, move information between tools, and assemble the final output.&lt;/p&gt;

&lt;p&gt;Autonomiq approaches the problem as a workflow rather than a single prompt. The user describes the desired result, and the application coordinates a sequence of research and processing stages.&lt;/p&gt;

&lt;p&gt;There is also a privacy consideration. Research material and local documents are not always suitable for uploading to a third-party LLM service. Running the language-model inference locally gives the user more control over where that processing happens.&lt;/p&gt;

&lt;p&gt;That does not eliminate every external dependency. Live web search still requires a search provider, and the optional audio integration uses an external service. The distinction matters: &lt;strong&gt;local inference and online research are separate parts of the system.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;The central idea behind Autonomiq is simple: give an AI agent a task that takes time, let the computer perform the work in the background, and return to the result instead of watching every step.&lt;/p&gt;

&lt;p&gt;The application is built around a task-oriented interface rather than an open-ended chat. A task has an objective, an execution plan, a sequence of processing stages, sources, and generated artifacts.&lt;/p&gt;

&lt;p&gt;The user-facing experience includes Away Mode, task monitoring, source attribution, and an audio digest. The backend keeps task execution separate from the frontend so that closing the browser does not inherently cancel the work, provided the backend worker remains active.&lt;/p&gt;

&lt;p&gt;This is my interpretation of the Touch Grass theme. The application does not need to identify a bird or plan a hike to encourage time away from the screen. It can address another source of screen time: supervising repetitive computer work.&lt;/p&gt;

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

&lt;p&gt;The research workflow is organized into six primary stages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plan:&lt;/strong&gt; The planner uses the configured local model to create a structured research plan and search queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search:&lt;/strong&gt; The researcher calls SerpApi to collect candidate web results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract:&lt;/strong&gt; The extraction stage uses BeautifulSoup-based tooling to retrieve and normalize webpage content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index:&lt;/strong&gt; The indexer chunks collected content, creates embeddings, stores them in Qdrant, and retrieves relevant passages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze:&lt;/strong&gt; The analyst sends the retrieved evidence to the local model for synthesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report:&lt;/strong&gt; The reporter assembles the analysis and source references into a Markdown report.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An audio digest can then be generated from the analysis through the ElevenLabs integration.&lt;/p&gt;

&lt;p&gt;The relevant workflow code lives under &lt;code&gt;backend/app/agent/&lt;/code&gt; and &lt;code&gt;backend/app/workflows/&lt;/code&gt;. The primary orchestration module calls the workflow stages in sequence, while the Temporal workflow and activity modules provide a separate path intended for durable background execution.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[Research objective] --&amp;gt; B[Local AI planner]
    B --&amp;gt; C[Web search]
    C --&amp;gt; D[Extract page content]
    D --&amp;gt; E[Chunk and embed]
    E --&amp;gt; F[Qdrant retrieval]
    F --&amp;gt; G[Local model analysis]
    G --&amp;gt; H[Markdown report]
    H --&amp;gt; I[Optional audio digest]
    I --&amp;gt; J[Save artifacts]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The retrieval step is important because the analyst should work from collected evidence rather than relying exclusively on the model's existing knowledge. The report also records source URLs so that readers can inspect the material behind the findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Architecture
&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;th&gt;Why it is used&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;React, Vite, TypeScript&lt;/td&gt;
&lt;td&gt;Task creation, monitoring, and results&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;td&gt;API endpoints and application services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task persistence&lt;/td&gt;
&lt;td&gt;SQLite, SQLAlchemy&lt;/td&gt;
&lt;td&gt;Store task state and related records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow modules&lt;/td&gt;
&lt;td&gt;Python async workflow orchestration&lt;/td&gt;
&lt;td&gt;Coordinate planning, research, indexing, analysis, and reporting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local inference&lt;/td&gt;
&lt;td&gt;Ollama with compatible Gemma or Qwen models&lt;/td&gt;
&lt;td&gt;Generate plans and synthesize evidence locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web search&lt;/td&gt;
&lt;td&gt;SerpApi&lt;/td&gt;
&lt;td&gt;Retrieve current web search results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web extraction&lt;/td&gt;
&lt;td&gt;BeautifulSoup&lt;/td&gt;
&lt;td&gt;Extract readable webpage content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeddings and retrieval&lt;/td&gt;
&lt;td&gt;FastEmbed, Qdrant&lt;/td&gt;
&lt;td&gt;Index text chunks and retrieve relevant passages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Document processing&lt;/td&gt;
&lt;td&gt;pypdf, Markdown tooling&lt;/td&gt;
&lt;td&gt;Extract and process supported documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow durability&lt;/td&gt;
&lt;td&gt;Temporal integration&lt;/td&gt;
&lt;td&gt;Provide a path for durable workflow execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Sentry SDK integration&lt;/td&gt;
&lt;td&gt;Capture configured telemetry and execution metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio digest&lt;/td&gt;
&lt;td&gt;ElevenLabs&lt;/td&gt;
&lt;td&gt;Convert the research summary into speech&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The stack is deliberately modular. The local model communicates through an Ollama client, source collection is separated from extraction, and retrieval is isolated behind vector-store tooling.&lt;/p&gt;

&lt;p&gt;That separation makes it easier to debug a failed search independently of a model-inference problem. It also makes future changes to the model or retrieval implementation less disruptive.&lt;/p&gt;

&lt;p&gt;The presence of an integration in the repository does not, by itself, mean that every deployment has it enabled. Services such as SerpApi, ElevenLabs, Sentry, and Temporal require the relevant configuration and runtime dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Open-Source AI
&lt;/h2&gt;

&lt;p&gt;The local-model component is central to Autonomiq. The backend's &lt;code&gt;OllamaClient&lt;/code&gt; communicates with Ollama's generation endpoint, and the planner and analyst use that client to generate plans and synthesize retrieved evidence.&lt;/p&gt;

&lt;p&gt;The configuration supports compatible Gemma and Qwen model names. For this project, Gemma through Ollama is the intended open-weight model path.&lt;/p&gt;

&lt;p&gt;This approach gives the application control over the model runtime and makes it possible to perform the core language-model inference locally, without requiring a proprietary cloud LLM API for every planning or analysis step.&lt;/p&gt;

&lt;p&gt;Open innovation also makes the system easier to experiment with. A developer can change the configured model, inspect the workflow, modify the prompts, or replace a tool without rebuilding the entire application around one hosted AI provider.&lt;/p&gt;

&lt;p&gt;There are tradeoffs. Local inference consumes the user's own CPU, memory, and possibly GPU resources. Smaller models can produce weaker summaries, and performance depends on the model, quantization, and hardware. Live search and external speech synthesis also introduce network dependencies.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Consideration&lt;/th&gt;
&lt;th&gt;Local model through Ollama&lt;/th&gt;
&lt;th&gt;Hosted LLM API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model inference&lt;/td&gt;
&lt;td&gt;Runs on the configured local runtime&lt;/td&gt;
&lt;td&gt;Runs on a provider's infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data control&lt;/td&gt;
&lt;td&gt;Prompts can remain local during inference&lt;/td&gt;
&lt;td&gt;Prompts are sent to the selected provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Local hardware and electricity&lt;/td&gt;
&lt;td&gt;Usually usage-based or subscription-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;td&gt;Limited by local resources&lt;/td&gt;
&lt;td&gt;Uses provider-side compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model choice&lt;/td&gt;
&lt;td&gt;Depends on locally available compatible models&lt;/td&gt;
&lt;td&gt;Depends on the provider's offerings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important distinction is not that local AI is always better. It is that the user gets a meaningful choice about where inference happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example
&lt;/h2&gt;

&lt;p&gt;A useful task for Autonomiq is a research request such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Research ten useful open-weight AI models, compare their capabilities and hardware requirements, and generate a report.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The intended processing path is to create a plan, search for relevant pages, extract available content, index the collected evidence, analyze retrieved passages with the local model, and save the final Markdown report. If configured, the workflow can also generate an audio digest.&lt;/p&gt;

&lt;p&gt;The current interface also displays a task called "Verification Test" as completed, with six sources processed and two artifacts listed: &lt;code&gt;report.md&lt;/code&gt; and &lt;code&gt;digest.mp3&lt;/code&gt;. This is the state shown in the application interface, not a claim that I independently benchmarked the research quality or verified every citation.&lt;/p&gt;

&lt;p&gt;A second use case is document research. A user can supply supported documents, have their text extracted and indexed, and use retrieval to provide relevant passages for subsequent analysis. This is useful when the information already exists in a collection of PDFs or notes.&lt;/p&gt;

&lt;p&gt;A third use case is listening to the final summary instead of reading the entire report. The audio digest turns the report into a speech artifact, although its availability depends on the audio service being configured and the generation step succeeding.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Most AI research tools focus on the answer. Autonomiq models the process.&lt;/strong&gt; Its workflow separates planning, searching, extracting, indexing, analysis, and reporting, making each stage easier to inspect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most chat interfaces assume the user remains present. Autonomiq separates task execution from the browser.&lt;/strong&gt; The background-execution design is intended to let users leave the interface while the worker continues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Many research workflows depend on hosted language models. Autonomiq supports local inference.&lt;/strong&gt; The Ollama integration lets compatible open-weight models handle planning and synthesis on the user's machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A summary without evidence is difficult to verify. Autonomiq preserves source references.&lt;/strong&gt; The indexer attaches source metadata to chunks, and the report includes source URLs and excerpts where available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A report does not have to mean another screen session.&lt;/strong&gt; The optional audio digest gives users another way to consume the result after the research task finishes.&lt;/p&gt;

&lt;p&gt;These are architectural and product-design distinctions, not claims that every feature has been validated under every runtime configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Process
&lt;/h2&gt;

&lt;p&gt;I organized the implementation into phases so that the application could develop from a backend foundation into an end-to-end research workspace.&lt;/p&gt;

&lt;p&gt;First, I established the project structure, environment configuration, API layer, database models, and request and response schemas. The task, step, source, and artifact entities provide the foundation for tracking research work.&lt;/p&gt;

&lt;p&gt;Next, I implemented document parsing, file management, text chunking, and the Qdrant vector-store integration. These components provide the retrieval layer used by the research analyst.&lt;/p&gt;

&lt;p&gt;I then built the workflow modules for planning, web search, extraction, indexing, analysis, and report generation. The local Ollama client keeps model communication separate from the individual stages.&lt;/p&gt;

&lt;p&gt;After that, I added the Temporal workflow and activity modules, Sentry tracing support, and the ElevenLabs audio-digest integration. Finally, I built the React interface around task creation, Away Mode, task monitoring, and generated results.&lt;/p&gt;

&lt;p&gt;The repository's &lt;code&gt;progress.md&lt;/code&gt;, &lt;code&gt;task_plan.md&lt;/code&gt;, and &lt;code&gt;findings.md&lt;/code&gt; document the development process and decisions.&lt;/p&gt;

&lt;p&gt;One important implementation decision was to keep the stages modular instead of placing the entire research pipeline in a single large function. Another was to make the local model runtime configurable rather than hardwiring a single model throughout the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Lessons
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Separating live search from content extraction.&lt;/strong&gt; Search results provide candidate URLs and snippets, but snippets are not equivalent to full page content. The extractor attempts to retrieve page content separately. A failed extraction should remain distinguishable from a successful one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Grounding analysis in retrieved material.&lt;/strong&gt; The indexer connects chunks to source metadata before retrieval. This creates a path for evidence-backed analysis, but source attribution alone does not prove that every generated claim is correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Handling local inference failures.&lt;/strong&gt; Ollama can be unavailable or unable to load the selected model. The application needs to distinguish model-runtime failure from an ordinary empty research result, rather than presenting both as successful analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Making long-running work understandable.&lt;/strong&gt; A task-oriented interface needs more than a spinner. Status, execution stages, errors, and artifacts help users understand what happened without reading backend logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Keeping the integrations honest.&lt;/strong&gt; A configured integration is not the same as a successfully completed operation. Optional services need explicit availability and error states, and a task should not be presented as fully successful when a required stage fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Autonomiq is an evolving project, and several limitations are important to state clearly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search fallback behavior:&lt;/strong&gt; The current researcher module includes fallback source records when live search returns no sources. These records are placeholders, not verified search results. They must be clearly marked or removed before treating every generated report as evidence-grounded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraction quality:&lt;/strong&gt; Some websites may block automated access, return incomplete content, or provide pages that cannot be parsed reliably. Search snippets may remain insufficient for detailed analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model availability:&lt;/strong&gt; Local inference requires a compatible model runtime and sufficient hardware. The application does not make every model suitable for every machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback analysis:&lt;/strong&gt; The analyst contains fallback behavior when model generation fails. Such output should be clearly labeled as fallback output rather than presented as equivalent to a successful model-generated synthesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow durability:&lt;/strong&gt; Temporal workflow and activity modules exist, but the presence of those modules alone does not establish that crash recovery and retry behavior have been verified end to end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External services:&lt;/strong&gt; Live search and audio synthesis depend on their respective service configurations. Local model inference does not make the entire application fully offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; I am not publishing performance or accuracy numbers because I do not have independently verified measurements for this write-up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are useful areas for continued development because a trustworthy research agent must make failures and evidence quality visible, not hide them behind a polished report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;The next improvements I would prioritize are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Evidence quality controls:&lt;/strong&gt; Remove unverified placeholder sources from successful research results, clearly mark missing evidence, and validate that cited URLs correspond to retrieved material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable execution testing:&lt;/strong&gt; Verify actual worker interruption, restart, retry, cancellation, and task recovery behavior with integration tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved report exports:&lt;/strong&gt; Add a structured PDF export with readable headings, source links, page numbers, and consistent typography.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better model and resource management:&lt;/strong&gt; Detect available models, provide clearer hardware guidance, and surface inference errors in the interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More transparent execution telemetry:&lt;/strong&gt; Connect the task timeline to real stage events and expose meaningful latency, retry, and failure information.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I would prioritize source integrity and workflow recovery before adding more tools. A research agent should be able to explain what it did, which sources it used, and where its process failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run It
&lt;/h2&gt;

&lt;p&gt;The repository documents a local development setup using Python, Node.js, Ollama, and optional external integrations.&lt;/p&gt;

&lt;p&gt;Clone the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TejasRawool186/Autonomiq.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Autonomiq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the environment configuration:&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;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure the local model and any external services you intend to use. Install the backend requirements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate the environment, then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; backend/requirements.txt
python scripts/run_backend.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a second terminal, 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;frontend
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;Open &lt;code&gt;http://localhost:5173&lt;/code&gt;. The backend API documentation is available at &lt;code&gt;http://localhost:8000/docs&lt;/code&gt; when the backend is running with the documented local configuration.&lt;/p&gt;

&lt;p&gt;For local inference, install Ollama and pull a model compatible with the configured model name. Live research and audio generation require the relevant API credentials. Check the repository's current setup instructions before running the optional workflow integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Required project details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Autonomiq&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/TejasRawool186/Autonomiq" rel="noopener noreferrer"&gt;https://github.com/TejasRawool186/Autonomiq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenge:&lt;/strong&gt; &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model runtime:&lt;/strong&gt; Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intended open-weight model path:&lt;/strong&gt; Gemma&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search integration:&lt;/strong&gt; SerpApi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio integration:&lt;/strong&gt; ElevenLabs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent tracing integration:&lt;/strong&gt; Sentry, when configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No dataset is required for the basic research workflow. The system collects sources for each research objective.&lt;/p&gt;

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

&lt;p&gt;I have not included an agent-session embed because I do not have a verified public DevRelay or other agent-session URL to share. The repository contains project planning and progress documents that describe the implementation phases.&lt;/p&gt;

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

&lt;p&gt;The integrations most directly represented in the code are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; The local inference path uses Ollama with compatible Gemma model configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi:&lt;/strong&gt; The researcher calls SerpApi to retrieve web search results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; The audio-digest workflow calls the ElevenLabs integration to generate speech from the research summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sentry tracing support is also present in the code, but I would only enter the Sentry category after verifying that the relevant execution spans are recorded and visible in a real run.&lt;/p&gt;

&lt;p&gt;I am not claiming the Render, Temporal, or any other partner category solely because a configuration file or dependency exists. Those integrations need meaningful, verified execution before they should be presented as a completed partner-category entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;Building Autonomiq made me think about AI productivity differently. The objective is not to maximize the time someone spends interacting with a model, but to reduce the supervision needed to complete useful work. Local inference gives users more control over where their documents and prompts are processed, while source attribution and execution visibility provide a foundation for trust. The next step is to make evidence handling and durable execution as reliable as the user experience is intended to be.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>FolderPilot: A Local AI Folder Organizer That Is Built Never to Delete a File</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:34:47 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/folderpilot-a-local-ai-folder-organizer-that-is-built-never-to-delete-a-file-180m</link>
      <guid>https://dev.to/tejasrawool186/folderpilot-a-local-ai-folder-organizer-that-is-built-never-to-delete-a-file-180m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;FolderPilot is a local web app that scans any folder, reads what is inside the files, and proposes a cleaner structure. It shows the result as an interactive, color-coded map. You review the plan, edit it, and approve it. Nothing changes on disk until you do.&lt;/p&gt;

&lt;p&gt;I built it for a friend whose folders hold exactly the kind of files you do not want to upload anywhere: ID scans, marksheets, resumes, offer letters, and assignments, all mixed together with installers and screenshots. Cloud organizers want those documents on someone else's server. Cleanup scripts delete things. I wanted a tool that does neither.&lt;/p&gt;

&lt;p&gt;Three rules shaped the whole project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything runs on &lt;code&gt;127.0.0.1&lt;/code&gt; with an open-weight model served by Ollama.&lt;/li&gt;
&lt;li&gt;The code has no delete, unlink, remove, or truncate path, so there is nothing to bypass.&lt;/li&gt;
&lt;li&gt;Every change is journaled before it happens, so any operation, batch, or the whole workspace can be undone.&lt;/li&gt;
&lt;/ul&gt;




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

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

&lt;p&gt;The video walks through scanning a real folder, exploring the treemap and sunburst views, reviewing the before and after plan, applying it, and rolling it back. It also shows the folder chat refusing a request to delete files.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&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/TejasRawool186" rel="noopener noreferrer"&gt;
        TejasRawool186
      &lt;/a&gt; / &lt;a href="https://github.com/TejasRawool186/FolderPilot" rel="noopener noreferrer"&gt;
        FolderPilot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local, privacy-first web app that analyzes any folder, shows it visually with color-coded suggested sorting, lets you customize and approve the plan, and lets you chat with the folder. It can never delete anything.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;FolderPilot&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Organize anything. Delete nothing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Privacy-first, local folder organizer with interactive visual analytics,&lt;br&gt;
append-only rollback journaling, and on-device AI.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e6d314a8009ab90a272916b54f31ec7e89904781f3097f4c2b4d00ed56e06386/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5361666574792d5a65726f5f44656c6574652d3232433535453f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/e6d314a8009ab90a272916b54f31ec7e89904781f3097f4c2b4d00ed56e06386/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5361666574792d5a65726f5f44656c6574652d3232433535453f7374796c653d666c61742d737175617265" alt="Safety"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2cb1ae7c854afbf291de513aea8d811fedf1bb9a4be4158d5683d3882ba13dac/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d4c6f63616c5f4f6e6c792d3645413846453f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/2cb1ae7c854afbf291de513aea8d811fedf1bb9a4be4158d5683d3882ba13dac/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d4c6f63616c5f4f6e6c792d3645413846453f7374796c653d666c61742d737175617265" alt="Privacy"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/542076106ddc376f2dc4e1faffb33f8886a54e44a2e4d5c1e80e75ecf8a5c508/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576f726b732d4f66666c696e652d3944384346463f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/542076106ddc376f2dc4e1faffb33f8886a54e44a2e4d5c1e80e75ecf8a5c508/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576f726b732d4f66666c696e652d3944384346463f7374796c653d666c61742d737175617265" alt="Offline"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2da883f48f5afac7bf09b5464ac2c81c1ec7492c5d98ec4862ddaac85b14bc06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d4539433436413f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/2da883f48f5afac7bf09b5464ac2c81c1ec7492c5d98ec4862ddaac85b14bc06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d4539433436413f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/TejasRawool186/FolderPilot#why-this-exists" rel="noopener noreferrer"&gt;Overview&lt;/a&gt; · &lt;a href="https://github.com/TejasRawool186/FolderPilot#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; · &lt;a href="https://github.com/TejasRawool186/FolderPilot#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt; · &lt;a href="https://github.com/TejasRawool186/FolderPilot#safety-model" rel="noopener noreferrer"&gt;Safety model&lt;/a&gt; · &lt;a href="https://github.com/TejasRawool186/FolderPilot#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Personal directories such as Downloads, Desktop, and work folders routinely accumulate sensitive files—including tax returns, identity cards, college transcripts, and resumes. Most of these files remain disorganized because manual sorting is slow and tedious.&lt;/p&gt;
&lt;p&gt;Typical cloud organizers require uploading private documents to external servers. Other utility scripts use aggressive delete operations that risk permanent data loss.&lt;/p&gt;
&lt;p&gt;FolderPilot runs entirely on local hardware, inspects documents privately on &lt;code&gt;127.0.0.1&lt;/code&gt;, and guarantees that no file can ever be deleted.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open-source, local AI&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Running open-weight language models locally on consumer hardware changes the economics and security of desktop file management:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Local Open-Source AI (FolderPilot)&lt;/th&gt;
&lt;th&gt;Cloud AI APIs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local-only. File contents, extracted text, and metadata never&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/TejasRawool186/FolderPilot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository has a FastAPI backend, a Next.js frontend, a pytest suite for the safety guarantees, and docs covering the architecture, the AI integration, and the API.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A Downloads folder is where files go to pile up. After a year it holds duplicate resumes (&lt;code&gt;resume_final&lt;/code&gt;, &lt;code&gt;resume_final2&lt;/code&gt;), screenshots named &lt;code&gt;IMG_2938.png&lt;/code&gt;, installers you already ran, and a few documents you would be uncomfortable seeing leaked.&lt;/p&gt;

&lt;p&gt;Existing options each fail in a different way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud organizers&lt;/strong&gt; need your documents uploaded, including identity cards and transcripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup scripts&lt;/strong&gt; sort by extension, which cannot tell an assignment from a bank statement, and some delete aggressively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doing it by hand&lt;/strong&gt; is slow enough that nobody finishes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;Make the AI the last resort, and make the file system layer safe by construction.&lt;/p&gt;

&lt;p&gt;Most files do not need a language model. An extension, a hash, or a keyword count settles them. So FolderPilot runs cheap checks first and only sends the genuinely ambiguous files to a small local model. That keeps it usable on a laptop with 8 GB of RAM and no GPU, which is the machine I developed it on.&lt;/p&gt;

&lt;p&gt;On the safety side, I did not add a "confirm delete" dialog. I removed deletion from the program. The file operations module only exposes &lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;move&lt;/code&gt;, and &lt;code&gt;rename&lt;/code&gt;.&lt;/p&gt;




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

&lt;p&gt;The scanner walks the chosen folder and streams progress to the UI. Each file then goes through four tiers, stopping at the first one that is confident.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A["Select any folder"] --&amp;gt; B["Background scan"]
    B --&amp;gt; C["Tier 1: extension and filename rules"]
    C --&amp;gt; D["Tier 2: SHA-256 duplicate detection"]
    D --&amp;gt; E["Tier 3: keyword prototypes on extracted text"]
    E --&amp;gt; F["Tier 4: local LLM, JSON schema output"]
    F --&amp;gt; G["Draft plan, unapproved"]
    G --&amp;gt; H["User reviews, edits, approves"]
    H --&amp;gt; I["Journal entry written"]
    I --&amp;gt; J["mkdir / move / rename"]
    J --&amp;gt; K["Undo: single op, batch, or full workspace"]&lt;/code&gt;&lt;/pre&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Handles&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Rules&lt;/td&gt;
&lt;td&gt;Extension taxonomy and filename regex&lt;/td&gt;
&lt;td&gt;Code, archives, media, installers, screenshots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Hashes&lt;/td&gt;
&lt;td&gt;Lazy SHA-256 on files with equal sizes&lt;/td&gt;
&lt;td&gt;Exact duplicates and repeated downloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Prototypes&lt;/td&gt;
&lt;td&gt;Keyword frequency in the first ~500 extracted tokens&lt;/td&gt;
&lt;td&gt;Assignments, invoices, offer letters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Local LLM&lt;/td&gt;
&lt;td&gt;Ollama with constrained JSON output&lt;/td&gt;
&lt;td&gt;Ambiguous PDFs and poorly named files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every file gets a category and a reason, so the review screen can show why it was placed where it was.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Architecture
&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;th&gt;Why&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, Tailwind, D3.js&lt;/td&gt;
&lt;td&gt;D3 gives full control over the treemap, sunburst, and tree comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python 3.11, FastAPI&lt;/td&gt;
&lt;td&gt;Async routes and server-sent events for live scan progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;SQLite in WAL mode&lt;/td&gt;
&lt;td&gt;File index, plans, and the journal in one local file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extraction&lt;/td&gt;
&lt;td&gt;PyMuPDF, python-docx, python-pptx&lt;/td&gt;
&lt;td&gt;Reads text from PDFs, Word, and PowerPoint files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local AI&lt;/td&gt;
&lt;td&gt;Ollama with Gemma 3 1B (default), Qwen 2.5 1.5B&lt;/td&gt;
&lt;td&gt;Small enough for CPU-only machines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The frontend never talks to anything but the local backend, which binds to &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The interface has these views:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treemap&lt;/strong&gt; with drill-down zoom and a spotlight filter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunburst&lt;/strong&gt; view of size by depth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before and after tree&lt;/strong&gt; showing the proposed structure next to the current one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate clusters&lt;/strong&gt; with keep-original and keep-newest suggestions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chaos score&lt;/strong&gt; from 0 to 100, based on root-level clutter, nesting imbalance, and duplicate ratio, with a slider that simulates cleanup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-app previewer&lt;/strong&gt; for images, audio, video, PDFs, Office documents, spreadsheets, and a hex view for binaries.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Used Open-Source AI
&lt;/h2&gt;

&lt;p&gt;The default model is Gemma 3 1B (&lt;code&gt;gemma3:1b&lt;/code&gt;, Q4_K_M, roughly 1.2 GB of RAM), served through Ollama. Qwen 2.5 1.5B is supported as an alternative. The model can be switched from the navigation bar at runtime, through the &lt;code&gt;POST /api/ai/model&lt;/code&gt; endpoint, or with the &lt;code&gt;FOLDERPILOT_OLLAMA_LLM_MODEL&lt;/code&gt; environment variable.&lt;/p&gt;

&lt;p&gt;The model does two jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fallback classification.&lt;/strong&gt; For files the first three tiers cannot place, it returns JSON matching a fixed schema. Constraining the output keeps replies short and parseable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Folder chat and summaries.&lt;/strong&gt; Counts and size questions are answered from SQLite, and the model handles wording and short document summaries.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why open weights mattered here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Local open model&lt;/th&gt;
&lt;th&gt;Cloud API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Privacy&lt;/td&gt;
&lt;td&gt;File text and metadata stay on the machine&lt;/td&gt;
&lt;td&gt;Excerpts of private documents leave the machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;No per-file cost&lt;/td&gt;
&lt;td&gt;Metered by volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Offline&lt;/td&gt;
&lt;td&gt;Works once weights are cached&lt;/td&gt;
&lt;td&gt;Needs a connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model choice&lt;/td&gt;
&lt;td&gt;Swap models in one setting&lt;/td&gt;
&lt;td&gt;Tied to one provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The tradeoff is accuracy. A 1B model will misclassify some ambiguous files, especially ones with little extractable text. That is why low-confidence files are surfaced in a review queue and why nothing is applied without approval. A user's manual category overrides are stored in local SQLite to guide later scans.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Example 1: classification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A file named &lt;code&gt;assignment_final.pdf&lt;/code&gt; sits next to &lt;code&gt;assignment.pdf&lt;/code&gt;. The extension alone says "document". Tier 2 notices the sizes differ, so they are not exact duplicates. Tier 3 reads the first page, finds terms common to coursework, and places both under a college category. The plan shows the reason on the card, and the user can drag them elsewhere if it is wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2: a destructive request&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the folder chat, I typed a request to delete all the duplicate files. The chat router intercepts deletion and removal requests before they reach the model. The reply explains that FolderPilot never deletes, and offers to move the duplicates into a &lt;code&gt;_Review_Later/&lt;/code&gt; folder instead. A test (&lt;code&gt;test_chat_delete_refusal&lt;/code&gt;) covers this behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 3: undo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After applying a plan, the Journal view lists every operation. One click on a single operation restores that file. One click on the batch restores everything the plan touched. Because the journal entry is written before each operation, an interrupted run leaves a consistent record.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;p&gt;Most organizers confirm before they delete. This one cannot delete.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safety by absence.&lt;/strong&gt; &lt;code&gt;safe_ops.py&lt;/code&gt; has no delete, unlink, remove, or truncate path. &lt;code&gt;test_no_delete_functions_exist&lt;/code&gt; checks that this stays true.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No overwrites.&lt;/strong&gt; Name collisions get a suffix, as in &lt;code&gt;Document (1).pdf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Journal before action.&lt;/strong&gt; The undo log is not an afterthought. Entries exist before the file system changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protected paths.&lt;/strong&gt; Folder browsing rejects system locations such as &lt;code&gt;C:\Windows&lt;/code&gt; and &lt;code&gt;C:\Program Files&lt;/code&gt;, and has tests for path traversal and symlink escapes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM as the last tier.&lt;/strong&gt; The model sees only the files the cheaper checks could not settle, which is what makes a 1B model enough.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Build Process
&lt;/h2&gt;

&lt;p&gt;I started by writing a requirements document before any code, because the safety rules had to be requirements and not afterthoughts. The repo's &lt;code&gt;docs/&lt;/code&gt; folder keeps that specification along with architecture notes and a development log.&lt;/p&gt;

&lt;p&gt;The backend came first: scanner, safe file operations, journal, and undo. I built the visual layer after that, once the plan and journal data was reliable. The default model started as Qwen 2.5 1.5B and moved to Gemma 3 1B after I tuned for memory use and speed on an 8 GB machine, with Qwen kept as a switchable option.&lt;/p&gt;

&lt;p&gt;The tests were written around the guarantees, not the features. If a safety claim appears in the README, there is a named test behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges and Lessons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treemap readability.&lt;/strong&gt; One large video file can swallow the whole canvas. Size scaling, translucent tiles, and label rules for small tiles fixed most of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making a small model useful.&lt;/strong&gt; A 1B model is unreliable as a first resort and good as a fallback. Constrained JSON output and short text excerpts made it consistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap work first.&lt;/strong&gt; Lazy hashing, caching, and limiting text extraction kept scans manageable on CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claims need evidence.&lt;/strong&gt; Rewriting the README forced me to check each safety statement against the code, and to soften wording where the code did not fully back it up.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Small models can misclassify files with little or no extractable text. The approval queue exists for this reason.&lt;/li&gt;
&lt;li&gt;OCR and keyword prototypes are tuned for English. Hindi, Marathi, and other Indic-script documents need more work.&lt;/li&gt;
&lt;li&gt;Folders with tens of thousands of files take longer to scan.&lt;/li&gt;
&lt;li&gt;The launcher script targets Windows. Other platforms use the manual setup.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Local semantic search using ONNX embeddings.&lt;/li&gt;
&lt;li&gt;Multi-language OCR for regional documents and identity cards.&lt;/li&gt;
&lt;li&gt;An in-app taxonomy editor for custom categories and subfolder rules.&lt;/li&gt;
&lt;li&gt;A packaged desktop build with an embedded Python runtime.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Run It
&lt;/h2&gt;

&lt;p&gt;Requirements: Python 3.11+, Node.js 20+, and Ollama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:1b
&lt;span class="nb"&gt;cd &lt;/span&gt;backend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python &lt;span class="nt"&gt;-m&lt;/span&gt; uvicorn app.main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a second terminal:&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;frontend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://127.0.0.1:3000&lt;/code&gt;. On Windows, &lt;code&gt;run.bat&lt;/code&gt; starts both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;I wanted a tool I would be comfortable pointing at a folder full of someone's private documents. Keeping the model local made the privacy story simple, and removing deletion from the code made the safety story simple. A small open model turned out to be enough once it was the last step in the pipeline instead of the first.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Building a Knowledge Integrity Platform with Sanity and AI</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Sun, 04 Oct 2026 15:29:05 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/building-a-knowledge-integrity-platform-with-sanity-and-ai-3fjc</link>
      <guid>https://dev.to/tejasrawool186/building-a-knowledge-integrity-platform-with-sanity-and-ai-3fjc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;ATLAS: AI Knowledge Integrity Auditor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can generate an answer in seconds.&lt;/p&gt;

&lt;p&gt;The harder question is whether that answer can actually be trusted.&lt;/p&gt;

&lt;p&gt;That question led me to build &lt;strong&gt;ATLAS&lt;/strong&gt;, an AI-powered knowledge integrity platform that transforms unstructured content into structured, interconnected knowledge and then investigates factual claims against that knowledge.&lt;/p&gt;

&lt;p&gt;Instead of treating an article as one large block of text, ATLAS transforms it into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source → Entity → Claim → Relationship → Conflict → Verdict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A user provides a real article or documentation URL. ATLAS extracts entities, atomic claims, relationships and provenance, then stores them as structured documents inside the &lt;strong&gt;Sanity Content Lake&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The user can then investigate a specific factual claim instead of simply asking an AI model to summarize the article.&lt;/p&gt;

&lt;p&gt;The result is an inspectable investigation containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evidence&lt;/li&gt;
&lt;li&gt;Sources&lt;/li&gt;
&lt;li&gt;Claims&lt;/li&gt;
&lt;li&gt;Relationships&lt;/li&gt;
&lt;li&gt;Conflicts&lt;/li&gt;
&lt;li&gt;Verdict&lt;/li&gt;
&lt;li&gt;Evidence graph&lt;/li&gt;
&lt;li&gt;Adversarial audit results&lt;/li&gt;
&lt;li&gt;Cryptographic certificate&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't just trust the answer. Inspect the evidence.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Demo Video
&lt;/h3&gt;

&lt;p&gt;Watch the complete ATLAS workflow:&lt;/p&gt;

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

&lt;p&gt;The demonstration covers:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ingest Article
      ↓
Extract Structured Knowledge
      ↓
Store Knowledge in Sanity
      ↓
Investigate Claim
      ↓
Generate Verdict
      ↓
Inspect Evidence Graph
      ↓
Run Adversarial Audit
      ↓
Generate Certificate
      ↓
Verify Investigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The demo uses a real-world article concerning NVIDIA and India's AI infrastructure investment and investigates specific factual claims from that content.&lt;/p&gt;


&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;p&gt;The complete source code is available on GitHub:&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/TejasRawool186" rel="noopener noreferrer"&gt;
        TejasRawool186
      &lt;/a&gt; / &lt;a href="https://github.com/TejasRawool186/Atlas" rel="noopener noreferrer"&gt;
        Atlas
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ATLAS is an autonomous knowledge-integrity platform that investigates factual questions by querying a Sanity-backed Content Lake and Knowledge Base, running adversarial audit probes, and producing tamper-evident cryptographic certificates.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ATLAS&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Audit factual claims against structured knowledge with cryptographic verification.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ATLAS is an epistemic integrity auditor that validates factual assertions against relational schemas in Sanity, evaluates contradictions across sources, and seals the evidence into tamper-evident Merkle certificates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1b17a35ed30dc4d23160be2e69deb4e0c48343cf15472f6031ac228e07fcda62/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d7632342e31312e302d626c75653f7374796c653d666c61742d737175617265" alt="Node"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/27d7b534f4ff234fdf884ca2e914b80716a32d34787ad541cbdaef5b03590856/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f747970657363726970742d76372e302e322d626c75653f7374796c653d666c61742d737175617265" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://github.com/TejasRawool186/Atlas#testing" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69f24798c379742d0b84ead0baba90692fb1e1733ddf27175f5e4a24ca13568e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d392532307061737365642d627269676874677265656e3f7374796c653d666c61742d737175617265" alt="Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/TejasRawool186/Atlas#license" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/422db9fd40f5831c765cf6530b6750c081b696bd18d904cf89554df98c676277/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e3f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://www.sanity.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/341cef55acc0af1b3442427ae8c98fb56577f2f764d146aef1054b4b3da15057/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73616e6974792d636f6e74656e742532306c616b652d7265643f7374796c653d666c61742d737175617265" alt="Sanity"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/TejasRawool186/Atlas#overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#tech-stack" rel="noopener noreferrer"&gt;Tech stack&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#testing" rel="noopener noreferrer"&gt;Testing&lt;/a&gt;&lt;/p&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;ATLAS validates factual claims against structured source documents and generates an auditable cryptographic proof for every verdict. The system is designed for engineering, compliance, and research teams that require autonomous agents to produce citations linked to structured schemas rather than ungrounded completions. Standard retrieval engines pass unstructured text chunks to an LLM, making temporal conflicts and subtle hallucinations difficult to isolate. ATLAS replaces this pattern by structuring sources into entities, claims, and relations within the Sanity Content Lake, evaluating conflicts with explicit authority rules, and executing a 10-probe audit suite before issuing a verdict. Every completed investigation produces a…&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/TejasRawool186/Atlas" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Investigation agent&lt;/li&gt;
&lt;li&gt;Sanity integration layer&lt;/li&gt;
&lt;li&gt;Sanity Studio schemas&lt;/li&gt;
&lt;li&gt;GROQ queries&lt;/li&gt;
&lt;li&gt;Evidence graph&lt;/li&gt;
&lt;li&gt;Conflict detection&lt;/li&gt;
&lt;li&gt;Adversarial audit system&lt;/li&gt;
&lt;li&gt;Cryptographic certificate generation&lt;/li&gt;
&lt;li&gt;Certificate verification&lt;/li&gt;
&lt;li&gt;Subsystem documentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why I Built It
&lt;/h3&gt;

&lt;p&gt;Traditional RAG systems are very good at finding text that looks relevant.&lt;/p&gt;

&lt;p&gt;But similarity is not the same thing as evidence.&lt;/p&gt;

&lt;p&gt;If two sources disagree, a typical retrieval pipeline can return both pieces of text and leave the model to decide what sounds correct.&lt;/p&gt;

&lt;p&gt;I wanted to explore a different approach.&lt;/p&gt;

&lt;p&gt;What if the underlying knowledge itself was structured?&lt;/p&gt;

&lt;p&gt;What if an AI system could understand that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entity
   ↓
Claim
   ↓
Source
   ↓
Relationship
   ↓
Conflict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not just stored data, but part of the reasoning process?&lt;/p&gt;

&lt;p&gt;That became the foundation of ATLAS.&lt;/p&gt;




&lt;h3&gt;
  
  
  How ATLAS Works
&lt;/h3&gt;

&lt;p&gt;The application follows a structured investigation pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Article / Documentation
        ↓
Structured Knowledge Extraction
        ↓
Sanity Content Lake
        ↓
Entity Resolution
        ↓
Claim Retrieval
        ↓
Evidence Comparison
        ↓
Conflict Detection
        ↓
AI Investigation
        ↓
Epistemic Verdict
        ↓
Evidence Graph
        ↓
Adversarial Audit
        ↓
Cryptographic Certificate
        ↓
Verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each stage has a specific responsibility.&lt;/p&gt;

&lt;p&gt;The AI model is not simply given an article and asked to produce an answer.&lt;/p&gt;

&lt;p&gt;Instead, the system first builds structured knowledge and then retrieves the evidence required for the investigation.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Knowledge Model
&lt;/h3&gt;

&lt;p&gt;ATLAS uses Sanity to represent knowledge as interconnected documents.&lt;/p&gt;

&lt;p&gt;The primary document types are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;entity
claim
source
relationship
conflict
knowledge_doc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A claim contains structured information 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;Subject
Predicate
Object
Source
Confidence
Status
Validity Window
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows the system to reason about individual claims rather than treating an entire article as one piece of text.&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;Source
   ↓
Entity: India
   ↓
Claim: AI investment = $1.2B
   ↓
Source: Article
   ↓
Relationship: supported_by
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same structure can also represent conflicting evidence.&lt;/p&gt;




&lt;h3&gt;
  
  
  How Sanity Fits Into the Application
&lt;/h3&gt;

&lt;p&gt;Sanity is not being used as a simple CMS or secondary database.&lt;/p&gt;

&lt;p&gt;It is the &lt;strong&gt;structured knowledge layer&lt;/strong&gt; behind ATLAS.&lt;/p&gt;

&lt;p&gt;The Content Lake stores the entities, claims, sources, relationships, conflicts and knowledge documents used by the investigation system.&lt;/p&gt;

&lt;p&gt;This means the application can query individual pieces of knowledge and follow their relationships.&lt;/p&gt;

&lt;p&gt;The underlying flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Question
      ↓
Relevant Entities
      ↓
Related Claims
      ↓
Supporting Sources
      ↓
Relationships
      ↓
Conflicts
      ↓
Evidence Set
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure is what allows ATLAS to investigate relationships rather than simply perform keyword matching.&lt;/p&gt;




&lt;h3&gt;
  
  
  GROQ Retrieval
&lt;/h3&gt;

&lt;p&gt;The application uses GROQ to retrieve structured knowledge from Sanity.&lt;/p&gt;

&lt;p&gt;The investigation first resolves relevant entities.&lt;/p&gt;

&lt;p&gt;It then retrieves claims associated with those entities and follows related documents.&lt;/p&gt;

&lt;p&gt;The retrieval layer can access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entities&lt;/li&gt;
&lt;li&gt;Claims&lt;/li&gt;
&lt;li&gt;Sources&lt;/li&gt;
&lt;li&gt;Relationships&lt;/li&gt;
&lt;li&gt;Conflicts&lt;/li&gt;
&lt;li&gt;Knowledge documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the investigation agent to construct an evidence set before generating its conclusion.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Investigation Agent
&lt;/h3&gt;

&lt;p&gt;Once the relevant knowledge has been retrieved, the investigation agent takes over.&lt;/p&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes the question&lt;/li&gt;
&lt;li&gt;Plans the investigation&lt;/li&gt;
&lt;li&gt;Resolves relevant entities&lt;/li&gt;
&lt;li&gt;Retrieves related claims&lt;/li&gt;
&lt;li&gt;Retrieves supporting sources&lt;/li&gt;
&lt;li&gt;Traverses relationships&lt;/li&gt;
&lt;li&gt;Detects competing claims&lt;/li&gt;
&lt;li&gt;Applies source authority and recency rules&lt;/li&gt;
&lt;li&gt;Generates a citation-backed conclusion&lt;/li&gt;
&lt;li&gt;Audits the generated answer&lt;/li&gt;
&lt;li&gt;Produces the final verdict&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI therefore operates on structured evidence rather than an arbitrary collection of text chunks.&lt;/p&gt;




&lt;h3&gt;
  
  
  Epistemic Verdicts
&lt;/h3&gt;

&lt;p&gt;ATLAS does not force every investigation into a simple yes or no.&lt;/p&gt;

&lt;p&gt;It produces four possible outcomes:&lt;br&gt;
&lt;/p&gt;

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

PARTIALLY_SUPPORTED

CONTRADICTED

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

&lt;/div&gt;



&lt;p&gt;The last state is especially important.&lt;/p&gt;

&lt;p&gt;If the structured knowledge does not provide enough evidence, ATLAS can return:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;instead of inventing an answer.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conflict Detection
&lt;/h3&gt;

&lt;p&gt;One of the central parts of ATLAS is its contradiction engine.&lt;/p&gt;

&lt;p&gt;The system compares structured claims using factors 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;Subject
Predicate
Object
Source
Validity Interval
Source Authority
Recency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source authority is also considered when competing claims are discovered.&lt;/p&gt;

&lt;p&gt;This allows ATLAS to distinguish between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Different information
        ↓
Newer information
        ↓
More authoritative information
        ↓
Actual contradiction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would be much harder to implement reliably when all evidence is stored as raw text.&lt;/p&gt;




&lt;h3&gt;
  
  
  Adversarial Audit
&lt;/h3&gt;

&lt;p&gt;Generating an answer is not the final step.&lt;/p&gt;

&lt;p&gt;ATLAS runs a &lt;strong&gt;10-probe adversarial audit&lt;/strong&gt; against the generated investigation.&lt;/p&gt;

&lt;p&gt;The audit examines areas 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;Grounding
Unsupported Claims
Citation Coverage
Entity Drift
Evidence Consistency
Temporal Ordering
Counterfactual Source Removal
Retrieval Completeness
Contradictory Evidence
Answer Resilience
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The objective is to actively search for weaknesses in the conclusion.&lt;/p&gt;

&lt;p&gt;If a statement cannot be connected to the retrieved evidence, the audit can identify the problem instead of silently accepting it.&lt;/p&gt;




&lt;h3&gt;
  
  
  Evidence Graph
&lt;/h3&gt;

&lt;p&gt;Because the underlying knowledge is represented as connected documents, ATLAS can construct a live evidence graph.&lt;/p&gt;

&lt;p&gt;The graph connects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entities
   ↓
Claims
   ↓
Sources
   ↓
Relationships
   ↓
Conflicts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This provides a visual explanation of how the final verdict was reached.&lt;/p&gt;

&lt;p&gt;Instead of seeing only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Answer: SUPPORTED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the user can inspect the evidence that led to that result.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cryptographic Certificate
&lt;/h3&gt;

&lt;p&gt;ATLAS also adds an integrity layer to the investigation.&lt;/p&gt;

&lt;p&gt;The evidence used during an investigation can be sealed into a cryptographic certificate using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HMAC-SHA256
+
Merkle Tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The certificate commits the investigation to the evidence used at that point in time.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evidence
   ↓
Hash Evidence
   ↓
Build Merkle Tree
   ↓
Generate Certificate
   ↓
Verify Later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the underlying evidence is modified, verification can detect that the investigation no longer matches the original evidence state.&lt;/p&gt;




&lt;h3&gt;
  
  
  Demo Investigation
&lt;/h3&gt;

&lt;p&gt;For the demonstration, I used a real-world article concerning NVIDIA and India's AI infrastructure investment.&lt;/p&gt;

&lt;p&gt;Rather than asking ATLAS to simply summarize the article, I used the article as the starting point for structured knowledge extraction and then investigated specific factual claims.&lt;/p&gt;

&lt;h4&gt;
  
  
  Claim 1
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;"India's current AI investment is $1.2B."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ATLAS returned:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The result was connected to the extracted claim and its supporting source through the evidence graph.&lt;/p&gt;

&lt;h4&gt;
  
  
  Claim 2
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;"The Union Budget provides a 10-year tax holiday."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ATLAS returned:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The investigation found that although the article contained the AI investment figure, the evidence associated with the tax holiday indicated a &lt;strong&gt;20-year&lt;/strong&gt; period rather than 10 years.&lt;/p&gt;

&lt;p&gt;This demonstrates the central idea behind ATLAS.&lt;/p&gt;

&lt;p&gt;The agent is not simply repeating what an article says.&lt;/p&gt;

&lt;p&gt;It is decomposing the content into structured claims and investigating those claims against their available evidence.&lt;/p&gt;




&lt;h3&gt;
  
  
  Technology Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
React 19
Vite
TypeScript
Tailwind CSS

Backend
Node.js
Express
Server-Sent Events

Knowledge Layer
Sanity
Sanity Content Lake
GROQ
Sanity Studio

AI
Gemini 2.5 Flash

Integrity
HMAC-SHA256
Merkle Trees
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application uses AI for interpretation-heavy tasks such as extraction, planning and answer synthesis.&lt;/p&gt;

&lt;p&gt;Deterministic code handles retrieval, relationship traversal, source weighting, auditing and certificate verification.&lt;/p&gt;

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




&lt;h3&gt;
  
  
  Project Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         ATLAS
                           |
          +----------------+----------------+
          |                                 |
          v                                 v
      React 19                         Node.js
      Vite                             Express
          |                                 |
          +---------------+-----------------+
                          |
                          v
                  Investigation Agent
                          |
             +------------+------------+
             |                         |
             v                         v
          Gemini                    Sanity
        AI Layer                  Content Lake
                                      |
                           +----------+----------+
                           |          |          |
                           v          v          v
                        Claims    Entities   Sources
                           |          |          |
                           +----------+----------+
                                      |
                                      v
                                Relationships
                                      |
                                      v
                                   Conflicts
                                      |
                                      v
                              Evidence Graph
                                      |
                                      v
                              Adversarial Audit
                                      |
                                      v
                             Cryptographic Proof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  My Build Process
&lt;/h3&gt;

&lt;p&gt;The project started with a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would an AI system look like if its answer had to be investigated rather than simply generated?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first step was designing the knowledge model.&lt;/p&gt;

&lt;p&gt;Instead of storing an article as a single document, I modeled the application around relationships between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sources
Entities
Claims
Relationships
Conflicts
Knowledge Documents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that structure existed, I built the ingestion pipeline.&lt;/p&gt;

&lt;p&gt;The application takes a URL, extracts the relevant content and uses the AI layer to identify structured entities and atomic claims.&lt;/p&gt;

&lt;p&gt;Those objects are then stored in Sanity.&lt;/p&gt;

&lt;p&gt;The next challenge was retrieval.&lt;/p&gt;

&lt;p&gt;Rather than sending the entire article to the model, the agent first resolves entities and retrieves the relevant structured documents using GROQ.&lt;/p&gt;

&lt;p&gt;This made the investigation process more controlled and explainable.&lt;/p&gt;

&lt;p&gt;The next stage was contradiction detection.&lt;/p&gt;

&lt;p&gt;I introduced explicit rules for comparing claims, evaluating source authority and handling recency.&lt;/p&gt;

&lt;p&gt;After that came the adversarial audit.&lt;/p&gt;

&lt;p&gt;The audit was designed around one principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The system should try to break its own answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, I added the cryptographic certificate so that the evidence used by an investigation could be verified after the investigation was complete.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Worked
&lt;/h3&gt;

&lt;p&gt;The biggest success was using Sanity as a structured knowledge layer rather than treating it as a conventional content backend.&lt;/p&gt;

&lt;p&gt;Once claims, entities and relationships became first-class documents, many capabilities became easier to implement.&lt;/p&gt;

&lt;p&gt;GROQ also made it possible to express retrieval around the structure of the knowledge instead of relying entirely on semantic similarity.&lt;/p&gt;

&lt;p&gt;The evidence graph naturally followed from the relationships already stored in Sanity.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Did Not Work
&lt;/h3&gt;

&lt;p&gt;The first approach was too close to a traditional RAG system.&lt;/p&gt;

&lt;p&gt;It was tempting to retrieve relevant text and immediately ask the model for an answer.&lt;/p&gt;

&lt;p&gt;That worked for simple questions, but it did not provide enough visibility into why the answer was correct.&lt;/p&gt;

&lt;p&gt;The application therefore evolved toward structured claims and explicit provenance.&lt;/p&gt;

&lt;p&gt;Another challenge was avoiding excessive dependence on the AI model.&lt;/p&gt;

&lt;p&gt;The final architecture separates AI-assisted tasks from deterministic operations.&lt;/p&gt;

&lt;p&gt;AI handles interpretation.&lt;/p&gt;

&lt;p&gt;Deterministic code handles retrieval, relationship traversal, source weighting, auditing and verification.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Sanity Was Important
&lt;/h3&gt;

&lt;p&gt;The project would have been much harder to build if the article remained one large block of text.&lt;/p&gt;

&lt;p&gt;Sanity provided the structure needed to turn content into interconnected knowledge.&lt;/p&gt;

&lt;p&gt;The application can reason about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Who made the claim?
What exactly was claimed?
Where did it come from?
What other claims are related?
Does another source disagree?
When was the claim valid?
How strong is the evidence?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is where structured content becomes part of the application's reasoning model rather than simply being storage.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Project ID&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;hrexnsmi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dataset&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;production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sanity Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sanity.io/organizations/ofyfft9qh/project/hrexnsmi" rel="noopener noreferrer"&gt;https://www.sanity.io/organizations/ofyfft9qh/project/hrexnsmi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document Types&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;entity
claim
source
relationship
conflict
knowledge_doc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Studio Schemas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TejasRawool186/Atlas/tree/main/sanity-studio/schemaTypes" rel="noopener noreferrer"&gt;https://github.com/TejasRawool186/Atlas/tree/main/sanity-studio/schemaTypes&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Agent Session
&lt;/h3&gt;

&lt;p&gt;An agent session can be included here if available.&lt;/p&gt;

&lt;p&gt;The session should be made public before publishing so that judges can access it.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;ATLAS started with a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can we build an AI system that does not ask users to blindly trust its answer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The result is an application where the answer is only one part of the investigation.&lt;/p&gt;

&lt;p&gt;The evidence, sources, relationships, conflicts, audit results and cryptographic certificate are part of the result too.&lt;/p&gt;

&lt;p&gt;The goal is not to make AI appear infallible.&lt;/p&gt;

&lt;p&gt;The goal is to make its evidence easier to inspect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't just trust the answer. Inspect the evidence.&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>ATLAS: An AI Knowledge Integrity Auditor That Investigates Claims with Sanity</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Sun, 04 Oct 2026 14:34:09 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/atlas-an-ai-knowledge-integrity-auditor-that-investigates-claims-with-sanity-4pjb</link>
      <guid>https://dev.to/tejasrawool186/atlas-an-ai-knowledge-integrity-auditor-that-investigates-claims-with-sanity-4pjb</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;*&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;ATLAS - AI Knowledge Integrity Auditor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can answer almost any question in seconds.&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can you trust the answer?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A traditional RAG system retrieves similar chunks of text, gives them to an LLM, and generates an answer.&lt;/p&gt;

&lt;p&gt;But when an answer actually matters, similarity alone is not enough.&lt;/p&gt;

&lt;p&gt;You need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which claim supports the answer?&lt;/li&gt;
&lt;li&gt;Where did that claim come from?&lt;/li&gt;
&lt;li&gt;Do different sources disagree?&lt;/li&gt;
&lt;li&gt;Which source should be trusted?&lt;/li&gt;
&lt;li&gt;Is the evidence still valid?&lt;/li&gt;
&lt;li&gt;Can someone independently inspect the reasoning later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the problem I wanted to solve with &lt;strong&gt;ATLAS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ATLAS is an AI-powered knowledge integrity auditor that turns unstructured content into structured, interconnected knowledge and then investigates individual claims against that knowledge.&lt;/p&gt;

&lt;p&gt;Instead of treating an article as one large block of text, ATLAS transforms it into:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source → Entity → Claim → Relationship → Conflict → Verdict&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The structured knowledge is stored in &lt;strong&gt;Sanity's Content Lake&lt;/strong&gt;, allowing the investigation agent to query individual entities, claims, relationships, sources, and conflicts rather than relying only on semantic similarity.&lt;/p&gt;




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

&lt;p&gt;The workflow starts with a real article or documentation URL.&lt;/p&gt;

&lt;p&gt;ATLAS processes the content and extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entities&lt;/li&gt;
&lt;li&gt;Atomic claims&lt;/li&gt;
&lt;li&gt;Sources&lt;/li&gt;
&lt;li&gt;Relationships&lt;/li&gt;
&lt;li&gt;Knowledge documents&lt;/li&gt;
&lt;li&gt;Provenance information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are stored as structured documents in Sanity.&lt;/p&gt;

&lt;p&gt;Once the knowledge is available, a user can submit a specific factual claim for investigation.&lt;/p&gt;

&lt;p&gt;The investigation agent then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes the question and plans the investigation.&lt;/li&gt;
&lt;li&gt;Resolves relevant entities using GROQ.&lt;/li&gt;
&lt;li&gt;Retrieves claims connected to those entities.&lt;/li&gt;
&lt;li&gt;Retrieves the corresponding sources and relationships.&lt;/li&gt;
&lt;li&gt;Searches for competing or contradictory claims.&lt;/li&gt;
&lt;li&gt;Applies explicit source-authority and recency rules.&lt;/li&gt;
&lt;li&gt;Generates a citation-backed answer.&lt;/li&gt;
&lt;li&gt;Runs adversarial audit probes against the generated answer.&lt;/li&gt;
&lt;li&gt;Produces an epistemic verdict.&lt;/li&gt;
&lt;li&gt;Builds an evidence graph showing how the evidence is connected.&lt;/li&gt;
&lt;li&gt;Generates a cryptographic certificate that can be verified later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The possible verdicts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SUPPORTED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PARTIALLY_SUPPORTED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CONTRADICTED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INSUFFICIENT_EVIDENCE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is therefore not simply an AI-generated "yes" or "no".&lt;/p&gt;

&lt;p&gt;It is an inspectable investigation containing the verdict, evidence, sources, relationships, conflicts, audit results, evidence graph, and cryptographic certificate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't just trust the answer. Inspect the evidence.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;For the demonstration, I used a real-world article about &lt;strong&gt;NVIDIA and India's AI infrastructure investment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of asking ATLAS to summarize the article, I extracted individual factual claims and investigated them independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claim 1
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"India's current AI investment is $1.2B."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ATLAS returns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SUPPORTED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The system retrieves the relevant structured claim, resolves its associated entities and sources, and verifies that the evidence supports the assertion.&lt;/p&gt;

&lt;p&gt;The investigation result is connected back to the underlying evidence through the evidence graph.&lt;/p&gt;




&lt;h3&gt;
  
  
  Claim 2
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"The Union Budget provides a 10-year tax holiday."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ATLAS returns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONTRADICTED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The investigation finds that although the article contains the AI investment figure, the tax-holiday claim does not match the evidence stored in the knowledge base.&lt;/p&gt;

&lt;p&gt;The evidence indicates a &lt;strong&gt;20-year holiday rather than 10 years&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This demonstrates the core idea behind ATLAS.&lt;/p&gt;

&lt;p&gt;The agent is not simply repeating what an article says.&lt;/p&gt;

&lt;p&gt;It decomposes the content into structured claims and investigates those claims against their evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Investigation Flow
&lt;/h2&gt;

&lt;p&gt;The complete workflow demonstrated in the video is:&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%2Frgz9i3n7f6z91oladf69.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%2Frgz9i3n7f6z91oladf69.png" alt=" " width="564" height="2398"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Watch the Demo
&lt;/h2&gt;

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

&lt;p&gt;The demo walks through the complete ATLAS workflow, including article ingestion, claim investigation, evidence retrieval, verdict generation, the evidence graph, and certificate verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&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/TejasRawool186" rel="noopener noreferrer"&gt;
        TejasRawool186
      &lt;/a&gt; / &lt;a href="https://github.com/TejasRawool186/Atlas" rel="noopener noreferrer"&gt;
        Atlas
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ATLAS is an autonomous knowledge-integrity platform that investigates factual questions by querying a Sanity-backed Content Lake and Knowledge Base, running adversarial audit probes, and producing tamper-evident cryptographic certificates.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ATLAS&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Audit factual claims against structured knowledge with cryptographic verification.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ATLAS is an epistemic integrity auditor that validates factual assertions against relational schemas in Sanity, evaluates contradictions across sources, and seals the evidence into tamper-evident Merkle certificates.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1b17a35ed30dc4d23160be2e69deb4e0c48343cf15472f6031ac228e07fcda62/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d7632342e31312e302d626c75653f7374796c653d666c61742d737175617265" alt="Node"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/27d7b534f4ff234fdf884ca2e914b80716a32d34787ad541cbdaef5b03590856/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f747970657363726970742d76372e302e322d626c75653f7374796c653d666c61742d737175617265" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://github.com/TejasRawool186/Atlas#testing" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69f24798c379742d0b84ead0baba90692fb1e1733ddf27175f5e4a24ca13568e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d392532307061737365642d627269676874677265656e3f7374796c653d666c61742d737175617265" alt="Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/TejasRawool186/Atlas#license" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/422db9fd40f5831c765cf6530b6750c081b696bd18d904cf89554df98c676277/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e3f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://www.sanity.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/341cef55acc0af1b3442427ae8c98fb56577f2f764d146aef1054b4b3da15057/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73616e6974792d636f6e74656e742532306c616b652d7265643f7374796c653d666c61742d737175617265" alt="Sanity"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/TejasRawool186/Atlas#overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#tech-stack" rel="noopener noreferrer"&gt;Tech stack&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt; • &lt;a href="https://github.com/TejasRawool186/Atlas#testing" rel="noopener noreferrer"&gt;Testing&lt;/a&gt;&lt;/p&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;ATLAS validates factual claims against structured source documents and generates an auditable cryptographic proof for every verdict. The system is designed for engineering, compliance, and research teams that require autonomous agents to produce citations linked to structured schemas rather than ungrounded completions. Standard retrieval engines pass unstructured text chunks to an LLM, making temporal conflicts and subtle hallucinations difficult to isolate. ATLAS replaces this pattern by structuring sources into entities, claims, and relations within the Sanity Content Lake, evaluating conflicts with explicit authority rules, and executing a 10-probe audit suite before issuing a verdict. Every completed investigation produces a…&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/TejasRawool186/Atlas" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Repository:&lt;/p&gt;

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

&lt;p&gt;ATLAS is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js + Express for the backend API and Server-Sent Events&lt;/li&gt;
&lt;li&gt;React 19 + Vite for the frontend&lt;/li&gt;
&lt;li&gt;TypeScript throughout the application&lt;/li&gt;
&lt;li&gt;Sanity as the structured knowledge layer&lt;/li&gt;
&lt;li&gt;GROQ for structured retrieval&lt;/li&gt;
&lt;li&gt;Gemini 2.5 Flash for planning, extraction, and answer synthesis&lt;/li&gt;
&lt;li&gt;HMAC-SHA256 + Merkle trees for investigation certificates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository contains the investigation agent, Sanity integration layer, Studio schemas, evidence graph, audit system, certificate generation, and subsystem documentation.&lt;/p&gt;




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

&lt;p&gt;Sanity is not being used as a simple content database in ATLAS.&lt;/p&gt;

&lt;p&gt;It is the &lt;strong&gt;knowledge layer that the investigation agent depends on&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured Content Model
&lt;/h3&gt;

&lt;p&gt;The Content Lake contains six primary document types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;entity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;source&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relationship&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conflict&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;knowledge_doc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a URL is ingested, ATLAS fetches the page and uses Gemini to extract structured information.&lt;/p&gt;

&lt;p&gt;The resulting data is stored as interconnected Sanity documents.&lt;/p&gt;

&lt;p&gt;A claim contains information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subject&lt;/li&gt;
&lt;li&gt;Predicate&lt;/li&gt;
&lt;li&gt;Object&lt;/li&gt;
&lt;li&gt;Sources&lt;/li&gt;
&lt;li&gt;Validity window&lt;/li&gt;
&lt;li&gt;Status&lt;/li&gt;
&lt;li&gt;Confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means an article is no longer treated as a single text blob.&lt;/p&gt;

&lt;p&gt;It becomes a navigable knowledge structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Agent Queries Sanity
&lt;/h2&gt;

&lt;p&gt;All Sanity retrieval is handled through a dedicated query layer.&lt;/p&gt;

&lt;p&gt;The investigation agent does not directly manipulate Sanity documents.&lt;/p&gt;

&lt;p&gt;During an investigation, ATLAS performs several structured retrieval operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entity Resolution
&lt;/h3&gt;

&lt;p&gt;The agent uses GROQ matching against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entity names&lt;/li&gt;
&lt;li&gt;Descriptions&lt;/li&gt;
&lt;li&gt;Aliases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the investigation to identify the entities relevant to the user's claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claim Retrieval
&lt;/h3&gt;

&lt;p&gt;Once entities are resolved, ATLAS retrieves claims connected to those entities.&lt;/p&gt;

&lt;p&gt;The system batches these queries so that the investigation can retrieve the relevant knowledge efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relationship Traversal
&lt;/h3&gt;

&lt;p&gt;ATLAS also retrieves relationships connecting entities.&lt;/p&gt;

&lt;p&gt;Relationships can represent concepts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;supersedes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;introduced_in&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;depends_on&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the agent to reason about relationships instead of treating every statement as independent text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source Resolution
&lt;/h3&gt;

&lt;p&gt;Claims and relationships maintain references to their sources.&lt;/p&gt;

&lt;p&gt;ATLAS follows these references so that every assertion can be traced back to its provenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Knowledge Base Search
&lt;/h3&gt;

&lt;p&gt;ATLAS also queries &lt;code&gt;knowledge_doc&lt;/code&gt; documents using GROQ across titles, summaries, and extracted claims.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conflict Records
&lt;/h3&gt;

&lt;p&gt;Conflict documents are retrieved alongside the claims so competing evidence can be surfaced during the investigation.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Structured Content to Investigation
&lt;/h2&gt;

&lt;p&gt;The structure of the Sanity data directly drives the investigation process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contradiction Detection
&lt;/h3&gt;

&lt;p&gt;ATLAS compares claims using their:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subject&lt;/li&gt;
&lt;li&gt;Predicate&lt;/li&gt;
&lt;li&gt;Object&lt;/li&gt;
&lt;li&gt;Validity interval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Statements from the same source are not treated as independent evidence.&lt;/p&gt;

&lt;p&gt;When competing claims are detected, ATLAS applies explicit source-authority rules.&lt;/p&gt;

&lt;p&gt;The current authority hierarchy includes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Type&lt;/th&gt;
&lt;th&gt;Authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Official release&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git commit&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RFC&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community forum&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Recency is then used as a tie-breaker.&lt;/p&gt;

&lt;p&gt;This is important because the agent is not simply asking an LLM:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which answer sounds better?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is applying deterministic rules to structured evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evidence Graph
&lt;/h2&gt;

&lt;p&gt;Every investigation can be visualized as an evidence graph.&lt;/p&gt;

&lt;p&gt;The graph connects:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entities → Claims → Sources → Relationships → Conflicts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This makes the provenance of an answer inspectable.&lt;/p&gt;

&lt;p&gt;Instead of receiving a final answer with a collection of links, the user can navigate through the evidence structure and understand how the conclusion was reached.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adversarial Audit
&lt;/h2&gt;

&lt;p&gt;ATLAS does not stop after generating an answer.&lt;/p&gt;

&lt;p&gt;The generated answer is passed through a &lt;strong&gt;10-probe adversarial audit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The probes check areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grounding&lt;/li&gt;
&lt;li&gt;Unsupported claims&lt;/li&gt;
&lt;li&gt;Evidence coverage&lt;/li&gt;
&lt;li&gt;Temporal ordering&lt;/li&gt;
&lt;li&gt;Entity drift&lt;/li&gt;
&lt;li&gt;Contradictions&lt;/li&gt;
&lt;li&gt;Source consistency&lt;/li&gt;
&lt;li&gt;Counterfactual source removal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to challenge the answer rather than simply accept the first generated response.&lt;/p&gt;

&lt;p&gt;If the retrieved evidence cannot support the claim, ATLAS can return:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INSUFFICIENT_EVIDENCE&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;instead of guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cryptographic Investigation Certificates
&lt;/h2&gt;

&lt;p&gt;ATLAS also adds a second layer of verification.&lt;/p&gt;

&lt;p&gt;The evidence used during an investigation is committed into an &lt;strong&gt;HMAC-SHA256 Merkle certificate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The certificate incorporates the relevant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claims&lt;/li&gt;
&lt;li&gt;Sources&lt;/li&gt;
&lt;li&gt;Relationships&lt;/li&gt;
&lt;li&gt;Conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a tamper-evident record of the investigation.&lt;/p&gt;

&lt;p&gt;If the underlying evidence is modified after the certificate is generated, verification fails.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;The AI should not only explain why it reached a conclusion.&lt;br&gt;&lt;br&gt;
The evidence used to reach that conclusion should also be independently verifiable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Sanity Context
&lt;/h2&gt;

&lt;p&gt;The project was designed around Sanity's structured-content approach and the Sanity Context ecosystem.&lt;/p&gt;

&lt;p&gt;The live application currently performs its structured retrieval through the Sanity GROQ HTTP API.&lt;/p&gt;

&lt;p&gt;The application also exposes the configurable Sanity Context MCP endpoint through the Sanity Explorer area.&lt;/p&gt;

&lt;p&gt;The current agent implementation uses GROQ for its retrieval path rather than directly invoking the Context MCP client.&lt;/p&gt;

&lt;p&gt;This distinction is intentional and documented in the project.&lt;/p&gt;

&lt;p&gt;The architecture allows the retrieval layer to evolve toward direct Context MCP integration while keeping the structured Sanity knowledge model intact.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Sanity Matters to ATLAS
&lt;/h2&gt;

&lt;p&gt;The important part of this project is not simply storing articles in Sanity.&lt;/p&gt;

&lt;p&gt;The investigation would not work the same way if the content were stored only as large blocks of text.&lt;/p&gt;

&lt;p&gt;ATLAS needs to understand relationships such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who made the claim?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What exactly was claimed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which source supports it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which entity does the claim refer to?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does another source make a conflicting claim?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When was each claim valid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is where structured content becomes important.&lt;/p&gt;

&lt;p&gt;Sanity provides the foundation for modeling this information as interconnected documents that the agent can query and reason over.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local Fallback
&lt;/h2&gt;

&lt;p&gt;ATLAS also includes a local corpus fallback.&lt;/p&gt;

&lt;p&gt;If Sanity credentials are not available, the application can run against a local corpus that mirrors the same document structures.&lt;/p&gt;

&lt;p&gt;The application status endpoint reports whether the system is currently running in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;live&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;local-corpus&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the project easier to test without requiring production credentials.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Project ID:&lt;/strong&gt; &lt;code&gt;hrexnsmi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.sanity.io/organizations/ofyfft9qh/project/hrexnsmi" rel="noopener noreferrer"&gt;https://www.sanity.io/organizations/ofyfft9qh/project/hrexnsmi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document types:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;entity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;source&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relationship&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conflict&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;knowledge_doc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Studio schemas are available in the repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TejasRawool186/Atlas/tree/master/sanity-studio/schemaTypes" rel="noopener noreferrer"&gt;https://github.com/TejasRawool186/Atlas/tree/master/sanity-studio/schemaTypes&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Wanted to Explore
&lt;/h2&gt;

&lt;p&gt;The broader idea behind ATLAS is that AI systems are becoming very good at generating answers.&lt;/p&gt;

&lt;p&gt;The next challenge is making those answers &lt;strong&gt;auditable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For many applications, the question should not be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can the AI answer this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can the AI show me exactly why I should believe this answer?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the direction I explored with ATLAS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured content gives the agent something it can reason over.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence graphs make the reasoning inspectable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adversarial probes challenge the result.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cryptographic certificates make the investigation tamper-evident.&lt;/strong&gt;&lt;/p&gt;


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

&lt;p&gt;At a high level, ATLAS follows this architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    REAL-WORLD CONTENT
                           |
                           v
                    CONTENT INGESTION
                           |
                           v
                  GEMINI EXTRACTION
                           |
                           v
                  SANITY CONTENT LAKE
                           |
          +----------------+----------------+
          |                |                |
          v                v                v
       ENTITIES         CLAIMS         RELATIONSHIPS
          |                |                |
          +----------------+----------------+
                           |
                           v
                  INVESTIGATION AGENT
                           |
          +----------------+----------------+
          |                |                |
          v                v                v
     CONFLICT        SOURCE AUTHORITY    RECENCY
     DETECTION           RULES           ANALYSIS
          |                |                |
          +----------------+----------------+
                           |
                           v
                    EPISTEMIC VERDICT
                           |
             +-------------+-------------+
             |             |             |
             v             v             v
        EVIDENCE        AUDIT       CERTIFICATE
          GRAPH         PROBES       GENERATION
             |             |             |
             +-------------+-------------+
                           |
                           v
                  INSPECTABLE RESULT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Project Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/TejasRawool186/Atlas" rel="noopener noreferrer"&gt;https://github.com/TejasRawool186/Atlas&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Sanity Project:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.sanity.io/organizations/ofyfft9qh/project/hrexnsmi" rel="noopener noreferrer"&gt;https://www.sanity.io/organizations/ofyfft9qh/project/hrexnsmi&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;An agent session can be added here after uploading the relevant transcript through the DEV Agent Sessions uploader.&lt;/p&gt;




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

&lt;p&gt;ATLAS started with a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if an AI answer came with an investigation instead of just a response?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question led to a system where content becomes structured knowledge, claims become first-class objects, sources retain provenance, contradictions become explicit, answers are adversarially tested, and the final evidence can be cryptographically verified.&lt;/p&gt;

&lt;p&gt;The goal is not to make AI sound more confident.&lt;/p&gt;

&lt;p&gt;The goal is to make AI &lt;strong&gt;more inspectable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't just trust the answer. Inspect the evidence.&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Sun, 07 Jun 2026 18:08:13 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/-4886</link>
      <guid>https://dev.to/tejasrawool186/-4886</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93" class="crayons-story__hidden-navigation-link"&gt;FlashChat - From an Abandoned Prototype to a Secure, End-to-End Encrypted Communication Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;GitHub “Finish-Up-A-Thon” Challenge Submission&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/tejasrawool186" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3755019%2F0e3f4a9c-5c48-49c8-8bf8-c15f94432a39.png" alt="tejasrawool186 profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/tejasrawool186" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Tejas Rawool
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Tejas Rawool
                
                
              
              &lt;div id="story-author-preview-content-3842537" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/tejasrawool186" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3755019%2F0e3f4a9c-5c48-49c8-8bf8-c15f94432a39.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Tejas Rawool&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 7&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93" id="article-link-3842537"&gt;
          FlashChat - From an Abandoned Prototype to a Secure, End-to-End Encrypted Communication Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>FlashChat - From an Abandoned Prototype to a Secure, End-to-End Encrypted Communication Platform</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Sun, 07 Jun 2026 18:04:54 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93</link>
      <guid>https://dev.to/tejasrawool186/flashchat-from-an-abandoned-prototype-to-a-secure-end-to-end-encrypted-communication-platform-4d93</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;FlashChat is a privacy-first, zero-login, temporary messaging and file-sharing portal. It is designed to be a secure, zero-config workspace for developers and teams who need to share code snippets, files, and links in absolute privacy. &lt;/p&gt;

&lt;p&gt;Under the hood, all communication is fully encrypted client-side using the browser's native &lt;strong&gt;Web Crypto API (AES-GCM-256)&lt;/strong&gt;, meaning plaintext never touches the database or server logs. Rooms are generated dynamically with secure alphanumeric codes and disappear automatically after 30 minutes of inactivity. It also features a secure local AI assistant, typing indicators, iMessage-style reactions, quote replies, and live file chunk streaming.&lt;/p&gt;




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

&lt;p&gt;Here are the live links to the production application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Frontend (Vercel)&lt;/strong&gt;: &lt;a href="https://flashchat-blush.vercel.app/" rel="noopener noreferrer"&gt;https://flashchat-blush.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt;: &lt;a href="https://github.com/TejasRawool186/flashchat" rel="noopener noreferrer"&gt;https://github.com/TejasRawool186/flashchat&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📸 Application Screenshots
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Elegant Landing Page &amp;amp; Setup
&lt;/h4&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%2Fygnvh6murr29tesxxkn5.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%2Fygnvh6murr29tesxxkn5.png" alt="Landing Page Hero" width="800" height="442"&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%2F3ivle0ski536l4nwk8bb.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%2F3ivle0ski536l4nwk8bb.png" alt="Landing Page Features" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Secure Chat Interface (Desktop)
&lt;/h4&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%2F53eik3n6l1bkis7gqnug.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%2F53eik3n6l1bkis7gqnug.png" alt="Desktop Chat View" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Highly Responsive Mobile Views (iOS &amp;amp; Android)
&lt;/h4&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%2F0k77a8wdby8s2x3q5o4m.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%2F0k77a8wdby8s2x3q5o4m.png" alt="Mobile iOS View" width="504" height="1024"&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%2Fvurtnetdulwe4keu526m.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%2Fvurtnetdulwe4keu526m.png" alt="Mobile Android View" width="470" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Where We Started (The Abandoned Code)
&lt;/h3&gt;

&lt;p&gt;The project started as a raw, single-file JavaScript prototype. It was an abandoned monolithic &lt;code&gt;App.jsx&lt;/code&gt; file (over 800 lines of spaghetti code) containing mixed logic for Socket.IO events, file chunking, UI components, and state management. The code was prone to runtime errors, vulnerable to XSS attacks, completely lacked mobile responsiveness, and offered zero data encryption.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Changed, Fixed, and Added
&lt;/h3&gt;

&lt;p&gt;To turn this prototype into a production-grade secure application, I executed a complete overhaul:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decomposed Architecture&lt;/strong&gt;: Split the monolithic &lt;code&gt;App.jsx&lt;/code&gt; into &lt;strong&gt;17 clean React + TypeScript modules&lt;/strong&gt; with strict type safety.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-End Cryptography&lt;/strong&gt;: Integrated client-side &lt;strong&gt;ECDH/PBKDF2&lt;/strong&gt; key derivation from the alphanumeric room codes, encrypting text messages and shared file chunks using &lt;strong&gt;AES-256-GCM&lt;/strong&gt; before sending them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E2E-Wrapped AI Bot&lt;/strong&gt;: Built an AI Assistant (&lt;code&gt;/ask &amp;lt;prompt&amp;gt;&lt;/code&gt;) that calls Google Gemini AI through backend proxies (to keep keys secure) and returns responses encrypted client-side to the room.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Chat Socials&lt;/strong&gt;: Added quote threads, message reaction badges (👍 ❤️ 😂 😮 😢 🙏), typing notifications, and blue double-check read receipts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Responsiveness&lt;/strong&gt;: Replaced the static layout with an overlay sliding drawer sidebar on mobile, circular compact header buttons, and a responsive emoji picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Hardening&lt;/strong&gt;: Integrated Nginx reverse proxying, rate-limiting middleware, CORS configuration, Helmet CSP headers, and SSRF scrapers.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;As a developer, rewriting legacy code and implementing complex cryptography can feel overwhelming. GitHub Copilot acted as a 24/7 pair programmer, speeding up my workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript Migration&lt;/strong&gt;: Copilot analyzed the 800-line prototype and generated clean React prop interfaces and hooks. It predicted correct React event types (such as &lt;code&gt;React.DragEvent&lt;/code&gt; and &lt;code&gt;HTMLTextAreaElement&lt;/code&gt;), saving me dozens of compilation check cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographic Implementation&lt;/strong&gt;: Writing Web Crypto pipelines involves dense parameters. Copilot suggested correct iteration counts for PBKDF2, initialization vector (IV) structures, and helped design key import/export methods in &lt;code&gt;crypto.ts&lt;/code&gt; without needing to constantly check MDN documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout and Flexbox Debugging&lt;/strong&gt;: When sent message bubbles clipped off-screen on mobile viewports, Copilot identified that the flex layout was expanding beyond its bounds. It suggested adding &lt;code&gt;min-width: 0;&lt;/code&gt; and &lt;code&gt;overflow: hidden;&lt;/code&gt; to the &lt;code&gt;.chat-main&lt;/code&gt; wrapper—resolving the horizontal layout overflow instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSRF Protections&lt;/strong&gt;: Copilot helped write robust security checks inside the Link Preview scraper to verify that outgoing requests do not target private IP subnets on our VPS.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🌐 Breaking Language Barriers: Building a Real-Time Multilingual Chat App with Next.js &amp; Lingo.Dev</title>
      <dc:creator>Tejas Rawool</dc:creator>
      <pubDate>Thu, 05 Feb 2026 18:33:09 +0000</pubDate>
      <link>https://dev.to/tejasrawool186/breaking-language-barriers-building-a-real-time-multilingual-chat-app-with-nextjs-lingodev-4n9l</link>
      <guid>https://dev.to/tejasrawool186/breaking-language-barriers-building-a-real-time-multilingual-chat-app-with-nextjs-lingodev-4n9l</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb3k9c6xzr557z2rwqqp.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%2Fwb3k9c6xzr557z2rwqqp.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Communication is the foundation of every online community. But the moment people from different countries join the same space, one invisible problem shows up fast: &lt;strong&gt;language&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You might be comfortable chatting in English, while someone else prefers Hindi, Spanish, or Japanese. Most chat apps assume everyone will “figure it out” — but in reality, that often leads to confusion, hesitation, or people staying silent.&lt;/p&gt;

&lt;p&gt;I wanted to fix that. &lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;FlowTalk&lt;/strong&gt;, a real-time multilingual chat application where users can write in their own language and instantly read messages in theirs — without breaking the flow of conversation.&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk through how I built it, the unexpected translation problems I ran into, and how I used &lt;strong&gt;Lingo.dev&lt;/strong&gt; to solve them in a clean, scalable way.&lt;/p&gt;




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

&lt;p&gt;I kept the stack modern but practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js 16 (App Router) + React 19
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS v4
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Next.js API routes + MongoDB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time updates:&lt;/strong&gt; Pusher / polling
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation layer:&lt;/strong&gt; Lingo.dev
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing exotic — just tools that work well together.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ High-Level Architecture
&lt;/h2&gt;

&lt;p&gt;The core challenge wasn’t &lt;em&gt;how to translate text&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
It was &lt;strong&gt;how to translate text without slowing down a real-time chat&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s the flow I ended up with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A user sends a message (for example, “Hello everyone”)&lt;/li&gt;
&lt;li&gt;The server receives the message and detects the source language&lt;/li&gt;
&lt;li&gt;A Translation Engine checks if translations already exist (cache first)&lt;/li&gt;
&lt;li&gt;If not cached, it calls Lingo.dev to generate translations&lt;/li&gt;
&lt;li&gt;The message is broadcast to all connected clients&lt;/li&gt;
&lt;li&gt;Each client displays the message in the user’s preferred language&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only &lt;strong&gt;one message&lt;/strong&gt; is sent — translation is treated as &lt;strong&gt;metadata&lt;/strong&gt;, not a new chat message.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 The Real Translation Problems (That No One Mentions)
&lt;/h2&gt;

&lt;p&gt;This is where things got interesting.&lt;/p&gt;

&lt;p&gt;Once real users started testing the app, I discovered problems that don’t show up in simple demos.&lt;/p&gt;


&lt;h3&gt;
  
  
  1. Script ≠ Language (Hinglish Is Real)
&lt;/h3&gt;

&lt;p&gt;One of the most common messages I saw was something like:&lt;/p&gt;

&lt;p&gt;muje aapki help chahiye&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;Hindi&lt;/strong&gt;, but written using &lt;strong&gt;English letters&lt;/strong&gt; (often called Hinglish).&lt;/p&gt;

&lt;p&gt;Most systems either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat it as English (wrong), or&lt;/li&gt;
&lt;li&gt;Don’t translate it at all (also wrong)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So FlowTalk detects &lt;strong&gt;language intent&lt;/strong&gt;, not just the alphabet used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correct result:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I need your help&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Brand Names Should Not Be Translated
&lt;/h3&gt;

&lt;p&gt;Auto-translation loves to translate everything — including things it absolutely shouldn’t.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT
&lt;/li&gt;
&lt;li&gt;Discord
&lt;/li&gt;
&lt;li&gt;React
&lt;/li&gt;
&lt;li&gt;Next.js
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these get translated, the message becomes confusing fast.&lt;/p&gt;

&lt;p&gt;I needed a way to protect &lt;strong&gt;proper nouns and technical terms&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Broken Characters &amp;amp; Formatting Issues
&lt;/h3&gt;

&lt;p&gt;Another subtle issue:&lt;br&gt;&lt;br&gt;
Some platforms and fonts don’t handle all scripts perfectly.&lt;/p&gt;

&lt;p&gt;That can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broken characters
&lt;/li&gt;
&lt;li&gt;Random symbols
&lt;/li&gt;
&lt;li&gt;Numbers appearing where text should be
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To avoid this, I normalized output and ensured &lt;strong&gt;Unicode-safe formatting&lt;/strong&gt; across the pipeline.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 The Heart of FlowTalk: The Translation Engine
&lt;/h2&gt;

&lt;p&gt;At the center of everything is a small but powerful service: &lt;strong&gt;TranslationEngine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of scattering translation logic everywhere, I wrapped it in a single layer that handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Language detection
&lt;/li&gt;
&lt;li&gt;Caching
&lt;/li&gt;
&lt;li&gt;Glossary protection
&lt;/li&gt;
&lt;li&gt;Error handling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a simplified version:&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="c1"&gt;// src/services/TranslationEngine.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LingoDotDevEngine&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lingo.dev/sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TranslationEngine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;lingoEngine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LingoDotDevEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lingoEngine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LingoDotDevEngine&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;apiKey&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="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;translateText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;sourceLang&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;targetLang&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sourceLang&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;targetLang&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="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lingoEngine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;sourceLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sourceLang&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;targetLang&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="nx"&gt;result&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;p&gt;This is where Lingo.dev really shines.&lt;/p&gt;

&lt;p&gt;Instead of simple word replacement, it provides context-aware translation, which makes conversations feel natural rather than robotic.&lt;/p&gt;

&lt;p&gt;Chekout My Repo here: &lt;a href="https://github.com/TejasRawool186/FlowTalk" rel="noopener noreferrer"&gt;https://github.com/TejasRawool186/FlowTalk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;special thanks to &lt;a class="mentioned-user" href="https://dev.to/sumitsaurabh927"&gt;@sumitsaurabh927&lt;/a&gt;   &lt;a class="mentioned-user" href="https://dev.to/maxprilutskiy"&gt;@maxprilutskiy&lt;/a&gt;   for the  continious guidance&lt;/p&gt;

</description>
      <category>lingodotdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
