Filesystem Portability¶
Every data path in a Haute pipeline — a Data Input path, a Load File path, a Quote Input file — is ultimately a filename handed to a filesystem. On a single machine this just works, and you can skip this page.
Read it if a pipeline (or its data folder) moves between machines or operating systems: a checkout shared between a Windows laptop and a Linux server, work inside WSL, files on a network mount, or a Databricks/CI environment picking up a pipeline authored on a Mac. Different filesystems disagree about when two spellings of a filename are "the same file", and those disagreements produce bugs that appear only after the move.
What Haute does — and deliberately doesn't do¶
Haute passes your path to the operating system exactly as you spelled it. It normalises path shape — backslashes become forward slashes, and a relative path is resolved from the project root, or from the pipeline folder when only that file exists — but it never rewrites the names: no case-folding, no accent/Unicode normalisation, no snapping to the on-disk spelling.
That means which file answers (or whether any file answers) is the filesystem's decision, not Haute's — and different filesystems decide differently. Haute keeps this deliberate: silently "fixing" a spelling would make pipelines open different files on different platforms with no visible signal. A path that resolves outside the project, or that names a Windows reserved device (CON, NUL, COM1 and the like), is refused.
Which matching rule applies?¶
The common cases first — if you're in this table's first two rows and your files stay on one machine or in OneDrive/SharePoint, the simple mental model is correct and nothing below will ever bite you:
| Where the lookup happens | Case (Foo.csv vs foo.csv) |
Accents (café NFC vs NFD) |
|---|---|---|
| Windows on NTFS | Same file | Different files |
| macOS on APFS/HFS+ | Same file | Same file |
| Linux on ext4/xfs | Different files | Different files |
The subtlety, and the limit of the simple mental model: the rule follows the software stack that performs the lookup, not the operating system you sit at. "Windows machine" does not automatically mean "case-insensitive":
| Setup | Effective rule |
|---|---|
| Haute running inside WSL2 on a Windows machine, data on the Linux filesystem | Exact bytes — it's a Linux process on ext4 |
Windows app reading WSL files via \\wsl.localhost\... |
Exact bytes — the Linux side performs the lookup |
| Windows with a third-party ext4 driver | Driver-defined: usually Windows-style case-insensitive matching over byte-exact entries — and if genuine case-twins exist on the disk, which one you get is undefined |
| Network mounts (SMB/NFS shares) | The server's filesystem and protocol settings decide, not your client OS |
| NTFS folders with per-directory case-sensitivity enabled | Exact bytes for that folder only |
Accents are the quiet one
Only macOS treats the two Unicode spellings of an accented character (é typed directly vs e + combining accent) as the same name. A filename created on a Mac can carry the decomposed form invisibly — it looks identical on screen, opens fine on the Mac, and misses on both Windows and Linux. If files are shared across platforms, prefer plain ASCII names.
The three traps¶
- Case-twins created on Linux.
Rates.csvandrates.csvcoexist happily on ext4. Move that folder to Windows or macOS and the pair collapses to one file — the reference is now ambiguous, and on exotic setups (third-party drivers) which file wins is anyone's guess. - Spelling drift. The config says
rates.csv, the disk saysRates.csv. On Windows and macOS this opens fine — and breaks the moment the checkout lands on Linux. The forgiving platforms hide the mismatch; the strict one reveals it. - Invisible accent forms. As above — created on a Mac, identical on screen, missing everywhere else.
How Haute protects you¶
- Save-time guards. Node and table names that would collide case-insensitively on disk (and Windows-reserved names like
CONorLPT1) are rejected when you save — on every platform, so a pipeline authored on Linux stays loadable on Windows and vice versa. - Access-time warning. When a data file is read whose path has case-equivalent sibling spellings on disk (trap 1 or 2 in the making), Haute logs a warning naming the twins in the server log. Treat it as a portability defect and fix the spelling before sharing the checkout.
- No silent fixing. By design — an error you can see beats a file you didn't mean to open.
Practical rules¶
- Match the config spelling to the on-disk name exactly, even where your OS forgives you — the next platform may not.
- A boring naming convention (lowercase, underscores, ASCII) for data files sidesteps every trap on this page.
- If you see the case-ambiguity warning in the server log, resolve it before the checkout travels.
See also: Data Input, Load File.