{"id":36024,"date":"2026-05-30T10:24:00","date_gmt":"2026-05-30T08:24:00","guid":{"rendered":"https:\/\/harlerunner.de\/?p=36024"},"modified":"2026-07-11T15:58:55","modified_gmt":"2026-07-11T13:58:55","slug":"loop-ui-why-i-built-my-own-interface-for-intervals-icu","status":"publish","type":"post","link":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/","title":{"rendered":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu"},"content":{"rendered":"\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>intervals.icu can do a lot \u2014 it&#8217;s just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually need daily into my own tool: &#8220;Loop UI.&#8221; A single HTML file, my plan in magazine style, live-connected to the real account \u2014 plus a few analyses that don&#8217;t exist anywhere else.<\/strong><\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong><em> loop isn&#8217;t a product you can buy or download \u2014 it&#8217;s a private hobby project for my own plan, behind a password. So this article isn&#8217;t a review to go shop for, but a workshop report \u2026 ;)<\/em><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<hr class=\"wp-block-separator has-text-color has-alpha-channel-opacity has-background is-style-default\" style=\"background-color:#0000000f;color:#0000000f\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"text-transform:capitalize\">Loop UI<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Type<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Self-built \u2014 a standalone HTML file, also runs offline<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Base<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">intervals.icu as the data hub, live via the API<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Access<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Locally by double-click \u2014 or online, even from a phone<\/p>\n<\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-alpha-channel-opacity has-background is-style-default\" style=\"background-color:#0000000f;color:#0000000f\"\/>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Loop UI: a self-built browser interface for my own intervals.icu plan, made for data-loving hobby runners. Not a product to buy, but a private tool \u2014 able to run offline, though for me it&#8217;s reachable online too, even on mobile. Five views, from the weekly cockpit to the season overview, plus an HRV analysis based on Plews that doesn&#8217;t exist anywhere else. Anyone who&#8217;d rather read their plan than manage it will get the appeal right away.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-alpha-channel-opacity has-background is-style-default\" style=\"background-color:#0000000f;color:#0000000f\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why build a custom interface at all?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/harlerunner.de\/intervals-icu-leistungsstarke-analyse-und-trainingsplanung\/\" title=\"Intervals.icu \u2013 leistungsstarke Analyse und Trainingsplanung\">intervals.icu<\/a> is a Swiss Army knife \u2014 powerful, dense, a bit technical. The calendar shows everything, but it doesn&#8217;t exactly invite you to just glance at it over morning coffee. That&#8217;s exactly what I wanted though: a tool I&#8217;d actually enjoy opening \u2026 not one I have to work my way through.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On top of that: my training isn&#8217;t even planned in intervals.icu \u2014 it&#8217;s planned through an <a href=\"https:\/\/harlerunner.de\/mein-persoenliches-trainerteam-sieben-experten-die-mein-lauftraining-veraendert-haben\/\" title=\"Mein pers\u00f6nliches Trainerteam: sieben Experten, die mein Lauftraining ver\u00e4ndert haben\">AI assistant (Claude)<\/a>. For me, intervals.icu is the data hub \u2014 it stores, evaluates, and pushes the workouts to my watch. Whatever I actually need to see day-to-day, I&#8217;ve gradually pulled together into loop.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>loop is a plain browser file. It runs by double-click \u2014 completely offline, no server, no installation.<\/li>\n\n\n\n<li>So I can reach it from anywhere, even on my phone, I&#8217;ve also made it available online for myself \u2014 behind a password.<\/li>\n\n\n\n<li>It connects live to the real intervals.icu account. Moving, deleting, and creating things take effect immediately in the account \u2014 so loop isn&#8217;t a copy, but a second door to the same plan.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The Cockpit \u2014 my week at a glance<\/h2>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df59515d5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df59515d5\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1920\" height=\"2337\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_cockpit.png\" alt=\"\" class=\"wp-image-35858\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_cockpit.png 1920w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_cockpit-770x937.png 770w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_cockpit-1262x1536.png 1262w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_cockpit-1683x2048.png 1683w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The cockpit \u2014 my whole week at a glance, from the form status at the top down to the next season highlight.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The cockpit is the view I open most often. A single week, but with everything I want to know in the morning: Am I fresh? What&#8217;s coming up? Where is my form heading?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The weekly grid sorts the days into three bands \u2014 running and endurance on top, strength and rehab in the middle, notes at the bottom. Below that sit the HRV strip, a &#8220;Form &#038; Fitness&#8221; panel with the CTL\/ATL\/TSB history, and the Easy\/Sub-T+ breakdown for the week.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The hero strip at the very top shows planned hours, form (TSB), fitness (CTL) including eFTP, and the next A race.<\/li>\n\n\n\n<li>Form, fitness, and eFTP values follow whichever week you&#8217;re browsing back to \u2014 so historical views match the state at that point in time.<\/li>\n\n\n\n<li>A daily wellness footer adds resting heart rate, HRV, and sleep duration.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What this gives me as a runner:<\/strong> an honest morning check in five seconds. No searching, no scrolling \u2014 everything I want to know about the current week is just there.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HRV per Plews \u2014 the most honest early warning<\/h2>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df5952679&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df5952679\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1222\" height=\"441\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_hrv.png\" alt=\"\" class=\"wp-image-35860\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_hrv.png 1222w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_hrv-770x278.png 770w\" sizes=\"(max-width: 1222px) 100vw, 1222px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">A single HRV day-cell from the cockpit (close-up) \u2014 status pill, micro-grid with M\u2087\/CV\/RHR\/nHRV, and, when active, the 3R badge in the top right.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This is the part I&#8217;m proudest of. For every day of the week, loop shows an HRV assessment based on Daniel Plews&#8217; method \u2014 enriched with a few newer research findings. The basis is the daily RMSSD and resting-heart-rate values I measure via HRV4Training and sync from there to intervals.icu.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Each day produces a rolling 7-day average and a coefficient of variation, compared against a 60-day baseline.<\/li>\n\n\n\n<li>From that comes a signal: <strong>OK<\/strong>, <strong>NFOR<\/strong> (fatigue), <strong>HYPER<\/strong>, or <strong>SAT?<\/strong> (vagal over-adaptation rather than overtraining).<\/li>\n\n\n\n<li>A 3R badge (Vagal Tank) checks after races and hard days whether recovery has returned.<\/li>\n\n\n\n<li>On critical days, a warning banner appears with the meaning and a recommendation.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This analysis \u2014 the Plews quadrant along with the 3R recovery check \u2014 doesn&#8217;t exist like this in intervals.icu or in any other tool I know of. For this one piece alone, the whole effort was almost worth it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What this gives me as a runner:<\/strong> I see a looming crash before it becomes an infection or an injury. It&#8217;s no oracle, and definitely not medical advice \u2014 but as an early warning system that thinks along over the weeks, it&#8217;s worth gold. One thing matters here: Plews relies on clean HRV history, measured every morning under the same conditions. Without that, the display is only half as honest \u2026<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Had I already had this analysis at the start of the year (the screenshot is from that time), I might have avoided my overuse injuries. What I was doing back then was pretty reckless. My previous warning systems (just the HRV trend) didn&#8217;t fire at all \u2014 Plews, by contrast, flagged it clearly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Plan, season, pulse \u2014 the view forward and back<\/h2>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df59531c5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df59531c5\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1920\" height=\"1984\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_plan.png\" alt=\"\" class=\"wp-image-35863\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_plan.png 1920w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_plan-770x796.png 770w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_plan-1486x1536.png 1486w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The plan view across multiple weeks \u2014 the continuous three day-bands, with the weekly summary on the right showing time as the leading metric and kilometers below it.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Same training, three altitudes. Depending on whether I&#8217;m fine-tuning next week or want to see a whole quarter, I switch views \u2014 the time window stays the same throughout.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Plan<\/strong> \u2014 the multi-week grid over 4\/8\/12\/16 weeks, with a full weekly summary.<\/li>\n\n\n\n<li><strong>Season<\/strong> \u2014 a compact table, one row per week, with phase and Sub-T+ share (planned vs. actual). Strength training is deliberately hidden here to keep the endurance focus.<\/li>\n\n\n\n<li><strong>Pulse<\/strong> \u2014 the load and form history over 4 to 52 weeks, with load bars color-coded by sport and CTL\/ATL lines.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df5953d6f&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df5953d6f\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1920\" height=\"1179\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_saison.png\" alt=\"\" class=\"wp-image-35865\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_saison.png 1920w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_saison-770x473.png 770w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_saison-1536x943.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Compact season view over 8 weeks<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What this gives me as a runner:<\/strong> I can zoom. Sometimes the week, sometimes the season, sometimes half a year \u2014 and I can see right away whether the plan fits or needs adjusting somewhere.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df59544db&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df59544db\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1219\" height=\"687\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_pulse.png\" alt=\"\" class=\"wp-image-35867\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_pulse.png 1219w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_pulse-770x434.png 770w\" sizes=\"(max-width: 1219px) 100vw, 1219px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The pulse view across several months \u2014 stacked load bars in the sport-specific colors plus CTL and ATL lines, with the metric tiles above.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Planned vs. actual \u2014 did I hit the plan?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A plan is one thing, reality another. loop puts both side by side and assigns each session a status: completed, missed, open, or spontaneous. Clicking a tile opens a full-screen detail view.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stat tiles show duration, distance, load, and Easy\/Sub-T+ as planned vs. actual \u2014 color-coded by plan adherence (green, yellow, red).<\/li>\n\n\n\n<li>The <strong>compliance graph<\/strong> overlays the target bands for each workout step onto the line actually run (power, pace, or heart rate). Pauses are filtered out.<\/li>\n\n\n\n<li>For running sessions with power data, a bar shows time spent in each power zone.<\/li>\n\n\n\n<li>RPE can be entered directly in the detail view via 1\u201310 buttons.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What this gives me as a runner:<\/strong> honest feedback instead of a simple checkmark. Not &#8220;done,&#8221; but &#8220;hit \u2014 or not.&#8221; That&#8217;s exactly what helps for next time.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df59552cf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df59552cf\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1920\" height=\"1526\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_compliance.png\" alt=\"\" class=\"wp-image-35869\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_compliance.png 1920w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_compliance-770x612.png 770w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_compliance-1536x1221.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The full-screen detail view of a running session \u2014 the planned-vs-actual stat tiles on top, the compliance graph with target tolerance bands and the actual line below.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Zones per Norwegian Singles and Norwegian Method<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Since I currently train using the Norwegian Singles Method, a clean zone reference is part of the deal. loop derives it from the current eFTP and the sport settings \u2014 and it covers both camps.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Norwegian Singles<\/strong> \u2014 six zones with power (watts + % eFTP), pace, heart rate, purpose, and weekly limit.<\/li>\n\n\n\n<li><strong>Norwegian Method<\/strong> \u2014 four zones including lactate values, with the Golden Zone highlighted.<\/li>\n\n\n\n<li>The vLT2 threshold pace is editable and pre-filled from the intervals.icu settings \u2014 all pace columns recalculate live.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What this gives me as a runner:<\/strong> my actual training zones always within reach, in the same system I run by. No switching to another app, no converting in my head.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df5955bbc&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df5955bbc\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1199\" height=\"732\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_zonen.png\" alt=\"\" class=\"wp-image-35871\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_zonen.png 1199w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_zonen-770x470.png 770w\" sizes=\"(max-width: 1199px) 100vw, 1199px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The zones view in Norwegian Singles mode \u2014 the chip row on top with eFTP, LT1, and LT2, and below it the six zones with color-highlighted sub-threshold ranges.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Seven themes, because it&#8217;s just fun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A bit of fun has to be part of it \u2026 ;) loop comes with seven switchable themes \u2014 six light ones and one dark &#8220;Neon.&#8221; Among them are variants inspired by tools like Strava, TrainingPeaks, or Athletica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That may sound like a gimmick, but it has a practical core: the interface feels familiar because it looks like the tools I already know. And planning in the morning in the dark Neon theme is simply nicer than a plain calendar.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a55df5957280&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a55df5957280\" class=\"wp-block-image alignwide size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1920\" height=\"1988\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_neon-theme.png\" alt=\"\" class=\"wp-image-35873\" srcset=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_neon-theme.png 1920w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_neon-theme-770x797.png 770w, https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_neon-theme-1483x1536.png 1483w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The cockpit in the Neon theme<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What does this really give me as a runner?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Two things. First, loop arranges the existing data the way I actually think about my training \u2014 which lowers the barrier to even looking at it. Second, it contains real analysis that intervals.icu doesn&#8217;t provide, above all the HRV early-warning system based on Plews.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cockpit in the morning, the plan and season views for planning, the HRV strip and compliance graph when in doubt. Three or four clicks, and I know where I stand. The fact that loop runs offline but is also available online for me means the view of my week is never further away than my phone. And the fact that everything writes straight to the real account makes it convenient \u2014 and a little dangerous, since deleting can&#8217;t be undone.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My take:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">loop will never be a finished product, and that&#8217;s a good thing. It&#8217;s tailored exactly to me, my plan, and my quirks \u2014 someone else would get little out of it. But for me, this little side project has been more than worth it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At the same time, building it with AI has been a lot of fun \u2014 and still is. I can wish for any feature and the AI takes care of implementing it. Even the last small tweaks came about while I was writing this very article.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Along the way, I learned more about the logic of my own training than most tools ever taught me before. And the habit of opening loop in the morning instead of the bare calendar \u2026 that&#8217;s just more fun. :)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>intervals.icu can do a lot \u2014 it&#8217;s just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually need daily into my own tool: &#8220;Loop UI.&#8221; A single HTML file, my plan in magazine style, live-connected to the real account \u2014 plus a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":35874,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[297],"tags":[],"class_list":["post-36024","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apps-en"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO Pro 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"intervals.icu can do a lot \u2014 it&#039;s just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Thomas\"\/>\n\t<meta name=\"google-site-verification\" content=\"IrMZ-NCRK-RsIYMqtI-e3Odz9DABRrn3uOuunW3GLTI\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test |\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test\" \/>\n\t\t<meta property=\"og:description\" content=\"intervals.icu can do a lot \u2014 it&#039;s just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2025\/05\/harlerunner.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2025\/05\/harlerunner.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"540\" \/>\n\t\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-05-30T08:24:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-11T13:58:55+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test\" \/>\n\t\t<meta name=\"twitter:description\" content=\"intervals.icu can do a lot \u2014 it&#039;s just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/harlerunner.de\/wp-content\/uploads\/2025\/05\/harlerunner.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/#listItem\",\"name\":\"Digital Tools\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/#listItem\",\"position\":2,\"name\":\"Digital Tools\",\"item\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/apps-en\\\/#listItem\",\"name\":\"Apps\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/apps-en\\\/#listItem\",\"position\":3,\"name\":\"Apps\",\"item\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/apps-en\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#listItem\",\"name\":\"Loop UI \\u2014 Why I Built My Own Interface for intervals.icu\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/#listItem\",\"name\":\"Digital Tools\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#listItem\",\"position\":4,\"name\":\"Loop UI \\u2014 Why I Built My Own Interface for intervals.icu\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/blog\\\/digital-tools\\\/apps-en\\\/#listItem\",\"name\":\"Apps\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/#person\",\"name\":\"Thomas\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/author\\\/thomas\\\/#author\",\"url\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/author\\\/thomas\\\/\",\"name\":\"Thomas\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#webpage\",\"url\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/\",\"name\":\"Loop UI \\u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe & Ausr\\u00fcstung im Test\",\"description\":\"intervals.icu can do a lot \\u2014 it's just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/author\\\/thomas\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/author\\\/thomas\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/harlerunner.de\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/harlerunner_laufblog_loop-ui_neon-theme.png\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#mainImage\",\"width\":1920,\"height\":1988},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\\\/#mainImage\"},\"datePublished\":\"2026-05-30T10:24:00+02:00\",\"dateModified\":\"2026-07-11T15:58:55+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/\",\"name\":\"Laufuhren, Laufschuhe &amp; Ausr\\u00fcstung im Test \\u2013 Harlerunner\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/harlerunner.de\\\/en\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test<\/title>\n\n","aioseo_head_json":{"title":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe & Ausr\u00fcstung im Test","description":"intervals.icu can do a lot \u2014 it's just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually","canonical_url":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"IrMZ-NCRK-RsIYMqtI-e3Odz9DABRrn3uOuunW3GLTI","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/#listItem","position":1,"name":"Home","item":"https:\/\/harlerunner.de\/en\/","nextItem":{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/#listItem","name":"Digital Tools"}},{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/#listItem","position":2,"name":"Digital Tools","item":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/","nextItem":{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/apps-en\/#listItem","name":"Apps"},"previousItem":{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/apps-en\/#listItem","position":3,"name":"Apps","item":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/apps-en\/","nextItem":{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#listItem","name":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu"},"previousItem":{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/#listItem","name":"Digital Tools"}},{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#listItem","position":4,"name":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu","previousItem":{"@type":"ListItem","@id":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/apps-en\/#listItem","name":"Apps"}}]},{"@type":"Person","@id":"https:\/\/harlerunner.de\/en\/#person","name":"Thomas"},{"@type":"Person","@id":"https:\/\/harlerunner.de\/en\/author\/thomas\/#author","url":"https:\/\/harlerunner.de\/en\/author\/thomas\/","name":"Thomas"},{"@type":"WebPage","@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#webpage","url":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/","name":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe & Ausr\u00fcstung im Test","description":"intervals.icu can do a lot \u2014 it's just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/harlerunner.de\/en\/#website"},"breadcrumb":{"@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#breadcrumblist"},"author":{"@id":"https:\/\/harlerunner.de\/en\/author\/thomas\/#author"},"creator":{"@id":"https:\/\/harlerunner.de\/en\/author\/thomas\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/harlerunner.de\/wp-content\/uploads\/2026\/05\/harlerunner_laufblog_loop-ui_neon-theme.png","@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#mainImage","width":1920,"height":1988},"primaryImageOfPage":{"@id":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/#mainImage"},"datePublished":"2026-05-30T10:24:00+02:00","dateModified":"2026-07-11T15:58:55+02:00"},{"@type":"WebSite","@id":"https:\/\/harlerunner.de\/en\/#website","url":"https:\/\/harlerunner.de\/en\/","name":"Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test \u2013 Harlerunner","inLanguage":"en-US","publisher":{"@id":"https:\/\/harlerunner.de\/en\/#person"}}]},"og:locale":"en_US","og:site_name":"Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test |","og:type":"article","og:title":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test","og:description":"intervals.icu can do a lot \u2014 it's just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually","og:url":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/","og:image":"https:\/\/harlerunner.de\/wp-content\/uploads\/2025\/05\/harlerunner.jpg","og:image:secure_url":"https:\/\/harlerunner.de\/wp-content\/uploads\/2025\/05\/harlerunner.jpg","og:image:width":540,"og:image:height":540,"article:published_time":"2026-05-30T08:24:00+00:00","article:modified_time":"2026-07-11T13:58:55+00:00","twitter:card":"summary_large_image","twitter:title":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu | Harlerunner | Laufuhren, Laufschuhe &amp; Ausr\u00fcstung im Test","twitter:description":"intervals.icu can do a lot \u2014 it's just that the interface looks like it was built for data, not for checking in every day. My training is planned elsewhere anyway, through an AI assistant; for me, intervals.icu mainly manages the data and pushes the workouts to my watch. So I packed the features I actually","twitter:image":"https:\/\/harlerunner.de\/wp-content\/uploads\/2025\/05\/harlerunner.jpg"},"aioseo_meta_data":{"post_id":"36024","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"none","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":"2026-07-11 14:10:55","breadcrumb_settings":null,"limit_modified_date":false,"open_ai":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-07-11 13:53:40","updated":"2026-07-11 15:03:58"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/harlerunner.de\/en\/\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">|<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/\" title=\"Digital Tools\">Digital Tools<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">|<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/apps-en\/\" title=\"Apps\">Apps<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">|<\/span><span class=\"aioseo-breadcrumb\">\n\tLoop UI \u2014 Why I Built My Own Interface for intervals.icu\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/harlerunner.de\/en\/"},{"label":"Digital Tools","link":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/"},{"label":"Apps","link":"https:\/\/harlerunner.de\/en\/blog\/digital-tools\/apps-en\/"},{"label":"Loop UI \u2014 Why I Built My Own Interface for intervals.icu","link":"https:\/\/harlerunner.de\/en\/loop-ui-why-i-built-my-own-interface-for-intervals-icu\/"}],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/posts\/36024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/comments?post=36024"}],"version-history":[{"count":1,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/posts\/36024\/revisions"}],"predecessor-version":[{"id":36025,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/posts\/36024\/revisions\/36025"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/media\/35874"}],"wp:attachment":[{"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/media?parent=36024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/categories?post=36024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/harlerunner.de\/en\/wp-json\/wp\/v2\/tags?post=36024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}