diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 5488119c26b629bb63f69d419a981bc597601d86..0000000000000000000000000000000000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,144 +0,0 @@
-version: '{build}'
-
-clone_depth: 5
-
-environment:
-  COVERALLS_REPO_TOKEN:
-    secure: VsCyKmdi8x0OFK+Jbzk7ZRAW3EtojWP85TWqWKi+vuGmdiQFX7rLPnuaw3kt++a8
-  access_token:
-    secure: T7XuBtHDu85Tk/d1AeyfhW3CVyzaoddTWmR4xsPIdQ3di0R6x8ncWqw3KrYXkWJm
-  priv_key:
-    secure: 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
-
-  TWINE_USERNAME: sleap
-  TWINE_PASSWORD:
-    secure: R0Tnz3hQ8xICe0404Ots1A==
-
-  BUILD_DIR: "build"
-
-  conda_access_token:
-    secure: d+v++uejbVEhIuaJSuFIOA==
-  matrix:
-  - PYTHON_VERSION: 3.6
-    PYTHON_ARCH: "64"
-    MINICONDA: C:\Miniconda36-x64
-
-init:
-- cmd: ''
-
-install:
-  # Add Miniconda to the PATH
-  - "set PATH=%MINICONDA%;%MINICONDA%\\Scripts;%PATH%"
-
-  # Setup always yes
-  - conda config --set always_yes yes --set changeps1 no
-
-  # Quietly update if needed
-  # - conda update -q conda
-
-  # Display conda version
-  - conda info -a
-
-  # If this is a tag build, we will need to upload a deployment, set up login
-  - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (conda install conda-build=3.17 anaconda-client conda-verify)
-  
-  # Look at this craziness, anaconda keeps a token based on hostname around and it
-  # prompts you to say yes to remove it. This holds up CI, no way to disable.
-  # The echo|set /p="yes" ouputs a yes with a single newline, otherwise it won't
-  # work!
-  - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (echo|set /p="yes" | anaconda login --username sleap --password %conda_access_token%)
- 
-  # Create/update the sleap environment in case some dependencies changed.
-  # we don't have GPUs on appveyor nodes and this will make
-  # building the environment faster.
-  - conda env create -n sleap_appveyor -f environment_nocuda.yml
-
-  # Activate things
-  - activate sleap_appveyor
-
-  # Conda Explicit Spec files don't include pip installed stuff.
-  # See: https://github.com/conda/conda/issues/8372
-  # We need to install this separately, what a mess.
-  # - pip install PySide2 opencv-python imgaug cattrs
-
-  # Install dev requirements too.
-  # - pip install -r dev_requirements.txt
-
-  # Install sleap package
-  # - pip install .
-
-build: off
-test_script:
-  - cmd: activate sleap_appveyor
-  - cmd: where python
-  - cmd: pytest --cov=sleap tests/
-
-on_success:
-  - cmd: coveralls
-  # Remove package tarballs so there's less to cache
-  - conda clean -a
-
-cache:
-  - C:\Miniconda36-x64\pkgs -> environment.yml
-  - '%LOCALAPPDATA%\pip\Cache'
-
-# here we are going to override common configuration
-for:
-
-# override settings for `main` branch
--
-  branches:
-    only:
-      - main
-
-  # Build and deploy our documentation. This involves checking out
-  # the repo, switching to the github pages branch, building the docs
-  # from to gh-pages branch and pushing. See:
-  # https://daler.github.io/sphinxdoc-test/includeme.html
-  # for details on how to set this up.
-  deploy_script:
-
-    # Setup private key for GitHub so we can push 
-    - ps: $fileContent = "-----BEGIN RSA PRIVATE KEY-----`n"
-    - ps: $fileContent += $env:priv_key.Replace(' ', "`n")
-    - ps: $fileContent += "`n-----END RSA PRIVATE KEY-----`n"
-    - ps: Set-Content $env:userprofile\.ssh\id_rsa $fileContent
-  
-    - git config --global user.email "dmturner@princeton.edu"
-    - git config --global user.name "David Turner"
-    - activate sleap_appveyor
-    - cd ..\
-    - mkdir sleap-docs
-    - cd sleap-docs
-    - git clone git@github.com:murthylab/sleap.git html
-    - cd html
-    - git checkout -b gh-pages remotes/origin/gh-pages
-    - git remote -v
-    - cd ..\..\sleap\docs
-    - make html push
-
-  # Deploy packages on tagged builds
-  after_deploy:
-    - cmd: cd ..\
-    # Deploy wheel to PyPi
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (python setup.py bdist_wheel)
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (python -m twine upload dist/* --non-interactive --skip-existing --disable-progress-bar)
-    # Deploy (Windows) Conda package to anaconda sleap channel
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (conda build .conda --output-folder %BUILD_DIR%)
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (anaconda upload --force %BUILD_DIR%\win-64\*.tar.bz2)
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (anaconda logout)
-#    - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
-
-# Deploy "dev" builds if develop branch is tagged
--
-  branches:
-    only:
-      - develop
-  deploy_script:
-    # Deploy wheel to PyPi
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (python setup.py bdist_wheel)
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (python -m twine upload dist/* --non-interactive --skip-existing --disable-progress-bar)
-    # Deploy (Windows) Conda package to anaconda sleap channel
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (conda build .conda --output-folder %BUILD_DIR%)
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (anaconda upload --force %BUILD_DIR%\win-64\*.tar.bz2 --label dev)
-    - cmd: IF "%APPVEYOR_REPO_TAG%" == "true" (anaconda logout)