Compare commits

...

53 Commits

Author SHA1 Message Date
github-actions[bot] 76b516671c Update HA version badge to 2026.5.4
2 weeks ago
Carlo Costanzo 7e2035260c Tighten infrastructure dashboard container telemetry
2 weeks ago
Carlo Costanzo 8eb50abc00 Silence overlapping nighttime automations
2 weeks ago
Carlo Costanzo 7a7875caa2 Refine fridge and Tesla reminder packages
2 weeks ago
Carlo Costanzo 19602868cc Document garage automation walkthrough
2 weeks ago
Carlo Costanzo 06173d4863 Debounce fridge door open alerts
2 weeks ago
Carlo Costanzo 9ae1ee0968 Add infrastructure DNS drift and repair cleanup
2 weeks ago
Carlo Costanzo 68e14fc1b5 docs(infra): document codex appliance vm topology
2 weeks ago
Carlo Costanzo 50f505b1c5 chore(bearclaw): point HA bridge at codex appliance vm
2 weeks ago
Carlo Costanzo 6247b8cdee Refresh package table entries
2 weeks ago
Carlo Costanzo 9cad1437e7 Refine Tesla plug-in reminder gating
2 weeks ago
Carlo Costanzo ab276c5ac1 Add bedroom kiosk recovery package
2 weeks ago
Carlo Costanzo 87b0247bfd Add snoozeable maintenance reminders
2 weeks ago
Carlo Costanzo 2b32c800ed Track health diary container state
2 weeks ago
github-actions[bot] 0e18f68f0e Update HA version badge to 2026.5.4
3 weeks ago
Carlo Costanzo a3a39ae2f8 chore(ha): bump version to 2026.5.4
3 weeks ago
Carlo Costanzo eebf6fb19c docs(vacuum): add 2026 walkthrough references
3 weeks ago
Carlo Costanzo 81e458a827 Normalize Home Assistant YAML headers
3 weeks ago
Carlo Costanzo 84d0188835 Normalize repo metadata headers
3 weeks ago
Carlo Costanzo 7fd432d668 Update HA version to 2026.5.3
3 weeks ago
Carlo Costanzo 4ef28de66f Update package docs and Vacation Mode links
3 weeks ago
Carlo Costanzo f28f684127 Reduce vacuum and fridge briefing noise
3 weeks ago
Carlo Costanzo 8b9c55f9e9 Handle Docker telemetry reconnect outages
3 weeks ago
Carlo Costanzo 280742ef49 Use garage close for Tesla plug reminders
3 weeks ago
Carlo Costanzo b905e04561 Fix Lovelace popup card structure
3 weeks ago
github-actions[bot] 4a8a3126c7 Update HA version badge to 2026.5.2
3 weeks ago
Carlo Costanzo b7c3202746 Fix TruffleHog image version input
3 weeks ago
github-actions[bot] 9a0a128540 Update HA version badge to 2026.5.2
3 weeks ago
Carlo Costanzo b7268a632a Add TruffleHog secret scan workflow
3 weeks ago
github-actions[bot] 1baee9b684 Update HA version badge to 2026.5.2
4 weeks ago
Carlo Costanzo a21666b129 Add Nebula Sync health dispatch
4 weeks ago
Carlo Costanzo 4c3a8a01b4 Add actionable Phyn restore notification
4 weeks ago
Carlo Costanzo 30a18e0bbc Tune front door package vision checks
4 weeks ago
Carlo Costanzo ae2c335802 Update HA version to 2026.5.2
4 weeks ago
Carlo Costanzo 94d80e28b5 Add dashboard walkthrough links
4 weeks ago
github-actions[bot] 06b1ae7fc5 Update HA version badge to 2026.5.1
4 weeks ago
Carlo Costanzo dc72b7a080 Add weekly digest video to README
4 weeks ago
github-actions[bot] 63c24e9be6 Update HA version badge to 2026.5.1
4 weeks ago
Carlo Costanzo 68c85b1fae Add weekly digest workflow
4 weeks ago
github-actions[bot] fa6cac5fee Update HA version badge to 2026.5.1
4 weeks ago
Carlo Costanzo 4cb01fbc1f Stop tracking Home Assistant cache icons
4 weeks ago
Carlo Costanzo 539ede8586 Update Joanna dispatch and infra health checks
4 weeks ago
github-actions[bot] cb42a22f43 Update HA version badge to 2026.5.0
1 month ago
Carlo Costanzo d3623e2f2d Log Duplicati verifier transport errors
1 month ago
Carlo Costanzo e0684f9773 Add health coach context and readiness guidance
1 month ago
github-actions[bot] 1ee008e2d3 Update HA version badge to 2026.4.4
1 month ago
Carlo Costanzo 347d626792 Update Home Assistant agent instructions
1 month ago
Carlo Costanzo 8e9ea094bf Fix Duplicati verification timing and Proxmox cleanup
1 month ago
Carlo Costanzo 8670d3892e Update Home Assistant repo instructions
1 month ago
github-actions[bot] 8ea8fcd7f3 Update HA version badge to 2026.4.4
1 month ago
Carlo Costanzo c1aec19626 Update HA automations, scripts, and sidebar config docs
1 month ago
Carlo Costanzo 67224ed4a3 Document kitchen sink circadian automation
1 month ago
Carlo Costanzo e79a383586 Add Frigate video previews and BearClaw metadata
1 month ago

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# GitHub Funding - repository sponsorship links.
# Defines funding links shown by GitHub for this repository.
# -------------------------------------------------------------------
######################################################################
# These are supported funding model platforms # These are supported funding model platforms
github: CCOSTAN github: CCOSTAN
@ -11,4 +20,3 @@ issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username otechie: # Replace with a single Otechie username
custom: ["https://amzn.to/2SYaXl7"] custom: ["https://amzn.to/2SYaXl7"]

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# GitHub Welcome Bot - first-time contributor messages.
# Defines GitHub welcome comments for issues and pull requests.
# -------------------------------------------------------------------
######################################################################
# Configuration for welcome - https://github.com/behaviorbot/welcome # Configuration for welcome - https://github.com/behaviorbot/welcome
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome # Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome

@ -0,0 +1,498 @@
const repository = process.env.GITHUB_REPOSITORY || "CCOSTAN/Home-AssistantConfig";
const [owner, repo] = repository.split("/");
const serverUrl = process.env.GITHUB_SERVER_URL || "https://github.com";
const apiUrl = process.env.GITHUB_API_URL || "https://api.github.com";
const token = process.env.GITHUB_TOKEN || "";
const dryRun = process.env.DIGEST_DRY_RUN === "1" || process.argv.includes("--dry-run");
if (!owner || !repo) {
throw new Error(`GITHUB_REPOSITORY must be owner/repo, got "${repository}"`);
}
if (!token && !dryRun) {
throw new Error("GITHUB_TOKEN is required unless DIGEST_DRY_RUN=1 is set.");
}
const now = process.env.DIGEST_NOW ? new Date(process.env.DIGEST_NOW) : new Date();
const end = process.env.DIGEST_END ? new Date(process.env.DIGEST_END) : now;
const start = process.env.DIGEST_START
? new Date(process.env.DIGEST_START)
: new Date(end.getTime() - 7 * 24 * 60 * 60 * 1000);
for (const [name, date] of [["DIGEST_START", start], ["DIGEST_END", end]]) {
if (Number.isNaN(date.getTime())) {
throw new Error(`${name} is not a valid date.`);
}
}
const defaultHeaders = {
Accept: "application/vnd.github+json",
"X-GitHub-Api-Version": "2022-11-28",
"User-Agent": "home-assistant-config-weekly-digest",
};
if (token) {
defaultHeaders.Authorization = `Bearer ${token}`;
}
function formatDigestDate(date) {
const day = new Intl.DateTimeFormat("en-US", { day: "numeric", timeZone: "UTC" }).format(date);
const month = new Intl.DateTimeFormat("en-US", { month: "long", timeZone: "UTC" }).format(date);
const year = new Intl.DateTimeFormat("en-US", { year: "numeric", timeZone: "UTC" }).format(date);
return `${day} ${month}, ${year}`;
}
function formatCountVerb(count, singular, plural) {
return count === 1 ? singular : plural;
}
function searchRange(field) {
return `${field}:${start.toISOString()}..${end.toISOString()}`;
}
function isWithinWindow(value) {
if (!value) {
return false;
}
const date = new Date(value);
return !Number.isNaN(date.getTime()) && date >= start && date <= end;
}
function markdownLink(label, url) {
const safeLabel = String(label || "unknown").replace(/[[\]]/g, "\\$&");
return `[${safeLabel}](${url})`;
}
function userLink(user) {
if (!user || !user.login) {
return "unknown";
}
return markdownLink(user.login, user.html_url || `${serverUrl}/${user.login}`);
}
function issueLine(item, icon) {
return `${icon} #${item.number} ${markdownLink(item.title, item.html_url)}, by ${userLink(item.user)}`;
}
function commitLine(commit) {
const title = commit.commit?.message?.split("\n")[0] || commit.sha;
const author = commit.author
? userLink(commit.author)
: commit.commit?.author?.name || "unknown";
return `:hammer_and_wrench: ${markdownLink(title, commit.html_url)} by ${author}`;
}
function releaseLine(release) {
const label = release.name || release.tag_name;
return `:bookmark: ${markdownLink(label, release.html_url)}`;
}
function stargazerLine(star) {
return `:star: ${userLink(star.user)}`;
}
function sectionDivider(lines) {
lines.push("");
lines.push(" - - - ");
}
async function githubRequest(method, path, options = {}) {
const query = options.query || {};
const url = new URL(`${apiUrl}${path}`);
for (const [key, value] of Object.entries(query)) {
if (value !== undefined && value !== null) {
url.searchParams.set(key, String(value));
}
}
const response = await fetch(url, {
method,
headers: {
...defaultHeaders,
...(options.headers || {}),
},
body: options.body ? JSON.stringify(options.body) : undefined,
});
const text = await response.text();
const data = text ? JSON.parse(text) : null;
if (!response.ok) {
const message = data?.message || text || response.statusText;
throw new Error(`${method} ${url.pathname} failed: ${response.status} ${message}`);
}
return { data, headers: response.headers };
}
async function getAllPages(path, options = {}) {
const results = [];
let page = 1;
while (true) {
const { data } = await githubRequest("GET", path, {
...options,
query: {
...(options.query || {}),
per_page: 100,
page,
},
});
if (!Array.isArray(data) || data.length === 0) {
break;
}
results.push(...data);
if (data.length < 100) {
break;
}
page += 1;
}
return results;
}
async function searchIssues(query) {
const results = [];
let page = 1;
while (true) {
const { data } = await githubRequest("GET", "/search/issues", {
query: {
q: query,
sort: "created",
order: "asc",
per_page: 100,
page,
},
});
const items = data.items || [];
results.push(...items);
if (items.length < 100 || results.length >= data.total_count) {
break;
}
page += 1;
}
return results;
}
function hasLabel(item, labelName) {
return (item.labels || []).some((label) => label.name === labelName);
}
async function getCreatedIssueItems() {
const items = await searchIssues(`repo:${owner}/${repo} ${searchRange("created")}`);
return items.filter((item) => !hasLabel(item, "weekly-digest"));
}
async function getPullRequests() {
const updated = await searchIssues(`repo:${owner}/${repo} is:pr ${searchRange("updated")}`);
const merged = await searchIssues(`repo:${owner}/${repo} is:pr ${searchRange("merged")}`);
const byNumber = new Map();
for (const item of [...updated, ...merged]) {
byNumber.set(item.number, item);
}
const pulls = [];
for (const item of byNumber.values()) {
const { data } = await githubRequest("GET", `/repos/${owner}/${repo}/pulls/${item.number}`);
pulls.push({
...item,
merged_at: data.merged_at,
});
}
return pulls.sort((a, b) => a.number - b.number);
}
async function getCommits() {
const commits = await getAllPages(`/repos/${owner}/${repo}/commits`, {
query: {
since: start.toISOString(),
until: end.toISOString(),
},
});
return commits.sort((a, b) => new Date(a.commit.author.date) - new Date(b.commit.author.date));
}
async function getReleases() {
const releases = await getAllPages(`/repos/${owner}/${repo}/releases`);
return releases
.filter((release) => isWithinWindow(release.published_at || release.created_at))
.sort((a, b) => new Date(a.published_at || a.created_at) - new Date(b.published_at || b.created_at));
}
async function getStargazers() {
const stars = await getAllPages(`/repos/${owner}/${repo}/stargazers`, {
headers: {
Accept: "application/vnd.github.star+json",
},
});
return stars
.filter((star) => isWithinWindow(star.starred_at))
.sort((a, b) => new Date(a.starred_at) - new Date(b.starred_at));
}
function getReactionTotal(item) {
const reactions = item.reactions || {};
return (reactions["+1"] || 0) + (reactions.smile || 0) + (reactions.tada || 0) + (reactions.heart || 0);
}
function appendIssues(lines, createdItems) {
const openItems = createdItems.filter((item) => item.state === "open");
const closedItems = createdItems.filter((item) => item.state === "closed");
const likedItem = [...createdItems].sort((a, b) => getReactionTotal(b) - getReactionTotal(a))[0];
const noisyItem = [...createdItems].sort((a, b) => (b.comments || 0) - (a.comments || 0))[0];
lines.push("# ISSUES");
lines.push(`Last week ${createdItems.length} issues were created.`);
lines.push(`Of these, ${closedItems.length} issues have been closed and ${openItems.length} issues are still open.`);
if (openItems.length > 0) {
lines.push("## OPEN ISSUES");
lines.push(...openItems.map((item) => issueLine(item, ":green_heart:")));
}
if (closedItems.length > 0) {
lines.push("## CLOSED ISSUES");
lines.push(...closedItems.map((item) => issueLine(item, ":heart:")));
}
if (likedItem && getReactionTotal(likedItem) > 0) {
const reactions = likedItem.reactions || {};
lines.push("## LIKED ISSUE");
lines.push(issueLine(likedItem, ":+1:"));
lines.push(
`It received :+1: x${reactions["+1"] || 0}, :smile: x${reactions.smile || 0}, :tada: x${
reactions.tada || 0
} and :heart: x${reactions.heart || 0}.`,
);
}
if (noisyItem && noisyItem.comments > 0) {
lines.push("## NOISY ISSUE");
lines.push(issueLine(noisyItem, ":speaker:"));
lines.push(`It received ${noisyItem.comments} comments.`);
}
}
function appendPullRequests(lines, pulls) {
const openPulls = pulls.filter((pull) => pull.state === "open");
const mergedPulls = pulls.filter((pull) => isWithinWindow(pull.merged_at));
const closedPulls = pulls.filter((pull) => pull.state === "closed" && !isWithinWindow(pull.merged_at));
lines.push("# PULL REQUESTS");
if (pulls.length === 0) {
lines.push("Last week, no pull requests were created, updated or merged.");
return;
}
lines.push(`Last week, ${pulls.length} pull requests were created, updated or merged.`);
if (openPulls.length > 0) {
lines.push(`## OPEN PULL ${formatCountVerb(openPulls.length, "REQUEST", "REQUESTS")}`);
lines.push(...openPulls.map((item) => issueLine(item, ":green_heart:")));
}
if (closedPulls.length > 0) {
lines.push(`## CLOSED PULL ${formatCountVerb(closedPulls.length, "REQUEST", "REQUESTS")}`);
lines.push(...closedPulls.map((item) => issueLine(item, ":heart:")));
}
if (mergedPulls.length > 0) {
lines.push(`## MERGED PULL ${formatCountVerb(mergedPulls.length, "REQUEST", "REQUESTS")}`);
lines.push(...mergedPulls.map((item) => issueLine(item, ":purple_heart:")));
}
}
function appendCommits(lines, commits) {
lines.push("# COMMITS");
if (commits.length === 0) {
lines.push("Last week there were no commits.");
return;
}
lines.push(`Last week there were ${commits.length} commits.`);
lines.push(...commits.map(commitLine));
}
function appendContributors(lines, commits, createdItems, pulls) {
const contributors = new Map();
for (const commit of commits) {
if (commit.author?.login) {
contributors.set(commit.author.login, commit.author);
}
}
if (contributors.size === 0) {
for (const item of [...createdItems, ...pulls]) {
if (item.user?.login) {
contributors.set(item.user.login, item.user);
}
}
}
lines.push("# CONTRIBUTORS");
lines.push(`Last week there ${formatCountVerb(contributors.size, "was", "were")} ${contributors.size} contributors.`);
lines.push(...[...contributors.values()].map((user) => `:bust_in_silhouette: ${userLink(user)}`));
}
function appendStargazers(lines, stargazers) {
lines.push("# STARGAZERS");
if (stargazers.length === 0) {
lines.push("Last week there were no stagazers.");
return;
}
lines.push(`Last week there were ${stargazers.length} stagazers.`);
lines.push(...stargazers.slice(0, 75).map(stargazerLine));
if (stargazers.length > 75) {
lines.push(`...and ${stargazers.length - 75} more.`);
}
lines.push("You all are the stars! :star2:");
}
function appendReleases(lines, releases) {
lines.push("# RELEASES");
if (releases.length === 0) {
lines.push("Last week there were no releases.");
return;
}
lines.push(`Last week there ${formatCountVerb(releases.length, "was", "were")} ${releases.length} releases.`);
lines.push(...releases.map(releaseLine));
}
function buildDigestBody({ createdItems, pulls, commits, stargazers, releases }) {
const repoUrl = `${serverUrl}/${owner}/${repo}`;
const lines = [
`Here's the **Weekly Digest** for [*${owner}/${repo}*](${repoUrl}):`,
];
sectionDivider(lines);
appendIssues(lines, createdItems);
sectionDivider(lines);
appendPullRequests(lines, pulls);
sectionDivider(lines);
appendCommits(lines, commits);
sectionDivider(lines);
appendContributors(lines, commits, createdItems, pulls);
sectionDivider(lines);
appendStargazers(lines, stargazers);
sectionDivider(lines);
appendReleases(lines, releases);
sectionDivider(lines);
lines.push("");
lines.push(
`That's all for last week, please :eyes: **Watch** and :star: **Star** the repository [*${owner}/${repo}*](${repoUrl}) to receive next weekly updates. :smiley:`,
);
lines.push("");
lines.push(
`*You can also [view all Weekly Digests by clicking here](${repoUrl}/issues?q=is:open+is:issue+label:weekly-digest).* `,
);
lines.push("");
lines.push(`> Your [**Weekly Digest**](${repoUrl}/actions/workflows/weekly-digest.yml) bot. :calendar:`);
return lines.join("\n");
}
async function getOpenDigestIssues() {
return getAllPages(`/repos/${owner}/${repo}/issues`, {
query: {
state: "open",
labels: "weekly-digest",
},
});
}
async function createDigestIssue(title, body) {
const { data } = await githubRequest("POST", `/repos/${owner}/${repo}/issues`, {
body: {
title,
body,
labels: ["weekly-digest"],
},
});
return data;
}
async function closeOldDigestIssue(issue, newIssue) {
const labels = new Set((issue.labels || []).map((label) => label.name));
labels.add("oldnews");
await githubRequest("POST", `/repos/${owner}/${repo}/issues/${issue.number}/comments`, {
body: {
body: `A new weekly digest is available: #${newIssue.number}. Closing this older digest so only the latest one stays open.`,
},
});
await githubRequest("PATCH", `/repos/${owner}/${repo}/issues/${issue.number}`, {
body: {
state: "closed",
state_reason: "completed",
},
});
try {
await githubRequest("PATCH", `/repos/${owner}/${repo}/issues/${issue.number}`, {
body: {
labels: [...labels],
},
});
} catch (error) {
console.warn(`Could not add oldnews label to #${issue.number}: ${error.message}`);
}
}
async function main() {
const title = `Weekly Digest (${formatDigestDate(start)} - ${formatDigestDate(end)})`;
const openDigestIssues = await getOpenDigestIssues();
const [createdItems, pulls, commits, stargazers, releases] = await Promise.all([
getCreatedIssueItems(),
getPullRequests(),
getCommits(),
getStargazers(),
getReleases(),
]);
const body = buildDigestBody({ createdItems, pulls, commits, stargazers, releases });
if (dryRun) {
console.log(`DRY RUN: would create "${title}"`);
console.log(body);
console.log(`DRY RUN: would close ${openDigestIssues.length} older digest issues.`);
return;
}
const newIssue = await createDigestIssue(title, body);
const oldIssues = openDigestIssues.filter((issue) => issue.number !== newIssue.number);
for (const issue of oldIssues) {
await closeOldDigestIssue(issue, newIssue);
}
console.log(`Created ${newIssue.html_url}`);
console.log(`Closed ${oldIssues.length} older digest issues.`);
}
await main();

@ -0,0 +1,36 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Secret Scan Workflow - TruffleHog credential leak detection.
# Runs verified-only secret scanning on pull requests, master pushes,
# and manual dispatch without adding local commit-hook friction.
# -------------------------------------------------------------------
######################################################################
name: Secret Scan
on:
pull_request:
push:
branches: ["master"]
workflow_dispatch:
permissions:
contents: read
jobs:
trufflehog:
name: TruffleHog
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Scan for verified secrets
uses: trufflesecurity/trufflehog@v3.95.3
with:
version: 3.95.3
extra_args: --results=verified --force-skip-binaries --force-skip-archives

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Update Badge Workflow - Home Assistant version badge automation.
# Updates the repository badge when the workflow is triggered.
# -------------------------------------------------------------------
######################################################################
name: Update HA Version Badge name: Update HA Version Badge
on: on:

@ -0,0 +1,40 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Weekly Digest Workflow - scheduled repository issue summary.
# Runs the GitHub Actions workflow for weekly digest reporting.
# -------------------------------------------------------------------
######################################################################
name: Weekly Digest
on:
schedule:
- cron: "37 6 * * 1"
workflow_dispatch:
permissions:
contents: read
issues: write
pull-requests: read
jobs:
weekly-digest:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Create weekly digest issue
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_SERVER_URL: ${{ github.server_url }}
GITHUB_API_URL: ${{ github.api_url }}
run: node .github/scripts/weekly-digest.mjs

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Travis CI - legacy Home Assistant configuration validation.
# Defines the Travis build used to validate this repository.
# -------------------------------------------------------------------
######################################################################
language: python language: python
python: "3.8" python: "3.8"

@ -18,6 +18,11 @@
Live, personal Home Assistant configuration shared for **browsing and inspiration**. This is not a turnkey clone-and-run setup; borrow ideas, adapt entity IDs/secrets, and test in your own environment. Live, personal Home Assistant configuration shared for **browsing and inspiration**. This is not a turnkey clone-and-run setup; borrow ideas, adapt entity IDs/secrets, and test in your own environment.
### Latest video: Home Assistant Garage Automations
[![All the Home Assistant Garage Automations We Actually Use](https://www.vcloudinfo.com/wp-content/uploads/2026/05/garage-arrival-smart-garage-thumbnail.png)](https://youtu.be/wFO0H5zgnzk)
This walkthrough shows how the garage became a reliable Home Assistant arrival and safety hub: guarded auto-open, actionable entry prompts, hallway lighting, wind alerts, nighttime camera reminders, and a Tesla plug-in reminder based on the garage door closing. [Watch the video](https://youtu.be/wFO0H5zgnzk), read the [companion post](https://www.vcloudinfo.com/2026/05/home-assistant-garage-automations-arrival-alerts-tesla.html), and browse the YAML in [config/packages/garadget.yaml](config/packages/garadget.yaml), [config/automation/garage_entry_light.yaml](config/automation/garage_entry_light.yaml), and [config/packages/tesla_model_y.yaml](config/packages/tesla_model_y.yaml).
### Quick navigation ### Quick navigation
- You are here: `/` (root repo guide) - You are here: `/` (root repo guide)
- [Blog](https://www.vcloudinfo.com) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [Diagram](config/www/custom_ui/floorplan/images/branding/Bear-Stone-Docker-Diagram.jpg) | [YouTube](https://youtube.com/vCloudInfo) - [Blog](https://www.vcloudinfo.com) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [Diagram](config/www/custom_ui/floorplan/images/branding/Bear-Stone-Docker-Diagram.jpg) | [YouTube](https://youtube.com/vCloudInfo)
@ -41,12 +46,13 @@ Live, personal Home Assistant configuration shared for **browsing and inspiratio
### Featured examples to start with ### Featured examples to start with
- Alarm and perimeter monitoring: [config/packages/alarm.yaml](config/packages/alarm.yaml) - Alarm and perimeter monitoring: [config/packages/alarm.yaml](config/packages/alarm.yaml)
- Garage routines and entry lighting: [config/packages/garadget.yaml](config/packages/garadget.yaml), [config/automation/garage_entry_light.yaml](config/automation/garage_entry_light.yaml) - Garage routines and entry lighting: [config/packages/garadget.yaml](config/packages/garadget.yaml), [config/automation/garage_entry_light.yaml](config/automation/garage_entry_light.yaml), [video walkthrough](https://youtu.be/wFO0H5zgnzk)
- Holiday/front-of-house color scenes: [config/scene/monthly_colors.yaml](config/scene/monthly_colors.yaml), [config/script/monthly_color_scene.yaml](config/script/monthly_color_scene.yaml) - Holiday/front-of-house color scenes: [config/scene/monthly_colors.yaml](config/scene/monthly_colors.yaml), [config/script/monthly_color_scene.yaml](config/script/monthly_color_scene.yaml)
- Dash-button triggers for quick actions: [config/automation/dash_buttons.yaml](config/automation/dash_buttons.yaml) - Dash-button triggers for quick actions: [config/automation/dash_buttons.yaml](config/automation/dash_buttons.yaml)
- PC lock/unlock-driven lighting plus workday wake-up via HASS.Agent + Wake on LAN: [config/packages/hass_agent_homepc.yaml](config/packages/hass_agent_homepc.yaml) - PC lock/unlock-driven lighting plus workday wake-up via HASS.Agent + Wake on LAN: [config/packages/hass_agent_homepc.yaml](config/packages/hass_agent_homepc.yaml)
- Seasonal cuckoo clock with October and Christmas sound packs: [config/automation/System/CucKoo_Clock.yaml](config/automation/System/CucKoo_Clock.yaml) - Seasonal cuckoo clock with October and Christmas sound packs: [config/automation/System/CucKoo_Clock.yaml](config/automation/System/CucKoo_Clock.yaml)
- Garage arrival and entry helpers: [config/packages/garadget.yaml](config/packages/garadget.yaml) - Garage arrival and entry helpers: [config/packages/garadget.yaml](config/packages/garadget.yaml)
- Vacation Mode and house-sitter checks: [config/packages/vacation_mode.yaml](config/packages/vacation_mode.yaml)
- Battery and solar awareness: [config/packages/powerwall.yaml](config/packages/powerwall.yaml) - Battery and solar awareness: [config/packages/powerwall.yaml](config/packages/powerwall.yaml)
- Presence-aware office comfort: [config/packages/office_motion.yaml](config/packages/office_motion.yaml) - Presence-aware office comfort: [config/packages/office_motion.yaml](config/packages/office_motion.yaml)
- Weather-aware lighting: [config/automation/dark_rainy_day.yaml](config/automation/dark_rainy_day.yaml) - Weather-aware lighting: [config/automation/dark_rainy_day.yaml](config/automation/dark_rainy_day.yaml)
@ -59,8 +65,7 @@ Live, personal Home Assistant configuration shared for **browsing and inspiratio
**Docker add-ons & utilities** **Docker add-ons & utilities**
| Container | Repo/Docs | Purpose | | Container | Repo/Docs | Purpose |
| --- | --- | --- | | --- | --- | --- |
| Home Assistant Time Machine | [saihgupr/HomeAssistantTimeMachine](https://github.com/saihgupr/HomeAssistantTimeMachine) | Browse/diff/restore HA YAML (Lovelace, automations, scripts, ESPHome, packages) against existing backups. Blog walkthrough: [Time Machine for dashboards](https://www.vcloudinfo.com/2025/12/home-assistant-time-machine-dashboards.html). | | Duplicati | [duplicati/duplicati](https://github.com/duplicati/duplicati) | Off-box, versioned backups for HA config, media, and infrastructure compose/config trees. |
| Duplicati | [duplicati/duplicati](https://github.com/duplicati/duplicati) | Off-box, versioned backups for HA config and media; docker config backups land in OneDrive. |
| Dozzle | [amir20/dozzle](https://github.com/amir20/dozzle) | Lightweight Docker log viewer (useful for quick tailing across the homelab stacks). | | Dozzle | [amir20/dozzle](https://github.com/amir20/dozzle) | Lightweight Docker log viewer (useful for quick tailing across the homelab stacks). |
| Cloudflared | [cloudflare/cloudflared](https://hub.docker.com/r/cloudflare/cloudflared) | Secure tunnel/edge access to Home Assistant without opening inbound ports. | | Cloudflared | [cloudflare/cloudflared](https://hub.docker.com/r/cloudflare/cloudflared) | Secure tunnel/edge access to Home Assistant without opening inbound ports. |
| WordPress | [wordpress](https://hub.docker.com/_/wordpress) | Hosts [vCloudInfo.com](https://www.vcloudinfo.com) for docs, how-tos, videos, and long-form writeups that accompany this config. | | WordPress | [wordpress](https://hub.docker.com/_/wordpress) | Hosts [vCloudInfo.com](https://www.vcloudinfo.com) for docs, how-tos, videos, and long-form writeups that accompany this config. |
@ -70,17 +75,17 @@ Only listing hardware that appears in active packages/automations here.
https://amzn.to/48jVzZ3 https://amzn.to/48jVzZ3
| Device | What it drives (friendly name -> file) | Buy | | Device | What it drives (friendly name -> file) | Buy |
| --- | --- | --- | | --- | --- | --- |
| Garadget garage door controller | Garage doors: open/close, reflection alerts - [garadget package](config/packages/garadget.yaml) | [![Buy](https://img.shields.io/badge/Buy-Garadget-orange?logo=amazon)](https://amzn.to/2jQLpVQ) | | Garadget garage door controller | Garage doors: open/close, arrival helpers, wind alerts, and nighttime reminders - [garadget package](config/packages/garadget.yaml), [video walkthrough](https://youtu.be/wFO0H5zgnzk), [companion post](https://www.vcloudinfo.com/2026/05/home-assistant-garage-automations-arrival-alerts-tesla.html) | [![Buy](https://img.shields.io/badge/Buy-Garadget-orange?logo=amazon)](https://amzn.to/2jQLpVQ) |
| August smart lock | Front-door lock control + status - [august package](config/packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-August%20Lock-orange?logo=amazon)](https://amzn.to/48jVzZ3) | | August smart lock | Front-door lock control + status - [august package](config/packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-August%20Lock-orange?logo=amazon)](https://amzn.to/48jVzZ3) |
| Phyn Plus water shutoff | Leak detection + auto shutoff - [phynplus package](config/packages/phynplus.yaml) | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) | | Phyn Plus water shutoff | Leak detection + auto shutoff - [phynplus package](config/packages/phynplus.yaml) | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) |
| Rachio sprinkler controller | Rain-skips and seasonal watering - [rachio package](config/packages/rachio.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | | Rachio sprinkler controller | Rain-skips and seasonal watering - [rachio package](config/packages/rachio.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Tesla Powerwall 2 | Grid-outage alerts + load-shed automations - [powerwall package](config/packages/powerwall.yaml) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) | | Tesla Powerwall 2 | Grid-outage alerts + load-shed automations - [powerwall package](config/packages/powerwall.yaml) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) |
| NodeMCU motion sensor | Office motion lighting - [office_motion package](config/packages/office_motion.yaml) | [![Buy](https://img.shields.io/badge/Buy-Motion%20Node-orange?logo=amazon)](https://amzn.to/2oUgj5i) | | NodeMCU motion sensor | Office motion lighting - [office_motion package](config/packages/office_motion.yaml) | [![Buy](https://img.shields.io/badge/Buy-Motion%20Node-orange?logo=amazon)](https://amzn.to/2oUgj5i) |
| Raspberry Pi 3 + Aeon Z-Wave stick | Z-Wave backbone for door/hall sensors - [garage entry helper](config/automation/garage_entry_light.yaml) | [![Pi](https://img.shields.io/badge/Buy-Pi%203-orange?logo=raspberrypi)](https://amzn.to/2e3DOBY) [![Z-Wave](https://img.shields.io/badge/Buy-Z--Wave%20Stick-orange?logo=zwave)](https://amzn.to/2eAiAP0) | | Raspberry Pi 3 + Aeon Z-Wave stick | Z-Wave backbone for door/hall sensors - [garage entry helper](config/automation/garage_entry_light.yaml), [garage automation video](https://youtu.be/wFO0H5zgnzk) | [![Pi](https://img.shields.io/badge/Buy-Pi%203-orange?logo=raspberrypi)](https://amzn.to/2e3DOBY) [![Z-Wave](https://img.shields.io/badge/Buy-Z--Wave%20Stick-orange?logo=zwave)](https://amzn.to/2eAiAP0) |
| Roku streaming device | TV presence -> scenes/lighting - [roku package](config/packages/roku.yaml) | [![Buy](https://img.shields.io/badge/Buy-Roku-orange?logo=roku)](https://amzn.to/2Ctp8cr) | | Roku streaming device | TV presence -> scenes/lighting - [roku package](config/packages/roku.yaml) | [![Buy](https://img.shields.io/badge/Buy-Roku-orange?logo=roku)](https://amzn.to/2Ctp8cr) |
| Amazon Dash Button | Quick actions (office lamp toggle) - [dash buttons automation](config/automation/dash_buttons.yaml) | [![Buy](https://img.shields.io/badge/Buy-Dash%20Button-orange?logo=amazon)](https://amzn.to/2dPKZhM) | | Amazon Dash Button | Quick actions (office lamp toggle) - [dash buttons automation](config/automation/dash_buttons.yaml) | [![Buy](https://img.shields.io/badge/Buy-Dash%20Button-orange?logo=amazon)](https://amzn.to/2dPKZhM) |
| Amazon Echo Show | Front door camera pop-up when the August lock unlocks - [august package](config/packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-Echo%20Show-orange?logo=amazon)](https://amzn.to/4ptA3YO) | | Amazon Echo Show | Front door camera pop-up when the August lock unlocks - [august package](config/packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-Echo%20Show-orange?logo=amazon)](https://amzn.to/4ptA3YO) |
| Dreame/Neato vacuum | Cleaning schedules + notifications - [vacuum package](config/packages/vacuum.yaml) | [![Buy](https://img.shields.io/badge/Buy-Vacuum-orange?logo=amazon)](https://amzn.to/4f7NpFP) | | Dreame/Neato vacuum | Cleaning schedules, room queues, Alexa room cleans, and rescue notifications - [vacuum package](config/packages/vacuum.yaml), [video walkthrough](https://youtu.be/KKOWSKuF5jA), [companion post](https://www.vcloudinfo.com/2026/05/home-assistant-vacuum-automations-dreame-2026.html) | [![Buy](https://img.shields.io/badge/Buy-Vacuum-orange?logo=amazon)](https://amzn.to/4f7NpFP) |
| Flux/LED strip controller | Monthly color scenes for exterior - [monthly color scene](config/script/monthly_color_scene.yaml) | [![Buy](https://img.shields.io/badge/Buy-LED%20Controller-orange?logo=amazon)](https://amzn.to/2jUBSBE) | | Flux/LED strip controller | Monthly color scenes for exterior - [monthly color scene](config/script/monthly_color_scene.yaml) | [![Buy](https://img.shields.io/badge/Buy-LED%20Controller-orange?logo=amazon)](https://amzn.to/2jUBSBE) |
| Etekcity/433MHz outlet | Accent lighting relays - [garage entry helper](config/automation/garage_entry_light.yaml) | [![Buy](https://img.shields.io/badge/Buy-433MHz%20Outlet-orange?logo=amazon)](https://amzn.to/2efNoBP) | | Etekcity/433MHz outlet | Accent lighting relays - [garage entry helper](config/automation/garage_entry_light.yaml) | [![Buy](https://img.shields.io/badge/Buy-433MHz%20Outlet-orange?logo=amazon)](https://amzn.to/2efNoBP) |

@ -18,6 +18,10 @@
Codex skills stored in-repo so they can be shared with the community. These are documentation + helper scripts only (no secrets). Codex skills stored in-repo so they can be shared with the community. These are documentation + helper scripts only (no secrets).
### Walkthroughs
- Dashboard design skill: [Build Clean Home Assistant Dashboards with YAML Partials and Templates](https://youtu.be/aFis2YPeSuY)
- Companion post: [Home Assistant Dashboard Design System (Button-Card First)](https://www.vcloudinfo.com/2026/02/home-assistant-dashboard-design-system-button-card.html)
### Quick navigation ### Quick navigation
- You are here: `codex_skills/` - You are here: `codex_skills/`
- [Repo overview](../README.md) | [Dashboards](../config/dashboards/README.md) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) - [Repo overview](../README.md) | [Dashboards](../config/dashboards/README.md) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
@ -26,7 +30,7 @@ Codex skills stored in-repo so they can be shared with the community. These are
- `homeassistant-dashboard-designer/`: Constrained, button-card-first Lovelace dashboard design system + YAML lint helper. - `homeassistant-dashboard-designer/`: Constrained, button-card-first Lovelace dashboard design system + YAML lint helper.
- `homeassistant-yaml-dry-verifier/`: Home Assistant YAML DRY verifier to detect redundant triggers/conditions/actions/sequence blocks and suggest refactors. - `homeassistant-yaml-dry-verifier/`: Home Assistant YAML DRY verifier to detect redundant triggers/conditions/actions/sequence blocks and suggest refactors.
- `infrastructure-doc-sync/`: Session closeout workflow to update AGENTS/README/Dashy shortcuts/Infra Info snapshot consistently after infra changes. - `infrastructure-doc-sync/`: Session closeout workflow to update AGENTS/README/Dashy shortcuts/BearClaw infrastructure snapshot consistently after infra changes.
- `network-architecture-diagrammer/`: Mermaid-first homelab/network architecture diagram workflow for Excalidraw-friendly topology and service maps. - `network-architecture-diagrammer/`: Mermaid-first homelab/network architecture diagram workflow for Excalidraw-friendly topology and service maps.
### Notes ### Notes

@ -20,6 +20,10 @@
This directory contains the `homeassistant-dashboard-designer` Codex skill, stored in-repo so it can be shared with the community. This directory contains the `homeassistant-dashboard-designer` Codex skill, stored in-repo so it can be shared with the community.
### Walkthrough
- Video: [Build Clean Home Assistant Dashboards with YAML Partials and Templates](https://youtu.be/aFis2YPeSuY)
- Companion post: [Home Assistant Dashboard Design System (Button-Card First)](https://www.vcloudinfo.com/2026/02/home-assistant-dashboard-design-system-button-card.html)
### Quick navigation ### Quick navigation
- You are here: `codex_skills/homeassistant-dashboard-designer/` - You are here: `codex_skills/homeassistant-dashboard-designer/`
- [Repo overview](../../README.md) | [Codex skills](../README.md) | [Dashboards](../../config/dashboards/README.md) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) - [Repo overview](../../README.md) | [Codex skills](../README.md) | [Dashboards](../../config/dashboards/README.md) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Dashboard Designer Agent - Codex skill entry metadata.
# Defines the OpenAI-facing launcher text for this local skill.
# -------------------------------------------------------------------
######################################################################
interface: interface:
display_name: "Home Assistant Dashboard Designer" display_name: "Home Assistant Dashboard Designer"
short_description: "Design/refactor HA Lovelace dashboards safely" short_description: "Design/refactor HA Lovelace dashboards safely"

@ -31,6 +31,7 @@ This directory contains the `homeassistant-yaml-dry-verifier` skill and the CLI
- Detects duplicate entries within a single block (`INTRA`). - Detects duplicate entries within a single block (`INTRA`).
- Detects package-defined scripts called from multiple files (`CENTRAL_SCRIPT`). - Detects package-defined scripts called from multiple files (`CENTRAL_SCRIPT`).
- Collapses noisy ENTRY reports when they are already fully explained by an identical `FULL_BLOCK` finding. - Collapses noisy ENTRY reports when they are already fully explained by an identical `FULL_BLOCK` finding.
- Adds workflow guardrails for automation refactors that rename/remove entity references or introduce cleanup behavior: stale-reference checks, dry-run/preview expectations, explicit confirmation, and audit/backup output.
## CLI Usage ## CLI Usage
@ -70,6 +71,8 @@ Exit codes:
- This verifier intentionally keeps text output and a small CLI surface. - This verifier intentionally keeps text output and a small CLI surface.
- It does not implement suppression files, severity scoring, JSON output, or diff-only mode. - It does not implement suppression files, severity scoring, JSON output, or diff-only mode.
- It is not an orphan entity cleaner and should not delete Home Assistant registry entries during normal DRY runs.
- Treat generic `unavailable`, disabled, or no-`config_entry_id` entities as audit signals only; YAML, helper, REST, command-line, MQTT, finance, YouTube, and local infrastructure telemetry can be intentional.
- Use it as a fast pre-refactor signal and pair with Home Assistant config validation before restart/reload. - Use it as a fast pre-refactor signal and pair with Home Assistant config validation before restart/reload.
**All of my configuration files are tested against the most stable version of home-assistant.** **All of my configuration files are tested against the most stable version of home-assistant.**

@ -1,6 +1,6 @@
--- ---
name: homeassistant-yaml-dry-verifier name: homeassistant-yaml-dry-verifier
description: "Verify Home Assistant YAML for DRY and efficiency issues by detecting redundant trigger/condition/action/sequence structures and repeated blocks across automations, scripts, and packages. Use when creating, reviewing, or refactoring YAML in config/packages, config/automations, config/scripts, or dashboard-related YAML where duplication risk is high." description: "Verify Home Assistant YAML for DRY and efficiency issues by detecting redundant trigger/condition/action/sequence structures and repeated blocks across automations, scripts, and packages. Use when creating, reviewing, or refactoring YAML in config/packages, config/automations, config/scripts, or dashboard-related YAML where duplication risk is high. Include a read-only entity/reference safety pass when automation changes rename/remove entities or introduce maintenance cleanup behavior."
--- ---
# Home Assistant YAML DRY Verifier # Home Assistant YAML DRY Verifier
@ -13,13 +13,15 @@ Use this skill to lint Home Assistant YAML for repeat logic before or after edit
- Resolve the findings in the same task by refactoring YAML to remove duplication. - Resolve the findings in the same task by refactoring YAML to remove duplication.
- Re-run the verifier after refactoring and iterate until targeted findings are cleared. - Re-run the verifier after refactoring and iterate until targeted findings are cleared.
- If a finding cannot be safely resolved, explicitly document the blocker and the smallest safe follow-up. - If a finding cannot be safely resolved, explicitly document the blocker and the smallest safe follow-up.
- If touched YAML performs cleanup, registry hygiene, purge, deletion, or other destructive maintenance, require preview/dry-run behavior, explicit confirmation, and audit/backup output before any destructive action is considered complete.
## Quick Start ## Quick Start
1. Run the verifier script on the file(s) you edited. 1. Run the verifier script on the file(s) you edited.
2. Review repeated block findings first (highest confidence). 2. Review repeated block findings first (highest confidence).
3. Refactor into shared scripts/helpers/templates where appropriate. 3. Refactor into shared scripts/helpers/templates where appropriate.
4. Re-run the verifier and then run your normal Home Assistant config check. 4. If the change renames/removes entity references or adds maintenance cleanup behavior, perform the read-only entity/reference safety pass.
5. Re-run the verifier and then run your normal Home Assistant config check.
```bash ```bash
python codex_skills/homeassistant-yaml-dry-verifier/scripts/verify_ha_yaml_dry.py config/packages/life360.yaml --strict python codex_skills/homeassistant-yaml-dry-verifier/scripts/verify_ha_yaml_dry.py config/packages/life360.yaml --strict
@ -53,15 +55,25 @@ python codex_skills/homeassistant-yaml-dry-verifier/scripts/verify_ha_yaml_dry.p
- Repeated triggers: consolidate where behavior is equivalent, or split by intent if readability improves. - Repeated triggers: consolidate where behavior is equivalent, or split by intent if readability improves.
- For cooldown/throttle behavior, prefer automation-local `this.attributes.last_triggered` with custom event handoff before adding new helper entities, unless shared persistent state is required across automations. - For cooldown/throttle behavior, prefer automation-local `this.attributes.last_triggered` with custom event handoff before adding new helper entities, unless shared persistent state is required across automations.
5. Validate after edits: 5. Entity/Registry Safety Pass:
- Keep this pass read-only during normal DRY work. Report possible stale references or risky cleanup behavior; do not delete Home Assistant registry entries as part of this skill.
- When refactors rename, remove, or consolidate automations, scripts, helpers, entities, service calls, or dashboard targets, search touched and adjacent YAML for stale references before closing the task.
- Use live Home Assistant context or registry/state evidence when available and in scope, especially before changing entity IDs or automations that depend on device/integration state.
- Do not treat generic `unavailable`, disabled, or no-`config_entry_id` entities as safe deletion candidates. In YAML-heavy setups these are often intentional.
- Treat these platforms as common false-positive sources unless stronger evidence proves otherwise: `automation`, `script`, `scene`, `template`, helpers (`input_*`, `group`, `timer`, `counter`, `schedule`, `zone`, `person`, `tag`), `command_line`, `rest`, `mqtt`, `yahoofinance`, `youtube`, and local infrastructure telemetry.
- For cleanup or maintenance automations, prefer a preview/report action first, persistent ignore rules where repeated noise is expected, and an audit artifact that records what would change or did change.
- Destructive cleanup must be gated by explicit operator confirmation and should have backup/audit output. A dry-run-only recommendation is acceptable when the evidence is not strong enough.
6. Validate after edits:
- Re-run this verifier. - Re-run this verifier.
- Run Home Assistant config validation before reload/restart. - Run Home Assistant config validation before reload/restart.
6. Enforce closure: 7. Enforce closure:
- Treat unresolved `FULL_BLOCK`/`ENTRY` findings in touched files as incomplete work unless a blocker is documented. - Treat unresolved `FULL_BLOCK`/`ENTRY` findings in touched files as incomplete work unless a blocker is documented.
- Prefer consolidating duplicated automation triggers/conditions/actions into shared logic or a single branching automation. - Prefer consolidating duplicated automation triggers/conditions/actions into shared logic or a single branching automation.
- Treat unresolved `CENTRAL_SCRIPT` findings in touched scope as incomplete unless documented as deferred-with-blocker. - Treat unresolved `CENTRAL_SCRIPT` findings in touched scope as incomplete unless documented as deferred-with-blocker.
- Move shared package scripts to `config/script/<script_id>.yaml` when they are used cross-file. - Move shared package scripts to `config/script/<script_id>.yaml` when they are used cross-file.
- Treat unresolved stale-reference or cleanup-safety concerns in touched scope as incomplete unless documented as `deferred-with-blocker`.
## Dashboard Designer Integration ## Dashboard Designer Integration
@ -77,6 +89,8 @@ Always report:
- Script caller detection should include direct `service: script.<id>` and `script.turn_on`-style entity targeting when present. - Script caller detection should include direct `service: script.<id>` and `script.turn_on`-style entity targeting when present.
- Concrete refactor recommendation per group. - Concrete refactor recommendation per group.
- Resolution status for each finding (`resolved`, `deferred-with-blocker`). - Resolution status for each finding (`resolved`, `deferred-with-blocker`).
- Entity/reference hygiene status when this pass is in scope (`checked`, `not-in-scope`, or `deferred-with-blocker`).
- For cleanup or destructive maintenance YAML, preview/dry-run, confirmation, and audit/backup status.
Strict behavior: Strict behavior:
- `--strict` returns non-zero for any reported finding (`FULL_BLOCK`, `ENTRY`, `INTRA`, `CENTRAL_SCRIPT`). - `--strict` returns non-zero for any reported finding (`FULL_BLOCK`, `ENTRY`, `INTRA`, `CENTRAL_SCRIPT`).

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# YAML DRY Verifier Agent - Codex skill entry metadata.
# Defines the OpenAI-facing launcher text for this local skill.
# -------------------------------------------------------------------
######################################################################
interface: interface:
display_name: "HA YAML DRY Verifier" display_name: "HA YAML DRY Verifier"
short_description: "Find redundant HA YAML logic" short_description: "Find redundant HA YAML logic"

@ -1,6 +1,6 @@
--- ---
name: infrastructure-doc-sync name: infrastructure-doc-sync
description: "Use when infra/container placement changes require synchronized AGENTS, docs, and Infra Info updates while keeping AGENTS concise, scoped, and non-runbook." description: "Use when infra/container placement changes require synchronized AGENTS, docs, Dashy, and BearClaw infrastructure snapshot updates while keeping AGENTS concise, scoped, and non-runbook."
--- ---
# Infrastructure Doc Sync # Infrastructure Doc Sync
@ -31,8 +31,8 @@ Keep `AGENTS.md` short and task-scoped; move long runbooks to dedicated docs.
5. Dashy shortcuts (if any service URL/host changed): 5. Dashy shortcuts (if any service URL/host changed):
- `h:\hass\docker_files\dashy/conf.yml` - `h:\hass\docker_files\dashy/conf.yml`
- Reload Dashy on docker_17 after edits: `ssh hass@192.168.10.17 "cd ~/docker_files && docker compose up -d dashy"` - Reload Dashy on docker_17 after edits: `ssh hass@192.168.10.17 "cd ~/docker_files && docker compose up -d dashy"`
6. Infra Info snapshot JSON: 6. BearClaw infrastructure snapshot:
- `docker_69:/home/hass/docker_files/infra_info/data/overview.json` - `docker_17/codex_appliance` environment map and `/api/admin/infrastructure`
## Workflow ## Workflow
@ -42,12 +42,13 @@ Keep `AGENTS.md` short and task-scoped; move long runbooks to dedicated docs.
4. Move long operational/runbook details out of `AGENTS.md` into a dedicated doc when needed. 4. Move long operational/runbook details out of `AGENTS.md` into a dedicated doc when needed.
5. If end-user entry points changed, update Dashy shortcuts (`dashy/conf.yml`) to match reality. 5. If end-user entry points changed, update Dashy shortcuts (`dashy/conf.yml`) to match reality.
6. Update README/skill docs impacted by the change (short, factual, no drift). 6. Update README/skill docs impacted by the change (short, factual, no drift).
7. Update `overview.json` to mirror the same outcome at a high level. 7. Refresh/check BearClaw infrastructure context so it mirrors the same outcome at a high level.
8. Validate: 8. Validate:
- JSON is valid (`python -m json.tool` equivalent). - JSON is valid (`python -m json.tool` equivalent).
- Dashy `conf.yml` references the intended hostname(s)/ports (no stale LAN IPs unless intentionally required). - Dashy `conf.yml` references the intended hostname(s)/ports (no stale LAN IPs unless intentionally required).
- AGENTS and README statements do not conflict with runtime. - AGENTS and README statements do not conflict with runtime.
- Repo-level AGENTS do not contain long runbooks duplicated from dedicated docs. - Repo-level AGENTS do not contain long runbooks duplicated from dedicated docs.
- BearClaw `/api/admin/infrastructure` returns the intended topology/context.
## AGENTS Quality Rules ## AGENTS Quality Rules
@ -57,9 +58,9 @@ Keep `AGENTS.md` short and task-scoped; move long runbooks to dedicated docs.
- Keep specialized/deeper-scoped AGENTS concise and task-specific. - Keep specialized/deeper-scoped AGENTS concise and task-specific.
- De-duplicate repeated policy lines across global/workspace/repo scopes. - De-duplicate repeated policy lines across global/workspace/repo scopes.
## Infra Info Content Rules ## BearClaw Snapshot Content Rules
- Keep `overview.json` high-level and planning-focused. - Keep infrastructure snapshot content high-level and planning-focused.
- Do not include secrets, tokens, passwords, or internal file paths. - Do not include secrets, tokens, passwords, or internal file paths.
- Avoid step-by-step runbooks. - Avoid step-by-step runbooks.
- Prefer host IDs and roles over low-level implementation detail. - Prefer host IDs and roles over low-level implementation detail.
@ -79,5 +80,6 @@ Always report:
- Final intended topology/placement. - Final intended topology/placement.
- Any Dashy shortcuts touched (or explicitly state "no Dashy updates needed"). - Any Dashy shortcuts touched (or explicitly state "no Dashy updates needed").
- Whether runbook content was moved from AGENTS into a dedicated ops doc. - Whether runbook content was moved from AGENTS into a dedicated ops doc.
- BearClaw infrastructure snapshot validation result.
- Any unresolved follow-up items. - Any unresolved follow-up items.

@ -1,4 +1,13 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Infrastructure Doc Sync Agent - Codex skill entry metadata.
# Defines the OpenAI-facing launcher text for this local skill.
# -------------------------------------------------------------------
######################################################################
interface: interface:
display_name: "Infrastructure Doc Sync" display_name: "Infrastructure Doc Sync"
short_description: "Sync infra docs with concise AGENTS" short_description: "Sync infra docs with concise AGENTS"
default_prompt: "Use $infrastructure-doc-sync to keep AGENTS concise and scoped, move runbook content into dedicated docs when needed, and sync README/Dashy/infra_info overview.json after infra changes." default_prompt: "Use $infrastructure-doc-sync to keep AGENTS concise and scoped, move runbook content into dedicated docs when needed, and sync README/Dashy/BearClaw infrastructure snapshot context after infra changes."

@ -1,3 +1,12 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Network Diagrammer Agent - Codex skill entry metadata.
# Defines the OpenAI-facing launcher text for this local skill.
# -------------------------------------------------------------------
######################################################################
interface: interface:
display_name: "Network Architecture Diagrammer" display_name: "Network Architecture Diagrammer"
short_description: "Generate Excalidraw-ready homelab diagrams" short_description: "Generate Excalidraw-ready homelab diagrams"

@ -50,11 +50,11 @@ flowchart TD
end end
subgraph docker69[docker69] subgraph docker69[docker69]
Tunnel[Cloudflared] Tunnel[Cloudflared]
Info[Infra Info] PublicApps[Public Apps]
end end
Tunnel --> Appliance Tunnel --> Appliance
Tunnel --> Info Tunnel --> PublicApps
HA --> MQTT HA --> MQTT
Frigate --> HA Frigate --> HA
``` ```

@ -1 +1 @@
2026.4.4 2026.5.4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save

Powered by TurnKey Linux.