Share your installation files
An installation is a file you upload to AlexWeb. The API keeps its original bytes and gives it a URL in this format:
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.
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.
Download with curl
This example saves a ZIP package in the current directory: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:
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 asha256 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.
Upload through the API
Uploading requiresresources: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:
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 requiresresources: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.
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:- Upload the new package, preferably with a version in its filename.
- Test its new download URL and compare the SHA-256.
- Update your plugin’s instructions to use that new URL.
- Delete an older upload when you want to stop serving it.
resources:write:
{ "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.
How long a link works
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 reportsstatus: "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.