# milkup: TipTap+Convex WYSIWYG that still ships a Milkdown README

Source: https://www.michaelchurley.com/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme  
Published: 2026-03-25  
Author: Michael C. Hurley  
Tags: milkup, tiptap, wysiwyg, convex, nextjs, react, markdown, html-to-markdown, media-picker, milkdown, typescript, michaelmonetized

## 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.

![README vs HEAD](/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme/screenshots/readme-head-gap.png)

**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.

![Stack @ HEAD](/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme/screenshots/stack-head.png)

Residue that matters:

- `handleMediaSelect` inserts `![Video](url)` for videos — custom `!video[]()` is documentation only.
- `convex/media.ts` is **queries only** (`listMedia`, `listMediaByType`). ARCHITECTURE still diagrams `uploadFile` / `registerMedia`.
- `MediaPicker` empty state: "No media found. Upload some first!" with nowhere to upload.
- `providers.tsx` falls back to `https://your-deployment.convex.cloud`.

![Media picker empty](/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme/screenshots/media-picker-empty-convex.png)

![Video syntax lost](/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme/screenshots/video-syntax-lost.png)

## Where

Code: [github.com/michaelmonetized/milkup](https://github.com/michaelmonetized/milkup) — public. No live product URL.

```bash
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.

![Commit arc](/blog/milkup-tiptap-convex-wysiwyg-stale-milkdown-readme/screenshots/commit-arc.png)

## 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?
