Who
I needed a drop-in editor for HustleLaunch client blogs — toolbar clicks instead of markdown homework, paste from Google Docs, and a media picker that doesn't dump files into /public forever.
For operators who already run Convex and Next and want the HTML model to keep emitting clean markdown behind the scenes.
What
I built milkup — public https://github.com/michaelmonetized/milkup. HEAD 45fb587. 9 commits. 0 stars / 1 fork. Default master. Version 0.1.0. Local Next app only.
Hour zero (fea1956, 06:03 ET): Milkdown + Convex media picker + lib/milkdown-video-plugin.ts custom !video[alt](url) path.
Two minutes later (d73d1f9): strip Convex, ship MOCK_MEDIA, keep the textarea POC honest.
README (91fa36f): locks the public story on Next.js 15 / React 18 / Milkdown / mock library / !video[]() — and that file never got another commit.

Pivot (35c109f, 06:32): TipTap RichEditor + Toolbar + html-to-markdown / markdown-it converters + Convex Providers back in. EditorPage subtitle says "WYSIWYG editor with TipTap + Convex media storage."
CVE pin (e11562e): React 19 + Next 14.2 because BUILDPLAN bans Next 15.x / React 18.x.
Next 16 (9b7b0e6, 06:48): jump to next ^16 "Vercel-ready" — BUILDPLAN stack blurb still says Next 15 + React 18 in places.
Opus QA (45fb587, 06:59) → HEAD: delete leftover milkdown-video-plugin.ts, ESLint config, MediaPicker tidy.

Residue that matters:
handleMediaSelectinsertsfor videos — custom!video[]()is documentation only.convex/media.tsis queries only (listMedia,listMediaByType). ARCHITECTURE still diagramsuploadFile/registerMedia.MediaPickerempty state: "No media found. Upload some first!" with nowhere to upload.providers.tsxfalls back tohttps://your-deployment.convex.cloud.


Where
Code: github.com/michaelmonetized/milkup — public. No live product URL.
git clone https://github.com/michaelmonetized/milkup.git
cd milkup
bun install
# set NEXT_PUBLIC_CONVEX_URL in .env.local
bunx next dev
Open http://localhost:3000 — TipTap left, raw markdown right, Insert Media opens the Convex modal.
When
2026-03-25 06:03–06:59 ET — entire arc on one afternoon.
| SHA | Clock | Beat |
|---|---|---|
| fea1956 | 06:03 | Milkdown + Convex + video plugin |
| d73d1f9 | 06:05 | Mock strip |
| 91fa36f | 06:06 | README (frozen face) |
| 30ff01a | 06:25 | BUILDPLAN + ARCHITECTURE |
| 35c109f | 06:32 | TipTap + Convex return |
| e11562e | 06:33 | React19 + Next14.2 |
| c28d8d5 | 06:35 | CONVEX_SETUP |
| 9b7b0e6 | 06:48 | Next.js 16 |
| 45fb587 | 06:59 | Opus QA → HEAD |
Queue pushed_at 2026-03-25T10:59:17Z.

Why
Because client editors fail when the truth lives in TipTap and the README still teaches Milkdown. Because a media picker that can only listMedia is a museum of intent. Because CVE notes and a Next 16 bump in the same hour are how a POC ages in public.
Engagement Q: Rewrite README to TipTap+Next16+queries-only truth, or keep the Milkdown museum label and finish the upload mutations ARCHITECTURE already drew?
