1<!DOCTYPE html> 2<html lang="en-ZA"> 3<head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6<meta name='robots' content='max-image-preview:large' /> 7
7<script> 8 (function() { 9 var saved = localStorage.getItem('theme'); 10 if (saved) { 11 document.documentElement.setAttribute('data-theme', saved); 12 } 13 })(); 14 </script>
14 15 <title>Jonathan Bossenger – Thoughts on open source, software development, and life in general.</title> 16<link rel='dns-prefetch' href='//cdn.jsdelivr.net' /> 17<link rel='dns-prefetch' href='//secure.gravatar.com' /> 18<link rel='dns-prefetch' href='//use.fontawesome.com' /> 19<link rel='dns-prefetch' href='//widgets.wp.com' /> 20<link rel='dns-prefetch' href='//s0.wp.com' /> 21<link rel='dns-prefetch' href='//0.gravatar.com' /> 22<link rel='dns-prefetch' href='//1.gravatar.com' /> 23<link rel='dns-prefetch' href='//2.gravatar.com' /> 24<link rel='dns-prefetch' href='//jetpack.wordpress.com' /> 25<link rel='dns-prefetch' href='//public-api.wordpress.com' /> 26<link rel='preconnect' href='//c0.wp.com' /> 27<link rel="alternate" type="application/rss+xml" title="Jonathan Bossenger » Feed" href="https://jonathanbossenger.com/feed/" /> 28<link rel="alternate" type="application/rss+xml" title="Jonathan Bossenger » Comments Feed" href="https://jonathanbossenger.com/comments/feed/" /> 29<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://jonathanbossenger.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fjonathanbossenger.com%2F" /> 30<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://jonathanbossenger.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fjonathanbossenger.com%2F&format=xml" /> 31<style id="wp-img-auto-sizes-contain-inline-css"> 32img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 33/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 34</style> 35<link rel='stylesheet' id='jetpack_related-posts-css' href='https://jonathanbossenger.com/wp-content/plugins/jetpack/modules/related-posts/related-posts.css?ver=20240116' media='all' /> 36<style id="wp-block-site-title-inline-css"> 37.wp-block-site-title{box-sizing:border-box}.wp-block-site-title :where(a){color:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit} 38/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/site-title/style.min.css */ 39</style> 40<style id="wp-block-navigation-link-inline-css"> 41.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{outline:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-left:8px;text-transform:uppercase} 42/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/navigation-link/style.min.css */ 43</style> 44<link rel='stylesheet' id='wp-block-navigation-css' href='https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/navigation/style.min.css?ver=24.1.0' media='all' /> 45<style id="wp-block-group-inline-css"> 46.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative} 47/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/group/style.min.css */ 48</style> 49<style id="wp-block-group-theme-inline-css"> 50:where(.wp-block-group.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)} 51/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/group/theme.min.css */ 52</style> 53<style id="wp-block-template-part-theme-inline-css"> 54:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:var(--wp--style--block-background-padding,1.25em 2.375em)} 55/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/template-part/theme.min.css */ 56</style> 57<style id="wp-block-heading-inline-css"> 58h1: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:var(--wp--style--block-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} 59/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/heading/style.min.css */ 60</style> 61<style id="wp-block-paragraph-inline-css"> 62.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:var(--wp--style--block-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} 63/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/paragraph/style.min.css */ 64</style> 65<style id="wp-block-image-inline-css"> 66.wp-block-image>a,.wp-block-image>figure>a{color:inherit;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 (mask-image:none) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;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;mask-position:center;mask-repeat:no-repeat;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;
66cursor: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}}
66@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}} 67/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/image/style.min.css */ 68</style> 69<style id="wp-block-image-theme-inline-css"> 70:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em} 71/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/image/theme.min.css */ 72</style> 73<style id="wp-block-columns-inline-css"> 74.wp-block-columns{box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns{align-items:normal!important}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:normal}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%} 75/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/columns/style.min.css */ 76</style> 77<style id="wp-block-post-featured-image-inline-css"> 78.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image :where(img){box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:transparent}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%} 79/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/post-featured-image/style.min.css */ 80</style> 81<style id="wp-block-post-date-inline-css"> 82.wp-block-post-date{box-sizing:border-box} 83/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/post-date/style.min.css */ 84</style> 85<style id="wp-block-post-title-inline-css"> 86.wp-block-post-title{box-sizing:border-box;overflow-wrap:anywhere;word-break:normal}.wp-block-post-title :where(a){font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit} 87/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/post-title/style.min.css */ 88</style> 89<style id="wp-block-post-excerpt-inline-css"> 90:where(.wp-block-post-excerpt){box-sizing:border-box;margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block} 91/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/post-excerpt/style.min.css */ 92</style> 93<style id="wp-block-post-template-inline-css"> 94.wp-block-post-template{box-sizing:border-box;list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid[class*=columns-]:not
94(.has-native-responsive-grid){grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{float:right;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{float:left;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{margin-inline-end:auto;margin-inline-start:auto} 95/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/post-template/style.min.css */ 96</style> 97<style id="wp-block-list-inline-css"> 98ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)} 99/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/list/style.min.css */ 100</style> 101<style id="wp-block-button-inline-css"> 102.wp-block-button__link{align-content:center;box-sizing:border-box;cursor:pointer;display:inline-block;height:100%;overflow-wrap:anywhere;text-align:center;word-break:normal}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button[class*=wp-block-button__width]{width:calc(var(--wp--block-button--width)*1% - var(--wp--style--block-gap, .5em)*(1 - var(--wp--block-button--width)/100))}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button[class*=wp-block-button__width]{width:calc(var(--wp--block-button--width)*1%)}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}:root :where(.wp-block-button .wp-block-button__link.is-style-outline),:root :where(.wp-block-button.is-style-outline>.wp-block-button__link){border:2px solid;padding:.667em 1.333em}:root :where(.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color)),:root :where(.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color)){color:currentColor}:root :where(.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background)),:root :where(.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background)){background-color:transparent;background-image:none} 103/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/button/style.min.css */ 104</style> 105<style id="wp-block-buttons-inline-css"> 106.wp-block-buttons{box-sizing:border-box}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons .wp-block-button__link{width:100%}.wp-block-button.aligncenter{text-align:center} 107/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/buttons/style.min.css */ 108</style> 109<link rel='stylesheet' id='wp-block-social-links-css' href='https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/social-links/style.min.css?ver=24.1.0' media='all' /> 110<style id="wp-emoji-styles-inline-css"> 111 112 img.wp-smiley, img.emoji { 113 display: inline !important; 114 border: none !important; 115 box-shadow: none !important; 116 height: 1em !important; 117 width: 1em !important; 118 margin: 0 0.07em !important; 119 vertical-align: -0.1em !important; 120 background: none !important; 121 padding: 0 !important; 122 } 123/*# sourceURL=wp-emoji-styles-inline-css */ 124</style> 125<style id="wp-block-library-inline-css"> 126: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}}
126.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;--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{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;overflow-wrap:normal!important;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}} 127/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/styles/block-library/common.min.css */ 128</style> 129<style id="font-awesome-svg-styles-default-inline-css"> 130.svg-inline--fa { 131 display: inline-block; 132 height: 1em; 133 overflow: visible; 134 vertical-align: -.125em; 135} 136/*# sourceURL=font-awesome-svg-styles-default-inline-css */ 137</style> 138<link rel='stylesheet' id='font-awesome-svg-styles-css' href='https://jonathanbossenger.com/wp-content/uploads/font-awesome/v6.5.1/css/svg-with-js.css' media='all' /> 139<style id="font-awesome-svg-styles-inline-css"> 140 .wp-block-font-awesome-icon svg::before, 141 .wp-rich-text-font-awesome-icon svg::before {content: unset;} 142/*# sourceURL=font-awesome-svg-styles-inline-css */ 143</style> 144<link rel='stylesheet' id='font-awesome-official-css' href='https://use.fontawesome.com/releases/v6.5.1/css/all.css' media='all' integrity="sha384-t1nt8B
144QoYMLFN5p42tRAtuAAFQaCQODekUVeKKZrEnEyp4H2R0RHFz0KWpmj7i8g" crossorigin="anonymous" /> 145<link rel='stylesheet' id='font-awesome-official-v4shim-css' href='https://use.fontawesome.com/releases/v6.5.1/css/v4-shims.css' media='all' integrity="sha384-5Jfdy0XO8+vjCRofsSnGmxGSYjLfsjjTOABKxVr8BkfvlaAm14bIJc7Jcjfq/xQI" crossorigin="anonymous" /> 146<style id="wp-block-template-skip-link-inline-css"> 147/*! This file is auto-generated */ 148.skip-link.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;word-break:normal!important}.skip-link.screen-reader-text:focus{background-color:#eee;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} 149/*# sourceURL=/wp-includes/css/wp-block-template-skip-link.min.css */ 150</style> 151<style id="global-styles-inline-css"> 152: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--base: #F6F8FC;--wp--preset--color--contrast: #1A1A1A;--wp--preset--color--accent: #7B6AE0;--wp--preset--color--accent-hover: #6A57D1;--wp--preset--color--secondary: #4F9DFF;--wp--preset--color--muted: #6B6D74;--wp--preset--color--elevated: #FFFFFF;--wp--preset--color--card: #EEF3FA;--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%);
152--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: 0.875rem;--wp--preset--font-size--medium: clamp(0.95rem, 0.95rem + ((1vw - 0.2rem) * 0.318), 1.125rem);--wp--preset--font-size--large: clamp(1.05rem, 1.05rem + ((1vw - 0.2rem) * 0.364), 1.25rem);--wp--preset--font-size--x-large: clamp(1.5rem, 1.5rem + ((1vw - 0.2rem) * 1.818), 2.5rem);--wp--preset--font-size--xx-large: clamp(2.5rem, 2.5rem + ((1vw - 0.2rem) * 2.727), 4rem);--wp--preset--font-family--dm-serif-display: 'DM Serif Display', Georgia, serif;--wp--preset--font-family--instrument-sans: 'Instrument Sans', -apple-system, sans-serif;--wp--preset--font-family--jetbrains-mono: 'JetBrains Mono', monospace;--wp--preset--text-shadow--light: 0.05em 0.05em 0.1em rgba(0, 0, 0, 0.3);--wp--preset--text-shadow--strong: 0.1em 0.1em 0.25em rgba(0, 0, 0, 0.5);--wp--preset--spacing--20: 0.5rem;--wp--preset--spacing--30: 1rem;--wp--preset--spacing--40: 1.5rem;--wp--preset--spacing--50: clamp(1.5rem, 3vw, 2.5rem);--wp--preset--spacing--60: clamp(2rem, 5vw, 3rem);--wp--preset--spacing--70: clamp(3rem, 5vw, 5rem);--wp--preset--spacing--80: clamp(5rem, 8vw, 8rem);--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%;}:root { --wp--style--global--content-size: 800px;--wp--style--global--wide-size: 1200px; }:where(body) { margin: 0; }.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) { padding-right: 0; padding-left: 0; }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) > .alignfull { margin-left: 0; margin-right: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 1.5rem; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 1.5rem; }:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 1.5rem;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 1.5rem;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 1.5rem;}:root :where(.is-layout-grid){gap: 1.5rem;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained >
152 :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}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{background-color: var(--wp--preset--color--base);color: var(--wp--preset--color--contrast);font-family: var(--wp--preset--font-family--instrument-sans);font-size: clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.227), 1rem);line-height: 1.7;--wp--style--root--padding-top: 0px;--wp--style--root--padding-right: var(--wp--preset--spacing--50);--wp--style--root--padding-bottom: 0px;--wp--style--root--padding-left: var(--wp--preset--spacing--50);}a:where(:not(.wp-element-button)){color: var(--wp--preset--color--accent);text-decoration: none;}:root :where(a:where(:not(.wp-element-button)):hover){color: var(--wp--preset--color--accent-hover);}h1, h2, h3, h4, h5, h6{font-family: var(--wp--preset--font-family--dm-serif-display);font-weight: 400;line-height: 1.2;}h1{font-size: var(--wp--preset--font-size--xx-large);}h2{font-size: var(--wp--preset--font-size--x-large);}h3{font-size: var(--wp--preset--font-size--large);}:root :where(.wp-element-button, .wp-block-button__link){background-color: var(--wp--preset--color--accent);border-radius: 10px;border-width: 0;color: #FFFFFF;font-family: inherit;font-size: var(--wp--preset--font-size--medium);font-style: inherit;font-weight: 600;letter-spacing: inherit;line-height: inherit;padding-top: 0.85rem;padding-right: 2rem;padding-bottom: 0.85rem;padding-left: 2rem;text-decoration: none;text-transform: inherit;}:root :where(.wp-element-button:hover, .wp-block-button__link:hover){background-color: var(--wp--preset--color--accent-hover);color: #FFFFFF;}.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-base-color{color: var(--wp--preset--color--base) !important;}.has-contrast-color{color: var(--wp--preset--color--contrast) !important;}.has-accent-color{color: var(--wp--preset--color--accent) !important;}.has-accent-hover-color{color: var(--wp--preset--color--accent-hover) !important;}.has-secondary-color{color: var(--wp--preset--color--secondary) !important;}.has-muted-color{color: var(--wp--preset--color--muted) !important;}.has-elevated-color{color: var(--wp--preset--color--elevated) !important;}.has-card-color{color: var(--wp--preset--color--card) !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-base-background-color{background-color: var(--wp--preset--color--base) !important;}.has-contrast-background-color{background-color: var(--wp--preset--color--contrast) !important;}.has-accent-background-color{background-color: var(--wp--preset--color--accent) !important;}.has-accent-hover-background-color{background-color: var(--wp--preset--color--accent-hover) !important;}.has-secondary-background-color{background-color: var(--wp--preset--color--secondary) !important;}.has-muted-background-color{background-color: var(--wp--preset--color--muted) !important;}.has-elevated-background-color{background-color: var(--wp--preset--color--elevated) !important;}.has-card-background-color{background-color: var(--wp--preset--color--card) !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-base-border-color{border-color: var(--wp--preset--color--base) !important;}.has-contrast-border-color{border-color: var(--wp--preset--color--contrast) !important;}.has-accent-border-color{border-color: var(--wp--preset--color--accent) !important;}.has-accent-hover-border-color{border-color: var(--wp--preset--color--accent-hover) !important;}.has-secondary-border-color{border-color: var(--wp--preset--color--secondary) !important;}.has-muted-border-color{border-color: var(--wp--preset--color--muted) !important;}.has-elevated-border-color{border-color: var(--wp--preset--color--elevated) !important;}.has-card-border-color{border-color: var(--wp--preset--color--card) !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;}
152.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;}.has-xx-large-font-size{font-size: var(--wp--preset--font-size--xx-large) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-instrument-sans-font-family{font-family: var(--wp--preset--font-family--instrument-sans) !important;}.has-jetbrains-mono-font-family{font-family: var(--wp--preset--font-family--jetbrains-mono) !important;}.has-light-text-shadow{text-shadow: var(--wp--preset--text-shadow--light) !important;}.has-strong-text-shadow{text-shadow: var(--wp--preset--text-shadow--strong) !important;}::selection { background: var(--selection-bg); color: var(--selection-text); } body::after { content: ''; position: fixed; inset: 0; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E"); pointer-events: none; z-index: 9999; opacity: var(--grain-opacity); } body { -webkit-font-smoothing: antialiased; overflow-x: hidden; } 153:root :where(.wp-block-navigation){font-size: var(--wp--preset--font-size--small);font-weight: 500;} 154:root :where(.wp-block-navigation a:where(:not(.wp-element-button))){text-decoration: none;} 155:root :where(.wp-block-navigation a:where(:not(.wp-element-button)):hover){text-decoration: none;} 156:root :where(.wp-block-site-title){font-family: var(--wp--preset--font-family--jetbrains-mono);font-size: clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.045), 0.9rem);font-weight: 500;letter-spacing: -0.02em;} 157:root :where(.wp-block-site-title a:where(:not(.wp-element-button))){text-decoration: none;} 158:root :where(.wp-block-site-title a:where(:not(.wp-element-button)):hover){text-decoration: none;} 159:root :where(.wp-block-post-title a:where(:not(.wp-element-button))){text-decoration: none;} 160:root :where(.wp-block-post-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;} 161:root :where(.wp-block-post-date){color: var(--wp--preset--color--muted);font-family: var(--wp--preset--font-family--jetbrains-mono);font-size: 0.7rem;letter-spacing: 0.05em;text-transform: uppercase;} 162:root :where(.wp-block-post-featured-image){aspect-ratio: 16/9; overflow: hidden;}:root :where(.wp-block-post-featured-image img){width: 100%; height: 100%; object-fit: cover;} 163/*# sourceURL=global-styles-inline-css */ 164</style> 165<style id="core-block-supports-inline-css"> 166.wp-container-core-navigation-is-layout-20959078{justify-content:center;}.wp-container-core-group-is-layout-f56f613f{flex-wrap:nowrap;}.wp-container-core-group-is-layout-66b22003{justify-content:space-between;}.wp-container-core-columns-is-layout-f56f613f{flex-wrap:nowrap;}.wp-container-core-group-is-layout-828a6807 >
166 :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1200px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-828a6807 > .alignwide{max-width:1200px;}.wp-container-core-group-is-layout-828a6807 .alignfull{max-width:none;}.wp-container-core-post-template-is-layout-0d5c60d9{grid-template-columns:repeat(3, minmax(0, 1fr));}.wp-container-core-group-is-layout-4d648d36{justify-content:center;}.wp-container-core-buttons-is-layout-20959078{justify-content:center;}.wp-container-core-social-links-is-layout-a03d61f4{gap:1.5rem 0.5rem;}.wp-container-core-group-is-layout-ce442f2e{justify-content:space-between;} 167/*# sourceURL=core-block-supports-inline-css */ 168</style> 169<style id="jetpack-stats-inline-css"> 170img#wpstats{display:none} 171/*# sourceURL=jetpack-stats-inline-css */ 172</style> 173<link rel='stylesheet' id='jb-style-css' href='https://jonathanbossenger.com/wp-content/themes/developer-advocate/style.css?ver=1.0.1' media='all' /> 174<style id="jetpack_likes-inline-css"> 175#jp-post-flair{padding-top:.5em}#content div.sharedaddy,#main div.sharedaddy,div.sharedaddy{clear:both}div.sharedaddy h3.sd-title{display:inline-block;font-size:9pt;font-weight:700;line-height:1.2;margin:0 0 1em}div.sharedaddy h3.sd-title:before{border-top:1px solid #dcdcde;content:"";display:block;margin-bottom:1em;min-width:30px;width:100%}div.jetpack-likes-widget-wrapper{min-height:50px;position:relative;width:100%}div.jetpack-likes-widget-wrapper .sd-link-color{font-size:12px}div.jetpack-comment-likes-widget-wrapper{min-height:31px;position:relative;width:100%}div.jetpack-comment-likes-widget-wrapper iframe{margin-bottom:0}#likes-other-gravatars{background-color:#fff;border:1px solid #dcdcde;border-radius:4px;box-shadow:none;display:none;height:auto;max-height:240px;min-width:220px;overflow:auto;padding:9px 12px 10px;position:absolute;z-index:1000}#likes-other-gravatars *{line-height:normal}#likes-other-gravatars .likes-text{color:#101517;font-size:12px;font-weight:500;padding-bottom:8px}#likes-other-gravatars :is(li,ul){list-style-type:none;margin:0;padding:0;text-indent:0}#likes-other-gravatars li:before{content:""}#likes-other-gravatars ul.wpl-avatars{display:block;max-height:190px;overflow:auto}#likes-other-gravatars ul.wpl-avatars li{float:none;height:28px;margin:0 0 4px;width:196px}#likes-other-gravatars ul.wpl-avatars li a{align-items:center;border-bottom:none!important;display:flex;gap:8px;margin:0 2px 0 0;text-decoration:none}#likes-other-gravatars ul.wpl-avatars li a span{color:#2c3338;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#likes-other-gravatars ul.wpl-avatars li a img{background:none;border:none;border-radius:50%;box-sizing:border-box;margin:0!important;padding:1px!important;position:static}div.sd-box{border-top:1px solid #00000021}.jetpack-likes-widget-loaded iframe,.jetpack-likes-widget-loading .likes-widget-placeholder,.jetpack-likes-widget-unloaded .likes-widget-placeholder{display:block}.jetpack-likes-widget-loaded .likes-widget-placeholder,.jetpack-likes-widget-loading iframe,.jetpack-likes-widget-unloaded iframe{display:none}.comment-likes-widget,.entry-content .post-likes-widget,.post-likes-widget{border-width:0;margin:0}.comment-likes-widget-placeholder,.post-likes-widget-placeholder{border-width:0;margin:0;position:relative}.comment-likes-widget-placeholder{display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;height:18px;position:absolute}.comment-likes-widget-placeholder:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath fill='%232ea2cc' d='m12 2 2.582 6.953L22 9.257l-5.822 4.602L18.18 21 12 16.89 5.82 21l2.002-7.14L2 9.256l7.418-.304'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:16px 16px;color:#2ea2cc;content:"";display:inline-block;height:16px;padding-right:5px;position:relative;top:3px;width:16px}.post-likes-widget-placeholder .button{display:none}:is(.comment-likes-widget-placeholder,.post-likes-widget-placeholder) .loading{color:#999;font-size:12px}.comment-likes-widget-placeholder .loading{align-self:center;color:#4e4e4e;margin-top:4px;padding-left:5px}
175div.sharedaddy.sd-like-enabled .sd-like h3{display:none}div.sharedaddy.sd-like-enabled .sd-like .post-likes-widget{float:none;position:absolute;top:0;width:100%}.comment-likes-widget{width:100%}.cs-rating,.pd-rating{display:block!important}.sd-gplus .sd-title{display:none}@media print{.jetpack-likes-widget-wrapper{display:none}} 176/*# sourceURL=https://jonathanbossenger.com/wp-content/plugins/jetpack/_inc/build/likes/style.min.css */ 177</style>
178<script id="jquery-core-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/jquery.min.js"></script>
vendor: 1 bytes, line 178
178
179<script id="jquery-migrate-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/jquery/jquery-migrate.min.js"></script>
179 180<link rel="https://api.w.org/" href="https://jonathanbossenger.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://jonathanbossenger.com/wp-json/wp/v2/pages/30149" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://jonathanbossenger.com/xmlrpc.php?rsd" /> 181 182<link rel="canonical" href="https://jonathanbossenger.com/" /> 183<link rel='shortlink' href='https://wp.me/P6JptS-7Qh' /> 184<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" /> <link rel="manifest" href="https://jonathanbossenger.com/wp-json/wp/v2/web-app-manifest"> 185 <meta name="theme-color" content="#fff"> 186 <meta name="apple-mobile-web-app-capable" content="yes"> 187 <meta name="mobile-web-app-capable" content="yes"> 188 189 <link rel="apple-touch-startup-image" href="https://jonathanbossenger.com/wp-content/uploads/2024/01/wp-1704210610110-300x300.jpg"> 190 191 <meta name="apple-mobile-web-app-title" content="Jonathan Bossenger"> 192 <meta name="application-name" content="Jonathan Bossenger"> 193 194<link rel="alternate" type="application/rss+xml" title="Podcast RSS feed" href="https://jonathanbossenger.com/feed/podcast" /> 195 196<meta property="fediverse:creator" name="fediverse:creator" content="[email protected]" />
197<script id="wp-importmap" type="importmap"> 198{"imports":{"@wordpress/interactivity":"https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/modules/interactivity/index.min.js?ver=b0929e0bd08daccaa778"}} 199</script>
199 200<link rel="modulepreload" href="https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/modules/interactivity/index.min.js?ver=b0929e0bd08daccaa778" id="@wordpress/interactivity-js-modulepreload" fetchpriority="low"> 201<meta name="description" content="Hi, my name is Jonathan. I am a developer advocate and educator from Cape Town, South Africa with a passion for open-source software. I work at Automattic as WordPress developer advocate, creating educational content for WordPress, and my focus is on developer-related content. This site is my personal blog, where I write about all sorts…" /> 202 203<!-- Jetpack Open Graph Tags --> 204<meta property="og:type" content="website" /> 205<meta property="og:title" content="Jonathan Bossenger" /> 206<meta property="og:description" content="Thoughts on open source, software development, and life in general." /> 207<meta property="og:url" content="https://jonathanbossenger.com/" /> 208<meta property="og:site_name" content="Jonathan Bossenger" /> 209<meta property="og:image" content="https://jonathanbossenger.com/wp-content/uploads/2024/09/2024-09-06-08.51.24-scaled.jpg" /> 210<meta property="og:image:width" content="2560" /> 211<meta property="og:image:height" content="1152" /> 212<meta property="og:image:alt" content="" /> 213<meta name="twitter:site" content="@jon_bossenger" /> 214<meta name="twitter:text:title" content="Welcome to my little corner of the internet." /> 215<meta name="twitter:image" content="https://jonathanbossenger.com/wp-content/uploads/2024/09/2024-09-06-08.51.24-scaled.jpg?w=640" /> 216<meta name="twitter:card" content="summary_large_image" /> 217 218<!-- End Jetpack Open Graph Tags --> 219<style class="wp-fonts-local"> 220@font-face{font-family:"DM Serif Display";font-style:normal;font-weight:400;font-display:fallback;src:url('https://jonathanbossenger.com/wp-content/themes/developer-advocate/assets/fonts/dm-serif-display/DMSerifDisplay-Regular.woff2') format('woff2');} 221@font-face{font-family:"DM Serif Display";font-style:italic;font-weight:400;font-display:fallback;src:url('https://jonathanbossenger.com/wp-content/themes/developer-advocate/assets/fonts/dm-serif-display/DMSerifDisplay-Italic.woff2') format('woff2');} 222@font-face{font-family:"Instrument Sans";font-style:normal;font-weight:400 700;font-display:fallback;src:url('https://jonathanbossenger.com/wp-content/themes/developer-advocate/assets/fonts/instrument-sans/InstrumentSans-Variable.woff2') format('woff2');} 223@font-face{font-family:"Instrument Sans";font-style:italic;font-weight:400 700;font-display:fallback;src:url('https://jonathanbossenger.com/wp-content/themes/developer-advocate/assets/fonts/instrument-sans/InstrumentSans-Italic-Variable.woff2') format('woff2');} 224@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:400 500;font-display:fallback;src:url('https://jonathanbossenger.com/wp-content/themes/developer-advocate/assets/fonts/jetbrains-mono/JetBrainsMono-Variable.woff2') format('woff2');} 225</style> 226<link rel="icon" href="https://jonathanbossenger.com/wp-content/uploads/2024/01/wp-1704210610110-150x150.jpg" sizes="32x32" /> 227<link rel="icon" href="https://jonathanbossenger.com/wp-content/uploads/2024/01/wp-1704210610110-300x300.jpg" sizes="192x192" /> 228<link rel="apple-touch-icon" href="https://jonathanbossenger.com/wp-content/uploads/2024/01/wp-1704210610110-300x300.jpg" /> 229<meta name="msapplication-TileImage" content="https://jonathanbossenger.com/wp-content/uploads/2024/01/wp-1704210610110-300x300.jpg" /> 230</head> 231 232<body class="home wp-singular page-template-default page page-id-30149 wp-custom-logo wp-embed-responsive wp-theme-developer-advocate"> 233 234<a class="skip-link screen-reader-text" id="wp-skip-link" href="#wp--skip-link--target">Skip to content</a><div class="wp-site-blocks"><header class="wp-block-template-part"> 235<div class="wp-block-group alignfull site-header is-layout-flow wp-block-group-is-layout-flow"> 236 237 <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained"> 238 239 <div class="wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-66b22003 wp-block-group-is-layout-flex" style="padding-top:1rem;padding-bottom:1rem"> 240 241 <h1 style="font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.045), 0.9rem);font-family:var(--wp--preset--font-family--jetbrains-mono);font-weight:500;letter-spacing:-0.02em" class="site-logo wp-block-site-title"><a href="https://jonathanbossenger.com" target="_self" rel="home" aria-current="page">Jonathan Bossenger</a></h1> 242 243 244 <div class="wp-block-group header-right is-nowrap is-layout-flex wp-container-core-group-is-layout-f56f613f wp-block-group-is-layout-flex"> 245 246 <nav style="font-size:0.875rem;font-weight:500" class="is-responsive items-justified-center site-nav wp-block-navigation is-content-justification-center is-layout-flex wp-container-core-navigation-is-layout-20959078 wp-block-navigation-is-layout-flex" 247 data-wp-interactive="core/navigation" data-wp-context='{"overlayOpenedBy":{"click":false,"hover":false,"focus":false},"type":"overlay","roleAttribute":"","ariaLabel":"Menu"}'><button aria-haspopup="dialog" aria-label="Open menu" class="wp-block-navigation__responsive-container-open" 248 data-wp-on--click="actions.openMenuOnClick" 249 data-wp-on--keydown="actions.handleMenuKeydown" 250 ><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
250<path d="M4 7.5h16v1.5H4z"></path><path d="M4 15h16v1.5H4z"></path></svg></button> 251 <div class="wp-block-navigation__responsive-container" id="modal-1" 252 data-wp-class--has-modal-open="state.isMenuOpen" 253 data-wp-class--is-menu-open="state.isMenuOpen" 254 data-wp-watch="callbacks.initMenu" 255 data-wp-on--keydown="actions.handleMenuKeydown" 256 data-wp-on--focusout="actions.handleMenuFocusout" 257 tabindex="-1" 258 > 259 <div class="wp-block-navigation__responsive-close" tabindex="-1"> 260 <div class="wp-block-navigation__responsive-dialog" 261 data-wp-bind--aria-modal="state.ariaModal" 262 data-wp-bind--aria-label="state.ariaLabel" 263 data-wp-bind--role="state.roleAttribute" 264 > 265 <button aria-label="Close menu" class="wp-block-navigation__responsive-container-close" 266 data-wp-on--click="actions.closeMenuOnClick" 267 ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z"></path></svg></button> 268 <div class="wp-block-navigation__responsive-container-content" 269 data-wp-watch="callbacks.focusFirstElement" 270 id="modal-1-content"> 271 <ul style="font-size:0.875rem;font-weight:500" class="wp-block-navigation__container is-responsive items-justified-center site-nav wp-block-navigation"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="/post-archive"><span class="wp-block-navigation-item__label">Posts</span></a></li><li data-wp-context="{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null, "previousFocus": null }" data-wp-interactive="core/navigation" data-wp-on--focusout="actions.handleMenuFocusout" data-wp-on--keydown="actions.handleMenuKeydown" data-wp-on--pointerenter="actions.openMenuOnHover" data-wp-on--pointerleave="actions.closeMenuOnHover" data-wp-watch="callbacks.initMenu" tabindex="-1" class="wp-block-navigation-item has-child open-on-hover-click wp-block-navigation-submenu"><a class="wp-block-navigation-item__content"><span class="wp-block-navigation-item__label">About</span></a><button data-wp-bind--aria-expanded="state.isSubmenuOpen" data-wp-on--click="actions.toggleMenuOnClick" aria-label="About submenu" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" ><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></button><ul data-wp-on--focus="actions.openMenuOnFocus" class="wp-block-navigation__submenu-container wp-block-navigation-submenu"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.com/about/"><span class="wp-block-navigation-item__label">About me</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.com/current-hardware/"><span class="wp-block-navigation-item__label">Uses</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.com/random-access-memory/"><span class="wp-block-navigation-item__label">Random Access Memory</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.com/guest-posts/"><span class="wp-block-navigation-item__label">Guest Posts</span></a></li></ul></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="/codeable-developers"><span class="wp-block-navigation-item__label">Hire a developer</span></a></li><li data-wp-context="{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null, "previousFocus": null }" data-wp-interactive="core/navigation" data-wp-on--focusout="actions.handleMenuFocusout" data-wp-on--keydown="actions.handleMenuKeydown" data-wp-on--pointerenter
271="actions.openMenuOnHover" data-wp-on--pointerleave="actions.closeMenuOnHover" data-wp-watch="callbacks.initMenu" tabindex="-1" class="wp-block-navigation-item has-child open-on-hover-click wp-block-navigation-submenu"><a class="wp-block-navigation-item__content"><span class="wp-block-navigation-item__label">Games</span></a><button data-wp-bind--aria-expanded="state.isSubmenuOpen" data-wp-on--click="actions.toggleMenuOnClick" aria-label="Games submenu" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" ><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></button><ul data-wp-on--focus="actions.openMenuOnFocus" class="wp-block-navigation__submenu-container wp-block-navigation-submenu"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://times.psykrotek.co.za/times.php"><span class="wp-block-navigation-item__label">Times</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.com/dodge-a-wordpress-game/"><span class="wp-block-navigation-item__label">Dodge</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.github.io/cosmic-defender-3d/"><span class="wp-block-navigation-item__label">Cosmic Defender 3d</span></a></li></ul></li><li data-wp-context="{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null, "previousFocus": null }" data-wp-interactive="core/navigation" data-wp-on--focusout="actions.handleMenuFocusout" data-wp-on--keydown="actions.handleMenuKeydown" data-wp-on--pointerenter="actions.openMenuOnHover" data-wp-on--pointerleave="actions.closeMenuOnHover" data-wp-watch="callbacks.initMenu" tabindex="-1" class="wp-block-navigation-item has-child open-on-hover-click wp-block-navigation-submenu"><a class="wp-block-navigation-item__content"><span class="wp-block-navigation-item__label">Web Apps</span></a><button data-wp-bind--aria-expanded="state.isSubmenuOpen" data-wp-on--click="actions.toggleMenuOnClick" aria-label="Web Apps submenu" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" ><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></button><ul data-wp-on--focus="actions.openMenuOnFocus" class="wp-block-navigation__submenu-container wp-block-navigation-submenu"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://jonathanbossenger.github.io/github-issues-viewer/"><span class="wp-block-navigation-item__label">GitHub Issues Viewer</span></a></li></ul></li><li data-wp-context="{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null, "previousFocus": null }" data-wp-interactive="core/navigation" data-wp-on--focusout="actions.handleMenuFocusout" data-wp-on--keydown="actions.handleMenuKeydown" data-wp-on--pointerenter="actions.openMenuOnHover" data-wp-on--pointerleave="actions.closeMenuOnHover" data-wp-watch="callbacks.initMenu" tabindex="-1" class="wp-block-navigation-item has-child open-on-hover-click wp-block-navigation-submenu"><a class="wp-block-navigation-item__content"><span class="wp-block-navigation-item__label">Desktop Apps</span></a><button data-wp-bind--aria-expanded="state.isSubmenuOpen" data-wp-on--click="actions.toggleMenuOnClick" aria-label="Desktop Apps submenu" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" ><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false">
271<path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></button><ul data-wp-on--focus="actions.openMenuOnFocus" class="wp-block-navigation__submenu-container wp-block-navigation-submenu"><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://github.com/jonathanbossenger/wp-debug"><span class="wp-block-navigation-item__label">WP Debug</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://github.com/jonathanbossenger/wp-sql"><span class="wp-block-navigation-item__label">WP SQL</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://github.com/jonathanbossenger/wp-mail"><span class="wp-block-navigation-item__label">WP Mail</span></a></li><li class="wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://github.com/jonathanbossenger/wp-shell"><span class="wp-block-navigation-item__label">WP Shell</span></a></li></ul></li></ul> 272 273 </div> 274 </div> 275 </div> 276 </div></nav> 277 278 279 <button class="theme-toggle" onclick="toggleTheme()" aria-label="Toggle theme"> 280 <svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 281 <circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/> 282 </svg> 283 <svg class="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> 284 <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/> 285 </svg> 286 </button> 287 288 289 </div> 290 291 292 </div> 293 294 </div> 295 296</div> 297 298</header> 299 300 301<main id="wp--skip-link--target" class="wp-block-group site-main is-layout-flow wp-block-group-is-layout-flow"> 302 303<section class="wp-block-group hero is-layout-flow wp-block-group-is-layout-flow" id="home"> 304 305 <div class="wp-block-group hero-inner is-layout-flow wp-block-group-is-layout-flow"> 306 307 <div class="wp-block-group hero-content is-layout-flow wp-block-group-is-layout-flow"> 308 309 <div class="hero-badge"> 310 <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg> 311 Developer Advocate · Automattic 312 </div> 313 314 315 316 <h1 class="wp-block-heading">Building for <em>developers</em>, teaching by <em>example.</em></h1> 317 318 319 320 <p class="hero-description wp-block-paragraph">I’m Jonathan â a developer advocate, educator, and open-source enthusiast from Cape Town, South Africa. I create educational content for WordPress developers and write about software, AI, and life.</p> 321 322 323 324 <div class="hero-links"> 325 <a href="/about/" class="primary-link"> 326 About Me 327 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg> 328 </a> 329 <a href="https://github.com/jonathanbossenger"> 330 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg> 331 GitHub 332 </a> 333 <a href="https://www.youtube.com/@jon_bossenger"> 334 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg> 335 YouTube 336 </a> 337 <a href="https://www.linkedin.com/in/jonathanbossenger/"> 338 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 339 LinkedIn 340 </a> 341 <a href="https://www.twitch.tv/jonathanbossenger"> 342 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714z"/></svg> 343 Twitch 344 </a> 345 <a href="https://x.com/jon_bossenger"> 346 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> 347 Twitter 348 </a> 349 <a href="https://bsky.app/profile/jonathanbossenger.com"> 350 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908
3500 3.08 0 3.768c0 .69.378 5.65.624 6.479.785 2.627 3.6 3.501 6.204 3.12-3.6.558-6.741 2.032-2.882 7.152C7.724 25.7 10.347 19.346 12 16.87c1.653 2.477 4.189 8.672 8.054 3.649 3.859-5.12.718-6.594-2.882-7.152 2.604.382 5.42-.493 6.204-3.12C23.622 9.419 24 4.457 24 3.768c0-.689-.139-1.861-.902-2.203-.659-.3-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8z"/></svg> 351 Bluesky 352 </a> 353 <a href="https://fosstodon.org/@jonathanbossenger"> 354 <svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054 19.648 19.648 0 0 0 4.636.536c.562 0 1.124-.02 1.669-.058 1.868-.135 3.868-.404 5.332-1.248.057-.033.117-.064.18-.098 1.4-.759 2.702-2.199 2.808-5.197.012-.084.043-.878.043-1.39 0-.423.165-3.004-.057-4.585z"/><path d="M19.903 7.738v6.18h-2.448V7.91c0-1.265-.527-1.908-1.582-1.908-1.166 0-1.75.762-1.75 2.27v3.283h-2.434V8.271c0-1.507-.584-2.27-1.75-2.27-1.055 0-1.582.643-1.582 1.91v6.006H5.91V7.738c0-1.264.322-2.27.97-3.013a3.347 3.347 0 0 1 2.456-1.023c.884 0 1.555.34 2.004 1.02l.432.726.432-.726c.449-.68 1.12-1.02 2.004-1.02.953 0 1.756.34 2.458 1.023.646.744.966 1.749.966 3.013h.271z"/></svg> 355 Mastodon 356 </a> 357 </div> 358 359 </div> 360 361 362 363 <div class="wp-block-group hero-photo is-layout-flow wp-block-group-is-layout-flow"> 364 365 <figure class="wp-block-image size-full hero-photo-frame"><img src="https://jonathanbossenger.com/wp-content/uploads/2026/02/profile-2023-square-scaled.jpg" alt="Jonathan Bossenger"/></figure> 366 367 368 369 <div class="hero-photo-meta"> 370 <span class="location"> 371 <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg> 372 Cape Town, South Africa 373 </span> 374 </div> 375 376 </div> 377 378 </div> 379 380</section> 381 382 383 384<section class="wp-block-group section is-layout-flow wp-block-group-is-layout-flow" id="about"> 385 386 <div class="wp-block-group section-inner has-global-padding is-layout-constrained wp-container-core-group-is-layout-828a6807 wp-block-group-is-layout-constrained"> 387 388 <div class="wp-block-group section-header is-layout-flow wp-block-group-is-layout-flow"> 389 390 <p class="section-label wp-block-paragraph">What I Do</p> 391 392 393 394 <h2 class="wp-block-heading section-title">Developer advocacy through content, code & community</h2> 395 396 </div> 397 398 399 400 <div class="wp-block-columns role-grid is-layout-flex wp-container-core-columns-is-layout-f56f613f wp-block-columns-is-layout-flex"> 401 402 <div class="wp-block-column role-card is-layout-flow wp-block-column-is-layout-flow"> 403 404 <p class="role-icon advocate wp-block-paragraph">ð¡</p> 405 406 407 408 <h3 class="wp-block-heading">Developer Advocacy</h3> 409 410 411 412 <p class="wp-block-paragraph">Working at Automattic across WordPress.com, WordPress VIP, and WordPress.org â bridging the gap between developers and the tools they use, with a growing focus on AI integration.</p> 413 414 </div> 415 416 417 418 <div class="wp-block-column role-card is-layout-flow wp-block-column-is-layout-flow"> 419 420 <p class="role-icon educator wp-block-paragraph">ð</p> 421 422 423 424 <h3 class="wp-block-heading">Education & Content</h3> 425 426 427 428 <p class="wp-block-paragraph">Creating tutorials, blog posts, video courses, and documentation that help developers learn WordPress development. Currently curating the WordPress.com Dev & Deploy newsletter.</p> 429 430 </div> 431 432 433 434 <div class="wp-block-column role-card is-layout-flow wp-block-column-is-layout-flow"> 435 436 <p class="role-icon builder wp-block-paragraph">ð </p> 437 438 439 440 <h3 class="wp-block-heading">Open Source & Tools</h3> 441 442 443 444 <p class="wp-block-paragraph">Building developer utilities like WP Debug and SQLite Viewer for Studio. Active WordPress contributor, community deputy, and WordCamp speaker across multiple continents.</p> 445 446 </div> 447 448 </div> 449 450 </div> 451 452</section> 453 454 455 456<section class="wp-block-group section posts-section is-layout-flow wp-block-group-is-layout-flow" id="posts"> 457 458 <div class="wp-block-group section-inner has-global-padding is-layout-constrained wp-container-core-group-is-layout-828a6807 wp-block-group-is-layout-constrained"> 459 460 <div class="wp-block-group section-header is-layout-flow wp-block-group-is-layout-flow"> 461 462 <p class="section-label wp-block-paragraph">Latest Writing</p> 463 464 465 466 <h2 class="wp-block-heading section-title">From the blog</h2> 467 468 </div> 469 470 471 472 <div class="wp-block-query posts-grid-wrapper is-layout-flow wp-block-query-is-layout-flow"> 473 <ul class="columns-3 wp-block-post-template is-layout-grid wp-container-core-post-template-is-layout-0d5c60d9 wp-block-post-template-is-layout-grid"><li class="wp-block-post post-33992 post type-post status-publish format-standard has-post-thumbnail hentry category-general"> 474 <figure class="wp-block-post-featured-image"><a href="https://jonathanbossenger.com/2026/09/wordcamp-belgrade-2026/" target="_self" ><img width="1279" height="719" src="https://jonathanbossenger.com/wp-content/uploads/2026/09/WordCamp-Belgrade_-Build-your-first-AI-Powered-WordPress-plugin.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="WordCamp Belgrade 2026" style="aspect-ratio:16/9;width:100%;object-fit:cover;" decoding="async" fetchpriority="high" srcset="https://jonathanbossenger.com/wp-content/uploads/2026/09/WordCamp-Belgrade_-Build-your-first-AI-Powered-WordPress-plugin.jpg 1279w, https://jonathanbossenger.com/wp-content/uploads/2026/09/WordCamp-Belgrade_-Build-your-first-AI-Powered-WordPress-plugin-300x169.jpg 300w, https://jonathanbossenger.com/wp-content/uploads/2026/09/WordCamp-Belgrade_-Build-your-first-AI-Powered-WordPress-plugin-1024x576.jpg 1024w, https://jonathanbossenger.com/wp-content/uploads/2026/09/WordCamp-Belgrade_-Build-your-first-AI-Powered-WordPress-plugin-
474768x432.jpg 768w" sizes="(max-width: 1279px) 100vw, 1279px" /></a></figure> 475 476 <div class="wp-block-group post-body is-layout-flow wp-block-group-is-layout-flow"> 477 <div class="wp-block-post-date"><time datetime="2026-09-18T17:15:48+02:00">Sep 18, 2026</time></div> 478 <h2 class="wp-block-post-title has-large-font-size"><a href="https://jonathanbossenger.com/2026/09/wordcamp-belgrade-2026/" target="_self" >WordCamp Belgrade 2026</a></h2> 479 <div class="wp-block-post-excerpt"><p class="wp-block-post-excerpt__excerpt">Slides, code, and resources from my WordCamp Belgrade 2026 workshop. Slides: https://docs.google.com/presentation/d/1qDzDEWvKvgBGPeEwgO7DQp4G8xOmd97BPOiYgev_YqM/edit?usp=sharing GitHub repository: https://github.com/wptrainingteam/wp-ai-workshop-demo Plugin downloads: https://github.com/wptrainingteam/wp-ai-workshop-demo/releases</p></div> 480 </div> 481 482 </li><li class="wp-block-post post-33962 post type-post status-publish format-standard has-post-thumbnail hentry category-general"> 483 <figure class="wp-block-post-featured-image"><a href="https://jonathanbossenger.com/2026/08/home-ownership-and-the-world-wide-web/" target="_self" ><img width="1049" height="1300" src="https://jonathanbossenger.com/wp-content/uploads/2026/08/pexels-photo-20296321.jpeg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Home ownership and the world wide web" style="aspect-ratio:16/9;width:100%;object-fit:cover;" decoding="async" srcset="https://jonathanbossenger.com/wp-content/uploads/2026/08/pexels-photo-20296321.jpeg 1049w, https://jonathanbossenger.com/wp-content/uploads/2026/08/pexels-photo-20296321-242x300.jpeg 242w, https://jonathanbossenger.com/wp-content/uploads/2026/08/pexels-photo-20296321-826x1024.jpeg 826w, https://jonathanbossenger.com/wp-content/uploads/2026/08/pexels-photo-20296321-768x952.jpeg 768w" sizes="(max-width: 1049px) 100vw, 1049px" /></a></figure> 484 485 <div class="wp-block-group post-body is-layout-flow wp-block-group-is-layout-flow"> 486 <div class="wp-block-post-date"><time datetime="2026-08-22T12:28:28+02:00">Aug 22, 2026</time></div> 487 <h2 class="wp-block-post-title has-large-font-size"><a href="https://jonathanbossenger.com/2026/08/home-ownership-and-the-world-wide-web/" target="_self" >Home ownership and the world wide web</a></h2> 488 <div class="wp-block-post-excerpt"><p class="wp-block-post-excerpt__excerpt">Imagine you decide to build your own home. You save up enough money, buy a plot, hire an architect to design the house to your…</p></div> 489 </div> 490 491 </li><li class="wp-block-post post-33804 post type-post status-publish format-standard has-post-thumbnail hentry category-general"> 492 <figure class="wp-block-post-featured-image"><a href="https://jonathanbossenger.com/2026/06/phpverse-2026/" target="_self" ><img width="2560" height="1260" src="https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-scaled.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="PHPVerse 2026" style="aspect-ratio:16/9;width:100%;object-fit:cover;" decoding="async" srcset="https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-scaled.png 2560w, https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-300x148.png 300w, https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-1024x504.png 1024w, https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-768x378.png 768w, https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-1536x756.png 1536w, https://jonathanbossenger.com/wp-content/uploads/2026/06/JetBrains-PHPverse-2026-â-Bringing-the-PHP-Community-Together-06-08-2026_12_08_AM-2048x1008.png 2048w" sizes="(max-width: 2560px) 100v
492w, 2560px" /></a></figure> 493 494 <div class="wp-block-group post-body is-layout-flow wp-block-group-is-layout-flow"> 495 <div class="wp-block-post-date"><time datetime="2026-06-09T14:00:00+02:00">Jun 9, 2026</time></div> 496 <h2 class="wp-block-post-title has-large-font-size"><a href="https://jonathanbossenger.com/2026/06/phpverse-2026/" target="_self" >PHPVerse 2026</a></h2> 497 <div class="wp-block-post-excerpt"><p class="wp-block-post-excerpt__excerpt">My slides, speaker notes, and all resources from PHPVerse 2026. Slides: https://docs.google.com/presentation/d/1gFA-_yi8UA7aKyEnev37vdEgg9SaOZWl-tZQkpXg4ws/edit?usp=sharing Recording: WordPress is dead, long live WordPress! Before I dive in, I need…</p></div> 498 </div> 499 500 </li></ul> 501 </div> 502 503 504 505 <div class="wp-block-group is-content-justification-center is-layout-flex wp-container-core-group-is-layout-4d648d36 wp-block-group-is-layout-flex" style="margin-top:2.5rem"> 506 507 <p class="view-all-link-wrapper wp-block-paragraph"><a href="/post-archive/" class="view-all-link">View all posts â</a></p> 508 509 </div> 510 511 </div> 512 513</section> 514 515 516 517<section class="wp-block-group section is-layout-flow wp-block-group-is-layout-flow" id="experience"> 518 519 <div class="wp-block-group section-inner has-global-padding is-layout-constrained wp-container-core-group-is-layout-828a6807 wp-block-group-is-layout-constrained"> 520 521 <div class="wp-block-group section-header is-layout-flow wp-block-group-is-layout-flow"> 522 523 <p class="section-label wp-block-paragraph">Experience</p> 524 525 526 527 <h2 class="wp-block-heading section-title">Where I’ve worked</h2> 528 529 </div> 530 531 532 533 <div class="wp-block-group timeline is-layout-flow wp-block-group-is-layout-flow"> 534 535 <div class="wp-block-group timeline-item current is-layout-flow wp-block-group-is-layout-flow"> 536 537 <p class="timeline-date wp-block-paragraph">2022 â Present</p> 538 539 540 541 <h3 class="wp-block-heading timeline-role">WordPress Developer Advocate</h3> 542 543 544 545 <p class="timeline-company wp-block-paragraph">Automattic</p> 546 547 548 549 <p class="timeline-desc wp-block-paragraph">Started as a sponsored contributor supporting WordPress Training and Learn WordPress. Now part of the Developer Relations team, splitting time between WordPress.com, WordPress VIP, and WordPress.org, with a focus on AI.</p> 550 551 </div> 552 553 554 555 <div class="wp-block-group timeline-item is-layout-flow wp-block-group-is-layout-flow"> 556 557 <p class="timeline-date wp-block-paragraph">2021 â 2022</p> 558 559 560 561 <h3 class="wp-block-heading timeline-role">Senior Technical Writer</h3> 562 563 564 565 <p class="timeline-company wp-block-paragraph">Delicious Brains</p> 566 567 568 569 <p class="timeline-desc wp-block-paragraph">Combined a love of writing with software development experience to create developer education content. The role evolved from Developer Educator to Senior Technical Writer.</p> 570 571 </div> 572 573 574 575 <div class="wp-block-group timeline-item is-layout-flow wp-block-group-is-layout-flow"> 576 577 <p class="timeline-date wp-block-paragraph">2017 â 2020</p> 578 579 580 581 <h3 class="wp-block-heading timeline-role">Development Lead</h3> 582 583 584 585 <p class="timeline-company wp-block-paragraph">Castos</p> 586 587 588 589 <p class="timeline-desc wp-block-paragraph">Led development of a podcast hosting platform powering the Seriously Simple Podcasting plugin. Grew the team from 2 to 12, serving over 20,000 podcasters and 10,000+ customers.</p> 590 591 </div> 592 593 594 595 <div class="wp-block-group timeline-item is-layout-flow wp-block-group-is-layout-flow"> 596 597 <p class="timeline-date wp-block-paragraph">2016 â 2020</p> 598 599 600 601 <h3 class="wp-block-heading timeline-role">Expert Developer</h3> 602 603 604 605 <p class="timeline-company wp-block-paragraph">Codeable</p> 606 607 608 609 <p class="timeline-desc wp-block-paragraph">Solved technical problems for international clients, focusing on custom plugin development and theme customization.</p> 610 611 </div> 612 613 614 615 <div class="wp-block-group timeline-item is-layout-flow wp-block-group-is-layout-flow"> 616 617 <p class="timeline-date wp-block-paragraph">2004 – 2016</p> 618 619 620 621 <h3 class="wp-block-heading timeline-role">PHP Developer/Senior PHP Developer/Team lead</h3> 622 623 624 625 <p class="timeline-company wp-block-paragraph">Realmdigital, ZaPOP, Prezence, Crystal River</p> 626 627 628 629 <p class="timeline-desc wp-block-paragraph">Experience across various PHP application stacks, including Laravel, Yii, CodeIgniter, CakePHP, WordPress, Drupal, Joomla, and Moodle.</p> 630 631 </div> 632 633 </div> 634 635 </div> 636 637</section> 638 639 640 641<section class="wp-block-group section is-layout-flow wp-block-group-is-layout-flow" style="background-color:var(--bg-card)"> 642 643 <div class="wp-block-group section-inner has-global-padding is-layout-constrained wp-container-core-group-is-layout-828a6807 wp-block-group-is-layout-constrained"> 644 645 <div class="wp-block-group section-header is-layout-flow wp-block-group-is-layout-flow"> 646 647 <p class="section-label wp-block-paragraph">Community</p> 648 649 650 651 <h2 class="wp-block-heading section-title">Speaking & writing</h2> 652 653 </div> 654 655 656 657 <div class="wp-block-columns highlights-grid is-layout-flex wp-container-core-columns-is-layout-f56f613f wp-block-columns-is-layout-flex"> 658 659 <div class="wp-block-column highlight-card is-layout-flow wp-block-column-is-layout-flow"> 660 661 <h3 class="wp-block-heading">ð¤ Conference Talks</h3> 662 663 664 665 <div class="tag-list">
666 <span class="tag">WordCamp Europe ’19 ’23</span> 667 <span class="tag">WordCamp US ’25</span> 668 <span class="tag">WordCamp Cape Town ’16 ’18 ’19 ’24</span> 669 <span class="tag">WordCamp Johannesburg ’18 ’19</span> 670 <span class="tag">PHP South Africa ’17</span> 671 <span class="tag">DevConf ’22</span> 672 <span class="tag">DataConf ’24</span> 673 </div> 674 675 </div> 676 677 678 679 <div class="wp-block-column highlight-card is-layout-flow wp-block-column-is-layout-flow"> 680 681 <h3 class="wp-block-heading">âï¸ Published Writing</h3> 682 683 684 685 <ul class="writing-list wp-block-list"> 686 687 <li><a href="https://wordpress.com/blog/author/jbossenger/">WordPress.com Blog</a></li> 688 689 690 691 <li><a href="https://developer.wordpress.org/news/">WordPress Developer Blog</a></li> 692 693 694 695 <li><a href="https://jetpack.com/resources/">Jetpack Blog</a></li> 696 697 698 699 <li><a href="https://wptavern.com/">WP Tavern</a></li> 700 701 702 703 <li><a href="https://www.smashingmagazine.com/">Smashing Magazine</a></li> 704 705 706 </ul> 707 708 </div> 709 710 </div> 711 712 </div> 713 714</section> 715 716 717 718<section class="wp-block-group section newsletter-section is-layout-flow wp-block-group-is-layout-flow"> 719 720 <div class="wp-block-group section-inner has-global-padding is-layout-constrained wp-container-core-group-is-layout-828a6807 wp-block-group-is-layout-constrained"> 721 722 <div class="wp-block-group newsletter-card is-layout-flow wp-block-group-is-layout-flow"> 723 724 <h2 class="wp-block-heading has-text-align-center">Dev & Deploy Newsletter</h2> 725 726 727 728 <p class="has-text-align-center newsletter-description wp-block-paragraph">WordPress development news curated by me, delivered to your inbox weekly. Covering tools, tutorials, and the latest in the WordPress ecosystem.</p> 729 730 731 732 <div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-20959078 wp-block-buttons-is-layout-flex"> 733 734 <div class="wp-block-button newsletter-btn"><a class="wp-block-button__link wp-element-button" href="/2026/02/sign-up-for-my-wordpress-development-newsletter/">Subscribe now â</a></div> 735 736 </div> 737 738 </div> 739 740 </div> 741 742</section> 743 744 745</main> 746 747 748<footer class="wp-block-template-part"> 749<footer class="wp-block-group site-footer is-layout-flow wp-block-group-is-layout-flow"> 750 751 <div class="wp-block-group footer-inner is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-ce442f2e wp-block-group-is-layout-flex"> 752 753 <p class="footer-text wp-block-paragraph">© 2026 Jonathan Bossenger · Licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> · Powered by <a href="https://wordpress.com">WordPress</a> · Theme source on <a href="https://github.com/jonathanbossenger/developer-advocate">GitHub</a></p> 754 755 756 757 <ul class="wp-block-social-links footer-social is-style-logos-only has-icon-color is-layout-flex wp-container-core-social-links-is-layout-a03d61f4 wp-block-social-links-is-layout-flex"> 758 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-github has-contrast-color wp-block-social-link"><a href="https://github.com/jonathanbossenger" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li> 759 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-youtube has-contrast-color wp-block-social-link"><a href="https://www.youtube.com/@jon_bossenger" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
759<path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li> 760 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-linkedin has-contrast-color wp-block-social-link"><a href="https://www.linkedin.com/in/jonathanbossenger/" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li> 761 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-twitch has-contrast-color wp-block-social-link"><a href="https://www.twitch.tv/jonathanbossenger" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M16.499,8.089h-1.636v4.91h1.636V8.089z M12,8.089h-1.637v4.91H12V8.089z M4.228,3.178L3,6.451v13.092h4.499V22h2.456 l2.454-2.456h3.681L21,14.636V3.178H4.228z M19.364,13.816l-2.864,2.865H12l-2.453,2.453V16.68H5.863V4.814h13.501V13.816z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Twitch</span></a></li> 762 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-x has-contrast-color wp-block-social-link"><a href="https://x.com/jon_bossenger" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li> 763 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-bluesky has-contrast-color wp-block-social-link"><a href="https://bsky.app/profile/jonathanbossenger.com" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M6.3,4.2c2.3,1.7,4.8,5.3,5.7,7.2.9-1.9,3.4-5.4,5.7-7.2,1.7-1.3,4.3-2.2,4.3.9s-.4,5.2-.6,5.9c-.7,2.6-3.3,3.2-5.6,2.8,4,.7,5.1,3,2.9,5.3-5,5.2-6.7-2.8-6.7-2.8,0,0-1.7,8-6.7,2.8-2.2-2.3-1.2-4.6,2.9-5.3-2.3.4-4.9-.3-5.6-2.8-.2-.7-.6-5.3-.6-5.9,0-3.1,2.7-2.1,4.3-.9h0Z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Bluesky</span></a></li> 764 <li style="color:var(--text-muted)" class="wp-social-link wp-social-link-mastodon has-contrast-color wp-block-social-link"><a href="https://fosstodon.org/@jonathanbossenger" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M23.193 7.879c0-5.206-3.411-6.732-3.411-6.732C18.062.357 15.108.025 12.041 0h-.076c-3.068.025-6.02.357-7.74 1.147 0 0-3.411 1.526-3.411 6.732 0 1.192-.023 2.618.015 4.129.124 5.092.934 10.109 5.641 11.355 2.17.574 4.034.695 5.535.612 2.722-.15 4.25-.972 4.25-.972l-.09-1.975s-1.945.613-4.129.539c-2.165-.074-4.449-.233-4.799-2.891a5.499 5.499 0 0 1-.048-.745s2.125.52 4.817.643c1.646.075 3.19-.097 4.758-.283 3.007-.359 5.625-2.212 5.954-3.905.517-2.665.475-6.507.475-6.507zm-4.024 6.709h-2.497V8.469c0-1.29-.543-1.944-1.628-1.944-1.2 0-1.802.776-1.802 2.312v3.349h-2.483v-3.35c0-1.536-.602-2.312-1.802-2.312-1.085 0-1.628.655-1.628 1.944v6.119H4.832V8.284c0-1.289.328-2.313.987-3.07.68-.758 1.569-1.146 2.674-1.146 1.278 0 2.246.491 2.886 1.474L12 6.585l.622-1.043c.64-.983 1.608-1.474 2.886-1.474 1.104 0 1.994.388 2.674 1.146.658.757.986 1.781.986 3.07v6.304z"/></svg><span class="wp-block-social-link-label screen-reader-text">Mastodon</span></a></li> 765 </ul> 766 767 </div> 768 769</footer> 770 771</footer> 772</div>
773<script type="speculationrules"> 774{"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/developer-advocate/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 775</script>
vendor: 1 bytes, line 775
775
776<script data-wp-router-options="{"loadOnClientNavigation":true}" fetchpriority="low" id="@wordpress/block-library/navigation/view-js-module" src="https://jonathanbossenger.com/wp-content/plugins/gutenberg/build/modules/block-library/navigation/view.min.js?ver=5381c0a3642be76565c7" type="module"></script>
776 777
777<script type="module"> 778 import { Workbox } from "https:\/\/jonathanbossenger.com\/wp-content\/plugins\/pwa\/wp-includes\/js\/workbox-v7.3.0\/workbox-window.prod.js"; 779 780 if ( 'serviceWorker' in navigator ) { 781 window.wp = window.wp || {}; 782 window.wp.serviceWorkerWindow = new Workbox( 783 "https:\/\/jonathanbossenger.com\/wp.serviceworker", 784 {"scope":"\/"} ); 785 window.wp.serviceWorkerWindow.register(); 786 } 787 </script>
787 788
788<script id="underscore-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/underscore.min.js"></script>
vendor: 1 bytes, line 788
788
789<script id="backbone-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/backbone.min.js"></script>
vendor: 1 bytes, line 789
789
790<script id="wp-api-request-js-extra"> 791var wpApiSettings = {"root":"https://jonathanbossenger.com/wp-json/","nonce":"347b06146f","versionString":"wp/v2/"}; 792//# sourceURL=wp-api-request-js-extra 793</script>
vendor: 1 bytes, line 793
793
794<script id="wp-api-request-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/api-request.min.js"></script>
vendor: 1 bytes, line 794
794
795<script id="wp-api-js" src="https://c0.wp.com/c/7.1.2/wp-includes/js/wp-api.min.js"></script>
vendor: 1 bytes, line 795
795
796<script id="wp-interactive-game-axios-js" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js?ver=1.1.2"></script>
vendor: 1 bytes, line 796
796
797<script id="wp-interactive-game-js" src="https://jonathanbossenger.com/wp-content/plugins/wp-interactive-game/assets/dodge.js?ver=1.0.3"></script>
vendor: 1 bytes, line 797
797
798<script id="jb-theme-toggle-js" src="https://jonathanbossenger.com/wp-content/themes/developer-advocate/assets/js/theme-toggle.js?ver=1.0.1"></script>
vendor: 1 bytes, line 798
798
799<script id="jetpack-stats-js-before"> 800_stq = window._stq || []; 801_stq.push([ "view", {"v":"ext","blog":"99480728","post":"30149","tz":"2","srv":"jonathanbossenger.com","hp":"atomic","ac":"3","amp":"0","j":"1:16.3-a.7"} ]); 802_stq.push([ "clickTrackerInit", "99480728", "30149" ]); 803//# sourceURL=jetpack-stats-js-before 804</script>
vendor: 1 bytes, line 804
804
805<script data-wp-strategy="defer" defer fetchpriority="low" id="jetpack-stats-js" src="https://stats.wp.com/e-202640.js"></script>
vendor: 1 bytes, line 805
805
806<script id="wp-emoji-settings" type="application/json"> 807{"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://jonathanbossenger.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}} 808</script>
vendor: 1 bytes, line 808
808
809<script type="module"> 810/*! This file is auto-generated */ 811var 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)))}); 812//# sourceURL=https://jonathanbossenger.com/wp-includes/js/wp-emoji-loader.min.js 813</script>
813 814
814<script type="text/javascript"> 815 (function() { 816 var t = document.createElement( 'script' ); 817 t.type = 'text/javascript'; 818 t.async = true; 819 t.id = 'gauges-tracker'; 820 t.setAttribute( 'data-site-id', '62751cc389e2175b997460d1' ); 821 t.src = '//secure.gaug.es/track.js'; 822 var s = document.getElementsByTagName( 'script' )[0]; 823 s.parentNode.insertBefore( t, s ); 824 })(); 825 </script>
825 826 </body> 827</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.