[{"content":"The Problem My Home Assistant connects to my EV charging station via WiFi. But the connection drops occasionally. Sometimes, HA fully loses connection to the charging station and requires a re-authentication to control it again.\nNormally, I’d have to find this disconnection by luck in the HA \u0026ldquo;Settings\u0026rdquo; or \u0026ldquo;Repairs\u0026rdquo; section. This leads to delays and wrong automations.\nThe Solution Home Assistant has a built-in event type for these situations: repairs_issue_registry_updated.\nWhen a device needs a config repair (like a missing password), this event fires. I can use it to trigger notifications immediately via my existing Telegram bot setup.\nWhy This Matters Proactive Maintenance: You won\u0026rsquo;t know a device is disconnected until you realize things are going wrong. Better Automation: You get notified the moment a repair action is required. The Automation This is the minimal automation configuration to send a Telegram notification. Replace notify.telegram_bot_xxxxx with your actual notification entity.\nalias: Notify Repair Issue Alert description: \u0026#34;\u0026#34; triggers: - event_type: repairs_issue_registry_updated trigger: event actions: - target: entity_id: notify.telegram_bot_xxxxx data: message: | Action: {{ trigger.event.data.action }} Domain: {{ trigger.event.data.domain }} Issue ID: {{ trigger.event.data.issue_id }} Origin: {{ trigger.event.data.origin }} title: Repair action occured in HomeAssistant action: notify.send_message Event Payload Example Here is how the event payload looks when I repaired my PEBLAR connectivity. So far I haven\u0026rsquo;t had it \u0026ldquo;fail\u0026rdquo; again, but I assume the action would be different.\nevent_type: repairs_issue_registry_updated data: action: remove domain: homeassistant issue_id: config_entry_reauth_peblar_xxx origin: LOCAL time_fired: \u0026#34;2026-05-06T07:43:44.373319+00:00\u0026#34; context: id: xxxx parent_id: null user_id: null Next Steps You might want to add more filtering in the if statement logic to handle different types of repairs, or format the message to be more concise depending on your setup.\n","permalink":"https://triplusnet.be/posts/homeassistant-ev-notification/","summary":"\u003ch1 id=\"the-problem\"\u003eThe Problem\u003c/h1\u003e\n\u003cp\u003eMy Home Assistant connects to my EV charging station via WiFi. But the connection drops occasionally. Sometimes, HA fully loses connection to the charging station and requires a re-authentication to control it again.\u003c/p\u003e\n\u003cp\u003eNormally, I’d have to find this disconnection by luck in the HA \u0026ldquo;Settings\u0026rdquo; or \u0026ldquo;Repairs\u0026rdquo; section. This leads to delays and wrong automations.\u003c/p\u003e\n\u003ch1 id=\"the-solution\"\u003eThe Solution\u003c/h1\u003e\n\u003cp\u003eHome Assistant has a built-in event type for these situations: \u003ccode\u003erepairs_issue_registry_updated\u003c/code\u003e.\u003c/p\u003e","title":"Notify HA Device Repair Alerts"},{"content":"While many use static hosting, I built my own CI/CD pipeline. This is my first post from Hugo, and I\u0026rsquo;m excited to share the steps I followed to get things running.\nWorkflow Overview The process is straightforward: code commits trigger the CI/CD pipeline, which builds and deploys the site. Here is a simplified view of the pipeline flow:\nThe Workflow: Code Changes: When I make edits to my website\u0026rsquo;s content or code in VS Code, those changes are committed directly to my Gitea source repository. Webhook Magic: The magic happens when a webhook is triggered by the commit on Gitea. This webhook sends a signal to a Docker webhook that acts as the orchestrator of my build process. Docker Containers Take Over: The Docker webhook spins up a Build Container: This container houses Hugo, our static site generator. It fetches the latest code from my Gitea repository and builds the website\u0026rsquo;s HTML files. Deployment to \u0026ldquo;Website\u0026rdquo; Repo: Once the build is successful, the newly generated website files are committed directly to another Gitea repository designated as \u0026ldquo;public\u0026rdquo;. This repository acts as the source for deployment to my web hosting provider. N8N deployment to host: Manual trigger to upload the website repo to the host. I did this in coding as the default N8N nodes (or my knowledge) were not capable enough. V S C o d e c o m m i m t a n c u o a m l m i t t r w D ( s B H F G R i N ( u G R e o O p u u e f i e g 8 C p i e b c r i i g t i t p g N u l t p h k c n l o c l e o e s o W e o o e h d h e a s r t a e a s o r e u s i o d b i k s p C \u0026amp; P t m S t W t o u o H o o e r n B b r C o u r b a t u l y o s r y h t a i i d t c o o i l c e e o r n d ) k ) e r Why this setup? Automation: The entire process is automated, ensuring my website is always up-to-date and ready to go. Version Control: Using Gitea provides version control for both my code and the built website files. This allows for easy rollbacks if something goes wrong. This custom CI/CD pipeline might seem a bit overkill for a simple blog, but I find it incredibly rewarding to have complete control over the process. Plus, it\u0026rsquo;s a great learning experience! Conclusion This is for testing purposes, let\u0026rsquo;s see where we go from here. The goal is to automate everything, and this is the first step. I\u0026rsquo;m looking forward to expanding the automation capabilities in the future.\n","permalink":"https://triplusnet.be/posts/hello-world/","summary":"\u003cp\u003eWhile many use static hosting, I built my own CI/CD pipeline. This is my first post from Hugo, and I\u0026rsquo;m excited to share the steps I followed to get things running.\u003c/p\u003e\n\u003ch1 id=\"workflow-overview\"\u003eWorkflow Overview\u003c/h1\u003e\n\u003cp\u003eThe process is straightforward: code commits trigger the CI/CD pipeline, which builds and deploys the site. Here is a simplified view of the pipeline flow:\u003c/p\u003e\n\u003ch2 id=\"the-workflow\"\u003eThe Workflow:\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eCode Changes\u003c/strong\u003e: When I make edits to my website\u0026rsquo;s content or code in VS Code, those changes are committed directly to my Gitea source repository.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWebhook Magic\u003c/strong\u003e: The magic happens when a webhook is triggered by the commit on Gitea. This webhook sends a signal to a Docker webhook that acts as the orchestrator of my build process.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDocker Containers\u003c/strong\u003e Take Over: The Docker webhook spins up a Build Container: This container houses Hugo, our static site generator. It fetches the latest code from my Gitea repository and builds the website\u0026rsquo;s HTML files.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeployment to \u0026ldquo;Website\u0026rdquo; Repo\u003c/strong\u003e: Once the build is successful, the newly generated website files are committed directly to another Gitea repository designated as \u0026ldquo;public\u0026rdquo;. This repository acts as the source for deployment to my web hosting provider.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eN8N deployment to host\u003c/strong\u003e: Manual trigger to upload the website repo to the host. I did this in coding as the default N8N nodes (or my knowledge) were not capable enough.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\n\n\n\u003cdiv class=\"goat svg-container \"\u003e\n  \n    \u003csvg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      font-family=\"Menlo,Lucida Console,monospace\"\n      \n        viewBox=\"0 0 408 793\"\n      \u003e\n      \u003cg transform='translate(8,16)'\u003e\n\u003cpath d='M 0,0 L 104,0' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,0 L 392,0' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 104,32 L 216,32' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 0,64 L 104,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,64 L 304,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,64 L 392,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,128 L 304,128' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,128 L 392,128' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,208 L 304,208' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,208 L 392,208' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,272 L 304,272' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,272 L 392,272' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,352 L 304,352' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,352 L 392,352' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,416 L 304,416' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,416 L 392,416' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,496 L 304,496' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,496 L 392,496' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,560 L 304,560' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,560 L 392,560' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,640 L 304,640' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,640 L 392,640' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,704 L 392,704' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,768 L 392,768' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 0,0 L 0,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 104,0 L 104,32' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 104,32 L 104,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,0 L 224,32' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,32 L 224,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,128 L 224,208' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,272 L 224,352' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,416 L 224,496' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,560 L 224,640' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 224,704 L 224,768' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,64 L 304,112' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,112 L 304,128' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,208 L 304,256' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,256 L 304,272' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,352 L 304,400' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,400 L 304,416' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,496 L 304,544' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,544 L 304,560' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 304,640 L 304,688' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 392,0 L 392,64' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 392,128 L 392,208' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 392,272 L 392,352' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 392,416 L 392,496' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 392,560 L 392,640' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpath d='M 392,704 L 392,768' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpolygon points='224.000000,32.000000 212.000000,26.400000 212.000000,37.599998' fill='currentColor' transform='rotate(0.000000, 216.000000, 32.000000)'\u003e\u003c/polygon\u003e\n\u003cpath d='M 304,112 L 304,120' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpolygon points='320.000000,112.000000 308.000000,106.400002 308.000000,117.599998' fill='currentColor' transform='rotate(90.000000, 304.000000, 112.000000)'\u003e\u003c/polygon\u003e\n\u003cpath d='M 304,256 L 304,264' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpolygon points='320.000000,256.000000 308.000000,250.399994 308.000000,261.600006' fill='currentColor' transform='rotate(90.000000, 304.000000, 256.000000)'\u003e\u003c/polygon\u003e\n\u003cpath d='M 304,400 L 304,408' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpolygon points='320.000000,400.000000 308.000000,394.399994 308.000000,405.600006' fill='currentColor' transform='rotate(90.000000, 304.000000, 400.000000)'\u003e\u003c/polygon\u003e\n\u003cpath d='M 304,544 L 304,552' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpolygon points='320.000000,544.000000 308.000000,538.400024 308.000000,549.599976' fill='currentColor' transform='rotate(90.000000, 304.000000, 544.000000)'\u003e\u003c/polygon\u003e\n\u003cpath d='M 304,688 L 304,696' fill='none' stroke='currentColor'\u003e\u003c/path\u003e\n\u003cpolygon points='320.000000,688.000000 308.000000,682.400024 308.000000,693.599976' fill='currentColor' transform='rotate(90.000000, 304.000000, 688.000000)'\u003e\u003c/polygon\u003e\n\u003ctext text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'\u003eV\u003c/text\u003e\n\u003ctext text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'\u003eS\u003c/text\u003e\n\u003ctext text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'\u003eC\u003c/text\u003e\n\u003ctext text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='176' y='532' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='184' y='532' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='192' y='532' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='388' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='200' y='532' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='388' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='208' y='532' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='388' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='216' y='532' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='224' y='388' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='388' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='232' y='532' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='388' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='240' y='532' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'\u003ew\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='164' fill='currentColor' style='font-size:1em'\u003eD\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='180' fill='currentColor' style='font-size:1em'\u003e(\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='244' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='292' fill='currentColor' style='font-size:1em'\u003eB\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='324' fill='currentColor' style='font-size:1em'\u003eH\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='340' fill='currentColor' style='font-size:1em'\u003eF\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='452' fill='currentColor' style='font-size:1em'\u003eG\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='468' fill='currentColor' style='font-size:1em'\u003eR\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='532' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='596' fill='currentColor' style='font-size:1em'\u003eN\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='612' fill='currentColor' style='font-size:1em'\u003e(\u003c/text\u003e\n\u003ctext text-anchor='middle' x='248' y='676' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'\u003eG\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'\u003eR\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='100' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='164' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='180' fill='currentColor' style='font-size:1em'\u003eO\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='244' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='292' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='324' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='340' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='388' fill='currentColor' style='font-size:1em'\u003ef\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='452' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='468' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='532' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='596' fill='currentColor' style='font-size:1em'\u003e8\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='612' fill='currentColor' style='font-size:1em'\u003eC\u003c/text\u003e\n\u003ctext text-anchor='middle' x='256' y='676' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='164' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='180' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='244' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='292' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='324' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='340' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='388' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='452' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='468' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='532' fill='currentColor' style='font-size:1em'\u003eg\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='596' fill='currentColor' style='font-size:1em'\u003eN\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='612' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='264' y='676' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='164' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='180' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='244' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='292' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='324' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='340' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='388' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='452' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='468' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='532' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='612' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='676' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='272' y='740' fill='currentColor' style='font-size:1em'\u003eW\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='52' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='164' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='180' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='292' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='340' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='388' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='452' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='468' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='532' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='612' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='676' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='280' y='740' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='164' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='180' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='244' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='388' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='468' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='612' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='676' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='288' y='740' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='180' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='244' fill='currentColor' style='font-size:1em'\u003ep\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='292' fill='currentColor' style='font-size:1em'\u003eC\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='340' fill='currentColor' style='font-size:1em'\u003e\u0026amp;\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='452' fill='currentColor' style='font-size:1em'\u003eP\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='468' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='296' y='612' fill='currentColor' style='font-size:1em'\u003em\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'\u003eS\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='164' fill='currentColor' style='font-size:1em'\u003eW\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='180' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='292' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='452' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='468' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='304' y='740' fill='currentColor' style='font-size:1em'\u003eH\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='164' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='180' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='292' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='340' fill='currentColor' style='font-size:1em'\u003eB\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='452' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='468' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='612' fill='currentColor' style='font-size:1em'\u003eC\u003c/text\u003e\n\u003ctext text-anchor='middle' x='312' y='740' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='164' fill='currentColor' style='font-size:1em'\u003eb\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='180' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='292' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='340' fill='currentColor' style='font-size:1em'\u003eu\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='452' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='468' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='612' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='320' y='740' fill='currentColor' style='font-size:1em'\u003es\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'\u003ey\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='164' fill='currentColor' style='font-size:1em'\u003eh\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='180' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='292' fill='currentColor' style='font-size:1em'\u003ea\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='340' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='452' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='612' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='328' y='740' fill='currentColor' style='font-size:1em'\u003et\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='164' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='180' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='292' fill='currentColor' style='font-size:1em'\u003ei\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='340' fill='currentColor' style='font-size:1em'\u003el\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='452' fill='currentColor' style='font-size:1em'\u003ec\u003c/text\u003e\n\u003ctext text-anchor='middle' x='336' y='612' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='164' fill='currentColor' style='font-size:1em'\u003eo\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='180' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='292' fill='currentColor' style='font-size:1em'\u003en\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='340' fill='currentColor' style='font-size:1em'\u003ed\u003c/text\u003e\n\u003ctext text-anchor='middle' x='344' y='612' fill='currentColor' style='font-size:1em'\u003e)\u003c/text\u003e\n\u003ctext text-anchor='middle' x='352' y='164' fill='currentColor' style='font-size:1em'\u003ek\u003c/text\u003e\n\u003ctext text-anchor='middle' x='352' y='180' fill='currentColor' style='font-size:1em'\u003e)\u003c/text\u003e\n\u003ctext text-anchor='middle' x='352' y='292' fill='currentColor' style='font-size:1em'\u003ee\u003c/text\u003e\n\u003ctext text-anchor='middle' x='360' y='292' fill='currentColor' style='font-size:1em'\u003er\u003c/text\u003e\n\u003c/g\u003e\n\n    \u003c/svg\u003e\n  \n\u003c/div\u003e\n\u003ch1 id=\"why-this-setup\"\u003eWhy this setup?\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAutomation\u003c/strong\u003e: The entire process is automated, ensuring my website is always up-to-date and ready to go.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVersion Control\u003c/strong\u003e: Using Gitea provides version control for both my code and the built website files. This allows for easy rollbacks if something goes wrong.\nThis custom CI/CD pipeline might seem a bit overkill for a simple blog, but I find it incredibly rewarding to have complete control over the process. Plus, it\u0026rsquo;s a great learning experience!\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"conclusion\"\u003eConclusion\u003c/h1\u003e\n\u003cp\u003eThis is for testing purposes, let\u0026rsquo;s see where we go from here. The goal is to automate everything, and this is the first step. I\u0026rsquo;m looking forward to expanding the automation capabilities in the future.\u003c/p\u003e","title":"Hello World - DIY CI/CD Pipeline for My Site"}]