Cloud|

Spaces

Shared boards for tasks, events, comments, views, and calendar planning.

25 min read Updated 2026-10-19 #spaces#tasks#calendar

Spaces organizes tasks and events for a team, project, household, class, or recurring process. The same items can be viewed as a list, table, Kanban board, or calendar without copying the work into separate systems.

Open another Space in the sidebar, shared by the overview and every Space. On phones, open the title menu Space name βŒ„, or Spaces βŒ„ on the overview. Both offer My work, every accessible Space, and New space for signed-in users. The create dialog offers Template with Blank space, Task board, Event calendar, and Project tracker; choosing one fills the form and sets the starting view. Every field stays editable before creating the Space.

Use Spaces

  • Track tasks with status, priority, assignees, deadlines, simple checklists, tags, descriptions, and comments.
  • Plan events with start and end times, recurrence, and calendar views.
  • Start recurring kinds of work from templates that fill in the fields and propose the next matching dates.
  • Switch between list, table, Kanban, and calendar views for the current job.
  • Filter and group the same items by state, activity, person, priority, tag, or time. The inactive filter finds open tasks without activity for 30 days; the in-progress filter finds tasks somebody has claimed.
  • Import an invitation from Mail into a chosen writable Space, or publish an enabled calendar feed to another calendar client.

The Spaces start page brings accessible work together without changing its owning Space. My work in the sidebar opens it and shows the count assigned to you. Each Space row shows its open item count; pinned Spaces come first. The sidebar width is shared between the overview and Space pages and can be resized. In the page header, switch between For me, Today, and Upcoming, search Spaces, tasks, and events, or choose New task to choose a Space for a new task. On larger screens, the Activity panel shows recent Space and item changes; on mobile it opens from the Activity button.

Inside a Space, List, Table, Kanban, and Calendar are tabs in the page header. Search and filter chips share that header in list, table, and Kanban; Reset clears active filters and search. The calendar keeps its own toolbar. The header also offers scoped search, New task or New event, and the … menu for Space settings, Copy iCal URL when enabled, and Keyboard shortcuts in Kanban. On phones, the primary action is a round + button. If you can edit the Space, the header previews people with access beside the menu or inside it when space is limited.

The selected work view and its counters arrive with the page. Switching work views loads the selected list on demand; Back and Forward restore the view from the URL. A failed load shows a retry action instead of an empty list. The app's /api/spaces/overview/work?view=mine|today|upcoming endpoint uses the same permission-filtered reads as SSR and requires an unbound user-backed actor.

Activity is recorded by the Spaces service, so authorized changes made through the web interface, CLI, or capabilities appear consistently. Repeated edits to the same item are grouped to keep the feed useful.

Use one Space for work that shares a team and access boundary. Create another when the audience or lifecycle is different.

Check off tasks in the mobile app

Preview: the mobile app is not released yet.

When the installation runs the mobile app, Spaces appears on its Start page and, when there is room, in its tab bar for people with the user role. Guests do not see it. The page at /pwa/spaces shows the start page's For me, Today, and Upcoming lists with their counts, across every Space you can read. Tasks you claim also count as yours in For me.

  • Each row shows the title, the Space with its color, and the deadline or, for an event, its time or All day. An overdue deadline is red.
  • Tap the circle in front of a task to mark it done. The task leaves the list at once, and Undo in the confirmation brings it back and reopens it. When you change your mind several times in a row, your last tap is the one that stays. This is the same change as on the web, with the same activity entry, and it needs write access to the Space. The circles are dimmed for the moment until the page is ready.
  • Events have no circle. Complete them in Spaces on the web.
  • A task you claimed yourself with I'm on it is completed with your claim, as on the web. A task someone else claimed stays open; the app names who is working on it, and you can take it over on the web.
  • A task with unfinished blockers stays open, and the app says why. So does a task in a Space you can only read, and a task that was deleted in the meantime disappears from the list. These notices offer no Retry, because trying again would not change the answer.
  • If a change cannot be saved, for example while the phone is offline, the task goes back to how it is saved, and a notice offers Retry.
  • The selected list is part of the address, so a reload keeps it.
  • Each list shows a bounded number of items, the same as the start page on the web: up to 100 for For me, 5 for Today, and 30 for Upcoming. When the count is higher, a line under the list says how many more are in Spaces on the web.

Rows do not open the item. Read and edit details in Spaces on the web.

Understand the Spaces model

Resource Responsibility
Space Permission-scoped work area with columns, tags, items, and settings
Item Task or event with shared content and workflow fields
Column and tag Ordered workflow stage and cross-cutting label
Reaction One emoji reaction per person on an item
Comment, checklist entry, and assignee Collaboration context attached to one item
Link A Cloud resource reference or an external URL on one item; GitHub issue and pull request links show a cached preview
Calendar surface Time-based view, invitation integration, and optional iCal export

Tasks use deadlines; events use a schedule and may recur. Deadlines are all-day by default. Choose Add time for a specific time and Remove time to return to an all-day deadline. An all-day deadline becomes overdue on the following day in the application timezone. Day and week calendars show it in the all-day row; month and year show it on its date. Existing timed deadlines keep their time. Views, filters, and grouping change how items are presented, not which resource owns them.

Each person can react once per emoji. Reacting needs write access; seeing reactions needs read access. Standalone and agent accounts react under their own name. Reactions send no notifications and record no activity, so they do not reset the inactive marker. An item holds at most 20 different emoji, ordered by the first remaining reaction. Counts do not change this order. A reaction on a series belongs to the series item. Generated occurrences have none; saved overrides have their own.

Kanban card footers show up to three reaction chips and "+n" for further emoji. Select a chip to add or remove your reaction. With a mouse, the card's add button shows on hover or focus; on touch screens the card has none, so open the item. The item shows all reactions above the comments, with an add button that is always visible for people who can edit the item. Readers see read-only chips. Generated occurrences show no reactions. Recent emoji are stored per browser under spaces:recent-emoji. If saving fails, a toast offers Try again to repeat the failed action. When the item already has 20 different emoji, a new one is not sent; the toast says to react with one that is already there and offers no Try again.

Item reads include reactions: each summary has an emoji, count, own, and up to three other people in reaction order. Responses to other item changes leave reactions out, so keep the summary you already have. Add your reaction with PUT /api/spaces/:id/items/:itemId/reactions/:emoji; remove it with DELETE of the same path. Percent-encode the emoji, for example πŸ‘πŸ½ or ❀️. Both return { reactions }. Repeating either intent succeeds without a change. An invalid emoji returns 400; a 21st different emoji returns 409 with REACTION_LIMIT_REACHED. These routes do not accept recurrence_id.

The item details read top to bottom. A task starts with Planning: due date, estimate, priority, and tags, plus a hint that jumps to the first active blocker while any remain. The description, checklist, and attachments follow; then Assigned, Latest status, and Last result; then Blocked by, Blocks, Related tasks, and Links & resources; then reactions, comments, and the collapsed Details. An event shows its schedule under Planning, then its location, link, and invitations, its content, the assignees, links, comments, and details. Parts without content stay hidden unless you can edit them.

Task attachments hold images and videos, at most 20 per task and 10 MB per file. Add image or video takes them from this device or, when Cloud apps offer files, from one of them, such as Files; you can also drop them on the open task. It downscales large images before uploading them and uploads videos (.mp4, .m4v, .mov, .webm, .ogv) unchanged, without transcoding. A video in another format, such as MKV, is not added, and Spaces names the formats it accepts. A video tile shows its first frame; selecting it plays the video in a dialog with the browser's own controls and Download. The dialog fits the whole picture, so a vertical reel shows at full height, and fills the screen on a phone. Whether a video plays depends on its codec and the browser; one that cannot play offers its download instead. The content route answers a single byte range with 206 Partial Content, which browsers need to play and seek, and ignores any other Range header by answering the whole file. It streams the content from the database in slices, so a player that stops after the first frame does not make Spaces read the rest. Images and playable videos are served inline; every other file type downloads.

In list and table views, search updates results without reloading the page or moving focus out of the search field. The URL follows the displayed results, so you can share or reload the filtered view. While a search loads, the previous results stay visible. If it fails, your search text remains available and you can retry.

Press Enter to search immediately. Without JavaScript, submitting the search loads the filtered page and keeps your other filters. The start page's For me, Today, and Upcoming links also work without JavaScript.

In list and table views, changing search or filters keeps the open item's editor and unfinished comment in place. If you select another item while a calendar date change is loading, the completed date change keeps your newer selection.

The calendar offers day, week, month, and year views. Below the day view, a row shows up to five overdue open tasks of the Space and up to five open tasks without a deadline assigned to you, each with Show all for the list view with the same query. Spaces no longer has a timeline view; an old link with cv=timeline opens the month view of its day.

The month scrolls up and down through week rows, with the weekday names kept on top. The title follows the month in the center; other months' days are dimmed, and each first day names its month. The arrows and Page Up or Page Down move by a month with the first day's week on top. Today returns to today's month. More weeks load as you scroll or step without clearing entries or selection, and the count follows the visible days. The month holds at most 366 days at once; past that, scrolling stops at the last loaded week, and the arrows open their month on its own. The URL names a selected day in the focus month, otherwise the day it already named when that day lies in the focus month, otherwise today in that month, otherwise its first day.

In the day and week views a day runs from 06:00 to 06:00, so the night after 22:00 belongs to the day before. Nights fold unless an entry lies in them. The day view runs down through the days with runs of empty days folded into one row; the week view scrolls sideways through them, seven at a time or three on a phone, and its arrows move by whole weeks. Both load the week before and after while you scroll, and the URL follows the first day you see; an item opens there in place. Another filter keeps the days already loaded and the place you see, and Back after an item keeps the day you scrolled to. The count next to the filters counts the days you see. Timed deadlines show as dashed lines with a checkbox, or Space, to check the task off, and keep their time when you drag them. All-day deadlines sit in the all-day row; move them in the month view, where they stay all-day, or in the task. Free time creates an event where it lies, and a task dragged from the row below the day view into free time gets that time, keeps its deadline also when it moves later, and leaves the row. H, J, K, 1 to 4, G, N, and Shift+N move, switch views, go to a date, and create in the calendar, and the left and right arrow keys page like K and J; the keyboard button of the calendar lists them. In the year view, N and Shift+N open the full form on the shown date. See Day and week views for the behavior in detail.

An item's Links & resources list holds Cloud resource references and external URLs (at most 20 URLs per item). A GitHub issue or pull request link renders as repo#number with its title and open, closed, or merged state; other links show the site's favicon and host or the label you gave them. Previews are fetched server-side, cached in Valkey for five minutes per Space, and never fetched while a page renders: a first view shows the plain link and the detail panel fills the preview once. Public repositories work without configuration. A Space administrator can store one GitHub token per Space under … β†’ Space settings β†’ Connections β†’ GitHub; it is encrypted at rest, used only to preview links in that Space, and never displayed again. Without a token, private links render without a preview. Spaces never writes to GitHub.

Task checklist entries are deliberately small: one completion state and one label, without separate assignees, dates, or detail pages. Checklist changes also count as task activity.

A Kanban column loads 30 cards at a time. A dropped card lands directly below the card it was dropped under, or at the top when dropped above the first card, and keeps that position after a reload, even when the column holds more cards than the board has loaded. The board names that neighboring card, and Spaces places the item in the full column. API clients use the same contract: POST /api/spaces/:id/items/:itemId/move takes columnId and either afterItemId or beforeItemId, an item of the target column. Without either, the item goes to the top of the column. An explicit rank is still stored as given, but a neighbor wins when both are sent. Without completed, the move completes or reopens the item when the target column's done state differs from the item's. Moves in one Space apply one at a time, so concurrent drops never share a position. A neighbor that is not an item of the Space, for example because it was deleted or sent through a wormhole, fails with 404. A neighbor in another column of the Space fails with 409, as does one that leaves the target column while the move runs. Neither changes anything; reload the column and try again. After a rejected drop, the board shows the columns as Spaces holds them, so the next drop names a current neighbor.

Spaces keeps common actions keyboard-first. Outside form fields and dialogs, C creates an item and Cmd/Ctrl+Shift+K opens scoped search. These actions also appear in Cloud search and Layout Help. A focused Kanban card supports arrow-key navigation, Enter to open, M to assign it to yourself, and D to complete it. An open item also exposes editing, assignment, deadline, and completion or reopening actions in the palette.

Templates

A Space keeps templates for new tasks and for new events, at most 100 of each, with names unique per kind. A template stores a title and a description that may contain {{date}}, {{weekday}}, and {{week}}, a priority, tags, assignees or Assign to me for whoever creates the item, a task checklist and estimate, and an event's location, link, all-day flag, and duration. A due time is optional for tasks: without one, the deadline is all-day. Events default to a 09:00 start.

Its date rule decides which dates the new item dialog proposes:

Rule Proposes
Weekdays, such as Wednesday or Thursday The next three matching days
In X days (0 to 365) Today plus X days
None No date; a task starts without a deadline, an event today at its time

Proposals are local calendar dates in the person's time zone, so week, month, and daylight-saving changes never move a proposed day. A weekday rule offers today all day for a task without a time, or only while the template's time still lies ahead when it has one. An offset always counts from today. When someone presses +, a Space with templates of that kind shows a Template chip row (a searchable list with more than six), and choosing one fills the form and shows the proposals as date chips with the first selected, next to Other date… and, for tasks, No date. Placeholders follow whichever date the item gets, from a chip or a picker, until someone edits the text; filled-in text stops at the item limits of 200 and 5,000 characters. Everything stays editable before saving, and Spaces asks before a template replaces typed input. The chip rows stay on one line and scroll sideways on phones; hovering, focusing, or switching chips moves nothing.

Space admins create, change, and delete templates in the Space settings under Templates; people with write access use them, and read access lists them. Created items keep no link to their template. A default assignee who loses access to the Space drops out of the template everywhere it is read until the access returns. The REST API offers GET /api/spaces/:id/templates, POST, PATCH, and DELETE on /api/spaces/:id/templates[/:templateId], and GET /api/spaces/:id/templates/:templateId/draft?date=&noDate=&timeZone=, which returns the proposals and the filled create request without saving anything. POST /api/spaces/:id/items takes checklist for a new task and assignCreator for the person creating the item, so a template becomes one atomic create. The Space detail includes templates.

How Spaces fits Cloud

Spaces owns its items, views, calendar behavior, comments, and recurrence. Cloud supplies identity, resource access, resource-bound API keys, live application discovery, dashboard widgets, capability registration, and shared Help. Mail passes authorized invitation context to Spaces; Spaces remains the owner of the resulting event.

Find detailed product help

Open Help inside Spaces for first use, views, daily workflow, sharing, calendar integration, and troubleshooting. Developers can read Resource authorization, URL state and navigation, and App capabilities for the shared contracts Spaces adopts.

Automate Spaces from the terminal

cld spaces lists and changes work from a terminal. An item is addressed by its ID or as <space>:<title>, with the space given by ID or exact name:

bash
cld spaces ls --json
cld spaces ls "Product" --mine --due-before 2026-10-01 --json
cld spaces show "Product":"Fix mobile dialog" --json
cld spaces add "Product":"Write release notes" --deadline 2026-10-20 --assignee me
cld spaces done "Product":"Fix mobile dialog"
cld spaces reactions add "Product":"Fix mobile dialog" "πŸ‘πŸ½"
cld spaces reactions remove "Product":"Fix mobile dialog" "πŸ‘πŸ½"

cld spaces templates ls <space> and templates show <space>:<template> list templates with their rule and next proposals in the local time zone. cld spaces add "Product" --template "Weekly report" [--date YYYY-MM-DD | --no-date] creates an item from a template; other add flags override it. A given --deadline or --starts-at picks the day instead, and --starts-at needs --ends-at.

For task deadlines, the API and CLI accept YYYY-MM-DD as an all-day date or an ISO date-time as a timed deadline. For example, cld spaces due <item> 2026-10-24 sets an all-day deadline; cld spaces due <item> 2026-10-24T17:00:00+02:00 adds a time. Responses carry deadline unchanged as a calendar date or normalized ISO instant, and deadlineAllDay is true only for a date-only deadline. It is false for timed or absent deadlines. Send deadline: null to clear a deadline through the update API. Calendar dates never pass through a timezone. --due-before still compares against an instant; an all-day deadline sorts at the start of its day in the configured timezone.

Titles are matched exactly. When a space name or title matches several resources, the command fails with every candidate as path (id) and changes nothing; retry with an ID. There is no default space, so every address names its space. --assignee and assign accept me, a person or service account UUID, a username, or a service account name with access to the Space. Repeat --assignee to replace the assignment with several people or accounts.

The commands follow the shared cld verbs: ls, show, add, set, mv, and rm, the quick actions done, reopen, assign, and due, deps for blockers, and the groups reactions, comments, attachments, checklist, references, links, invitation, and access. calendar and overlap query a time range across spaces. Every command supports --json; destructive commands need --yes, and long text comes from --from <file|->. Run cld spaces help for the full list. The API behind item addresses is GET /api/spaces/items/:itemId and GET /api/spaces/resolve?space=&title=; both apply the same read access as the web interface.

The spaces.item.read capability includes bounded task attachment metadata with authenticated preview and download links; images and playable videos have a preview link. Attachment content remains in Spaces rather than being embedded in capability results.

Assistant workflows

Use space.browse for a compact, paginated choice of Spaces. Set minimumPermission: "write" before creating content. space.read adds column and tag IDs when an action needs them; a second read is not required simply to confirm a Space already selected from an authorized list. Space lists may shorten descriptions to fit a full page; when descriptionTruncated is true, space.read returns the full description.

template.list and template.read return a Space's templates with their rule and next proposed dates in the given timeZone, or in the application timezone without one. task.create and event.create take templateId, date, and timeZone: the template fills every field left out, its checklist included, and date picks the day, by default the first proposal. An explicit deadline or startsAt picks the day instead, for the placeholders and the summary too. For "use the weekly report template for next Wednesday" an agent lists the templates, picks the matching proposal, and creates the item. template.create, template.update, and template.delete need Space admin access.

task.focus finds open tasks across accessible Spaces without looping over each Space. It supports assignment, deadline, priority, blocker, and inactivity filters. Inactive means no task activity for 30 days. Deadline windows use the configured application timezone, matching the overview. task.list and event.list accept activity and deadlineFilter; lists include readable column names when available. task.list and task.focus entries carry overdue, true only for an open task whose deadline lies before today in the application timezone; completed tasks are never overdue. Use this flag instead of comparing deadline yourself.

For actual calendar occurrences, use event.agenda with offset-aware from and to timestamps. The interval includes its start and excludes its end, covers at most 31 days, and includes open events rather than task deadlines. Spaces expands recurrence in the application timezone. Follow page.nextCursor while page.hasMore is true, even when a page contains no occurrences: an old series may have no dates in the interval. Pages keep series and their overrides together and are individually chronological. Collect every page and sort by startsAt for a complete chronological agenda. Cursors belong to the original interval, Space, and assignment filter; restart without a cursor after changing these. A recurrence-budget error is not an empty agenda; inspect the affected series through event.list and item.read.

Simple checklists use task.checklist.list, task.checklist.create, task.checklist.update, and task.checklist.delete. Each entry has only an ID, label, and completed state. Updates change only supplied fields, and deleting an entry never deletes its task. The same permissions, activity history, and 100-entry task limit apply as in the interface. Follow checklist list cursors until complete. Work and checklist pages may contain fewer than the requested limit to stay within the response byte budget; continuation preserves every entry. Existing task and event lists instead shorten optional previews and relation snapshots with explicit truncation flags, preserving their page model.

calendar-destination.list lists writable Mail invitation destinations in pages of up to 100. Follow the returned cursor to retrieve every destination.

task.list and event.list return at most three assignees and tags per item. assigneeCount includes assignees omitted from the preview. When it is larger than the number of assignees, state the total (for example, β€œ3 of 11”) or use item.read before naming everyone. The response budget may shorten previews further; relationsTruncated signals a partial relation preview. Resource reference previews contain at most 2,000 characters; read the resource for its full content.

task.blocker.add returns the saved blocker with a spaces.item ref, just like task.blocker.list. For the reverse direction, task.blocks.list returns up to 100 dependent tasks per page by default. Use cursor and limit and follow page.nextCursor until page.hasMore is false.

event.invitation.prepare rejects a calendar that would take more than 96 KiB of the response, measured as JSON-encoded UTF-8, and rolls back the preparation. Reduce the event content or attendees and try again. A retry of a stored preparation that is too large needs a new idempotency key.

Implementation tasks and agent handoffs

Spaces supports flat implementation tasks with blockers, shared progress notes, completion results and explicit worker claims. The task details show the latest progress note as Latest status and the latest result as Last result, below the Assigned list; reopening preserves the result. Earlier notes are recorded in task activity.

Assignees can be people or active service accounts, including agents. People need direct or group access to the Space; service accounts need their own direct access. A Space API key can be assigned only within its own Space, and personal automation keys cannot be assignees. Assignment never grants access.

Claiming as a person or an agent also assigns you; the claim is the working state of one assignee. This applies to every account that may claim, also when it has write access only through access for all signed-in accounts. Releasing your own claim keeps you assigned. Assigned to me and For me select your personal assignments, including tasks you claimed. Assigned and Unassigned count both people and service accounts; filtering by an assignee ID can select either kind. The Kanban column stays the only status. People claim from the board card or the task details with I'm on it and release with a second click, optionally leaving a handoff note that is saved as progress. Board cards, list rows, and table cells put the working person first in the avatar stack, with a green ring. They appear once and never in the +N overflow.

In the task details, Assigned is one list. The working person's row comes first with the green ring, working on it, and the time they started working. The row stays one line: in a narrow panel, the start time gives way to the name and the label. A holder outside the assignees, such as a personal automation key or an account that was deleted, still appears first as a working row, without a remove action.

Claims coordinate work; they do not lock it. A claim guards completion, not the column: anyone who can edit the Space can move a claimed task between open columns, or between done columns, without a claim ID. Completing or reopening a claimed task, including a drag into a done column, needs the holder's claim ID, and completing ends the claim; the web UI sends it for your own claim. A wormhole transfer ends the claim too, because the task leaves the Space, so it needs the holder's claim ID in the same way. Anyone with write access may take over someone else's claim. In the task details, Take over ends the exact observed claim and claims the task for you. This moves the claim and assignment together: the previous holder is removed from the assignees, and you are assigned. Releasing someone else's claim with force also removes that account's assignment, even without a new claim. Completing, reopening, moving, or transferring a task with someone else's claim ends that claim but keeps the assignees as they are.

Removing the working person or service account from Assigned ends their claim. Removing someone else asks once, for example "Jana Berger is working on this – remove them and end their claim?". A stale assignee list from a client that has not seen the new claim is refused with 409; no fields change. API updates need the holder's claimId, plus force for someone else's claim. CLI assign and set, and the task.update and event.update capabilities, require you to release the claim first.

If someone else claimed a task, completing or reopening it from the board, the list, the calendar tray, or the details, or sending it through a wormhole, asks once, for example "Claimed by Jana Berger – take over and complete?", and then takes the claim over and makes the change in one step. Cancel leaves the task, and the card, where they were. Task activity records who took a claim over from whom. The previous holder's next progress, release, or completion call with the ended claim ID gets 409 "Task claim is no longer active", also when someone has claimed the task again since.

Use cld spaces ls <space-id> --ready --json to find open tasks without active blockers. Read show <item> --context before starting, then claim the task with a caller-generated UUID. Competing claims fail, including separate workers using the same account. Claims do not expire or lock ordinary edits. Release the claim when stopping or before completing from another session. Anyone with write access can take over an abandoned claim with release --force and its exact ID, or complete with done --claim-id <id> --force. A wormhole transfer through the API takes the same claimId and force and ends the claim.

progress accepts a full handoff as text or through --from <file|->. done can save an outcome with verification evidence and an optional commit SHA in the same transaction as completion. Both user and resource-bound service accounts can record this work under their actual identity. Comments remain user-authored.

show <item> --context includes work state, checklist, attachments, references, links, and blockers, plus explicit pages of comments and dependent tasks. Follow hasNext in those pages using comments list and deps; use activity --cursor to read older work notes. Pages are fresh reads and may change during collaboration. The comments list output and the blocks field of deps are paginated objects.

Agents use reaction.add and reaction.remove with { itemId, emoji } for the same reaction intents. item.read includes the full reaction summary; list capabilities include each emoji with its count and own state.

For capabilities, use task.work.read, task.claim, task.release and task.progress; task.release and task.set-completed accept force to take over the exact claim named by claimId, task.set-completed also accepts optional result and commit, and task.list and task.focus accept claimed: true to list only claimed tasks. Results and progress notes each have the existing 5,000-character text budget. Keep the repository's Space ID in its agent instructions and use it in every item address.

Deployment requirements

See Deployment requirements for this app’s startup prerequisites, optional integrations, configuration and functional checks.

On upgrade, Spaces preserves existing person assignments and extends item and template assignments to service accounts. Startup also adds existing non-personal service-account claim holders to their task’s assignees.

Use Actions (or >) in the Cloud search to create a task or event. Inside a Space, the form uses that Space; elsewhere, choose a writable Space first. An open writable item contributes explicitly named edit and completion actions. Blocked or completed tasks do not offer completion.

Cmd/Ctrl+Shift+K searches the current Space. Cmd/Ctrl+Alt+N opens a new task, or an event in calendar view. Outside inputs, E edits the selected item, M assigns it to you, and D marks it done or reopens it. In the calendar, H, J, K, 1 to 4, G, N, and Shift+N show today, page, switch the view, go to a date, and create an event or a task. Completion remains unavailable while blocked. Search actions update the open palette in place. Actions for the selected object appear before page actions.

Image upload privacy

New JPEG, PNG, and WebP image uploads remove location and device metadata without changing image quality. JPEG orientation, colour profiles, transparency, and supported animation data remain. Malformed containers are rejected with HTTP 422. This applies to task attachments.

Files keeps originals. HEIC, AVIF, TIFF, SVG, video, GIF, BMP, and unknown formats remain unchanged and can retain metadata. Previously uploaded images are not rewritten. See Image upload privacy for the supported formats and limits.

Connect a coding agent

The Cloud skill provides compact working instructions. MCP supplies exact current documentation when details matter.

CLI command
bunx skills add https://docs.example.com

This command installs the working instructions published by this website in the selected coding agent.

For exact, current details, also connect the MCP server through one of the agent tabs.

Installation uses the open-source Vercel Skills CLI.

The skill and MCP complement each other: the skill describes workflows, while MCP supplies current documentation.