PageSourceSearch

https://jonathanbossenger.com/

html jonathanbossenger.com collected 2026-10-02 05:11:01 UTC 113,218 bytes, 827 lines download raw bytes

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 &#8211; 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 &raquo; Feed" href="https://jonathanbossenger.com/feed/" />
28<link rel="alternate" type="application/rss+xml" title="Jonathan Bossenger &raquo; 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&#038;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&hellip;" />
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="{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: 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="{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: 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="{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: 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="{ &quot;submenuOpenedBy&quot;: { &quot;click&quot;: false, &quot;hover&quot;: false, &quot;focus&quot;: false }, &quot;type&quot;: &quot;submenu&quot;, &quot;modal&quot;: null, &quot;previousFocus&quot;: 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 &middot; 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&#8217;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 &amp; 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 &amp; 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 &amp; 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 &amp; 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:&nbsp;https://docs.google.com/presentation/d/1qDzDEWvKvgBGPeEwgO7DQp4G8xOmd97BPOiYgev_YqM/edit?usp=sharing GitHub repository:&nbsp;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&hellip;</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&hellip;</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&#8217;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 &#8211; 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 &amp; 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 &#8217;19 &#8217;23</span>
667          <span class="tag">WordCamp US &#8217;25</span>
668          <span class="tag">WordCamp Cape Town &#8217;16 &#8217;18 &#8217;19 &#8217;24</span>
669          <span class="tag">WordCamp Johannesburg &#8217;18 &#8217;19</span>
670          <span class="tag">PHP South Africa &#8217;17</span>
671          <span class="tag">DevConf &#8217;22</span>
672          <span class="tag">DataConf &#8217;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 &amp; 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">&copy; 2026 Jonathan Bossenger &middot; Licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> &middot; Powered by <a href="https://wordpress.com">WordPress</a> &middot; 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="{&quot;loadOnClientNavigation&quot;: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.