tack is a one-shot deploy CLI for Tailor Platform Static Website Hosting.
Important
This is an unofficial and experimental tool.
- One-shot deploy:
tack up <path>and the site is live - Accepts a directory (uploaded recursively) or a single file
homebrew tap:
$ brew install k1LoW/tap/tackmanually:
Download binary from releases page.
go install:
$ go install github.com/k1LoW/tack@latestIf you have already logged in with npx tailor-sdk login, just run:
$ tack up ./dist --workspace-id <WORKSPACE_ID>tack reads tokens from the Tailor SDK config (~/.config/tailor-platform/config.yaml). When the access token is expired it is refreshed automatically, and the refreshed token is written back to the SDK config (or the keyring, if the user is configured for keyring storage) so tailor-sdk and other tools stay in sync.
For CI, batch jobs, and other headless environments, tack accepts Platform machine-user credentials via the same environment variables the Tailor SDK CLI uses for tailor-sdk login --machineuser:
$ export TAILOR_PLATFORM_MACHINE_USER_CLIENT_ID=<client_id>
$ export TAILOR_PLATFORM_MACHINE_USER_CLIENT_SECRET=<client_secret>
$ tack up ./dist --workspace-id <WORKSPACE_ID>When either variable is present, tack skips the SDK config entirely and fetches an access token via the OAuth2 client_credentials grant. A partial pair (only one of the two set, including the common CI pattern of an injected-but-empty secret) is forwarded as-is and fails fast with requires both clientID and clientSecret, instead of silently falling back to whatever SDK token happens to be on disk. The SDK-config flow above is used only when neither variable is present.
Deploy a single file:
$ tack up resume.html --workspace-id <WORKSPACE_ID>The file is served at https://tack-<hash>.web.erp.dev/resume.html.
Use a different Static Website name (multiple sites per workspace):
$ tack up ./dist --workspace-id <WORKSPACE_ID> --name my-spaRestrict access by IP / CIDR at deploy time:
$ tack up ./dist --workspace-id <WORKSPACE_ID> \
--allowed-ip-addresses 203.0.113.10/32,198.51.100.0/24When --allowed-ip-addresses is omitted, any existing allowlist on the Static Website is preserved. Passing an empty value (--allowed-ip-addresses=) clears all restrictions.
Update settings without re-deploying:
$ tack set --workspace-id <WORKSPACE_ID> \
--allowed-ip-addresses 203.0.113.10/32
$ tack set --workspace-id <WORKSPACE_ID> --allowed-ip-addresses=tack set requires the Static Website to already exist (run tack up first to create it).
List Static Websites:
$ tack list --workspace-id <WORKSPACE_ID>
NAME URL ALLOWED IPS
tack https://tack-xxxx.web.erp.dev -
my-spa https://my-spa-yyyy.web.erp.dev 203.0.113.10/32tack ls is the alias.
Delete a Static Website:
$ tack delete --workspace-id <WORKSPACE_ID> --name my-spa
Delete static website "my-spa" in workspace ...? [y/N]: y
Deleted "my-spa"Skip the confirmation with -y / --yes, e.g. for CI. tack del is the alias.
Machine-readable output for CI / scripting:
$ tack up ./dist --workspace-id <WORKSPACE_ID> --output json
{
"name": "tack",
"workspace_id": "...",
"deployment_id": "...",
"url": "https://tack-xxxx.web.erp.dev",
"files": 12
}| Flag | Default | Description |
|---|---|---|
--workspace-id |
Tailor Platform workspace ID (required) | |
--name |
tack |
Static Website name (^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$) |
--allowed-ip-addresses |
IP / CIDR allowlist (comma-separated or repeated). Omit to preserve, --allowed-ip-addresses= to clear |
|
-o, --output |
text |
Output format: text or json |
- Resolves the access token from the Tailor SDK config (refreshing if expired)
- Calls
GetStaticWebsite. If the name does not exist yet, callsCreateStaticWebsite - Calls
CreateDeploymentto get a fresh deployment ID - Walks the target path, sends every file through the streaming
UploadFileRPC in parallel - Calls
PublishDeploymentand prints the resulting URL
Each tack up is a full replacement of whatever was previously published. The Tailor Platform stores files per deployment and Publish flips an active-deployment pointer, so every run uploads the complete site.
.DS_Store, Thumbs.db, and desktop.ini are skipped.
$ go build .