# Tower CLI
The Tower CLI is one of the main ways to interact with the Tower environment.
You can do basically everything you need inside the Tower CLI, including run
your code locally or remotely in the Tower cloud.
## Installing the Tower CLI
The main way to install the CLI is using the `pip` package manager.
```bash
$ pip install -U tower
```
You can also download the CLI directly from one of our [releases](https://github.com/tower/tower-cli/releases/latest).
### Nix Flake
If you have Nix installed with flakes enabled, you can install the latest version
of tower CLI with the following:
#### Profile
```bash
$ nix profile install github:tower/tower-cli#tower
```
#### NixOS/nix-darwin
If you are using [NixOS]()/[nix-darwin](https://github.com/nix-darwin/nix-darwin)
with flakes then you can add the following:
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
tower-cli.url = "github:tower/tower-cli";
};
outputs = { self, nixpkgs, tower-cli, ... }@inputs: {
# with nix-darwin:
# darwinConfigurations.your-hostname = darwin.lib.darwinSystem {
nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [{
environment.systemPackages = [ tower-cli.packages.${system}.tower ];
}];
};
};
}
```
#### Devenv
If you're using [devenv](https://devenv.sh), you can add tower-cli to your project:
```yaml
# devenv.yaml
inputs:
tower-cli:
url: github:tower/tower-cli
```
```nix
# devenv.nix
{ inputs, pkgs, ... }:
{
packages = [
inputs.tower-cli.packages.${pkgs.stdenv.system}.tower
];
}
```
## Using the Tower CLI
There are two big components in the Tower CLI reposiory: The CLI itself and the
runtime environment for the Tower cloud. We host the runtime in this repository
and pull it in to our internal code because we want to ensure that the
environments behave _exactly the same_ locally and in our cloud!
### Using the CLI
It's pretty straight forward! But here's what it looks like right now.
```bash
$ tower
Tower is a compute platform for modern data projects
Usage: tower [OPTIONS] <COMMAND>
Commands:
login Create a session with Tower
apps Interact with the apps that you own
secrets Interact with the secrets in your Tower account
deploy Deploy your latest code to Tower
run Run your code in Tower or locally
version Print the current version of Tower
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
```
### Optional Features
Tower supports several optional features that can be installed as needed:
#### AI/LLM Support
```bash
pip install "tower[ai]"
```
Provides integration with language models through:
- `tower.llms`: Access to language model functionality
#### Apache Iceberg Support
```bash
pip install "tower[iceberg]"
```
Provides Apache Iceberg table support:
- `tower.create_table`: Create Iceberg tables
- `tower.load_table`: Load data from Iceberg tables
#### Install All Optional Features
```bash
pip install "tower[all]"
```
#### Check Available Features
You can check which features are available in your installation:
```python
import tower
import pprint
# Print information about all features
pprint.pprint(tower.get_available_features())
# Check if a specific feature is enabled
print(tower.is_feature_enabled("ai"))
```
### MCP Server Integration
Tower CLI includes an MCP (Model Context Protocol) server that allows AI assistants and editors to interact with your Tower account directly. The MCP server provides tools for managing apps, secrets, teams, and deployments.
#### Available Tools
The MCP server exposes the following tools:
- `tower_apps_list` - List all Tower apps in your account
- `tower_apps_create` - Create a new Tower app
- `tower_apps_show` - Show details for a Tower app and its recent runs
- `tower_apps_logs` - Get logs for a specific Tower app run
- `tower_apps_delete` - Delete a Tower app
- `tower_secrets_list` - List secrets in your Tower account
- `tower_secrets_create` - Create a new secret in Tower
- `tower_secrets_delete` - Delete a secret from Tower
- `tower_teams_list` - List teams you belong to
- `tower_teams_switch` - Switch context to a different team
- `tower_deploy` - Deploy your app to Tower cloud
- `tower_run` - Run your app locally
#### Starting the MCP Server
The Tower MCP server uses Server-Sent Events (SSE) for communication and runs on port 34567 by default. Start the server:
```bash
tower mcp-server
```
Or specify a custom port:
```bash
tower mcp-server --port 8080
```
The server will display a message showing the URL it's running on:
```
SSE server running on http://127.0.0.1:34567
```
#### Editor Configuration
##### Claude Code
Add the Tower MCP server to Claude Code using SSE transport:
```bash
claude mcp add tower http://127.0.0.1:34567/sse --transport sse
```
Or using JSON configuration with SSE:
```json
{
"mcpServers": {
"tower": {
"url": "http://127.0.0.1:34567/sse",
"transport": "sse"
}
}
}
```
For custom ports, adjust the URL accordingly (e.g., `http://127.0.0.1:8080/sse`).
##### Cursor
Add this to your Cursor settings (`settings.json`):
```json
{
"mcp.servers": {
"tower": {
"url": "http://127.0.0.1:34567/sse",
"transport": "sse"
}
}
}
```
##### Windsurf
Configure in Windsurf settings:
```json
{
"mcp": {
"servers": {
"tower": {
"url": "http://127.0.0.1:34567/sse",
"transport": "sse"
}
}
}
}
```
##### Zed
Add to your Zed `settings.json`:
```json
{
"assistant": {
"mcp_servers": {
"tower": {
"url": "http://127.0.0.1:34567/sse",
"transport": "sse"
}
}
}
}
```
##### VS Code
For VS Code with MCP extensions, add to your `settings.json`:
```json
{
"mcp.servers": {
"tower": {
"url": "http://127.0.0.1:34567/sse",
"transport": "sse"
}
}
}
```
#### Prerequisites
Before using the MCP server, ensure you're logged into Tower:
```bash
tower login
```
The MCP server will use your existing Tower CLI authentication and configuration.
### About the runtime environment
The [tower-runtime](crates/tower-runtime) crate has the Rust library that makes
up the runtime environment itself. All the interfaces are defined in the main
crate, and the `local` package contains the invokation logic for invoking tower
packages locally.
To learn more about tower packages, see the
[tower-package](crates/tower-package) crate.
## Contributing
We welcome contributions to the Tower CLI and runtime environment! Please see
the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information.
### Code of Conduct
All contributions must abide by our code of conduct. Please see
[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for more information.
## Development
Here are a few handy tips and common workflows when developing the Tower CLI.
### Getting Started
1. Install development dependencies:
```bash
uv sync --group dev
```
2. Set up pre-commit hooks for code formatting:
```bash
uv run --group dev pre-commit install
```
This will automatically run Black formatter on Python files before each commit.
### Python SDK development
We use `uv` for all development. You can spawn a REPL in context using `uv` very
easily. Then you can `import tower` and you're off to the races!
```bash
uv run python
```
To run tests:
```bash
uv sync --locked --all-extras --dev
uv run pytest tests
```
### Code Formatting
We use Black for Python code formatting. The pre-commit hooks will automatically format your code, but you can also run it manually:
```bash
# Format all Python files in the project
uv run --group dev black .
# Check formatting without making changes
uv run --group dev black --check .
```
If you need to get the latest OpenAPI SDK, you can run
`./scripts/generate-python-api-client.sh`.
## Testing
We use pytest to run tests. Copy `pytest.ini.template` to `pytest.ini` and
replace the values of environment variables
Raw data
{
"_id": null,
"home_page": null,
"name": "tower",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "automation, flake8, pycodestyle, pyflakes, pylint, clippy",
"author": null,
"author_email": "\"Tower Computing Inc.\" <brad@tower.dev>",
"download_url": "https://files.pythonhosted.org/packages/15/98/9c2df26e66ece996232827b6513d8c51e2013e48c3648cab18ef6f9f0c1c/tower-0.3.32.tar.gz",
"platform": null,
"description": "# Tower CLI\n\nThe Tower CLI is one of the main ways to interact with the Tower environment.\nYou can do basically everything you need inside the Tower CLI, including run\nyour code locally or remotely in the Tower cloud.\n\n## Installing the Tower CLI\n\nThe main way to install the CLI is using the `pip` package manager.\n\n```bash\n$ pip install -U tower\n```\n\nYou can also download the CLI directly from one of our [releases](https://github.com/tower/tower-cli/releases/latest).\n\n### Nix Flake\n\nIf you have Nix installed with flakes enabled, you can install the latest version\nof tower CLI with the following:\n\n#### Profile\n\n```bash\n$ nix profile install github:tower/tower-cli#tower\n```\n\n#### NixOS/nix-darwin\n\nIf you are using [NixOS]()/[nix-darwin](https://github.com/nix-darwin/nix-darwin)\nwith flakes then you can add the following:\n\n```nix\n{\n inputs = {\n nixpkgs.url = \"github:NixOS/nixpkgs/nixos-unstable\";\n tower-cli.url = \"github:tower/tower-cli\";\n };\n\n outputs = { self, nixpkgs, tower-cli, ... }@inputs: {\n # with nix-darwin:\n # darwinConfigurations.your-hostname = darwin.lib.darwinSystem {\n nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {\n system = \"x86_64-linux\";\n modules = [{\n environment.systemPackages = [ tower-cli.packages.${system}.tower ];\n }];\n };\n };\n}\n```\n\n#### Devenv\n\nIf you're using [devenv](https://devenv.sh), you can add tower-cli to your project:\n\n```yaml\n# devenv.yaml\ninputs:\n tower-cli:\n url: github:tower/tower-cli\n```\n\n```nix\n# devenv.nix\n{ inputs, pkgs, ... }:\n{\n packages = [\n inputs.tower-cli.packages.${pkgs.stdenv.system}.tower\n ];\n}\n```\n\n## Using the Tower CLI\n\nThere are two big components in the Tower CLI reposiory: The CLI itself and the\nruntime environment for the Tower cloud. We host the runtime in this repository\nand pull it in to our internal code because we want to ensure that the\nenvironments behave _exactly the same_ locally and in our cloud!\n\n### Using the CLI\n\nIt's pretty straight forward! But here's what it looks like right now.\n\n```bash\n$ tower\nTower is a compute platform for modern data projects\n\nUsage: tower [OPTIONS] <COMMAND>\n\nCommands:\n login Create a session with Tower\n apps Interact with the apps that you own\n secrets Interact with the secrets in your Tower account\n deploy Deploy your latest code to Tower\n run Run your code in Tower or locally\n version Print the current version of Tower\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -h, --help Print help\n```\n\n### Optional Features\n\nTower supports several optional features that can be installed as needed:\n\n#### AI/LLM Support\n\n```bash\npip install \"tower[ai]\"\n```\n\nProvides integration with language models through:\n\n- `tower.llms`: Access to language model functionality\n\n#### Apache Iceberg Support\n\n```bash\npip install \"tower[iceberg]\"\n```\n\nProvides Apache Iceberg table support:\n\n- `tower.create_table`: Create Iceberg tables\n- `tower.load_table`: Load data from Iceberg tables\n\n#### Install All Optional Features\n\n```bash\npip install \"tower[all]\"\n```\n\n#### Check Available Features\n\nYou can check which features are available in your installation:\n\n```python\nimport tower\nimport pprint\n\n# Print information about all features\npprint.pprint(tower.get_available_features())\n\n# Check if a specific feature is enabled\nprint(tower.is_feature_enabled(\"ai\"))\n```\n\n### MCP Server Integration\n\nTower CLI includes an MCP (Model Context Protocol) server that allows AI assistants and editors to interact with your Tower account directly. The MCP server provides tools for managing apps, secrets, teams, and deployments.\n\n#### Available Tools\n\nThe MCP server exposes the following tools:\n- `tower_apps_list` - List all Tower apps in your account\n- `tower_apps_create` - Create a new Tower app\n- `tower_apps_show` - Show details for a Tower app and its recent runs\n- `tower_apps_logs` - Get logs for a specific Tower app run\n- `tower_apps_delete` - Delete a Tower app\n- `tower_secrets_list` - List secrets in your Tower account\n- `tower_secrets_create` - Create a new secret in Tower\n- `tower_secrets_delete` - Delete a secret from Tower\n- `tower_teams_list` - List teams you belong to\n- `tower_teams_switch` - Switch context to a different team\n- `tower_deploy` - Deploy your app to Tower cloud\n- `tower_run` - Run your app locally\n\n#### Starting the MCP Server\n\nThe Tower MCP server uses Server-Sent Events (SSE) for communication and runs on port 34567 by default. Start the server:\n\n```bash\ntower mcp-server\n```\n\nOr specify a custom port:\n\n```bash\ntower mcp-server --port 8080\n```\n\nThe server will display a message showing the URL it's running on:\n```\nSSE server running on http://127.0.0.1:34567\n```\n\n#### Editor Configuration\n\n##### Claude Code\n\nAdd the Tower MCP server to Claude Code using SSE transport:\n\n```bash\nclaude mcp add tower http://127.0.0.1:34567/sse --transport sse\n```\n\nOr using JSON configuration with SSE:\n\n```json\n{\n \"mcpServers\": {\n \"tower\": {\n \"url\": \"http://127.0.0.1:34567/sse\",\n \"transport\": \"sse\"\n }\n }\n}\n```\n\nFor custom ports, adjust the URL accordingly (e.g., `http://127.0.0.1:8080/sse`).\n\n##### Cursor\n\nAdd this to your Cursor settings (`settings.json`):\n\n```json\n{\n \"mcp.servers\": {\n \"tower\": {\n \"url\": \"http://127.0.0.1:34567/sse\",\n \"transport\": \"sse\"\n }\n }\n}\n```\n\n##### Windsurf\n\nConfigure in Windsurf settings:\n\n```json\n{\n \"mcp\": {\n \"servers\": {\n \"tower\": {\n \"url\": \"http://127.0.0.1:34567/sse\",\n \"transport\": \"sse\"\n }\n }\n }\n}\n```\n\n##### Zed\n\nAdd to your Zed `settings.json`:\n\n```json\n{\n \"assistant\": {\n \"mcp_servers\": {\n \"tower\": {\n \"url\": \"http://127.0.0.1:34567/sse\",\n \"transport\": \"sse\"\n }\n }\n }\n}\n```\n\n##### VS Code\n\nFor VS Code with MCP extensions, add to your `settings.json`:\n\n```json\n{\n \"mcp.servers\": {\n \"tower\": {\n \"url\": \"http://127.0.0.1:34567/sse\",\n \"transport\": \"sse\"\n }\n }\n}\n```\n\n#### Prerequisites\n\nBefore using the MCP server, ensure you're logged into Tower:\n\n```bash\ntower login\n```\n\nThe MCP server will use your existing Tower CLI authentication and configuration.\n\n### About the runtime environment\n\nThe [tower-runtime](crates/tower-runtime) crate has the Rust library that makes\nup the runtime environment itself. All the interfaces are defined in the main\ncrate, and the `local` package contains the invokation logic for invoking tower\npackages locally.\n\nTo learn more about tower packages, see the\n[tower-package](crates/tower-package) crate.\n\n## Contributing\n\nWe welcome contributions to the Tower CLI and runtime environment! Please see\nthe [CONTRIBUTING.md](CONTRIBUTING.md) file for more information.\n\n### Code of Conduct\n\nAll contributions must abide by our code of conduct. Please see\n[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for more information.\n\n## Development\n\nHere are a few handy tips and common workflows when developing the Tower CLI.\n\n### Getting Started\n\n1. Install development dependencies:\n ```bash\n uv sync --group dev\n ```\n\n2. Set up pre-commit hooks for code formatting:\n ```bash\n uv run --group dev pre-commit install\n ```\n\nThis will automatically run Black formatter on Python files before each commit.\n\n### Python SDK development\n\nWe use `uv` for all development. You can spawn a REPL in context using `uv` very\neasily. Then you can `import tower` and you're off to the races!\n\n```bash\nuv run python\n```\n\nTo run tests:\n\n```bash\nuv sync --locked --all-extras --dev\nuv run pytest tests\n```\n\n### Code Formatting\n\nWe use Black for Python code formatting. The pre-commit hooks will automatically format your code, but you can also run it manually:\n\n```bash\n# Format all Python files in the project\nuv run --group dev black .\n\n# Check formatting without making changes\nuv run --group dev black --check .\n```\n\nIf you need to get the latest OpenAPI SDK, you can run\n`./scripts/generate-python-api-client.sh`.\n\n## Testing\nWe use pytest to run tests. Copy `pytest.ini.template` to `pytest.ini` and \nreplace the values of environment variables \n\n",
"bugtrack_url": null,
"license": null,
"summary": "Tower CLI and runtime environment for Tower.",
"version": "0.3.32",
"project_urls": null,
"split_keywords": [
"automation",
" flake8",
" pycodestyle",
" pyflakes",
" pylint",
" clippy"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "950c72f9fcec2f93e867fd2729edc487a7fbd97437d40f858d307eca3135b9f7",
"md5": "43ab8b26d58ef6b2b8ac9ded5df62809",
"sha256": "48d50bc8b9ef324ad690372d71ee28bc82b2c9640120ce3cd98e9b35cd2baa4e"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-linux_armv6l.whl",
"has_sig": false,
"md5_digest": "43ab8b26d58ef6b2b8ac9ded5df62809",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6407027,
"upload_time": "2025-10-07T11:41:39",
"upload_time_iso_8601": "2025-10-07T11:41:39.314412Z",
"url": "https://files.pythonhosted.org/packages/95/0c/72f9fcec2f93e867fd2729edc487a7fbd97437d40f858d307eca3135b9f7/tower-0.3.32-py3-none-linux_armv6l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "eecd5b387f0aff988908c8a460f2e8cdd1394483229924c6fd2ec6a17a285a75",
"md5": "f0e46c1df2a449ec087e1dd623a80bf2",
"sha256": "38ac9ea3b6d48d88aec8dd4c00b55ab81f203b8504443751e84b463b335a2dc9"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "f0e46c1df2a449ec087e1dd623a80bf2",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6241670,
"upload_time": "2025-10-07T11:41:41",
"upload_time_iso_8601": "2025-10-07T11:41:41.856954Z",
"url": "https://files.pythonhosted.org/packages/ee/cd/5b387f0aff988908c8a460f2e8cdd1394483229924c6fd2ec6a17a285a75/tower-0.3.32-py3-none-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "78461e0d274bb300443d654a26274d365a03e581d6315926255fb7ddbc8ffc06",
"md5": "3690c7595499e87e43314172caf6b29a",
"sha256": "5ac3a96c46afa5b04a654ae1ce5ea98cec8bb95cb9cc66e84a0be37259362c78"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "3690c7595499e87e43314172caf6b29a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 5992519,
"upload_time": "2025-10-07T11:41:43",
"upload_time_iso_8601": "2025-10-07T11:41:43.628207Z",
"url": "https://files.pythonhosted.org/packages/78/46/1e0d274bb300443d654a26274d365a03e581d6315926255fb7ddbc8ffc06/tower-0.3.32-py3-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "193324b9982351ee5f5eee68fff0f3386b06fffc502067bfd5eab0423270f7cc",
"md5": "918960d93b84947a8df8660cae0cf1fc",
"sha256": "3cfbad22d6d1ca35777a25bcac49dff292c71d11b70091b6eb65b0399647302c"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "918960d93b84947a8df8660cae0cf1fc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6117053,
"upload_time": "2025-10-07T11:41:45",
"upload_time_iso_8601": "2025-10-07T11:41:45.354406Z",
"url": "https://files.pythonhosted.org/packages/19/33/24b9982351ee5f5eee68fff0f3386b06fffc502067bfd5eab0423270f7cc/tower-0.3.32-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b6382c76d6af9b708f6855c8e0eadfa73c89fb8043e593f38bc0ea0f52d2f26d",
"md5": "c9bcd82c5a85b8be7df93957bc7f2a98",
"sha256": "268a0fff3aec14a9aa1ad5bd77273cc7df61424ead07aad5b6569376605344b7"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "c9bcd82c5a85b8be7df93957bc7f2a98",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6338375,
"upload_time": "2025-10-07T11:41:47",
"upload_time_iso_8601": "2025-10-07T11:41:47.286832Z",
"url": "https://files.pythonhosted.org/packages/b6/38/2c76d6af9b708f6855c8e0eadfa73c89fb8043e593f38bc0ea0f52d2f26d/tower-0.3.32-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d41f7287f37fe13cb6f8065be5f202b58dd59f24726f1e8ac98daefb552d64aa",
"md5": "28ce3a7c16c384436b46433ba1a54504",
"sha256": "d161ba9f96a0406b6e1652137b2fc8c74c1bbad0a3202a8a3fdd72b365953884"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "28ce3a7c16c384436b46433ba1a54504",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6474039,
"upload_time": "2025-10-07T11:41:49",
"upload_time_iso_8601": "2025-10-07T11:41:49.544861Z",
"url": "https://files.pythonhosted.org/packages/d4/1f/7287f37fe13cb6f8065be5f202b58dd59f24726f1e8ac98daefb552d64aa/tower-0.3.32-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9f019c7cb8e903df79eaa5b8c0c340443558365dbc4c7b35baa3159aef4ce85d",
"md5": "14db6e67fbdcc04b2b6e35c45c321b4a",
"sha256": "3a666b8cfdb86d9bb2bd391e227b789b0730e9b4a1d162c307a0376f722703f9"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "14db6e67fbdcc04b2b6e35c45c321b4a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6009215,
"upload_time": "2025-10-07T11:41:51",
"upload_time_iso_8601": "2025-10-07T11:41:51.378177Z",
"url": "https://files.pythonhosted.org/packages/9f/01/9c7cb8e903df79eaa5b8c0c340443558365dbc4c7b35baa3159aef4ce85d/tower-0.3.32-py3-none-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d32a2cdc1b1f3d94fa338c610bce970d849214386e454f067db67a4e85335f33",
"md5": "0affef6a96707f34c5176b6c75e50fe6",
"sha256": "207300aa1700222db37417c832ce2f26e4ed201ee872ec974bbad168c9ec2277"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "0affef6a96707f34c5176b6c75e50fe6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6940688,
"upload_time": "2025-10-07T11:41:53",
"upload_time_iso_8601": "2025-10-07T11:41:53.200986Z",
"url": "https://files.pythonhosted.org/packages/d3/2a/2cdc1b1f3d94fa338c610bce970d849214386e454f067db67a4e85335f33/tower-0.3.32-py3-none-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3d6a25c2e7c216ca6b3769b9145147b2f50e7f79a227561d9c86573afbf4e661",
"md5": "16e23be99bcbae18c18122f464ed4a04",
"sha256": "ba4ad9faaf1aec2e8b00aea7880a777eabd327a0466f37c23ed8c271cc6cf382"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "16e23be99bcbae18c18122f464ed4a04",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6552325,
"upload_time": "2025-10-07T11:41:56",
"upload_time_iso_8601": "2025-10-07T11:41:56.053928Z",
"url": "https://files.pythonhosted.org/packages/3d/6a/25c2e7c216ca6b3769b9145147b2f50e7f79a227561d9c86573afbf4e661/tower-0.3.32-py3-none-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2ed0eba4dff9b2f41699f541419562a32f4102050195a1a6f7876c1060176dd8",
"md5": "242f7e2952ab0db4b42ea5a338eb5f77",
"sha256": "798d853e2bc0693f52a0a22d90f23f94d440e2e0cd9f5b14861fb5d82a6daf59"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "242f7e2952ab0db4b42ea5a338eb5f77",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6248636,
"upload_time": "2025-10-07T11:41:58",
"upload_time_iso_8601": "2025-10-07T11:41:58.293704Z",
"url": "https://files.pythonhosted.org/packages/2e/d0/eba4dff9b2f41699f541419562a32f4102050195a1a6f7876c1060176dd8/tower-0.3.32-py3-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9ee51c0a8a91c87eac15132c8073af8b2061cf42093d1ddacdb260b84fd16cb0",
"md5": "5b4395bfdacf062ca0190213a7dd8269",
"sha256": "ff44ef5ad4fe49359529860a45af4ad8b6ff6653d56d8435f7540789ffd7a746"
},
"downloads": -1,
"filename": "tower-0.3.32-py3-none-win_arm64.whl",
"has_sig": false,
"md5_digest": "5b4395bfdacf062ca0190213a7dd8269",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 5945850,
"upload_time": "2025-10-07T11:42:01",
"upload_time_iso_8601": "2025-10-07T11:42:01.068367Z",
"url": "https://files.pythonhosted.org/packages/9e/e5/1c0a8a91c87eac15132c8073af8b2061cf42093d1ddacdb260b84fd16cb0/tower-0.3.32-py3-none-win_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "15989c2df26e66ece996232827b6513d8c51e2013e48c3648cab18ef6f9f0c1c",
"md5": "c3cad26b531157b1914588eb69e89a83",
"sha256": "48630dd8a33415fa8eeab5484dada738380cc1bcfde3825d2543c26db98352f0"
},
"downloads": -1,
"filename": "tower-0.3.32.tar.gz",
"has_sig": false,
"md5_digest": "c3cad26b531157b1914588eb69e89a83",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 237111,
"upload_time": "2025-10-07T11:42:03",
"upload_time_iso_8601": "2025-10-07T11:42:03.158365Z",
"url": "https://files.pythonhosted.org/packages/15/98/9c2df26e66ece996232827b6513d8c51e2013e48c3648cab18ef6f9f0c1c/tower-0.3.32.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-07 11:42:03",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "tower"
}