diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..cb218c22c84e0e6eb5a13126e4c1a8b4a78fd5be
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,97 @@
+[build-system]
+requires = [
+    "setuptools>=42",
+    "wheel",
+    "setuptools_scm[toml]>=3.4",
+    "setuptools_scm_git_archive"
+]
+build-backend = "setuptools.build_meta"
+
+[tool.setuptools]
+packages = ["GeoSpatialTools"]
+
+[project]
+name = "GeoSpatialTools"
+version = "0.1.0"
+dependencies = [
+]
+requires-python = ">=3.11"
+authors = [
+    {name = "Joseph Siddons", email = "josidd@noc.ac.uk"},
+    {name = "Richard Cornes", email = "rcornes@noc.ac.uk"},
+]
+maintainers = [
+    {name = "Joseph Siddons", email = "josidd@noc.ac.uk"},
+]
+description = "Tools for processing geo spatial data."
+readme = "README.md"
+license = {file = "LICENSE"}
+keywords = [
+    "icoads", "ship", "tracking", "duplicates", "ocean", "sst",
+]
+classifiers = [
+    "Development Status :: 1 - PreAlpha",
+    "Intended Audience :: Science/Research",
+    "Programming Language :: Python :: 3.11",
+    "Operating System :: OS Independent",
+]
+
+[project.optional-dependencies]
+extra = [
+    "ipykernel",
+]
+test = [
+    "pytest",
+]
+
+[tool.ruff]
+line-length = 80
+indent-width = 4
+target-version = "py311"
+exclude = [
+    ".eggs",
+    ".git",
+    ".venv",
+    "build",
+    "venv",
+]
+
+[tool.ruff.lint]
+extend-select = [
+  "RUF022" # unsorted-dunder-all
+]
+ignore = [
+  "D205", # blank-line-after-summary
+  "D400", # ends-in-period
+  "D401" # non-imperative-mood
+]
+preview = true
+select = [
+  "C90", # mccabe-complexity
+  "D", # docstrings
+  "E", # pycodestyle errors
+  "F", # pyflakes
+  "N802", # invalid-function-name
+  "S", # bandit
+  "W" # pycodestyle warnings
+]
+
+[tool.ruff.format]
+quote-style = "double" # Like Black, use double quotes for strings.
+indent-style = "space" # Like Black, indent with spaces, rather than tabs.
+skip-magic-trailing-comma = false # Like Black, respect magic trailing commas.
+line-ending = "auto" # Like Black, automatically detect the appropriate line ending.
+
+[tool.ruff.lint.pydocstyle]
+convention = "numpy"
+
+[tool.ruff.lint.flake8-import-conventions.aliases]
+"matplotlib.pyplot" = "plt"
+numpy = "np"
+pandas = "pd"
+polars = "pl"
+scipy = "sp"
+xarray = "xr"
+
+[project.urls]
+Repository = "https://git.noc.ac.uk/josidd/pycoads"