Back to Blog

MattMakes3D Is Now Fully Powered by EmDash

I run a little corner of the internet called MattMakes3D, a running log of everything that comes off my printer. Models, makes, the occasional filament disaster, and the notes I wish I'd written down the first time. It's a side project.

This month it got two upgrades at once: a new look, and a completely new foundation. The site is now fully powered by EmDash, self-hosted on Cloudflare. No more Notion. No more Ghost. No more stitching three services together and hoping they stayed friends. Here's the story of why, and how.

The problem: a Franken-stack

The old MattMakes3D was held together with good intentions and three separate products:

  • Notion was the "database" — every print lived as a row in a Notion table, and the site pulled from the Notion API at build time.
  • Ghost ran the blog — a second, entirely separate CMS with its own login, its own content model, its own bill.
  • Vercel hosted the front end and glued it all together.

It worked. But every piece of content lived in a different place, every service had its own dashboard, and adding a feature meant reasoning about three APIs at once. Want to show a print's build notes on its own page? That's a Notion schema change, a rebuild trigger, and a prayer. My "simple print log" had turned into a systems-integration project.

I wanted one place to write, one place to store images, one place to log in, and I wanted to actually own the whole thing.

Enter EmDash

EmDash is a CMS that integrates directly with an Astro site. Instead of being a separate hosted service you pipe content out of, it becomes part of your app: your content model, your admin UI, and your front end all ship together. It runs great on Cloudflare's stack, which is exactly where I wanted to be.

The new architecture is boringly simple, which is the whole point:

  • Cloudflare Workers run the site at the edge (Astro in SSR mode via the Cloudflare adapter).
  • D1 — Cloudflare's SQLite database — holds all the content.
  • R2 stores every image.
  • KV handles admin sessions.

That's it. One repo, one deploy, one dashboard. The admin lives at /_emdash/admin, right alongside the site it edits.

The migration

The move came down to three content types: prints, workshop deals, and journal posts. I defined those collections in EmDash, then wrote scripts to pull everything out of Notion and Ghost and load it into D1 — around 30 prints, the deals, the blog archive, and every image rehomed into R2 so nothing was left pointing back at the old services.

The nice surprise was how little the front end had to change. I kept the same function names and data shapes that my Astro pages already expected and just swapped the underlying data source. The pages didn't know Notion had left the building.

A few upgrades came along for the ride:

  • Print pages got real. Each print now has its own full page — photo, source, build date, and a proper Notes section rendered straight from the CMS — instead of a cramped lightbox popup.
  • Login is GitHub OAuth or Passkeys. One account, works everywhere.
  • The whole thing runs on the edge and, for a site this size, costs effectively nothing to host.

The fun part: a native EmDash plugin for sharing

Here's where owning the platform paid off. I share prints to X and Threads through Buffer, and I got tired of copy-pasting.’

So I wrote a native EmDash plugin that talks to the Buffer API directly. Now there's a "Share to Buffer" button right inside the print editor — write up a print, hit share, and it queues a post with copy that actually sounds like me ("check out this [print] that I printed from [source]") plus the link. It even adds #3dprinting #makers on X only, and drops a little checkmark on prints I've already shared so I don't double-post.

That's the part I couldn't have built cleanly on the old stack. When the CMS is yours, a feature like this is a plugin — not a fight with three external APIs. And because it's a plugin and not a one-off hack, it travels: the same Share to Buffer tool is coming to MakerDeck next (more on that below).

The rebrand: a fresh logo I'm actually proud of

New foundation, new face. MattMakes3D finally has a real identity instead of placeholder text and a stock cube — and honestly, the new one looks great.

  • A wordmark — "MATT MAKES 3D," with the "3D" rendered as an extruding printer nozzle, because of course. It reads instantly, it's got personality, and it works in both light and dark.
  • An icon that's built for social. The isometric "M3D" cube is the piece I'm happiest with. A logo has to survive being shrunk to a tiny circle in an Instagram bio, a square avatar on X and Threads, a browser-tab favicon, and an app icon on a phone home screen — and most detailed logos fall apart at those sizes. This one doesn't. It's bold, high-contrast, and legible whether it's 512 pixels or 16, on a navy squircle or a cream circle. Every platform gets a version that looks deliberate instead of squished.
  • A full favicon set and a refreshed social share card, so the site looks intentional everywhere it shows up — browser tabs, link-preview cards, and my link-in-bio page.

Branding is the kind of thing that's easy to skip on a side project, but it's the difference between something that looks like a project and something that looks like a place. The moment the new mark showed up as a crisp little avatar across every social platform, MattMakes3D stopped feeling like a hobby folder and started feeling like a brand.

What I actually gained

Stripping it down to one system did more than tidy the diagram:

  • One place to work. Writing a post and logging a print happen in the same admin, side by side.
  • I own my data. It lives in my D1 database and my R2 bucket, not scattered across services I rent.
  • It's extensible. Want a new feature? Write a plugin. The Buffer integration proved that out.
  • It's fast and cheap. Edge-hosted, and the bill rounds to zero.

The best part is that none of this is visible to a visitor. The site looks better and works the same — they just get faster pages and I get my sanity back. That's the migration I wanted: all of the upside, none of the "please excuse our dust."

This is just the start: MakerDeck is next

MattMakes3D was the proving ground. Now I'm doing it again for MakerDeck, the maker community I help with — moving it onto EmDash and the same Cloudflare foundation.

And the Share to Buffer plugin comes with it. Because I built it as a proper EmDash plugin instead of a bespoke script, dropping it into MakerDeck is a matter of installing it, not rebuilding it. The same one-click social sharing I now have for prints will handle MakerDeck's posts too. That's the payoff of owning your platform: the work you do on one project becomes a tool you reuse on the next.

If you're running a small content site duct-taped together from a handful of SaaS dashboards, it might be worth asking the same question I did — what would it take to make this one thing that I own? For me, the answer was EmDash. And I'm not going back.

You can see the result at mattmakes3d.com, and keep an eye on makerdeck.com as it makes the same jump.

❤️ Support / Donate