diff --git a/.gitignore b/.gitignore
index 1a6efb166e50d1f731309031f9a234199e6d559b..bade6d8b3da5e3e54693addfd5ba1ac7cc31a051 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 build
+repo
 stage
 stage.tar
diff --git a/cook.sh b/cook.sh
index df6c7ff127906a6b04416a8a3972cd230fd358f0..88517cf5ea4edbee0f17e16627cab35b8d9987dc 100755
--- a/cook.sh
+++ b/cook.sh
@@ -4,6 +4,7 @@ export RUST_TARGET_PATH="$PWD/targets"
 export RUSTFLAGS="--cfg redox"
 export CARGOFLAGS=
 TARGET=x86_64-unknown-redox
+REPO="$PWD/repo/$TARGET"
 
 set -e
 
@@ -23,7 +24,7 @@ function op {
             popd > /dev/null
             ;;
         unfetch)
-            rm -rf build
+            rm -rfv build
             ;;
         update)
             pushd build > /dev/null
@@ -48,18 +49,25 @@ function op {
             popd > /dev/null
             ;;
         unstage)
-            rm -rf stage
+            rm -rfv stage
             ;;
         tar)
             pushd stage > /dev/null
-            tar cf ../stage.tar .
+            tar cfv ../stage.tar .
             popd > /dev/null
             ;;
         untar)
-            rm -rf stage.tar
+            rm -rfv stage.tar
+            ;;
+        publish)
+            mkdir -p "$REPO"
+            cp -v stage.tar "$REPO/$1.tar"
+            ;;
+        unpublish)
+            rm -rfv "$REPO/$1.tar"
             ;;
         *)
-            echo "$0 {package} {build|clean|fetch|update}"
+            echo "cook.sh $1 {build|clean|fetch|unfetch|publish|unpublish|stage|unstage|tar|untar|update}"
             ;;
     esac
 }
@@ -75,8 +83,8 @@ then
             op "$1" "$arg"
         done
     else
-        echo "$0: recipe '$1' not found"
+        echo "cook.sh: recipe '$1' not found"
     fi
 else
-    echo "$0 {package} {build|clean|fetch|unfetch|stage|unstage|tar|untar|update}"
+    echo "cook.sh {package} {build|clean|fetch|unfetch|publish|unpublish|stage|unstage|tar|untar|update}"
 fi