Skip to content

feat(ui): show each deployment's steps live as a timeline - #423

Open
PiquelChips wants to merge 5 commits into
feat/timeline-3-clifrom
feat/timeline-4-ui
Open

PiquelChips wants to merge 5 commits into
feat/timeline-3-clifrom
feat/timeline-4-ui

Conversation

@PiquelChips

@PiquelChips PiquelChips commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

While a deployment ran, the dashboard only showed a phase name that changed now and then. You couldn't see which steps were done or left, which step was slow, or roughly when it would finish.

Now each deployment has its own page, at …/environments/<environment>/deployments/<operation> (or …/previews/<preview>/deployments/<operation>), so its address can be shared, bookmarked, and left with Back. Its header shows the deployment's state, where it came from, its commit, revision and release, a segmented progress bar, the steps done and running, the time elapsed, about how long is left, and how long it usually takes. The tab title shows progress, then ✓.

Its Timeline tab is a waterfall of its steps, grouped by stage on one time axis. Each bar sits beside a dashed outline of its usual duration, slow steps are highlighted, and a line marks now. Steps left are placed where they should run; forecast steps are marked as such until the deployment plans them, and steps a new plan adds flash briefly. The running step's detail follows live, or a picked step stays shown until you click Follow live. Builds and jobs show the end of their output. The operation's events stream into a live feed beside it, which links to all of them. Details, Snapshot and Attempts, which used to be tabs of an expandable card, are the page's other tabs, and Restore sits in its header; restoring opens the new deployment's page.

The Deployments tab is now a list of rows, one per deployment: its state, title, commit, revision, flags and how long it ran, or while it runs, its steps done, time left and a mini progress bar. Selecting a row opens the deployment's page. While a deployment runs, the environment's Overview tab shows the same compact progress at the top, linking to its page. The latest deployment in the application's environment list, the overview's recent deployments, and a release's "Deployed to" list link to deployment pages too. Nothing is shown above the environment's tabs anymore. The plan preview lists its planned steps the same way as the waterfall.

Performance: the deployment page holds one EventSource for its timeline, closed once the operation has ended, and the feed one more. The environment page follows its running deployment with a single timeline stream, opened only while one runs, which both its Overview and its Deployments row read, so no compact element opens its own. A single one-second clock drives every running bar; the motion between ticks comes from CSS transitions. Rows are keyed per step and each has its own memo, so a snapshot only redraws the rows that changed. The feed keeps 50 events and draws bursts in one frame.

A deployment's page

Swarm task lanes and downtime aren't shown yet: the step detail has a marked place for them once the timeline records that data.

Proved in the browser on a dev instance: deployment rows and pages, the Overview card, and Stop/Start reruns (caught within one poll even when shorter than it), plus Playwright 74/74.

Reviewed with review-loop: 3 rounds with 3× Claude Opus 5.5 (GPT 6.1 Sol was out of credits; a Sol pass is still owed). Verdict: approved

Note

Written by Claude Opus 5.5 in Claude Code and reviewed by Claude Opus 5.5 (via T3 Code)

@coderabbitai

coderabbitai Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 14bf6795-5fa8-4655-bf2f-a6933ae374d3
Commits

Reviewing files that changed from the base of the PR and between 7e27229 and c7f36a6.

Files ignored due to path filters: 43

  • docs/images/accounts/accounts-page.png is excluded by !**/*.png
  • docs/images/accounts/grant-editor.png is excluded by !**/*.png
  • docs/images/accounts/new-api-token.png is excluded by !**/*.png
  • docs/images/accounts/passkeys.png is excluded by !**/*.png
  • docs/images/accounts/pending-links.png is excluded by !**/*.png
  • docs/images/accounts/sessions-and-tokens.png is excluded by !**/*.png
  • docs/images/applications/application-secrets.png is excluded by !**/*.png
  • docs/images/applications/build-output.png is excluded by !**/*.png
  • docs/images/applications/command-events.png is excluded by !**/*.png
  • docs/images/applications/environment-links.png is excluded by !**/*.png
  • docs/images/applications/environment-secrets.png is excluded by !**/*.png
  • docs/images/applications/environment-source.png is excluded by !**/*.png
  • docs/images/applications/environment-sync.png is excluded by !**/*.png
  • docs/images/applications/environments.png is excluded by !**/*.png
  • docs/images/applications/job-run.png is excluded by !**/*.png
  • docs/images/applications/jobs-tab.png is excluded by !**/*.png
  • docs/images/applications/links-tab.png is excluded by !**/*.png
  • docs/images/applications/preview-create.png is excluded by !**/*.png
  • docs/images/applications/preview-local.png is excluded by !**/*.png
  • docs/images/applications/previews.png is excluded by !**/*.png
  • docs/images/applications/repository-connect.png is excluded by !**/*.png
  • docs/images/applications/repository-webhook.png is excluded by !**/*.png
  • docs/images/applications/restore.png is excluded by !**/*.png
  • docs/images/applications/rollback.png is excluded by !**/*.png
  • docs/images/applications/service-git-source.png is excluded by !**/*.png
  • docs/images/applications/service-health-check.png is excluded by !**/*.png
  • docs/images/applications/terminal.png is excluded by !**/*.png
  • docs/images/applications/volume-mounts.png is excluded by !**/*.png
  • docs/images/getting-started/add-service.png is excluded by !**/*.png
  • docs/images/getting-started/create-account.png is excluded by !**/*.png
  • docs/images/getting-started/environment.png is excluded by !**/*.png
  • docs/images/getting-started/health-check.png is excluded by !**/*.png
  • docs/images/getting-started/new-application.png is excluded by !**/*.png
  • docs/images/getting-started/overview.png is excluded by !**/*.png
  • docs/images/networking/environment-visibility.png is excluded by !**/*.png
  • docs/images/networking/routes-tab.png is excluded by !**/*.png
  • docs/images/networking/webhook-card.png is excluded by !**/*.png
  • docs/images/operations/audit.png is excluded by !**/*.png
  • docs/images/operations/deployment-timeline.png is excluded by !**/*.png
  • docs/images/operations/destination.png is excluded by !**/*.png
  • docs/images/operations/errors.png is excluded by !**/*.png
  • docs/images/operations/notifications.png is excluded by !**/*.png
  • docs/images/operations/telemetry-grant.png is excluded by !**/*.png
Files selected for processing: 43

  • apps/piquelctl/src/commands.rs
  • apps/piquelctl/src/output/mod.rs
  • apps/piquelctl/src/output/timeline.rs
  • apps/piquelctl/tests/cli.rs
  • apps/piqueld-ui/Cargo.toml
  • apps/piqueld-ui/src/application.rs
  • apps/piqueld-ui/src/browser/dashboard.rs
  • apps/piqueld-ui/src/browser/format.rs
  • apps/piqueld-ui/src/browser/logs.rs
  • apps/piqueld-ui/src/browser/management/deployments.rs
  • apps/piqueld-ui/src/browser/management/environments.rs
  • apps/piqueld-ui/src/browser/management/mod.rs
  • apps/piqueld-ui/src/browser/management/navigation.rs
  • apps/piqueld-ui/src/browser/management/previews.rs
  • apps/piqueld-ui/src/browser/management/releases.rs
  • apps/piqueld-ui/src/browser/management/timeline.rs
  • apps/piqueld-ui/src/browser/mod.rs
  • apps/piqueld-ui/src/browser/observability.rs
  • apps/piqueld-ui/src/browser/stream.rs
  • apps/piqueld-ui/src/deployments.rs
  • apps/piqueld-ui/src/lib.rs
  • apps/piqueld-ui/src/timeline.rs
  • apps/piqueld-ui/styles/components.css
  • crates/piqueld-client/src/lib.rs
  • crates/piqueld-client/src/operations.rs
  • crates/piqueld-client/tests/transports.rs
  • crates/piqueld-core/src/observability/mod.rs
  • crates/piqueld-core/src/operation.rs
  • crates/piqueld-core/src/timeline.rs
  • docs/user/applications/restore.md
  • docs/user/applications/services.md
  • docs/user/dashboard.md
  • docs/user/operations/history.md
  • docs/user/reference/cli.md
  • tests/playwright/fixtures.ts
  • tests/playwright/screenshots/applications.spec.ts
  • tests/playwright/screenshots/docs.ts
  • tests/playwright/screenshots/operations.spec.ts
  • tests/playwright/tests/branches.spec.ts
  • tests/playwright/tests/deployments.spec.ts
  • tests/playwright/tests/editor.spec.ts
  • tests/playwright/tests/overview.spec.ts
  • tests/playwright/tests/restores.spec.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@PiquelChips
PiquelChips changed the base branch from feat/timeline-2-api to feat/timeline-3-cli November 10, 2026 15:25
@PiquelChips
PiquelChips force-pushed the feat/timeline-4-ui branch 2 times, most recently from 4d2d9b8 to 77b9162 Compare November 10, 2026 20:32
@PiquelChips
PiquelChips marked this pull request as ready for review November 10, 2026 20:33
@PiquelChips
PiquelChips force-pushed the feat/timeline-4-ui branch 2 times, most recently from 9cfd476 to 512df3a Compare November 10, 2026 22:13
@PiquelChips
PiquelChips added this pull request to stack #449 November 12, 2026 13:48
@PiquelChips
PiquelChips force-pushed the feat/timeline-4-ui branch 2 times, most recently from 76b9c04 to 5244d47 Compare November 13, 2026 15:00
While a deployment runs, its environment's page follows it above the tabs:
its state, a segment per step, the steps done and running, the time it has
run, about how long is left and how long it usually takes. Below, its steps
lie on one time axis by stage, each bar beside a dashed outline of its usual
duration, with the line of now; the steps left are placed where they should
run, forecast ones marked until the deployment plans them. The running step
is detailed, with the end of its output for builds and jobs, and the
operation's events arrive in a live feed. The tab title shows the progress,
then ✓. A deployment's Timeline tab shows the same steps, and Preview lists
the planned steps the same way.

Each open timeline holds one timeline stream, closed once the operation
ended, and one clock ticking every second while it runs. Rows are keyed by
step and read their own memo, so a snapshot only redraws the rows it
changed; bars and the line of now move through CSS transitions.

`Phase::label`, `Stage::label` and `StepKey::label` name steps in core, and
`Timeline::usual_ms` adds up the usual durations as `remaining_ms` does.
A running deployment no longer shows above its environment's tabs. Each
deployment has its own page instead, at
`…/environments/<environment>/deployments/<operation>` (or under
`/previews/`), so it can be linked, bookmarked and left with Back. Its
header has the deployment's state, origin, commit, revision and release,
then a segment per step, the steps done and running, the time elapsed,
about how long is left and how long it usually takes; the tab title
follows it. Its Timeline tab holds the waterfall, the shown step's detail
and the live events, which link to all of them; Details, Snapshot and
Attempts, the tabs of the old expandable card, follow, and Restore sits in
the header, opening the restoring deployment's page.

The Deployments tab lists a row per deployment, opening its page: its
state, title, commit, revision and flags, and how long it ran, or while
it runs, its steps done, time left and a segment per step. The Overview
tab shows the same progress while a deployment runs, linking to its page.
The overview's recent deployments, a release's environments and the
environment list's latest deployment link to deployment pages too.

The environment page follows its running deployment with one timeline
stream, opened only while one runs and shared by its Overview and its
Deployments row; the deployment page holds its own. `Progress::steps` and
`Progress::outlook` word progress for both.
Starting, stopping or reconciling an environment runs its latest operation
again under its ID. The Overview's progress card and the deployment page
stopped following it once its timeline ended, so they never showed the new
run. They now reconnect when the polled operation runs again, or ran again
between two polls, which a newer attempt shows, and the deployment page's
live events resume after the last one they showed.
…mezone

The screenshot helper stamped live events from the documented date parsed
in the test runner's local time, so a runner outside UTC drew other times
than CI and recorded screenshots CI found outdated. It now starts from a
fixed instant.
Rust 1.100's clippy flags `map(..).unwrap_or_default()`, which the
deployment timeline used once.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Needs Triage

Development

Successfully merging this pull request may close these issues.

1 participant