<?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: Taha Mahmoud Nour El-Dein</title>
    <description>The latest articles on DEV Community by Taha Mahmoud Nour El-Dein (@tmneld).</description>
    <link>https://dev.to/tmneld</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%2F3972911%2Fff7b5bbf-4858-4923-b75d-376bbc3d46f4.png</url>
      <title>DEV Community: Taha Mahmoud Nour El-Dein</title>
      <link>https://dev.to/tmneld</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tmneld"/>
    <language>en</language>
    <item>
      <title>Noversa AI: Real-Time LaTeX Collab + AI PDF Chat + ADHD Focus Tool</title>
      <dc:creator>Taha Mahmoud Nour El-Dein</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:53:39 +0000</pubDate>
      <link>https://dev.to/tmneld/noversa-ai-real-time-latex-collab-ai-pdf-chat-adhd-focus-tool-2027</link>
      <guid>https://dev.to/tmneld/noversa-ai-real-time-latex-collab-ai-pdf-chat-adhd-focus-tool-2027</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I got tired of broken tools. So I built my own.&lt;/strong&gt; 💪&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Noversa AI&lt;/strong&gt; is a platform I've been building for months — not because it's a cool idea on paper, but because I genuinely &lt;em&gt;needed&lt;/em&gt; it. Three AI-powered tools. One account. One real PostgreSQL database. One login. Zero compromises.&lt;/p&gt;

&lt;p&gt;The stack? A &lt;strong&gt;pnpm monorepo&lt;/strong&gt; with TypeScript 5.9, React 18 + Vite on the frontend, Express 5 + Node.js 24 on the backend, Python 3.11 + FastAPI for the AI services, PostgreSQL 16 with Drizzle ORM, and a contract-first API built on OpenAPI 3.1 with Orval codegen generating all the typed clients automatically. Real-time collaboration via &lt;strong&gt;Yjs CRDTs&lt;/strong&gt; over authenticated WebSockets. And a full theming system — dark mode, light mode, six accent colours. Let's get into it. 🧵&lt;/p&gt;




&lt;h3&gt;
  
  
  🎨 Before Anything — It Actually &lt;em&gt;Looks&lt;/em&gt; Right
&lt;/h3&gt;

&lt;p&gt;One thing that matters more than people admit: your app needs to feel comfortable to use for hours at a time.&lt;/p&gt;

&lt;p&gt;Noversa has a full theming system — &lt;strong&gt;Dark Mode&lt;/strong&gt; and &lt;strong&gt;Light Mode&lt;/strong&gt;, plus six accent colour options you pick from your profile:&lt;/p&gt;

&lt;p&gt;🟣 Purple · 🔵 Blue · 🦚 Teal · 🌹 Rose · 🟡 Amber · 🟢 Green&lt;/p&gt;

&lt;p&gt;Not just a CSS variable swap — the accent cascades through buttons, active states, focus rings, and chart colours across all three modules. Because if someone is using Noversa CalmFlow for hours to manage their ADHD, the interface needs to feel &lt;em&gt;theirs&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔐 One Account. Three Tools. Real Database.
&lt;/h3&gt;

&lt;p&gt;Every module — Noversa Chat, LaTeX, and Noversa CalmFlow — shares a &lt;strong&gt;single unified authentication system&lt;/strong&gt;. Register once, log in once, and all three tools know who you are.&lt;/p&gt;

&lt;p&gt;Under the hood: &lt;code&gt;express-session&lt;/code&gt; with a &lt;strong&gt;PostgreSQL session store&lt;/strong&gt; (&lt;code&gt;connect-pg-simple&lt;/code&gt;), passwords hashed with &lt;strong&gt;bcrypt at 12 rounds&lt;/strong&gt;, cookies set as &lt;code&gt;httpOnly&lt;/code&gt; + &lt;code&gt;sameSite=lax&lt;/code&gt; and HMAC-signed with &lt;code&gt;SESSION_SECRET&lt;/code&gt;. The Python FastAPI backend for Noversa CalmFlow reads and verifies the same &lt;code&gt;noversa.sid&lt;/code&gt; cookie — no duplicate auth, no separate login, no confusion.&lt;/p&gt;

&lt;p&gt;Your files, conversations, LaTeX documents, tasks, and preferences are all stored in &lt;strong&gt;PostgreSQL 16&lt;/strong&gt; with a proper relational schema — users, files, jobs, conversations, messages, latex_documents, org_memberships, teams, sessions. Not localStorage. Not JSON files. A real database with real data.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Noversa Chat — Because online PDF tools are a privacy nightmare
&lt;/h3&gt;

&lt;p&gt;If you work with important documents — research papers, contracts, thesis drafts — you know this cycle 😩:&lt;/p&gt;

&lt;p&gt;You need to merge two PDFs → upload to random website. Need OCR on a scanned file → different website. Need to extract pages 5–12 and add a watermark → &lt;em&gt;another&lt;/em&gt; website. Every single time trusting strangers with your private data, with no idea what they keep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That stops here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Noversa Chat is a conversational AI (GPT-5.2) that handles all of it in one chat thread, on your own account. Type what you need in plain English:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Merge these three files, extract pages 4–10 from the result, and protect it with a password"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI reads your intent using a structured 25-tool decision table built into its system prompt, produces a &lt;code&gt;[TOOL_READY]&lt;/code&gt; instruction block, and the backend dispatches the job through a &lt;strong&gt;PostgreSQL-backed async queue&lt;/strong&gt;. Status updates stream back in real-time via &lt;strong&gt;Server-Sent Events&lt;/strong&gt; — no polling, no spinners, no guessing. 🪄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it can do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📄 Merge, split, compress, rotate PDFs&lt;/li&gt;
&lt;li&gt;🔐 Add or remove password protection&lt;/li&gt;
&lt;li&gt;🔖 Watermark, add page numbers, extract or delete specific pages&lt;/li&gt;
&lt;li&gt;🔍 OCR — extract text from scanned files and images (Tesseract)&lt;/li&gt;
&lt;li&gt;📊 Convert Word, Excel, PowerPoint → PDF (LibreOffice headless)&lt;/li&gt;
&lt;li&gt;🌐 HTML → PDF with full CSS support (Chromium headless)&lt;/li&gt;
&lt;li&gt;💬 Persistent conversation history with inline file cards&lt;/li&gt;
&lt;li&gt;🗂️ File manager with tags, folders, full-text search (GIN index on PostgreSQL)&lt;/li&gt;
&lt;li&gt;🔗 Shareable file links with optional password and expiry&lt;/li&gt;
&lt;li&gt;👥 Team workspaces with role-based access (Owner / Admin / Editor / Viewer)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All processed on &lt;strong&gt;your account&lt;/strong&gt;. No random websites. No privacy risks. 🛡️&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Noversa LaTeX — The equation export that &lt;em&gt;actually works&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Here's a problem nobody talks about enough: &lt;strong&gt;equations&lt;/strong&gt; 😤&lt;/p&gt;

&lt;p&gt;Write your thesis in LaTeX. Try to share it with your supervisor who uses Word. Your equations break. Copy-paste LaTeX into Word — garbage. Every AI tool I tested either hallucinated the output, produced broken MathML, or gave up entirely.&lt;/p&gt;

&lt;p&gt;I built the pipeline that actually works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LaTeX source
    → MathML  (via MathJax)
    → OMML    (custom XSLT transformer)
    → .docx   (correct equations in Word ✅)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OMML&lt;/strong&gt; (Office Math Markup Language) is the native equation format inside &lt;code&gt;.docx&lt;/code&gt; files. The equations open correctly in Word 2019, Word 2021, and Word Online. Not approximated. Not broken. &lt;strong&gt;Correct.&lt;/strong&gt; This took weeks to get right and I haven't seen another AI tool do it properly.&lt;/p&gt;

&lt;p&gt;The editor itself is &lt;strong&gt;Monaco&lt;/strong&gt; (VS Code's engine) in the browser with full LaTeX syntax highlighting and live KaTeX equation preview. But the real magic is &lt;strong&gt;real-time collaboration&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🤝 &lt;strong&gt;Yjs CRDT&lt;/strong&gt; — Multiple authors editing the same LaTeX document simultaneously. No conflicts. No overwrites. No locks. Convergence is mathematically guaranteed.&lt;/p&gt;

&lt;p&gt;The WebSocket server does it properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On connect&lt;/strong&gt; → loads binary CRDT state from PostgreSQL, sends Sync Step 1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On update&lt;/strong&gt; → applies change, broadcasts to all peers, debounces a DB write (2 000ms)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Awareness&lt;/strong&gt; → broadcasts cursor positions and user presence in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth&lt;/strong&gt; → verifies the &lt;code&gt;noversa.sid&lt;/code&gt; cookie with &lt;code&gt;crypto.timingSafeEqual&lt;/code&gt; before any upgrade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your document is always there. Always in sync. Always safe. 🔄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📑 Templates — Article, IEEE paper, technical report, Beamer presentation&lt;/li&gt;
&lt;li&gt;📤 Export — PDF, DOCX with correct equations, ZIP (source + compiled PDF)&lt;/li&gt;
&lt;li&gt;🕐 Version history — snapshot and restore&lt;/li&gt;
&lt;li&gt;🔗 Share links — read-only or edit-access per document&lt;/li&gt;
&lt;li&gt;🤖 AI LaTeX assistant — generate equations from plain English, debug compiler errors&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 Noversa CalmFlow — An AI that actually cares about you
&lt;/h3&gt;

&lt;p&gt;ChatGPT is powerful. But it doesn't &lt;em&gt;care&lt;/em&gt; about you. It answers questions and moves on. It won't notice if you're overwhelmed, if you've been staring at the same task for an hour unable to start, or if your brain doesn't work the way most productivity apps assume. 💙&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CalmFlow is different.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's built specifically for people with &lt;strong&gt;ADHD&lt;/strong&gt;, people under work pressure, people who have real goals but struggle to break them into something they can act on today.&lt;/p&gt;

&lt;p&gt;The core is &lt;strong&gt;CalmFlow&lt;/strong&gt; — an AI companion (Azure OpenAI GPT-4o) with a 12-block system prompt engineered for empathy, calm, and practical scaffolding. You don't ask CalmFlow "write me an essay." You tell CalmFlow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I have a thesis due in 3 weeks and I have no idea where to start"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And CalmFlow breaks it into real, concrete daily steps. Schedules them based on how much time you actually have. Checks in with you. And does all of this in a way that feels like talking to someone who actually gets it.&lt;/p&gt;

&lt;p&gt;CalmFlow even &lt;strong&gt;triggers real UI actions&lt;/strong&gt; from the conversation — via the &lt;code&gt;###ACTIONS&lt;/code&gt; protocol, blocks embedded in natural language responses that the frontend parses to create tasks, start timers, and open documents. No JSON schemas. No function-call gymnastics. Just natural language that &lt;em&gt;does things&lt;/em&gt;. 🎯&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything else CalmFlow does:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📖 &lt;strong&gt;Bionic Reading&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Bolds word roots to guide eye movement. Research-backed for dyslexia + ADHD. 3 intensity levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔊 &lt;strong&gt;Multilingual TTS&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Azure Speech reads your documents — Arabic 🇸🇦, English 🇺🇸, French 🇫🇷, Spanish 🇪🇸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 &lt;strong&gt;Smart Planner&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Greedy scheduler: given your free hours, picks the optimal tasks by priority + time budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏱️ &lt;strong&gt;Pomodoro Timer&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Focus sessions with history, daily goals, motivational feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📄 &lt;strong&gt;Document Intelligence&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Azure AI parses dense PDFs preserving structure, then applies Bionic Reading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ &lt;strong&gt;Content Safety&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Detects overwhelming language — returns HTTP 200 with a calm alternative. Never a red error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last one matters: a user with anxiety uploading a stressful document should never see a sudden alarming error popup. The app returns a softened response instead. Always calm. Always safe. 🌿&lt;/p&gt;




&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tmneld/Noversa-AI" rel="noopener noreferrer"&gt;github.com/tmneld/Noversa-AI&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;🌐 &lt;strong&gt;&lt;a href="https://noversa-ai.replit.app/" rel="noopener noreferrer"&gt;https://noversa-ai.replit.app/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔐 &lt;strong&gt;Try it with this test account — no signup needed:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Email:    taha@def.to
Password: 10020033
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;💡 &lt;em&gt;Go to Chat → upload any PDF → ask the AI to process it.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Or open CalmFlow → tell CalmFlow what you're trying to accomplish this week.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Or open LaTeX → start a document with a teammate in real time.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




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

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

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

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

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

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

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

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

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

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

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

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

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qkzy412uw5x5vlxpo5m.png" alt=" " width="799" height="393"&gt;
&lt;/h2&gt;

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

&lt;p&gt;This project has been &lt;em&gt;"almost done"&lt;/em&gt; for months. 😅&lt;/p&gt;

&lt;p&gt;Every time I opened it I'd fix one thing, find three more, get frustrated, and close it. Classic abandoned side project energy. Here's the honest before and after.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⛔ Before — what was broken
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🔴 The LaTeX collaboration was silently failing.&lt;/strong&gt;&lt;br&gt;
Two people editing the same document would overwrite each other with no warning and no recovery. The Yjs sync protocol was partially implemented — Steps 1/2 were wrong, awareness was missing, CRDT state wasn't persisted. A browser refresh meant losing everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 The equation export was a fake button.&lt;/strong&gt;&lt;br&gt;
The UI had an "Export to Word" button. Clicking it downloaded a &lt;code&gt;.docx&lt;/code&gt; where every equation was either missing or shown as raw LaTeX source text. The pipeline didn't exist. I had just... not built it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 The AI chat had a fragile brain.&lt;/strong&gt;&lt;br&gt;
GPT-5.2 was returning structured JSON for tool invocation. When the model was even slightly off — a missing bracket, an extra field — the job dispatcher crashed with an unhandled parse error. No fallback. Just a broken session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 Three apps pretending to be one platform.&lt;/strong&gt;&lt;br&gt;
Noversa Chat, LaTeX, and CalmFlow each had their own session logic, their own auth middleware, their own idea of who the user was. Log into Chat → CalmFlow didn't know you existed. No shared identity. No shared state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 The theme system was hardcoded.&lt;/strong&gt;&lt;br&gt;
Dark mode existed as a toggle. The accent colours were picked and forgotten in a config file. There was no user preference persistence, no profile setting, no way to change it without editing the source code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 The app was alarming its most vulnerable users.&lt;/strong&gt;&lt;br&gt;
CalmFlow's content safety checks returned HTTP 4xx errors on flagged content. A user with anxiety uploading a stressful document would get a sudden red error state. The exact users this app was designed to protect were being hurt by its error handling.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ After — what I finished
&lt;/h3&gt;

&lt;p&gt;🔧 &lt;strong&gt;Rewrote the Yjs WebSocket server from scratch.&lt;/strong&gt;&lt;br&gt;
Proper Step 1/2 sync handshake. Binary CRDT state persisted to PostgreSQL with a 2-second debounced write. Awareness protocol for real cursor presence. Manual HMAC cookie verification with &lt;code&gt;crypto.timingSafeEqual&lt;/code&gt; before any WebSocket upgrade. Collaboration that actually works. 🤝&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Built the OMML equation export pipeline.&lt;/strong&gt;&lt;br&gt;
LaTeX → MathML → OMML via a custom XSLT transformer. Tested against Word 2019, 2021, and Online. Equations render correctly in all three. This is the feature I'm most proud of — and as far as I've seen, no other AI tool does this right. ✅&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Replaced JSON function-calling with the &lt;code&gt;[TOOL_READY]&lt;/code&gt; text protocol.&lt;/strong&gt;&lt;br&gt;
The AI embeds a structured plain-text block in its response. The parser extracts it with regex, validates it, and dispatches the job. If the model is imprecise, the parser degrades gracefully. No more crashes from a missing bracket. 🪄&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Unified auth across the entire platform.&lt;/strong&gt;&lt;br&gt;
CalmFlow's Python FastAPI backend now reads and verifies the same &lt;code&gt;noversa.sid&lt;/code&gt; cookie as the Node.js API — decoding the HMAC signature and querying the shared PostgreSQL session table. One account. One cookie. Three modules. One real database. 🔐&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Built the full theme system.&lt;/strong&gt;&lt;br&gt;
Dark mode, light mode, and six accent colours (Purple, Blue, Teal, Rose, Amber, Green) persisted to the database per user. Cascade through buttons, active states, focus rings, and all UI chrome across all three modules. 🎨&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Flipped the content safety error model.&lt;/strong&gt;&lt;br&gt;
Flagged content now returns HTTP 200 with a softened, calm alternative — never an alarming error state. One architectural decision that completely changes the experience for the users who need it most. 🌿&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Set up OpenAPI 3.1 contract-first development.&lt;/strong&gt;&lt;br&gt;
Full API defined in YAML. Orval codegen generates TanStack Query hooks and Zod validation schemas automatically. No more client/server type drift. No more hand-maintaining two versions of the same interface. ⚡&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Wrote documentation that actually explains the project.&lt;/strong&gt;&lt;br&gt;
Architecture diagrams in Mermaid, full ER schema, security model, API reference. The README that makes a project feel real and finished.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The before:&lt;/strong&gt; three half-working modules with disconnected plumbing, broken collaboration, and a fake export button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The after:&lt;/strong&gt; one platform with unified auth, real-time collaboration that works, equations that export correctly, and a content safety model that protects its users. 🎉&lt;/p&gt;




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

&lt;p&gt;The hardest thing about finishing an old project isn't building new features. It's re-entering code you wrote six months ago, understanding what it was supposed to do, and having the confidence to actually change it — without losing momentum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot fixed that for me.&lt;/strong&gt; 🤖&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔬 The Yjs WebSocket rewrite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The y-protocols sync handshake (Step 1/2) is not obvious from the documentation. I pasted my broken server code into Copilot Chat and asked what was wrong. It identified that I was skipping the state vector exchange, suggested the correct broadcast order, and surfaced &lt;code&gt;crypto.timingSafeEqual&lt;/code&gt; for the cookie verification — a security detail I would have missed and that genuinely matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔬 The OMML equation export&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;XSLT transformation from MathML to OMML is genuinely obscure. The spec is dense, the edge cases are many, and Node.js documentation for this is almost nonexistent. Copilot completed large sections of the XSLT transformer correctly on the first suggestion — not just syntactically, but semantically, producing output that matched the OMML spec and rendered correctly in Word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔬 The &lt;code&gt;###ACTIONS&lt;/code&gt; parser&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building the protocol parser for CalmFlow — regex extraction, type dispatch, frontend state updates — would have been a tedious afternoon of trial and error. With Copilot it was a focused 45-minute session. It handled edge cases I hadn't considered and flagged that I needed to handle multiple action blocks in a single response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔬 The OpenAPI codegen configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configuring Orval to generate both React Query hooks &lt;em&gt;and&lt;/em&gt; Zod schemas from the same spec, with the right output paths for a pnpm monorepo, is not well-documented. Copilot surfaced the correct &lt;code&gt;orval.config.ts&lt;/code&gt; patterns and helped debug the barrel export mismatches that were breaking the generated types.&lt;/p&gt;




&lt;p&gt;The biggest shift: I started using Copilot not just for completion, but for &lt;strong&gt;codebase re-familiarization&lt;/strong&gt; — paste a function, ask what it does, understand it, modify it with confidence. That's what turned months of &lt;em&gt;"I should really finish this"&lt;/em&gt; into a shipped product. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for researchers, students, and everyone who's been told the tools they need just don't exist yet.&lt;/em&gt; 🎓✨&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
