1<!DOCTYPE html> 2<html lang="en-US" prefix="og: https://ogp.me/ns#"> 3 4<head> 5 6 <meta charset="UTF-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"> 8 <link rel="profile" href="https://gmpg.org/xfn/11"> 9
9<script id="ezoic-wp-plugin-cmp" async src="https://cmp.gatekeeperconsent.com/min.js" data-cfasync="false"></script>
vendor: 1 bytes, line 9
9
10<script id="ezoic-wp-plugin-gatekeeper" async src="https://the.gatekeeperconsent.com/cmp.min.js" data-cfasync="false"></script>
vendor: 1 bytes, line 10
10
11<script id="ezoic-wp-plugin-js" async src="//www.ezojs.com/ezoic/sa.min.js"></script>
vendor: 1 bytes, line 11
11
12<script data-ezoic="1">window.ezstandalone = window.ezstandalone || {};ezstandalone.cmd = ezstandalone.cmd || [];</script>
vendor: 1 bytes, line 12
12
13<script async src="//ezoicanalytics.com/analytics.js"></script>
13 14 15<!-- Google Tag Manager for WordPress by gtm4wp.com -->
16<script data-cfasync="false" data-pagespeed-no-defer> 17 var gtm4wp_datalayer_name = "dataLayer"; 18 var dataLayer = dataLayer || []; 19 (function(){dataLayer.push(arguments);})('set', 'developer_id.dNGJiYT', true); 20 const gtm4wp_use_sku_instead = 1; 21 const gtm4wp_currency = "EUR"; 22 const gtm4wp_product_per_impression = 0; 23 const gtm4wp_clear_ecommerce = false; 24 const gtm4wp_datalayer_max_timeout = 2000; 25 const gtm4wp_console_log = true; 26 const gtm4wp_remarketing_prod_id_prefix = ""; 27 const gtm4wp_list_attribution = 0; 28 const gtm4wp_checkoutwc = 0; 29</script>
29 30<!-- End Google Tag Manager for WordPress by gtm4wp.com --> 31<!-- Search Engine Optimization by Rank Math - https://rankmath.com/ --> 32<title>ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting - Kiril Peyanski Blog</title> 33<meta name="description" content="I tested Codex with ha-mcp and Home Assistant after the Claude video worked well but hit free-tier limits. Here is what felt useful for dashboards, automations, and debugging, plus where to get the setup PDF."/> 34<meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/> 35<link rel="canonical" href="https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/" /> 36<meta property="og:locale" content="en_US" /> 37<meta property="og:type" content="article" /> 38<meta property="og:title" content="ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting - Kiril Peyanski Blog" /> 39<meta property="og:description" content="I tested Codex with ha-mcp and Home Assistant after the Claude video worked well but hit free-tier limits. Here is what felt useful for dashboards, automations, and debugging, plus where to get the setup PDF." /> 40<meta property="og:url" content="https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/" /> 41<meta property="og:site_name" content="Kiril Peyanski Blog" /> 42<meta property="article:tag" content="Codex" /> 43<meta property="article:tag" content="ha-mcp" /> 44<meta property="article:tag" content="Home Assistant AI" /> 45<meta property="article:tag" content="Home Assistant automations" /> 46<meta property="article:tag" content="Home Assistant dashboards" /> 47<meta property="article:tag" content="Home Assistant MCP" /> 48<meta property="article:tag" content="Smart home AI" /> 49<meta property="article:section" content="Home Assistant" /> 50<meta property="og:updated_time" content="2026-07-03T21:53:30+03:00" /> 51<meta property="og:image" content="https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif" /> 52<meta property="og:image:secure_url" content="https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif" /> 53<meta property="og:image:width" content="929" /> 54<meta property="og:image:height" content="523" /> 55<meta property="og:image:alt" content="ha-mcp Codex Home Assistant dashboard automation featured image" /> 56<meta property="og:image:type" content="image/jpeg" /> 57<meta property="article:published_time" content="2026-07-03T20:23:23+03:00" /> 58<meta property="article:modified_time" content="2026-07-03T21:53:30+03:00" /> 59<meta name="twitter:card" content="summary" /> 60<meta name="twitter:title" content="ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting - Kiril Peyanski Blog" /> 61<meta name="twitter:description" content="I tested Codex with ha-mcp and Home Assistant after the Claude video worked well but hit free-tier limits. Here is what felt useful for dashboards, automations, and debugging, plus where to get the setup PDF." /> 62<meta name="twitter:site" content="@kpeyanski" /> 63<meta name="twitter:creator" content="@kpeyanski" /> 64<meta name="twitter:image" content="https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif" /> 65<meta name="twitter:label1" content="Written by" /> 66<meta name="twitter:data1" content="Kiril Peyanski" /> 67<meta name="twitter:label2" content="Time to read" /> 68<meta name="twitter:data2" content="10 minutes" />
69<script type="application/ld+json" class="rank-math-schema">{"@context":"https://schema.org","@graph":[{"@type":["Person","Organization"],"@id":"https://peyanski.com/#person","name":"Kiril","sameAs":["https://twitter.com/kpeyanski"],"logo":{"@type":"ImageObject","@id":"https://peyanski.com/#logo","url":"https://peyanski.com/wp-content/uploads/2019/11/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.png","contentUrl":"https://peyanski.com/wp-content/uploads/2019/11/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.png","caption":"Kiril Peyanski Blog","inLanguage":"en-US","width":"150","height":"100"},"image":{"@type":"ImageObject","@id":"https://peyanski.com/#logo","url":"https://peyanski.com/wp-content/uploads/2019/11/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.png","contentUrl":"https://peyanski.com/wp-content/uploads/2019/11/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.png","caption":"Kiril Peyanski Blog","inLanguage":"en-US","width":"150","height":"100"}},{"@type":"WebSite","@id":"https://peyanski.com/#website","url":"https://peyanski.com","name":"Kiril Peyanski Blog","publisher":{"@id":"https://peyanski.com/#person"},"inLanguage":"en-US"},{"@type":"ImageObject","@id":"https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif","url":"https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif","width":"929","height":"523","caption":"ha-mcp Codex Home Assistant dashboard automation featured image","inLanguage":"en-US"},{"@type":"WebPage","@id":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/#webpage","url":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/","name":"ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting - Kiril Peyanski Blog","datePublished":"2026-07-03T20:23:23+03:00","dateModified":"2026-07-03T21:53:30+03:00","isPartOf":{"@id":"https://peyanski.com/#website"},"primaryImageOfPage":{"@id":"https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif"},"inLanguage":"en-US"},{"@type":"Person","@id":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/#author","name":"Kiril Peyanski","image":{"@type":"ImageObject","@id":"https://secure.gravatar.com/avatar/54ddcad8febf4b411655bdfa32b596218b0a4997822013324f3d7af4d6932def?s=96&d=mm&r=g","url":"https://secure.gravatar.com/avatar/54ddcad8febf4b411655bdfa32b596218b0a4997822013324f3d7af4d6932def?s=96&d=mm&r=g","caption":"Kiril Peyanski","inLanguage":"en-US"},"sameAs":["https://peyanski.com"]},{"@type":"BlogPosting","headline":"ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting - Kiril Peyanski Blog","keywords":"ha-mcp,codex home assistant","datePublished":"2026-07-03T20:23:23+03:00","dateModified":"2026-07-03T21:53:30+03:00","articleSection":"Home Assistant","author":{"@id":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/#author","name":"Kiril Peyanski"},"publisher":{"@id":"https://peyanski.com/#person"},"description":"I tested Codex with ha-mcp and Home Assistant after the Claude video worked well but hit free-tier limits. Here is what felt useful for dashboards, automations, and debugging, plus where to get the setup PDF.","name":"ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting - Kiril Peyanski Blog","@id":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/#richSnippet","isPartOf":{"@id":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/#webpage"},"image":{"@id":"https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif"},"inLanguage":"en-US","mainEntityOfPage":{"@id":"https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/#webpage"}}]}</script>
69 70<!-- /Rank Math WordPress SEO plugin --> 71 72<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://peyanski.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fpeyanski.com%2Fha-mcp-codex-home-assistant-dashboards-automations%2F" /> 73<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://peyanski.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fpeyanski.com%2Fha-mcp-codex-home-assistant-dashboards-automations%2F&format=xml" /> 74<link rel="alternate" type="application/rss+xml" title="Kiril Peyanski Blog » Stories Feed" href="https://peyanski.com/web-stories/feed/"><style id="wp-img-auto-sizes-contain-inline-css"> 75img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 76/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 77</style> 78<style id="wp-emoji-styles-inline-css"> 79 80 img.wp-smiley, img.emoji { 81 display: inline !important; 82 border: none !important; 83 box-shadow: none !important; 84 height: 1em !important; 85 width: 1em !important; 86 margin: 0 0.07em !important; 87 vertical-align: -0.1em !important; 88 background: none !important; 89 padding: 0 !important; 90 } 91/*# sourceURL=wp-emoji-styles-inline-css */ 92</style> 93<style id="wp-block-library-inline-css"> 94:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
94--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} 95 96/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */ 97</style> 98<style id="wp-block-heading-inline-css"> 99h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg} 100/*# sourceURL=https://peyanski.com/wp-includes/blocks/heading/style.min.css */ 101</style> 102<style id="wp-block-image-inline-css"> 103.wp-block-image>a,.wp-block-image>figure>a{display:inline-block}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}@media not (prefers-reduced-motion){.wp-block-image img.hide{visibility:hidden}.wp-block-image img.show{animation:show-content-image .4s}}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull>a,.wp-block-image.alignwide>a{width:100%}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;width:20px;z-index:100}@media not (prefers-reduced-motion){.wp-lightbox-container button{transition:opacity .2s ease}}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;
103cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .wp-lightbox-close-button{align-items:center;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 4px;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .wp-lightbox-close-button:focus,.wp-lightbox-overlay .wp-lightbox-close-button:hover,.wp-lightbox-overlay .wp-lightbox-close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .wp-lightbox-close-button:has(.wp-lightbox-close-text:not([hidden])) .wp-lightbox-close-icon svg{height:1em;width:1em}.wp-lightbox-overlay .wp-lightbox-close-icon svg{display:block}.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{align-items:center;bottom:16px;cursor:pointer;display:flex;font-family:inherit;gap:4px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 8px;position:absolute;z-index:2000002}.wp-lightbox-overlay .wp-lightbox-navigation-button-next[hidden],.wp-lightbox-overlay .wp-lightbox-navigation-button-prev[hidden]{display:none}@media (min-width:960px){.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{bottom:50%;transform:translateY(-50%)}}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:not(:hover):not(:active):not(.has-background),.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:not(:hover):not(:active):not(.has-background){background:none;border:none;padding:0 8px}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg{display:block;height:1.5em;width:1.5em}.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{left:calc(env(safe-area-inset-left) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-button-next{right:calc(env(safe-area-inset-right) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-icon svg{vertical-align:middle}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:2000001}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{visibility:visible}@media not (prefers-reduced-motion){.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}
103@keyframes show-content-image{0%{visibility:hidden}99%{visibility:hidden}to{visibility:visible}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}} 104/*# sourceURL=https://peyanski.com/wp-includes/blocks/image/style.min.css */ 105</style> 106<style id="wp-block-list-inline-css"> 107ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:1.25em 2.375em} 108/*# sourceURL=https://peyanski.com/wp-includes/blocks/list/style.min.css */ 109</style> 110<style id="wp-block-paragraph-inline-css"> 111.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg} 112/*# sourceURL=https://peyanski.com/wp-includes/blocks/paragraph/style.min.css */ 113</style> 114<style id="wp-block-embed-inline-css"> 115.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-group.is-layout-flex .wp-block-embed{flex:1 1 0%;min-width:0}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%} 116/*# sourceURL=https://peyanski.com/wp-includes/blocks/embed/style.min.css */ 117</style> 118<style id="wp-block-quote-inline-css"> 119.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not
119(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}.wp-block-quote>cite{display:block} 120/*# sourceURL=https://peyanski.com/wp-includes/blocks/quote/style.min.css */ 121</style> 122 123<style id="classic-theme-styles-inline-css"> 124/*! This file is auto-generated */ 125.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 126/*# sourceURL=/wp-includes/css/classic-themes.min.css */ 127</style> 128 129<style id="global-styles-inline-css"> 130:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--neve-link-color: var(--nv-primary-accent);--wp--preset--color--neve-link-hover-color: var(--nv-secondary-accent);--wp--preset--color--nv-site-bg: var(--nv-site-bg);--wp--preset--color--nv-light-bg: var(--nv-light-bg);--wp--preset--color--nv-dark-bg: var(--nv-dark-bg);--wp--preset--color--neve-text-color: var(--nv-text-color);--wp--preset--color--nv-text-dark-bg: var(--nv-text-dark-bg);--wp--preset--color--nv-c-1: var(--nv-c-1);--wp--preset--color--nv-c-2: var(--nv-c-2);--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
130--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-neve-link-color-color{color: var(--wp--preset--color--neve-link-color) !important;}.has-neve-link-hover-color-color{color: var(--wp--preset--color--neve-link-hover-color) !important;}.has-nv-site-bg-color{color: var(--wp--preset--color--nv-site-bg) !important;}.has-nv-light-bg-color{color: var(--wp--preset--color--nv-light-bg) !important;}.has-nv-dark-bg-color{color: var(--wp--preset--color--nv-dark-bg) !important;}.has-neve-text-color-color{color: var(--wp--preset--color--neve-text-color) !important;}.has-nv-text-dark-bg-color{color: var(--wp--preset--color--nv-text-dark-bg) !important;}.has-nv-c-1-color{color: var(--wp--preset--color--nv-c-1) !important;}.has-nv-c-2-color{color: var(--wp--preset--color--nv-c-2) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-neve-link-color-background-color{background-color: var(--wp--preset--color--neve-link-color) !important;}.has-neve-link-hover-color-background-color{background-color: var(--wp--preset--color--neve-link-hover-color) !important;}.has-nv-site-bg-background-color{background-color: var(--wp--preset--color--nv-site-bg) !important;}.has-nv-light-bg-background-color{background-color: var(--wp--preset--color--nv-light-bg) !important;}.has-nv-dark-bg-background-color{background-color: var(--wp--preset--color--nv-dark-bg) !important;}.has-neve-text-color-background-color{background-color: var(--wp--preset--color--neve-text-color) !important;}.has-nv-text-dark-bg-background-color{background-color: var(--wp--preset--color--nv-text-dark-bg) !important;}.has-nv-c-1-background-color{background-color: var(--wp--preset--color--nv-c-1) !important;}.has-nv-c-2-background-color{background-color: var(--wp--preset--color--nv-c-2) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-neve-link-color-border-color{border-color: var(--wp--preset--color--neve-link-color) !important;}.has-neve-link-hover-color-border-color{border-color: var(--wp--preset--color--neve-link-hover-color) !important;}.has-nv-site-bg-border-color{border-color: var(--wp--preset--color--nv-site-bg) !important;}.has-nv-light-bg-border-color{border-color: var(--wp--preset--color--nv-light-bg) !important;}.has-nv-dark-bg-border-color{border-color: var(--wp--preset--color--nv-dark-bg) !important;}.has-neve-text-color-border-color{border-color: var(--wp--preset--color--neve-text-color) !important;}.has-nv-text-dark-bg-border-color{border-color: var(--wp--preset--color--nv-text-dark-bg) !important;}.has-nv-c-1-border-color{border-color: var(--wp--preset--color--nv-c-1) !important;}.has-nv-c-2-border-color{border-color: var(--wp--preset--color--nv-c-2) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
130.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 131/*# sourceURL=global-styles-inline-css */ 132</style> 133 134<style id="dominant-color-styles-inline-css"> 135img[data-dominant-color]:not(.has-transparency) { background-color: var(--dominant-color); } 136/*# sourceURL=dominant-color-styles-inline-css */ 137</style> 138<link rel='stylesheet' id='wpa-css-css' href='https://peyanski.com/wp-content/plugins/honeypot/includes/css/wpa.css?ver=2.4.02' media='all' /> 139<link rel='stylesheet' id='woocommerce-layout-css' href='https://peyanski.com/wp-content/plugins/woocommerce/assets/css/woocommerce-layout.css?ver=11.1.2' media='all' /> 140<link rel='stylesheet' id='woocommerce-smallscreen-css' href='https://peyanski.com/wp-content/plugins/woocommerce/assets/css/woocommerce-smallscreen.css?ver=11.1.2' media='only screen and (max-width: 768px)' /> 141<link rel='stylesheet' id='woocommerce-general-css' href='https://peyanski.com/wp-content/plugins/woocommerce/assets/css/woocommerce.css?ver=11.1.2' media='all' /> 142<style id="woocommerce-inline-inline-css"> 143.woocommerce form .form-row .required { visibility: visible; } 144/*# sourceURL=woocommerce-inline-inline-css */ 145</style> 146<link rel='stylesheet' id='eztoc-css' href='https://peyanski.com/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.88' media='all' /> 147<style id="eztoc-inline-css"> 148div#ez-toc-container .ez-toc-title, .ez-toc-split-section .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title, .ez-toc-split-section .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li , div#ez-toc-container ul li a, .ez-toc-split-section ul li , .ez-toc-split-section ul li a {font-size: 95%;}div#ez-toc-container ul li , div#ez-toc-container ul li a, .ez-toc-split-section ul li , .ez-toc-split-section ul li a {font-weight: 500;}div#ez-toc-container nav ul ul li, .ez-toc-split-section nav ul ul li {font-size: 90%;}.ez-toc-box-title {font-weight: bold; margin-bottom: 10px; text-align: center; text-transform: uppercase; letter-spacing: 1px; color: #666; padding-bottom: 5px;position:absolute;top:-4%;left:5%;background-color: inherit;transition: top 0.3s ease;}.ez-toc-box-title.toc-closed {top:-25%;} 149.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, '.', decimal) '. ';display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, '.', decimal) '. ';display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; } 150/*# sourceURL=eztoc-inline-css */ 151</style> 152<link rel='stylesheet' id='neve-woocommerce-css' href='https://peyanski.com/wp-content/themes/neve/assets/css/woocommerce.min.css?ver=4.2.11' media='all' /> 153<style id="neve-woocommerce-inline-css"> 154 .woocommerce.single .entry-summary > form.cart { display:block; } .woocommerce div.product form.cart .button { float: none; } .sp-wl-wrap.sp-wl-product-wrap { margin-left: 0; margin-top: 5px;}.woocommerce .cart_totals .wc-proceed-to-checkout { display:block; } 155/*# sourceURL=neve-woocommerce-inline-css */ 156</style> 157<link rel='stylesheet' id='neve-style-css' href='https://peyanski.com/wp-content/themes/neve/style-main-new.min.css?ver=4.2.11' media='all' /> 158<style id="neve-style-inline-css"> 159.is-menu-sidebar .header-menu-sidebar { visibility: visible; }.is-menu-sidebar.menu_sidebar_slide_left .header-menu-sidebar { transform: translate3d(0, 0, 0); left: 0; }.is-menu-sidebar.menu_sidebar_slide_right .header-menu-sidebar { transform: translate3d(0, 0, 0); right: 0; }.is-menu-sidebar.menu_sidebar_pull_right .header-menu-sidebar, .is-menu-sidebar.menu_sidebar_pull_left .header-menu-sidebar { transform: translateX(0); }.is-menu-sidebar.menu_sidebar_dropdown .header-menu-sidebar { height: auto; }.is-menu-sidebar.menu_sidebar_dropdown .header-menu-sidebar-inner { max-height: 400px; padding: 20px 0; }.is-menu-sidebar.menu_sidebar_full_canvas .header-menu-sidebar { opacity: 1; }.header-menu-sidebar .menu-item-nav-search:not(.floating) { pointer-events: none; }.header-menu-sidebar .menu-item-nav-search .is-menu-sidebar { pointer-events: unset; }@media screen and (max-width: 960px) { .builder-item.cr .item--inner { --textal
159ign: center; --justify: center; } } 160.nv-meta-list li.meta:not(:last-child):after { content:"/" }.nv-meta-list .no-mobile{ 161 display:none; 162 }.nv-meta-list li.last::after{ 163 content: ""!important; 164 }@media (min-width: 769px) { 165 .nv-meta-list .no-mobile { 166 display: inline-block; 167 } 168 .nv-meta-list li.last:not(:last-child)::after { 169 content: "/" !important; 170 } 171 } 172 :root{ --container: 748px;--postwidth:100%; --primarybtnbg: var(--nv-c-1); --primarybtnhoverbg: rgba(222, 9, 59, 0.24); --primarybtncolor: #ffffff; --secondarybtncolor: var(--nv-primary-accent); --primarybtnhovercolor: #ffffff; --secondarybtnhovercolor: var(--nv-primary-accent);--primarybtnborderradius:3px;--secondarybtnborderradius:3px;--secondarybtnborderwidth:3px;--btnpadding:13px 15px;--primarybtnpadding:13px 15px;--secondarybtnpadding:calc(13px - 3px) calc(15px - 3px); --bodyfontfamily: Arial,Helvetica,sans-serif; --bodyfontsize: 15px; --bodylineheight: 1.6; --bodyletterspacing: 0px; --bodyfontweight: 400; --h1fontsize: 36px; --h1fontweight: 700; --h1lineheight: 1.2; --h1letterspacing: 0px; --h1texttransform: none; --h2fontsize: 28px; --h2fontweight: 700; --h2lineheight: 1.3; --h2letterspacing: 0px; --h2texttransform: none; --h3fontsize: 24px; --h3fontweight: 700; --h3lineheight: 1.4; --h3letterspacing: 0px; --h3texttransform: none; --h4fontsize: 20px; --h4fontweight: 700; --h4lineheight: 1.6; --h4letterspacing: 0px; --h4texttransform: none; --h5fontsize: 16px; --h5fontweight: 700; --h5lineheight: 1.6; --h5letterspacing: 0px; --h5texttransform: none; --h6fontsize: 14px; --h6fontweight: 700; --h6lineheight: 1.6; --h6letterspacing: 0px; --h6texttransform: none;--formfieldborderwidth:2px;--formfieldborderradius:3px; --formfieldbgcolor: var(--nv-site-bg); --formfieldbordercolor: #dddddd; --formfieldcolor: var(--nv-text-color);--formfieldpadding:10px 12px; } .nv-index-posts{ --borderradius:0px; } .single-post-container .alignfull > [class*="__inner-container"], .single-post-container .alignwide > [class*="__inner-container"]{ max-width:718px } .single-product .alignfull > [class*="__inner-container"], .single-product .alignwide > [class*="__inner-container"]{ max-width:718px } .nv-meta-list{ --avatarsize: 20px; } .single .nv-meta-list{ --avatarsize: 20px; } .nv-post-cover{ --height: 250px;--padding:40px 15px;--justify: flex-start; --textalign: left; --valign: center; } .nv-post-cover .nv-title-meta-wrap, .nv-page-title-wrap, .entry-header{ --textal
172ign: left; } .nv-is-boxed.nv-title-meta-wrap{ --padding:40px 15px; --bgcolor: var(--nv-dark-bg); } .nv-overlay{ --opacity: 50; --blendmode: normal; } .nv-is-boxed.nv-comments-wrap{ --padding:20px; } .nv-is-boxed.comment-respond{ --padding:20px; } .single:not(.single-product), .page{ --c-vspace:0 0 0 0;; } .scroll-to-top{ --color: var(--nv-text-dark-bg);--padding:8px 10px; --borderradius: 3px; --bgcolor: var(--nv-primary-accent); --hovercolor: var(--nv-text-dark-bg); --hoverbgcolor: var(--nv-primary-accent);--size:16px; } .global-styled{ --bgcolor: var(--nv-site-bg); } .header-top{ --rowbcolor: var(--nv-light-bg); --color: var(--nv-text-color); --bgcolor: var(--nv-site-bg); } .header-main{ --rowbcolor: var(--nv-light-bg); --color: var(--nv-text-color); --bgcolor: var(--nv-site-bg); } .header-bottom{ --rowbcolor: var(--nv-light-bg); --color: var(--nv-text-color); --bgcolor: var(--nv-site-bg); } .header-menu-sidebar-bg{ --justify: flex-start; --textalign: left;--flexg: 1;--wrapdropdownwidth: auto; --color: var(--nv-text-color); --bgcolor: var(--nv-site-bg); } .header-menu-sidebar{ width: 360px; } .builder-item--logo{ --maxwidth: 120px; --fs: 24px;--padding:10px 0;--margin:0; --textalign: left;--justify: flex-start; } .builder-item--nav-icon,.header-menu-sidebar .close-sidebar-panel .navbar-toggle{ --borderradius:0; } .builder-item--nav-icon{ --label-margin:0 5px 0 0;;--padding:10px 15px;--margin:0; } .builder-item--primary-menu{ --hovercolor: var(--nv-secondary-accent); --hovertextcolor: var(--nv-text-color); --activecolor: var(--nv-primary-accent); --spacing: 20px; --height: 25px;--padding:0;--margin:0; --fontsize: 1em; --lineheight: 1.6; --letterspacing: 0px; --fontweight: 500; --texttransform: none; --iconsize: 1em; } .hfg-is-group.has-primary-menu .inherit-ff{ --inheritedfw: 500; } .builder-item--header_search_responsive{ --iconsize: 15px; --formfieldfontsize: 14px;--formfieldborderwidth:2px;--formfieldborderradius:2px; --height: 40px;--padding:0 10px;--margin:0; } .footer-top-inner .row{ grid-template-columns:1fr 1fr 1fr; --valign: flex-start; } .footer-top{ --rowbcolor: var(--nv-light-bg); --color: var(--nv-text-color); --bgcolor: var(--nv-site-bg); } .footer-main-inner .row{ grid-template-columns:1fr 1fr 1fr; --valign: flex-start; } .footer-main{ --rowbcolor: var(--nv-light-bg); --color: var(--nv-text-color); --bgcolor: var(--nv-site-bg); } .footer-bottom-inner .row{ grid-template-columns:1fr 1fr 1fr; --valign: flex-start; } .footer-bottom{ --rowbcolor: var(--nv-light-bg); --color: var(--nv-text-dark-bg); --bgcolor: var(--nv-dark-bg); } @media(min-width: 576px){ :root{ --container: 992px;--postwidth:50%;--btnpadding:13px 15px;--primarybtnpadding:13px 15px;--secondarybtnpadding:calc(13px - 3px) calc(15px - 3px); --bodyfontsize: 16px; --bodylineheight: 1.6; --bodyletterspacing: 0px; --h1fontsize: 38px; --h1lineheight: 1.2; --h1letterspacing: 0px; --h2fontsize: 30px; --h2lineheight: 1.2; --h2letterspacing: 0px; --h3fontsize: 26px; --h3lineheight: 1.4; --h3letterspacing: 0px; --h4fontsize: 22px; --h4lineheight: 1.5; --h4letterspacing: 0px; --h5fontsize: 18px; --h5lineheight: 1.6; --h5letterspacing: 0px; --h6fontsize: 14px; --h6lineheight: 1.6; --h6letterspacing: 0px; } .single-post-container .alignfull > [class*="__inner-container"], .single-post-container .alignwide > [class*="__inner-container"]{ max-width:962px } .single-product .alignfull > [class*="__inner-container"], .single-product .alignwide > [class*="__inner-container"]{ max-width:962px } .nv-meta-list{ --avatarsize: 20px; } .single .nv-meta-list{ --avatarsize: 20px; } .nv-post-cover{ --height: 320px;--padding:60px 30px;--justify: flex-start; --textalign: left; --valign: center; } .nv-post-cover .nv-title-meta-wrap, .nv-page-title-wrap, .entry-header{ --textal
172ign: left; } .nv-is-boxed.nv-title-meta-wrap{ --padding:60px 30px; } .nv-is-boxed.nv-comments-wrap{ --padding:30px; } .nv-is-boxed.comment-respond{ --padding:30px; } .single:not(.single-product), .page{ --c-vspace:0 0 0 0;; } .scroll-to-top{ --padding:8px 10px;--size:16px; } .header-menu-sidebar-bg{ --justify: flex-start; --textalign: left;--flexg: 1;--wrapdropdownwidth: auto; } .header-menu-sidebar{ width: 360px; } .builder-item--logo{ --maxwidth: 120px; --fs: 24px;--padding:10px 0;--margin:0; --textalign: left;--justify: flex-start; } .builder-item--nav-icon{ --label-margin:0 5px 0 0;;--padding:10px 15px;--margin:0; } .builder-item--primary-menu{ --spacing: 20px; --height: 25px;--padding:0;--margin:0; --fontsize: 1em; --lineheight: 1.6; --letterspacing: 0px; --iconsize: 1em; } .builder-item--header_search_responsive{ --formfieldfontsize: 14px;--formfieldborderwidth:2px;--formfieldborderradius:2px; --height: 40px;--padding:0 10px;--margin:0; } }@media(min-width: 960px){ :root{ --container: 1170px;--postwidth:33.333333333333%;--btnpadding:3px 15px 5px 15px;;--primarybtnpadding:3px 15px 5px 15px;;--secondarybtnpadding:calc(3px - 3px) calc(15px - 3px) calc(5px - 3px) calc(15px - 3px);; --bodyfontsize: 16px; --bodylineheight: 1.7; --bodyletterspacing: 0px; --h1fontsize: 40px; --h1lineheight: 1.1; --h1letterspacing: 0px; --h2fontsize: 32px; --h2lineheight: 1.2; --h2letterspacing: 0px; --h3fontsize: 28px; --h3lineheight: 1.4; --h3letterspacing: 0px; --h4fontsize: 24px; --h4lineheight: 1.5; --h4letterspacing: 0px; --h5fontsize: 20px; --h5lineheight: 1.6; --h5letterspacing: 0px; --h6fontsize: 16px; --h6lineheight: 1.6; --h6letterspacing: 0px; } body:not(.single):not(.archive):not(.blog):not(.search):not(.error404) .neve-main > .container .col, body.post-type-archive-course .neve-main > .container .col, body.post-type-archive-llms_membership .neve-main > .container .col{ max-width: 100%; } body:not(.single):not(.archive):not(.blog):not(.search):not(.error404) .nv-sidebar-wrap, body.post-type-archive-course .nv-sidebar-wrap, body.post-type-archive-llms_membership .nv-sidebar-wrap{ max-width: 0%; } .neve-main > .archive-container .nv-index-posts.col{ max-width: 100%; } .neve-main > .archive-container .nv-sidebar-wrap{ max-width: 0%; } .neve-main > .single-post-container .nv-single-post-wrap.col{ max-width: 70%; } .single-post-container .alignfull > [class*="__inner-container"], .single-post-container .alignwide > [class*="__inner-container"]{ max-width:789px } .container-fluid.single-post-container .alignfull > [class*="__inner-container"], .container-fluid.single-post-container .alignwide > [class*="__inner-container"]{ max-width:calc(70% + 15px) } .neve-main > .single-post-container .nv-sidebar-wrap{ max-width: 30%; } .archive.woocommerce .neve-main > .shop-container .nv-shop.col{ max-width: 70%; } .archive.woocommerce .neve-main > .shop-container .nv-sidebar-wrap{ max-width: 30%; } .single-product .neve-main > .shop-container .nv-shop.col{ max-width: 100%; } .single-product .alignfull > [class*="__inner-container"], .single-product .alignwide > [class*="__inner-container"]{ max-width:1140px } .single-product .container-fluid .alignfull > [class*="__inner-container"], .single-product .alignwide > [class*="__inner-container"]{ max-width:calc(100% + 15px) } .single-product .neve-main > .shop-container .nv-sidebar-wrap{ max-width: 0%; } .nv-meta-list{ --avatarsize: 20px; } .single .nv-meta-list{ --avatarsize: 20px; } .nv-post-cover{ --height: 400px;--padding:60px 40px;--justify: flex-start; --textalign: left; --valign: center; } .nv-post-cover .nv-title-meta-wrap, .nv-page-title-wrap, .entry-header{ --textal
172ign: left; } .nv-is-boxed.nv-title-meta-wrap{ --padding:60px 40px; } .nv-is-boxed.nv-comments-wrap{ --padding:40px; } .nv-is-boxed.comment-respond{ --padding:40px; } .single:not(.single-product), .page{ --c-vspace:0 0 0 0;; } .scroll-to-top{ --padding:8px 10px;--size:16px; } .header-menu-sidebar-bg{ --justify: flex-start; --textalign: left;--flexg: 1;--wrapdropdownwidth: auto; } .header-menu-sidebar{ width: 360px; } .builder-item--logo{ --maxwidth: 120px; --fs: 24px;--padding:10px 0;--margin:0; --textalign: left;--justify: flex-start; } .builder-item--nav-icon{ --label-margin:0 5px 0 0;;--padding:10px 15px;--margin:0; } .builder-item--primary-menu{ --spacing: 20px; --height: 25px;--padding:0;--margin:0; --fontsize: 1em; --lineheight: 1.6; --letterspacing: 0px; --iconsize: 1em; } .builder-item--header_search_responsive{ --formfieldfontsize: 14px;--formfieldborderwidth:0 2px 2px 2px;;--formfieldborderradius:0 2px 2px 2px;; --height: 40px;--padding:0 10px;--margin:0; } }.scroll-to-top {right: 20px; border: none; position: fixed; bottom: 30px; display: none; opacity: 0; visibility: hidden; transition: opacity 0.3s ease-in-out, visibility 0.3s ease-in-out; align-items: center; justify-content: center; z-index: 999; } @supports (-webkit-overflow-scrolling: touch) { .scroll-to-top { bottom: 74px; } } .scroll-to-top.image { background-position: center; } .scroll-to-top .scroll-to-top-image { width: 100%; height: 100%; } .scroll-to-top .scroll-to-top-label { margin: 0; padding: 5px; } .scroll-to-top:hover { text-decoration: none; } .scroll-to-top.scroll-to-top-left {left: 20px; right: unset;} .scroll-to-top.scroll-show-mobile { display: flex; } @media (min-width: 960px) { .scroll-to-top { display: flex; } }.scroll-to-top { color: var(--color); padding: var(--padding); border-radius: var(--borderradius); background: var(--bgcolor); } .scroll-to-top:hover, .scroll-to-top:focus { color: var(--hovercolor); background: var(--hoverbgcolor); } .scroll-to-top-icon, .scroll-to-top.image .scroll-to-top-image { width: var(--size); height: var(--size); } .scroll-to-top-image { background-image: var(--bgimage); background-size: cover; }:root{--nv-primary-accent:#15abe5;--nv-secondary-accent:#2f5aae;--nv-site-bg:#ffffff;--nv-light-bg:#f4f5f7;--nv-dark-bg:#121212;--nv-text-color:#272626;--nv-text-dark-bg:#ffffff;--nv-c-1:#9463ae;--nv-c-2:#be574b;--nv-fallback-ff:Arial, Helvetica, sans-serif;} 173/*# sourceURL=neve-style-inline-css */ 174</style> 175<link rel='stylesheet' id='tfhb-style-css' href='https://peyanski.com/wp-content/plugins/hydra-booking/assets/app/css/style.css?ver=1.2.6' media='all' /> 176<style id="tfhb-style-inline-css"> 177 178 :root { 179 --tfhb-primary-color: #2E6B38; 180 --tfhb-primary-hover-color: #4C9959; 181 --tfhb-secondary-color: #273F2B; 182 --tfhb-secondary-hover-color: #E1F2E4; 183 --tfhb-paragraph-color: #273F2B; 184 --tfhb-text-title-color: #141915; 185 --tfhb-surface-primary-color: #C0D8C4; 186 --tfhb-surface-background-color: #EEF6F0; 187 } 188 189/*# sourceURL=tfhb-style-inline-css */ 190</style> 191<link rel='stylesheet' id='tablepress-default-css' href='https://peyanski.com/wp-content/tablepress-combined.min.css?ver=54' media='all' /> 192<link rel='stylesheet' id='neve-child-style-css' href='https://peyanski.com/wp-content/themes/neve-child-master/style.css?ver=4.2.11' media='all' />
193<script id="jquery-core-js" src="https://peyanski.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 193
193
194<script id="jquery-migrate-js" src="https://peyanski.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 194
194
195<script data-wp-strategy="defer" defer id="wc-jquery-blockui-js" src="https://peyanski.com/wp-content/plugins/woocommerce/assets/js/jquery-blockui/jquery.blockUI.min.js?ver=2.7.0-wc.11.1.2"></script>
vendor: 1 bytes, line 195
195
196<script id="wc-add-to-cart-js-extra"> 197var wc_add_to_cart_params = {"ajax_url":"/wp-admin/admin-ajax.php","wc_ajax_url":"/?wc-ajax=%%endpoint%%","i18n_view_cart":"View cart","cart_url":"https://peyanski.com/cart/","is_cart":"","cart_redirect_after_add":"yes"}; 198//# sourceURL=wc-add-to-cart-js-extra 199</script>
vendor: 1 bytes, line 199
199
200<script data-wp-strategy="defer" defer id="wc-add-to-cart-js" src="https://peyanski.com/wp-content/plugins/woocommerce/assets/js/frontend/add-to-cart.min.js?ver=11.1.2"></script>
vendor: 1 bytes, line 200
200
201<script data-wp-strategy="defer" defer id="wc-js-cookie-js" src="https://peyanski.com/wp-content/plugins/woocommerce/assets/js/js-cookie/js.cookie.min.js?ver=2.1.4-wc.11.1.2"></script>
vendor: 1 bytes, line 201
201
202<script id="woocommerce-js-extra"> 203var woocommerce_params = {"ajax_url":"/wp-admin/admin-ajax.php","wc_ajax_url":"/?wc-ajax=%%endpoint%%","i18n_password_show":"Show password","i18n_password_hide":"Hide password"}; 204//# sourceURL=woocommerce-js-extra 205</script>
vendor: 1 bytes, line 205
205
206<script data-wp-strategy="defer" defer id="woocommerce-js" src="https://peyanski.com/wp-content/plugins/woocommerce/assets/js/frontend/woocommerce.min.js?ver=11.1.2"></script>
206 207<link rel="https://api.w.org/" href="https://peyanski.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://peyanski.com/wp-json/wp/v2/posts/26562" /><meta name="generator" content="dominant-color-images 1.3.0"> 208<meta name="generator" content="performance-lab 4.2.0; plugins: dominant-color-images, webp-uploads"> 209<meta name="generator" content="webp-uploads 2.7.1"> 210 211<!-- Google Tag Manager for WordPress by gtm4wp.com --> 212<!-- GTM Container placement set to automatic -->
213<script data-cfasync="false" data-pagespeed-no-defer> 214 var dataLayer_content = {"pagePostType":"post","pagePostType2":"single-post","pageCategory":["home-assistant"],"pageAttributes":["codex","ha-mcp","home-assistant-ai","home-assistant-automations","home-assistant-dashboards","home-assistant-mcp","smart-home-ai"],"pagePostAuthor":"Kiril Peyanski","customerTotalOrders":0,"customerTotalOrderValue":0,"customerFirstName":"","customerLastName":"","customerBillingFirstName":"","customerBillingLastName":"","customerBillingCompany":"","customerBillingAddress1":"","customerBillingAddress2":"","customerBillingCity":"","customerBillingState":"","customerBillingPostcode":"","customerBillingCountry":"","customerBillingEmail":"","customerBillingEmailHash":"","customerBillingPhone":"","customerShippingFirstName":"","customerShippingLastName":"","customerShippingCompany":"","customerShippingAddress1":"","customerShippingAddress2":"","customerShippingCity":"","customerShippingState":"","customerShippingPostcode":"","customerShippingCountry":""}; 215 dataLayer.push( dataLayer_content ); 216</script>
vendor: 1 bytes, line 216
216
217<script data-cfasync="false" data-pagespeed-no-defer>
vendor: 322 bytes, lines 217-222
217 218(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 219new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 220j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 221'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 222})(window,document,'script','dataLayer','
222GTM-PWKWWZ7
vendor: 4 bytes, line 222
222');
223</script>
223 224<!-- End Google Tag Manager for WordPress by gtm4wp.com --> <noscript><style>.woocommerce-product-gallery{ opacity: 1 !important; }</style></noscript> 225 <link rel="icon" href="https://peyanski.com/wp-content/uploads/2019/08/LogoMakr_150x150-100x100.webp" sizes="32x32" /> 226<link rel="icon" href="https://peyanski.com/wp-content/uploads/2019/08/LogoMakr_150x150.webp" sizes="192x192" /> 227<link rel="apple-touch-icon" href="https://peyanski.com/wp-content/uploads/2019/08/LogoMakr_150x150.webp" /> 228<meta name="msapplication-TileImage" content="https://peyanski.com/wp-content/uploads/2019/08/LogoMakr_150x150.webp" /> 229<style id="wp-custom-css"> 230.hfg-slot.left { 231 display: none; 232} 233 234/* NEW: Use this class to center the card on your page. 235 It replaces the old 'body' styles. 236*/ 237.product-card-container { 238 display: flex; 239 justify-content: center; 240 align-items: center; 241 padding: 2rem 0; /* Adds some space above/below */ 242 /* You can add a background here if you want *just* this section gray */ 243 /* background-color: #f0f2f5; */ 244} 245 246/* BELOW IS THE ORIGINAL CARD STYLING
247 (It is unchanged, but included for completeness) 248*/ 249.product-card { 250 position: relative; 251 max-width: 650px; 252 width: 90%; /* Added width: 90% for better mobile stacking */ 253 display: flex; 254 align-items: center; 255 margin: 2rem; 256} 257 258.product-image { 259 position: absolute; 260 left: 0; 261 top: 50%; 262 transform: translateY(-50%); 263 width: 200px; 264 z-index: 2; 265} 266 267.product-image img { 268 width: 100%; 269 height: auto; 270 filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.1)); 271 transition: transform 0.3s ease; 272} 273 274.product-image img:hover { 275 276 transform: scale(1.05); /* Scales up to 105% of its original size */ 277 /* If you want a slight depth, you could also adjust the shadow on hover */ 278 /* filter: drop-shadow(0 8px 16px rgba(0, 0, 0, 0.2)); */ 279 filter: drop-shadow(0 0 15px rgba(255, 255, 255, 0.6)) /* white glow */ 280 drop-shadow(0 4px 8px rgba(0, 0, 0, 0.1)); /* keep original shadow */ 281} 282 283.product-info { 284 background-color: rgb(130, 137, 139); 285 color: white; 286 border-radius: 24px; 287 padding: 24px; 288 padding-left: 150px; 289 width: 100%; 290 box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); 291 margin-left: 100px; 292} 293 294.specs-list { 295 list-style: none; 296 padding: 0; 297 margin: 0 0 24px 0; 298} 299 300.specs-list li { 301 display: flex; 302 align-items: center; 303 margin-bottom: 12px; 304 font-size: 1rem; 305 color: #E0E0E0; 306 font-family: Arial, sans-serif; /* Added font-family here */ 307} 308 309.specs-list li i { 310 width: 28px; 311 text-align: center; 312 margin-right: 12px; 313 color: #E0E0E0; 314 font-size: 1.1rem; 315} 316 317.button-container { 318 display: flex; 319 flex-wrap: wrap; 320 gap: 12px; 321} 322 323.store-button { 324 text-decoration: none; 325 color: white; 326 background-color: transparent; 327 border: 2px solid #7A94B8; 328 padding: 10px 16px; 329 border-radius: 12px; 330 display: inline-flex; 331 align-items: center; 332 font-weight: 600; 333 font-size: 0.9rem; 334 transition: all 0.3s ease; 335 font-family: Arial, sans-serif; /* Added font-family here */ 336} 337 338.store-button i { 339 margin-right: 8px; 340 font-size: 1rem; 341} 342 343.store-button:hover { 344 background-color: white; 345 color: #192A45; 346} 347 348/* NEW: Added a simple media query for small screens. 349 This stacks the card vertically on phones. 350*/ 351@media (max-width: 600px) { 352 .product-image { 353 position: relative; /* Un-do the absolute positioning */ 354 transform: none; 355 width: 150px; /* Make image smaller */ 356 margin: 0 auto; /* Center it */ 357 top: -20px; /* Pull it up a bit */ 358 } 359 360 .product-card { 361 flex-direction: column; /* Stack vertically */ 362 margin: 0 1rem; /* Give some side margin */ 363 width: auto; 364 } 365 366 .product-info { 367 margin-left: 0; /* Reset margin */ 368 padding: 24px; /* Reset padding */ 369 padding-top: 100px; /* Add space for image */ 370 margin-top: -80px; /* Pull info box up */ 371 width: 100%; 372 } 373} 374 375 376 377 378 379</style> 380 381 </head> 382 383<body class="wp-singular post-template-default single single-post postid-26562 single-format-standard wp-custom-logo wp-theme-neve wp-child-theme-neve-child-master theme-neve woocommerce-no-js nv-blog-grid nv-sidebar-right menu_sidebar_slide_left" id="neve_body" ><a href="https://peyanski.com/cdn-cgi/content?id=w0A6hRQ1ByVzqgfzco5Nlo0ylyo33wVOcM2GUSZrId8-1791069045.7024765-1.2.1.1-qMacngKTP8MoAGpeaibuuk5jJc8yIlJI8K9uTZRzULdRpax.B5S32yv9RJcJCU5x" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a> 384 385<!-- GTM Container placement set to automatic --> 386<!-- Google Tag Manager (noscript) --> 387 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PWKWWZ7" height="0" width="0" style="display:none;visibility:hidden" aria-hidden="true"></iframe></noscript> 388<!-- End Google Tag Manager (noscript) --><div class="wrapper"> 389 390 <header class="header" > 391 <a class="neve-skip-link show-on-focus" href="#content" > 392 Skip to content </a> 393 <div id="header-grid" class="hfg_header site-header"> 394 395<nav class="header--row header-main hide-on-mobile hide-on-tablet layout-full-contained nv-navbar has-center header--row" 396 data-row-id="main" data-show-on="desktop"> 397 398 <div 399 class="header--row-inner header-main-inner"> 400 <div class="container"> 401 <div 402 class="row row--wrapper" 403 data-section="hfg_header_layout_main" > 404 <div class="hfg-slot left"></div><div class="hfg-slot center"><div class="builder-item desktop-left"><div class="item--inner builder-item--logo" 405 data-section="title_tagline" 406 data-item-id="logo"> 407 408<div class="site-logo"> 409 <a class="brand" href="https://peyanski.com/" aria-label="Kiril Peyanski Blog Smart Home, Home Automation, IoT, Home Assistant, Node-RED, Raspberry Pi and everything related." rel="home"><img width="150" height="100" src="https://peyanski.com/wp-content/uploads/2019/11/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.webp" class="neve-site-logo skip-lazy has-transparency" alt="" data-variant="logo" decoding="async" data-has-transparency="true" data-dominant-color="0b1113" style="--dominant-color: #0b1113;" /></a></div> 410 </div> 411 412</div></div><div class="hfg-slot right"><div class="builder-item has-nav hfg-is-group has-primary-menu"><div class="item--inner builder-item--primary-menu has_menu" 413 data-section="header_menu_primary" 414 data-item-id="primary-menu"> 415 <div class="nv-nav-wrap"> 416 <div role="navigation" class="nav-menu-primary" 417 aria-label="Primary Menu"> 418 419 <ul id="nv-primary-navigation-main" class="primary-menu-ul nav-ul menu-desktop"><li id="menu-item-16551" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-16551"><div class="wrap"><a href="https://peyanski.com">Home</a></div></li> 420<li id="menu-item-4316" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4316"><div class="wrap"><a href="https://peyanski.com/contact">Contact</a></div></li> 421<li id="menu-item-4529" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4529"><div class="wrap"><a href="https://peyanski.com/newsletter">Newsletter</a></div></li> 422<li id="menu-item-21501" class="button button-secondary menu-item menu-item-type-custom menu-item-object-custom menu-item-21501"><div class="wrap">
422<a href="https://automatelike.pro/ai-ha-book/">Get My Free+Shipping Book</a></div></li> 423<li id="menu-item-4989" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4989"><div class="wrap"><a href="https://peyanski.com/support">Support</a></div></li> 424<li id="menu-item-19175" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19175"><div class="wrap"><a href="https://peyanski.com/about/">About Me</a></div></li> 425<li id="menu-item-25687" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25687"><div class="wrap"><a href="https://peyanski.com/coaching/">Coaching 1:1</a></div></li> 426</ul> </div> 427</div> 428 429 </div> 430 431<div class="item--inner builder-item--header_search_responsive" 432 data-section="header_search_responsive" 433 data-item-id="header_search_responsive"> 434 <div class="nv-search-icon-component" > 435 <div class="menu-item-nav-search minimal"> 436 <a aria-label="Search" href="#" class="nv-icon nv-search" > 437 <svg width="15" height="15" viewbox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z" /></svg> 438 </a> <div class="nv-nav-search" aria-label="search"> 439 <div class="form-wrap "> 440 441<form role="search" 442 method="get" 443 class="search-form" 444 action="https://peyanski.com/"> 445 <label> 446 <span class="screen-reader-text">Search for...</span> 447 </label> 448 <input type="search" 449 class="search-field" 450 aria-label="Search" 451 placeholder="Search for..." 452 value="" 453 name="s"/> 454 <button type="submit" 455 class="search-submit nv-submit" 456 aria-label="Search"> 457 <span class="nv-search-icon-wrap"> 458 <span class="nv-icon nv-search" > 459 <svg width="15" height="15" viewbox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z" /></svg> 460 </span> </span> 461 </button> 462 </form> 463 </div> 464 </div> 465 </div> 466</div> 467 </div> 468 469</div></div> </div> 470 </div> 471 </div> 472</nav> 473 474<div class="header--row header-top hide-on-desktop layout-full-contained header--row" 475 data-row-id="top" data-show-on="mobile"> 476 477 <div 478 class="header--row-inner header-top-inner"> 479 <div class="container"> 480 <div 481 class="row row--wrapper" 482 data-section="hfg_header_layout_top" > 483 <div class="hfg-slot left"></div><div class="hfg-slot right"><div class="builder-item tablet-left mobile-left"><div class="item--inner builder-item--nav-icon" 484 data-section="header_menu_icon" 485 data-item-id="nav-icon"> 486 <div class="menu-mobile-toggle item-button navbar-toggle-wrapper"> 487 <button type="button" class=" navbar-toggle" 488 value="Navigation Menu" 489 aria-label="Navigation Menu " 490 aria-expanded="false" onclick="if('undefined' !== typeof toggleAriaClick ) { toggleAriaClick() }"> 491 <span class="bars"> 492 <span class="icon-bar"></span> 493 <span class="icon-bar"></span> 494 <span class="icon-bar"></span> 495 </span> 496 <span class="screen-reader-text">Navigation Menu</span> 497 </button> 498</div> <!--.navbar-toggle-wrapper--> 499 500 501 </div> 502 503</div></div> </div> 504 </div> 505 </div> 506</div> 507 508<div 509 id="header-menu-sidebar" class="header-menu-sidebar tcb menu-sidebar-panel slide_left hfg-pe" 510 data-row-id="sidebar"> 511 <div id="header-menu-sidebar-bg" class="header-menu-sidebar-bg"> 512 <div class="close-sidebar-panel navbar-toggle-wrapper"> 513 <button type="button" class="hamburger is-active navbar-toggle active" value="Navigation Menu" 514 aria-label="Navigation Menu " 515 aria-expanded="false" onclick="if('undefined' !== typeof toggleAriaClick ) { toggleAriaClick() }"> 516 <span class="bars"> 517 <span class="icon-bar"></span> 518 <span class="icon-bar"></span> 519 <span class="icon-bar"></span> 520 </span> 521 <span class="screen-reader-text"> 522 Navigation Menu </span> 523 </button> 524 </div> 525 <div id="header-menu-sidebar-inner" class="header-menu-sidebar-inner tcb "> 526 <div class="builder-item has-nav"><div class="item--inner builder-item--primary-menu has_menu" 527 data-section="header_menu_primary" 528 data-item-id="primary-menu"> 529 <div class="nv-nav-wrap"> 530 <div role="navigation" class="nav-menu-primary" 531 aria-label="Primary Menu"> 532 533 <ul id="nv-primary-navigation-sidebar" class="primary-menu-ul nav-ul menu-mobile"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-16551"><div class="wrap"><a href="https://peyanski.com">Home</a></div></li> 534<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4316"><div class="wrap"><a href="https://peyanski.com/contact">Contact</a></div></li> 535<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4529"><div class="wrap"><a href="https://peyanski.com/newsletter">Newsletter</a></div></li> 536<li class="button button-secondary menu-item menu-item-type-custom menu-item-object-custom menu-item-21501"><div class="wrap">
536<a href="https://automatelike.pro/ai-ha-book/">Get My Free+Shipping Book</a></div></li> 537<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4989"><div class="wrap"><a href="https://peyanski.com/support">Support</a></div></li> 538<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19175"><div class="wrap"><a href="https://peyanski.com/about/">About Me</a></div></li> 539<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25687"><div class="wrap"><a href="https://peyanski.com/coaching/">Coaching 1:1</a></div></li> 540</ul> </div> 541</div> 542 543 </div> 544 545</div> </div> 546 </div> 547</div> 548<div class="header-menu-sidebar-overlay hfg-ov hfg-pe" onclick="if('undefined' !== typeof toggleAriaClick ) { toggleAriaClick() }"></div> 549</div> 550 </header> 551 552 <style>.nav-ul li:focus-within .wrap.active + .sub-menu { opacity: 1; visibility: visible; }.nav-ul li.neve-mega-menu:focus-within .wrap.active + .sub-menu { display: grid; }.nav-ul li > .wrap { display: flex; align-items: center; position: relative; padding: 0 4px; }.nav-ul:not(.menu-mobile):not(.neve-mega-menu) > li > .wrap > a { padding-top: 1px }</style> 553 554 555 <main id="content" class="neve-main"> 556 557 <div class="container single-post-container"> 558 <div class="row"> 559 <article id="post-26562" 560 class="nv-single-post-wrap col post-26562 post type-post status-publish format-standard has-post-thumbnail hentry category-home-assistant tag-codex tag-ha-mcp tag-home-assistant-ai tag-home-assistant-automations tag-home-assistant-dashboards tag-home-assistant-mcp tag-smart-home-ai"> 561 <div class="entry-header" ><div class="nv-title-meta-wrap"><small class="neve-breadcrumbs-wrapper"></small><h1 class="title entry-title">ha-mcp and Codex: Build Home Assistant Dashboards Without Entity Hunting</h1><ul class="nv-meta-list"><li class="meta author vcard "><span class="author-name fn">by <a href="https://peyanski.com/author/peyanski/" title="Posts by Kiril Peyanski" rel="author">Kiril Peyanski</a></span></li><li class="meta date posted-on "><time class="entry-date published" datetime="2026-07-03T20:23:23+03:00" content="2026-07-03">03/07/2026</time><time class="updated" datetime="2026-07-03T21:53:30+03:00">03/07/2026</time></li></ul></div></div><div class="nv-thumb-wrap"><img width="929" height="523" src="https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif" class="skip-lazy not-transparent wp-post-image" alt="ha-mcp Codex Home Assistant dashboard automation featured image" decoding="async" fetchpriority="high" srcset="https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog.avif 929w, https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog-300x169.avif 300w, https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog-768x432.avif 768w, https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog-600x338.avif 600w, https://peyanski.com/wp-content/uploads/2026/05/ha_mcp_codex_thumb_B_blog-150x84.avif 150w" sizes="(max-width: 929px) 100vw, 929px" data-has-transparency="false" data-dominant-color="363a35" style="--dominant-color: #363a35;" /></div><div class="nv-content-wrap entry-content"> 562<p class="wp-block-paragraph"><strong>ha-mcp</strong> is the part that made this whole Codex and Home Assistant experiment feel different.</p><!-- Ezoic - wp_under_page_title - under_page_title --><div id="ezoic-pub-ad-placeholder-139" data-inserter-version="2" data-placement-location="under_page_title"></div>
562<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(139); });</script>
562<!-- End Ezoic - wp_under_page_title - under_page_title --> 563 564 565 566<p class="wp-block-paragraph">Without it, Codex can still write YAML examples. It can explain dashboards. It can suggest automation ideas. Nice, but also a bit detached from the real mess inside my Home Assistant.</p> 567 568 569 570<p class="wp-block-paragraph">With <strong>ha-mcp</strong>, Codex can ask Home Assistant what is actually there. Real entities. Real automations. Real dashboards. Real traces. That is where it stops feeling like a generic chatbot and starts feeling like a smart assistant sitting next to the dashboard editor.</p><!-- Ezoic - wp_under_first_paragraph - under_first_paragraph --><div id="ezoic-pub-ad-placeholder-147" data-inserter-version="2" data-placement-location="under_first_paragraph"></div>
570<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(147); });</script>
570<!-- End Ezoic - wp_under_first_paragraph - under_first_paragraph --> 571 572 573 574<p class="wp-block-paragraph">And yes, that is exciting. It is also the kind of exciting where I want a backup before I click anything important.</p> 575 576 577 578<p class="wp-block-paragraph">I tested this because my previous video about Claude, Home Assistant, and <a href="https://homeassistant-ai.github.io/ha-mcp/" target="_blank" rel="noopener">ha-mcp</a> did very well. People watched it, tried it, and then a very fair question appeared in the comments: can I use something else than Claude?</p> 579 580 581 582<p class="wp-block-paragraph">That question made sense. Claude worked nicely in my first test, but I was using the free tier and I hit usage limits very fast. Waiting for the reset is not the end of the world, but when you are in the middle of a Home Assistant rabbit hole, it feels like somebody locked the toolbox.</p><!-- Ezoic - wp_under_second_paragraph - under_second_paragraph --><div id="ezoic-pub-ad-placeholder-148" data-inserter-version="2" data-placement-location="under_second_paragraph"></div>
582<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(148); });</script>
582<!-- End Ezoic - wp_under_second_paragraph - under_second_paragraph --> 583 584 585 586<p class="wp-block-paragraph">I already pay for OpenAI Plus, so I wanted to test Codex with <strong>ha-mcp</strong>. Not for a theory video. For the things Home Assistant users actually do: build dashboard cards, create automations, and debug the old automations that everyone pretends they will clean up one day.</p> 587 588 589 590<div id="ez-toc-container" class="ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction"> 591<p class="ez-toc-title" style="cursor:inherit">Table of Contents</p> 592<label for="ez-toc-cssicon-toggle-item-6ac18b764f219" class="ez-toc-cssicon-toggle-label"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></label><input type="checkbox" id="ez-toc-cssicon-toggle-item-6ac18b764f219" aria-label="Toggle" /><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#Tired_of_reading" >Tired of reading?</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#The_simple_idea_Codex_gets_Home_Assistant_tools" >The simple idea: Codex gets Home Assistant tools</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#Do_you_know_that_you_can_get_a_real_Free_HA_AI_book" >Do you know that you can get a real Free HA & AI book?</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#Dashboard_cards_are_where_this_becomes_useful_fast" >Dashboard cards are where this becomes useful fast</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#Automation_creation_still_needs_a_human_brake_pedal" >Automation creation still needs a human brake pedal</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#Debugging_old_automations_may_be_the_best_use_case" >Debugging old automations may be the best use case</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-7" href="#The_PDF_has_the_Mac_and_Windows_setup_details" >The PDF has the Mac and Windows setup details</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-8" href="#One_Codex_detail_that_can_save_time" >One Codex detail that can save time</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-9" href="#My_safety_rules_for_Codex_and_ha-mcp" >My safety rules for Codex and ha-mcp</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#So_is_Codex_worth_testing_with_Home_Assistant" >So, is Codex worth testing with Home Assistant?</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-11" href="#If_you_want_more" >If you want more</a></li></ul></nav></div> 593<h2 class="wp-block-heading"><span class="ez-toc-section" id="Tired_of_reading"></span>Tired of reading?<span class="ez-toc-section-end"></span></h2> 594 595 596 597<p class="wp-block-paragraph">I also made a video version of this experiment. You can watch it here: <a href="https://youtu.be/4ildkUCt4Hg" target="_blank" rel="noopener">Codex, ha-mcp, and Home Assistant video</a>.</p> 598 599 600 601<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> 602<div class="nv-iframe-embed"><iframe title="The OpenAI Way to Build Home Assistant Dashboards and Automations" width="1200" height="675" src="https://www.youtube.com/embed/4ildkUCt4Hg?feature=oembed&enablejsapi=1&origin=https://peyanski.com" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture;
602 web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div> 603</div></figure> 604 605 606 607<p class="wp-block-paragraph">The video is better if you want to see the flow visually: Codex, the MCP bridge, dashboards, automation prompts, and the safety checks before approving changes.</p><!-- Ezoic - wp_mid_content - mid_content --><div id="ezoic-pub-ad-placeholder-149" data-inserter-version="2" data-placement-location="mid_content"></div>
607<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(149); });</script>
607<!-- End Ezoic - wp_mid_content - mid_content --> 608 609 610 611<h2 class="wp-block-heading"><span class="ez-toc-section" id="The_simple_idea_Codex_gets_Home_Assistant_tools"></span>The simple idea: Codex gets Home Assistant tools<span class="ez-toc-section-end"></span></h2> 612 613 614 615<p class="wp-block-paragraph">The basic structure is simple. Home Assistant is your smart home. Codex is the AI assistant. <strong>ha-mcp</strong> is the bridge between them.</p> 616 617 618 619<p class="wp-block-paragraph">MCP means Model Context Protocol. The less fancy explanation is this: it gives an AI assistant tools it can use. Instead of guessing what your entities are called, Codex can ask Home Assistant. Instead of giving a random automation example, it can inspect the current automation first, then suggest a safer fix.</p> 620 621 622 623<figure class="wp-block-image size-full"><img data-dominant-color="dadee0" data-has-transparency="false" style="--dominant-color: #dadee0;" decoding="async" width="2048" height="1152" src="https://peyanski.com/wp-content/uploads/2026/05/SL03-3.avif" alt="ha-mcp Codex Home Assistant bridge diagram" class="wp-image-26559 not-transparent" srcset="https://peyanski.com/wp-content/uploads/2026/05/SL03-3.avif 2048w, https://peyanski.com/wp-content/uploads/2026/05/SL03-3-300x169.avif 300w, https://peyanski.com/wp-content/uploads/2026/05/SL03-3-768x432.avif 768w, https://peyanski.com/wp-content/uploads/2026/05/SL03-3-1536x864.avif 1536w, https://peyanski.com/wp-content/uploads/2026/05/SL03-3-600x338.avif 600w, https://peyanski.com/wp-content/uploads/2026/05/SL03-3-150x84.avif 150w" sizes="(max-width: 2048px) 100vw, 2048px" /><figcaption class="wp-element-caption">ha-mcp works like the bridge between Codex and your real Home Assistant setup.</figcaption></figure> 624 625 626 627<p class="wp-block-paragraph">The official <a href="https://github.com/homeassistant-ai/ha-mcp" target="_blank" rel="noopener">ha-mcp GitHub page</a> shows examples like adding dashboard cards, debugging a motion sensor automation, and creating scripts. That is the interesting part. This is not only “AI, explain Home Assistant.” It is closer to “AI, look at my Home Assistant and help me build the thing.”</p><!-- Ezoic - wp_long_content - long_content --><div id="ezoic-pub-ad-placeholder-150" data-inserter-version="2" data-placement-location="long_content"></div>
627<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(150); });</script>
627<!-- End Ezoic - wp_long_content - long_content --> 628 629 630 631<p class="wp-block-paragraph">Of course, I do not want Codex to behave like a cowboy with Wi-Fi. So my rule is simple: plan first, change later. For early tests I prefer safe devices, dashboards, read-only inspection, and test environments where possible. I do not start with locks, alarms, garage doors, or water valves. Smart bulbs are brave enough for day one.</p> 632 633 634 635<h2 class="wp-block-heading"><span class="ez-toc-section" id="Do_you_know_that_you_can_get_a_real_Free_HA_AI_book"></span>Do you know that you can get a real Free HA & AI book?<span class="ez-toc-section-end"></span></h2> 636 637 638 639<p class="wp-block-paragraph">I put more than 1,000 hours within 6 months on this project and I managed to develop a tool and describe in great details several real-life AI recipes. I put everything in a book called <strong>Home Assistant AI Recipes </strong>and it is your to have for <span style="text-decoration: underline;">free</span> you just have to cover printing & shipping. But check this page for more info – <a href="https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/ ">https://peyanski.com/ha-mcp-codex-home-assistant-dashboards-automations/ </a></p> 640 641 642 643<h2 class="wp-block-heading"><span class="ez-toc-section" id="Dashboard_cards_are_where_this_becomes_useful_fast"></span>Dashboard cards are where this becomes useful fast<span class="ez-toc-section-end"></span></h2> 644 645 646 647<p class="wp-block-paragraph">The first use case I like is dashboard creation. Every Home Assistant user knows this small pain. You want one clean card, but first you have to remember the entity names, choose the right card type, make it readable on mobile, and avoid turning a simple dashboard into a tiny airplane cockpit.</p><!-- Ezoic - wp_longer_content - longer_content --><div id="ezoic-pub-ad-placeholder-151" data-inserter-version="2" data-placement-location="longer_content"></div>
647<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(151); });</script>
647<!-- End Ezoic - wp_longer_content - longer_content --> 648 649 650 651<p class="wp-block-paragraph">With <strong>ha-mcp</strong>, Codex can help with the boring first part. A prompt can be very normal:</p> 652 653 654 655<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> 656<p class="wp-block-paragraph">Look at my Home Assistant entities and help me create a House Check dashboard card. I want garage door, front door lock, open windows, motion, temperature, and low batteries. Make it simple for a phone. Before changing anything, show me the entities you plan to use.</p> 657</blockquote> 658 659 660 661<p class="wp-block-paragraph">That last sentence is the important one. Before changing anything, show me the entities you plan to use.</p> 662 663 664 665<p class="wp-block-paragraph">Maybe Codex finds three motion sensors. Maybe two door locks. Maybe a battery entity with a name from five years ago when I apparently named devices by dropping the keyboard on the floor. This is why I want a plan first.</p><!-- Ezoic - wp_longest_content - longest_content --><div id="ezoic-pub-ad-placeholder-152" data-inserter-version="2" data-placement-location="longest_content"></div>
665<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(152); });</script>
665<!-- End Ezoic - wp_longest_content - longest_content --> 666 667 668 669<figure class="wp-block-image size-full"><img data-dominant-color="cdd2d5" data-has-transparency="false" style="--dominant-color: #cdd2d5;" loading="lazy" decoding="async" width="2048" height="1152" src="https://peyanski.com/wp-content/uploads/2026/05/SL05.avif" alt="ha-mcp Home Assistant dashboard card creation House Check concept" class="wp-image-26560 not-transparent" srcset="https://peyanski.com/wp-content/uploads/2026/05/SL05.avif 2048w, https://peyanski.com/wp-content/uploads/2026/05/SL05-300x169.avif 300w, https://peyanski.com/wp-content/uploads/2026/05/SL05-768x432.avif 768w, https://peyanski.com/wp-content/uploads/2026/05/SL05-1536x864.avif 1536w, https://peyanski.com/wp-content/uploads/2026/05/SL05-600x338.avif 600w, https://peyanski.com/wp-content/uploads/2026/05/SL05-150x84.avif 150w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /><figcaption class="wp-element-caption">A simple House Check dashboard card is a good first ha-mcp and Codex test.</figcaption></figure> 670 671 672 673<p class="wp-block-paragraph">The workflow I like is not “AI does everything and I hope my house survives.” It is idea, AI search, AI first draft, human review, then Home Assistant result. Codex can reduce the friction, but I keep the steering wheel.</p> 674 675 676 677<h2 class="wp-block-heading"><span class="ez-toc-section" id="Automation_creation_still_needs_a_human_brake_pedal"></span>Automation creation still needs a human brake pedal<span class="ez-toc-section-end"></span></h2> 678 679 680 681<p class="wp-block-paragraph">The second useful area is automation creation. This is where <strong>ha-mcp</strong> can save time because automations often need several pieces to work together: triggers, conditions, services, helpers, entity states, maybe time windows, maybe a notification.</p> 682 683 684 685<p class="wp-block-paragraph">For example, a simple bedroom automation can still become annoying by hand. Motion at night should turn on a soft light. A cold room with an open window should warn you. Blinds should open in the morning, but not at 4:30 because some automation got too enthusiastic. These are normal smart home ideas, but they include enough small logic choices to slow you down.</p><!-- Ezoic - wp_incontent_5 - incontent_5 --><div id="ezoic-pub-ad-placeholder-153" data-inserter-version="2" data-placement-location="incontent_5"></div>
685<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(153); });</script>
685<!-- End Ezoic - wp_incontent_5 - incontent_5 --> 686 687 688 689<p class="wp-block-paragraph">So I would ask Codex for a plan first:</p> 690 691 692 693<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> 694<p class="wp-block-paragraph">Create a Sleep Rescue automation plan for the bedroom. Use motion, window contact, temperature, lights, and blinds if they exist. Do not write changes yet. Show the plan first.</p> 695</blockquote> 696 697 698 699<p class="wp-block-paragraph">Then I can review the trigger, condition, action, and mode. Should it be single, restart, or queued? Should it be one automation or two? Should there be a helper? Codex can suggest an answer, but Home Assistant is still my home, not a code playground.</p> 700 701 702 703<p class="wp-block-paragraph">This is also why <strong>ha-mcp</strong> feels more useful than copying a YAML block from a normal chatbot. The AI can work from the real environment, but you can still force it to slow down and explain what it wants to do.</p> 704 705 706 707<h2 class="wp-block-heading"><span class="ez-toc-section" id="Debugging_old_automations_may_be_the_best_use_case"></span>Debugging old automations may be the best use case<span class="ez-toc-section-end"></span></h2> 708 709 710 711<p class="wp-block-paragraph">Creating new automations is fun. Debugging old automations may be more valuable.</p><!-- Ezoic - wp_incontent_6 - incontent_6 --><div id="ezoic-pub-ad-placeholder-154" data-inserter-version="2" data-placement-location="incontent_6"></div>
711<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(154); });</script>
711<!-- End Ezoic - wp_incontent_6 - incontent_6 --> 712 713 714 715<p class="wp-block-paragraph">Every Home Assistant user eventually has an automation graveyard. Old names. Old devices. Old logic. One automation called something like “test final fixed real final 2” and nobody wants to ask what happened there.</p> 716 717 718 719<p class="wp-block-paragraph">This is where I would use <strong>ha-mcp</strong> in a very safe way:</p> 720 721 722 723<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> 724<p class="wp-block-paragraph">Look at my automation called Bedroom Night Light. Do not change it. Explain what it does in simple words. Then check why it may not be triggering. Use traces or history if available. Give me the safest fix first.</p> 725</blockquote> 726 727 728 729<figure class="wp-block-image size-full"><img data-dominant-color="d1d2d4" data-has-transparency="false" style="--dominant-color: #d1d2d4;" loading="lazy" decoding="async" width="2048" height="1152" src="https://peyanski.com/wp-content/uploads/2026/05/SL10-1.avif" alt="ha-mcp Home Assistant automation debugging workflow" class="wp-image-26561 not-transparent" srcset="https://peyanski.com/wp-content/uploads/2026/05/SL10-1.avif 2048w, https://peyanski.com/wp-content/uploads/2026/05/SL10-1-300x169.avif 300w, https://peyanski.com/wp-content/uploads/2026/05/SL10-1-768x432.avif 768w, https://peyanski.com/wp-content/uploads/2026/05/SL10-1-1536x864.avif 1536w, https://peyanski.com/wp-content/uploads/2026/05/SL10-1-600x338.avif 600w, https://peyanski.com/wp-content/uploads/2026/05/SL10-1-150x84.avif 150w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /><figcaption class="wp-element-caption">Debugging old automations is where ha-mcp can turn confusion into a reviewable plan.</figcaption></figure> 730 731 732 733<p class="wp-block-paragraph">That is a very different request from “fix it.” I want Codex to explain first. If the condition never becomes true, tell me. If an entity was renamed, show me. If the trace points to the wrong branch, explain it. Then I decide if the fix makes sense.</p><!-- Ezoic - wp_incontent_7 - incontent_7 --><div id="ezoic-pub-ad-placeholder-155" data-inserter-version="2" data-placement-location="incontent_7"></div>
733<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(155); });</script>
733<!-- End Ezoic - wp_incontent_7 - incontent_7 --> 734 735 736 737<p class="wp-block-paragraph">AI being wrong is annoying. AI being wrong inside your real home at 2 AM is a different flavor of annoying. I prefer the first one.</p> 738 739 740 741<h2 class="wp-block-heading"><span class="ez-toc-section" id="The_PDF_has_the_Mac_and_Windows_setup_details"></span>The PDF has the Mac and Windows setup details<span class="ez-toc-section-end"></span></h2> 742 743 744 745<p class="wp-block-paragraph">I did not want the video or this article to become a full install marathon. The setup details matter, especially on Mac and Windows, but they can also eat the whole topic if I let them.</p> 746 747 748 749<p class="wp-block-paragraph">If you want the full setup path for Codex, <strong>ha-mcp</strong>, and Home Assistant, I made a PDF here: <a href="https://automatelike.pro/ha-mcp-codex" target="_blank" rel="noopener">Codex + ha-mcp + Home Assistant PDF guide</a>.</p><!-- Ezoic - wp_incontent_8 - incontent_8 --><div id="ezoic-pub-ad-placeholder-156" data-inserter-version="2" data-placement-location="incontent_8"></div>
749<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(156); });</script>
749<!-- End Ezoic - wp_incontent_8 - incontent_8 --> 750 751 752 753<p class="wp-block-paragraph">The PDF covers the Mac and Windows setup flow, the Home Assistant connection, token notes, Codex config notes, the local stdio option with uvx, and the safety checklist I would use before letting any AI assistant touch a real smart home.</p> 754 755 756 757<p class="wp-block-paragraph">To get the PDF, type your name and e-mail. You will receive an e-mail from me to confirm you are not a robot, and the PDF will be sent to your inbox. You’ll also be subscribed to my newsletter where I share new content, updates, and my exclusive AI and HA challenge. It’s free and you can unsubscribe anytime with one click.</p> 758 759 760 761<p class="wp-block-paragraph">Now back to the practical part, because there is one setup detail that explains why I separated the guide from the demo.</p><!-- Ezoic - wp_incontent_9 - incontent_9 --><div id="ezoic-pub-ad-placeholder-157" data-inserter-version="2" data-placement-location="incontent_9"></div>
761<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(157); });</script>
761<!-- End Ezoic - wp_incontent_9 - incontent_9 --> 762 763 764 765<h2 class="wp-block-heading"><span class="ez-toc-section" id="One_Codex_detail_that_can_save_time"></span>One Codex detail that can save time<span class="ez-toc-section-end"></span></h2> 766 767 768 769<p class="wp-block-paragraph">The <a href="https://homeassistant-ai.github.io/ha-mcp/setup/" target="_blank" rel="noopener">ha-mcp setup wizard</a> lists Codex as one of the supported clients. It also lists many others: Claude Desktop, Claude Code, Cursor, VS Code, GitHub Copilot Agents, Windsurf, Cline, ChatGPT, Gemini CLI, Open WebUI, OpenCode, Antigravity, and more.</p> 770 771 772 773<p class="wp-block-paragraph">That is the bigger lesson from this test. <strong>ha-mcp</strong> is not only a Claude thing. The bridge is the important part. Different AI clients can walk over the bridge.</p> 774 775 776 777<p class="wp-block-paragraph">But the path can be different depending on the client. The FAQ mentions an important Codex caveat: for HTTP native clients, Codex can connect to an add-on URL, but there has been a known Codex HTTP MCP initialization bug where no tools load. If that happens, the workaround is to run <strong>ha-mcp</strong> locally over stdio with uvx instead.</p><!-- Ezoic - wp_incontent_10 - incontent_10 --><div id="ezoic-pub-ad-placeholder-158" data-inserter-version="2" data-placement-location="incontent_10"></div>
777<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(158); });</script>
777<!-- End Ezoic - wp_incontent_10 - incontent_10 --> 778 779 780 781<p class="wp-block-paragraph">This is the kind of tiny detail that can steal an afternoon. One computer says “uvx not found,” another hides a config file, and suddenly the smart home is fine but the human needs a snack.</p> 782 783 784 785<h2 class="wp-block-heading"><span class="ez-toc-section" id="My_safety_rules_for_Codex_and_ha-mcp"></span>My safety rules for Codex and ha-mcp<span class="ez-toc-section-end"></span></h2> 786 787 788 789<p class="wp-block-paragraph">My current rules are boring, which is exactly why I like them.</p> 790 791 792 793<ol class="wp-block-list"> 794<li>Ask Codex to show the entities before it builds anything.</li><!-- Ezoic - wp_incontent_11 - incontent_11 --><div id="ezoic-pub-ad-placeholder-159" data-inserter-version="2" data-placement-location="incontent_11"></div>
794<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(159); });</script>
794<!-- End Ezoic - wp_incontent_11 - incontent_11 --> 795 796 797 798<li>Ask for the plan before it writes changes.</li> 799 800 801 802<li>Start with dashboards, lights, and read-only inspection.</li> 803 804 805 806<li>Avoid locks, alarms, garage doors, and water valves in early tests.</li> 807 808 809 810<li>Make a backup before testing bigger changes.</li> 811 812 813 814<li>Do not approve a change you do not understand.</li> 815</ol> 816 817 818 819<p class="wp-block-paragraph">If you follow those rules, Codex plus <strong>ha-mcp</strong> can be a very useful helper. If you ignore them, congratulations, you have invented gambling with smart bulbs.</p> 820 821 822 823<p class="wp-block-paragraph">One prompt I think almost every Home Assistant user should try after setup is this:</p><!-- Ezoic - wp_incontent_12 - incontent_12 --><div id="ezoic-pub-ad-placeholder-160" data-inserter-version="2" data-placement-location="incontent_12"></div>
823<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(160); });</script>
823<!-- End Ezoic - wp_incontent_12 - incontent_12 --> 824 825 826 827<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> 828<p class="wp-block-paragraph">Give me a simple overview of my Home Assistant. List the main areas, important devices, automations, and anything that looks confusing or badly named. Do not change anything.</p> 829</blockquote> 830 831 832 833<p class="wp-block-paragraph">It is not flashy, but it is useful. Before AI builds anything, it should understand your home. Honestly, before I build anything, maybe I should understand my home too.</p> 834 835 836 837<h2 class="wp-block-heading"><span class="ez-toc-section" id="So_is_Codex_worth_testing_with_Home_Assistant"></span>So, is Codex worth testing with Home Assistant?<span class="ez-toc-section-end"></span></h2> 838 839 840 841<p class="wp-block-paragraph">My current answer is yes, especially if you are already in the OpenAI world and you want help with dashboards, cards, automations, scripts, and debugging.</p> 842 843 844 845<p class="wp-block-paragraph">The old Claude test showed that AI plus <strong>ha-mcp</strong> can be scary good. This Codex test shows the idea is bigger than one AI app. The model matters, but the bridge matters more.</p><!-- Ezoic - wp_incontent_13 - incontent_13 --><div id="ezoic-pub-ad-placeholder-161" data-inserter-version="2" data-placement-location="incontent_13"></div>
845<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(161); });</script>
845<!-- End Ezoic - wp_incontent_13 - incontent_13 --> 846 847 848 849<p class="wp-block-paragraph">I would not treat Codex like a magic Home Assistant admin. I would treat it like a fast assistant that needs boundaries. It can find the boring details. It can draft the card. It can explain the automation. It can point at the broken condition. Then you decide.</p> 850 851 852 853<p class="wp-block-paragraph">That is the version of AI in the smart home that I actually like. You describe what you want. Codex uses <strong>ha-mcp</strong> to get the real Home Assistant context. You review the result. Your home gets a little easier to manage without you fighting entity names until midnight.</p> 854 855 856 857<h2 class="wp-block-heading"><span class="ez-toc-section" id="If_you_want_more"></span>If you want more<span class="ez-toc-section-end"></span></h2> 858 859 860 861<p class="wp-block-paragraph">If you want more simple smart home experiments like this, check my <a href="https://peyanski.com/category/home-assistant/">Home Assistant articles</a> and my <a href="https://peyanski.com/category/ai/">AI articles</a>.</p><!-- Ezoic - wp_incontent_14 - incontent_14 --><div id="ezoic-pub-ad-placeholder-162" data-inserter-version="2" data-placement-location="incontent_14"></div>
861<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(162); });</script>
861<!-- End Ezoic - wp_incontent_14 - incontent_14 --> 862 863 864 865<p class="wp-block-paragraph">And if you want the setup steps instead of the story version, grab the <a href="https://automatelike.pro/ha-mcp-codex" target="_blank" rel="noopener">Codex + ha-mcp + Home Assistant PDF guide</a>. It will not stop your smart home from developing opinions, but at least it can help you connect the pieces without guessing every path.</p> 866</div><div class="nv-tags-list"><span>Tags:</span><a href=https://peyanski.com/tag/codex/ title="Codex" class=codex rel="tag">Codex</a><a href=https://peyanski.com/tag/ha-mcp/ title="ha-mcp" class=ha-mcp rel="tag">ha-mcp</a><a href=https://peyanski.com/tag/home-assistant-ai/ title="Home Assistant AI" class=home-assistant-ai rel="tag">Home Assistant AI</a><a href=https://peyanski.com/tag/home-assistant-automations/ title="Home Assistant automations" class=home-assistant-automations rel="tag">Home Assistant automations</a><a href=https://peyanski.com/tag/home-assistant-dashboards/ title="Home Assistant dashboards" class=home-assistant-dashboards rel="tag">Home Assistant dashboards</a><a href=https://peyanski.com/tag/home-assistant-mcp/ title="Home Assistant MCP" class=home-assistant-mcp rel="tag">Home Assistant MCP</a><a href=https://peyanski.com/tag/smart-home-ai/ title="Smart home AI" class=smart-home-ai rel="tag">Smart home AI</a> </div> 867<div id="comments" class="comments-area"> 868 <div id="respond" class="comment-respond nv-is-boxed"> 869 <h2 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/ha-mcp-codex-home-assistant-dashboards-automations/#respond" style="display:none;">Cancel reply</a></small></h2><form action="https://peyanski.com/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> <span class="required-field-message">Required fields are marked <span class="required">*</span></span></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required /></p> 870<p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required /></p> 871<p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" autocomplete="url" /></p> 872<p class="comment-form-comment"><label for="comment">Comment <span class="required">*</span></label> <textarea autocomplete="new-password" id="d1abb894a1" name="d1abb894a1" cols="45" rows="8" maxlength="65525" required></textarea><textarea id="comment" aria-label="hp-comment" aria-hidden="true" name="comment" autocomplete="new-password" style="padding:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;position:absolute !important;white-space:nowrap !important;height:1px !important;width:1px !important;overflow:hidden !important;" tabindex="-1"></textarea>
872<script data-noptimize>document.getElementById("comment").setAttribute( "id", "a6b57656bb972a3dcbbeb5b4e97b675e" );document.getElementById("d1abb894a1").setAttribute( "id", "comment" );</script>
872</p><p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label></p> 873<p class="form-submit"><input name="submit" type="submit" id="submit" class="button button-primary" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='26562' id='comment_post_ID' /> 874<input type='hidden' name='comment_parent' id='comment_parent' value='0' /> 875</p></form> </div><!-- #respond --> 876 </div> 877 </article> 878 <div class="nv-sidebar-wrap col-sm-12 nv-right blog-sidebar " > 879 <aside id="secondary" role="complementary"> 880 881 <div id="categories-5" class="widget widget_categories"><p class="widget-title">Categories</p> 882 <ul> 883 <li class="cat-item cat-item-1659"><a href="https://peyanski.com/category/3d-printing/">3D Printing</a> (1) 884</li> 885 <li class="cat-item cat-item-2838"><a href="https://peyanski.com/category/smart-home/ai/">AI</a> (26) 886</li> 887 <li class="cat-item cat-item-1395"><a href="https://peyanski.com/category/crypto/">Crypto</a> (1) 888</li> 889 <li class="cat-item cat-item-39"><a href="https://peyanski.com/category/devops/">DevOps</a> (21) 890</li> 891 <li class="cat-item cat-item-693"><a href="https://peyanski.com/category/smart-home/home-assistant/">Home Assistant</a> (203) 892</li> 893 <li class="cat-item cat-item-732"><a href="https://peyanski.com/category/smart-home/networks/">Networks</a> (8) 894</li> 895 <li class="cat-item cat-item-692"><a href="https://peyanski.com/category/smart-home/node-red/">Node-RED</a> (14) 896</li> 897 <li class="cat-item cat-item-715"><a href="https://peyanski.com/category/smart-home/raspberry-pi/">Raspberry Pi</a> (23) 898</li> 899 <li class="cat-item cat-item-1104"><a href="https://peyanski.com/category/smart-home/security/">Security</a> (27) 900</li> 901 <li class="cat-item cat-item-54"><a href="https://peyanski.com/category/smart-home/">Smart Home</a> (167) 902</li> 903 <li class="cat-item cat-item-2183"><a href="https://peyanski.com/category/smart-rv-conversion/">Smart RV Conversion</a> (9) 904</li> 905 <li class="cat-item cat-item-2148"><a href="https://peyanski.com/category/smart-home/smart-sensors/">Smart Sensors</a> (27) 906</li> 907 <li class="cat-item cat-item-777"><a href="https://peyanski.com/category/smart-home/smartthings/">SmartThings</a> (1) 908</li> 909 <li class="cat-item cat-item-2851"><a href="https://peyanski.com/category/smart-home/switchbot/">SwitchBot</a> (21) 910</li> 911 <li class="cat-item cat-item-1"><a href="https://peyanski.com/category/uncategorized/">Uncategorized</a> (1) 912</li> 913 <li class="cat-item cat-item-949"><a href="https://peyanski.com/category/wordpress/">WordPress</a> (1) 914</li> 915 <li class="cat-item cat-item-1039"><a href="https://peyanski.com/category/youtube/">YouTube</a> (10) 916</li> 917 </ul> 918 919 </div>
919<div id="archives-3" class="widget widget_archive"><p class="widget-title">Articles</p> 920 <ul> 921 <li><a href='https://peyanski.com/2026/09/'>September 2026</a> (5)</li> 922 <li><a href='https://peyanski.com/2026/08/'>August 2026</a> (3)</li> 923 <li><a href='https://peyanski.com/2026/07/'>July 2026</a> (2)</li> 924 <li><a href='https://peyanski.com/2026/06/'>June 2026</a> (4)</li> 925 <li><a href='https://peyanski.com/2026/05/'>May 2026</a> (3)</li> 926 <li><a href='https://peyanski.com/2026/04/'>April 2026</a> (3)</li> 927 <li><a href='https://peyanski.com/2026/03/'>March 2026</a> (4)</li> 928 <li><a href='https://peyanski.com/2026/02/'>February 2026</a> (3)</li> 929 <li><a href='https://peyanski.com/2026/01/'>January 2026</a> (3)</li> 930 <li><a href='https://peyanski.com/2025/12/'>December 2025</a> (1)</li> 931 <li><a href='https://peyanski.com/2025/11/'>November 2025</a> (4)</li> 932 <li><a href='https://peyanski.com/2025/10/'>October 2025</a> (5)</li> 933 <li><a href='https://peyanski.com/2025/09/'>September 2025</a> (1)</li> 934 <li><a href='https://peyanski.com/2025/08/'>August 2025</a> (1)</li> 935 <li><a href='https://peyanski.com/2025/07/'>July 2025</a> (2)</li> 936 <li><a href='https://peyanski.com/2025/06/'>June 2025</a> (3)</li> 937 <li><a href='https://peyanski.com/2025/05/'>May 2025</a> (4)</li> 938 <li><a href='https://peyanski.com/2025/04/'>April 2025</a> (3)</li> 939 <li><a href='https://peyanski.com/2025/03/'>March 2025</a> (3)</li> 940 <li><a href='https://peyanski.com/2025/02/'>February 2025</a> (3)</li> 941 <li><a href='https://peyanski.com/2025/01/'>January 2025</a> (4)</li> 942 <li><a href='https://peyanski.com/2024/11/'>November 2024</a> (3)</li> 943 <li><a href='https://peyanski.com/2024/10/'>October 2024</a> (5)</li> 944 <li><a href='https://peyanski.com/2024/09/'>September 2024</a> (3)</li> 945 <li><a href='https://peyanski.com/2024/08/'>August 2024</a> (3)</li> 946 <li><a href='https://peyanski.com/2024/07/'>July 2024</a> (5)</li> 947 <li><a href='https://peyanski.com/2024/06/'>June 2024</a> (4)</li> 948 <li><a href='https://peyanski.com/2024/05/'>May 2024</a> (3)</li> 949 <li><a href='https://peyanski.com/2024/04/'>April 2024</a> (3)</li> 950 <li><a href='https://peyanski.com/2024/03/'>March 2024</a> (4)</li> 951 <li><a href='https://peyanski.com/2024/02/'>February 2024</a> (4)</li> 952 <li><a href='https://peyanski.com/2024/01/'>January 2024</a> (5)</li> 953 <li><a href='https://peyanski.com/2023/12/'>December 2023</a> (3)</li> 954 <li><a href='https://peyanski.com/2023/11/'>November 2023</a> (5)</li> 955 <li><a href='https://peyanski.com/2023/10/'>October 2023</a> (5)</li> 956 <li><a href='https://peyanski.com/2023/09/'>September 2023</a> (3)</li> 957 <li><a href='https://peyanski.com/2023/08/'>August 2023</a> (6)</li> 958 <li><a href='https://peyanski.com/2023/07/'>July 2023</a> (4)</li> 959 <li><a href='https://peyanski.com/2023/06/'>June 2023</a> (4)</li> 960 <li><a href='https://peyanski.com/2023/05/'>May 2023</a> (4)</li> 961 <li><a href='https://peyanski.com/2023/04/'>April 2023</a> (4)</li> 962 <li><a href='https://peyanski.com/2023/03/'>March 2023</a> (5)</li> 963 <li><a href='https://peyanski.com/2023/02/'>February 2023</a> (4)</li> 964 <li><a href='https://peyanski.com/2023/01/'>January 2023</a> (4)</li> 965 <li><a href='https://peyanski.com/2022/12/'>December 2022</a> (4)</li> 966 <li><a href='https://peyanski.com/2022/11/'>November 2022</a> (5)</li> 967 <li><a href='https://peyanski.com/2022/10/'>October 2022</a> (4)</li> 968 <li><a href='https://peyanski.com/2022/09/'>September 2022</a> (4)</li> 969 <li><a href='https://peyanski.com/2022/08/'>August 2022</a> (5)</li> 970 <li><a href='https://peyanski.com/2022/07/'>July 2022</a> (5)</li> 971 <li><a href='https://peyanski.com/2022/06/'>June 2022</a> (5)</li> 972 <li><a href='https://peyanski.com/2022/05/'>May 2022</a> (4)</li> 973 <li><a href='https://peyanski.com/2022/04/'>April 2022</a> (4)</li> 974 <li><a href='https://peyanski.com/2022/03/'>March 2022</a> (5)</li> 975 <li><a href='https://peyanski.com/2022/02/'>February 2022</a> (4)</li> 976 <li><a href='https://peyanski.com/2022/01/'>January 2022</a> (4)</li> 977 <li><a href='https://peyanski.com/2021/12/'>December 2021</a> (5)</li> 978 <li><a href='https://peyanski.com/2021/11/'>November 2021</a> (5)</li> 979 <li><a href='https://peyanski.com/2021/10/'>October 2021</a> (4)</li> 980 <li><a href='https://peyanski.com/2021/09/'>September 2021</a> (6)</li> 981 <li><a href='https://peyanski.com/2021/08/'>August 2021</a> (4)</li> 982 <li><a href='https://peyanski.com/2021/07/'>July 2021</a> (4)</li> 983 <li><a href='https://peyanski.com/2021/06/'>June 2021</a> (5)</li> 984 <li><a href='https://peyanski.com/2021/05/'>May 2021</a> (4)</li> 985 <li><a href='https://peyanski.com/2021/04/'>April 2021</a> (4)</li> 986 <li><a href='https://peyanski.com/2021/03/'>March 2021</a> (5)</li> 987 <li><a href='https://peyanski.com/2021/02/'>February 2021</a> (4)</li> 988 <li><a href='https://peyanski.com/2021/01/'>January 2021</a> (4)</li> 989 <li><a href='https://peyanski.com/2020/12/'>December 2020</a> (6)</li> 990 <li><a href='https://peyanski.com/2020/11/'>November 2020</a> (4)</li> 991 <li><a href='https://peyanski.com/2020/10/'>October 2020</a> (4)</li> 992 <li><a href='https://peyanski.com/2020/09/'>September 2020</a> (5)</li> 993 <li><a href='https://peyanski.com/2020/08/'>August 2020</a> (4)</li> 994 <li><a href='https://peyanski.com/2020/07/'>July 2020</a> (5)</li> 995 <li><a href='https://peyanski.com/2020/06/'>June 2020</a> (4)</li> 996 <li><a href='https://peyanski.com/2020/05/'>May 2020</a> (4)</li> 997 <li><a href='https://peyanski.com/2020/04/'>April 2020</a> (5)</li> 998 <li><a href='https://peyanski.com/2020/03/'>March 2020</a> (4)</li> 999 <li><a href='https://peyanski.com/2020/02/'>February 2020</a> (4)</li> 1000 <li><a href='https://peyanski.com/2020/01/'>January 2020</a> (4)</li> 1001 <li><a href='https://peyanski.com/2019/12/'>December 2019</a> (6)</li> 1002 <li><a href='https://peyanski.com/2019/11/'>November 2019</a> (4)</li> 1003 <li><a href='https://peyanski.com/2019/10/'>October 2019</a> (5)</li> 1004 <li><a href='https://peyanski.com/2019/09/'>September 2019</a> (1)</li> 1005 <li><a href='https://peyanski.com/2019/08/'>August 2019</a> (2)</li> 1006 </ul> 1007 1008 </div><div id="categories-15" class="widget widget_categories"><p class="widget-title">Categories</p> 1009 <ul> 1010 <li class="cat-item cat-item-1659"><a href="https://peyanski.com/category/3d-printing/">3D Printing</a> (1) 1011</li> 1012 <li class="cat-item cat-item-2838"><a href="https://peyanski.com/category/smart-home/ai/">AI</a> (26) 1013</li> 1014 <li class="cat-item cat-item-1395"><a href="https://peyanski.com/category/crypto/">Crypto</a> (1) 1015</li> 1016 <li class="cat-item cat-item-39"><a href="https://peyanski.com/category/devops/">DevOps</a> (21) 1017</li> 1018 <li class="cat-item cat-item-693"><a href="https://peyanski.com/category/smart-home/home-assistant/">Home Assistant</a> (203) 1019</li> 1020 <li class="cat-item cat-item-732"><a href="https://peyanski.com/category/smart-home/networks/">Networks</a> (8) 1021</li> 1022 <li class="cat-item cat-item-692"><a href="https://peyanski.com/category/smart-home/node-red/">Node-RED</a> (14) 1023</li> 1024 <li class="cat-item cat-item-715"><a href="https://peyanski.com/category/smart-home/raspberry-pi/">Raspberry Pi</a> (23) 1025</li> 1026 <li class="cat-item cat-item-1104"><a href="https://peyanski.com/category/smart-home/security/">Security</a> (27) 1027</li> 1028 <li class="cat-item cat-item-54"><a href="https://peyanski.com/category/smart-home/">Smart Home</a> (167) 1029</li> 1030 <li class="cat-item cat-item-2183"><a href="https://peyanski.com/category/smart-rv-conversion/">Smart RV Conversion</a> (9) 1031</li> 1032 <li class="cat-item cat-item-2148"><a href="https://peyanski.com/category/smart-home/smart-sensors/">Smart Sensors</a> (27) 1033</li> 1034 <li class="cat-item cat-item-777"><a href="https://peyanski.com/category/smart-home/smartthings/">SmartThings</a> (1) 1035</li> 1036 <li class="cat-item cat-item-2851"><a href="https://peyanski.com/category/smart-home/switchbot/">SwitchBot</a> (21) 1037</li> 1038 <li class="cat-item cat-item-1"><a href="https://peyanski.com/category/uncategorized/">Uncategorized</a> (1) 1039</li> 1040 <li class="cat-item cat-item-949"><a href="https://peyanski.com/category/wordpress/">WordPress</a> (1) 1041</li> 1042 <li class="cat-item cat-item-1039"><a href="https://peyanski.com/category/youtube/">YouTube</a> (10) 1043</li> 1044 </ul> 1045 1046 </div> 1047 </aside> 1048</div> 1049 </div> 1050 </div> 1051 1052</main><!--/.neve-main--> 1053 1054<button tabindex="0" id="scroll-to-top" class="scroll-to-top scroll-to-top-right scroll-sh
1054ow-mobile icon" aria-label="Scroll To Top"><svg class="scroll-to-top-icon" aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15"><rect width="15" height="15" fill="none"/><path fill="currentColor" d="M2,8.48l-.65-.65a.71.71,0,0,1,0-1L7,1.14a.72.72,0,0,1,1,0l5.69,5.7a.71.71,0,0,1,0,1L13,8.48a.71.71,0,0,1-1,0L8.67,4.94v8.42a.7.7,0,0,1-.7.7H7a.7.7,0,0,1-.7-.7V4.94L3,8.47a.7.7,0,0,1-1,0Z"/></svg></button><footer class="site-footer" id="site-footer" > 1055 <div class="hfg_footer"> 1056 <div class="footer--row footer-bottom layout-full-contained" 1057 id="cb-row--footer-desktop-bottom" 1058 data-row-id="bottom" data-show-on="desktop"> 1059 <div 1060 class="footer--row-inner footer-bottom-inner footer-content-wrap"> 1061 <div class="container"> 1062 <div 1063 class="hfg-grid nv-footer-content hfg-grid-bottom row--wrapper row " 1064 data-section="hfg_footer_layout_bottom" > 1065 <div class="hfg-slot left"><div class="builder-item cr"><div class="item--inner"><div class="component-wrap"><div><p><a href="https://themeisle.com/themes/neve/" rel="nofollow">Neve</a> | Powered by <a href="https://wordpress.org" rel="nofollow">WordPress</a></p></div></div></div></div></div><div class="hfg-slot c-left"></div><div class="hfg-slot center"></div> </div> 1066 </div> 1067 </div> 1068</div> 1069 1070 </div> 1071</footer> 1072 1073</div><!--/.wrapper-->
1074<script type="speculationrules"> 1075{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/neve-child-master/*","/wp-content/themes/neve/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 1076</script>
1076 1077<!-- Ezoic - wp_bottom_of_page - bottom_of_page --><div id="ezoic-pub-ad-placeholder-140" data-inserter-version="-1" data-placement-location="bottom_of_page"></div>
1077<script data-ezoic="1">ezstandalone.cmd.push(function () { ezstandalone.showAds(140); });</script>
1077<!-- End Ezoic - wp_bottom_of_page - bottom_of_page -->
1077<script> 1078 (function () { 1079 var c = document.body.className; 1080 c = c.replace(/woocommerce-no-js/, 'woocommerce-js'); 1081 document.body.className = c; 1082 })(); 1083 </script>
1083 1084
1084<script id="wpascript-js" src="https://peyanski.com/wp-content/plugins/honeypot/includes/js/wpa.js?ver=2.4.02"></script>
vendor: 1 bytes, line 1084
1084
1085<script id="wpascript-js-after"> 1086wpa_field_info = JSON.parse(atob("eyJ3cGFfZmllbGRfbmFtZSI6ImdncmhkdjM2ODMiLCJ3cGFfZmllbGRfdmFsdWUiOjY2Nzc1Mywid3BhX2FkZF90ZXN0Ijoibm8ifQ==")); 1087//# sourceURL=wpascript-js-after 1088</script>
vendor: 1 bytes, line 1088
1088
1089<script id="gtm4wp-form-move-tracker-js-before"> 1090var gtm4wp_form_move_config = {"filledOnly":false}; 1091//# sourceURL=gtm4wp-form-move-tracker-js-before 1092</script>
vendor: 1 bytes, line 1092
1092
1093<script data-wp-strategy="defer" defer id="gtm4wp-form-move-tracker-js" src="https://peyanski.com/wp-content/plugins/duracelltomi-google-tag-manager/build/gtm4wp-form-move-tracker.js?ver=2.0.5"></script>
vendor: 1 bytes, line 1093
1093
1094<script data-wp-strategy="defer" defer id="gtm4wp-ecommerce-generic-js" src="https://peyanski.com/wp-content/plugins/duracelltomi-google-tag-manager/build/gtm4wp-ecommerce-generic.js?ver=2.0.5"></script>
vendor: 1 bytes, line 1094
1094
1095<script id="gtm4wp-woocommerce-js-before"> 1096window.gtm4wp_store_api_cart_url = "https:\/\/peyanski.com\/wp-json\/wc\/store\/v1\/cart"; 1097//# sourceURL=gtm4wp-woocommerce-js-before 1098</script>
vendor: 1 bytes, line 1098
1098
1099<script id="gtm4wp-woocommerce-js" src="https://peyanski.com/wp-content/plugins/duracelltomi-google-tag-manager/build/gtm4wp-woocommerce.js?ver=2.0.5"></script>
vendor: 1 bytes, line 1099
1099
1100<script id="neve-script-js-extra"> 1101var NeveProperties = {"ajaxurl":"https://peyanski.com/wp-admin/admin-ajax.php","nonce":"6571a59e66","isRTL":"","isCustomize":""}; 1102//# sourceURL=neve-script-js-extra 1103</script>
vendor: 1 bytes, line 1103
1103
1104<script id="neve-script-js" src="https://peyanski.com/wp-content/themes/neve/assets/js/build/modern/frontend.js?ver=4.2.11" async></script>
vendor: 1 bytes, line 1104
1104
1105<script id="neve-script-js-after"> 1106 ;(function () { 1107 var htmlEl = document.documentElement; 1108 var theme = htmlEl.getAttribute('data-neve-theme') || 'light'; 1109 var variants = {"logo":{"light":{"src":"https:\/\/peyanski.com\/wp-content\/uploads\/2019\/11\/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.webp","srcset":false,"sizes":"(max-width: 150px) 100vw, 150px"},"dark":{"src":"https:\/\/peyanski.com\/wp-content\/uploads\/2019\/11\/cropped-My_Way_Logo-KP-shadow_metal-K-150x150.webp","srcset":false,"sizes":"(max-width: 150px) 100vw, 150px"},"same":true}}; 1110 1111 function setCurrentTheme( theme ) { 1112 var pictures = document.getElementsByClassName( 'neve-site-logo' ); 1113 for(var i = 0; i<pictures.length; i++) { 1114 var picture = pictures.item(i); 1115 if( ! picture ) { 1116 continue; 1117 }; 1118 var fileExt = picture.src.slice((Math.max(0, picture.src.lastIndexOf(".")) || Infinity) + 1); 1119 if ( fileExt === 'svg' ) { 1120 picture.removeAttribute('width'); 1121 picture.removeAttribute('height'); 1122 picture.style = 'width: var(--maxwidth)'; 1123 } 1124 var compId = picture.getAttribute('data-variant'); 1125 if ( compId && variants[compId] ) { 1126 var isConditional = variants[compId]['same']; 1127 if ( theme === 'light' || isConditional || variants[compId]['dark']['src'] === false ) { 1128 picture.src = variants[compId]['light']['src']; 1129 picture.srcset = variants[compId]['light']['srcset'] || ''; 1130 picture.sizes = variants[compId]['light']['sizes']; 1131 continue; 1132 }; 1133 picture.src = variants[compId]['dark']['src']; 1134 picture.srcset = variants[compId]['dark']['srcset'] || ''; 1135 picture.sizes = variants[compId]['dark']['sizes']; 1136 }; 1137 }; 1138 }; 1139 1140 var observer = new MutationObserver(function(mutations) { 1141 mutations.forEach(function(mutation) { 1142 if (mutation.type == 'attributes' && mutation.attributeName === 'data-neve-theme') { 1143 theme = htmlEl.getAttribute('data-neve-theme'); 1144 setCurrentTheme(theme); 1145 }; 1146 }); 1147 }); 1148 1149 observer.observe(htmlEl, { 1150 attributes: true, 1151 attributeFilter: ['data-neve-theme'] 1152 }); 1153 })(); 1154function toggleAriaClick() { function toggleAriaExpanded(toggle = 'true') { document.querySelectorAll('button.navbar-toggle').forEach(function(el) { if ( el.classList.contains('caret-wrap') ) { return; } el.setAttribute('aria-expanded', 'true' === el.getAttribute('aria-expanded') ? 'false' : toggle); }); } toggleAriaExpanded(); if ( document.body.hasAttribute('data-ftrap-listener') ) { return; } document.body.setAttribute('data-ftrap-listener', 'true'); document.addEventListener('ftrap-end', function() { toggleAriaExpanded('false'); }); } 1155//# sourceURL=neve-script-js-after 1156</script>
vendor: 1 bytes, line 1156
1156
1157<script async data-wp-strategy="async" fetchpriority="low" id="comment-reply-js" src="https://peyanski.com/wp-includes/js/comment-reply.min.js?ver=7.1.2"></script>
vendor: 1 bytes, line 1157
1157
1158<script id="neve-scroll-to-top-js-extra"> 1159var neveScrollOffset = {"offset":"0"}; 1160//# sourceURL=neve-scroll-to-top-js-extra 1161</script>
vendor: 1 bytes, line 1161
1161
1162<script id="neve-scroll-to-top-js" src="https://peyanski.com/wp-content/themes/neve/assets/js/build/modern/scroll-to-top.js?ver=4.2.11" async></script>
vendor: 1 bytes, line 1162
1162
1163<script id="tfhb-admin-script-js-extra"> 1164var tfhb_admin_notice = {"_nonce":"1f217d3819","ajax_url":"https://peyanski.com/wp-admin/admin-ajax.php"}; 1165//# sourceURL=tfhb-admin-script-js-extra 1166</script>
vendor: 1 bytes, line 1166
1166
1167<script id="tfhb-admin-script-js" src="https://peyanski.com/wp-content/plugins/hydra-booking/assets/admin/js/main.js?ver=1791069046"></script>
vendor: 1 bytes, line 1167
1167
1168<script id="wp-hooks-js" src="https://peyanski.com/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 1168
1168
1169<script id="wp-i18n-js" src="https://peyanski.com/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 1169
1169
1170<script id="wp-i18n-js-after"> 1171wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 1172//# sourceURL=wp-i18n-js-after 1173</script>
vendor: 1 bytes, line 1173
1173
1174<script id="tfhb-app-script-js-extra"> 1175var tfhb_app_booking = {"ajax_url":"https://peyanski.com/wp-admin/admin-ajax.php","site_url":"https://peyanski.com","nonce":"7610be68a7","general_settings":{"time_zone":"Europe/Sofia","time_format":"12","week_start_from":"Sunday","date_format":"","country":"BG","currency":"EUR","after_booking_completed":"10","booking_status":"1","reschedule_status":"","allowed_reschedule_before_meeting_start":"10"},"i18n":{"January":"January","February":"February","March":"March","April":"April","May":"May","June":"June","July":"July","August":"August","September":"September","October":"October","November":"November","December":"December","Sunday":"Sunday","Monday":"Monday","Tuesday":"Tuesday","Wednesday":"Wednesday","Thursday":"Thursday","Friday":"Friday","Saturday":"Saturday","Sun":"Sun","Mon":"Mon","Tue":"Tue","Wed":"Wed","Thu":"Thu","Fri":"Fri","Sat":"Sat","Today":"Today","seats left":"seats left","Previous":"Previous","Next":"Next","Name":"Name","Email":"Email","AM":"AM","PM":"PM","Bookings":"Bookings","Add New":"Add New","View Details":"View Details","0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","Use Global Email Notification Settings":"Use Global Email Notification Settings","Sync with Global Settings":"Sync with Global Settings","Payment Method Required.":"Payment Method Required."}}; 1176//# sourceURL=tfhb-app-script-js-extra 1177</script>
vendor: 1 bytes, line 1177
1177
1178<script id="tfhb-app-script-js" src="https://peyanski.com/wp-content/plugins/hydra-booking/assets/app/js/main.js?ver=1.2.6"></script>
vendor: 1 bytes, line 1178
1178
1179<script id="sourcebuster-js-js" src="https://peyanski.com/wp-content/plugins/woocommerce/assets/js/sourcebuster/sourcebuster.min.js?ver=11.1.2"></script>
vendor: 1 bytes, line 1179
1179
1180<script id="wc-order-attribution-js-extra"> 1181var wc_order_attribution = {"params":{"lifetime":1.0e-5,"session":30,"base64":false,"ajaxurl":"https://peyanski.com/wp-admin/admin-ajax.php","prefix":"wc_order_attribution_","allowTracking":true},"fields":{"source_type":"current.typ","referrer":"current_add.rf","utm_campaign":"current.cmp","utm_source":"current.src","utm_medium":"current.mdm","utm_content":"current.cnt","utm_id":"current.id","utm_term":"current.trm","utm_source_platform":"current.plt","utm_creative_format":"current.fmt","utm_marketing_tactic":"current.tct","session_entry":"current_add.ep","session_start_time":"current_add.fd","session_pages":"session.pgs","session_count":"udata.vst","user_agent":"udata.uag"}}; 1182//# sourceURL=wc-order-attribution-js-extra 1183</script>
vendor: 1 bytes, line 1183
1183
1184<script id="wc-order-attribution-js" src="https://peyanski.com/wp-content/plugins/woocommerce/assets/js/frontend/order-attribution.min.js?ver=11.1.2"></script>
vendor: 1 bytes, line 1184
1184
1185<script id="wp-emoji-settings" type="application/json"> 1186{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://peyanski.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}} 1187</script>
vendor: 1 bytes, line 1187
1187
1188<script type="module"> 1189/*! This file is auto-generated */ 1190var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); 1191//# sourceURL=https://peyanski.com/wp-includes/js/wp-emoji-loader.min.js 1192</script>
vendor: 1 bytes, line 1192
1192
1193<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"73ca99e1303b4ef99c45de307c594757","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 1193
1193
1194<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a44f9f3faaf02964',t:'MTc5MTA2OTA0NQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
1194</body> 1195 1196</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.