diff --git a/tasks/cdn_publish.sh b/tasks/cdn_publish.sh
new file mode 100755
index 00000000000..50d5f981525
--- /dev/null
+++ b/tasks/cdn_publish.sh
@@ -0,0 +1,48 @@
+#!/bin/bash -e
+
+# check if aws is installed
+if [[ ! -n `which aws` ]]; then
+    echo "Error: Please install and configure 'aws'."
+    exit 1
+fi
+
+# get plotly.js version from its package json
+version=$(node -e "console.log(require('./package.json').version);")
+major=$(node -e "console.log(require('./package.json').version.split('.')[0]);")
+
+# read tag either latest or rc
+tag=$(node -e "var rc = require('./package.json').version.split('-')[1]; console.log(rc ? rc.split('.')[0] : 'latest');")
+# if not v1 add major version to the tag e.g. latest-v2
+if [ $major -ne 1 ]; then tag=$tag-v$major; fi
+echo $tag
+
+dist=dist
+sync=build/sync
+
+# clear and make a sync folder
+if [ -d "$sync" ]; then rm -rf $sync; fi
+mkdir -p $sync
+
+# copy dist bundles over to the sync folder and rename them
+for path in `ls $dist/plotly*`; do
+    basename=${path##*/}
+    name=${basename%%.*}
+    ext="${basename#*.}"
+
+    if [ $name == 'plotly-geo-assets' ] || [ $name == 'plotly-with-meta' ]; then
+        continue
+    fi
+
+    cp $path "$sync/${name}-${version}.$ext"
+    cp $path "$sync/${name}-${tag}.$ext"
+done
+
+# copy topojson files over to the sync folder
+cp $dist/topojson/* $sync
+
+# list folder and files
+echo $sync
+ls $sync
+
+# sync to s3
+aws s3 sync $sync/ s3://plotly-cdn/ --acl public-read