Cloud Console Own Projects

The console's real screens, each with numbered pins on its buttons and fields. Under each screen, a table gives every pin's rule, when it shows or is disabled, and the API route it calls; then the user stories it must pass, in Given, When and Then. A pin is a link to its row. Everything here is read from the code and the API contract.

Rules every screen keeps

The screens

1. Dashboard

/dashboard

The first page after sign-in: how the projects you may read did in the last 24 hours. Its data comes from one call, which reads D1 only. Every label, and the order and length of every list, is the API's.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The dashboard: the summary tiles, then Failing jobs, Backlogs, Slowest jobs, Queues, Jobs and Projects. 1 2 3 4 5 6 7 8 9 10 11 12
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Project pickerLists the projects you may see. Choosing one opens its Queues page.On the dashboard it reads Choose a project. On a project's own page (Queues, Jobs, API keys, Secrets, Alerts, Export and import) a new choice opens the same page of the other project.Every signed-in page.GET /api/projects
2RefreshAsks for the dashboard again and draws it anew.Disabled and busy while its request runs, so a second click sends nothing. No queue or job object is asked, however many there are.Once the first answer has come.GET /api/dashboard
3Last 24 hoursThe failed job runs and failed task attempts across your projects.The API's label, such as 3 failed job runs and 12 failed task attempts in the last 24 hours, or No failures in the last 24 hours.Always.GET /api/dashboard (failures)
4Free-plan tilesToday's use of each free limit: Worker requests, Durable Object requests, D1 rows read and D1 rows written.Counted per UTC day. The chip is OK, Near the limit from 80%, or Over the limit at 100%. Over a limit every queue is held and new tasks and job runs are refused until 00:00 UTC, and a red line says until when.Every signed-in person: they are free-plan totals, not secrets.GET /api/dashboard (usage)
5CronWhen the console's every-minute cron last ran, and which of its parts failed.Running, Parts failing, Not run yet, or Stale once no run was noted for 10 minutes. A run is noted at most every 5 minutes, so the time may be about 5 minutes behind.Always; the same for everyone.GET /api/dashboard (cron)
6Failing jobsThe jobs whose last run failed, newest first, each linking to its job.At most 20. With none: No job's last run failed.Always; empty state when none.GET /api/dashboard (failing)
7BacklogsThe queues with tasks waiting, the most first.At most 10. Each says how many wait and how long ago the oldest was due, as its queue last noted it (at most about 15 minutes old while the queue is busy). With none: Nothing waiting in any queue.Always; empty state when none.GET /api/dashboard (backlogs)
8Slowest jobsThe 5 jobs whose final attempt took longest in the last 24 hours.With none: No job ran in the last 24 hours.Always; empty state when none.GET /api/dashboard (slowest)
9QueuesEach queue's share of attempts that succeeded, its failed attempts, and what waits.The lowest success rate first, then the most attempts, then by name; at most 50. With no attempts the rate reads No attempts in 24 hours, otherwise like 98.5% of 200.Always.GET /api/dashboard (queues)
10A queue's linkOpens that queue's page.The project and the queue travel in the address.Every row.Goes to /queue?project=shop&queue=orders
11JobsEach job's success rate over its runs, its failed runs and its last run.The same order and cap as Queues. Last run is a chip: Success, Failed (503), Skipped (daily quota) or Has not run yet.Always.GET /api/dashboard (jobs)
12ProjectsOne line per project with its failures in the last 24 hours, linking to its Queues page.A person with no project at all sees You have no projects yet. An admin gives you access to one; it shows here.Always.GET /api/dashboard (projects)

User stories and acceptance criteria

  1. Only my projects count

    Given a member who may read shop and no other project

    When they open the dashboard

    Then only shop's failures, queues and jobs are counted and listed; an admin sees every project.

  2. The cron has stopped

    Given the cron's last run was noted 25 minutes ago

    When the dashboard loads

    Then the Cron tile's chip reads Stale and its line reads Last run noted 25 minutes ago: the cron may have stopped.

  3. Nothing is failing

    Given no job's last run failed

    When the dashboard loads

    Then Failing jobs shows No job's last run failed. in place of a table.

  4. The load fails

    Given the dashboard request fails

    When the page opens

    Then it shows its heading, the error and Try again in place, never a blank page.

Back to the list of screens

2. Projects

/projects

The projects you may see, a link to each one's pages as your permissions allow, and the maintenance switches that hold dispatch during a deploy.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Projects page: Create project, Hold every project, and a row per project with its permissions, page links and maintenance switch. 1 2 3 4 5 6 7 8
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Create projectOpens the Create a project panel: a Project name and Create.The name is lower-case letters, digits and dashes, for example flowdeck. Every project has the queue default from the start. Cancel closes the panel and gives the focus back to this button.Shown with createProject in /api/me's allowed actions: admins only.POST /api/projects (admin)
2Hold every projectThe whole console's maintenance switch. It asks first: Hold dispatch for the whole console?While it is on, no task is sent and no job runs; new tasks are still accepted and wait, and scheduled runs are skipped and logged. A switch changes at most once every 10 seconds. It reads Resume every project while on.Admins only, from the console switch's allowedActions (maintenanceOn or maintenanceOff).PUT /api/maintenance { on }
3Project nameOpens the project's Queues page.Names travel in the query string; there is no single-page fallback.Every project you may read.Goes to /queues?project=flowdeck
4Your permissionsYour grants in this project, as plain names.Eight permissions: read, create, update, delete, pause, run, keys and secrets. An admin may do everything.Always.GET /api/projects (permissions)
5Queues, Jobs, SecretsOpen the project's Queues, Jobs and Secrets pages.Secrets shows names only; adding or changing one needs the secrets permission.For anyone who may read the project.Go to /queues, /jobs, /secrets with ?project=
6API keys, AlertsOpen the project's API keys and Alerts pages.Each link is a permission of the same name's page: API keys needs keys, Alerts needs update.API keys with the keys permission; Alerts with update.Go to /keys, /alerts with ?project=
7Hold dispatchThis project's maintenance switch. It asks first, Hold dispatch for flowdeck?, then loads the page again so every banner says the new state.No task is sent and no job runs until it is resumed; new tasks are still accepted and wait. At most one change in 10 seconds. An app may switch it with its API key, but a hold a person turned on only a person turns off.From the project's maintenance allowedActions: the pause permission. Reads Resume dispatch while on.PUT /api/projects/{p}/maintenance { on }
8Account menuYour account, Sign out, and Sign out on every device; and the console's version.Sign out on every device ends every session; your passkeys stay. Neither sign-out counts against the 120 changes an hour.Every signed-in page.POST /auth/sign-out, POST /auth/sign-out-all

User stories and acceptance criteria

  1. A member cannot make projects

    Given a member, not an admin

    When they open Projects

    Then Create project and Hold every project are not shown, and POST /api/projects answers 403 for them.

  2. Hold a project for a deploy

    Given I have the pause permission in flowdeck

    When I click Hold dispatch and confirm

    Then every page shows Maintenance is on for flowdeck: its queues and jobs are held, and tasks an app adds meanwhile are accepted and wait.

  3. Two switches too close together

    Given flowdeck's switch changed 5 seconds ago

    When I switch it again

    Then the API answers 429: A maintenance switch changes at most once every 10 seconds; try again shortly.

  4. Links follow permissions

    Given a member without the keys permission in shop

    When they open Projects

    Then shop's row has no API keys link.

Back to the list of screens

3. Queues

/queues?project=shop

The project's queues with Cloud Tasks' columns, 25 a page. A row's menu holds only the actions its allowedActions list.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Queues list of the project shop: four queues with their state, counts and rate limits, and a menu per row. 1 2 3 4 5 6 7 8 9
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Create queueOpens Create queue.A project has at most 100 queues; one more is 409 A project has at most 100 queues.When the list answers createQueue: the create permission.Goes to /queue-edit?project=shop
2RefreshAsks for the same page of queues again.Each queue's counts cost a request to its object, so a page is charged 10 rows per queue to your read budget. While a page is asked, Refresh and the page buttons are disabled.Always.GET /api/projects/{p}/queues?pageToken=
3Queue nameOpens the queue's page, on its Tasks tab.A name is 1 to 63 lower-case letters, digits and dashes, starting with a letter, and cannot change.Every row.Goes to /queue?project=shop&queue=default
4StateThe queue's state, as the API labels it.Running, Paused, or Held until 00:00 UTC (daily limit) for a low-priority queue held near a free limit. A paused queue still takes tasks; they wait.Always.stateLabel
5Tasks and countsTasks waiting, running, added and completed in the last minute, and failed.Counted by the queue's own object at the time of the answer.Always.stats
6Max rate, Max concurrentThe queue's rate limits: dispatches a second, and calls at once.More than 0 and at most 500 a second; 1 to 5,000 at once. Set on Create or Edit queue.Always.maxDispatchesPerSecond, maxConcurrentDispatches
7Menu of defaultEdit, Pause and Purge. There is no Delete.The default queue cannot be deleted; the API refuses it too: 409 The default queue cannot be deleted.Edit with update; Pause or Resume with pause, by state; Purge and Delete with delete.POST …/queues/{q}/pause, /resume, /purge
8Menu of ordersEdit, Resume, Purge and Delete. Purge and Delete ask first.Purge deletes every queued task; running ones finish. Delete removes the queue and its tasks, and is 409 while a job adds tasks to it or another queue forwards its failed tasks to it.From the row's allowedActions.POST …/purge, DELETE /api/projects/{p}/queues/{q}
9orders-deadA queue that orders forwards its failed tasks to.While another queue names it, deleting it is 409 Queue orders forwards its failed tasks to this queue; change that first.Every row.Goes to /queue?project=shop&queue=orders-dead

User stories and acceptance criteria

  1. The default queue stays

    Given the default queue's row

    When I open its menu

    Then it offers Edit, Pause and Purge but no Delete, and a delete sent anyway is 409 The default queue cannot be deleted.

  2. Purge a queue

    Given orders holds 6 queued tasks

    When I choose Purge and confirm Purge orders?

    Then every queued task is deleted, running ones finish, and the notice reads Purged 6 tasks from orders.

  3. More than one page

    Given a project with 30 queues

    When the list loads

    Then 25 show with Next page; Next page asks with the answer's nextPageToken, and Previous page goes back to the token before.

  4. Read only

    Given a member with only the read permission

    When they open Queues

    Then Create queue is not shown and no row has a menu: the rows list no actions.

Back to the list of screens

4. Queue, Tasks tab

/queue?project=shop&queue=orders

A queue as Cloud Tasks shows it: the toolbar in Google's order, the summary strip, and five tabs. Each button is one the queue's allowedActions list.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The queue orders on its Tasks tab: the toolbar, the summary strip, the tabs, the filter, the column chooser and six queued tasks. 1 2 3 4 5 6 7 8 9 10 11 12 13 14
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Create HTTP taskOpens Create a task for this queue.A paused or held queue takes new tasks; they wait.createTask: the create permission.Goes to /task-new?project=shop&queue=orders
2EditOpens Edit orders: every setting but the name.The name cannot change.edit: the update permission.Goes to /queue-edit?project=shop&queue=orders
3ResumeStarts sending the queue's due tasks again. It reads Pause while the queue runs.Pausing a paused queue is fine. Tasks still join a paused queue and wait.pause or resume, by state: the pause permission.POST /api/projects/{p}/queues/{q}/resume (or /pause)
4DeleteDeletes the queue and its tasks after Delete orders?, then goes back to Queues.Never for default. 409 while a job adds tasks to it or another queue forwards to it. It cannot be undone.delete: the delete permission.DELETE /api/projects/{p}/queues/{q}
5PurgeDeletes every queued task after Purge orders?.Running tasks finish. The notice says how many, such as Purged 6 tasks from orders.purge: the delete permission.POST /api/projects/{p}/queues/{q}/purge
6Delete taskDeletes the ticked tasks in one request, after a confirm that names them.1 to 50 different names. A queued or failed task is deleted; one running or done is refused (The task is running or already done) and the rest go on.Disabled until a row is ticked on the Tasks tab. Shown with deleteTasks: the delete permission.POST …/queues/{q}/tasks/batch-delete { tasks }
7Run taskRuns the ticked tasks now, in one request.A queued task becomes due now; a failed one is retried with its name and logs, attempts from 0. The notice is the API's label, such as Ran 2 tasks, with ; 1 could not be when some were refused.Disabled until a row is ticked. Shown with runTasks: the run permission.POST …/queues/{q}/tasks/batch-run { tasks }
8Tasks tabThe queue's tasks, 50 at a time, with Load more.The tab a plain address opens; the chosen tab stays in the address (?tab=). Queued tasks come in due order, then the rest newest first. A plain list is at most 120 an hour per person per queue, 240 per queue.Always.GET …/queues/{q}/tasks?pageSize=50
9FilterShows only the tasks whose name or URL holds the text, ignoring case.1 to 100 characters. The API filters the queue's newest 500 tasks and says so when it holds more. At most 10 filtered or sorted lists an hour per person, and 60 per queue.Always.GET …/tasks?filter=
10ColumnsHides or shows State, ETA, Create time, Task type, Method/URL, Retries, Executions and Last response.Display only: no request. Name always shows.Always.None
11Select every task shownTicks every row shown, or clears them all.Ticking any row enables Delete task and Run task. A ticked row that leaves the list on a reload is unticked.Always.None
12Sort by ETASorts the list through the API; a second click reverses it.Name, ETA, Create time, Method/URL, Retries and Executions sort. ETA puts done tasks last. A sorted list counts as a filtered one.Always.GET …/tasks?sort=eta (or -eta)
13Task nameOpens the task and its attempts.The name is cut to its column and whole on hover.Every row.Goes to /task?project=shop&queue=orders&task=order-1001
14Row menuRun now, Retry or Delete for this one task.Run now while queued and Retry when failed (run); Delete while queued or failed (delete), after Delete order-1001?.From the task's allowedActions.POST …/tasks/{t}/run, DELETE …/tasks/{t}

User stories and acceptance criteria

  1. Run two ticked tasks

    Given no row is ticked, so Delete task and Run task are disabled

    When I tick order-1001 and order-1002 and click Run task

    Then one request sends both names to batch-run and the notice reads Ran 2 tasks.

  2. One task in a batch is refused

    Given two ticked tasks, one of them running

    When I click Delete task and confirm

    Then the other is deleted and the red notice reads Deleted 1 task; 1 could not be. with that task's name and The task is running or already done.

  3. Too many filtered lists

    Given I filtered or sorted this queue's tasks 10 times this hour

    When I click Filter again

    Then the API answers 429 At most 10 filtered or sorted task lists an hour; try again later and the list stays as it was.

  4. No run permission

    Given a member without the run permission

    When they open the queue

    Then Run task is not in the toolbar and no row menu offers Run now or Retry.

Back to the list of screens

5. Queue, Configuration tab

/queue?project=shop&queue=orders&tab=configuration

The same queue on its Configuration tab: the settings grouped as Google groups them, worded by the API. The other tabs are pinned here too.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The queue orders on its Configuration tab: Location, Rate limits, Retry parameters, Logging, Priority, Dead letter and History. 1 2 3 4 5 6 7 8 9 10 11 12 13
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1State chipThe queue's state beside its name.Running, Paused or Held until; the colour follows the state.Always.GET /api/projects/{p}/queues/{q} (stateLabel)
2Summary stripTasks in queue, Tasks running, Completed in the last minute, Location and Type.Location is Global (Cloudflare) and Type Push for every queue.Always.stats, location, type
3Metrics tabCharts of the tasks completed and leased, the queue depth, the attempts and the tasks added.Ranges 1 hour (the default), 6 and 12 hours, 1, 2, 4, 7, 14 and 30 days. Create alerting policy opens Alerts.Always.GET …/queues/{q}/metrics?range=
4Logs tabEvery attempt logged: time, task, code, duration, error.While logging is failures only, a banner says so, with Turn on success sampling. Failed attempts are kept 7 days.Turn on success sampling shows with edit: the update permission.GET …/queues/{q}/logs; PATCH …/queues/{q} { logging: "sample" }
5Configuration tabThe settings, read only.Every label and value is the API's; the times are formatted by the page.Always.configuration
6Failed tabThe tasks that failed for good, with Retry all and Delete all.Failed tasks are kept 7 days. Delete all asks first: Delete every failed task?Retry all with retryFailed (run); Delete all with deleteFailed (delete).GET …/tasks?state=failed, POST …/failed/retry, DELETE …/failed
7LocationWhere the queue runs.Always Global (Cloudflare).Always.configuration
8Rate limitsMax rate, Max concurrent and Max burst size.Max burst size is worked out, never set: the larger of 1 and the rate rounded down, so 20/s gives 20.Always.maxBurstSize
9Retry parametersMax attempts, Min interval, Max interval, Max doublings, Max retry duration, Status codes not retried.Max attempts -1 reads Unlimited; Max retry duration 0s reads Unlimited; no codes reads None.Always.configuration
10LoggingWhat is kept of the attempts.Failed attempts only, or a share of the successful ones too. Failed attempts are always kept.Always.logging, logSamplePercent
11PriorityNormal or Low.Low queues are held first near a free limit, until the next UTC day.Always.priority
12Dead letterThe queue that tasks failing for good are copied to, or None.A copy is made once and counts against the daily quota; the original stays on the Failed tab.Always.deadLetterQueue
13HistoryHeld until, Created and Last updated.Held until reads a dash unless the queue is held.Always.heldUntil, createdAt, updatedAt

User stories and acceptance criteria

  1. Burst follows the rate

    Given orders sends at most 20 a second

    When I open its Configuration tab

    Then Rate limits shows Max rate 20/s, Max concurrent 50 and Max burst size 20.

  2. Turn on success sampling

    Given the queue logs failed attempts only and I have the update permission

    When I open Logs and click Turn on success sampling

    Then the page sends { logging: "sample" } and says Success sampling is on for orders.

  3. Retry every failed task

    Given the Failed tab lists three failed tasks and I have the run permission

    When I click Retry all

    Then they are sent again and the notice reads Retried failed tasks: 3.

Back to the list of screens

6. Task

/task?project=shop&queue=orders&task=order-1001

One task and its attempts (the inspector). Headers and body show while the task waits or runs; the API drops them once it is done.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The task order-1001, queued: Run now, Delete and Refresh, then the Task, Call and Attempts panels. 1 2 3 4 5 6 7 8 9 10
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1State chipThe task's state.Queued, Retrying (attempt 3), Running, Succeeded, Failed or Deleted.Always.GET …/queues/{q}/tasks/{t} (stateLabel)
2Run nowMakes a queued task due now. On a failed task it reads Retry and retries it.A retry keeps the name and logs, attempts from 0. 409 while running or done. The notice: order-1001 runs now.run while queued, retry when failed: the run permission.POST /api/projects/{p}/queues/{q}/tasks/{t}/run
3DeleteDeletes the task after Delete order-1001?.Only while queued or failed; 409 The task is running or when it is already done.delete: the delete permission.DELETE /api/projects/{p}/queues/{q}/tasks/{t}
4RefreshReads the task again.Disabled and busy while it runs.Always.GET …/tasks/{t}
5TaskSchedule time, attempts, first and last attempt, last response, attempt deadline, created and done.A dead-letter copy also shows Forwarded from, linking to the original.Always.GET …/tasks/{t}
6Last responseThe last attempt's error, or its status code.An answer that is never retried ends with why, such as 404 Not Found; stopped: 404 is not retried.A dash before the first attempt.lastError, lastStatusCode
7CallMethod, URL, auth, headers and body.Headers and body are sealed while the task waits, and dropped once it is done: Dropped once the task was done.Always.GET …/tasks/{t}
8AuthThe auth option and the name it uses.A secret's name or a service account's email, never a value.Always.auth
9BodyThe body as text.At most 100 KB; sent as it is.While the task waits or runs.body
10AttemptsEach attempt: its time, duration, status or error kind, and the first 1 KB of the answer.Newest first, 50 a page. Failed attempts are always kept; the newest 10 per task. Empty: No attempts yet.Always.GET …/tasks/{t}/attempts

User stories and acceptance criteria

  1. Run a queued task now

    Given a queued task due later, and the run permission

    When I click Run now

    Then it becomes due now and the notice reads order-1001 runs now.

  2. Retry a failed task

    Given a task that failed for good

    When I open it

    Then the first button reads Retry, and clicking it retries the task under the same name, attempts from 0.

  3. A finished task

    Given a task that succeeded

    When I open it

    Then Headers and Body read Dropped once the task was done and no Run now or Delete is offered.

Back to the list of screens

7. Create queue

/queue-edit?project=shop

Create queue, or Edit queue with every setting. The form starts from the API's defaults and sends what was typed; each refused field shows its message beside it.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

Create queue: Name, Rate limits, Retries, Logs and priority, Dead letter, then Create and Cancel. 1 2 3 4 5 6 7 8 9 10 11 12 13 14
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Queue nameThe new queue's name.1 to 63 lower-case letters, digits and dashes, starting with a letter; unique in the project; it cannot change. Taken: 409 A queue named orders exists in this project.On Create only; Edit has no name field.name
2Max dispatches per secondHow many tasks a second the queue sends.More than 0, at most 500. Default 500.Always.maxDispatchesPerSecond
3Max concurrent dispatchesHow many calls may run at once.A whole number, 1 to 5,000. Default 1,000.Always.maxConcurrentDispatches
4Max attemptsHow many attempts a task gets.The first attempt counts. -1 is unlimited, else 1 to 1,000. Default 100.Always.maxAttempts
5Max retry durationHow long after its first attempt a task may still be retried.Whole seconds up to 30 days, typed as 90s, 5m or 1h. 0s is unlimited, the default.Always.maxRetryDuration
6Min backoffThe first wait between retries.0.1s to 24h, and at most Max backoff: minBackoff is at most maxBackoff. Default 0.1s.Always.minBackoff
7Max backoffThe longest wait between retries.0.1s to 24h. Default 1h.Always.maxBackoff
8Max doublingsHow many times the wait doubles before it grows evenly.0 to 16. Default 16.Always.maxDoublings
9Status codes not retriedAnswers that will never succeed: the task fails at once.0 to 50 different codes from 300 to 599, typed as 400, 404. Default 400, 401, 403, 404, 410, 422. Others, timeouts and network errors are retried; Retry-After is honoured.Always.noRetryStatuses
10LoggingFailed attempts only, or a sample of the successful ones too.Failed attempts are always kept. Default failed attempts only.Always.logging
11Successful attempts kept (%)The share of successful attempts logged.1 to 100. Default 100. Used with the sample setting only.Always.logSamplePercent
12PriorityNormal, or Low (held first near a free limit).A low queue is held until the next UTC day when a free limit is near. Default Normal.Always.priority
13Dead-letter queueAnother queue of the project where tasks that fail for good are copied, or None.Refused: the queue itself (A queue cannot forward its failed tasks to itself), a queue that is not in the project, or a loop (Forwarding to b would loop back: b → c → a).Always; the list is every queue of the project.deadLetterQueue; the list from GET …/queues?view=names
14CreateMakes the queue and opens its page, which says Created the queue … once. On Edit it reads Save.Nothing is checked on the page: the API checks every field and answers a message per field.Create with the create permission; Save with update.POST /api/projects/{p}/queues or PATCH …/queues/{q}

User stories and acceptance criteria

  1. Backoff the wrong way round

    Given Min backoff 2h and Max backoff 1h

    When I click Create

    Then nothing is made and Min backoff shows minBackoff is at most maxBackoff.

  2. A forwarding loop

    Given queue b forwards to c, and c to a

    When I set a's dead-letter queue to b and save

    Then it is refused beside Dead-letter queue: Forwarding to b would loop back: b → c → a.

  3. The form starts from the defaults

    Given a new queue

    When the form opens

    Then it shows 500, 1000, 100, 0s, 0.1s, 1h, 16, the six status codes, Failed attempts only, 100, Normal and None, as GET /api/defaults/queues answers them.

Back to the list of screens

8. Create a task, and From a file

/task-new?project=shop&queue=orders

Create HTTP task: an optional name and schedule time, the call and the attempt deadline. Under it, From a file makes up to 50 tasks in one request.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

Create a task: Task, Target, Deadline, Create and Cancel, then the From a file panel with Download a sample, Tasks file and Create tasks. 1 2 3 4 5 6 7 8 9 10 11 12
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Task nameThe task's name, or empty.1 to 500 letters, digits, _ and -. Left empty, the queue names it. Refused with 409 while the queue remembers it: A task named x is in this queue, or succeeded or was deleted within the last day.Always; optional.name
2Schedule timeWhen the task is due, in your own time zone.Sent as ISO 8601 with Z. Empty or past is now; at most 30 days ahead: scheduleTime is at most 30 days ahead.Always; optional.scheduleTime
3URLWhere the call goes.http:// or https://, at most 2,048 characters; private and local addresses are refused. With a credential, it must be at one of that secret's allowed origins.Always; required.url
4HTTP methodPOST, GET, HEAD, PUT, DELETE, PATCH or OPTIONS.Default POST.Always.method
5Add a headerAdds a name and value row, with Remove.At most 50. A name is letters, digits, - and _; Authorization, Host and the other protected headers cannot be set.Always.headers
6BodyThe body, sent as it is, as text.At most 100 KB. None with GET or HEAD: A GET or HEAD request has no body.Always; optional.body
7AuthNone, HMAC signature, Basic auth, Bearer token, OIDC token or OAuth token.A secret is picked by name from the project's secrets of that kind; OIDC takes a service account and an audience. Basic, Bearer and OAuth go to https:// only.Always; the secret and OIDC fields show for their option.auth; the lists from GET …/secrets, GET …/service-accounts
8Attempt deadlineHow long one attempt may take.15s to 15m. Default 3m.Always.attemptDeadline
9CreateMakes the task and opens its page, which says Created the task … once.Counts against the project's daily quota: over it, 429 with code quota and nothing is added.The create permission.POST /api/projects/{p}/queues/{q}/tasks
10From a fileUp to 50 tasks at once, from a JSON file { "tasks": [ … ] }.Each task has this form's fields; only url is required. Shown with the form once it has loaded.Always.None
11Download a sampleSaves cloud-console-tasks-sample.json.The page's own text, no request. Its two tasks call https://example.com/ as soon as they are made, so change them first.Always.None
12Create tasksPosts the file chosen in Tasks file, as it is, in one request.A file that is not JSON is said so without a request. The file is checked whole: one mistake and nothing is made. The quota is counted for the whole file. Each 10 tasks count as one of your 120 changes an hour. Once tasks were made the file is let go.The create permission.POST …/queues/{q}/tasks/batch-create { tasks }

User stories and acceptance criteria

  1. A mistake in the second task

    Given a file whose second task has no url

    When I click Create tasks

    Then nothing is made and the message lists tasks.1.url with url is required: an http:// or https:// URL.

  2. A name the queue remembers

    Given a file of 3 tasks, one named like a task that succeeded an hour ago

    When I click Create tasks

    Then the other two are made, the status line reads Created 2 tasks; 1 could not be, and the refused task is listed with why.

  3. Not a JSON file

    Given I chose a text file that is not JSON

    When I click Create tasks

    Then no request is sent and the page says notes.txt is not a JSON file.

  4. Too far ahead

    Given a schedule time 40 days from now

    When I click Create

    Then nothing is made and Schedule time shows scheduleTime is at most 30 days ahead.

Back to the list of screens

9. Jobs

/jobs?project=shop

The Jobs list as Cloud Scheduler's. The filter, the columns and the sort are display only, over the rows the API gave. The toolbar acts on the ticked jobs, calling each job's own route once per job.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Jobs list of shop: Create job, the toolbar for ticked jobs, the filter, the column chooser and three paused jobs. 1 2 3 4 5 6 7 8 9 10 11 12 13
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Create jobOpens Create a job.A project has at most 200 jobs.When the list answers createJob: the create permission.Goes to /job-edit?project=shop
2RefreshReads the jobs again.The jobs come whole, not a page at a time.Always.GET /api/projects/{p}/jobs
3Force runRuns each ticked job now, besides its schedule.Each run counts against the daily quota; over it, 429. The notice says how many were done and the first refusals.Shown when some job allows forceRun (run); works when every ticked job does.POST …/jobs/{j}/run, once per job
4EditOpens Edit for the ticked job.One job only.Enabled with exactly one ticked job that allows edit (update).Goes to /job-edit?project=shop&job=…
5CopyOpens the create form with the ticked job's settings and an empty name.There is no copy route: the form posts a new job.Enabled with exactly one ticked job that allows copy (create).Goes to /job-edit?project=shop&copy=…
6ResumeResumes each ticked job. Pause shows when some job is enabled.All three jobs here are paused, so only Resume shows.pause or resume, by state: the pause permission.POST …/jobs/{j}/resume (or /pause)
7DeleteDeletes the ticked jobs after a confirm that names them.The jobs and their run history are deleted. It cannot be undone.delete: the delete permission.DELETE /api/projects/{p}/jobs/{j}, once per job
8Filter jobsNarrows the rows as you type.Matches the name, description, schedule, time zone, target, state and last run. No request.Always.None
9ColumnsHides or shows every column but Name.Display only.Always.None
10Select every job shownTicks every job the filter shows.The toolbar stays disabled until a job is ticked.Always.None
11Sort by Status of last executionSorts the rows; a second click reverses.Every column sorts, over the rows already answered.Always.None
12Job nameOpens the job's page on its Logs tab.A name is 1 to 100 letters, digits, _ and -.Every row.Goes to /job?project=shop&job=homepage-check
13Row menuForce run, Pause or Resume, Copy, Edit and Delete for this job.Delete asks first.From the job's allowedActions.The job's own routes

User stories and acceptance criteria

  1. Resume two jobs at once

    Given homepage-check and hourly-sync are paused

    When I tick both and click Resume

    Then each job's resume route is called in turn and the notice reads Resume: done for homepage-check, hourly-sync.

  2. Edit takes one job

    Given two jobs are ticked

    When I look at the toolbar

    Then Edit and Copy are disabled; Force run, Resume and Delete stay enabled.

  3. A partial failure

    Given two ticked jobs, and room in the day's quota for one run

    When I click Force run

    Then the red notice reads Force run: 1 of 2 done. followed by the refused job and the API's message.

Back to the list of screens

10. Create a job

/job-edit?project=shop

Create, Edit or Copy a job in Cloud Scheduler's three steps. Everything is sent at the end as one job definition; a refused field opens its step and shows its message.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

Create a job, step 1 Define the schedule: Name, Description, Kind, Frequency, Time zone, Continue, then Create and Cancel. 1 2 3 4 5 6 7 8 9 10
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Define the scheduleStep 1: name, description, kind, frequency and time zone.A step heading opens its step; nothing is sent until Create.Always.None
2Configure the executionStep 2: the target type, HTTP or Queue (add a task), and the call.A queue target adds a task named <job>-<scheduled time> to a queue of the project, whose settings then retry it.Always.Queues from GET …/queues?view=names
3Configure optional settingsStep 3: retry config, attempt deadline, and what a scheduled time does while a run is going or in quiet hours.Max retry attempts 0 to 5 (default 0); backoff 1s to 24h (5s and 1h); max doublings 0 to 16 (5); deadline 15s to 15m (3m). While a run is still going: skip (the default), queue one run, or allow up to 5 at once.Always.None
4NameThe job's name.1 to 100 letters, digits, _ and -; unique in the project; cannot change, so it is disabled on Edit and empty on Copy.Always.name
5DescriptionWhat the job is for.At most 500 characters. Optional.Always.description
6KindCall a target, or Uptime check.A check calls a URL with GET or HEAD, has no retries, and judges the status, the time and a text in the body.Always.kind
7FrequencyUnix-cron, five fields: every minute * * * * *, every 3 hours 0 */3 * * *, Mondays at 9:00 0 9 * * 1.The next 5 runs appear under it as you type, from the API; a bad schedule shows its message there instead.Always; required.POST …/jobs/preview { schedule, timeZone }
8Time zoneWhere the schedule's times are read. Type to search.An IANA name from the API's list. Default UTC. A time a clock change skips does not run that day.Always.timeZone; the list from GET /api/defaults/jobs
9ContinueOpens the next step. Steps 2 and 3 have Back too.Nothing is checked or sent.On steps 1 and 2.None
10CreateSends the whole job and opens its page. On Edit it reads Save.A new job starts enabled. 409 when the name is taken or the project has 200 jobs.Create with the create permission; Save with update.POST /api/projects/{p}/jobs or PATCH …/jobs/{j}

User stories and acceptance criteria

  1. The next runs as I type

    Given Frequency 0 9 * * 1 and time zone Asia/Kolkata

    When I stop typing

    Then The next 5 runs: lists five Mondays at 9:00, in that zone.

  2. A check that retries

    Given Kind Uptime check and Max retry attempts 1

    When I click Create

    Then nothing is made, step 3 opens, and Max retry attempts shows A check does not retry: retryCount is 0.

  3. Copy a job

    Given the job nightly-report

    When I choose Copy

    Then the form is titled Copy nightly-report with its settings and an empty name, and Create makes a new job.

Back to the list of screens

11. Job

/job?project=shop&job=nightly-report

A job as Cloud Scheduler shows it: its own buttons from its allowedActions, three tiles, and the tabs Logs, Results (checks only) and Configuration.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The job nightly-report, paused: Force run, Resume, Copy, Edit, Delete and Refresh, the summary tiles, and the Logs and Configuration tabs. 1 2 3 4 5 6 7 8 9 10 11 12
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1State chipEnabled or Paused.A paused job has no next run.Always.GET /api/projects/{p}/jobs/{j} (stateLabel)
2Force runRuns the job now, besides its schedule.Counts against the daily quota: over it, 429. While maintenance is on, a forced run waits until it is off.forceRun: the run permission.POST …/jobs/{j}/run
3ResumeTurns the schedule back on. It reads Pause while enabled.The notice: Resumed nightly-report.pause or resume, by state: the pause permission.POST …/jobs/{j}/resume (or /pause)
4CopyOpens the create form with this job's settings and an empty name.No route of its own.copy: the create permission.Goes to /job-edit?project=shop&copy=nightly-report
5EditOpens the job's three steps with its settings.The name cannot change.edit: the update permission.Goes to /job-edit?project=shop&job=nightly-report
6DeleteDeletes the job after a confirm, then goes back to Jobs.The job and its run history are deleted. It cannot be undone.delete: the delete permission.DELETE /api/projects/{p}/jobs/{j}
7RefreshReads the job again.Disabled and busy while it runs.Always.GET …/jobs/{j}
8TargetWhere the job goes.URL : <url>, Queue : <name> or Check : <url>.Always.targetLabel
9Status of last executionHow the last run ended.Success, Failed (503), Failed, Skipped (daily quota) or Has not run yet.Always.lastRunLabel
10Next runWhen the job runs next.A dash while paused. A job runs within a minute of its time.Always.nextRunAt
11Logs tabThe runs, 50 a page, each with Show attempts.A skipped run says why: still running, daily quota, maintenance or quiet hours. Runs are kept 7 days.Always; Results shows beside it for a check.GET …/jobs/{j}/runs, …/runs/{run}/attempts
12Configuration tabThe schedule, the execution, a check's expectations and the optional settings, as the API answered them.Read only; edit with Edit.Always.GET …/jobs/{j}

User stories and acceptance criteria

  1. Resume a paused job

    Given nightly-report is paused, so Next run reads a dash

    When I click Resume

    Then the notice reads Resumed nightly-report. and Next run shows its next time.

  2. Force run past the quota

    Given the project's daily quota is used up

    When I click Force run

    Then the API answers 429 with code quota and the notice shows its message; scheduled runs are skipped and logged as Skipped (daily quota).

  3. A run while one is going

    Given a job set to skip while a run is still going, with a run under way

    When its next scheduled time comes

    Then no run starts, and Logs shows a run Skipped (still running).

Back to the list of screens

12. API keys

/keys?project=shop

The project's API keys, for apps on /v1. A new key is shown once; after that only its name.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The API keys page: the Create an API key form with Key name, Expires and Create key, and the key shop-app with Rotate and Revoke. 1 2 3 4 5 6 7 8
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1API keysThe page itself.Without the keys permission it says Managing API keys needs the keys permission in this project. Ask an admin.The keys permission.GET /api/projects/{p}/keys
2Key nameA name for the app that uses the key.Required. A replacement key may keep the old one's name.Always.name
3ExpiresWhen the key stops working, in your own time zone.Optional; empty never expires. More than 1 hour and at most 3 years ahead: expiresAt is more than an hour and at most 3 years ahead.Always.expiresAt
4Create keyMakes the key and shows it once, with I have copied it.The console keeps only a hash. A project has at most 20 keys that are not revoked. The admins get a security alert.The keys permission.POST /api/projects/{p}/keys
5StateActive, Expired or Revoked.An expired key is refused on /v1 with 401 This API key has expired.Always.status
6ExpiresThe key's end, or Never.Warnings go to the project's alert channels 7 days and 1 day before.Always.expiresAt
7RotateFills the form with the key's name and an Old key ends field.The new key is made at once. The old one ends at Old key ends, or 7 days from now (sooner if its own end is sooner).rotate: while the key is not revoked.POST …/keys with rotates and oldKeyExpiresAt
8RevokeRevokes the key after Revoke shop-app?.Apps using it are refused from then on. It cannot be undone. A revoke never counts against the 120 changes an hour.revoke: while the key is not revoked.DELETE /api/projects/{p}/keys/{id}

User stories and acceptance criteria

  1. The key is shown once

    Given I fill in Key name

    When I click Create key

    Then the key is shown once with Copy it now … You won't see it again: the console keeps only a hash of it., and after I have copied it only its name shows.

  2. Rotate with the default end

    Given the key shop-app, and Old key ends left empty

    When I click Rotate, then Create key

    Then a new key is made and shown once, and shop-app keeps working for 7 days.

  3. The cap on keys

    Given the project has 20 keys that are not revoked

    When I click Create key

    Then nothing is made: 409 A project has at most 20 API keys that are not revoked; revoke one first.

Back to the list of screens

13. Secrets and service accounts

/secrets?project=shop

The project's secrets and service accounts. Anyone who may read the project sees their names; values are sealed when saved and never shown again.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Secrets page: Add a secret, the secrets shop-api-token and webhook-signing, Add a service account, and the account shop-worker. 1 2 3 4 5 6 7 8 9 10 11 12
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1NameThe secret's name, which calls and alerts use.Letters, digits, _ and -, starting with a letter; unique in the project.With the secrets permission; otherwise Adding or changing these needs the secrets permission in this project.name
2KindHMAC signing secret, Basic auth, Bearer token, OAuth client or Google Chat webhook.The kind decides the fields: a username and password, a token, a token URL and client, or a webhook URL. HMAC has none: the console makes it.With the secrets permission.kind
3ExpiresWhen the secret stops working.Optional; more than 1 hour and at most 3 years ahead. Past it, a call that names it fails as auth.With the secrets permission.expiresAt
4Add the secretSaves the secret. An HMAC secret's signing secret is shown once.Typed values never stay in the page, saved or refused. A project has at most 200 secrets.With the secrets permission.POST /api/projects/{p}/secrets
5Allowed originsWhere a credential may be sent.1 to 20 https:// origins for Basic, Bearer and OAuth secrets. A task or job whose URL is elsewhere is refused at url. HMAC and chat secrets read Not sent to a target.Always.allowedOrigins
6RotateFills the form with the secret's kind and the parts that are not secret, an empty name and value.The new secret gets a new name; the old one keeps working until its own end or its delete. Move the jobs, tasks and alerts that name it.With the secrets permission.POST …/secrets with rotates
7DeleteDeletes the secret after a confirm.Calls that name it fail as auth from then on. 409 A job or the alert settings use this secret.With the secrets permission.DELETE /api/projects/{p}/secrets/{name}
8Service account nameThe account OIDC calls are signed as.Its email is made from the name: <name>@<project>.cloud-console. A project has at most 100 accounts.With the secrets permission.name
9Allowed originsWhere the account's tokens may go.One https:// origin per line, 1 to 20. An OIDC audience must be at one of them, and at the URL's own origin.With the secrets permission.allowedOrigins
10Add the service accountMakes the account.The notice names its email.With the secrets permission.POST /api/projects/{p}/service-accounts
11Change originsOpens an editor for the account's allowed origins.The same rules; the API's message shows beside the field.With the secrets permission.PATCH …/service-accounts/{name} { allowedOrigins }
12DisableDisables the account; Enable turns it back on.An OIDC call as a disabled account fails its attempt as auth.With the secrets permission.PATCH …/service-accounts/{name} { disabled }

User stories and acceptance criteria

  1. An HMAC secret is made by the console

    Given Kind HMAC signing secret

    When I click Add the secret

    Then the console makes the signing secret and shows it once, for the receiving app, with I have copied it.

  2. A secret still in use

    Given a job calls with the secret shop-api-token

    When I delete it

    Then it stays: 409 A job or the alert settings use this secret.

  3. A credential at the wrong origin

    Given shop-api-token may go only to its one origin

    When a task names it with a URL at another origin

    Then the task is refused (400) with the message at url, and nothing is sent.

Back to the list of screens

14. Alerts

/alerts?project=shop

The project's alert settings, a test, and its quiet hours. The page needs the update permission.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Alerts page: Where alerts go, When to alert, Save, Test with Send a test, and Quiet hours. 1 2 3 4 5 6 7 8 9 10 11 12 13
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Email addressesWhere alert mail goes, one per line.At most 10. A member may add only an active console user who may read the project: x is not an active console user who may read shop; only an admin may add other addresses.The update permission; otherwise Alert settings need the update permission in this project. Ask an admin.emailTo
2Google Chat webhookA secret of the Google Chat webhook kind, or None.Only such a secret is taken. With none yet, a link says Add one on the Secrets page.The update permission.chatSecret; the list from GET …/secrets
3A task failed for goodAlerts when a task runs out of attempts.On by default.The update permission.taskFailed
4A job or check failed this many runs in a rowAlerts after that many failures, and once when it recovers.0 to 10; 0 is off. Default 2.The update permission.jobFailuresInARow
5A queue has more tasks waiting thanAlerts on a backlog.0 to 1,000,000; 0 is off, the default.The update permission.backlogTasks
6A queue's oldest due task has waited longer than (minutes)Alerts on a stale queue.0 to 10,080; 0 is off, the default. At most one alert of a kind about one queue or job every 10 minutes.The update permission.backlogMinutes
7SaveSaves the settings: Saved the alert settings.Every queue sees the change within a minute.The update permission.PUT /api/projects/{p}/alerts
8Send a testSends a test alert to the saved channels now, and lists each channel as Sent or Not sent.At most 10 an hour per project. With no channel: 409 No alert channel is set.The update permission.POST /api/projects/{p}/alerts/test
9Time zoneThe quiet hours' zone.An IANA name. Default UTC.The update permission.timeZone
10Starts atWhen the daily window starts.HH:MM. Default 22:00.The update permission.start
11Ends atWhen the window ends.Not the same as the start; an end at or before the start crosses midnight. Default 06:00.The update permission.end
12Jobs wait, Alerts waitTwo switches: jobs do not start in the window; alerts wait and go out once, together, when it ends.Both off is off, the default. Each job says whether it then runs once at the end or skips the time.The update permission.holdJobs, holdAlerts
13Save quiet hoursSaves the window and shows its label, such as 22:00 to 06:00 (UTC): jobs wait, alerts wait.While a window is on, the page says until when.The update permission.PUT /api/projects/{p}/quiet-hours

User stories and acceptance criteria

  1. An address that is not a user

    Given a member adds an address that is no console user's

    When they click Save

    Then nothing is saved and Email addresses shows that it is not an active console user who may read shop.

  2. A test with nowhere to go

    Given no email address and no Google Chat webhook

    When I click Send a test

    Then the API answers 409 No alert channel is set.

  3. Alerts wait for the morning

    Given quiet hours 22:00 to 06:00 with Alerts wait

    When a task fails for good at 23:00

    Then nothing is sent then; when the window ends at 06:00 one message goes, starting Quiet hours ended for shop: with how many alerts waited.

Back to the list of screens

15. Export and import

/settings-file?project=shop

A project's settings as one JSON file, to keep or to copy to another project. Never a secret's value, a key or a token.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Export and import page: Export with Download, and Import with Download a sample, Settings file and Preview. 1 2 3 4 5 6
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1Export and importThe page, under Project settings.At most 20 exports and imports an hour per person, dry runs included.Anyone who may read the project.None
2ExportThe queues, jobs, alert settings, daily quota, and the names of the secrets and service accounts.A person without update gets no alert settings in it.Read.None
3DownloadSaves the export as shop-settings.json.Audited as an export.Read.GET /api/projects/{p}/settings-file
4ImportPreview, then Apply, a settings file.An import makes and changes queues, jobs, alert settings and the quota; it never deletes, and never makes a secret or a service account.The update permission; otherwise Importing needs the update permission in this project.None
5Download a sampleSaves cloud-console-settings-sample.json.The page's own text, no request: one running queue and one paused job, so importing it unchanged calls nothing.The update permission.None
6PreviewPosts the file chosen in Settings file as a dry run and shows what would change.Nothing changes. It shows the label, the changes, the skipped items with why, and the names the project lacks. A file that is not JSON is said so without a request; no file: Choose a settings file first.The update permission.POST …/settings-file { settings }
Under pin 6Apply (under the preview)Posts the same file again with apply: true and shows the result.Worked out again from the project as it is then, and written in one batch; a failure changes nothing. At most 40 queues and jobs made or changed in one import.Only when the dry run's allowedActions has apply: create to make, pause to pause, admin for the quota.POST …/settings-file { settings, apply: true }

User stories and acceptance criteria

  1. Preview the sample

    Given the sample file, unchanged, and the update, create and pause permissions

    When I click Preview

    Then the label says what would be made, nothing changes, and Apply shows below it.

  2. Apply without the create permission

    Given a file that makes a queue, and no create permission

    When I click Preview

    Then there is no Apply, and the label says why; an apply sent anyway is 403 Applying this needs the create permission.

  3. A mistake deep in the file

    Given a file whose third queue has Max attempts 0

    When I click Preview

    Then nothing changes and the message names settings.queues.2.maxAttempts.

  4. Too many files

    Given 20 exports and imports this hour

    When I click Download

    Then the API answers 429 At most 20 exports and imports an hour; try again later.

Back to the list of screens

16. Usage

/usage

Today's free-plan usage as the Worker counts it, each project's count against its daily cap, and, for admins, the backups.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The Usage page: the Free plan lines with their levels, the Projects with their daily caps and Set the cap, and Backups. 1 2 3 4 5 6 7 8 9
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1RefreshReads the usage again.Counted per UTC day; the hint under the title says when it starts again.Always.GET /api/usage
2Free planWorker requests and Durable Object requests (100,000 each), D1 rows read (5,000,000) and D1 rows written (100,000).From 80% a line is near: low queues are held and the admins alerted. At 100% every queue is held and new tasks and job runs are refused until 00:00 UTC.Every signed-in person.lines
3LevelOK, Near the limit or Over the limit.The API's level; the colour and shape follow it.Always.level, levelLabel
4ProjectsEach project's task creations and job runs today against its cap.Retries after a task's first attempt count too. Only the projects you may read.Always.projects
5Daily capThe cap in force.5,000 (the default) until an admin sets one; None when turned off.Always.capLabel
6LevelThe count against the cap, such as 9 of 2,000 today.Over the cap, a create is 429 quota and a scheduled run is skipped and logged.Always.label, level
7Set the capOpens a Daily cap field for the project.1 to 1,000,000; 0 for no cap; empty for the default (5,000).setQuota: admins only.PUT /api/projects/{p}/quota { dailyCap }
8Backups stateThe daily sealed backup's state.Up to date, A backup is running, No backup yet, Stale after 26 hours, The last attempt failed, or Off with why. Back up now shows when backups are on and none runs; at most 3 an hour.The section with manageBackups: admins only.GET /api/backups, POST /api/backups/run
9Refresh the backupsReads the backups again.Loaded apart from the usage, so the usage shows whatever the backups answer.Admins only.GET /api/backups

User stories and acceptance criteria

  1. Back to the default cap

    Given shop's cap is 2,000 and I am an admin

    When I click Set the cap, empty the field and click Set the cap

    Then the notice names shop and its count, and its Daily cap reads 5,000 (the default).

  2. A member sees the totals only

    Given a member

    When they open Usage

    Then they see the Free plan lines and their projects, but no Set the cap and no Backups section.

  3. A free limit is used up

    Given D1 rows written passed 100,000 today

    When anyone opens Usage

    Then the line reads Over the limit and a red line says every queue is held, and new tasks and job runs are refused, until the next UTC day.

Back to the list of screens

17. People

/users

The console's people and its open invitations, for admins. People come in only by invitation.

On a narrow screen the picture scrolls sideways. A pin opens its row in the table.

The People page: Invite, the break-glass admin with no actions, and no open invitations. 1 2 3 4 5 6 7 8 9
The screen at 1280 px wide, on a local copy with the demo project shop. Each pin sits just above and left of its control’s top left corner.

UI breakdown

PinElementWhat it doesRuleShows or is disabled whenAPI route
1InviteOpens Invite someone: Email, Role, and Permissions per project.The grid has a row per project and one for every project, those made later too; a preset (viewer, editor, manager) only ticks boxes. Mail must be on.invite: admins only.POST /api/invitations
2PeopleEveryone with an account.A non-admin sees Managing people is for admins.manageUsers: admins only.GET /api/users
3Name and emailThe person's name, and their email under it.The break-glass admin is the one local account.Always.name, email
4RoleAdmin or Member.An admin may do everything; a member only what their grants give.Always.role
5StateActive or Disabled.A disabled person's address is left out of alert mail.Always.disabled
6Signs in withPassword and code (break-glass), Google, or Not signed in yet.Display only.Always.breakGlass, linked
7AccessThe person's grants per project, such as flowdeck: read, run, or None.Edited with Edit access, a grid of boxes.Always.projects
8ActionsEdit access, Make admin or Make member, Disable or Enable, and Remove.For yourself, only Edit access. For the break-glass admin, none, so this row has no menu. The API refuses the others too (409).From the person's allowedActions.PUT /api/users/{id}/access, PATCH and DELETE /api/users/{id}
9InvitationsThe open invitations, with Resend and Cancel.An expired one shows an Expired chip and may still be resent. Cancel stops its link working.invite: admins only.GET /api/invitations, POST …/{id}/resend, DELETE …/{id}

User stories and acceptance criteria

  1. No actions on the break-glass admin

    Given the break-glass admin's row

    When I look for its menu

    Then there is none, and a change sent anyway is refused with 409.

  2. Mail is off

    Given a valid email and mail settings not set

    When I click Send the invitation

    Then the API answers 503 Mail is off: set the MAIL_* settings to send invitations, after checking the fields first.

  3. Someone already here

    Given an address that already has an account

    When I invite it

    Then it is refused: 409 That person is here already.

  4. A preset only ticks boxes

    Given the editor preset chosen for shop

    When I look at shop's row

    Then read, create, update, pause and run are ticked, and what is sent is the ticked boxes.

Back to the list of screens

Status and labels

Every state the console shows as a chip. The words are the API's label; the colour and the shape follow the state it answered, so a state never rests on colour alone.

WhereChipColour and shapeMeaning
TaskQueued Retrying (attempt 3) RunningBlue, a ring with a gapWaiting for its time, a free slot or a retry; or an attempt under way. Retrying names the next attempt.
TaskSucceededGreen, a filled dotA 2xx answer came. The name is remembered 24 hours.
TaskFailedRed, a diamondFailed for good: attempts or retry duration used up, or a status not retried. Kept 7 days on the Failed tab.
TaskDeletedGrey, an open ringDeleted by a person or an app. The name is remembered 24 hours.
QueueRunning Held until 00:00 UTC (daily limit)Green, a filled dotSends its due tasks. A low-priority queue near a free limit is held until the next UTC day; its state is still running, so the chip stays green.
QueuePausedGrey, an open ringTakes tasks but sends none until resumed.
JobEnabledGreen, a filled dotRuns on its schedule.
JobPausedGrey, an open ringNo next run until resumed.
Job run, last executionSuccessGreen, a filled dotThe run ended with a 2xx answer.
Job run, last executionFailed (503)Red, a diamondThe run failed after its retries; the code or error kind in brackets when there is one.
Job run, last executionSkipped (still running) Skipped (daily quota) Skipped (maintenance) Skipped (quiet hours)Amber, a triangleA scheduled time that did not run, and why. Logged as a run.
Job run, last executionRunningBlue, a ring with a gapA run under way, its retries included.
Job run, last executionHas not run yetGrey, an open ringNo run yet.
Uptime checkUp Down (slow)Green dot; red diamondA check passed, or failed and why.
Dashboard and Usage, free planOK Near the limit Over the limitGreen dot; amber triangle; red diamondUnder 80%; from 80% (low queues held, admins alerted); at 100% (every queue held until 00:00 UTC).
Usage, a project9 of 2,000 todayBy the same levelThe count against the project's daily cap.
Dashboard, cronRunning Parts failing Not run yet StaleGreen dot; amber triangle; red diamondThe every-minute cron ran; ran with a part failing; never noted; or not noted for 10 minutes.
Usage, backupsUp to date A backup is running No backup yet Off: …Green; blue; amber; redThe daily backup's state. Stale (over 26 hours) and a failed last attempt are red too.
API keys, secretsActive Expired RevokedGreen dot; grey ringIn use; past its end date; revoked (keys only).
Service accounts, peopleEnabled Active DisabledGreen dot; grey ringMay be used, or may sign in; or disabled.
InvitationsExpiredAmber, a triangleThe link has expired; Resend sends a new one.
Alerts, testSent Not sentGreen dot; red diamondEach channel's result, with its error when not sent.

Back to the list of screens

Cloud Console as it is on main, 22 Oct 2026. The screenshots come from a local copy with the made-up demo project shop. More in Project info.