diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..aacbc55
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+BASE=$(git rev-parse --show-toplevel)
+LSP_BIN_PATH=$HOME/.local/bin
+
+default_langs="ts rust"
+lsp_langs=${@:-"$default_langs"}
+
+pfx="~~~~~ "
+heading() {
+  echo
+  echo $pfx $1
+}
+
+get_platform() {
+  case "$(uname -s)" in
+    Linux*)     platform=Linux;;
+    Darwin*)    platform=Mac;;
+    CYGWIN*)    platform=Cygwin;;
+    MINGW*)     platform=MinGw;;
+    *)          platform="UNKNOWN:${unameOut}"
+  esac
+  echo $platform
+}
+
+heading "Linking config"
+for f in `find -E . -regex ".*\.vim$|.*\.lua$"`; do
+  p=${f#*/}
+  echo -e '\t' ${p}
+  path=~/.config/nvim/${p}
+  rm -rf ~/.config/nvim/${p}
+  mkdir -p $(dirname "${path}")
+  ln -s ${BASE}/${p} ~/.config/nvim/${p}
+done
+
+if [[ ! -e ~/.local/share/nvim/site/pack/packer/start/packer.nvim ]]; then
+  heading "Installing packer"
+  git clone https://github.com/wbthomason/packer.nvim\
+    ~/.local/share/nvim/site/pack/packer/start/packer.nvim
+fi
+
+heading "Installing plugins"
+nvim --headless +PackerInstall +qa
+nvim --headless +TSUpdate +qa
+echo
+
+fn_exists() { declare -F "$1" > /dev/null; }
+warn_path=false
+
+install_ts() {
+  if [[ -z $(which npm) ]]; then
+    echo "npm not installed"
+    return
+  fi
+  npm install -g vscode-html-languageserver-bin typescript typescript-language-server  vscode-css-languageserver-bin prettier
+}
+
+install_rust() {
+  if [[ ! -e ~/.local/bin/rust-analyzer ]]; then
+    mkdir -p ${LSP_BIN_PATH}
+    curl -L https://github.com/rust-analyzer/rust-analyzer/releases/latest/download/rust-analyzer-$(get_platform) -o ~/.local/bin/rust-analyzer
+    chmod +x ~/.local/bin/rust-analyzer
+    warn_path=true
+  else
+    echo "already installed"
+  fi
+}
+
+for lang in ${lsp_langs}; do
+  if fn_exists install_$lang ; then
+    heading "Installing $lang language server"
+    install_$lang
+  else
+    echo $lang setup not implemented
+    echo 
+  fi
+done
+
+if [[ ${warn_path} = true ]]; then
+  echo ""
+  echo "Ensure ${LSP_BIN_PATH} is available in your \$PATH variable"
+fi