<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dev Path</title>
    <description>Sharing My Development Journey</description>
    <link>https://minhmannh2001.github.io</link>
    <atom:link href="https://minhmannh2001.github.io/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Build DBDB from scratch — Part 0: Before writing a single line of database logic</title>
        <description>
          
          Building DBDB from Scratch — Part 0 I have a confession: the first thing I did when starting this project was not write a database. I wrote a test that checks whether I can import an empty Python package. Then I made it pass. Then I committed. That sounds absurd....
        </description>
        <pubDate>Tue, 21 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/21/build-dbdb-from-scratch-part-0-project-setup-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/21/build-dbdb-from-scratch-part-0-project-setup-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 10: WebContainer — running a Vite dev server in the browser tab</title>
        <description>
          
          What’s in this post? WebContainer is the most unusual piece of this stack. It runs a real Node.js process—with npm, Vite, file system, network—entirely inside the browser tab, using WebAssembly. No server-side sandboxing. No Docker. No ephemeral cloud VMs. Making it work in a Next.js app requires solving three problems...
        </description>
        <pubDate>Sat, 18 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/18/build-your-own-app-builder-part-10-webcontainer-preview-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/18/build-your-own-app-builder-part-10-webcontainer-preview-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 9: Rendering code that is still being written, and seeing what you sent the model</title>
        <description>
          
          What’s in this post? Two UX problems remain after Part 8: Streaming code blocks — while the model is mid-reply, a file fence is open (no closing ` ``` `). Naively displaying raw markdown shows the user raw backticks and a path token. Context opacity — when debugging “why did...
        </description>
        <pubDate>Fri, 17 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/17/build-your-own-app-builder-part-9-chat-ui-and-ai-context-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/17/build-your-own-app-builder-part-9-chat-ui-and-ai-context-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 8: The sync problem — drafts, the 250 ms race, and &quot;Updated&quot; badges that do not lie</title>
        <description>
          
          What’s in this post? This is the most complex coordination problem in the app. You have three concurrent writers: The user — typing in the editor, unsaved. The AI — applyParsedFilesToProject committing a transaction after the stream ends. router.refresh() — reloading server props (new workbenchFiles) into the client component tree....
        </description>
        <pubDate>Thu, 16 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/16/build-your-own-app-builder-part-8-editor-state-and-sync-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/16/build-your-own-app-builder-part-8-editor-state-and-sync-en.html</guid>
      </item>
    
      <item>
        <title>Lab 3D khóa MIT 6.5840: Xây dựng thuật toán đồng thuận Raft - Phần 4: Log Compaction và Snapshot</title>
        <description>
          
          Ở các bài trước (Lab 3B và 3C), chúng ta đã xây dựng cơ chế sao chép log và persistence. Cluster Raft giờ có thể commit entries, crash và khôi phục đúng trạng thái. Tuy nhiên, vẫn còn một vấn đề nghiêm trọng: log chỉ tăng, không bao giờ giảm....
        </description>
        <pubDate>Wed, 15 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/15/mit-6.5840-distributed-systems-lab-3-part-3d-vi.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/15/mit-6.5840-distributed-systems-lab-3-part-3d-vi.html</guid>
      </item>
    
      <item>
        <title>MIT 6.5840 Lab 3D: Building Raft Consensus — Part 4: Log Compaction and Snapshots</title>
        <description>
          
          In the previous posts (Labs 3B and 3C), we built log replication and persistence. The Raft cluster can now commit entries, survive crashes, and recover to the correct state. But one serious problem remains: the log only grows, never shrinks. In a service running continuously for years, the log can...
        </description>
        <pubDate>Wed, 15 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/15/mit-6.5840-distributed-systems-lab-3-part-3d-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/15/mit-6.5840-distributed-systems-lab-3-part-3d-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 7: File tree UI, REST API with shared validation, and CodeMirror without SSR</title>
        <description>
          
          What’s in this post? The workbench is where the user reads and edits files while the AI works. Building it correctly requires three independent decisions: Server Component loading — load FileEntry rows as a prop, not via a client-side fetch, so the page is ready on first render. REST API...
        </description>
        <pubDate>Wed, 15 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/15/build-your-own-app-builder-part-7-file-tree-and-file-api-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/15/build-your-own-app-builder-part-7-file-tree-and-file-api-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 6: Context engineering — what the model knows when it edits</title>
        <description>
          
          What’s in this post? Context engineering is the practice of deciding what to put in the model’s context window when you cannot fit everything. This post builds the workspace snapshot system: The selection problem — you cannot send all files; you need a principled algorithm. selectFilesForWorkspaceSnapshot — spine files first,...
        </description>
        <pubDate>Tue, 14 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/14/build-your-own-app-builder-part-6-workspace-snapshot-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/14/build-your-own-app-builder-part-6-workspace-snapshot-en.html</guid>
      </item>
    
      <item>
        <title>Lab 3C khóa MIT 6.5840: Xây dựng thuật toán đồng thuận Raft - Phần 3: Persistence và các lỗi ẩn dưới mạng nhiễu</title>
        <description>
          
          Ở bài trước (Lab 3B), chúng ta đã hoàn thiện cơ chế sao chép log: leader nhận lệnh, phân phối sang follower, đếm quorum, commit và apply vào state machine. Cluster giờ đây hoạt động đúng — miễn là không có server nào crash. Nhưng crash là điều không thể...
        </description>
        <pubDate>Mon, 13 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/13/mit-6.5840-distributed-systems-lab-3-part-3c-vi.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/13/mit-6.5840-distributed-systems-lab-3-part-3c-vi.html</guid>
      </item>
    
      <item>
        <title>MIT 6.5840 Lab 3C: Building Raft Consensus — Part 3: Persistence and Hidden Bugs Under Network Chaos</title>
        <description>
          
          In the previous post (Lab 3B), we completed the log replication mechanism: the leader accepts commands, distributes them to followers, counts the quorum, commits, and applies entries to the state machine. The cluster now works correctly — as long as no server crashes. But crashes are unavoidable in any real...
        </description>
        <pubDate>Mon, 13 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/13/mit-6.5840-distributed-systems-lab-3-part-3c-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/13/mit-6.5840-distributed-systems-lab-3-part-3c-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 5: Parsing LLM output into database rows, safely</title>
        <description>
          
          What’s in this post? applyAssistantFileChangesFromText was called in Part 4 but not implemented. This part fills it in. The pipeline has four pieces, each solving a distinct problem: parseAssistantFileBlocks — line-by-line scanner that handles mixed prose and open fences during streaming. normalizeProjectPath — path sanitizer that rejects traversal and Windows...
        </description>
        <pubDate>Mon, 13 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/13/build-your-own-app-builder-part-5-parser-and-database-apply-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/13/build-your-own-app-builder-part-5-parser-and-database-apply-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 4: Streaming end to end — SSE, tee(), and concurrent persistence</title>
        <description>
          
          What’s in this post? The streaming implementation has one non-obvious core problem: you cannot read an HTTP response body twice. This post solves it with ReadableStream.prototype.tee() and builds everything around that solution: The route pipeline — validate → save user message → build payload → fetch upstream → tee() →...
        </description>
        <pubDate>Sun, 12 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/12/build-your-own-app-builder-part-4-streaming-chat-endpoint-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/12/build-your-own-app-builder-part-4-streaming-chat-endpoint-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 3: The LLM contract — system prompt, Message model, and history trimming</title>
        <description>
          
          What’s in this post? The system prompt and the file parser are two halves of a contract. Change one without the other and the pipeline silently produces garbage. This post builds everything that feeds into that contract: Message model — storing chat turns per project. parseChatPostBody — validating JSON input...
        </description>
        <pubDate>Sat, 11 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/11/build-your-own-app-builder-part-3-message-model-and-prompt-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/11/build-your-own-app-builder-part-3-message-model-and-prompt-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 2: Files as source of truth, atomic project creation, and template seeding</title>
        <description>
          
          What’s in this post? The core design decision of this project is that SQLite is the source of truth for project files—not the local filesystem, not model memory, not browser state. Everything else is a view of that data. This post explains the design and builds it: Why FileEntry —...
        </description>
        <pubDate>Fri, 10 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/10/build-your-own-app-builder-part-2-data-and-template-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/10/build-your-own-app-builder-part-2-data-and-template-en.html</guid>
      </item>
    
      <item>
        <title>Build your own X: A minimal AI app builder — Part 1: What you are really building (and why the obvious approach breaks)</title>
        <description>
          
          About this series Build your own X: A minimal AI app builder is a 10-part tutorial. By the end you have a working Next.js application where you chat with an LLM, it edits files stored in SQLite, and you preview the running app inside your browser tab using WebContainer—no server-side...
        </description>
        <pubDate>Thu, 09 Apr 2026 12:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/09/build-your-own-app-builder-part-1-intro-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/09/build-your-own-app-builder-part-1-intro-en.html</guid>
      </item>
    
      <item>
        <title>Hệ thống mạng giả lập trong MIT 6.5840: Xây dựng labrpc từ đầu</title>
        <description>
          
          Khi làm lab Raft trong MIT 6.5840, có một câu hỏi khá thực tế nảy ra ngay từ đầu: test một thuật toán phân tán như thế nào? Không thể mỗi lần chạy test lại phải khởi động 5 máy chủ thật, cắm mạng, rồi chờ chúng trao đổi với...
        </description>
        <pubDate>Tue, 07 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-labrpc-vi.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-labrpc-vi.html</guid>
      </item>
    
      <item>
        <title>MIT 6.5840 Simulated Network: Building labrpc from Scratch</title>
        <description>
          
          When you work through the Raft labs in MIT 6.5840, a practical question shows up immediately: how do you test a distributed algorithm? You cannot boot five real servers, wire the network, and wait for them to talk on every test run. You need a way to simulate the whole...
        </description>
        <pubDate>Tue, 07 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-labrpc-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-labrpc-en.html</guid>
      </item>
    
      <item>
        <title>Lab 3B khóa MIT 6.5840: Xây dựng thuật toán đồng thuận Raft - Phần 2: Sao chép Log</title>
        <description>
          
          Ở bài trước (Lab 3A), chúng ta đã xây dựng xong cơ chế bầu cử leader trong Raft. Cluster giờ đây có thể chọn ra một leader duy nhất, phát hiện và xử lý các tình huống leader crash, và duy trì quyền lực qua heartbeat. Nhưng có một vấn...
        </description>
        <pubDate>Tue, 07 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-lab-3-part-3b-vi.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-lab-3-part-3b-vi.html</guid>
      </item>
    
      <item>
        <title>MIT 6.5840 Lab 3B: Building Raft Consensus — Part 2: Log Replication</title>
        <description>
          
          In the previous post (Lab 3A), we built Raft’s leader election mechanism. The cluster can now elect a single leader, detect and recover from leader crashes, and maintain authority through heartbeats. But there is a catch: the newly elected leader cannot actually do anything yet. If a client sends a...
        </description>
        <pubDate>Tue, 07 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-lab-3-part-3b-en.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/07/mit-6.5840-distributed-systems-lab-3-part-3b-en.html</guid>
      </item>
    
      <item>
        <title>Lab 3A khóa MIT 6.5840: Xây dựng thuật toán đồng thuận Raft - Phần 1: Bầu cử Leader</title>
        <description>
          
          Ở các bài viết trước, chúng ta đã xây dựng một framework MapReduce (Lab 1) và một key/value server đơn node với tính nhất quán tuyến tính (Lab 2). Cả hai hệ thống đó đều có một điểm chung: chúng chạy trên một máy duy nhất. Điều đó có nghĩa...
        </description>
        <pubDate>Mon, 06 Apr 2026 19:00:00 +0200</pubDate>
        <link>https://minhmannh2001.github.io/2026/04/06/mit-6.5840-distributed-systems-lab-3-part-3a-vi.html</link>
        <guid isPermaLink="true">https://minhmannh2001.github.io/2026/04/06/mit-6.5840-distributed-systems-lab-3-part-3a-vi.html</guid>
      </item>
    
  </channel>
</rss>
