ship.md watches your folders. Drag a file, run mv, or ask an agent in plain English — and a courier is dispatched with a full audit trail.
Drop a file into another folder and a courier is on its way. Nested paths keep semantic context.
Your filesystem already knows where things are. ship.md just makes the outside world catch up.
Each folder is a place — home, office, warehouse, cloud-kitchen. Nesting is meaning.
skatebrd.txt, laptop.jpg, winter-clothes.txt. If it's in a folder, it's at that location.
Drag, mv, or ask an agent. The watcher turns filesystem events into courier calls.
After installing the mac app, ship.md works with Finder, Terminal, and any coding harness that can touch files.
Move files between folders the way you always have. ship.md watches the filesystem and turns every drop into a delivery event.
Any mv, cp, or rsync that lands in a watched folder becomes a real-world move with an audit trail.
agent, Codex, Claude, Pi, Arc — any agent that can move files can now ship things. Same filesystem, same result.
A tiny markdown manifest tells the watcher what lives there, who to notify, and where in the world it is. Context flows down the tree.
Declare what belongs in this folder. Incoming files are matched against it.
email · whatsapp · call — reached automatically on relevant events.
location, area, google_pin. Inherited by all nested folders unless overridden.
url · method · headers · params — fired on every matching event with folder context templated in.
{
"event_id": "be2845cd-342e-4066-93b4-e79aa32d1da2",
"timestamp": "2026-07-12T08:27:29.028892+00:00",
"event_type": "file_observed",
"payload": {
"event_kind": "created",
"detected_via": "filesystem",
"folder_name": "incoming",
"location": "mumbai",
"file_name": "laptop.jpg",
"ship_contexts": [
{
"path": "/Users/bosky/ship/warehouse/ship.md",
"location": "delhi",
"inventory_items": ["laptop"],
"emails": ["ops@example.com"]
}
],
"movement_message":
"ship.md flow observed: laptop.jpg in incoming (location=mumbai)"
}
}agent plans, executes, and shows you the audit trail. Same result — a real move with receipts.
move my skateboard from home to office, and show the audit trail it created
[
{
"tool": "mv",
"from": ".../home/skatebrd.txt",
"to": ".../office/skatebrd.txt",
"reason": "ship.md inventory match"
},
{
"tool": "showToast",
"title": "ship.md moved",
"message": "skatebrd.txt: home → office"
}
]SQLite inventory, config, and audit log visibility for the watcher service. Runs on your machine.
Click a provider to see the ship.md manifest ship.md generates. Same folder, different destination — swap the webhook, keep the audit trail.
## Inventory
- laptop
## Contacts
- email: ops@example.com
- whatsapp: +15550001111
## Context
- location: delhi
- provider: Uber
## Webhook
- url: https://api.uber.com/v1/customers/{customer_id}/deliveries
- method: POST
- headers:
Authorization: Bearer ${UBER_API_TOKEN}
Content-Type: application/json
- params:
pickup_address: {{ context.area }}
dropoff_address: {{ event.destination }}
manifest_items: {{ inventory }}
url, method, headers in ship.md${TOKEN} interpolated at dispatch