<!DOCTYPE html>
<html lang="en-US">
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name='robots' content='max-image-preview:large' />
<title>Matthew Bass &#8211; Musings on software and life&#8230;</title>
<link rel="alternate" type="application/rss+xml" title="Matthew Bass &raquo; Feed" href="https://www.matthewbass.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Matthew Bass &raquo; Comments Feed" href="https://www.matthewbass.com/comments/feed/" />
<style id='wp-img-auto-sizes-contain-inline-css'>
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<style id='wp-block-site-title-inline-css'>
.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}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/site-title/style.min.css */
</style>
<style id='wp-block-page-list-inline-css'>
.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.wp-block-page-list{box-sizing:border-box}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/page-list/style.min.css */
</style>
<link rel='stylesheet' id='wp-block-navigation-css' href='http://www.matthewbass.com/wp-includes/blocks/navigation/style.min.css?ver=6.9' media='all' />
<style id='wp-block-group-inline-css'>
.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/group/style.min.css */
</style>
<style id='wp-block-post-title-inline-css'>
.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title :where(a){display:inline-block;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/post-title/style.min.css */
</style>
<style id='wp-block-post-terms-inline-css'>
.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/post-terms/style.min.css */
</style>
<style id='wp-block-post-date-inline-css'>
.wp-block-post-date{box-sizing:border-box}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/post-date/style.min.css */
</style>
<style id='wp-block-post-content-inline-css'>
.wp-block-post-content{display:flow-root}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/post-content/style.min.css */
</style>
<style id='wp-block-post-template-inline-css'>
.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.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-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}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/post-template/style.min.css */
</style>
<style id='wp-block-spacer-inline-css'>
.wp-block-spacer{clear:both}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/spacer/style.min.css */
</style>
<style id='wp-block-social-links-inline-css'>
.wp-block-social-links{background:none;box-sizing:border-box;margin-left:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block}@media not (prefers-reduced-motion){.wp-block-social-link{transition:transform .1s ease}}.wp-block-social-link{height:auto}.wp-block-social-link a{align-items:center;display:flex;line-height:0}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link.wp-social-link{display:inline-block;margin:0;padding:0}.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link.wp-social-link .wp-block-social-link-anchor:visited{color:currentColor;fill:currentColor}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link{background-color:#f0f0f0;color:#444}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-amazon{background-color:#f90;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-behance{background-color:#0757fe;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-bluesky{background-color:#0a7aff;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-discord{background-color:#5865f2;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-etsy{background-color:#f45800;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-facebook{background-color:#0866ff;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-flickr{background-color:#0461dd;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-foursquare{background-color:#e65678;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-github{background-color:#24292d;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-google{background-color:#ea4434;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-gravatar{background-color:#1d4fc4;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-instagram{background-color:#f00075;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-medium{background-color:#000;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-meetup{background-color:#f6405f;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-patreon{background-color:#000;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-pinterest{background-color:#e60122;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-pocket{background-color:#ef4155;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-reddit{background-color:#ff4500;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-skype{background-color:#0478d7;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-spotify{background-color:#1bd760;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-telegram{background-color:#2aabee;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-threads{background-color:#000;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-tiktok{background-color:#000;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-tumblr{background-color:#011835;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-twitch{background-color:#6440a4;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-vk{background-color:#4680c2;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-x{background-color:#000;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-yelp{background-color:#d32422;color:#fff}:where(.wp-block-social-links:not(.is-style-logos-only)) .wp-social-link-youtube{background-color:red;color:#fff}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link{background:none}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link svg{height:1.25em;width:1.25em}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-amazon{color:#f90}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-bandcamp{color:#1ea0c3}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-behance{color:#0757fe}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-bluesky{color:#0a7aff}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-codepen{color:#1e1f26}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-deviantart{color:#02e49b}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-discord{color:#5865f2}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-dribbble{color:#e94c89}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-dropbox{color:#4280ff}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-etsy{color:#f45800}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-facebook{color:#0866ff}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-fivehundredpx{color:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-flickr{color:#0461dd}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-foursquare{color:#e65678}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-github{color:#24292d}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-goodreads{color:#382110}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-google{color:#ea4434}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-gravatar{color:#1d4fc4}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-instagram{color:#f00075}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-lastfm{color:#e21b24}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-linkedin{color:#0d66c2}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-mastodon{color:#3288d4}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-medium{color:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-meetup{color:#f6405f}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-patreon{color:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-pinterest{color:#e60122}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-pocket{color:#ef4155}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-reddit{color:#ff4500}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-skype{color:#0478d7}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-snapchat{color:#fff;stroke:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-soundcloud{color:#ff5600}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-spotify{color:#1bd760}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-telegram{color:#2aabee}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-threads{color:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-tiktok{color:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-tumblr{color:#011835}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-twitch{color:#6440a4}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-twitter{color:#1da1f2}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-vimeo{color:#1eb7ea}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-vk{color:#4680c2}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-whatsapp{color:#25d366}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-wordpress{color:#3499cd}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-x{color:#000}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-yelp{color:#d32422}:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}:root :where(.wp-block-social-links .wp-social-link a){padding:.25em}:root :where(.wp-block-social-links.is-style-logos-only .wp-social-link a){padding:0}:root :where(.wp-block-social-links.is-style-pill-shape .wp-social-link a){padding-left:.6666666667em;padding-right:.6666666667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/social-links/style.min.css */
</style>
<style id='wp-block-separator-inline-css'>
@charset "UTF-8";.wp-block-separator{border:none;border-top:2px solid}:root :where(.wp-block-separator.is-style-dots){height:auto;line-height:1;text-align:center}:root :where(.wp-block-separator.is-style-dots):before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.wp-block-separator.is-style-dots{background:none!important;border:none!important}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/separator/style.min.css */
</style>
<style id='wp-block-heading-inline-css'>
h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/heading/style.min.css */
</style>
<style id='wp-block-paragraph-inline-css'>
.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/paragraph/style.min.css */
</style>
<style id='wp-block-search-inline-css'>
.wp-block-search__button{margin-left:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{height:1.25em;min-height:24px;min-width:24px;width:1.25em;fill:currentColor;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__button{box-sizing:border-box;display:flex;flex-shrink:0;justify-content:center;margin-left:0;max-width:100%}.wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search.wp-block-search__button-only .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden,.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search.wp-block-search__button-only.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}:where(.wp-block-search__input){appearance:none;border:1px solid #949494;flex-grow:1;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important;text-transform:inherit}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){background-color:#fff;border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block[data-align=right] .wp-block-search.wp-block-search__button-only .wp-block-search__inside-wrapper{float:right}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/search/style.min.css */
</style>
<style id='wp-block-columns-inline-css'>
.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:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.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%}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/columns/style.min.css */
</style>
<style id='wp-block-post-featured-image-inline-css'>
.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:initial}.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%}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/post-featured-image/style.min.css */
</style>
<style id='wp-block-query-pagination-inline-css'>
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination.aligncenter{justify-content:center}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/query-pagination/style.min.css */
</style>
<style id='wp-block-site-tagline-inline-css'>
.wp-block-site-tagline{box-sizing:border-box}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/site-tagline/style.min.css */
</style>
<style id='wp-block-navigation-link-inline-css'>
.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}
/*# sourceURL=http://www.matthewbass.com/wp-includes/blocks/navigation-link/style.min.css */
</style>
<style id='wp-emoji-styles-inline-css'>

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
/*# sourceURL=wp-emoji-styles-inline-css */
</style>
<style id='wp-block-library-inline-css'>
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--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)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.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;padding:0;position:absolute;width:1px;word-wrap: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-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([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}}
/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
</style>
<style id='global-styles-inline-css'>
: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: #FFFFFF;--wp--preset--color--contrast: #111111;--wp--preset--color--accent-1: #FFEE58;--wp--preset--color--accent-2: #F6CFF4;--wp--preset--color--accent-3: #503AA8;--wp--preset--color--accent-4: #686868;--wp--preset--color--accent-5: #FBFAF3;--wp--preset--color--accent-6: color-mix(in srgb, currentColor 20%, transparent);--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%);--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(1rem, 1rem + ((1vw - 0.2rem) * 0.196), 1.125rem);--wp--preset--font-size--large: clamp(1.125rem, 1.125rem + ((1vw - 0.2rem) * 0.392), 1.375rem);--wp--preset--font-size--x-large: clamp(1.75rem, 1.75rem + ((1vw - 0.2rem) * 0.392), 2rem);--wp--preset--font-size--xx-large: clamp(2.15rem, 2.15rem + ((1vw - 0.2rem) * 1.333), 3rem);--wp--preset--font-family--manrope: Manrope, sans-serif;--wp--preset--font-family--fira-code: "Fira Code", monospace;--wp--preset--spacing--20: 10px;--wp--preset--spacing--30: 20px;--wp--preset--spacing--40: 30px;--wp--preset--spacing--50: clamp(30px, 5vw, 50px);--wp--preset--spacing--60: clamp(30px, 7vw, 70px);--wp--preset--spacing--70: clamp(50px, 7vw, 90px);--wp--preset--spacing--80: clamp(70px, 10vw, 140px);--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);}:root { --wp--style--global--content-size: 645px;--wp--style--global--wide-size: 1340px; }: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.2rem; 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.2rem; }: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.2rem;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.2rem;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 1.2rem;}:root :where(.is-layout-grid){gap: 1.2rem;}.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 > :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--manrope);font-size: var(--wp--preset--font-size--large);font-weight: 300;letter-spacing: -0.1px;line-height: 1.4;--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: currentColor;text-decoration: underline;}:root :where(a:where(:not(.wp-element-button)):hover){text-decoration: none;}h1, h2, h3, h4, h5, h6{font-weight: 400;letter-spacing: -0.1px;line-height: 1.125;}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);}h4{font-size: var(--wp--preset--font-size--medium);}h5{font-size: var(--wp--preset--font-size--small);letter-spacing: 0.5px;}h6{font-size: var(--wp--preset--font-size--small);font-weight: 700;letter-spacing: 1.4px;text-transform: uppercase;}:root :where(.wp-element-button, .wp-block-button__link){background-color: var(--wp--preset--color--contrast);border-width: 0;color: var(--wp--preset--color--base);font-family: inherit;font-size: var(--wp--preset--font-size--medium);font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: 1rem;padding-right: 2.25rem;padding-bottom: 1rem;padding-left: 2.25rem;text-decoration: none;text-transform: inherit;}:root :where(.wp-element-button:hover, .wp-block-button__link:hover){background-color: color-mix(in srgb, var(--wp--preset--color--contrast) 85%, transparent);border-color: transparent;color: var(--wp--preset--color--base);}:root :where(.wp-element-button:focus, .wp-block-button__link:focus){outline-color: var(--wp--preset--color--accent-4);outline-offset: 2px;}:root :where(.wp-element-caption, .wp-block-audio figcaption, .wp-block-embed figcaption, .wp-block-gallery figcaption, .wp-block-image figcaption, .wp-block-table figcaption, .wp-block-video figcaption){font-size: var(--wp--preset--font-size--small);line-height: 1.4;}.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-1-color{color: var(--wp--preset--color--accent-1) !important;}.has-accent-2-color{color: var(--wp--preset--color--accent-2) !important;}.has-accent-3-color{color: var(--wp--preset--color--accent-3) !important;}.has-accent-4-color{color: var(--wp--preset--color--accent-4) !important;}.has-accent-5-color{color: var(--wp--preset--color--accent-5) !important;}.has-accent-6-color{color: var(--wp--preset--color--accent-6) !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-1-background-color{background-color: var(--wp--preset--color--accent-1) !important;}.has-accent-2-background-color{background-color: var(--wp--preset--color--accent-2) !important;}.has-accent-3-background-color{background-color: var(--wp--preset--color--accent-3) !important;}.has-accent-4-background-color{background-color: var(--wp--preset--color--accent-4) !important;}.has-accent-5-background-color{background-color: var(--wp--preset--color--accent-5) !important;}.has-accent-6-background-color{background-color: var(--wp--preset--color--accent-6) !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-1-border-color{border-color: var(--wp--preset--color--accent-1) !important;}.has-accent-2-border-color{border-color: var(--wp--preset--color--accent-2) !important;}.has-accent-3-border-color{border-color: var(--wp--preset--color--accent-3) !important;}.has-accent-4-border-color{border-color: var(--wp--preset--color--accent-4) !important;}.has-accent-5-border-color{border-color: var(--wp--preset--color--accent-5) !important;}.has-accent-6-border-color{border-color: var(--wp--preset--color--accent-6) !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;}.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-manrope-font-family{font-family: var(--wp--preset--font-family--manrope) !important;}.has-fira-code-font-family{font-family: var(--wp--preset--font-family--fira-code) !important;}
:root :where(.wp-block-columns-is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.wp-block-columns-is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-flow) > *{margin-block-start: var(--wp--preset--spacing--50);margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.wp-block-columns-is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-constrained) > *{margin-block-start: var(--wp--preset--spacing--50);margin-block-end: 0;}:root :where(.wp-block-columns-is-layout-flex){gap: var(--wp--preset--spacing--50);}:root :where(.wp-block-columns-is-layout-grid){gap: var(--wp--preset--spacing--50);}
:root :where(.wp-block-post-date){color: var(--wp--preset--color--accent-4);font-size: var(--wp--preset--font-size--small);}
:root :where(.wp-block-post-date a:where(:not(.wp-element-button))){color: var(--wp--preset--color--accent-4);text-decoration: none;}
:root :where(.wp-block-post-date a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
:root :where(.wp-block-post-terms){font-size: var(--wp--preset--font-size--small);font-weight: 600;}:root :where(.wp-block-post-terms a){white-space: nowrap;}
:root :where(.wp-block-post-title a:where(:not(.wp-element-button))){text-decoration: none;}
:root :where(.wp-block-post-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
:root :where(.wp-block-query-pagination){font-size: var(--wp--preset--font-size--medium);font-weight: 500;}
:root :where(.wp-block-search .wp-block-search__label, .wp-block-search .wp-block-search__input, .wp-block-search .wp-block-search__button){font-size: var(--wp--preset--font-size--medium);line-height: 1.6;}:root :where(.wp-block-search .wp-block-search__input){border-radius:3.125rem;padding-left:1.5625rem;padding-right:1.5625rem;border-color:var(--wp--preset--color--accent-6);}
:root :where(.wp-block-search .wp-element-button,.wp-block-search  .wp-block-button__link){border-radius: 3.125rem;margin-left: 1.125rem;}
:root :where(.wp-block-search .wp-element-button:hover,.wp-block-search  .wp-block-button__link:hover){border-color: transparent;}
:root :where(.wp-block-separator){border-color: currentColor;border-width: 0 0 1px 0;border-style: solid;color: var(--wp--preset--color--accent-6);}
:root :where(.wp-block-site-tagline){font-size: var(--wp--preset--font-size--medium);}
:root :where(.wp-block-site-title){font-weight: 700;letter-spacing: -.5px;}
:root :where(.wp-block-site-title a:where(:not(.wp-element-button))){text-decoration: none;}
:root :where(.wp-block-site-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
:root :where(.wp-block-navigation){font-size: var(--wp--preset--font-size--medium);}
:root :where(.wp-block-navigation a:where(:not(.wp-element-button))){text-decoration: none;}
:root :where(.wp-block-navigation a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
/*# sourceURL=global-styles-inline-css */
</style>
<style id='core-block-supports-inline-css'>
.wp-container-core-navigation-is-layout-87cad8fb{gap:0;flex-direction:column;align-items:flex-end;}.wp-container-core-group-is-layout-7db9d80f > .alignfull{margin-right:calc(0px * -1);margin-left:calc(0px * -1);}.wp-container-core-group-is-layout-58c3a1c0{flex-wrap:nowrap;justify-content:space-between;align-items:center;}.wp-container-core-group-is-layout-0ecb481e{gap:var(--wp--preset--spacing--20);flex-direction:column;align-items:stretch;}.wp-container-core-columns-is-layout-cbe57604{flex-wrap:nowrap;gap:2em var(--wp--preset--spacing--50);}.wp-container-core-group-is-layout-b371d99e{gap:var(--wp--preset--spacing--20);}.wp-container-core-group-is-layout-d275371d{gap:var(--wp--preset--spacing--30);flex-direction:column;align-items:stretch;}.wp-container-content-b864c3d2{flex-basis:180px;}.wp-container-core-columns-is-layout-698ba505{flex-wrap:nowrap;gap:2em var(--wp--preset--spacing--50);}.wp-container-core-query-pagination-is-layout-b2891da8{justify-content:space-between;}.wp-container-core-group-is-layout-7e49ac6c > .alignfull{margin-right:calc(0px * -1);margin-left:calc(0px * -1);}.wp-container-core-group-is-layout-7e49ac6c > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-7e49ac6c > * + *{margin-block-start:var(--wp--preset--spacing--20);margin-block-end:0;}.wp-container-core-navigation-is-layout-98bb686d{gap:var(--wp--preset--spacing--20);flex-direction:column;align-items:flex-start;}.wp-container-core-group-is-layout-19858539{gap:var(--wp--preset--spacing--80);}.wp-container-core-group-is-layout-e5edad21{justify-content:space-between;align-items:flex-start;}.wp-container-core-group-is-layout-9366075c{justify-content:space-between;}
/*# sourceURL=core-block-supports-inline-css */
</style>
<style id='wp-block-template-skip-link-inline-css'>

		.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;
		}

		.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;
		}
/*# sourceURL=wp-block-template-skip-link-inline-css */
</style>
<style id='twentytwentyfive-style-inline-css'>
a{text-decoration-thickness:1px!important;text-underline-offset:.1em}:where(.wp-site-blocks :focus){outline-style:solid;outline-width:2px}.wp-block-navigation .wp-block-navigation-submenu .wp-block-navigation-item:not(:last-child){margin-bottom:3px}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation-item__content{outline-offset:4px}.wp-block-navigation .wp-block-navigation-item ul.wp-block-navigation__submenu-container .wp-block-navigation-item__content{outline-offset:0}blockquote,caption,figcaption,h1,h2,h3,h4,h5,h6,p{text-wrap:pretty}.more-link{display:block}:where(pre){overflow-x:auto}
/*# sourceURL=http://www.matthewbass.com/wp-content/themes/twentytwentyfive/style.min.css */
</style>
<link rel="https://api.w.org/" href="https://www.matthewbass.com/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.matthewbass.com/xmlrpc.php?rsd" />
<script type="importmap" id="wp-importmap">
{"imports":{"@wordpress/interactivity":"http://www.matthewbass.com/wp-includes/js/dist/script-modules/interactivity/index.min.js?ver=8964710565a1d258501f"}}
</script>
<link rel="modulepreload" href="http://www.matthewbass.com/wp-includes/js/dist/script-modules/interactivity/index.min.js?ver=8964710565a1d258501f" id="@wordpress/interactivity-js-modulepreload" fetchpriority="low">
<style class='wp-fonts-local'>
@font-face{font-family:Manrope;font-style:normal;font-weight:200 800;font-display:fallback;src:url('http://www.matthewbass.com/wp-content/themes/twentytwentyfive/assets/fonts/manrope/Manrope-VariableFont_wght.woff2') format('woff2');}
@font-face{font-family:"Fira Code";font-style:normal;font-weight:300 700;font-display:fallback;src:url('http://www.matthewbass.com/wp-content/themes/twentytwentyfive/assets/fonts/fira-code/FiraCode-VariableFont_wght.woff2') format('woff2');}
</style>
</head>

<body class="home blog wp-embed-responsive wp-theme-twentytwentyfive">

<div class="wp-site-blocks"><header class="wp-block-template-part">
<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;padding-top:0;padding-bottom:0">
	
	<div class="wp-block-group alignwide is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-58c3a1c0 wp-block-group-is-layout-flex" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
		<p style="font-size:clamp(50.171px, 3.136rem + ((1vw - 3.2px) * 4.885), 100px);line-height:1.2;" class="wp-block-site-title"><a href="https://www.matthewbass.com" target="_self" rel="home" aria-current="page">Matthew Bass</a></p>
		
		<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7db9d80f wp-block-group-is-layout-constrained" style="padding-right:0;padding-left:0">
			<nav class="is-responsive items-justified-right is-vertical wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-87cad8fb wp-block-navigation-is-layout-flex" 
		 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" 
				data-wp-on--click="actions.openMenuOnClick"
				data-wp-on--keydown="actions.handleMenuKeydown"
			><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M4 7.5h16v1.5H4z"></path><path d="M4 15h16v1.5H4z"></path></svg></button>
				<div class="wp-block-navigation__responsive-container  has-text-color has-contrast-color has-background has-base-background-color"  id="modal-1" 
				data-wp-class--has-modal-open="state.isMenuOpen"
				data-wp-class--is-menu-open="state.isMenuOpen"
				data-wp-watch="callbacks.initMenu"
				data-wp-on--keydown="actions.handleMenuKeydown"
				data-wp-on--focusout="actions.handleMenuFocusout"
				tabindex="-1"
			>
					<div class="wp-block-navigation__responsive-close" tabindex="-1">
						<div class="wp-block-navigation__responsive-dialog" 
				data-wp-bind--aria-modal="state.ariaModal"
				data-wp-bind--aria-label="state.ariaLabel"
				data-wp-bind--role="state.roleAttribute"
			>
							<button aria-label="Close menu" class="wp-block-navigation__responsive-container-close" 
				data-wp-on--click="actions.closeMenuOnClick"
			><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>
							<div class="wp-block-navigation__responsive-container-content" 
				data-wp-watch="callbacks.focusFirstElement"
			 id="modal-1-content">
								<ul class="wp-block-navigation__container is-responsive items-justified-right is-vertical wp-block-navigation"><ul class="wp-block-page-list"><li class="wp-block-pages-list__item wp-block-navigation-item open-on-hover-click"><a class="wp-block-pages-list__item__link wp-block-navigation-item__content" href="https://www.matthewbass.com/published-articles/">Published Articles</a></li><li class="wp-block-pages-list__item wp-block-navigation-item open-on-hover-click"><a class="wp-block-pages-list__item__link wp-block-navigation-item__content" href="https://www.matthewbass.com/speaking-engagements/">Speaking Engagements</a></li></ul></ul>
							</div>
						</div>
					</div>
				</div></nav>
		</div>
		
	</div>
	
</div>


</header>


<main class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50)">
<div class="wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-cbe57604 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:75%">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-1168 post type-post status-publish format-standard hentry category-programming category-technology">



<div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-0ecb481e wp-block-group-is-layout-flex" style="padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)"><h1 class="wp-block-post-title"><a href="https://www.matthewbass.com/2015/06/20/cors-woes-on-heroku/" target="_self" >CORS woes on Heroku</a></h1>

<div style="text-transform:uppercase;letter-spacing:1.4px" class="taxonomy-category wp-block-post-terms"><a href="https://www.matthewbass.com/category/programming/" rel="tag">Programming</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.matthewbass.com/category/technology/" rel="tag">Technology</a></div>

<div class="wp-block-post-date"><time datetime="2015-06-20T21:00:09-04:00"><a href="https://www.matthewbass.com/2015/06/20/cors-woes-on-heroku/">June 20, 2015</a></time></div>

<div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow"><p>After spending the past 4 hours attempting to solve what boiled down to a rather simple problem, I figure I&#8217;d better blog about it to save someone else the time and effort.</p>
<p>If you&#8217;ve been leveraging Passenger&#8217;s new &#8211;nginx-config-template command line option to add CORS headers to static assets served from a Rails app hosted on Heroku, and the CORS headers recently disappeared under mysterious circumstances&#8230; read on.</p>
<p>I&#8217;ve been using the <a href="http://nisdom.com/blog/2014/09/13/cors-font-issues-with-rails/">method described here</a> to add CORS headers to custom fonts served from a Heroku-hosted Rails app that&#8217;s proxied by Nginx which handles serving static files. I recently updated to Rails 4.2.2 and suddenly, my custom fonts (.woff and .woff2 files) no longer had CORS headers on them.</p>
<p>After the aforementioned hours spent scratching my head, I discovered that the latest version of the sprockets gem is generating asset digests that are 64 chars in length, where previously they had been 32. Nginx&#8217;s default regexp for identifying requests for static assets assumes the digest will be 32 chars long, like so:</p>
<pre class="brush: plain; title: ; notranslate" title="">
# Rails asset pipeline support.
location ~ &quot;^/assets/.+-&#x5B;0-9a-f]{32}\..+&quot; {
  error_page 490 = @static_asset;
  error_page 491 = @dynamic_request;
  recursive_error_pages on;&lt;/code&gt;

  if (-f $request_filename) {
    return 490;
  }
  if (!-f $request_filename) {
    return 491;
  }
}
</pre>
<p>Changing the regexp to recognize digests that are 64 chars in length immediately solved the problem:</p>
<pre class="brush: plain; title: ; notranslate" title="">
location ~ &quot;^/assets/.+-&#x5B;0-9a-f]{64}\..+&quot; {
   ...
}
</pre>
<p>I had to laugh after something so stupid and silly cost me a good chunk of my Saturday to debug. But at least it&#8217;s working now. My statically served custom fonts have the correct CORS headers and Chrome and Firefox are happy again.</p>
</div></div>

</li></ul></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:25%">
<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-social-links is-layout-flex wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-x  wp-block-social-link"><a href="https://x.com/matticatious" 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>

<li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a href="https://www.facebook.com/matthew.bass" 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.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a href="https://www.linkedin.com/in/mbass/" 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>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a href="https://github.com/pelargir" 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>

<li class="wp-social-link wp-social-link-mail  wp-block-social-link"><a href="mailto:matt@matthewbass.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="M19,5H5c-1.1,0-2,.9-2,2v10c0,1.1.9,2,2,2h14c1.1,0,2-.9,2-2V7c0-1.1-.9-2-2-2zm.5,12c0,.3-.2.5-.5.5H5c-.3,0-.5-.2-.5-.5V9.8l7.5,5.6,7.5-5.6V17zm0-9.1L12,13.6,4.5,7.9V7c0-.3.2-.5.5-.5h14c.3,0,.5.2.5.5v.9z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Mail</span></a></li></ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Need help?</h2>



<p class="is-style-default">I&#8217;m an independent software developer available for consulting, contract work, or training. <a href="mailto:matt@matthewbass.com">Contact me</a> if you&#8217;re interested.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<form role="search" method="get" action="https://www.matthewbass.com/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search"    ><label class="wp-block-search__label" for="wp-block-search__input-2" >Search</label><div class="wp-block-search__inside-wrapper" ><input class="wp-block-search__input" id="wp-block-search__input-2" placeholder="" value="" type="search" name="s" required /><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit" >Search</button></div></form>


<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-1146 post type-post status-publish format-standard hentry category-programming category-rails category-ruby category-technology category-tutorials">

<div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div>

</li><li class="wp-block-post post-1139 post type-post status-publish format-standard hentry category-programming category-rails category-ruby category-technology category-tutorials">

<div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div>

</li><li class="wp-block-post post-1136 post type-post status-publish format-standard hentry category-programming category-rails category-ruby category-technology category-tutorials">

<div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div>

</li><li class="wp-block-post post-1098 post type-post status-publish format-standard hentry category-technology category-tools">

<div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div>

</li><li class="wp-block-post post-1099 post type-post status-publish format-standard hentry category-general-interest category-tools">

<div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div>

</li><li class="wp-block-post post-1114 post type-post status-publish format-standard hentry category-general-interest category-technology category-tutorials">

<div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div>

</li></ul>

</div>
</div>
</div>



<div style="height:var(--wp--preset--spacing--50)" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-query alignwide is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-3 post type-post status-publish format-standard has-post-thumbnail hentry category-general-interest">

<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-698ba505 wp-block-columns-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d275371d wp-block-group-is-layout-flex"><h2 class="wp-block-post-title has-x-large-font-size">Why I&#8217;ll never buy from Virgin Mobile again</h2>


<div class="wp-block-group has-small-font-size is-layout-flex wp-container-core-group-is-layout-b371d99e wp-block-group-is-layout-flex"><div style="text-transform:uppercase;letter-spacing:1.4px" class="taxonomy-category wp-block-post-terms"><a href="https://www.matthewbass.com/category/general-interest/" rel="tag">General Interest</a></div>


<p>·</p>


<div class="wp-block-post-date"><time datetime="2015-03-03T09:15:39-05:00"><a href="https://www.matthewbass.com/2015/03/03/why-ill-never-buy-from-virgin-mobile-again/">March 3, 2015</a></time></div></div>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:13.33%"><figure style="aspect-ratio:1;" class="wp-block-post-featured-image wp-container-content-b864c3d2"><a href="https://www.matthewbass.com/2015/03/03/why-ill-never-buy-from-virgin-mobile-again/" target="_self"  ><img width="1024" height="1024" src="https://www.matthewbass.com/wp-content/uploads/2015/03/1024px-Virgin_Mobile_USA_logo.svg_.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Why I&#8217;ll never buy from Virgin Mobile again" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://www.matthewbass.com/wp-content/uploads/2015/03/1024px-Virgin_Mobile_USA_logo.svg_.png 1024w, https://www.matthewbass.com/wp-content/uploads/2015/03/1024px-Virgin_Mobile_USA_logo.svg_-150x150.png 150w, https://www.matthewbass.com/wp-content/uploads/2015/03/1024px-Virgin_Mobile_USA_logo.svg_-300x300.png 300w, https://www.matthewbass.com/wp-content/uploads/2015/03/1024px-Virgin_Mobile_USA_logo.svg_-140x140.png 140w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure></div>
</div>


<div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow"><p><em>Today&#8217;s post is a bit self-serving and for that I apologize, but I&#8217;m hoping that telling my story publicly will accomplish 2 things: first, it will warn my readers that they do business with Virgin Mobile at their own risk. Second, and it&#8217;s a long shot, but it might provoke a response from VM and they might return the money they&#8217;ve owed me for years. A very long shot, I realize.</em></p>
<p>&#8220;Trust, but verify.&#8221; I learned this lesson in early 2011. I have nothing against Virgin as a brand or a company. I admire Richard Branson and all he&#8217;s accomplished. He&#8217;s a remarkable example of a self-made entrepreneur. However, I can say without hyperbole that he has some real dolts working for him at Virgin Mobile.</p>
<p>In December of 2010 I was looking for a mi-fi provider. I didn&#8217;t have an iPhone to tether with yet and needed an option to connect to the Internet while on the road. Virgin Mobile seemed to have the best deal at $130 plus S&amp;H for a MiFi 2200. They also touted a 30 day money back guarantee which gave me confidence in making the purchase.</p>
<p>When the device showed up, I quickly discovered that the coverage was not satisfactory for my area. I would frequently get dropped connections from home, and when out and about coverage was even spottier. So I called VM on January 5 to request service cancellation and get instructions on how to return the device for a refund. The rep I spoke with put me on hold for 20 minutes then said she would call me back later that night. She never did. Thus began 6 months of pure and utter frustration.</p>
<ul>
<li><strong>January 7:</strong> called a second time to find out what happened. Rep said they were sending me a mailing label to return the device. I waited over a week for the label to arrive but it never did.</li>
<li><strong>January 16:</strong> called a third time to ask where the label was. The rep wanted to transfer me to the &#8220;mi-fi group&#8221; (first I had heard of this) but actually just dumped me back out to the automated call menu.</li>
<li><strong>January 17:</strong> called a <em>fourth time</em> and the rep <em>finally</em> gave me an address and RMA for the device. I shipped the device back the same day via UPS and included a note in the package explaining in detail about what had happened.</li>
<li><strong>January 19:</strong> UPS reports the package was delivered.</li>
</ul>
<p>Between January and June 2011 I called Virgin Mobile a total of <strong><em>6 times</em></strong> to ask why my refund had not been processed. Each time I was told that it would be processed within a week. Each time the refund failed to appear.</p>
<p>I switched to a different tactic and opened a service ticket through their web site. Here&#8217;s their response:</p>
<blockquote><p>We do understand how frustrating could be not having the answers when you need them. Unfortunately, there are procedures we have to follow and your issue is under review at this time. All we are asking you is for a little time in order for us to resolve the issue at your satisfaction. Again, we are deeply sorry for the delays, but we need to wait for the investigation that we have opened regarding the refund of your device.</p>
<p>We have already confirmed your device has been returned and it might take up to 5 business days for us to have a resolution.</p></blockquote>
<p>So they admit they received the package. But for some reason, issuing a refund is a challenge for these people. Subsequent service tickets were equally useless. My refund was always &#8220;in process&#8221; or &#8220;under review.&#8221;</p>
<p>Eventually, they claimed they had <em>mailed me</em> a refund check. The check never arrived. Subsequent customer service requests yielded no help whatsoever. Refusing to explain why I hadn&#8217;t received a check yet, they instead began telling me they couldn&#8217;t help me and that I had to contact the &#8220;Broadband department&#8221; for a refund. <strong><em>Whatever. I give up.</em></strong></p>
<p>By the time August 2011 rolled around I decided it was not worth the time and effort to continue pursuing this. So Virgin Mobile kept my money and I&#8217;ve heard nothing from them since. Overall, it&#8217;s a frustrating and disappointing experience when a company steals your money. Had I anticipated what was going to happen I would have kept the device and sold it myself. I wouldn&#8217;t have gotten all my money back, but I would have gotten <em>something</em>. As it happened, Virgin Mobile ended up with both the device <b><i>and</i></b><i></i> my money.</p>
<p>Be warned. When it comes to Virgin Mobile, advice from <em>The Princess Bride</em> is appropriate: &#8220;Get used to disappointment.&#8221;</p>
</div>
</li><li class="wp-block-post post-1083 post type-post status-publish format-standard has-post-thumbnail hentry category-marketing category-products">

<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-698ba505 wp-block-columns-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d275371d wp-block-group-is-layout-flex"><h2 class="wp-block-post-title has-x-large-font-size">Pricing a SaaS app is hard</h2>


<div class="wp-block-group has-small-font-size is-layout-flex wp-container-core-group-is-layout-b371d99e wp-block-group-is-layout-flex"><div style="text-transform:uppercase;letter-spacing:1.4px" class="taxonomy-category wp-block-post-terms"><a href="https://www.matthewbass.com/category/marketing/" rel="tag">Marketing</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.matthewbass.com/category/products/" rel="tag">Products</a></div>


<p>·</p>


<div class="wp-block-post-date"><time datetime="2015-02-24T09:45:48-05:00"><a href="https://www.matthewbass.com/2015/02/24/pricing-a-saas-app-is-hard/">February 24, 2015</a></time></div></div>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:13.33%"><figure style="aspect-ratio:1;" class="wp-block-post-featured-image wp-container-content-b864c3d2"><a href="https://www.matthewbass.com/2015/02/24/pricing-a-saas-app-is-hard/" target="_self"  ><img width="2268" height="1629" src="https://www.matthewbass.com/wp-content/uploads/2015/02/file801306993787.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Pricing a SaaS app is hard" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://www.matthewbass.com/wp-content/uploads/2015/02/file801306993787.jpg 2268w, https://www.matthewbass.com/wp-content/uploads/2015/02/file801306993787-300x215.jpg 300w, https://www.matthewbass.com/wp-content/uploads/2015/02/file801306993787-1024x735.jpg 1024w, https://www.matthewbass.com/wp-content/uploads/2015/02/file801306993787-150x108.jpg 150w" sizes="auto, (max-width: 2268px) 100vw, 2268px" /></a></figure></div>
</div>


<div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow"><p>Pricing a SaaS app is hard. <strong><em>Really</em></strong> hard. My flagship product <a href="http://www.teascript.com">Teascript</a> launched with a subscription-based pricing model in 2007. This was primarily due to a limitation in the payment system I was integrating with. I did a bit of &#8220;market research&#8221; before settling on $19 per year for unlimited use of the app. (And by &#8220;market research&#8221; I mean that I Googled some keywords related to my app to find competitors and learn what they were charging.)</p>
<p>This pricing stuck for several years but I eventually realized the amount of value I was providing through the app did not match the price tag. As I continued building new features, the value was increasing and I needed to change my pricing accordingly. I also decided to move from an annual charge to a monthly charge, mostly because I wanted a shorter feedback loop to measure churn.</p>
<p>I switched all subscriptions to $5 per month and also put a cap on app usage (which in hindsight, I should have been doing from the start but that&#8217;s a topic for another post). Surprisingly, this actually increased my sales even though the effective annual rate had more than tripled to $60. Why was this?</p>
<p>I was scratching my head initially until I realized many of my users were signing up for one or two months and then canceling their subscriptions. So I had actually <em>increased</em> churn by moving from an annual to a monthly charge. But that told me something about how my customers were using the app. Teascript helps homeschoolers and private schools build high school transcripts for their students. This is something that&#8217;s typically only done once in a student&#8217;s lifetime. Therefore, even in a family with 3 or 4 kids, a parent is only going to be using the app for a few months at a time per student, then they won&#8217;t have any further need for it.</p>
<p>This leads me to believe that moving to a fixed pricing model may be the right approach. Recently, I&#8217;ve been experimenting with various metrics to try to measure how much money I make off a typical subscriber. If most of my customers only remain subscribed for 3 or 4 months, that&#8217;s $15 to $20 of revenue. If I had instead been charging a fixed price of $39 (a price point comparable to most offline high school transcript kits) then I would have nearly doubled my revenue.</p>
<p>I still haven&#8217;t found a reliable way to determine the lifetime value of a customer, though. I&#8217;ve been experimenting with various Stripe metrics providers but haven&#8217;t found anything that calculates metrics based on the past 7 years of payment data I have in Stripe (everything I&#8217;ve found only calculates metrics going forward). When I do figure this out, I&#8217;ll be sharing the results here. Stay tuned.</p>
<p>In conclusion, did I mention pricing is hard? There are so many different ways to price an app. It&#8217;s hard to know ahead of time what will work for any given app. This is where A/B testing and customer feedback can be helpful. Even with that additional information, though, I feel like it&#8217;s something that could take a lifetime to master. I&#8217;m well on my way, but I still have a lot to learn.</p>
<p>Have you run into challenges pricing a SaaS app? Share your story in the comments.</p>
</div>
</li><li class="wp-block-post post-268 post type-post status-publish format-standard has-post-thumbnail hentry category-conferences category-general-interest">

<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-698ba505 wp-block-columns-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d275371d wp-block-group-is-layout-flex"><h2 class="wp-block-post-title has-x-large-font-size">Nomadic programming (part 2)</h2>


<div class="wp-block-group has-small-font-size is-layout-flex wp-container-core-group-is-layout-b371d99e wp-block-group-is-layout-flex"><div style="text-transform:uppercase;letter-spacing:1.4px" class="taxonomy-category wp-block-post-terms"><a href="https://www.matthewbass.com/category/conferences/" rel="tag">Conferences</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.matthewbass.com/category/general-interest/" rel="tag">General Interest</a></div>


<p>·</p>


<div class="wp-block-post-date"><time datetime="2015-02-17T09:49:08-05:00"><a href="https://www.matthewbass.com/2015/02/17/nomadic-programming-part-2/">February 17, 2015</a></time></div></div>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:13.33%"><figure style="aspect-ratio:1;" class="wp-block-post-featured-image wp-container-content-b864c3d2"><a href="https://www.matthewbass.com/2015/02/17/nomadic-programming-part-2/" target="_self"  ><img width="3264" height="2448" src="https://www.matthewbass.com/wp-content/uploads/2015/02/z0pmcwrN.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Nomadic programming (part 2)" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://www.matthewbass.com/wp-content/uploads/2015/02/z0pmcwrN.jpg 3264w, https://www.matthewbass.com/wp-content/uploads/2015/02/z0pmcwrN-300x225.jpg 300w, https://www.matthewbass.com/wp-content/uploads/2015/02/z0pmcwrN-1024x768.jpg 1024w, https://www.matthewbass.com/wp-content/uploads/2015/02/z0pmcwrN-150x113.jpg 150w" sizes="auto, (max-width: 3264px) 100vw, 3264px" /></a></figure></div>
</div>


<div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow"><p>It&#8217;s time to re-visit nomadic programming. <a href="/2008/06/13/nomadic-programming/">Read part 1</a> to get caught up.</p>
<blockquote><p><i><b>nomad [noh-mad]:</b> (1) a member of a people or tribe that has no permanent abode but moves about from place to place, usually seasonally and often following a traditional route or circuit according to the state of the pasturage or food supply. (2) any wanderer; itinerant.</i></p></blockquote>
<p>As defined in part 1, a nomad is a freelancer who spends the day roaming between various wi-fi hotspots instead of working from home. This isn&#8217;t just about hanging out at a coffee shop like a hipster. This is about getting out of the house and into a more stimulating environment, creating opportunity for networking, and yes, enjoying some delicious food and drink in the process.</p>
<p>So now that you&#8217;re onboard with the concept, what&#8217;s the actual procedure for being a nomad? I&#8217;ve been nomading for 8 years and have picked up a few tips and tricks that I&#8217;ve found maximize enjoyment and productivity. Follow these guidelines for nomading success.</p>
<h3>What to do</h3>
<ul>
<li><strong>Bring a power splitter.</strong> Finding outlets is the perennial problem of the nomadic programmer. Most cafés and coffee shops have only a handful of outlets available. Instead of having to arrive early to snag one, bring a power splitter with you and politely ask to throw it on an outlet that&#8217;s already in use. If you get a big enough splitter, you can even offer power to fellow nomads who weren&#8217;t as forward-thinking as you were. <a href="http://www.amazon.com/gp/product/B000F9YN2M/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000F9YN2M&amp;linkCode=as2&amp;tag=teascript00-20&amp;linkId=BOJWLWEFBO4HUDQW">This highly portable splitter</a> is one of my favorites.</li>
<li><strong>Bring headphones.</strong> Some people enjoy the noise at coffee shops, true. Even if you&#8217;re one of those people, it can be helpful to have a pair of headphones on you if the noise becomes too much, or if you need to watch a video or listen to a podcast. If your headphones have a boom mic, so much the better. It&#8217;s practically impossible to participate in a conference call in the midst of heavy background noise <em>without</em> a headset mic. I&#8217;ve used <a href="http://www.amazon.com/gp/product/B000UXZQ42/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000UXZQ42&amp;linkCode=as2&amp;tag=teascript00-20&amp;linkId=PVJLPLI266NJFAAJ">this model from Logitech</a> for years. It&#8217;s light, inexpensive, and works well.</li>
<li><strong>Tethering means freedom.</strong> Wi-fi hotspots are ubiquitous these days, but with that ubiquity comes increased unreliability. Slow wi-fi is the bane of the productive freelancer. That&#8217;s why you should always have a backup. Tethering to your iPhone, iPad, or Android device is the equivalent of &#8220;wi-fi insurance.&#8221; It&#8217;s a relatively inexpensive way to ensure you&#8217;ll always be able to get online, even when the hotspot at Starbucks is being rebooted. It also opens up a world of new nomading locations. I once ran a conference call with a client from beside a beautiful golf course. That wouldn&#8217;t have been possible if I hadn&#8217;t brought my own wi-fi.</li>
<li><strong>Carry business cards.</strong> One huge benefit of nomading is the opportunity to meet and network with people. It&#8217;s amazing how frequently this happens. Don&#8217;t get caught without a stack of business cards. You need something to hand out to people you meet so they can follow up with you later. I actually landed a freelance job from someone I met at Bruegger&#8217;s once.</li>
<li><strong>Bring a water bottle.</strong> Most cafes and coffee shops offer water, but the cups are usually tiny. Purchasing bottled water is always an option, but staff are usually happy to refill your bottle for you. I like <a href="http://www.amazon.com/gp/product/B0093IRGZM/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0093IRGZM&amp;linkCode=as2&amp;tag=teascript00-20&amp;linkId=33JPRDNPI6QEYKYK">these stainless steel bottles</a> for their size, durability, and tactile feel.</li>
<li><strong>A wireless mouse can&#8217;t hurt.</strong> It&#8217;s nice having an alternative to the trackpad, especially if you&#8217;ll be nomading for more than a couple of hours.</li>
<li><strong>Use a quality bag.</strong> It&#8217;s important to have something to carry your stuff in. Don&#8217;t cheap out here. A good bag will serve you for years. I like <a href="http://www.511tactical.com/rush-12-backpack.html">5.11 packs</a>. They don&#8217;t have a fancy padded pocket for your laptop, but they&#8217;re practically indestructible.</li>
</ul>
<h3>What not to do</h3>
<ul>
<li><strong>Don&#8217;t dress like a slob.</strong> It&#8217;s easy for us programmers to let our clothing choices slide into the gutter. When we&#8217;re nomading, though, we&#8217;re out in public. We&#8217;ll be meeting new people. Some of those people might be potential clients. So it&#8217;s important that our dress reflect our professionalism. I&#8217;m not saying you need to wear a tux to Starbucks, but you should probably reserve the ratty jeans and stained T-shirt for home.</li>
<li><strong>No freeloading.</strong> It&#8217;s incredibly inconsiderate to park yourself at an establishment, use their wi-fi, and not buy anything. Don&#8217;t do it.</li>
<li><strong>Don&#8217;t ignore the owner and staff.</strong> Along those same lines, building good relationships with the business owner and staff can be very rewarding. When you become a regular customer, leave good tips, and clean up after yourself, the staff will remember and you&#8217;ll get better service as a result (and even some freebies at times).</li>
<li><strong>Make healthy choices.</strong> Modern America is sedentary. As programmers, we&#8217;re likely <em>more</em> sedentary than the average American. That&#8217;s why it&#8217;s critical to make healthy choices while we&#8217;re out and about. Pass on the morning bagel or doughnut doughnut and enjoy some bacon and eggs instead. You don&#8217;t need that soda, unsweetened tea has far fewer calories and won&#8217;t trigger an afternoon crash. And try to get out for a brisk 20 minute walk at some point.</li>
<li><strong>Security matters.</strong> Whenever you&#8217;re using public wi-fi you&#8217;re taking a risk. That risk can be mitigated by using a VPN or, better yet, by always tethering to your own wi-fi connection. Portable wi-fi hotspots are inexpensive and provide an extra layer of protection.</li>
<li><strong>Avoid peak times.</strong> Nothing is worse than trying to perform an emergency deploy to a production web server during the lunch rush at Moe&#8217;s. A technique I&#8217;ve found helpful is to hit the popular lunch spots during mid-morning, hop over to a coffee shop during the lunch rush, and head back to the café during the afternoon lull. I despise overcrowded places and this technique was quite effective at ensuring that my surroundings were relatively calm throughout the day.</li>
</ul>
<h3>Conclusion</h3>
<p>Pretty straightforward, right? Take what you find useful from these lists. Discard what doesn&#8217;t work for you. Come up with some best practices of your own. Half the fun of nomading is the adventure. Where will you end up? Who will you meet? You never know what each new day might bring. So get out there and start identifying your favorite places to nomad.</p>
<p>If you&#8217;re not sure how to get started, consider joining a local programming Meetup like <a href="http://www.meetup.com/Happy-Nomadders/">this one</a>. Even user groups will occasionally host a social gathering at a restaurant or coffee shop. Just keep in mind that while nomading as a group can be fun, the real adventure resides in striking out on your own.</p>
<p>Have you tried nomadic programming? Did you enjoy it or despise it? Do you have any tips or tricks that worked for you? Share your experience in the comments below.</p>
<p><iframe loading="lazy" src="https://www.youtube.com/embed/OFS4K19WTwY?list=UUC9T2sDnTzM2b_utQSFy5DA" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
</div>
</li><li class="wp-block-post post-1030 post type-post status-publish format-standard hentry category-general-interest category-health-wellness category-programming category-technology">

<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-698ba505 wp-block-columns-is-layout-flex" style="border-bottom-color:var(--wp--preset--color--accent-6);border-bottom-width:1px;margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:60%">
<div class="wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-d275371d wp-block-group-is-layout-flex"><h2 class="wp-block-post-title has-x-large-font-size">Standing desks improve productivity</h2>


<div class="wp-block-group has-small-font-size is-layout-flex wp-container-core-group-is-layout-b371d99e wp-block-group-is-layout-flex"><div style="text-transform:uppercase;letter-spacing:1.4px" class="taxonomy-category wp-block-post-terms"><a href="https://www.matthewbass.com/category/general-interest/" rel="tag">General Interest</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.matthewbass.com/category/health-wellness/" rel="tag">Health &amp; Wellness</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.matthewbass.com/category/programming/" rel="tag">Programming</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.matthewbass.com/category/technology/" rel="tag">Technology</a></div>


<p>·</p>


<div class="wp-block-post-date"><time datetime="2015-02-10T09:14:47-05:00"><a href="https://www.matthewbass.com/2015/02/10/standing-desks/">February 10, 2015</a></time></div></div>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:13.33%"></div>
</div>


<div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow"><p>I&#8217;ll admit it: I&#8217;ve been coveting a standing desk for years. The idea of escaping the uncomfortable prison of my 10-year-old desk chair is compelling. But standing desks are prohibitively expensive for many people, and up until recently that included me.</p>
<p><a href="http://matthewbasscom.wpengine.com/wp-content/uploads/2015/02/IMG_6805.jpg" target="_blank"><img loading="lazy" decoding="async" class="alignright wp-image-1066 size-medium" src="http://matthewbasscom.wpengine.com/wp-content/uploads/2015/02/IMG_6805-300x225.jpg" alt="My new standing desk" width="300" height="225" srcset="https://www.matthewbass.com/wp-content/uploads/2015/02/IMG_6805-300x225.jpg 300w, https://www.matthewbass.com/wp-content/uploads/2015/02/IMG_6805-150x113.jpg 150w, https://www.matthewbass.com/wp-content/uploads/2015/02/IMG_6805.jpg 800w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>It finally got to be too much, though. A few weeks ago I bit the bullet and, after doing extensive research on the various options available, finally settled on the <a href="http://www.nextdesks.com/terra" target="_blank">NextDesk Terra</a>. There are many companies that manufacture standing desks, but NextDesk seems to offer the best quality-to-price ratio. I also appreciate the built-in Belkin power strip. And let&#8217;s face it, their bamboo desk surfaces are downright gorgeous.</p>
<p>And the motorized raising and lowering is definitely the &#8220;wow&#8221; factor. Is it necessary? Not really. I guess the argument could be made that the motor is saving my back from having to manually crank the thing up and down, but this being my first standing desk it&#8217;s hard to say how much more difficult a manual lifting mechanism would make things. But I&#8217;m happy with the motor.</p>
<p>How often do I find myself standing now that I have the correct equipment? Almost all the time. I easily spend 80% of my work day standing. What&#8217;s nice about leaving the desk in its raised position is that it&#8217;s so easy to just walk up to the workstation and get something done. My office is in my converted dining room right next to my kitchen, so I&#8217;ll often find myself wandering over to get something done while I&#8217;m waiting for some water to boil on the stove, or waiting for the microwave to finish warming a bowl of soup.</p>
<p>Eliminating the need to sit before using the computer has lowered a psychological threshold that was preventing me from handling small tasks when a few minutes of free time suddenly appeared in my day. When I had to sit, I wouldn&#8217;t bother because my brain was telling me it would take longer to perform the action of sitting than it would to get something done once I did sit.</p>
<p>If you&#8217;re considering upgrading to a standing desk, I recommend glancing over <a href="http://thewirecutter.com/reviews/the-best-standing-desks/">this article</a> which was instrumental in my decision. Do you already use a standing desk? Comment below and let me know which model you chose and what you like best about it.</p>
<p>&nbsp;</p>
</div>
</li></ul>


<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)"><nav class="wp-block-query-pagination has-medium-font-size is-content-justification-space-between is-layout-flex wp-container-core-query-pagination-is-layout-b2891da8 wp-block-query-pagination-is-layout-flex" aria-label="Pagination">


<div class="wp-block-query-pagination-numbers"><span aria-current="page" class="page-numbers current">1</span>
<a class="page-numbers" href="?query-21-page=2">2</a>
<a class="page-numbers" href="?query-21-page=3">3</a>
<span class="page-numbers dots">&hellip;</span>
<a class="page-numbers" href="?query-21-page=84">84</a></div>

<a href="/?query-21-page=2" class="wp-block-query-pagination-next">Next Page</a>
</nav></div>


</div>
</main>


<footer class="wp-block-template-part">
<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50)">
	
	<div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow">
		
		<div class="wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-e5edad21 wp-block-group-is-layout-flex">
			
			<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7e49ac6c wp-block-group-is-layout-constrained" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0">
				<h2 class="wp-block-site-title has-xx-large-font-size"><a href="https://www.matthewbass.com" target="_self" rel="home" aria-current="page">Matthew Bass</a></h2>
				<p class="wp-block-site-tagline">Musings on software and life&#8230;</p>
			</div>
			

			
			<div class="wp-block-group is-layout-flex wp-container-core-group-is-layout-19858539 wp-block-group-is-layout-flex">
				
				<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7db9d80f wp-block-group-is-layout-constrained" style="padding-right:0;padding-left:0">
					
					<h3 class="wp-block-heading has-medium-font-size" style="font-style:normal;font-weight:700">Stories</h3>
					
					<nav class="has-medium-font-size  is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-98bb686d wp-block-navigation-is-layout-flex" aria-label="Stories Stories"><ul class="wp-block-navigation__container has-medium-font-size  is-vertical wp-block-navigation has-medium-font-size" aria-label="Stories"><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">Blog</span></a></li><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">About</span></a></li><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">FAQs</span></a></li><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">Authors</span></a></li></ul></nav>
				</div>
				
				
				<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-7db9d80f wp-block-group-is-layout-constrained" style="padding-right:0;padding-left:0">
					
					<h3 class="wp-block-heading has-medium-font-size" style="font-style:normal;font-weight:700">Fleurs</h3>
					
					<nav class="has-medium-font-size  is-vertical wp-block-navigation is-layout-flex wp-container-core-navigation-is-layout-98bb686d wp-block-navigation-is-layout-flex" aria-label="Featured Featured"><ul class="wp-block-navigation__container has-medium-font-size  is-vertical wp-block-navigation has-medium-font-size" aria-label="Featured"><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">Events</span></a></li><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">Shop</span></a></li><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">Patterns</span></a></li><li class="has-medium-font-size wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="#"><span class="wp-block-navigation-item__label">Themes</span></a></li></ul></nav>
				</div>
				
			</div>
			
		</div>
		
		
		<div style="height:var(--wp--preset--spacing--60)" aria-hidden="true" class="wp-block-spacer"></div>
		
		
		<div class="wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-9366075c wp-block-group-is-layout-flex">
			
			<p class="has-small-font-size">Twenty Twenty-Five</p>
			
			
			<p class="has-small-font-size">
			Designed with <a href="https://wordpress.org" rel="nofollow">WordPress</a>			</p>
			
		</div>
		
	</div>
	
</div>


</footer></div>
<script type="speculationrules">
{"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/twentytwentyfive/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script type="module" src="http://www.matthewbass.com/wp-includes/js/dist/script-modules/block-library/navigation/view.min.js?ver=b0f909c3ec791c383210" id="@wordpress/block-library/navigation/view-js-module" fetchpriority="low" data-wp-router-options="{&quot;loadOnClientNavigation&quot;:true}"></script>
<script src="http://www.matthewbass.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shCore.js?ver=3.0.9b" id="syntaxhighlighter-core-js"></script>
<script src="http://www.matthewbass.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushPlain.js?ver=3.0.9b" id="syntaxhighlighter-brush-plain-js"></script>
<script type='text/javascript'>
	(function(){
		var corecss = document.createElement('link');
		var themecss = document.createElement('link');
		var corecssurl = "http://www.matthewbass.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b";
		if ( corecss.setAttribute ) {
				corecss.setAttribute( "rel", "stylesheet" );
				corecss.setAttribute( "type", "text/css" );
				corecss.setAttribute( "href", corecssurl );
		} else {
				corecss.rel = "stylesheet";
				corecss.href = corecssurl;
		}
		document.head.appendChild( corecss );
		var themecssurl = "http://www.matthewbass.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?ver=3.0.9b";
		if ( themecss.setAttribute ) {
				themecss.setAttribute( "rel", "stylesheet" );
				themecss.setAttribute( "type", "text/css" );
				themecss.setAttribute( "href", themecssurl );
		} else {
				themecss.rel = "stylesheet";
				themecss.href = themecssurl;
		}
		document.head.appendChild( themecss );
	})();
	SyntaxHighlighter.config.strings.expandSource = '+ expand source';
	SyntaxHighlighter.config.strings.help = '?';
	SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
	SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
	SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
	SyntaxHighlighter.defaults['pad-line-numbers'] = false;
	SyntaxHighlighter.defaults['toolbar'] = false;
	SyntaxHighlighter.all();

	// Infinite scroll support
	if ( typeof( jQuery ) !== 'undefined' ) {
		jQuery( function( $ ) {
			$( document.body ).on( 'post-load', function() {
				SyntaxHighlighter.highlight();
			} );
		} );
	}
</script>
<script id="wp-block-template-skip-link-js-after">
	( function() {
		var skipLinkTarget = document.querySelector( 'main' ),
			sibling,
			skipLinkTargetID,
			skipLink;

		// Early exit if a skip-link target can't be located.
		if ( ! skipLinkTarget ) {
			return;
		}

		/*
		 * Get the site wrapper.
		 * The skip-link will be injected in the beginning of it.
		 */
		sibling = document.querySelector( '.wp-site-blocks' );

		// Early exit if the root element was not found.
		if ( ! sibling ) {
			return;
		}

		// Get the skip-link target's ID, and generate one if it doesn't exist.
		skipLinkTargetID = skipLinkTarget.id;
		if ( ! skipLinkTargetID ) {
			skipLinkTargetID = 'wp--skip-link--target';
			skipLinkTarget.id = skipLinkTargetID;
		}

		// Create the skip link.
		skipLink = document.createElement( 'a' );
		skipLink.classList.add( 'skip-link', 'screen-reader-text' );
		skipLink.id = 'wp-skip-link';
		skipLink.href = '#' + skipLinkTargetID;
		skipLink.innerText = 'Skip to content';

		// Inject the skip link.
		sibling.parentElement.insertBefore( skipLink, sibling );
	}() );
	
//# sourceURL=wp-block-template-skip-link-js-after
</script>
<script id="wp-emoji-settings" type="application/json">
{"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":"http://www.matthewbass.com/wp-includes/js/wp-emoji-release.min.js?ver=6.9"}}
</script>
<script type="module">
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,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 a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[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,a){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!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));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(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
//# sourceURL=http://www.matthewbass.com/wp-includes/js/wp-emoji-loader.min.js
</script>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9ca26b15da417dde',t:'MTc3MDQ2MjM5MS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>
