File path portability check across Windows, macOS and Linux

$0.005 USDC per call · Developer and security · POST /api/v1/path-portability · Id path-portability

Checks up to 500 relative file paths for names that break or collide on Windows, macOS or Linux: Windows reserved device names (CON.txt, NUL.tar.gz, COM¹), reserved characters, trailing dots and spaces, component and total length limits, and distinct paths that become one file through case folding or NFC/NFD normalization. For an agent that writes files from an archive, a generated tree or a repo before it touches a disk. It does not read the filesystem, expand 8.3 short names or environment long-path settings, and it models macOS as a case- and normalization-insensitive volume (the APFS flags), not as the user's actual volume.

What you get

A file named CON.txt, a trailing-dot name or two paths that differ only by case silently overwrite or fail on the other OS. One call checks the whole tree.

Call it

Send the JSON body below to https://agents.writerslogic.com/api/v1/path-portability. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.

curl -i -X POST https://agents.writerslogic.com/api/v1/path-portability \
  -H 'content-type: application/json' \
  -d '{"paths":["src/readme.md","src/README.md","docs/CON.txt","café.txt","café.txt","build/out."],"targets":["windows","macos","linux"]}'

Input

FieldTypeRequiredDescription
pathsarray<string; length 1..4096>; max 500 itemsyesRelative paths with "/" separators. At most 200000 characters in total.
targetsarray<string; one of "windows", "macos", "linux">; max 3 itemsnoDefault: windows, macos and linux.
destinationRootstring; length 0..1024noDirectory the paths will be created under; counted towards the total path length.

Example request body

{
  "paths": [
    "src/readme.md",
    "src/README.md",
    "docs/CON.txt",
    "café.txt",
    "café.txt",
    "build/out."
  ],
  "targets": [
    "windows",
    "macos",
    "linux"
  ]
}

Result

The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.

FieldTypeRequiredDescription
statusstring; one of "pass", "fail", "unknown", "unsupported"nopass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass.
checkedintegerno
targetsarray<string>no
findingsarray<object>noPer-target problems, capped at 100; errors make the status fail, warnings do not.
findingCountintegerno
collisionsarray<object>no
witnessesarray<object>no
versionsobjectnoEvery semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile).
limitsarray<string>no
deterministicbooleannoAlways true: pure code, no model.

Pay and connect

Available through: x402 (USDC on Base), MCP. MCP clients reach it through the infra-preflight-kit package.

Machine-readable