Update Sally
Sally is updated through create-sally.
Official update command
npx --yes create-sally@latest update
Useful automation form:
npx --yes create-sally@latest update --dir /opt/sally-instance --version latest --yes
Related provisioning form:
npx --yes create-sally@latest install \
--mode managed-simple \
--dir /opt/sally-instance \
--domain sally.example.com \
--workspace Operations \
--superadmin-email owner@example.com \
--superadmin-name "Sally Admin" \
--acme-email owner@example.com \
--email-setup later \
--version latest \
--yes
This is the official update path for installer-managed Sally deployments.
What the updater does
The updater is designed for deployments originally created by create-sally.
It will:
- detect the install directory
- read the current Sally mode and image tag
- ask for the target version
- update the managed Sally image references in
.env - pull the new Sally images
- start Postgres if needed
- inspect the live database state before migration deploy
- if needed, reconcile missing baseline migration history for initialized databases
- apply committed Prisma migrations automatically with
prisma migrate deploy - rerun bootstrap safely
- restart the Sally services
- verify health checks
Before you update
Recommended:
- back up Postgres
- know whether you want
latestor a pinned version tag - make sure you are updating a deployment created by
create-sally
For production installs, pinned version tags are safer than latest.
Examples:
npx --yes create-sally@latest update
Then enter:
latestfor the newest published release path- or a specific Sally image tag if you want a controlled upgrade
Current scope
The update flow currently supports:
managed-simpleinstalls created bycreate-sallyexisting-infrainstalls created bycreate-sally
It does not try to manage arbitrary hand-edited or fully custom Docker deployments.
That limitation is intentional.
Missing _prisma_migrations recovery
The updater now includes a recovery path for a specific broken-but-common state:
- the Sally schema is already initialized
- core tables like
Workspace,Project,TaskStatus, andTaskexist - but
_prisma_migrationsdoes not exist, so Prisma has no baseline history recorded
When that happens, the updater:
- checks Postgres directly through
docker compose exec postgres psql - confirms whether the schema looks initialized
- marks
20260410182000_initas applied - runs
prisma migrate deployfor the remaining migrations
This is designed to let official installer-managed updates recover safely instead of failing during migration deploy.
Important boundaries:
- this recovery is for installer-managed Sally deployments only
- it is not a generic repair tool for arbitrary custom schemas
- if the schema is only partially initialized, the updater will not fake the baseline
Notes
- Sally is deployed from official published container images.
create-sallyis the install and update operator tool around those images.- Updating
create-sallyupdates the installer tool, not the running Sally application by itself. - Updating a running Sally instance updates the deployed Sally images.
- Hosted MCP remains the default MCP path after upgrade.
- Existing SMTP and instance settings remain in
.env; only the managed Sally image references are updated during the normal update flow. - The updater now relies on committed Prisma migrations rather than schema push semantics.
Product changes relevant to this update
This update line also carries application-level changes that affect live behavior after upgrade:
Workflow/status changes
BLOCKEDis now a first-class task status type- default project workflows now include: Backlog, In Progress, Blocked, Review, Done
Task ordering changes
Task.numberremains the stable human-facing task referenceTask.positionis now the canonical mutable project-wide order- list and board views consume persisted
positionordering
New reorder capabilities
- project statuses can be reordered while keeping the first status pinned
- tasks can be reordered within a board column
- tasks can also be reordered across the whole project without changing status
Relevant interfaces:
- API:
POST /projects/:projectId/tasks/reorder - MCP:
project.tasks.reorder
If you want predictable production upgrades
Prefer explicit version tags over latest.
That gives you:
- clearer rollback points
- more predictable validation
- better release discipline
Recommended team model:
- use
latestfor fast evaluation - use pinned tags for production