Manage Home Assistant custom integration symlinks for development
Project description
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>.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ha_link-0.1.1.tar.gz.
File metadata
- Download URL: ha_link-0.1.1.tar.gz
- Upload date:
- Size: 7.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f074985bcc2361bbcb5d3531d824c28d9d5244ecdb8377f8611ef153e2169b0b
|
|
| MD5 |
4e8e8b422cbc2dfdaedc8652c5be16ef
|
|
| BLAKE2b-256 |
323bd5cbae8183cab8f2ddf214c39c00cb1593dedbeabbd7964b44af5dd44e48
|
Provenance
The following attestation bundles were made for ha_link-0.1.1.tar.gz:
Publisher:
release.yml on g4bri3lDev/ha-link
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ha_link-0.1.1.tar.gz -
Subject digest:
f074985bcc2361bbcb5d3531d824c28d9d5244ecdb8377f8611ef153e2169b0b - Sigstore transparency entry: 1366830406
- Sigstore integration time:
-
Permalink:
g4bri3lDev/ha-link@1dcefb648d08232fe8ff0704cd7672d87ce8c9d7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/g4bri3lDev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1dcefb648d08232fe8ff0704cd7672d87ce8c9d7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ha_link-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ha_link-0.1.1-py3-none-any.whl
- Upload date:
- Size: 6.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c3a495ac890f199c13e51906037695c42fd6c8dcbcb4fcd4de925079c25c9d5c
|
|
| MD5 |
8ef8a33f20e577024c0ef4ae6bdbc021
|
|
| BLAKE2b-256 |
aad17e822cf760c15e1e3988af807777cb5f16bc634384bef0d85eee1dafe0d2
|
Provenance
The following attestation bundles were made for ha_link-0.1.1-py3-none-any.whl:
Publisher:
release.yml on g4bri3lDev/ha-link
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ha_link-0.1.1-py3-none-any.whl -
Subject digest:
c3a495ac890f199c13e51906037695c42fd6c8dcbcb4fcd4de925079c25c9d5c - Sigstore transparency entry: 1366830431
- Sigstore integration time:
-
Permalink:
g4bri3lDev/ha-link@1dcefb648d08232fe8ff0704cd7672d87ce8c9d7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/g4bri3lDev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1dcefb648d08232fe8ff0704cd7672d87ce8c9d7 -
Trigger Event:
push
-
Statement type: