Image-to-pattern converter + free-draw designer for Perler, cross stitch, pixel art, Minecraft, LEGO, kandi, diamond and bead loom — built solo on Astro + Cloudflare Workers + D1

MakeBead.com is a one-stop pattern-making platform for 8 different craft styles. Users upload a photo and the colour matcher pixelises it against authentic bead palettes (Perler Midi, DMC floss, Minecraft blocks, LEGO bricks, kandi, diamond drills, and more), then generates a print-ready pattern with grid lines, colour codes and a full materials list. A free-draw designer lets you place beads pixel-by-pixel on a blank grid. The product ships in 11 languages with a community pattern gallery, accounts, likes, favourites and full-text search — all running on Cloudflare's edge for sub-50ms response times.
The bead-pattern market is highly fragmented. Cross stitch, Perler, kandi, LEGO mosaic, diamond painting and Minecraft pixel-art each have a few dedicated tools, but no single product covers all of them — and the legacy professional tool Beadifier shut down in late 2023, leaving a gap.
MakeBead is my answer to that gap: one upload, eight craft styles, a real materials list, and a community gallery — for free.
MakeBead ships two tools that share one underlying grid model: a converter that turns any photo into a pattern, and a designer that lets you draw a pattern from scratch. Both export print-ready PDF / PNG with grid lines, colour codes and a full materials list — and a single design can be opened in any of the 8 craft styles, because the pattern itself is tool-agnostic.
Every published pattern lives in a public gallery sortable by hot / newest / top. Each craft style has its own sub-gallery, but underneath they share one tool-agnostic grid: the detail page renders a flat pixel-art preview and offers an "Open in <tool>" switcher across all 8 styles. Likes, favourites, user profiles at /u/<username>, and FTS5 full-text search are wired in.
MakeBead ships in en (default, no prefix) plus de / ja / ko / fr / es / ru / th / zh-Hans / zh-Hant / pt-BR. The hard part wasn't translation — it was URL handling. A custom Astro middleware rewrites /<locale>/<path> to SSR routes while preserving query strings; without that ?page=2, ?sort=top and ?q=… would silently disappear on every locale-prefixed URL. A path linter (npm run lint:paths) blocks hardcoded internal paths from sneaking back in.
Frontend: Astro 6 with React islands, Base UI primitives, Tailwind CSS 4, Geist font.
Auth: Better Auth + Better-Auth-Cloudflare adapter, sessions stored in D1.
Storage: D1 (SQLite at the edge) for metadata + likes + FTS5 search; R2 for source uploads.
Rendering: Server-side canvas for pattern thumbnails, jsPDF for printable PDF exports.
CI / CD: Wrangler-based deploy with i18n smoke tests (269 cross-locale checks before every release).