remotion-dev/remotion · error
The remover finished, but
Error message
The remover finished, but ${skill} is still installed ${removingGlobally ? 'globally' : 'in the project'}. Please try again. What it means
After running the package-manager remove command, changeRemotionSkill re-reads skills info to confirm the removal took effect. If the skill still reports as installed globally (when removingGlobally) or in the project (otherwise), the removal failed silently, so this error is thrown and the user is asked to retry.
Solutions
- Retry the removal once
- Manually remove the dependency (package.json entry or `npm rm -g` / equivalent) and rerun the package manager install to clean node_modules
- Check for duplicate installs (local + global) and remove the one actually reported by skills info
- Restart Studio and re-check skills info to rule out stale cache
Example fix
// before npx remotion studio // remove fails silently, skill persists // after npm uninstall @remotion/captions # or remove from package.json, then reinstall global case: npm rm -g @remotion/captions
Defensive patterns
Strategy: retry
Validate before calling
const info = await getRemotionSkillsInfo();
const s = info.skills.find((x) => x.name === skill);
if (!s?.installedInProject && !s?.installedGlobally) {
// already removed; skip
} Try / catch
try {
await removeSkill(skill);
} catch (e) {
if (e.message.includes('is still installed')) {
await removeSkill(skill); // retry, or clean up package.json manually
}
} Prevention
- Check for duplicate local+global installs before removing
- Confirm the removal in package.json / global dir afterwards
- Restart Studio if skills info appears stale
When it happens
Trigger: Calling removeRemotionSkillHandler where the remove command finishes but getRemotionSkillsInfo still shows installedGlobally (for global removal) or installedInProject (for project removal) as true.
Common situations: Package manager left the dependency in package.json or global install dir; peer/hoisted copies remain in node_modules; the remove command removed a different copy than the one detected; cached node_modules state.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- The installer finished, but
- A skill is already being installed or removed. Please try…
- Asset was not found in public/.
- assetPath must be a non-empty public-folder path, or an…
- Cannot create an undo entry without snapshots
AI-assisted analysis of remotion-dev/remotion@46a3a6bf13 (2026-09-18).
Data as JSON: /api/errors/537cacd4d0375a8d.
Report an issue: GitHub.
Appendix: source
Thrown at packages/studio-server/src/preview-server/routes/install-remotion-skill.ts:128
}
});
});
const info = getRemotionSkillsInfo({remotionRoot});
const updatedSkill = info.skills.find(({name}) => name === skill);
if (action === 'install' && !updatedSkill?.installedInProject) {
throw new Error(
`The installer finished, but ${skill} was not found in the project. Please try again.`,
);
}
if (
action === 'remove' &&
(removingGlobally
? updatedSkill?.installedGlobally
: updatedSkill?.installedInProject)
) {
throw new Error(
`The remover finished, but ${skill} is still installed ${removingGlobally ? 'globally' : 'in the project'}. Please try again.`,
);
}
RenderInternals.Log.info(
{indent: false, logLevel},
RenderInternals.chalk.gray('╰─ '),
`Done in ${Date.now() - time}ms`,
);
return info;
} catch (error) {
RenderInternals.Log.info(
{indent: false, logLevel},
RenderInternals.chalk.gray('╰─ '),
RenderInternals.chalk.red(`Errored in ${Date.now() - time}ms`),
);
throw error;
}View on GitHub (pinned to 46a3a6bf13)