Skip to content

Coming soon

Every file, agent-ready on arrival.

pks-agent-ftp

An FTP/SFTP server where every uploaded file lands with sidecar metadata — fully formed and ready for an agent to act on, the moment the transfer completes.

Illustration of pks-agent-ftp

Files arrive. Then nothing happens.

A camera in the field, a scanner on the network, a device that only knows how to push files over FTP — they all speak a protocol from another era, and then they stop. The file sits in a folder. Someone has to notice it, copy it, name it, and feed it into whatever comes next. Between the upload and the work, there is always a human, a script glued together at midnight, or a SaaS middleman holding your data. The handoff is where it breaks.

  • Devices speak FTP, not your stack. Cameras and field hardware push files and assume someone is on the other end — there rarely is.

  • A raw file is not a trigger. There is no clean, reliable signal that says "this upload is finished and here is everything you know about it."

  • The glue layer is someone else's. The usual fix is a third-party ingestion service you don't control, parked between your device and your data.

How it works

  1. Run the server

    One small Go binary, a username, a password, a folder. That is the whole install.

  2. Point your device at it

    On a Sony A7: Network → FTP Transfer, enter the host, user, and password. Hit shoot.

  3. Every file lands with its metadata

    As each upload completes, the file is saved and a `.meta.md` sidecar is written beside it — who sent it, when, from where, its size and SHA-256.

  4. Your agent watches one folder

    The sidecar appears only after the file is fully written, so its arrival is the one reliable "ready" signal. Watch for it, and act.

  • Built for cameras

    Tested against the Sony α7 series' built-in FTP transfer, including the passive-mode quirks real cameras depend on.

  • A sidecar for every file

    Each upload gets a Markdown + YAML `.meta.md` recording user, timestamp, source IP, original path, size, and SHA-256.

  • A trigger you can trust

    The sidecar is written only after the upload closes, so an agent watching for `*.meta.md` never acts on a half-written file.

  • Structure preserved

    Uploads keep the device's own folder layout under `uploads/<user>/`, so `DCIM/100MSDCF/` arrives exactly as the camera laid it out.

  • One container, one volume

    Ships as a single Docker image with a persistent volume — drop it on a Hetzner host or into Coolify and it keeps your uploads across restarts.

  • Honest about its limits

    v0 is plain FTP for a trusted network or VPN — no hidden surprises, with FTPS as the documented, deliberate next step.

  • We wrote the server, not assembled it. A small Go FTP server built from the foundation up, not a fork of someone else's ingestion platform. Every behavior — the passive-port range, the sidecar contract, the write-then-signal ordering — is a decision we made on purpose.

  • Your data never leaves your disk. Files land in a folder you own, on a host you run. There is no third-party ingestion service between your camera and your storage — nothing to breach, nothing to trust but yourself.

  • It runs everywhere a container runs. One image, a named volume, a port range. Direct Docker on Hetzner or managed through Coolify — same binary, your infrastructure, no platform lock-in.

  • The sidecar is a contract, not an accident. A plain Markdown + YAML file any tool can read, designed so the next layer of the suite can build on it without ever needing to understand FTP. The foundation holds; everything above it composes.

Your camera uploads. Your agent gets to work.

A small FTP server you own end to end. Point a Sony A7 — or any device that speaks FTP — at it, and every file lands on disk with a machine-readable sidecar. The instant the upload finishes, an agent has everything it needs to begin.

Explore the full suite