This page covers the direct file path between your machine and a box. It works well for code, seed data, and build artifacts without turning the transfer into a shell exercise.
Local to box
Make one small local directory, then upload it:
mkdir -p ./project
printf 'hello from run9\n' > ./project/README.md
run9 box create work
run9 box exec work mkdir -p /work
run9 box cp ./project work:/work/
run9 box exec work ls -la /work/project
After the last command, the box contains /work/project/README.md.
Box to local
Create one file inside the box, then download it:
run9 box exec work mkdir -p /work/out
printf 'report from run9\n' | run9 box exec work -i tee /work/out/report.txt >/dev/null
run9 box cp work:/work/out/report.txt ./report.txt
Now ./report.txt is back on your machine.
How box paths work
box cp moves data between your machine and one box, so one side stays local and the other uses a box path:
box-id:/absolute/path
Local-to-local and box-to-box copies are separate workflows.
When copying a local directory, end the target with / so the directory name is kept under that target.
Create the destination directory first when you want the upload to land inside an existing place.
Output
Default output confirms the transfer:
OK: Copied ./project to work:/work/project.
Use JSON for a scriptable transfer summary:
run9 --json box cp ./project work:/work/