Why?

Why does this exist?

I’ve tried many frameworks and CMSs over the years, and they all felt cumbersome and unwieldy.

Web development doesn’t need to be so hard. Sure there’s complexity involved, but it doesn’t need to be nearly as difficult as people make it. The majority of development problems are already solved. A clean system that combines the basic functionality will handle 80% of the problems, letting you spend energy on what matters most.

The real value of DW (and any framework) is that the big decisions are made for you. I’ve thought long and hard about these solutions and settled on pragmatic decisions with a few key principles:

  • Keep architecture as simple as possible
  • Keep the workflow simple too
  • Make boring decisions (avoid being overly clever)

Focus on Development Speed

  • Don’t get lost in the weeds solving problems you don’t need to solve
  • Get “table stakes” functionality without having to invent it: 2FA, image uploads, job queues, email service
  • Focus on building complex features fast and shipping

Why would I use it?

If you’ve bemoaned the time and effort to set up auth, this is for you. If you’ve thrown objects across the room while trying to get photo uploads working with cropping, this is for you. If a client has asked you to build a bespoke back office system, this is for you.

This is especially for you if you want to build something well-thought-out and reliable without having to think about it.

Why this technology?

Why Astro?

  • Beginner-friendly with an easy dev workflow
  • Use React, Vue, or Svelte components if you want
  • Clean organization, easy enough to make it what you need
  • Easy enough deployment story

Why Node?

  • It’s everywhere with tons of integrations
  • Easy to set up locally
  • More secure on a VPS than PHP apps

Why TypeScript?

Full disclosure: I don’t love TypeScript. For 10 years DW was written in PHP and it was great.

But here I am, using TypeScript for new apps. The ecosystem is huge with tons of free libraries. It’s easier than it used to be. Fast enough processing, reliable architecture. IDEs love it with type definitions and click-through function references.

TypeScript is also great for AI-assisted development. You can write apps with this stack incredibly fast using Claude and Cursor.

Why shadcn?

We embraced React specifically to use shadcn. The React ecosystem is hard to beat - the React version of any given tool is almost always the most well-designed.

Maintaining your own component library is torture. We want to rely on people doing this as their main focus, solving hard problems with industry-standard solutions.

Why these specific tools?

There’s so much stuff out there, and not all of it is good.

DW uses carefully vetted dependencies. We try to make the most “normal” decisions - straightforward and obvious choices, not too clever. Do what you can with the provided libs (Alpine, Tailwind, etc.) before reaching for anything else.