diff --git a/buildrepo b/buildrepo
new file mode 100755
index 0000000000000000000000000000000000000000..067629dfbbff4f1d4e160c981bbbc67b5b768c4e
--- /dev/null
+++ b/buildrepo
@@ -0,0 +1,80 @@
+#!/bin/sh
+
+program=${0##*/}
+
+aportsdir=${APORTSDIR:-$HOME/aports}
+repodir=${REPODIR:-$HOME/packages}
+
+
+usage() {
+	echo "usage: $program [-a APORTSDIR] [-d REPODIR] [-hp] [-l LOGPREFIX ] REPOSITORY..."
+	echo "options:"
+	echo " -a  Set the aports base dir to APORTSDIR instead of $aportsdir"
+	echo " -d  Set destination repository base dir to REPODIR instead of $repodir"
+	echo " -h  Show this help and exit"
+	echo " -l  Send build to logfile, prefixed by LOGPREFIX"
+	echo " -p  Purge obsolete packages from REPODIR after build"
+	exit 1
+}
+
+
+listpackages() {
+	cd "$aportsdir/$1"
+	for i in */APKBUILD; do
+		APKBUILD=$i abuild listpkg
+	done
+}
+
+# purge obsolete packages
+purge() {
+	[ -z "$dopurge" ] && return 0
+	local tmp=$(mktemp /tmp/$program-XXXXXX)	
+	cd "$repodir/$1" || return 1
+	trap 'rm -f "$tmp"; exit 1' INT
+	( listpackages "$1") >$tmp
+	ls *.apk 2>/dev/null | grep -v -w -f $tmp | xargs rm 2>/dev/null
+}
+
+build() {
+	local repo="$1" i
+
+	cd "$aportsdir/$repo" || return 1
+	mkdir -p "$repodir/$repo"
+
+	for i in */APKBUILD; do
+		( cd ${i%/*} || return 1
+		build $1 || exit 1
+		purge $1 || exit 1
+		  PKGDEST="$repodir/$repo" abuild -r || return 1
+		) || return 1
+	done
+	cd "$repodir/$repo"
+	md5sum *.apk | gzip -9 > INDEX.md5.gz
+	if which apk >/dev/null; then
+		apk index *.apk | gzip -9 > APK_INDEX.gz
+	fi
+	purge "$repo"
+}
+
+while getopts "a:d:hl:p" opt; do
+	case "$opt" in
+		a) aportsdir=$OPTARG;;
+		d) repodir=$OPTARG;;
+		h) usage >&2;;
+		l) logprefix=$OPTARG;;
+		p) dopurge=1;;
+	esac
+done
+shift $(($OPTIND - 1))
+
+[ $# -eq 0 ] && usage >&2
+
+while [ $# -gt 0 ]; do
+	if [ -n "$logprefix" ]; then
+		build $1  >$logprefix.$1.log 2>&1 || exit 1
+	else
+		build $1 || exit 1
+	fi
+	shift
+done
+