notrab.dev

The Geordie Webmaster

Dumbo

Published July 7th, 2025

I last wrote PHP professionally over 15 years ago. Back then, CodeIgniter and FuelPHP were my go-to frameworks—well before Laravel became the powerhouse it is today. After years in the Rails ecosystem, then Node, Go, React, and GraphQL, I decided it was time to come back.

And like any self-respecting developer, I built a framework to do it.

Meet Dumbo, a lightweight, friendly PHP framework for HTTP, inspired by Hono, Sinatra, and Slim.

Why Dumbo?

Most recently I’ve been using Hono in the Node ecosystem. It’s similar to Express, but without the bloat and baggage. I wanted to start my PHP journey with something fresh—something that felt modern and minimal, not overwhelming.

During a few long-haul flights to and from San Francisco, I started hacking away. A few months later, Dumbo was ready to share with the world.

Dumbo isn’t trying to compete with Laravel or Symfony. If anything, it’s something you can use in production, contribute to, and use as a learning resource. That’s been the goal from day one. The Hacker News Launch

I posted Dumbo to Hacker News and was genuinely surprised by the response—76 points and 65 comments filled with constructive feedback. Everything from suggestions about strict typing and PSR standards to debates about GraphQL and microframeworks. The PHP community showed up, and it was brilliant.

Features

Dumbo packs a lot into a small footprint:

  • 🚀 Lightweight and fast
  • 🧩 Middleware support
  • 🛣️ Flexible routing with parameters
  • 🔒 Built-in security features (CSRF, JWT)
  • 🍪 Cookie management
  • 📅 Date helpers
  • 🔍 Request ID for tracing
  • 📁 Static file serving
  • 🔐 Basic and Bearer authentication
  • 📝 Logging support
  • 🗃️ HTTP caching
  • 🔄 CORS support
  • 🧬 Environment-based configuration

Quickstart

Here’s how simple it is to get started:

<?php

require __DIR__ . '/vendor/autoload.php';

use Dumbo\Dumbo;

$app = new Dumbo();

$app->use(function ($context, $next) {
    $context->set('message', 'Hello from middleware!');
    return $next($context);
});

$app->get('/', function ($context) {
    return $context->json([
        'message' => $context->get('message'),
        'timestamp' => time()
    ]);
});

$app->get('/users/:id', function ($context) {
    $id = $context->req->param('id');
    return $context->json(['userId' => $id]);
});

$app->post('/users', function ($context) {
    $body = $context->req->body();
    return $context->json($body, 201);
});

$app->run();

If you’ve used Hono, Express, or Sinatra, this should feel instantly familiar.

Community

What’s been most rewarding is the community response. Within the first few weeks, we had over 12 contributors jumping in to help improve the codebase. The repo now has 300+ stars and a growing Discord community.

There’s also a collection of examples covering everything from HTMX integration to Docker deployments to custom middleware patterns.

Josh Cirre even did a walkthrough on YouTube if you want to see Dumbo in action.

Try It

composer require notrab/dumbo

I’d love to hear what you think. Whether you’re a PHP veteran or someone like me who’s rediscovering the language after years away, Dumbo might be exactly what you need to get building.

Sometimes the best way to learn is to build something from scratch. Dumbo’s been that for me—and hopefully it can be a useful tool or learning resource for you too.