ha-link
A small CLI tool for managing Home Assistant custom integration development against a single HA core clone.
Instead of maintaining one HA core clone per integration, ha-link symlinks your selected integrations into the core's custom_components/ directory so you can switch between them with an interactive picker.
Edits to your integration source are reflected immediately in the running HA instance — no copying needed.
Requirements
- Python 3.11+
- A local clone of Home Assistant core
Install
pip install ha-link
# or
uv tool install ha-link
First run
Run ha-link with no arguments. If no config is found, a short wizard guides you through setting the core path and registering your first integration repo:
No HA core path configured yet.
? Path to your HA core repo: ~/Developer/homeassistant/core
Core set to: /home/you/Developer/homeassistant/core
No integrations registered yet.
? Add your first integration repo now? Yes
? Path to the integration repo: ~/Developer/my-integration
? Alias for this integration: my-integration
Registered 'my-integration' (my_integration)
Usage
ha-link # interactive picker → sync symlinks
ha-link list # show all registered repos and their link status
ha-link add <path> # register a new integration repo
ha-link remove <alias> # unregister a repo (existing symlink not removed)
ha-link set-core <path> # change the HA core path
Picker
Running ha-link with no arguments opens an interactive checkbox. Use arrow keys and space to toggle, enter to confirm. Already-linked integrations are pre-checked.
? Select integrations to activate:
❯ ◉ my-integration (my_integration)
◯ another-one (another_integration)
Adding a new integration
Point ha-link add at the repo root. It auto-detects the integration domain from custom_components/<domain>/manifest.json and prompts for an alias.
ha-link add ~/Developer/my-new-integration
# ? Alias for this integration: [my-new-integration] my-new-integration
# Registered 'my-new-integration' (my_new_integration)
Unregistered symlinks
If ha-link list finds symlinks in custom_components/ that aren't registered, it marks them with [?] and offers to adopt them:
[✓] my-integration my_integration ~/Developer/my-integration
[?] (unregistered) old_integration ~/Developer/old-integration
Config
Config lives at ~/.config/ha-link/config.toml. You can edit it directly.
[core]
path = "/home/you/Developer/homeassistant/core"
[[repos]]
alias = "my-integration"
path = "/home/you/Developer/my-integration"
[[repos]]
alias = "another-one"
path = "/home/you/Developer/another-integration"
Each repo must contain a custom_components/<domain>/manifest.json. Symlinks are created at {core}/config/custom_components/<domain> if that directory exists (HA's built-in dev config), otherwise at {core}/custom_components/<domain>.
Metadata
Release files for ha-link 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ha_link-0.1.2.tar.gz | 7.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ha_link-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.9 kB
Release files / ha_link-0.1.2.tar.gz
| Download URL | ha_link-0.1.2.tar.gz |
|---|---|
| Size | 7.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fb1415023c52d05e544a9e30d32e01c557942a2f65c2ff259029cc343dc0b3be
|
|
BLAKE2b-256 checksum How to use checksums |
3d4b65dbe6cb0f4ba176d13f09556aab57df164e9a53e88c901e74cd9843fd57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency logRelease files / ha_link-0.1.2-py3-none-any.whl
| Download URL | ha_link-0.1.2-py3-none-any.whl |
|---|---|
| Size | 6.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0fe7ad788da8971709428693a0f240ae3523c16ac931af248ab3d5e858abb5b3
|
|
BLAKE2b-256 checksum How to use checksums |
4778dcd5436a3a490982bfd8c2ecb7c949abca0c5be4255d94a69b8841a23bf4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.
Transparency log