{{define "app_releases"}}{{template "top" .}} {{if .Flash}}{{end}} {{if .FlashErr}}{{end}} {{template "appnav" .}}

{{.DeploymentsCopy.History}}

{{template "accountreviewbanner" .}} {{with .ReleaseSummary}}

{{$.StatusCopy.ObservedLabel}}

{{if not .Deployment.HasRoutes}}

{{$.StatusCopy.NoInstances}}

{{else if not .Deployment.HasReportable}}

—

{{else if not .Deployment.HasReportedVersion}}

{{$.StatusCopy.NoVersion}}

{{else}}

{{.Deployment.ReportingText}}

{{if .Deployment.UnknownCount}}

{{$.StatusCopy.Partial}}

{{end}} {{end}} {{if .NextVersion}}

{{.CandidateText}}

{{if and $.CanPromote $.IsOwner}}
{{else if $.CanPromote}}

Only an account owner can make it live.

{{end}} {{end}}
{{end}} {{if .RetentionKeep}}

Retention: the newest {{.RetentionKeep}} releases are kept; older releases not promoted, tagged, or recently shipped are pruned automatically.

{{end}} {{if .Versions}}
All versions ({{len .Versions}})
{{if and .CanPromote (not .Detail.OneChannelPipeline)}}{{end}} {{range .Versions}} {{if .Err}} {{else}} {{end}} {{if and $.CanPromote (not $.Detail.OneChannelPipeline)}}{{end}} {{end}}
VersionLabelKindBuiltPromote
{{.Version}}{{if .Tag}} {{.Tag}}{{end}}{{.Err}}{{if .Label}}{{.Label}}{{end}}{{if .Notes}}
notes
{{.Notes}}
{{end}}{{if and (not .Label) (not .Notes)}}—{{end}}
{{.Kind}} {{if .BuiltAt}}{{.BuiltAt}}{{else}}—{{end}}
{{else}}

Nothing shipped yet. Ship your first release from your repo:

carlos ship --app {{.Detail.App}} --version $(git rev-parse --short HEAD) --target linux-arm64 <binary>
carlos ship --app {{.Detail.App}} --kind static --version v1 <site-dir>

Releases appear here once shipped, and get promoted to channels from this page.

{{end}} {{if .Detail.OneChannelPipeline}}
Test versions and rolling back {{template "solorollback" .}} {{template "canaries" .}} {{template "apptags" .}}
{{else}}
Release pipeline — channels, test versions, and the promotion ladder {{template "ladder" .}}

Channels

{{if .Detail.Channels}}
{{range .Detail.Channels}} {{if .Err}} {{else}} {{end}} {{end}}
ChannelVersionPromotedGoes live
{{.Name}}{{.Err}}{{.Version}}{{if .Tag}} {{.Tag}}{{end}} {{ago .PromotedAt}} {{if .BakedUntil.IsZero}}live now{{else}}in {{until .BakedUntil}}{{end}}{{if .FastTrack}} · delay skipped{{end}}{{if and $.CanPromote .HasHistory (not .Err) (or $.Detail.Pipeline $.IsOwner (ne .Name "stable"))}}
{{end}}

Go-live times are estimates — each copy keeps its own clock. Rollbacks skip the delay.

{{else}}

No channels yet — ship a release, then promote it below to create the first one.

{{end}} {{template "canaries" .}} {{template "apptags" .}}
{{end}} {{if .Detail.OneChannelPipeline}}

This app has one channel — carlos deploy ships straight to it, with no promotion step in between. Set up a pipeline to add more.

{{end}} {{if not .CanPromote}}

Deploys are unavailable on this console — it has no signing key.

{{end}} {{template "bottom" .}}{{end}} {{/* The canary section and the tag list are NOT channel vocabulary, so both app shapes get them: canary/* lives outside the pipeline entirely and is always allowed (release pipelines v2 §2), and a tag names a release, not a rung. Shared through one definition so the two shapes cannot drift into different canary controls. */}} {{define "canaries"}}

Canaries

{{if .Detail.Canaries}}
{{range .Detail.Canaries}} {{if .Err}} {{else}} {{end}} {{end}}
NameChannelVersionCreatedURL
{{.Name}} {{.Channel}}{{.Err}}{{.Version}} {{ago .PromotedAt}} {{if .Hosts}}{{range .Hosts}}{{.}} {{end}}{{else}}no host yet{{end}}{{if $.CanPromote}}
{{end}}
{{else}}

No test versions — a test version is a private copy serving one chosen build immediately, with no safety delay.

{{end}} {{if and .CanPromote .Versions}}

Creates canary/<name> — a test version serving the chosen build immediately, no delay. It gets its own URL from an address that follows it:

{{if .AttachEnable}}
{{.AttachEnable}}
{{.AttachCmd}}

This app has no addresses yet, so the first line sets one up under this account's platform subdomain. It comes live within a couple of minutes.

{{else}}
{{.AttachCmd}}

The address comes live within a couple of minutes.

{{end}} {{end}}{{end}} {{define "apptags"}}{{if .Tags}}

Tags

{{range .Tags}}
{{.Version}} — {{.Release}}{{if .Actor}} · {{.Actor}}{{end}}
{{.Changelog}}
{{end}} {{end}}{{end}} {{/* The one-channel app's rollback control. A rollback is not channel vocabulary — it is the pointer write that puts the previous build back, and a one-channel app is exactly the app with no promotion step to fall back on when a bad build lands. It names no channel on screen (the name rides in the hidden field the door needs), draws no table and offers no promote; the ladder stays hidden. RollbackChannels is empty until the channel actually has somewhere to go back to. */}} {{define "solorollback"}}{{if .CanPromote}}{{with .Detail.RollbackChannels}}

Rolling back

Puts the previous build back in front of everyone straight away — rollbacks skip the safety delay. You'll be asked to confirm, and told which build it lands on.

{{range .}}
{{end}} {{end}}{{end}}{{end}}