windmill-labs/windmill · warning
Skipping ${relPath}: not a text file, so it is not part of t
Error message
Skipping ${relPath}: not a text file, so it is not part of the dbt project the bundle carries — dbt does not read it either What it means
When bundling a dbt project, wmill only carries text files it can read. A non-text file in the project is skipped with a warning because dbt would not read it either; only files dbt actually consumes that are oversized are hard errors (refused, not skipped).
Source
Thrown at cli/src/commands/script/script.ts:862
// A dbt project's authored files are text. A binary one -- an image
// under `docs/`, a `.DS_Store`, a parquet seed -- would be read as
// mojibake and, if it carries a NUL, rejected by Postgres with an
// opaque `unsupported Unicode escape sequence`, which the push then
// reports as success. Skip it, loudly: dbt does not read it either.
//
// Asked BEFORE reading: the predicate only stats the file and reads
// its first 8 KB, so a multi-gigabyte seed next to the project costs
// that rather than being loaded whole just to be rejected.
const exclusion = moduleFileExclusion(fullPath);
if (exclusion !== undefined) {
// Over the limit but readable as text — a large seed CSV is the
// realistic case — is refused rather than skipped: dbt WOULD have
// read it, so shipping the project without it deploys something that
// compiles here and fails at run time with a missing relation.
if (exclusion === "oversized") {
throw oversizedModuleFileError(relPath, fs.statSync(fullPath).size);
}
log.warn(
`Skipping ${relPath}: not a text file, so it is not part of the dbt project the ` +
`bundle carries — dbt does not read it either`,
);
continue;
}
// `language` is a required field of the API type and is not used for
// these: the worker writes them to their relative path and dbt reads
// the tree.
modules[relPath] = {
content: fs.readFileSync(fullPath).toString("utf-8"),
language: "dbt" as ScriptModule["language"],
};
} else if (exts.some((ext) => entry.name.endsWith(ext))) {
const content = readTextFileSync(fullPath);
const language = inferContentTypeFromFilePath(entry.name, defaultTs);
// Check for an accompanying lock file (helper.lock)
const baseName = entry.name.replace(/\.[^.]+$/, '');View on GitHub (pinned to e474e8803c)
Solutions
- Delete or gitignore the non-text files (.DS_Store, swap files, target/, logs/) from the dbt project folder
- Move genuinely needed binaries out of the synced path and reference them by URL at run time
- Verify the file is actually text — if dbt needs it and wmill misclassifies it, check encoding (UTF-8, no BOM issues)
Example fix
// before my_dbt_project/ models/... .DS_Store # skipped with warning // after my_dbt_project/ models/... # .DS_Store in .gitignore and deleted from disk
Defensive patterns
Strategy: validation
Validate before calling
for (const f of files) if (fs.readFileSync(f).slice(0,512).includes(0)) console.warn('binary will be skipped: '+f); Prevention
- gitignore .DS_Store/target/logs
- no binaries in dbt project
- UTF-8 text only
When it happens
Trigger: A dbt project folder contains binary or non-text files (images, .DS_Store, sqlite caches, compiled artifacts) that wmill's reader classifies as non-text while traversing the module directory.
Common situations: macOS .DS_Store files; editor swap files; binaries committed to the dbt repo (logos, PDFs); leftover dbt artifacts like target/ or logs/ directories inside the synced path.
Related errors
- Skipping ${relPath}: a local secrets file is not part of the
- ${relPath} is ${Math.ceil(size / 1024 / 1024)} MB, over the
- ${project} and ${other} deploy to the same path, so pushing
- App ${appPath} not found
- Dependency generation failed: ${queueResponse.status} ${queu
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/c2c820cea620afcb.
Report an issue: GitHub.