diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a9be13f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Posit Software, PBC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/pkg-py/README.md b/pkg-py/README.md
index 2e3331e..51991a5 100644
--- a/pkg-py/README.md
+++ b/pkg-py/README.md
@@ -1,4 +1,4 @@
-# shinyreact
+# shinyreact
[](https://github.com/posit-dev/shinyreact/actions/workflows/check-py.yaml)
@@ -8,7 +8,11 @@ shinyreact lets you write the UI of a [Shiny for Python](https://shiny.posit.co/
## Installation
-shinyreact is not yet on PyPI. Install the development version from GitHub:
+```bash
+pip install shinyreact
+```
+
+Or install the development version from GitHub:
```bash
pip install "git+https://github.com/posit-dev/shinyreact.git"
diff --git a/pyproject.toml b/pyproject.toml
index bb360ad..09cad05 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,12 +6,39 @@ build-backend = "hatchling.build"
name = "shinyreact"
version = "0.1.0"
description = "Shiny UI infrastructure for React-based component rendering"
+readme = "pkg-py/README.md"
+license = "MIT"
+license-files = ["LICENSE"]
+authors = [{ name = "Barret Schloerke", email = "barret@posit.co" }]
+keywords = ["shiny", "react", "web", "dashboard"]
+classifiers = [
+ "Development Status :: 4 - Beta",
+ "Intended Audience :: Developers",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
+ "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
+]
requires-python = ">=3.10"
dependencies = [
"shiny>=1.8.0",
"htmltools>=0.7.0",
]
+[project.urls]
+Homepage = "https://posit-dev.github.io/shinyreact/py/"
+Documentation = "https://posit-dev.github.io/shinyreact/py/"
+Repository = "https://github.com/posit-dev/shinyreact"
+Changelog = "https://github.com/posit-dev/shinyreact/blob/main/pkg-py/CHANGELOG.md"
+Issues = "https://github.com/posit-dev/shinyreact/issues"
+
+# The sdist is the Python package only, not the monorepo.
+[tool.hatch.build.targets.sdist]
+only-include = ["pkg-py/src", "pkg-py/README.md", "pkg-py/CHANGELOG.md"]
+
[tool.hatch.build.targets.wheel]
packages = [
"pkg-py/src/shinyreact",