create-twenty-app scaffold cannot sync on Windows: "Resource path must not contain backslashes", and the failure silently skips the metadata migration
Firstly: I vibe coded this with Claude Code using Opus 5. I'm not looking for any response as we were able to keep going. Just wanted to share in case it is legit and you haven't seen it.
Summary On Windows, a freshly scaffolded app cannot complete its first sync. Application file paths are built with the OS separator, so they contain backslashes, and the server rejects them.
The more damaging part is the knock-on effect: the upload step runs before the metadata migration and returns early on failure. So objects, fields and views never get applied, and the error message says nothing about metadata. The visible symptom is "my app installed but none of my fields exist", which sends you looking in the wrong place.
Reproduction On Windows 11:
npx create-twenty-app@latest my-twenty-app The scaffolder's own final step fails:
[7/7] Installing application...
→ Running yarn twenty dev --once...
→ Sync failed. Run yarn twenty dev --once manually.
Running it manually shows the cause:
Registering application... Uploading 5 files... Failed to upload 3 files: Resource path must not contain backslashes .twenty\output\src\front-components\main-page.mjs .twenty\output\src\front-components\main-page.tsx .twenty\output\public\logo.svg All three are from the default template: the scaffolded front component and the logo in public/.
Expected A freshly scaffolded app syncs on Windows as it does on macOS and Linux.
Actual The first sync fails, and no metadata is applied.
Scope Only files in subdirectories fail. Files at the output root upload fine, because their relative path contains no separator. That is why the failure list is exactly the front component and the public asset, and why an app declaring only objects, fields and views appears to work: it has nothing to upload.
Root cause Two parts.
- The client sends OS-native separators. The string Resource path must not contain backslashes does not appear anywhere in twenty-sdk, so the server is what validates and refuses. The client is what produces the path. builtPath / fileFolder are joined with path.join, which yields \ on Windows.
Suggested fix: normalise to forward slashes before upload, e.g. p.split(path.sep).join('/') or building those paths with path.posix.
- An upload failure hides a metadata failure. In the sync routine the order is:
Registering application... → createDevelopmentApplication Uploading N files... → uploadFiles(...) → if (failures.length > 0) return { success: false, ... } Syncing manifest... ← never reached Because the early return happens before the manifest sync, a file-transport problem presents as a total absence of objects and fields, with an error that mentions neither. Even with the path bug fixed, surfacing this as "N files failed to upload; metadata was not applied" would save a lot of confusion.
Workaround Remove anything that produces an uploadable file: front components, page layouts and widgets that reference them, and public/ assets. An app that declares only objects, fields, relations and views syncs normally on Windows, because it uploads nothing.
This is a real limitation rather than a cosmetic one: front components and public assets are currently unusable from a Windows development machine. Running the CLI from WSL or a container works, since paths there are POSIX.
Environment OS Windows 11 Pro 10.0.26200 twenty-sdk 2.40.0 create-twenty-app 2.40.0 Server v2.40.2 (twentycrm/twenty-app-dev, Docker) Node 24.19.0 Yarn 4.13.0 Docker 29.8.0
Source: twentyhq/twenty