diff --git a/build-fish-nightlies.zsh b/build-fish-nightlies.zsh
new file mode 100755
index 0000000000000000000000000000000000000000..0f436cf75e52252de69900d2b89c290858cdc345
--- /dev/null
+++ b/build-fish-nightlies.zsh
@@ -0,0 +1,119 @@
+#! /usr/bin/zsh -e
+
+###################
+# Script configuration
+
+# Note that you may wish to set the following variables before running
+# this tool. There are no sensible defaults.
+# DEBFULLNAME (e.g. Janice Lai)
+# DEBEMAIL (e.g. jlai@gmail.com)
+
+BUILD_AREA=~/fish_built
+FISH_SRCDIR=$BUILD_AREA/fish-shell
+FISH_BUILDSRCDIR=$BUILD_AREA/fish-build
+# dpkg build for Ubuntu PPAs
+DPKG_AREA=$BUILD_AREA/dpkgs
+# OpenSUSE Build Service staging area
+OBS_AREA=$BUILD_AREA/obs
+
+# build for the following PPA architectures:
+PPA_SERIES=(precise quantal raring)
+# (zsh array - will not work in bash or sh)
+
+GPG_KEYID=0C273BBA
+
+###################
+# Set up
+
+umask 022
+set -e
+
+# check whether we have anything to do
+
+cd $FISH_SRCDIR
+
+git fetch origin
+
+CURRENT_SHA=`git rev-parse --short master`
+UPSTREAM_SHA=`git rev-parse --short origin/master`
+
+[ "x$1" = "x--force" ] && CURRENT_SHA=force
+[ "$CURRENT_SHA" = "$UPSTREAM_SHA" ] && exit 0
+
+# update to the latest git tree
+
+git checkout master
+git merge origin/master
+
+VERSION=`git describe --tags --dirty 2>/dev/null`
+MASTER_SHA=`git rev-parse --short master`
+RPMVERSION=`echo $VERSION |sed 's/-/+/
+s/-/./'`
+
+# build archive
+build_tools/make_tarball.sh
+
+ARCHIVE=$BUILD_AREA/fish-$VERSION.tar.gz
+
+###################
+# Debian package build
+
+# make 'orig' tarball appear
+DPKG_ORIG_ARCHIVE=$DPKG_AREA/fish_$VERSION.orig.tar.gz
+rm -f $DPKG_ORIG_ARCHIVE
+ln -s $ARCHIVE $DPKG_ORIG_ARCHIVE
+
+# unpack it
+cd $DPKG_AREA
+tar xzvf $DPKG_ORIG_ARCHIVE
+
+# add debian packaging information
+# this is copied in from the git repo
+# the changes we make are thrown away - that is, not present in future builds
+# this is ok for snapshots but not so much for releases. it might confuse
+# apt-listchanges and other tools.
+# a 'better' way might be to have the whole thing in git with something like
+# git-buildpackage, but the workflow is fairly inflexible and there is lots of
+# gaps in the documentation.
+cd fish-$VERSION
+cp -r $FISH_BUILDSRCDIR/debian debian
+dch --newversion "$VERSION-1~unstable" --distribution unstable "Snapshot build from $MASTER_SHA"
+
+# build and upload the packages
+for series in $PPA_SERIES; do
+	sed -i "s/unstable/$series/g" debian/changelog
+	debuild -S -sa -k0C273BBA
+	dput fish-master-nightly ../fish_"$VERSION"-1~"$series"_source.changes
+	sed -i "s/$series/unstable/g" debian/changelog
+done
+
+###################
+# OBS
+
+# still in $DPKG_AREA
+# do a source package for 'unstable', which gets uploaded to OBS, no dput
+debuild -S -sa -k0C273BBA
+
+cd $OBS_AREA/shells:fish:master-nightly/fish
+
+# Sources and Debian control
+# clean up old files
+OBSOLETE=`find . -maxdepth 1 -name fish_\*.orig.tar.gz -o -name fish_\*.debian.tar.gz -o -name fish_\*.dsc`
+[ -n "$OBSOLETE" ] && echo $OBSOLETE | xargs rm
+ln -s $DPKG_ORIG_ARCHIVE .
+ln -s $DPKG_AREA/fish_"$VERSION"-1~unstable.dsc .
+ln -s $DPKG_AREA/fish_"$VERSION"-1~unstable.debian.tar.gz .
+
+# Spec file for RPM
+sed "s/@VERSION@/$VERSION/
+s/@RPMVERSION@/$RPMVERSION/" < $FISH_BUILDSRCDIR/fish.spec.in > fish.spec
+osc addremove
+
+# Commit changes
+osc commit -m "Snapshot build from $MASTER_SHA"
+
+# clean up
+# removes the source tree but leaves the uploaded files behind
+cd $DPKG_AREA
+rm -rf ./fish-$VERSION
+