# Asana on boxd

> Tool to help teams organize, track, and manage their work.

- Page: https://boxd.sh/integrations/asana/
- CLI: `run asana` (152 commands, 111 marked common)
- SDK: `import { asana } from "@boxd/run"`; every parameter and response type is at `@boxd/run/asana`
- Triggers: 6
- Connect: `run auth asana` (Sign in with Asana), or https://app.boxd.sh/integrations/detail/asana
- All integrations: https://boxd.sh/integrations/ (Markdown: https://boxd.sh/integrations/index.md)

## From the shell

```sh
run auth asana      # once: prints a link to connect your account
run asana           # list its commands
run asana get-current-user
```

Parameters are flags (`--flag value`); object and array parameters take a JSON string. Output is YAML, or JSON with `--json`. Calls use your own connection; `--scope <name>` uses a connection shared with your team.

## From a script

```ts
import { asana } from "@boxd/run";

const result = await asana.getCurrentUser();
console.log(result);

asana.on("task-created", { project_gid: "…" }, async (event) => {
  // New Task Created: runs on this machine, once per event
  console.log(event);
});
```

Run it with `run asana.run.ts`. A script that calls `.on()` keeps running as a job and handles each event.

## Commands

Required flags are listed; `run asana <command> --help` lists the optional ones. "common" marks what `run asana` shows without `--all`.

| Command | SDK method | Required flags | Optional | Description |
|---|---|---|---|---|
| `add-followers-to-project` ·common | `asana.addFollowersToProject()` | `--followers` `--project-gid` | 2 | Add followers to a project in Asana |
| `add-followers-to-task` ·common | `asana.addFollowersToTask()` | `--followers` `--task-gid` | 2 | Add followers to a task in Asana |
| `add-item-to-portfolio` ·common | `asana.addItemToPortfolio()` | `--item` `--portfolio-gid` | 2 | Add a project (or other supported item) to an Asana portfolio using the native addItem endpoint |
| `add-members-to-project` ·common | `asana.addMembersToProject()` | `--members` `--project-gid` | 2 | Add users to a project in Asana |
| `add-project-for-task` ·common | `asana.addProjectForTask()` | `--project` `--task-gid` | 4 | Add a project to a task in Asana |
| `add-supporting-relationship` ·common | `asana.addSupportingRelationship()` | `--data` `--goal-gid` | 2 | Add a supporting goal relationship to a goal |
| `add-tag-to-task` ·common | `asana.addTagToTask()` | `--tag-gid` `--task-gid` | 2 | Add an existing tag to a task in Asana |
| `add-task-dependencies` ·common | `asana.addTaskDependencies()` | `--dependencies` `--task-gid` | 2 | Add dependency relationships to an Asana task |
| `add-task-to-section` ·common | `asana.addTaskToSection()` | `--section-gid` `--task-gid` | 2 | Adds an existing task to a section, optionally positioning it before or after another task in that section; if no position is specified, the task is added to the end |
| `add-user-to-team` ·common | `asana.addUserToTeam()` | `--team-gid` `--user` | 2 | Add a user to a team in Asana |
| `add-user-to-workspace` ·common | `asana.addUserToWorkspace()` | `--user` `--workspace-gid` | 2 | Add a user to a workspace or organization in Asana |
| `approve-access-request` | `asana.approveAccessRequest()` | `--access-request-gid` | 2 | Approve an access request in Asana |
| `create-access-request` | `asana.createAccessRequest()` | `--target` | 1 | Create an access request in Asana |
| `create-allocation` ·common | `asana.createAllocation()` | `--assignee-gid` `--effort-type` `--effort-value` `--end-on` `--start-on` `--workspace-gid` | 2 | Creates a new allocation |
| `create-attachment-for-object` ·common | `asana.createAttachmentForObject()` | `--parent` | 5 | Upload an attachment or link an external resource to a task, project, or project_brief in Asana |
| `create-attachment-for-task` ·common | `asana.createAttachmentForTask()` | `--file` `--parent-gid` | 2 | Upload an attachment to a task |
| `create-custom-field` ·common | `asana.createCustomField()` | `--data` | 2 | Create a new custom field in a workspace |
| `create-enum-option-for-custom-field` ·common | `asana.createEnumOptionForCustomField()` | `--custom-field-gid` `--data` | 2 | Create a new enum option for a custom field in Asana |
| `create-membership` ·common | `asana.createMembership()` | `--member` `--parent` | 3 | Create a membership by adding a user or team to a project, goal, or portfolio |
| `create-project` | `asana.createProject()` | `--data` | 2 | Creates a new Asana project in the specified workspace |
| `create-project-brief` ·common | `asana.createProjectBrief()` | `--html-text` `--project-gid` | 2 | Create a project brief for a project |
| `create-project-for-team` ·common | `asana.createProjectForTeam()` | `--data` `--team-gid` | 2 | Create a project in a team |
| `create-project-for-workspace` ·common | `asana.createProjectForWorkspace()` | `--data` `--workspace-gid` | 2 | Create a project in a workspace |
| `create-project-status-update` ·common | `asana.createProjectStatusUpdate()` | `--color` `--project-gid` `--status-type` `--text` `--title` | 0 | Create a new status update on a project |
| `create-section-in-project` ·common | `asana.createSectionInProject()` | `--name` `--project-gid` | 2 | Creates a new SECTION (not a task) in a project |
| `create-status-for-object` ·common | `asana.createStatusForObject()` | `--parent` `--status-type` `--text` | 3 | Create a status update on a project, portfolio, or goal |
| `create-subtask` ·common | `asana.createSubtask()` | `--name` `--task-gid` | 6 | Creates a new Asana subtask under an existing parent task (`task_gid`); `due_on` and `due_at` are mutually exclusive and cannot be set simultaneously |
| `create-tag` ·common | `asana.createTag()` | `--data` | 2 | Create a new tag in an Asana workspace |
| `create-tag-in-workspace` | `asana.createTagInWorkspace()` | `--data` `--workspace-gid` | 2 | Creates a new tag, with properties like name and color defined in the request body, within a specific Asana workspace (using `workspace_gid`); this tag helps categorize tasks, is confined to the… |
| `create-task` | `asana.createTask()` | `--data` | 2 | Creates a new Asana task; requires 'workspace', 'parent', or 'projects' for association, and 'followers', 'projects', 'tags' are set only at creation |
| `create-task-comment` ·common | `asana.createTaskComment()` | `--task-id` `--text` | 0 | Adds a new text comment (story) to an existing Asana task, appearing in its activity feed |
| `create-team` | `asana.createTeam()` | `--data` | 0 | Create a new team in an Asana workspace |
| `delete-allocation` ·common | `asana.deleteAllocation()` | `--allocation-gid` | 1 | Delete an allocation by its ID |
| `delete-attachment` ·common | `asana.deleteAttachment()` | `--attachment-gid` | 1 | Delete an attachment by its globally unique identifier |
| `delete-custom-field` ·common | `asana.deleteCustomField()` | `--custom-field-gid` | 0 | Delete a custom field by its globally unique identifier |
| `delete-membership` ·common | `asana.deleteMembership()` | `--membership-gid` | 1 | Delete a membership by its GID |
| `delete-project` ·common | `asana.deleteProject()` | `--project-gid` | 1 | Delete a project |
| `delete-project-brief` ·common | `asana.deleteProjectBrief()` | `--project-brief-gid` | 1 | Delete a project brief by its GID |
| `delete-project-status` | `asana.deleteProjectStatus()` | `--project-status-gid` | 1 | Delete a project status by its GID |
| `delete-section` | `asana.deleteSection()` | `--section-gid` | 1 | Delete a section by its GID |
| `delete-status-update` ·common | `asana.deleteStatusUpdate()` | `--status-update-gid` | 1 | Delete a status update by its GID |
| `delete-story` | `asana.deleteStory()` | `--story-gid` | 1 | Delete a story by its GID |
| `delete-tag` ·common | `asana.deleteTag()` | `--tag-gid` | 1 | Delete a specific tag by its GID |
| `delete-task` ·common | `asana.deleteTask()` | `--task-gid` | 1 | Delete a task |
| `duplicate-project` ·common | `asana.duplicateProject()` | `--name` `--project-gid` | 3 | Duplicate a project |
| `duplicate-task` ·common | `asana.duplicateTask()` | `--task-gid` | 2 | Duplicate a task |
| `get-access-requests` ·common | `asana.getAccessRequests()` | `--target` | 3 | Retrieve access requests for a target object |
| `get-allocation` ·common | `asana.getAllocation()` | `--allocation-gid` | 2 | Get an allocation by ID |
| `get-allocations` ·common | `asana.getAllocations()` | — | 7 | Get multiple allocations |
| `get-attachment` ·common | `asana.getAttachment()` | `--attachment-gid` | 1 | Get a single attachment by its globally unique identifier |
| `get-audit-log-events` ·common | `asana.getAuditLogEvents()` | `--workspace-gid` | 8 | Get audit log events for a workspace |
| `get-current-user` ·common | `asana.getCurrentUser()` | — | 0 | Retrieves the authenticated user's full record, including accessible workspaces, often used as an initial call to establish user context for subsequent operations |
| `get-custom-field` ·common | `asana.getCustomField()` | `--custom-field-gid` | 2 | Get a single custom field by its globally unique identifier |
| `get-custom-fields-for-workspace` ·common | `asana.getCustomFieldsForWorkspace()` | `--workspace-gid` | 4 | Get all custom fields in a workspace |
| `get-custom-types` ·common | `asana.getCustomTypes()` | `--project` | 4 | Get all custom types associated with a project |
| `get-events` ·common | `asana.getEvents()` | `--resource-gid` | 3 | Retrieve events on a resource to monitor changes |
| `get-favorites-for-user` ·common | `asana.getFavoritesForUser()` | `--user-gid` `--workspace` | 5 | Get a user's favorites within a specified workspace |
| `get-goal` ·common | `asana.getGoal()` | `--goal-gid` | 1 | Retrieve the full record for a single goal by its GID |
| `get-goal-relationships` ·common | `asana.getGoalRelationships()` | `--goal-gid` | 4 | Retrieve goal relationships |
| `get-goals` ·common | `asana.getGoals()` | — | 10 | Retrieve multiple goals |
| `get-job` | `asana.getJob()` | `--job-gid` | 2 | Retrieve a job by its globally unique identifier |
| `get-membership` | `asana.getMembership()` | `--membership-gid` | 1 | Retrieve a single membership by its ID |
| `get-memberships` ·common | `asana.getMemberships()` | — | 5 | Retrieve memberships for goals, projects, portfolios, or custom fields |
| `get-multiple-projects` | `asana.getMultipleProjects()` | — | 7 | Returns a list of projects filtered by workspace or team (one required), with optional archived status filter, supporting pagination for large datasets |
| `get-multiple-tasks` | `asana.getMultipleTasks()` | — | 12 | Retrieves a list of tasks, allowing filtering by assignee (requires `workspace`), project, section, `completed_since`, and `modified_since`; `workspace` also requires `assignee` |
| `get-multiple-users` | `asana.getMultipleUsers()` | — | 6 | Returns a list of users in an Asana workspace or organization, optionally filtered by workspace or team GID, with support for pagination and specifying optional fields |
| `get-multiple-workspaces` | `asana.getMultipleWorkspaces()` | — | 4 | Retrieves all workspaces accessible by the authenticated user, returning an empty list if the user has no accessible workspaces |
| `get-portfolio` ·common | `asana.getPortfolio()` | `--portfolio-gid` | 4 | Retrieve the full record for a single portfolio by its GID |
| `get-portfolio-items` ·common | `asana.getPortfolioItems()` | `--portfolio-gid` | 3 | Retrieve items in a portfolio |
| `get-portfolio-memberships` ·common | `asana.getPortfolioMemberships()` | — | 6 | Retrieve multiple portfolio memberships |
| `get-portfolios` ·common | `asana.getPortfolios()` | `--owner` `--workspace` | 3 | Retrieve multiple portfolios |
| `get-project` ·common | `asana.getProject()` | `--project-gid` | 2 | Retrieves a specific Asana project by its `project_gid`, with an option to include additional fields for comprehensive details using `opt_fields`; this action does not return tasks within the project |
| `get-project-brief` ·common | `asana.getProjectBrief()` | `--project-brief-gid` | 2 | Retrieve a project brief by its GID |
| `get-project-membership` | `asana.getProjectMembership()` | `--project-membership-gid` | 2 | Get a project membership by ID |
| `get-project-memberships` ·common | `asana.getProjectMemberships()` | `--project-gid` | 5 | Get memberships from a specific project |
| `get-project-status` ·common | `asana.getProjectStatus()` | `--project-status-gid` | 2 | Retrieve the full record for a single project status by its GID |
| `get-project-status-updates` ·common | `asana.getProjectStatusUpdates()` | `--project-gid` | 4 | Get status updates for a specific project |
| `get-project-templates` ·common | `asana.getProjectTemplates()` | — | 5 | Retrieve multiple project templates |
| `get-project-templates-for-team` ·common | `asana.getProjectTemplatesForTeam()` | `--team-gid` | 4 | Get a team's project templates in Asana |
| `get-projects-for-task` ·common | `asana.getProjectsForTask()` | `--task-gid` | 4 | Get all projects a task is in |
| `get-projects-for-team` ·common | `asana.getProjectsForTeam()` | `--team-gid` | 5 | Get a list of projects for a specific team in Asana |
| `get-reactions-on-object` | `asana.getReactionsOnObject()` | `--emoji-base` `--target` | 3 | Get reactions with a specific emoji base character on an object |
| `get-section` ·common | `asana.getSection()` | `--section-gid` | 2 | Retrieve the full record for a single section by its GID |
| `get-sections-in-project` ·common | `asana.getSectionsInProject()` | `--project-gid` | 2 | Returns compact records for all sections (used to group tasks) in a specified project |
| `get-status` | `asana.getStatus()` | `--status-update-gid` | 2 | Retrieve the full record for a single status update by its GID |
| `get-status-updates` ·common | `asana.getStatusUpdates()` | `--parent` | 3 | Retrieve status updates from an object |
| `get-stories-for-task` ·common | `asana.getStoriesForTask()` | `--task-gid` | 3 | Get stories (comments, status updates, etc.) for a task |
| `get-story` ·common | `asana.getStory()` | `--story-gid` | 2 | Retrieve a story |
| `get-tag` ·common | `asana.getTag()` | `--tag-gid` | 2 | Get a single tag by its globally unique identifier |
| `get-tags` ·common | `asana.getTags()` | — | 4 | Get multiple tags in a workspace |
| `get-tags-for-task` ·common | `asana.getTagsForTask()` | `--task-gid` | 4 | Get all tags associated with a specific task |
| `get-tags-for-workspace` | `asana.getTagsForWorkspace()` | `--workspace-gid` | 4 | Get all tags in a specific workspace |
| `get-task` ·common | `asana.getTask()` | `--task-gid` | 2 | Retrieves full details for a specified task GID accessible by the user; use `opt_fields` to customize returned data |
| `get-task-attachments` ·common | `asana.getTaskAttachments()` | `--parent-gid` | 3 | Get the list of attachments for a given task, project, or project_brief |
| `get-task-counts-for-project` | `asana.getTaskCountsForProject()` | `--project-gid` | 2 | Get task count statistics for a project |
| `get-task-subtasks` ·common | `asana.getTaskSubtasks()` | `--task-gid` | 3 | Retrieve multiple task subtasks from a workspace |
| `get-task-templates` ·common | `asana.getTaskTemplates()` | — | 5 | Retrieve multiple task templates from a workspace |
| `get-tasks-for-tag` ·common | `asana.getTasksForTag()` | `--tag-gid` | 4 | Retrieve tasks associated with a specific Asana tag by tag GID |
| `get-tasks-for-user-task-list` ·common | `asana.getTasksForUserTaskList()` | `--user-task-list-gid` | 5 | Retrieve tasks from a user task list by user task list GID |
| `get-tasks-from-project` ·common | `asana.getTasksFromProject()` | `--project-gid` | 5 | Retrieves tasks from a specified Asana project, allowing filtering by completion status and selection of optional fields for detailed responses |
| `get-tasks-from-section` ·common | `asana.getTasksFromSection()` | `--section-gid` | 5 | Retrieve tasks that belong to a specific Asana section (column/header) by section GID |
| `get-team` | `asana.getTeam()` | `--team-gid` | 2 | Retrieve details of a specific team by its GID |
| `get-team-membership` | `asana.getTeamMembership()` | `--team-membership-gid` | 2 | Retrieve a complete team membership record by its GID |
| `get-team-memberships` ·common | `asana.getTeamMemberships()` | — | 7 | Retrieve compact team membership records |
| `get-team-memberships-for-team` ·common | `asana.getTeamMembershipsForTeam()` | `--team-gid` | 4 | Get memberships from a specific team |
| `get-team-memberships-for-user` | `asana.getTeamMembershipsForUser()` | `--user-gid` `--workspace` | 4 | Get team memberships for a specific user |
| `get-teams-for-user` | `asana.getTeamsForUser()` | `--organization` `--user-gid` | 4 | Get teams for a specific user in an organization |
| `get-teams-in-workspace` ·common | `asana.getTeamsInWorkspace()` | `--workspace-gid` | 2 | Returns the compact records for all teams in the workspace visible to the authorized user |
| `get-time-period` ·common | `asana.getTimePeriod()` | `--time-period-gid` | 2 | Retrieve the full record for a single time period by its GID |
| `get-time-periods` ·common | `asana.getTimePeriods()` | `--workspace-gid` | 6 | Retrieve compact or full representations of time periods |
| `get-time-tracking-entries` | `asana.getTimeTrackingEntries()` | — | 12 | Get multiple time tracking entries across workspace, tasks, or projects |
| `get-time-tracking-entries-for-task` | `asana.getTimeTrackingEntriesForTask()` | `--task-gid` | 4 | Get time tracking entries for a task |
| `get-typeahead-objects` ·common | `asana.getTypeaheadObjects()` | `--workspace-gid` | 5 | Retrieve objects in a workspace via a typeahead search algorithm |
| `get-user` ·common | `asana.getUser()` | `--user-gid` | 2 | Get a user by their ID |
| `get-user-for-workspace` | `asana.getUserForWorkspace()` | `--user-gid` `--workspace-gid` | 2 | Get a user in a workspace or organization by their GID |
| `get-user-task-list` ·common | `asana.getUserTaskList()` | `--user-task-list-gid` | 2 | Get a single user task list by its globally unique identifier |
| `get-users-for-team` ·common | `asana.getUsersForTeam()` | `--team-gid` | 4 | Get users in a team |
| `get-users-for-workspace` ·common | `asana.getUsersForWorkspace()` | `--workspace-gid` | 4 | Get users in a workspace or organization |
| `get-webhooks` | `asana.getWebhooks()` | `--workspace` | 5 | Retrieve multiple webhooks in a workspace |
| `get-workspace` | `asana.getWorkspace()` | `--workspace-gid` | 2 | Retrieve details of a specific workspace by its GID |
| `get-workspace-membership` | `asana.getWorkspaceMembership()` | `--workspace-membership-gid` | 2 | Retrieve a specific workspace membership by its GID |
| `get-workspace-memberships` ·common | `asana.getWorkspaceMemberships()` | `--workspace-gid` | 4 | Retrieve the workspace memberships for a specific workspace |
| `get-workspace-memberships-for-user` | `asana.getWorkspaceMembershipsForUser()` | `--user-gid` | 4 | Retrieve workspace memberships for a specific user |
| `get-workspace-projects` ·common | `asana.getWorkspaceProjects()` | `--workspace-gid` | 4 | Retrieve the projects associated with a specific workspace |
| `insert-enum-option-for-custom-field` ·common | `asana.insertEnumOptionForCustomField()` | `--custom-field-gid` `--data` | 2 | Reorder an existing enum option within a custom field by moving it before or after another specified enum option |
| `insert-section-for-project` ·common | `asana.insertSectionForProject()` | `--data` `--project-gid` | 1 | Move or reorder an existing section within a project by repositioning it before or after another section |
| `instantiate-project-template` ·common | `asana.instantiateProjectTemplate()` | `--name` `--project-template-gid` | 7 | Instantiate (create) a real Asana project from a project template, returning the async job record |
| `reject-access-request` | `asana.rejectAccessRequest()` | `--access-request-gid` | 0 | Reject an access request |
| `remove-follower-from-task` ·common | `asana.removeFollowerFromTask()` | `--followers` `--task-gid` | 0 | Remove one or more followers from a task |
| `remove-followers-for-project` | `asana.removeFollowersForProject()` | `--followers` `--project-gid` | 2 | Remove followers from a project in Asana |
| `remove-item-from-portfolio` ·common | `asana.removeItemFromPortfolio()` | `--item` `--portfolio-gid` | 2 | Remove an item (e.g., a project) from an Asana portfolio |
| `remove-members-for-project` ·common | `asana.removeMembersForProject()` | `--members` `--project-gid` | 2 | Remove users from a project in Asana |
| `remove-project-from-task` ·common | `asana.removeProjectFromTask()` | `--project` `--task-gid` | 1 | Remove a project from a task in Asana |
| `remove-tag-from-task` ·common | `asana.removeTagFromTask()` | `--tag` `--task-gid` | 2 | Remove an existing tag from a task in Asana |
| `remove-user-for-team` ·common | `asana.removeUserForTeam()` | `--team-gid` `--user` | 1 | Remove a user from a team |
| `remove-user-for-workspace` ·common | `asana.removeUserForWorkspace()` | `--user` `--workspace-gid` | 1 | Remove a user from a workspace or organization |
| `search-tasks-in-workspace` | `asana.searchTasksInWorkspace()` | `--workspace-gid` | 8 | Search tasks across a workspace with advanced filters |
| `set-parent-for-task` | `asana.setParentForTask()` | `--parent` `--task-gid` | 4 | Set the parent of a task in Asana |
| `submit-parallel-requests` ·common | `asana.submitParallelRequests()` | `--data` | 0 | Submit multiple Asana API requests in parallel using the Batch API |
| `update-allocation` ·common | `asana.updateAllocation()` | `--allocation-gid` `--data` | 2 | Update an existing allocation by its ID |
| `update-custom-field` ·common | `asana.updateCustomField()` | `--custom-field-gid` `--data` | 2 | Update a custom field by its globally unique identifier |
| `update-enum-option` ·common | `asana.updateEnumOption()` | `--data` `--enum-option-gid` | 2 | Update an enum option for a custom field |
| `update-project` ·common | `asana.updateProject()` | `--project-gid` | 14 | Update a project |
| `update-project-brief` ·common | `asana.updateProjectBrief()` | `--project-brief-gid` | 3 | Update a project brief by its GID |
| `update-section` ·common | `asana.updateSection()` | `--section-gid` | 5 | Update a section's name or position within a project |
| `update-story` | `asana.updateStory()` | `--data` `--story-gid` | 2 | Update a story on a task |
| `update-tag` ·common | `asana.updateTag()` | `--data` `--tag-gid` | 0 | Update an existing tag by its globally unique identifier |
| `update-task` | `asana.updateTask()` | `--data` `--task-gid` | 2 | Updates attributes of an existing Asana task identified by its task_gid |
| `update-team` | `asana.updateTeam()` | `--team-gid` | 5 | Update details of an existing team |
| `update-user` | `asana.updateUser()` | `--user-gid` | 4 | Update a user's custom fields |
| `update-user-for-workspace` | `asana.updateUserForWorkspace()` | `--user-gid` `--workspace-gid` | 3 | Update a user in a workspace or organization |
| `update-webhook` | `asana.updateWebhook()` | `--webhook-gid` | 3 | Update an existing Asana webhook's filter configuration |

## Triggers

`asana.on("<event>", handler)` in a script; required config goes before the handler as an object.

| Event | Name | Required config | Description |
|---|---|---|---|
| `"task-attachment-added"` | Attachment Added to Task | `project_gid` | Triggers when an attachment is added to a task |
| `"task-comment-added"` | New Comment on Task | `project_gid` | Triggers when a comment is added to a task in a project |
| `"task-created"` | New Task Created | `project_gid` | Triggers when a new task is created in a project |
| `"task-moved-to-section"` | Task Moved to Section | `project_gid` | Triggers when a task is moved to a section in a project |
| `"task-tag-added"` | Tag Added to Task | `project_gid` | Triggers when a tag is added to a task |
| `"task-updated"` | Task Updated | `project_gid` | Triggers when a task is updated in a project |

## Docs

- [run CLI](https://docs.boxd.sh/cli/run): Call connected integrations from the shell, connect new ones, and run automations.
- [Quickstart](https://docs.boxd.sh/guides/integrations/quickstart): Connect an integration, call it from the shell, and turn a script into an automation.
- [Connections](https://docs.boxd.sh/guides/integrations/connections): Connect an account once, for yourself or for your whole organization.
- [Scripts](https://docs.boxd.sh/guides/automations/scripts): Typed integrations, triggers, schedules and state in a .run.ts file.
- [Jobs](https://docs.boxd.sh/guides/automations/jobs): How a script becomes a background job: states, retries, sleep and wake.
- [Beyond the catalog](https://docs.boxd.sh/guides/automations/beyond-the-catalog): Reach your own APIs, databases and cloud accounts from a script.
