sally_ install + publish path
Product model
Sally is deployed from official published container images.
create-sally is the official operator tool for:
- fresh installs
- guided updates
Public commands:
Install:
npx --yes create-sally@latest
Non-interactive install:
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
Update:
npx --yes create-sally@latest update
Published artifacts
Container images:
ghcr.io/use-sally/sally-apighcr.io/use-sally/sally-web
npm packages:
create-sallysally-mcp
Version model
Sally has separate version tracks for different artifacts.
create-sallyhas its own npm package version and release cycle.- The Sally application itself has its own release/version lifecycle.
- Updating
create-sallyupdates the installer/operator tool. - Updating a running Sally instance updates the deployed Sally images.
This distinction is intentional and should stay explicit in docs, release notes, and support responses.
GitHub publish flow
The repo includes:
- production Dockerfiles for API and web
- GitHub Actions workflow:
.github/workflows/publish-images.yml
Trigger options:
- push to
main - tag starting with
v - manual workflow dispatch
Image builds stamp version metadata automatically from the repo:
- version from root
package.json - full git SHA for API/runtime metadata
- short git SHA for web display metadata
- UTC build timestamp
That means deployed Sally images should know their version without asking end users to set manual version env vars.
Current create-sally behavior
create-sally now supports:
- Docker / Docker Compose preflight
- automatic Docker install on Linux if missing
- install mode selection
- domain prompt
- immediate DNS verification for
managed-simple - first workspace naming
- SMTP prompt flow using
SMTP_HOST/SMTP_PORT/SMTP_USER/SMTP_PASSWORD/MAIL_FROM - stack file generation
- fresh image pull before startup
- Postgres startup + readiness wait
- automatic baseline reconciliation for initialized databases that are missing Prisma migration history
- Prisma migration deploy
- bootstrap of first workspace + superadmin
- health verification
- final welcome output with login details
- post-install path points users toward hosted MCP inside Sally
- guided update flow for installer-managed Sally deployments
- update-time image tag refresh in
.env - update-time image pull + migration deploy + service restart + health verification
Update model
The official update path is:
npx --yes create-sally@latest update
Current scope:
- supports deployments created by
create-sally - supports both
managed-simpleandexisting-infra - updates the managed Sally image references in
.env - pulls fresh images
- starts Postgres if needed
- inspects the live database before migration deploy
- if the app schema already exists but
_prisma_migrationsis missing, marks baseline migration20260410182000_initas applied before continuing - runs committed Prisma migrations with
prisma migrate deploy - reruns bootstrap safely
- restarts services
- verifies health
This is intentionally narrower than trying to manage arbitrary custom Docker setups.
Baseline reconciliation behavior
A specific recovery path now exists for installs where:
- the Sally schema already exists
- core tables such as
Workspace,Project,TaskStatus, andTaskare present - but Prisma migration history is missing because
_prisma_migrationsdoes not exist
In that case, create-sally update:
- inspects Postgres directly through
docker compose exec postgres psql - confirms whether the schema is already initialized
- marks
20260410182000_initas applied - runs normal migration deploy for the remaining migrations
This avoids the previous failure mode where updates could not proceed on initialized databases with missing migration history.
Mailer behavior
The API mailer supports:
SMTP_HOSTSMTP_PORTSMTP_USERSMTP_PASSWORDMAIL_FROMAPP_BASE_URL
SMTP_URL is still supported as a compatibility fallback, but the preferred model is the discrete SMTP fields above.
MCP behavior
The primary MCP product path is now hosted MCP inside Sally.
Hosted MCP endpoint:
/mcp
Hosted MCP auth model:
- users create hosted MCP keys inside Sally
- each key is tied to the Sally user who created it
- permissions are inherited from that user
- optional workspace restriction exists at the hosted MCP key level
Local/stdio MCP:
sally-mcpstill exists as an advanced / legacy path- it is no longer the default onboarding path
Bootstrap result
The bootstrap step upserts:
- first workspace (installer-provided name + derived slug)
- superadmin account
- owner membership
The same bootstrap step is rerun during managed updates so installer-managed instances stay aligned with the expected bootstrap state.
Release checklist
- Push to
main - Confirm
publish-imagessucceeds - Publish
sally-mcponly when the advanced/legacy stdio path changes are ready - Publish
create-sallywhen installer changes are ready - Test one fresh
managed-simpleinstall on a clean Linux host - Test one fresh
existing-infrainstall on a clean Linux host - Test one
create-sally updaterun against an installer-managed deployment - Specifically test the initialized-schema / missing-
_prisma_migrationsrecovery path during update - Verify SMTP, login, invite flow, hosted MCP key UX, and hosted
/mcpbehavior - Verify reported Sally version after update matches the deployed image tag
Product changes included in this release line
Task workflow model
Task workflow now distinguishes between:
Task.number: stable human-facing task referenceTask.position: mutable canonical project-wide task order
Task.position is now the source of truth for:
- project task list ordering
- board/task ordering reads
- “next task in line” style sequencing
- reorder persistence
Status model
Project task statuses now include BLOCKED as a first-class TaskStatusType.
Default seeded/project-created workflows now use:
- Backlog
- In Progress
- Blocked
- Review
- Done
Reordering capabilities
Sally now supports three distinct reorder behaviors:
- project status reorder, with the first status pinned
- board task reorder inside a target status
- project-wide task reorder without changing task status
The project-wide reorder path is exposed through:
- API:
POST /projects/:projectId/tasks/reorder - MCP:
project.tasks.reorder
UI changes
The task experience now includes:
- drag-and-drop task ordering in the project list view
- drag-and-drop status ordering in workflow settings
Blockedsurfaced across task and status management UI- task/project responses carrying canonical
positionvalues so the UI can render consistent order across list and board views