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

  1. Delete or gitignore the non-text files (.DS_Store, swap files, target/, logs/) from the dbt project folder
  2. Move genuinely needed binaries out of the synced path and reference them by URL at run time
  3. 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

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


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/c2c820cea620afcb. Report an issue: GitHub.