Skip to content

Releases: serversideup/spin

v3.5.2

Choose a tag to compare

@jaydrogers jaydrogers released this 29 Sep 13:55

🐛 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 deploy now shows a clear error when it can't find your swarm manager host, instead of exiting with a raw cat error.
  • spin latest now works in project directories that have spaces in their path.

🧼 Housekeeping

  • Resolved all ShellCheck warnings across bin/, lib/, tools/, and tests/.
  • Added a test workflow 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.md so contributors and AI agents don't copy the Enter key bug, and documented how to run ShellCheck locally with Docker.

v3.5.1

Choose a tag to compare

@jaydrogers jaydrogers released this 02 Sep 18:28

🐛 Bug fix

  • Fixed an issue when spin prune was used then the next execution of spin would 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

Choose a tag to compare

@jaydrogers jaydrogers released this 02 Sep 18:10

🤩 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 test

Everything 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 --env

It 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

Choose a tag to compare

@jaydrogers jaydrogers released this 19 Aug 17:01

🤩 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-development skill, 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 kill affects all containers on the machine and requires confirmation (which hangs automated sessions), and are pointed to spin stop or spin down instead.
  • 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 node now 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 pull now forwards additional options to docker compose pull, as the docs always said it did. For example, spin pull --ignore-pull-failures now works.
  • Fixed the spin latest no-arguments error message referring to spin 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-sudo deploy user created by spin provision, not your host username. The docs now explain why. Also fixed SPIN_BUILD_TAG (defaults to a timestamp), the 127.0.0.1 registry prefix, and removed a variable that was documented but never implemented.
  • spin kill: documents its machine-wide scope and confirmation prompt.
  • spin down and spin exec: removed an incorrect note claiming they don't work on Composer/npm installs, and documented which Docker Compose options they accept.
  • spin init and spin new: documented the required template argument and all four official templates (laravel, laravel-pro, nuxt, skeleton), plus community username/repo templates.
  • spin provision and spin maintain: added the missing -h|--host flag to usage examples.
  • Smaller fixes to the base64, latest, and help pages.

🧼 Housekeeping

  • Removed the outdated .cursorrules file (superseded by AGENTS.md).
  • Contributor docs now point to bin/spin for the current tooling image versions.

Full Changelog: v3.3.0...v3.4.0

v3.3.0

Choose a tag to compare

@jaydrogers jaydrogers released this 16 Jul 20:08

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 run and spin exec now 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, and spin 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 provision

Things 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: false in .spin.yml to 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

Full Changelog: v3.2.4...v3.3.0

v3.2.4

Choose a tag to compare

@jaydrogers jaydrogers released this 23 Jun 17:40

🤏 Minor improvement

  • Added SPIN_MCP_WORKING_DIRECTORY for use with Laravel Boost (helpful for Laravel mono-repos)

v3.2.3

Choose a tag to compare

@jaydrogers jaydrogers released this 16 Apr 21:35

🤖 Better AI context

  • Added better AI context for running Laravel test suites

v3.2.2

Choose a tag to compare

@jaydrogers jaydrogers released this 16 Apr 19:41

🤏 Minor improvement

  • Made an improvement for the update checks so we don't need to see them all the time
Screenshot 2026-04-16 at 14 40 18

v3.2.1

Choose a tag to compare

@jaydrogers jaydrogers released this 10 Apr 19:35

🐛 Bug fixes

  • Fixed CI/CD NPM package publishing issues

v3.2.0

Choose a tag to compare

@jaydrogers jaydrogers released this 10 Apr 19:03
38bc753

Spin now works with Laravel Boost 🚀

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

Full Changelog: v3.1.1...v3.2.0