diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..66c806efc935b7849d2601addcc1affc0c364360
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,42 @@
+name: Release
+
+on:
+  push:
+    tags:
+      - '*'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - name: Set up Python
+      uses: actions/setup-python@v2
+      with:
+        python-version: '3.x'
+    - name: Install dependencies
+      run: |
+        python -m pip install --upgrade pip
+        pip install setuptools wheel twine
+    - name: Build and publish
+      env:
+        TWINE_USERNAME: __token__
+        TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
+      run: |
+        python setup.py sdist bdist_wheel
+        twine upload dist/*
+
+  release:
+    needs: build
+    runs-on: ubuntu-latest
+    steps:
+    - name: Create Release
+      id: create_release
+      uses: actions/create-release@v1
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      with:
+        tag_name: ${{ github.ref }}
+        release_name: Release ${{ github.ref }}
+        draft: false
+        prerelease: false
diff --git a/.gitignore b/.gitignore
index 96e79706bb1ee0711d3a0a9f586222a843f53df6..df57182d1a723b6eef2b8c4855918fb7a0907bd4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,10 +4,11 @@ __pycache__
 .DS_Store
 venv/
 /.vscode
+.vscode
 **/__pycache__
 **/*.py[cod]
 
 # local env files
 .env*.local
 .env
-mac.env
\ No newline at end of file
+mac.env
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 40b98b5824608f1bb36830bfd9f1a04339fb7351..0000000000000000000000000000000000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "cSpell.words": [
-        "linalg"
-    ]
-}
\ No newline at end of file