Changelog¶
0.8.1 - 2026-09-29¶
Added¶
worktree_start_taskcontext data: the taskworktree:create --startruns.
Fixed¶
- Worktree tasks call the plugin tasks by their real name when the project renames them.
0.8.0 - 2026-09-25¶
Added¶
castor docker:tunnel:start: public HTTPS URLs through a Cloudflare quick tunnel.link(): hands a service's connection variables to an application, for every language.MeilisearchService, with its dashboard.MercureService, served by FrankenPHP itself when possible.RustFSService, S3-compatible storage with buckets created on start.docker:service:installinstallsmeilisearch,mercureandrustfs.withHttpRouting()can be called several times;ServiceBuilder::entrypoint().RabbitMQService::withVersion(),healthcheck()takes astartPeriod.- Healthchecks for ClickHouse, its keeper, RedisInsight and Kibana.
castor docker:doctordiagnoses the environment.{service}:dumpand{service}:restoreon every database.worktree:create --copy-datacopies the databases of the current checkout.
Changed¶
- The router keeps the
X-Forwarded-*headers of private addresses. Runcastor docker:router:restart. - The router is no longer downgraded by an older plugin;
docker:upwarns when it is outdated. - Default versions: Redis 8.10, Elasticsearch/Kibana 9.5.3, RabbitMQ 4.3, MySQL 9.7.2, ClickHouse 26.8.
- Elasticsearch: security off, 512 MB heap, disk watermarks off.
- MySQL
DATABASE_URLhasserverVersionandcharset=utf8mb4. - RedisInsight image is
redis/redisinsight.
Fixed¶
DATABASE_URLserverVersionfollowswithVersion().- RedisInsight connections were lost (wrong data volume).
- RabbitMQ queues were lost on recreate (random node name).
- Kibana connects to a renamed Elasticsearch.
- Postgres, MySQL and MariaDB healthchecks passed on the init server.
Deprecated¶
withDatabaseService()andwithMailerService(): uselink().
Upgrading¶
Pin the old version with withVersion(), or remove the volume (castor docker:destroy).
- Elasticsearch 7 → 9: data unreadable. Pin
7.8.0or remove the volume. - MySQL 8.0 → 9.7: run once with
withVersion('8.4'), or pin8.0.46. - RabbitMQ: starts an empty node. Drain messages first.
- RedisInsight: add your databases again.
- FrankenPHP linked to Mercure: run
castor docker:build.
0.7.1 - 2026-09-22¶
Fixed¶
- Commands in a container wrapped at 80 columns: the terminal size is now passed.
0.7.0 - 2026-09-21¶
Added¶
- Git worktrees get their own stack and domain, with no configuration.
worktree:list,worktree:create,worktree:delete, and--worktreeon every task.docker:aboutnames the worktree and what it shares with the others.- Worktrees share the caches of the main checkout.
docker:pushlabels images with their repository;--tagpicks the tag.
Fixed¶
<service>:exposerestored the forwarders of another project.<service>:exposesays which container holds the port.
Upgrading¶
- Run
castor <service>:exposeagain for each exposed service.
0.6.0 - 2026-09-17¶
Added¶
docker:service:installtakes every question as an option.InputType::Choiceinstaller inputs takemultiple: true.
Changed¶
docker:pushletsdocker buildx bakeread the compose file.
Fixed¶
- Postgres 18 data was lost on recreate (wrong volume path).
Upgrading¶
- Postgres on its default version: dump the database before upgrading, the volume is empty.
0.5.2 - 2026-09-03¶
Added¶
addExtension()builds extensions with PIE, and takes system packages.withPieVersion().
0.5.1 - 2026-09-03¶
Added¶
castor docker:stats: CPU, memory and disk used by the project.NodeService, a Node.js application, and itsnodeinstaller.NodeService::withPolling(), when nothing reloads.
Changed¶
RedirectionioAgentService::addReverseProxy()reads the port of a service instance.
0.5.0 - 2026-09-01¶
Changed¶
PhpMode::FrankenPhpbuilds every stage ondunglas/frankenphp.- Extensions are named after the installer of the mode.
- FrankenPHP containers start in
/var/wwwwithHOME=/home/app. - Shipped Dockerfiles have no
# syntax=line, see pinning the frontend. - New builder blocks
builder_php_devandbuilder_php_configuration.
Upgrading¶
- FrankenPHP applications rebuild on
dunglas/frankenphp(ZTS PHP). - Their extensions use install-php-extensions names:
mysqlismysqliandpdo_mysql.
0.4.1 - 2026-09-01¶
Fixed¶
- The
docker:pushbake file escapes what it embeds and writes no empty blocks.
0.4.0 - 2026-08-28¶
Added¶
PHPService::withPhpIni(), per scope, without rebuild.docker_compose_exec().PHPService::withSudo().PHPService::withPackageManager()andwithNodeVersion().
Changed¶
docker_compose_run()anddocker_exit_code()take the command as a list.- Default Node.js is 24, and npm the default package manager.
- The Node version is the
node_versionTwig variable.
Fixed¶
- FrankenPHP applications and workers ignored
app-default.ini. - The builder builds on Node 25.
Removed¶
- The unused
mods-available/app-builder.ini.
Upgrading¶
- Node 24: pin with
withNodeVersion('20'). yarnis yarn 1 unlesspackageManagersays otherwise.- FrankenPHP reads
app-default.ini: override it withwithPhpIni(). GoBuilder/RustBuilderoverrides ofgetBuildCommand(),cargoCommand(),formatCommand()return tokens.
0.3.5 - 2026-08-28¶
Changed¶
- QA tools are installed by the builder's composer.
Removed¶
- The
castor-php/php-qadependency: require it yourself if you call it.
Fixed¶
withMailerService()generated an invalid compose file (#4, @HedicGuibert).ServiceBuilder::dependsOn()defaults toservice_started.
0.3.4 - 2026-08-12¶
Added¶
RedirectionioAgentService::withTestMode()andwithLogging().- The router starts and stops with your projects;
router_autostartto turn it off.
Changed¶
docker:router:statusshows the autostart and the projects served.
0.3.3 - 2026-08-11¶
Added¶
castor docker:aboutlists the URLs of the project.
0.3.2 - 2026-08-10¶
Fixed¶
- The router watches the socket of the daemon in use.
0.3.1 - 2026-08-10¶
Fixed¶
- QA tasks pass no path when the tool has its own configuration file.
0.3.0 - 2026-08-07¶
Added¶
- Containers resolve the project's own domains.
RustBuilderandGoBuilder, one compiler container for several applications.BinaryRunService, running a compiled binary.withWorkingDirectory(), for monorepos.PHPService::withSharedBuilder()andwithoutBuilder().RustService::withTarget(),withBinaryPath(),withBuildCommand(),withRunCommand().ServiceBuilder:restart(),ulimits(),dns(),extraHost(),deploy().environment,entrypointandportsondocker_compose_run()anddocker_exit_code().withName()on every service, to run several instances.- MySQL and MariaDB server configuration.
RedirectionioAgentService::withApiHost(),withApiTimeout()andwithDebug().recreateOnChangeonServiceBuilder::config().{app}:worker:restartand{app}:worker:stop.castor docker:logs:clear.- Shell completion on service, container, installer and worker names.
{app}:updateonGoBuilderapplications.- A restart policy on
addWorker()andBinaryRunService::withRestart(). RustBuilder::withNightlyFormatter().get_default_profiles()readsdocker_profiles.- Rust and Go Dockerfiles are extensible Twig templates.
Fixed¶
- The redirection.io agent preserves the
Host. ClickhouseServiceUI answered 502 half the time.- Inline compose configs are no longer interpolated.
Changed¶
ServiceBuilder::withHttpRouting()requires the port.{service}:bashand database sessions work without a terminal.- QA tasks run in the builder container.
GoServicebuilds from a shipped Dockerfile.GoServiceandRustServiceare no longerfinal.docker_exit_code()forwardsportMapping.project_nameis no longer overwritten bycompose.yaml.docker_compose_run()is quieter;-vfor the compose output.- Tasks of a named service are
{service}:{task}:db:psqlbecomespostgres:client.
0.2.1 - 2026-07-27¶
Added¶
Changed¶
- Tasks are registered through
FunctionsResolvedEvent. castor listno longer regeneratescompose.generated.yaml.- The compose project name is read from
compose.yaml.
0.2.0 - 2026-07-27¶
Changed¶
- The Caddy router is global, shared by every project.
Added¶
docker:router:status,docker:router:logsanddocker:router:restart.
Removed¶
CaddyRouterServiceand therouterprofile.router:enable/router:disable, renameddocker:router:enable/docker:router:disable.
Upgrading¶
- Run
castor docker:upthencastor docker:router:enable.
0.1.3 - 2026-07-27¶
Fixed¶
- Re-enabling the router failed on read-only certificates.
- Databases use complete versions.
0.1.2 - 2026-07-25¶
Fixed¶
- Bind-mounted host directories are created before docker creates them as
root.
0.1.1 - 2026-07-25¶
Fixed¶
compose.yamlis created without an#[AsContext]function.castor listdropped the project configuration.
0.1.0 - 2026-07-25¶
First release. See the documentation.