Adding Markdown Support End-to-End (Part 7)

What it actually takes to wire a new file type through a layered RAG stack — validation, extraction, MIME quirks, and a schema migration.

One of the things I deliberately built into Sift is a clear separation of concerns across the stack. The API validates what's allowed, the pipeline handles extraction, the frontend controls what you can drop, and the database enforces the constraint at rest. That structure pays off when you add features — but it also means "add Markdown support" touches more layers than you might expect.

This post walks through what that change actually looked like: every file it touched, the subtle bug that emerged in the browser, and the schema migration that closed the loop.

Where File Types Are Enforced