uipath-coded-apps
Always invoke for `app.config.json` or `action-schema.json` files. UiPath Coded Web Apps & Coded Action Apps via `uip codedapp` and `@uipath/uipath-typescript` SDK. Scaffold, build, debug, deploy. For .cs/XAML→uipath-rpa, Python→uipath-agents.
Skill body
UiPath Coded Apps
Preview — skill is under active development; surface and behavior may change.
Build, debug, and deploy UiPath Coded Web Applications and Coded Action Apps using the uip codedapp CLI and @uipath/uipath-typescript SDK.
When to Use This Skill
- User wants to build, debug, or deploy a UiPath Coded Web App or Coded Action App
- User asks about
uip codedappcommands,.uipath/directory,app.config.json, oraction-schema.json - User wants to scaffold a new React/Vue frontend for UiPath Cloud or an Action Center form
- User wants to push/pull source between local and Studio Web
- User wants to use the
@uipath/uipath-typescriptSDK from a coded app - User wants to run the full pipeline (build → pack → publish → deploy)
App Types
| Type | Description | Key Difference |
|---|---|---|
| Coded Web App | React/Vue/other frontend hosted on UiPath CDN | User-facing app accessed via a URL |
| Coded Action App | React form wired to UiPath Action Center | Rendered inside human task reviews in Maestro/Agent workflows |
Coded apps are not registered in
.uipxsolutions. They have noproject.uiproj/project.json, souip solution project adddoes not apply. A coded app can live alongside a solution directory but deploys independently viauip codedapp publish(anduip codedapp deploy), not viauip solution pack/publish/deploy.
Critical Rules
- Identify the app type before doing anything else. Ask: “Are you building a Coded Web App (custom frontend deployed to UiPath Cloud) or a Coded Action App (form for Action Center human task reviews)?” The two paths diverge on scaffolding, redirect URI, and publish flag — do not guess.
- Always check login status first. Run
uip login status --output jsonbefore any cloud command. If not logged in, runuip login. - Never skip the build step. Run
npm run buildafter scaffolding (to verify the scaffold compiles) and again beforepackorpush(to produce the deployabledist/). Verifydist/exists each time. - Pack → Publish → Deploy order is required. Each step depends on the previous one producing its output.
- Bump the version for re-publish. If the same version already exists in Orchestrator, publish will fail.
- Action apps require
-t Actionon publish. Runuip codedapp publish -t Action(not the defaultWebtype). - Never handle access tokens manually. Do not pass, print, parse, source, or set cached access tokens. Use
uip loginand supporteduip codedappcommands; the CLI manages authentication. - Base URL must use the API subdomain.
https://api.uipath.comnothttps://cloud.uipath.com. See the table below. vite.config.tsmust always setbase: './'. The platform handles URL routing — apps must use relative asset paths. Do not use a routing name or a sub-path here.- Use
getAppBase()from@uipath/uipath-typescriptfor any absolute URL constructed at runtime — router basename, imagesrc,fetchpaths. Deployed apps mount at a non-root prefix;/-rooted paths work locally but 404 after deploy. Vite’sbase: './'only fixes import-time references. uip codedapp deploymust run non-interactively. Pass the folder key as--folder-key <GUID>(or asUIPATH_FOLDER_KEY=<GUID>env-var prefix — either works). The interactive folder picker fails in non-TTY contexts (CI, agent shells). If the user provides a folder name, resolve it to a key withuip or folders list --output jsonand match on theNamefield (output rows are{ Key, Name, Path, Description, Type, ParentKey }). Theuip or ...commands require the Orchestrator tool — install once viauip tools install @uipath/orchestrator-tool(check first withuip tools list).- Guard against text overflow in every UI. See patterns.md “Preventing Text Overflow”.
- Inspect the DF schema before writing analytics, filters, or seeds. Run
uip df entities get <ENTITY_ID> --output jsonto inspect fields and types. At runtime, useentities.getById(<id>)from the app’s authenticated session. DF doesn’t behave like a typical RDBMS; see sdk/data-fabric.md “Anti-shapes & gotchas”. - Every list call returns ONE page — even with no options. There is no “give me everything” path. Applies to
getAll,getAllRecords,queryRecordsById,getFileMetaData, etc.getAll()with no options does NOT return all rows; the SDK sends nopageSizeand the server applies its own cap, wrapped in a misleadingly-namedNonPaginatedResponse. To list every row from a source that may exceed the cap, you MUST loop the cursor:while (page.hasNextPage) { page = await getAll({ cursor: page.nextCursor }) }and accumulateitems. Readingresult.items.lengthafter a single call is almost always a bug. See sdk/pagination.md. - Tables of dynamic data must paginate, not dump all rows in one scroll. Page size 25–50 with next/prev/page-number controls and a “Showing X–Y of Z” summary. Top-N + “see all” is acceptable for explicitly summary panels (e.g., “Top 10 oldest”). Infinite-scroll-of-N-rows is unusable for operational dashboards. Applies to any table backed by any service (DF entities, Tasks, Jobs, Conversations, Process Instances, etc.). See patterns.md “Tabular Data”.
- When adding any new SDK method call, verify
VITE_UIPATH_SCOPEalready includes the required scope. Write operations, action methods (Jobs.stop,Tasks.complete,ProcessInstances.cancel, etc.), or first use of a new service typically need broader scopes than read-only flows. Mismatched scopes fail silently with401/403on the first call. See oauth-scopes.md for the per-method scope table.
Task Navigation
| I want to… | Read this |
|---|---|
| Create a new Coded Web App | references/create-web-app.md |
| Create a new Coded Action App | references/create-action-app.md |
| Debug auth or config issues | references/debug.md |
| Push/pull code to Studio Web | references/file-sync.md |
| Package and deploy | references/pack-publish-deploy.md |
| Full CLI command reference | references/commands-reference.md |
| OAuth scopes for SDK services | references/oauth-scopes.md |
| SDK: Import paths & subpath exports | references/sdk/imports.md |
| SDK: Assets, Queues, Buckets, Processes, Jobs, Attachments | references/sdk/orchestrator.md |
| SDK: Data Fabric (Entities, ChoiceSets) | references/sdk/data-fabric.md |
| SDK: Maestro (Processes, Cases) | references/sdk/maestro.md |
| SDK: Action Center (Tasks) | references/sdk/action-center.md |
| SDK: Conversational Agent | references/sdk/conversational-agent.md |
| SDK: Agent Feedback | references/sdk/feedback.md |
| SDK: Pagination | references/sdk/pagination.md |
| UI Patterns (polling, BPMN, HITL, text overflow, table pagination) | references/patterns.md |
CLI Setup
# Install the UiPath CLI (run once)
npm install -g @uipath/cli
# Install the coded apps tool
uip tools install @uipath/codedapp-tool
# Install the Orchestrator tool (needed to resolve folder name → key for deploy)
uip tools install @uipath/orchestrator-tool
# Verify both are installed
uip tools list
# Resolve uip if not on PATH
UIP=$(command -v uip 2>/dev/null || npm root -g 2>/dev/null | sed 's|/node_modules$||')/bin/uip
$UIP --version
Authenticate before any cloud command:
uip login status --output json # check if logged in
uip login # interactive OAuth (opens browser)
uip login --authority https://alpha.uipath.com # non-production environments
Environment Variables
| Variable | Used By | Description |
|---|---|---|
VITE_UIPATH_CLIENT_ID |
Web App SDK | OAuth Client ID from External Application |
VITE_UIPATH_SCOPE |
Web App SDK | Space-separated OAuth scopes |
VITE_UIPATH_ORG_NAME |
Web App SDK | UiPath organization slug |
VITE_UIPATH_TENANT_NAME |
Web App SDK | UiPath tenant name |
VITE_UIPATH_BASE_URL |
Web App SDK | Must use API subdomain (see below) |
UIPATH_PROJECT_ID |
push / pull | Studio Web project ID |
Base URL by environment:
| Environment | Correct Base URL |
|---|---|
| Production (cloud) | https://api.uipath.com |
| Staging | https://staging.api.uipath.com |
| Alpha | https://alpha.api.uipath.com |
Quick Deploy (Full Pipeline)
Do NOT pause between steps to ask “should I continue?” — execute the full pipeline. Only stop if you need auth credentials or an app name.
- Auth —
uip login status --output json. If not logged in, ask the user for their environment and runuip login. - Build —
npm run build. Verifyls dist/. - Pack —
uip codedapp pack dist -n <name> --version <version>. Produces.uipath/<name>.<version>.nupkg. Bump version if previously published. - Publish —
uip codedapp publish(add-t Actionfor action apps). Verifycat .uipath/app.config.json. - Deploy —
uip codedapp deploy -n <name> --folder-key <GUID>. Resolve the GUID from a user-provided folder name viauip or folders list --output json. Never let the command go interactive. Share the app URL with the user.
SDK Module Imports
See references/sdk/imports.md for the subpath ↔ class mapping, type import conventions, and anti-pattern examples. Core rules are listed under Anti-patterns below.
Key Concepts
App Config (.uipath/app.config.json)
Created by publish, consumed by deploy. Contains appName, systemName, appType, deploymentId, appUrl. Do not delete .uipath/ between publish and deploy.
Action Schema (action-schema.json)
Action apps define a data contract between the form and the Maestro/Agent workflow. It has four sections: inputs (read-only data from automation), outputs (user-filled fields), inOuts (pre-populated but editable), and outcomes (submission buttons like Approve/Reject).
Troubleshooting
See references/debug.md for detailed diagnosis steps.
| Error | Cause | Fix |
|---|---|---|
Not authenticated |
No valid session | Run uip login |
dist/ not found |
App not built | Run npm run build |
Version already exists |
Same version re-published | Bump version in pack |
Folder key required / deploy hangs on prompt |
Missing folder for CLI deploy | Resolve folder name → key via uip or folders list --output json (match on Name, read Key), then run uip codedapp deploy --folder-key <GUID> .... See pack-publish-deploy.md. |
No packages found |
No .nupkg in .uipath/ |
Run pack first |
| Login fails / redirect error | OAuth misconfiguration | See debug.md |
| API calls fail with 401/CORS | Wrong base URL | Use https://api.uipath.com not cloud.uipath.com |
Folder identifier names differ across CLI and SDK. The CLI uses
UIPATH_FOLDER_KEY/--folder-key(string) and applies only touip codedapp deploy. SDK methods use different parameters: Maestro services (MaestroProcesses,ProcessInstances,Cases) takefolderKey(string GUID), Orchestrator services (Assets,Queues,Buckets,Processes) takefolderId(number). Do not pass the CLI env var into SDK calls. To bridge from a MaestrofolderKeyto an OrchestratorfolderId, see sdk/maestro.md — and neverparseInt(folderKey), the GUID is not numeric.
Completion Output
When you finish a task, report only what’s applicable to the work actually done:
- What was done — files created, edited, or deleted (list paths); CLI commands run
- Stage reached — one of: scaffolded / built / packed / published / deployed
- Artifacts produced (report only the ones that actually exist):
dist/— ifnpm run buildwas run.uipath/<name>.<version>.nupkg— ifpackwas run.uipath/app.config.jsonwithdeploymentId— ifpublishwas run- Live deployment URL (
appUrlfromapp.config.json) — ifdeploywas run - External Application client ID — if one was created this session
- Next steps, depending on where the task stopped:
- Scaffolded only:
cd <app-name> && npm run devto run locally - Built but not packed: ready to
uip codedapp packwhen the user wants to deploy - Published but not deployed: run
uip codedapp deployto go live - Deployed (Web): open/share the deployment URL; verify sign-in flow
- Deployed (Action): the app will render in Action Center human tasks triggered by Maestro/Agent workflows matching the routing name
- Scaffolded only:
- Open issues — any auth failures, scope mismatches, missing folder key, skipped steps, or errors left unresolved
If a later stage was requested but skipped (e.g., user asked to deploy but only publish succeeded), call it out explicitly in the next-steps section.
Anti-patterns
These pitfalls are not already covered by the Critical Rules. For rules stated as positive requirements, see the Critical Rules section at the top.
- Don’t import service classes from the package root — use the subpath (e.g.,
@uipath/uipath-typescript/assets). - Don’t use the deprecated dot-chain
sdk.entities.getAll()— use constructor DI:new Entities(sdk). - Don’t delete
.uipath/betweenpublishanddeploy—deployreadsapp.config.jsonwritten bypublish.