diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..e4a5811
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,41 @@
+name: Test
+
+on: [push, pull_request, workflow_dispatch]
+
+env:
+ FORCE_COLOR: 1
+
+jobs:
+ test:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ python-version: ["pypy3.10", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
+ os: [windows-latest, macos-latest, ubuntu-latest]
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ persist-credentials: false
+
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python-version }}
+ allow-prereleases: true
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v4
+ with:
+ version: latest
+
+ - name: Install pytracery
+ run: |
+ uv venv
+ uv pip install -e .
+
+ - name: Test
+ run: |
+ uvx coverage run --source=tracery,tests -m unittest tests/test_*.py
+ uvx coverage report
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index ed820cf..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-language: python
-
-# Use container-based infrastructure
-sudo: false
-
-matrix:
- fast_finish: true
- include:
- - python: pypy
- - python: pypy3
- - python: 3.7
- dist: xenial
- sudo: true
- - python: 3.6
- - python: 3.5
- - python: 3.4
- - python: 2.7
-
-install:
- - pip install -r requirements.txt
- - pip install coverage
-
-script:
- - coverage run --source=tracery -m nose tests/test_*.py
-
-after_success:
- - pip install coveralls
- - coveralls
-
-after_script:
- - coverage report
- - pip install pycodestyle pyflakes
- - pyflakes . | tee >(wc -l)
- - pycodestyle --statistics --count .
diff --git a/README.rst b/README.rst
index c134ddc..9e4e3e8 100644
--- a/README.rst
+++ b/README.rst
@@ -1,8 +1,8 @@
Tracery for Python
==================
-.. image:: https://img.shields.io/travis/aparrish/pytracery.svg
- :target: https://travis-ci.org/aparrish/pytracery
+.. image:: https://github.com/aparrish/pytracery/actions/workflows/test.yml/badge.svg
+ :target: https://github.com/aparrish/pytracery/actions/workflows/test.yml
This is a (rough) port of `Kate Compton `_'s
wonderful `Tracery `_ to Python. The port