Skip to main content
Share your installation files

Upload once. Copy a curl command.

Give your Home Assistant plugin, package, or setup file a stable download link. Manage the file in the developer console and let users download it without an API key.

An installation is a file you upload to AlexWeb. The API keeps its original bytes and gives it a URL in this format:
YOUR_INSTALLATION_TOKEN is an example placeholder. Replace the entire example URL with the URL returned by your upload. The real token is a randomly generated, 256-bit value; you do not choose it or put your API key in its place. You can upload a ZIP archive, a shell script, a text file, or another package. AlexWeb stores and serves the file. It does not execute it or decide how your plugin should be installed. Your Home Assistant plugin still needs its own installation instructions for the system it supports.
Anyone with the download URL can download the file while the link is active. Upload files you intend to distribute. Keep passwords, API keys, personal configuration, and other private data out of installation packages.

Upload from the console

1

Open Installations

Sign in to the developer console, or connect using an API key with resources:write. Open Installations in the sidebar.
2

Choose your file

Select the file you want users to download and give it a recognizable display name. The file must be nonempty and no larger than 10 MiB. For a plugin release, use a versioned filename such as alexweb-ha-plugin-1.0.0.zip.
3

Upload the file

Wait for the upload to finish. AlexWeb returns the file’s identifier, exact size, SHA-256 digest, and public download URL. Creating a link does not install the file on your computer or on Home Assistant.
4

Copy the command

Copy the download link or curl command from the installation’s controls. Run the command on the computer where you want to save the file, using the output filename you want. Follow the plugin’s own setup instructions afterward.
The display name helps you recognize the file in the console. The filename is the name supplied for a download. You cannot edit an uploaded file’s contents in place: upload a new file for each release.

Download with curl

This example saves a ZIP package in the current directory:
Replace the URL with your real download link. Change alexweb-ha-plugin.zip to the appropriate output filename for the file you uploaded. On Windows, curl.exe explicitly runs curl rather than a PowerShell alias. The options mean: No authorization header is needed for this URL. Your account password and API key are used for managing uploads, and do not belong in the public download command. To check that a link is available without downloading its body:
The download response uses application/octet-stream and an attachment filename. The Content-Length header gives its size in bytes. Partial downloads and download resume are not supported. Responses use Cache-Control: no-store so a deleted link is not intentionally retained as a cached download.

Check the file’s SHA-256

Every upload returns a sha256 value calculated from the original bytes. After downloading the file, calculate its SHA-256 locally and compare it with the value from the console or authenticated metadata response.
The hexadecimal values should match, ignoring letter case. A matching digest confirms that the downloaded bytes match the uploaded file. It does not establish who wrote the file or whether the plugin is suitable for your Home Assistant installation.

Upload through the API

Uploading requires resources:write. Send the file directly as the request body with Content-Type: application/octet-stream. Do not wrap it in JSON, base64, or a multipart form.
--data-binary @filename reads and sends the local file’s original bytes. A successful upload returns HTTP 201 and one metadata object:
These are illustrative values. The example ID, token, digest, and size do not describe a real uploaded package. For spaces or non-ASCII characters, encode the header’s value using JavaScript’s encodeURIComponent behavior. For example, Home Assistant plugin 1.0.0 becomes Home%20Assistant%20plugin%201.0.0. The developer console handles these headers for you.

Read metadata and list your files

Reading metadata requires resources:read. It is separate from the public download: a person with a download link cannot list your account’s other files. The list response contains data and pagination, using the same pagination format as other major API endpoints. It also contains:
  • storage.usedBytes: bytes used by the account’s undeleted installation files.
  • storage.activeCount: number of stored files, including files whose creating credential is unavailable.
  • storage.maxBytes, maxInstallations, and maxFileBytes: the account and file limits.
  • permissions: the scopes used for reads and writes.
The file’s id is used for authenticated management requests. The random token in its url is used for public downloads. These are different values and cannot be substituted for each other.

Update or remove a release

An upload is immutable. To publish a new version:
  1. Upload the new package, preferably with a version in its filename.
  2. Test its new download URL and compare the SHA-256.
  3. Update your plugin’s instructions to use that new URL.
  4. Delete an older upload when you want to stop serving it.
Old links continue to refer to their original bytes while they remain active. Uploading a newer file does not replace the content behind an earlier link. Deleting requires resources:write:
A successful deletion returns { "id": "INSTALLATION_ID", "revoked": true }. Deletion removes the stored bytes and permanently disables that URL. A later upload receives a new URL. Previously downloaded copies remain with their recipients. Links created while signed in to the console belong to the account and survive signing out of that browser session. Links created using an API key depend on that key remaining active. Expiring, revoking, or rotating the creating key makes those downloads unavailable. An OAuth-created upload also depends on the exact access token used to upload it. The download becomes unavailable when that token expires, normally after 15 minutes, even if the app has a refresh token. Revoking the grant, disabling the application, or revoking its authorizing access can also stop the download. Use a signed-in account session in the console for a persistent plugin release URL. Metadata reports status: "unavailable" when its creating access is no longer active. The file still occupies storage until you delete it using another authorized credential. Public downloads return the same 404 for unknown, deleted, or unavailable links.

Limits and troubleshooting

The console’s storage summary helps you check remaining space. An unavailable upload still counts toward the account’s file and byte limits until deleted. Normal request allowances also apply; see Usage & Limits. If curl reports a failure, inspect the HTTP response before following any plugin setup steps. The example URLs on this page intentionally contain placeholders and will not download a package until replaced with a real upload’s URL.