windmill-labs/windmill · error · Error
App ${appPath} not found
Error message
App ${appPath} not found What it means
This CLI error is raised during `wmill app push`/sync when the remote workspace returns no app for the given path: `wmill.getAppByPath` resolves to a falsy value (404) and the code throws explicitly. It means the app you are trying to update does not exist remotely under that exact path.
Source
Thrown at cli/src/commands/app/app.ts:481
})
.command(
"set-permissioned-as",
"Set the on_behalf_of_email for an app (requires admin or wm_deployers group)"
)
.arguments("<path:string> <email:string>")
.action((async (opts: any, appPath: string, email: string) => {
const workspace = await resolveWorkspace(opts);
await requireLogin(opts);
const { lookupUsernameByEmail } = await import("../../core/permissioned_as.ts");
const cache = new Map<string, { username: string; email: string }>();
const username = await lookupUsernameByEmail(workspace.workspaceId, email, cache);
const remote = await wmill.getAppByPath({
workspace: workspace.workspaceId,
path: appPath,
});
if (!remote) throw new Error(`App ${appPath} not found`);
// Only spread remote.policy — spreading the full remote object would include
// `value` and trigger a new app version on every call. EditApp has all-Option
// fields, so a minimal body only updates the policy column.
await wmill.updateApp({
workspace: workspace.workspaceId,
path: appPath,
requestBody: {
policy: {
...(remote.policy as any),
on_behalf_of: `u/${username}`,
on_behalf_of_email: email,
} as any,
preserve_on_behalf_of: true,
// Preserve any user draft at this path (see backend skip_draft_deletion).
skip_draft_deletion: true,
},
});View on GitHub (pinned to e474e8803c)
Solutions
- Create the app first (wmill app push creates it if missing — check you didn't pass a flag/mode that only edits) or verify the command mode you used
- Confirm the exact remote path in the Windmill UI and fix the path in your local app folder/app.yaml
- Run `wmill workspace switch` (or pass the right workspace) to make sure you target the workspace that owns the app
- Check for typos, extra whitespace, or case differences in the path
Example fix
// before
await wmill.updateApp({ workspace, path: "f/apps/dasboard", ... });
// after (typo fixed and app verified to exist)
const app = await wmill.getAppByPath({ workspace, path: "f/apps/dashboard" });
if (!app) throw new Error("create the app first: wmill app push"); Defensive patterns
Strategy: type-guard
Validate before calling
const remote = await wmill.getAppByPath({ workspace: ws, path: appPath });
if (!remote) {
console.error(`App ${appPath} not found in workspace ${ws}; create it or fix the path before updating.`);
process.exit(1);
} Type guard
function appExists(app: { path?: string } | null | undefined): app is { path: string } {
return !!app && typeof app.path === 'string';
} Try / catch
try {
await wmill.updateApp({ workspace, path: appPath, body });
} catch (e) {
if (String(e).includes('not found')) {
console.error(`App ${appPath} does not exist remotely — run 'wmill app push' to create it or verify the path/workspace.`);
}
throw e;
} Prevention
- Verify the app path in the UI matches the local app folder before sync/push
- Run `wmill workspace current` to confirm you target the right workspace
- Prefer `wmill app push` (which creates missing apps) over edit-only flows for first-time deploys
When it happens
Trigger: Running an app sync/push command with --path (or an app metadata path) pointing to an app that was never created, was deleted, was renamed, or whose path casing/spacing differs from the remote one, in a different workspace than expected.
Common situations: Typo in the app path in the local app folder; pushing to a fresh workspace/instance where the app was never created; the app was deleted by a teammate; switching workspaces (the CLI workspace is not the one containing the app); path changed after a rename while local files still use the old one.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Flow ${flowPath} not found
- failed to run npm: ${e instanceof Error ? e.message : e} ${
- Error reading inline path: ${path}, ${error}
- Dependency generation failed: ${queueResponse.status} ${queu
- Failed to poll dependencies job ${jobId}: ${e?.message ?? e}
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/0c3840af5154bab3.
Report an issue: GitHub.