Repository navigation
Releases: serversideup/spin
Release list
v3.5.2
🐛 Bug Fixes
No more double update prompt
Previously, after Spin upgraded itself, the next command would ask you to check for updates again. Spin now remembers the check after a successful upgrade, so you're only asked once every 14 days.
Since the old version performs the upgrade, you may see the prompt one last time after upgrading to this release.
Pressing Enter at the update prompt now means "yes"
The update prompt shows [Y/n], but pressing Enter actually skipped the update. Enter now accepts the default, like the prompt says. We also fixed the missing line break after typing y, which caused output like [Y/n] yIt's been a while....
Other fixes
spin deploynow shows a clear error when it can't find your swarm manager host, instead of exiting with a rawcaterror.spin latestnow works in project directories that have spaces in their path.
🧼 Housekeeping
- Resolved all ShellCheck warnings across
bin/,lib/,tools/, andtests/. - Added a
testworkflow that runs ShellCheck and the update check regression tests on every pull request. Tests run on both Ubuntu and macOS, so Bash 3.2 compatibility is checked automatically. - Updated the prompt example in
AGENTS.mdso contributors and AI agents don't copy the Enter key bug, and documented how to run ShellCheck locally with Docker.
v3.5.1
🐛 Bug fix
- Fixed an issue when
spin prunewas used then the next execution ofspinwould get hung up by AI agents because Spin required a prompt to check for updates
Full Changelog: v3.5.0...v3.5.1
v3.5.0
🤩 What's New
Added --with-deps flag to spin run
By default, spin run passes --no-deps to Docker Compose so one-off commands like spin run php composer install start fast without booting your whole stack. That's still the default, but it gets in the way when the command genuinely needs the rest of your stack, like a test suite that needs a database.
Pass --with-deps to start anything listed under depends_on first:
spin run --with-deps php php artisan testEverything else about spin run is unchanged.
Added --env flag to spin configure gha
Changing one value in .env.production used to mean running the full spin configure gha production, which reads your .spin.yml, manages deployment keys, and connects to your servers over SSH.
--env skips all of that and only overwrites the <ENVIRONMENT>_ENV_FILE_BASE64 secret:
spin configure gha production --envIt only needs GitHub authentication, so it works without an .infrastructure folder, without a .spin.yml, and without SSH access to your servers. That makes it practical to update a secret from CI, or from the machine of a teammate who ships code but doesn't administer servers.
Running spin configure gha without an environment now prints usage that includes the new option.
Full Changelog: v3.4.0...v3.5.0
v3.4.0
🤩 What's New
Better AI guidelines for Laravel Boost (~55% fewer tokens)
We audited the AI context Spin ships to Laravel Boost users against Anthropic's best practices:
- The always-loaded guideline uses ~55% fewer tokens on every prompt. Detailed content moved into the on-demand
spin-laravel-developmentskill, so you only pay for it when you need it. - Guidance no longer assumes you're using our template defaults. Agents are told to check your compose files for service names, versions, ports, and paths.
- Agents are warned that
spin killaffects all containers on the machine and requires confirmation (which hangs automated sessions), and are pointed tospin stoporspin downinstead. - Each command now documents which official Docker Compose options it accepts (
up,down,stop,build,logs,ps,pull,run,exec).
spin stop is now scoped to your project
Previously, spin stop stopped every container on your machine. It now wraps docker compose stop, so it only stops your project's containers and you can bring them back with spin up. You can also pass service names and any docker compose stop options, like spin stop php. If you want to stop everything on your machine, spin kill still does that.
🐛 Bug Fixes
spin latest nodenow runs commands in your project directory. The volume mount and working directory didn't match, so node/npm commands silently ran in an empty directory.spin pullnow forwards additional options todocker compose pull, as the docs always said it did. For example,spin pull --ignore-pull-failuresnow works.- Fixed the
spin latestno-arguments error message referring tospin new.
📚 Documentation
We audited all 26 command reference pages against the actual source code and fixed what didn't match:
spin deploy: the SSH user defaults to the dedicated non-sudodeployuser created byspin provision, not your host username. The docs now explain why. Also fixedSPIN_BUILD_TAG(defaults to a timestamp), the127.0.0.1registry prefix, and removed a variable that was documented but never implemented.spin kill: documents its machine-wide scope and confirmation prompt.spin downandspin exec: removed an incorrect note claiming they don't work on Composer/npm installs, and documented which Docker Compose options they accept.spin initandspin new: documented the required template argument and all four official templates (laravel,laravel-pro,nuxt,skeleton), plus communityusername/repotemplates.spin provisionandspin maintain: added the missing-h|--hostflag to usage examples.- Smaller fixes to the
base64,latest, andhelppages.
🧼 Housekeeping
- Removed the outdated
.cursorrulesfile (superseded byAGENTS.md). - Contributor docs now point to
bin/spinfor the current tooling image versions.
Full Changelog: v3.3.0...v3.4.0
v3.3.0
This release upgrades Spin's Ansible runtime to 2.21 and brings in v3.0.0 of the Spin Ansible Collection, which adds Ubuntu 26.04 LTS support, automatic swap, automatic hostnames, and more.
🤩 What's New
Ubuntu 26.04 LTS support
spin provision can now create and manage Ubuntu 26.04 servers on Hetzner, Vultr, and DigitalOcean. New .spin.yml files default to 26.04 hardware profiles.
Automatic swap
Servers get a right-sized swap file by default. Sizing follows Red Hat's recommendations and the Ubuntu SwapFaq, and swap you created yourself is never touched.
| RAM | Swap size |
|---|---|
| 2 GB or less | 2x RAM |
| 2 to 8 GB | Matches RAM |
| More than 8 GB | Half of RAM (min 4 GB) |
Capped at 8 GB by default. Configurable with swap_enabled, swap_size_mb, swap_max_size_mb, swap_force, swap_file_path, and swap_swappiness.
Automatic hostnames
Servers now get their OS hostname set from server_name in .spin.yml, and it survives reboots. Your shell prompt and monitoring will finally say ubuntu-2gb-ash-1 instead of whatever the cloud image left behind.
Ansible 2.21 runtime
spin provision and spin maintain now run on ansible-core 2.21 with zero deprecation warnings, thanks to the collection being fully migrated to modern Ansible standards.
Node 24 by default
Commands that use the Node image (like spin node) now default to node:24, the current LTS. You can pin a different version with the SPIN_NODE_IMAGE environment variable.
💪 Improvements
From the collection update, without changing anything in your .spin.yml:
- Provisioning output shows your servers by name instead of IP address.
- Time sync is handled by chrony (required on Ubuntu 26.04), with custom sources available via
chrony_ntp_servers. - Targeting an environment with
spin provision <environment>only creates the servers in that environment. - Clearer validation errors for server names and unmatched targets.
See the collection release notes for the full list, including bug fixes.
🐛 Bug Fixes
-
spin runandspin execnow preserve argument boundaries, so arguments containing spaces or quotes arrive at the container intact (#185). Commands like this work as expected now:spin run php php artisan tinker --execute 'echo "hi";'The same quoting fix was applied to
spin up,spin down,spin ps, andspin prune.
⏫ Upgrade Notes
The collection updates automatically. Spin checks for collection updates once a day, or you can force it right away:
SPIN_FORCE_INSTALL_GALAXY_DEPS=true spin provisionThings you'll notice on your first provision after upgrading:
- Existing servers get their hostname set from
server_name. This is a one-time visible change. - A swap file is created on servers without existing swap. Set
swap_enabled: falsein.spin.ymlto opt out.
If you've customized your Ansible setup beyond .spin.yml (custom playbooks, variable overrides, or --limit by IP address), review the collection's upgrade notes before provisioning.
⭐️ New Contributors
- @yusufkandemir made their first contribution in #185
Full Changelog: v3.2.4...v3.3.0
v3.2.4
🤏 Minor improvement
- Added
SPIN_MCP_WORKING_DIRECTORYfor use with Laravel Boost (helpful for Laravel mono-repos)
v3.2.3
🤖 Better AI context
- Added better AI context for running Laravel test suites
v3.2.2
v3.2.1
🐛 Bug fixes
- Fixed CI/CD NPM package publishing issues
v3.2.0
Spin now works with Laravel Boost 🚀
Your AI coding agent now understands Spin out of the box. Install serversideup/spin, add three lines to .env, run boost:install, and your agent knows how to run commands, configure services, and deploy — no explaining required.
Getting started:
# Add to .env
BOOST_PHP_EXECUTABLE_PATH="./vendor/bin/spin-mcp-wait.sh ./vendor/bin/spin run -T php php"
BOOST_COMPOSER_EXECUTABLE_PATH="./vendor/bin/spin run php composer"
BOOST_NPM_EXECUTABLE_PATH="./vendor/bin/spin run node npm"
# Install Boost
spin run php php artisan boost:install
Includes a comprehensive skill covering all 26 commands, 13 Laravel service configurations, serversideup/php image setup, deployment workflows, and safety guardrails that prevent destructive commands without your confirmation.
How to use
See the Spin Pro docs on how to install and configure:
What's Changed
- docs: Upgrade site to Nuxt 4 and Nuxt UI by @jaydrogers in #178
- Bump @serversideup/project-switcher-bar from 0.0.4 to 0.0.5 in /docs by @dependabot[bot] in #180
- Bump @serversideup/project-switcher-bar from 0.0.5 to 0.0.6 in /docs by @dependabot[bot] in #183
- Add Laravel Boost support by @jaydrogers in #184
New Contributors
- @dependabot[bot] made their first contribution in #180
Full Changelog: v3.1.1...v3.2.0
