Skip to main content
All posts
Drupal CLI Drush Oct 26, 2026 · 2 min read

Drupal 11.4's New Native CLI: What vendor/bin/dr Means for Drush

Drupal 11.4 ships an experimental Symfony Console-based CLI at vendor/bin/dr, built by a team that includes Drush's own maintainers. Here's what changes, what stays, and how custom modules register commands.

Article

A New Entry Point, Not a Drush Replacement (Yet)

Drupal 11.4, released July 2026, introduces an experimental native command line interface available through vendor/bin/dr. It replaces the old hardcoded core/scripts/drupal entry point with an extensible, Symfony Console-based system that can discover commands from core and enabled modules.

The older entry point is now deprecated:

# Deprecated
php core/scripts/drupal generate-theme my_theme

# New
vendor/bin/dr generate-theme my_theme

Who Built It

This isn't a rogue parallel project — the team behind it includes maintainers of Drush itself. The stated direction is a transitional period where Drush is gradually replaced by the core dr CLI over time, not an abrupt cutover. For now, both coexist.

Registering Commands From a Custom Module

Modules provide commands by placing command classes under a module's src/Command namespace and tagging them with Symfony's AsCommand attribute:

namespace Drupal\mymodule\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'mymodule:rebuild-index', description: 'Rebuilds the custom search index.')]
class RebuildIndexCommand extends Command {
    protected function execute(InputInterface $input, OutputInterface $output): int {
        // Rebuild logic here.
        return Command::SUCCESS;
    }
}

Drupal discovers the command automatically once the module is enabled — no services.yml wiring required, which is a meaningfully lower-ceremony pattern than registering a Drush command used to be.

Should You Migrate Now?

Not yet, for most teams. The interface is explicitly experimental, and the command surface is still thin compared to Drush's mature ecosystem of site aliases, SQL sync, and config workflows. But if you're starting a custom module today, writing the command with AsCommand costs nothing extra and positions you for whichever direction core settles on.