| name | uipath-coded-apps |
| description | 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. |
| allowed-tools | Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion |
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 codedapp commands, .uipath/ directory, app.config.json, or action-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-typescript SDK 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 .uipx solutions. They have no project.uiproj / project.json, so uip solution project add does not apply. A coded app can live alongside a solution directory but deploys independently via uip codedapp publish (and uip codedapp deploy), not via uip 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 json before any cloud command. If not logged in, run uip login.
- Never skip the build step. Run
npm run build after scaffolding (to verify the scaffold compiles) and again before pack or push (to produce the deployable dist/). Verify dist/ 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 Action on publish. Run uip codedapp publish -t Action (not the default Web type).
- Never handle access tokens manually. Do not pass, print, parse, source, or set cached access tokens. Use
uip login and supported uip codedapp commands; the CLI manages authentication.
- Base URL must use the API subdomain.
https://api.uipath.com not https://cloud.uipath.com. See the table below.
vite.config.ts must always set base: './'. 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-typescript for any absolute URL constructed at runtime — router basename, image src, fetch paths. Deployed apps mount at a non-root prefix; /-rooted paths work locally but 404 after deploy. Vite's base: './' only fixes import-time references.
uip codedapp deploy must run non-interactively. Pass the folder key as --folder-key <GUID> (or as UIPATH_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 with uip or folders list --output json and match on the Name field (output rows are { Key, Name, Path, Description, Type, ParentKey }). The uip or ... commands require the Orchestrator tool — install once via uip tools install @uipath/orchestrator-tool (check first with uip 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 json to inspect fields and types. At runtime, use entities.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 no pageSize and the server applies its own cap, wrapped in a misleadingly-named NonPaginatedResponse. 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 accumulate items. Reading result.items.length after 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_SCOPE already 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 with 401 / 403 on 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
npm install -g @uipath/cli
uip tools install @uipath/codedapp-tool
uip tools install @uipath/orchestrator-tool
uip tools list
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
uip login
uip login --authority https://alpha.uipath.com
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 run uip login.
- Build —
npm run build. Verify ls 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 Action for action apps). Verify cat .uipath/app.config.json.
- Deploy —
uip codedapp deploy -n <name> --folder-key <GUID>. Resolve the GUID from a user-provided folder name via uip 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 to uip codedapp deploy. SDK methods use different parameters: Maestro services (MaestroProcesses, ProcessInstances, Cases) take folderKey (string GUID), Orchestrator services (Assets, Queues, Buckets, Processes) take folderId (number). Do not pass the CLI env var into SDK calls. To bridge from a Maestro folderKey to an Orchestrator folderId, see sdk/maestro.md — and never parseInt(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/ — if npm run build was run
.uipath/<name>.<version>.nupkg — if pack was run
.uipath/app.config.json with deploymentId — if publish was run
- Live deployment URL (
appUrl from app.config.json) — if deploy was 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 dev to run locally
- Built but not packed: ready to
uip codedapp pack when the user wants to deploy
- Published but not deployed: run
uip codedapp deploy to 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
- 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/ between publish and deploy — deploy reads app.config.json written by publish.