1<!doctype html> 2<html lang="en-US"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1"> 6<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssf924f6703a97658a64baba7e39f0ada051ceeb18e02b9fe54707b67a817e0.css" as="style" media="all" /> 7<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssd9bdb95a3373e938a171dab4faa59bf97dd0251056097ccdb415756bf77a9.css" as="style" media="all" /> 8<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css5a90952c9fb90df6d7765f01c35dc475aec7b01f9b5a1b4cf5dc332367cee.css" as="style" media="all" /> 9<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css8cc1534b78a40b9ca9dc0100d829acfa2b58721f3ae71fa69f3fbf4bc069c.css" as="style" media="all" /> 10<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssf3139d806d1b2d160ab0a0441629fb5aa8f45f83a61b2cafe1b537afa795b.css" as="style" media="all" /> 11<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssd7cc3c45520e64f347216df9a2b3a870c95bcb0ca2725f32b1c3331750150.css" as="style" media="all" /> 12<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css427cc78c3a47eea64ecbe05f2edd5552f3426198861112b327864d6a97971.css" as="style" media="all" /> 13<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-csscc805b822d4e21a0398070961788653f51ad74bd2364ed3c5b4f4e03e0ee1.css" as="style" media="all" /> 14<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css38fe28613dbf89d819ae2004f8e0d9ae82f8a4ed6296ee3ad33c6c6511a7a.css" as="style" media="all" /> 15<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css38b051f42fa98214592dffb7250ed880155ebb176c0db5ee0a30abbbf53cf.css" as="style" media="all" /> 16<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css655816faf5a25e036583360e82c340ce13ae3df31b08170f87abeda1cf2b9.css" as="style" media="all" /> 17<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css08ba9acf02f04e4c8b3541d3fb35fb6738e8a97666dde37fd242359af3390.css" as="style" media="all" /> 18<link rel="preload" href="https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssc9a1d7b59309d969aae8e663183cb5ef44615d3fa1dbb927a0dab711a28ed.css" as="style" media="all" />
19<script data-cfasync="false">if(navigator.userAgent.match(/MSIE|Internet Explorer/i)||navigator.userAgent.match(/Trident\/7\..*?rv:11/i)){var href=document.location.href;if(!href.match(/[?&]iebrowser/)){if(href.indexOf("?")==-1){if(href.indexOf("#")==-1){document.location.href=href+"?iebrowser=1"}else{document.location.href=href.replace("#","?iebrowser=1#")}}else{if(href.indexOf("#")==-1){document.location.href=href+"&iebrowser=1"}else{document.location.href=href.replace("#","&iebrowser=1#")}}}}</script>
vendor: 1 bytes, line 19
19
20<script data-cfasync="false">class FVMLoader{constructor(e){this.triggerEvents=e,this.eventOptions={passive:!0},this.userEventListener=this.triggerListener.bind(this),this.delayedScripts={normal:[],async:[],defer:[]},this.allJQueries=[]}_addUserInteractionListener(e){this.triggerEvents.forEach(t=>window.addEventListener(t,e.userEventListener,e.eventOptions))}_removeUserInteractionListener(e){this.triggerEvents.forEach(t=>window.removeEventListener(t,e.userEventListener,e.eventOptions))}triggerListener(){this._removeUserInteractionListener(this),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",this._loadEverythingNow.bind(this)):this._loadEverythingNow()}async _loadEverythingNow(){this._runAllDelayedCSS(),this._delayEventListeners(),this._delayJQueryReady(this),this._handleDocumentWrite(),this._registerAllDelayedScripts(),await this._loadScriptsFromList(this.delayedScripts.normal),await this._loadScriptsFromList(this.delayedScripts.defer),await this._loadScriptsFromList(this.delayedScripts.async),await this._triggerDOMContentLoaded(),await this._triggerWindowLoad(),window.dispatchEvent(new Event("wpr-allScriptsLoaded"))}_registerAllDelayedScripts(){document.querySelectorAll("script[type=fvmdelay]").forEach(e=>{e.hasAttribute("src")?e.hasAttribute("async")&&!1!==e.async?this.delayedScripts.async.push(e):e.hasAttribute("defer")&&!1!==e.defer||"module"===e.getAttribute("data-type")?this.delayedScripts.defer.push(e):this.delayedScripts.normal.push(e):this.delayedScripts.normal.push(e)})}_runAllDelayedCSS(){document.querySelectorAll("link[rel=fvmdelay]").forEach(e=>{e.setAttribute("rel","stylesheet")})}async _transformScript(e){return await this._requestAnimFrame(),new Promise(t=>{const n=document.createElement("script");let r;[...e.attributes].forEach(e=>{let t=e.nodeName;"type"!==t&&("data-type"===t&&(t="type",r=e.nodeValue),n.setAttribute(t,e.nodeValue))}),e.hasAttribute("src")?(n.addEventListener("load",t),n.addEventListener("error",t)):(n.text=e.text,t()),e.parentNode.replaceChild(n,e)})}async _loadScriptsFromList(e){const t=e.shift();return t?(await this._transformScript(t),this._loadScriptsFromList(e)):Promise.resolve()}_delayEventListeners(){let e={};function t(t,n){!function(t){function n(n){return e[t].eventsToRewrite.indexOf(n)>=0?"wpr-"+n:n}e[t]||(e[t]={originalFunctions:{add:t.addEventListener,remove:t.removeEventListener},eventsToRewrite:[]},t.addEventListener=function(){arguments[0]=n(arguments[0]),e[t].originalFunctions.add.apply(t,arguments)},t.removeEventListener=function(){arguments[0]=n(arguments[0]),e[t].originalFunctions.remove.apply(t,arguments)})}(t),e[t].eventsToRewrite.push(n)}function n(e,t){let n=e[t];Object.defineProperty(e,t,{get:()=>n||function(){},set(r){e["wpr"+t]=n=r}})}t(document,"DOMContentLoaded"),t(window,"DOMContentLoaded"),t(window,"load"),t(window,"pageshow"),t(document,"readystatechange"),n(document,"onreadystatechange"),n(window,"onload"),n(window,"onpageshow")}_delayJQueryReady(e){let t=window.jQuery;Object.defineProperty(window,"jQuery",{get:()=>t,set(n){if(n&&n.fn&&!e.allJQueries.includes(n)){n.fn.ready=n.fn.init.prototype.ready=function(t){e.domReadyFired?t.bind(document)(n):document.addEventListener("DOMContentLoaded2",()=>t.bind(document)(n))};const t=n.fn.on;n.fn.on=n.fn.init.prototype.on=function(){if(this[0]===window){function e(e){return e.split(" ").map(e=>"load"===e||0===e.indexOf("load.")?"wpr-jquery-load":e).join(" ")}"string"==typeof arguments[0]||arguments[0]instanceof String?arguments[0]=e(arguments[0]):"object"==typeof arguments[0]&&Object.keys(arguments[0]).forEach(t=>{delete Object.assign(arguments[0],{[e(t)]:arguments[0][t]})[t]})}return t.apply(this,arguments),this},e.allJQueries.push(n)}t=n}})}async _triggerDOMContentLoaded(){this.domReadyFired=!0,await this._requestAnimFrame(),document.dispatchEvent(new Event("DOMContentLoaded2")),await this._requestAnimFrame(),window.dispatchEvent(new Event("DOMContentLoaded2")),await this._requestAnimFrame(),document.dispatchEvent(new Event("wpr-readystatechange")),await this._requestAnimFrame(),document.wpronreadystatechange&&document.wpronreadystatechange()}
20async _triggerWindowLoad(){await this._requestAnimFrame(),window.dispatchEvent(new Event("wpr-load")),await this._requestAnimFrame(),window.wpronload&&window.wpronload(),await this._requestAnimFrame(),this.allJQueries.forEach(e=>e(window).trigger("wpr-jquery-load")),window.dispatchEvent(new Event("wpr-pageshow")),await this._requestAnimFrame(),window.wpronpageshow&&window.wpronpageshow()}_handleDocumentWrite(){const e=new Map;document.write=document.writeln=function(t){const n=document.currentScript,r=document.createRange(),i=n.parentElement;let a=e.get(n);void 0===a&&(a=n.nextSibling,e.set(n,a));const s=document.createDocumentFragment();r.setStart(s,0),s.appendChild(r.createContextualFragment(t)),i.insertBefore(s,a)}}async _requestAnimFrame(){return new Promise(e=>requestAnimationFrame(e))}static run(){const e=new FVMLoader(["keydown","mousemove","touchmove","touchstart","touchend","wheel"]);e._addUserInteractionListener(e)}}FVMLoader.run();</script>
vendor: 1 bytes, line 20
20
21<script>!function(e,c){e[c]=e[c]+(e[c]&&" ")+"quform-js"}(document.documentElement,"className");</script>
21 22<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <title>Nine Bar 1.3: Find Any Shot, Instantly - Joshua Campbell</title> 23<meta name="description" content="Nine Bar v1.3 adds powerful brew search and filters, making it easier to find past shots by recipe, shot details, equipment, and more." /> 24<link rel="canonical" href="https://joshncampbell.com/v1-3-brew-search-filters/" /> 25<meta property="og:locale" content="en_US" /> 26<meta property="og:type" content="article" /> 27<meta property="og:title" content="Nine Bar 1.3: Find Any Shot, Instantly - Joshua Campbell" /> 28<meta property="og:description" content="Nine Bar v1.3 adds powerful brew search and filters, making it easier to find past shots by recipe, shot details, equipment, and more." /> 29<meta property="og:url" content="https://joshncampbell.com/v1-3-brew-search-filters/" /> 30<meta property="og:site_name" content="Joshua Campbell" /> 31<meta property="article:published_time" content="2026-09-30T12:00:00+00:00" /> 32<meta property="og:image" content="https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature.png" /> 33<meta property="og:image:width" content="1536" /> 34<meta property="og:image:height" content="1024" /> 35<meta property="og:image:type" content="image/png" /> 36<meta name="author" content="josh" /> 37<meta name="twitter:card" content="summary_large_image" /> 38<meta name="twitter:label1" content="Written by" /> 39<meta name="twitter:data1" content="josh" /> 40<meta name="twitter:label2" content="Est. reading time" /> 41<meta name="twitter:data2" content="3 minutes" />
42<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#article","isPartOf":{"@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/"},"author":{"name":"josh","@id":"https:\/\/joshncampbell.com\/#\/schema\/person\/bd1a7b63dea488d7f60452923887ec5b"},"headline":"Nine Bar 1.3: Find Any Shot, Instantly","datePublished":"2026-09-30T12:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/"},"wordCount":391,"commentCount":0,"publisher":{"@id":"https:\/\/joshncampbell.com\/#\/schema\/person\/bd1a7b63dea488d7f60452923887ec5b"},"image":{"@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#primaryimage"},"thumbnailUrl":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2026\/09\/Nine-Bar-1.3-Feature.png","keywords":["design","mobile","technology"],"articleSection":["Design","Life Hacks","Tech","Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/","url":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/","name":"Nine Bar 1.3: Find Any Shot, Instantly - Joshua Campbell","isPartOf":{"@id":"https:\/\/joshncampbell.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#primaryimage"},"image":{"@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#primaryimage"},"thumbnailUrl":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2026\/09\/Nine-Bar-1.3-Feature.png","datePublished":"2026-09-30T12:00:00+00:00","description":"Nine Bar v1.3 adds powerful brew search and filters, making it easier to find past shots by recipe, shot details, equipment, and more.","breadcrumb":{"@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#primaryimage","url":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2026\/09\/Nine-Bar-1.3-Feature.png","contentUrl":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2026\/09\/Nine-Bar-1.3-Feature.png","width":1536,"height":1024,"caption":"Nine Bar v1.3 feature image showing the Brews search and filtering screens on two iPhones alongside espresso tools and coffee, highlighting faster ways to find brews in a growing journal."},{"@type":"BreadcrumbList","@id":"https:\/\/joshncampbell.com\/v1-3-brew-search-filters\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/joshncampbell.com\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/joshncampbell.com\/blog-2\/"},{"@type":"ListItem","position":3,"name":"Nine Bar 1.3: Find Any Shot, Instantly"}]},{"@type":"WebSite","@id":"https:\/\/joshncampbell.com\/#website","url":"https:\/\/joshncampbell.com\/","name":"Joshua Campbell - Travel industry technologist & enthusiast","description":"Product & UX Leader","publisher":{"@id":"https:\/\/joshncampbell.com\/#\/schema\/person\/bd1a7b63dea488d7f60452923887ec5b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/joshncampbell.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/joshncampbell.com\/#\/schema\/person\/bd1a7b63dea488d7f60452923887ec5b","name":"josh","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2024\/06\/cropped-Profile-Photo-Rounded.png","url":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2024\/06\/cropped-Profile-Photo-Rounded.png","contentUrl":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2024\/06\/cropped-Profile-Photo-Rounded.png","width":1600,"height":1600,"caption":"josh"},"logo":{"@id":"https:\/\/joshncampbell.com\/wp-content\/uploads\/2024\/06\/cropped-Profile-Photo-Rounded.png"},"description":"Data Scientist and travel industry technologist specializing in data analysis, data integrity, and data modeling.","sameAs":["http:\/\/www.joshuacampbell.me\/"]}]}</script>
42 43<link rel="alternate" type="application/rss+xml" title="Joshua Campbell » Feed" href="https://joshncampbell.com/feed/" /> 44<link rel="alternate" type="application/rss+xml" title="Joshua Campbell » Comments Feed" href="https://joshncampbell.com/comments/feed/" /> 45<link rel="alternate" type="application/rss+xml" title="Joshua Campbell » Nine Bar 1.3: Find Any Shot, Instantly Comments Feed" href="https://joshncampbell.com/v1-3-brew-search-filters/feed/" /> 46<style id="wp-img-auto-sizes-contain-inline-css" media="all">img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}</style> 47<link rel='stylesheet' id='wp-block-library-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssf924f6703a97658a64baba7e39f0ada051ceeb18e02b9fe54707b67a817e0.css' media='all' /> 48<style id="classic-theme-styles-inline-css" media="all">/*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}</style>
49<style id="site-designer-shared-pattern-classes-inline-css" media="all">body .wp-site-blocks .is-style-overlay-dark .wp-block-cover__background{background-color:var(--wp--preset--color--base-3);color:var(--wp--preset--color--contrast-3)}.wp-block-cover.is-style-overlay-dark .wp-block-cover__background.has-background-dim{opacity:0.50!important}:is(.wp-block-designsetgo-section,.wp-block-designsetgo-scroll-slides).is-style-overlay-dark{--dsgo-overlay-color:var(--wp--preset--color--base-3);--dsgo-overlay-opacity:0.50;color:var(--wp--preset--color--contrast-3)}.dsgo-image-accordion-item.is-style-overlay-dark{--dsgo-overlay-color:var(--wp--preset--color--base-3)}.wp-block-group.has-background.is-style-overlay-dark{box-shadow:inset 0 0 0 9999px color-mix(in srgb,var(--wp--preset--color--base-3) 50%,transparent)}body .wp-site-blocks .is-style-overlay-dark,body .wp-site-blocks .is-style-on-dark{--dsgo-text-color:var(--wp--preset--color--contrast-3);color:var(--wp--preset--color--contrast-3)!important}body .wp-site-blocks .is-style-overlay-dark :is(h1,h2,h3,h4,h5,h6,p,li,blockquote,cite),body .wp-site-blocks .is-style-on-dark :is(h1,h2,h3,h4,h5,h6,p,li,blockquote,cite){color:var(--wp--preset--color--contrast-3)!important}.is-style-bg-dark{background-color:var(--wp--preset--color--contrast);color:var(--wp--preset--color--base)}.is-style-bg-dark a{color:var(--wp--preset--color--base)}</style> 50<style id="global-styles-inline-css" media="all">: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;
50--wp--preset--color--vivid-cyan-blue:#0693e3;--wp--preset--color--vivid-purple:#9b51e0;--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:13px;--wp--preset--font-size--medium:20px;--wp--preset--font-size--large:36px;--wp--preset--font-size--x-large:42px;--wp--preset--spacing--20:0.44rem;--wp--preset--spacing--30:0.67rem;--wp--preset--spacing--40:1rem;--wp--preset--spacing--50:1.5rem;--wp--preset--spacing--60:2.25rem;--wp--preset--spacing--70:3.38rem;--wp--preset--spacing--80:5.06rem;--wp--preset--shadow--natural:6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep:12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp:6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined:6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp:6px 6px 0px rgb(0, 0, 0)}.wp-block-button{--wp--preset--dimension--25:25%;--wp--preset--dimension--50:50%;--wp--preset--dimension--75:75%;--wp--preset--dimension--100:100%}:where(body){margin:0}:where(.is-layout-flex){gap:.5em}:where(.is-layout-grid){gap:.5em}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{padding-top:0;padding-right:0;padding-bottom:0;padding-left:0}:root :where(.wp-element-button,.wp-block-button__link){background-color:#32373c;border-width:0;color:#fff;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;padding-top:calc(0.667em + 2px);padding-right:calc(1.333em + 2px);padding-bottom:calc(0.667em + 2px);padding-left:calc(1.333em + 2px);text-decoration:none;text-transform:inherit}.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-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-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-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}
50.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}:root :where(.wp-block-icon svg){width:24px}:where(.wp-block-gallery.is-layout-flex){gap:var(--wp--style--gallery-gap-default,var(--gallery-block--gutter-size,var(--wp--style--block-gap,.5em)))}:where(.wp-block-gallery.is-layout-grid){gap:var(--wp--style--gallery-gap-default,var(--gallery-block--gutter-size,var(--wp--style--block-gap,.5em)))}:where(.wp-block-latest-posts.is-layout-flex){gap:1.25em}:where(.wp-block-latest-posts.is-layout-grid){gap:1.25em}:where(.wp-block-post-template.is-layout-flex){gap:1.25em}:where(.wp-block-post-template.is-layout-grid){gap:1.25em}:where(.wp-block-term-template.is-layout-flex){gap:1.25em}:where(.wp-block-term-template.is-layout-grid){gap:1.25em}:where(.wp-block-columns.is-layout-flex){gap:2em}:where(.wp-block-columns.is-layout-grid){gap:2em}:root :where(.wp-block-pullquote){font-size:1.5em;line-height:1.6}</style> 51<link rel='stylesheet' id='buy-me-a-coffee-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssd9bdb95a3373e938a171dab4faa59bf97dd0251056097ccdb415756bf77a9.css' media='all' /> 52<link rel='stylesheet' id='jnc-link-layout-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css5a90952c9fb90df6d7765f01c35dc475aec7b01f9b5a1b4cf5dc332367cee.css' media='all' /> 53<link rel='stylesheet' id='font-awesome-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css8cc1534b78a40b9ca9dc0100d829acfa2b58721f3ae71fa69f3fbf4bc069c.css' media='all' /> 54<link rel='stylesheet' id='qtip-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssf3139d806d1b2d160ab0a0441629fb5aa8f45f83a61b2cafe1b537afa795b.css' media='all' /> 55<link rel='stylesheet' id='quform-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssd7cc3c45520e64f347216df9a2b3a870c95bcb0ca2725f32b1c3331750150.css' media='all' /> 56<link rel='stylesheet' id='quform-theme-simple-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css427cc78c3a47eea64ecbe05f2edd5552f3426198861112b327864d6a97971.css' media='all' /> 57<link rel='stylesheet' id='wp-theme-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-csscc805b822d4e21a0398070961788653f51ad74bd2364ed3c5b4f4e03e0ee1.css' media='all' /> 58<link rel='stylesheet' id='wp-components-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css38fe28613dbf89d819ae2004f8e0d9ae82f8a4ed6296ee3ad33c6c6511a7a.css' media='all' /> 59<link rel='stylesheet' id='godaddy-styles-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css38b051f42fa98214592dffb7250ed880155ebb176c0db5ee0a30abbbf53cf.css' media='all' /> 60<link rel='stylesheet' id='ea11y-widget-fonts-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css655816faf5a25e036583360e82c340ce13ae3df31b08170f87abeda1cf2b9.css' media='all' /> 61<link rel='stylesheet' id='ea11y-skip-link-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-css08ba9acf02f04e4c8b3541d3fb35fb6738e8a97666dde37fd242359af3390.css' media='all' /> 62<link rel='stylesheet' id='josh-site-css' href='https://joshncampbell.com/wp-content/cache/fvm/min/1789248045-cssc9a1d7b59309d969aae8e663183cb5ef44615d3fa1dbb927a0dab711a28ed.css' media='all' />
63<script id="jquery-core-js" src="https://joshncampbell.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 63
63
64<script id="jquery-migrate-js" src="https://joshncampbell.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 64
64
65<script id="buy-me-a-coffee-js" src="https://joshncampbell.com/wp-content/plugins/buymeacoffee/public/js/buy-me-a-coffee-public.js?ver=4.4.10"></script>
vendor: 1 bytes, line 65
65
66<script id="josh-theme-js" src="https://joshncampbell.com/wp-content/themes/josh-campbell/assets/theme.js?ver=0.1.2"></script>
vendor: 80 bytes, lines 66-67
66 67<script id="google_gtagjs-js" src="https://www.googletagmanager.com/gtag/js?id=
67GT-NFRNJRV
vendor: 18 bytes, line 67
67" async></script>
68<script id="google_gtagjs-js-after"> 69window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);} 70gtag("set","linker",{"domains":["joshncampbell.com"]}); 71gtag("js", new Date()); 72gtag("set", "developer_id.dZTNiMT", true); 73gtag("config", "GT-NFRNJRV", {"googlesitekit_post_type":"post"}); 74window._googlesitekit = window._googlesitekit || {}; window._googlesitekit.throttledEvents = []; window._googlesitekit.gtagEvent = (name, data) => { var key = JSON.stringify( { name, data } ); if ( !! window._googlesitekit.throttledEvents[ key ] ) { return; } window._googlesitekit.throttledEvents[ key ] = true; setTimeout( () => { delete window._googlesitekit.throttledEvents[ key ]; }, 5 ); gtag( "event", name, { ...data, event_source: "site-kit" } ); }; 75//# sourceURL=google_gtagjs-js-after 76</script>
vendor: 1 bytes, line 76
76
77<script type="text/javascript"> 78(function(url){ 79if(/(?:Chrome\/26\.0\.1410\.63 Safari\/537\.31|WordfenceTestMonBot)/.test(navigator.userAgent)){ return; } 80var addEvent = function(evt, handler) { 81if (window.addEventListener) { 82document.addEventListener(evt, handler, false); 83} else if (window.attachEvent) { 84document.attachEvent('on' + evt, handler); 85} 86}; 87var removeEvent = function(evt, handler) { 88if (window.removeEventListener) { 89document.removeEventListener(evt, handler, false); 90} else if (window.detachEvent) { 91document.detachEvent('on' + evt, handler); 92} 93}; 94var evts = 'contextmenu dblclick drag dragend dragenter dragleave dragover dragstart drop keydown keypress keyup mousedown mousemove mouseout mouseover mouseup mousewheel scroll'.split(' '); 95var logHuman = function() { 96if (window.wfLogHumanRan) { return; } 97window.wfLogHumanRan = true; 98var wfscr = document.createElement('script'); 99wfscr.type = 'text/javascript'; 100wfscr.async = true; 101wfscr.src = url + '&r=' + Math.random(); 102(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(wfscr); 103for (var i = 0; i < evts.length; i++) { 104removeEvent(evts[i], logHuman); 105} 106}; 107for (var i = 0; i < evts.length; i++) { 108addEvent(evts[i], logHuman); 109} 110})('//joshncampbell.com/?wordfence_lh=1&hid=ECB4A5A38AB4B805C76D0A3FF37994CA'); 111</script>
111 112<style media="all">.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload),.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) *{background-image:none!important}@media screen and (max-height:1024px){.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload),.e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) *{background-image:none!important}}@media screen and (max-height:640px){.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload),.e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) *{background-image:none!important}}</style> 113<link rel="icon" href="https://joshncampbell.com/wp-content/uploads/2024/06/cropped-cropped-Profile-Photo-Rounded-192x192.png" sizes="192x192" /> 114<style id="wp-site-designer-contrast-fallback" media="all">.wp-block-group:not([data-dsgo-inline-bg]),.wp-block-column:not([data-dsgo-inline-bg]),.wp-block-columns:not([data-dsgo-inline-bg]){--dsgo-text-color:initial}:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover:not(.has-text-color){color:var(--wp--preset--color--contrast-3)!important;--dsgo-text-color:var(--wp--preset--color--contrast-3)}body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h1:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h2:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h3:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h4:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h5:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) h6:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) p:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(:is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column).has-background:not([class*="-background-color"]):not(.has-text-color):not(.is-style-footer-section):not(.is-style-header-section),.wp-block-cover) .wp-element-caption:not(.has-text-color):where(:not
114(.elementor *):not([data-elementor-type] *)){color:var(--dsgo-text-color,inherit)!important}body .wp-site-blocks :is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column)[data-dsgo-inline-bg] .wp-block-button:is([class*="is-style-outline"],[class*="is-style-secondary"]) .wp-element-button{color:var(--dsgo-text-color,inherit)!important;border-color:currentColor!important}body .wp-site-blocks :is(.wp-block-designsetgo-section,.wp-block-group,.wp-block-column)[data-dsgo-inline-bg] .wp-block-button:is([class*="is-style-outline"],[class*="is-style-secondary"]) .wp-element-button:hover{opacity:.75}body .wp-site-blocks [data-dsgo-inline-bg] h1:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h2:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h3:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h4:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h5:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] h6:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] p:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks [data-dsgo-inline-bg] .wp-element-caption:not(.has-text-color):where(:not(.elementor *):not([data-elementor-type] *)){color:var(--dsgo-text-color,inherit)!important}.wp-block-designsetgo-section.has-background:not([data-dsgo-inline-bg]):not(.has-text-color){color:var(--wp--preset--color--contrast);--dsgo-text-color:var(--wp--preset--color--contrast)}:is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-5);color:var(--wp--preset--color--contrast)}body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not
114(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast)}:is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-2);color:var(--wp--preset--color--contrast)}body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast)}:is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-1);color:var(--wp--preset--color--contrast)}body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not
114(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-3:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast)}:is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--accent-3);color:var(--wp--preset--color--accent-2)}body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--accent-2)}:is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)),.has-background:is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color:is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--contrast);color:var(--wp--preset--color--base)}body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not
114(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks :is(.wp-block-group,.wp-block-column).is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--base)}.wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)),.has-background.wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color.wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--base);color:var(--wp--preset--color--contrast)}body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-1:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast)}.wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)),.has-background.wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color.wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--base-2);color:var(--wp--preset--color--contrast-2)}body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not
114(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-2:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast-2)}.wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)),.has-background.wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color.wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--base-3);color:var(--wp--preset--color--contrast)}body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-4:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--contrast)}.wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)),.has-background.wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)),.has-text-color.wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)){background-color:var(--wp--preset--color--contrast);color:var(--wp--preset--color--base)}body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h1:where(:not
114(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h2:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h3:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h4:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h5:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) h6:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) p:where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) a:where(:not(.wp-element-button):not(.wp-block-social-link-anchor)):where(:not(.elementor *):not([data-elementor-type] *)),body .wp-site-blocks .wp-block-designsetgo-section.is-style-section-5:not(:is(.has-white-background-color,.has-black-background-color)) .wp-element-caption:where(:not(.elementor *):not([data-elementor-type] *)){color:var(--wp--preset--color--base)}body .wp-site-blocks input:not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="image"]):not([type="hidden"]),body .wp-site-blocks textarea,body .wp-site-blocks select{background-color:var(--wp--preset--color--base);color:var(--wp--preset--color--contrast);border:1px solid color-mix(in srgb,var(--wp--preset--color--contrast) 30%,transparent)}.wp-site-blocks input[type="submit"]:not(.wp-element-button),.wp-site-blocks button[type="submit"]:not(.wp-element-button){background-color:var(--wp--preset--color--accent-2);color:var(--wp--preset--color--base);border-width:0;padding:12px 30px;font-family:inherit;font-size:var(--wp--preset--font-size--medium,1rem);line-height:inherit;cursor:pointer}</style> 115<style id="site-designer-logo-constraints" media="all">.wp-block-site-logo.is-default-size img{width:auto;height:auto;max-width:180px;max-height:80px}.wp-block-site-logo img{height:auto}</style> 116</head> 117<body class="wp-singular post-template-default single single-post postid-3333 single-format-standard wp-custom-logo wp-embed-responsive wp-theme-josh-campbell inner-page eio-default ally-default elementor-default elementor-kit-1535">
118<script> 119const onSkipLinkClick = () => { 120const htmlElement = document.querySelector('html'); 121htmlElement.style['scroll-behavior'] = 'smooth'; 122setTimeout( () => htmlElement.style['scroll-behavior'] = null, 1000 ); 123} 124document.addEventListener("DOMContentLoaded", () => { 125if (!document.querySelector('#content')) { 126document.querySelector('.ea11y-skip-to-content-link').remove(); 127} 128}); 129</script>
129 130<nav aria-label="Skip to content navigation"> <a class="ea11y-skip-to-content-link" href="#content" tabindex="-1" onclick="onSkipLinkClick()" > Skip to content <svg width="24" height="24" viewBox="0 0 24 24" fill="none" role="presentation"> <path d="M18 6V12C18 12.7956 17.6839 13.5587 17.1213 14.1213C16.5587 14.6839 15.7956 15 15 15H5M5 15L9 11M5 15L9 19" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /> </svg> </a> <div class="ea11y-skip-to-content-backdrop"></div> </nav> <a class="skip" href="#main">Skip to content</a> <div class="wrap"><header class="header"> <a class="wordmark" href="https://joshncampbell.com/" aria-label="Joshua Campbell home">Joshua Campbell<b>.</b></a> <nav class="navigation" id="navigation" aria-label="Main navigation"> <a href="https://joshncampbell.com/work/">Work</a><a href="https://joshncampbell.com/about/">About</a><a href="https://joshncampbell.com/writing/" aria-current="location">Writing</a><a href="https://joshncampbell.com/resume/">Résumé</a><a href="https://joshncampbell.com/#contact">Contact</a></nav> <button class="menu" aria-expanded="false" aria-controls="navigation">Menu</button> <button class="theme" aria-label="Switch to dark mode">â</button> </header><main id="main"> <article class="native-article post-3333 post type-post status-publish format-standard has-post-thumbnail hentry category-design category-life-hacks category-tech category-technology tag-design tag-mobile tag-technology"> <section class="page-hero article-hero"><a class="text-link" href="https://joshncampbell.com/writing/">â All writing</a> <p class="eyebrow">Design · Life Hacks · Tech · Technology</p> <h1>Nine Bar 1.3: Find Any Shot, Instantly</h1><p class="article-byline">josh · <time datetime="2026-09-30T08:00:00-04:00">September 30, 2026</time></p></section> <figure class="landscape"><img fetchpriority="high" width="1024" height="683" src="https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-1024x683.png" class="attachment-large size-large wp-post-image" alt="Nine Bar v1.3 feature image showing the Brews search and filtering screens on two iPhones alongside espresso tools and coffee, highlighting faster ways to find brews in a growing journal." decoding="async" srcset="https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-1024x683.png 1024w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-300x200.png 300w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-768x512.png 768w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-1000x667.png 1000w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-550x367.png 550w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-150x100.png 150w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature-1060x707.png 1060w, https://joshncampbell.com/wp-content/uploads/2026/09/Nine-Bar-1.3-Feature.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure><div class="prose native-article-body"> <p class="wp-block-paragraph"><a href="https://ninebarapp.com/" target="_blank" rel="noreferrer noopener">Nine Bar</a> 1.3 is a focused update, and it’s aimed at a problem that only shows up once you’ve been using the app for a while: the more you log, the harder it gets to find one specific shot again.</p> <p class="wp-block-paragraph">This release adds search and filtering to the Brews tab â the tools to dig back through your entire brew history and find exactly the pull you’re thinking of, in seconds.</p> <h2 class="wp-block-heading">Find any shot, in seconds</h2> <figure class="wp-block-image size-medium"><a href="https://joshncampbell.com/wp-content/uploads/2026/09/brews-search.png"><img decoding="async" width="149" height="300" src="https://joshncampbell.com/wp-content/uploads/2026/09/brews-search-149x300.png" alt="Nine Bar Brews screen showing a search bar and a logged Holler Mountain Doppio brew with a 1:2 ratio, brew details, and four-star rating." class="wp-image-3328" srcset="https://joshncampbell.com/wp-content/uploads/2026/09/brews-search-149x300.png 149w, https://joshncampbell.com/wp-content/uploads/2026/09/brews-search-150x302.png 150w, https://joshncampbell.com/wp-content/uploads/2026/09/brews-search.png 427w" sizes="(max-width: 149px) 100vw, 149px" /></a></figure> <p class="wp-block-paragraph">When your brew log was five pulls long, scrolling to find one wasn’t a problem. A hundred pulls in, it is.</p> <p class="wp-block-paragraph">Nine Bar 1.3 adds a search bar to the top of Brews, ready as soon as you open the tab. Search by bean name to pull up every shot you’ve logged with it, no matter how far back it goes.</p> <h2 class="wp-block-heading">Narrow it down to exactly what you’re after</h2> <figure class="wp-block-image size-medium"><a href="https://joshncampbell.com/wp-content/uploads/2026/09/brews-filters.png"><img decoding="async" width="149" height="300" src="https://joshncampbell.com/wp-content/uploads/2026/09/brews-filters-149x300.png" alt="Nine Bar Brews filter screen with options to filter brew history by rating, grind setting, ratio, basket, grinder, brew method, and dose." class="wp-image-3329" srcset="https://joshncampbell.com/wp-content/uploads/2026/09/brews-filters-149x300.png 149w, https://joshncampbell.com/wp-content/uploads/2026/09/brews-filters-150x302.png 150w, https://joshncampbell.com/wp-content/uploads/2026/09/brews-filters.png 427w" sizes="(max-width: 149px) 100vw, 149px" /></a></figure> <p class="wp-block-paragraph">Search gets you most of the way there. Filters get you the rest.</p> <p class="wp-block-paragraph">The new Brews Filters sheet is organized around how brewing actually breaks down:</p> <ul class="wp-block-list"> <li><strong>Filter by recipe:</strong> Rating, Grind Setting, Dose, Yield, Ratio, and Time.</li> <li><strong>Filter by shot:</strong> Pressure and Basket size.</li> <li><strong>Filter by equipment:</strong> Grinder and Brew Method, so you can see every shot pulled on a given setup.<
130/li> </ul> <p class="wp-block-paragraph">Combine them, and you can answer questions your brew log couldn’t answer before â like which grind setting actually produced your five-star shots, or how a specific grinder performs across every bean you’ve run through it.</p> <h2 class="wp-block-heading">Small updates matter</h2> <p class="wp-block-paragraph">Nine Bar 1.3 isn’t a redesign, and it isn’t meant to be.</p> <p class="wp-block-paragraph">It’s about making sure the app keeps up with itself â that a coffee journal built to get more valuable the longer you use it doesn’t get harder to use in the process.</p> <p class="wp-block-paragraph">A more powerful log, without more work to keep it. That’s the idea behind this one.</p> <p class="wp-block-paragraph">Nine Bar 1.3 is available now</p> <p class="wp-block-paragraph">If you already have Nine Bar, update to version 1.3 to search and filter your entire Brews history.</p> <p class="wp-block-paragraph">If you’re new to Nine Bar, it’s a coffee journal built to help you remember the beans you try, the equipment you use, and the brews worth repeating.</p> <p class="wp-block-paragraph"><strong><a href="https://ninebarapp.com/" target="_blank" rel="noreferrer noopener">Find your nine. Then repeat it.</a></strong></p> <p class="wp-block-paragraph"><strong>PREVIOUS VERSION</strong><br>â <a href="https://joshncampbell.com/v1-2-faster-japanese/">Nine Bar 1.2: Faster Access, a Better Start, and Now in Japanese</a></p> </div> </article> <section class="section"> <nav class="navigation post-navigation" aria-label="Posts"> <h2 class="screen-reader-text">Post navigation</h2> <div class="nav-links"><div class="nav-previous"><a href="https://joshncampbell.com/coast-clear-2-1/" rel="prev">â Coast Clear 2.1: Follow the Beaches You Care About</a></div><div class="nav-next"><a href="https://joshncampbell.com/hasselblad-x2d2-28p-photos/" rel="next">20 Photos with the Hasselblad X2D II and XCD 28P â</a></div></div> </nav></section> <section class="section prose comments-area" id="comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/v1-3-brew-search-filters/#respond" style="display:none;">Cancel reply</a></small></h3><form action="https://joshncampbell.com/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> <span class="required-field-message">Required fields are marked <span class="required">*</span></span></p><p class="comment-form-comment"><label for="comment">Comment <span class="required">*</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required /></p> <p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required /></p> <p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" autocomplete="url" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label></p> <div hidden class="wpsec_captcha_wrapper"> <div class="wpsec_captcha_image"></div> <label for="wpsec_captcha_answer"> Type in the text displayed above </label> <input type="text" class="wpsec_captcha_answer" name="wpsec_captcha_answer" value=""/> </div> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='3333' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="24783d3c03" /></p><p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="127"/>
131<script> 132document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() ); 133</script>
133 134</p></form> </div> <p class="akismet_comment_form_privacy_notice">This site uses Akismet to reduce spam. <a href="https://akismet.com/privacy/" target="_blank" rel="nofollow noopener">Learn how your comment data is processed.</a></p></section> </main></div><footer class="contact" id="contact"><div class="wrap"> <p class="eyebrow">Have something in mind?</p><h2>Good things start<br>with <em>a conversation.</em></h2> <div class="contact-body"><p>A product challenge, a thoughtful collaboration,<br>or just a hello. Iâd love to hear from you.</p> <a class="email" href="mailto:[email protected]">[email protected] <span aria-hidden="true">â</span></a></div> <div class="footer"><span>© 2026 Joshua Campbell</span><span>Product, design & the details.</span><a href="#main">Back to top â</a></div> </div></footer>
135<script type="speculationrules"> 136{"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/josh-campbell/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 137</script>
vendor: 1 bytes, line 137
137
138<script> 139const registerAllyAction = () => { 140if ( ! window?.ElementorProFrontendConfig || ! window?.elementorFrontend?.utils?.urlActions ) { 141return; 142} 143elementorFrontend.utils.urlActions.addAction( 'allyWidget:open', () => { 144if (window?.ea11yWidget?.widget?.open) { 145return window.ea11yWidget.widget.isOpen() 146? window.ea11yWidget.widget.close() 147: window.ea11yWidget.widget.open(); 148} 149} ); 150}; 151const waitingLimit = 30; 152let retryCounter = 0; 153const waitForElementorPro = () => { 154return new Promise( ( resolve ) => { 155const intervalId = setInterval( () => { 156if ( retryCounter === waitingLimit ) { 157resolve( null ); 158} 159retryCounter++; 160if ( window.elementorFrontend && window?.elementorFrontend?.utils?.urlActions ) { 161clearInterval( intervalId ); 162resolve( window.elementorFrontend ); 163} 164}, 100 ); // Check every 100 milliseconds for availability of elementorFrontend 165}); 166}; 167waitForElementorPro().then( () => { registerAllyAction(); }); 168</script>
vendor: 1 bytes, line 168
168
169<script> 170( () => { 171const lazyloadRunObserver = () => { 172const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); 173const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { 174entries.forEach( ( entry ) => { 175if ( entry.isIntersecting ) { 176let lazyloadBackground = entry.target; 177if( lazyloadBackground ) { 178lazyloadBackground.classList.add( 'e-lazyloaded' ); 179} 180lazyloadBackgroundObserver.unobserve( entry.target ); 181} 182}); 183}, { rootMargin: '200px 0px 200px 0px' } ); 184lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { 185lazyloadBackgroundObserver.observe( lazyloadBackground ); 186} ); 187}; 188const events = [ 189'DOMContentLoaded', 190'elementor/lazyload/observe', 191]; 192events.forEach( ( event ) => { 193document.addEventListener( event, lazyloadRunObserver ); 194} ); 195} )(); 196</script>
vendor: 1 bytes, line 196
196
197<script id="jnc-legacy-hashes-js-before"> 198window.jncLegacyRoutes={"about-me":"https:\/\/joshncampbell.com\/about\/","resume":"https:\/\/joshncampbell.com\/resume\/","portfolio":"https:\/\/joshncampbell.com\/work\/","latest-from-the-blog":"https:\/\/joshncampbell.com\/writing\/","contact":"https:\/\/joshncampbell.com\/#contact"}; 199//# sourceURL=jnc-legacy-hashes-js-before 200</script>
vendor: 1 bytes, line 200
200
201<script id="jnc-legacy-hashes-js" src="https://joshncampbell.com/wp-content/plugins/jnc-site-routes/legacy-hashes.js?ver=1.0.0"></script>
vendor: 1 bytes, line 201
201
202<script id="jnc-external-links-js" src="https://joshncampbell.com/wp-content/plugins/jnc-site-routes/external-links.js?ver=1.1.2"></script>
vendor: 1 bytes, line 202
202
203<script id="quform-js-extra"> 204var quformL10n = []; 205quformL10n = {"pluginUrl":"https:\/\/joshncampbell.com\/wp-content\/plugins\/quform","ajaxUrl":"https:\/\/joshncampbell.com\/wp-admin\/admin-ajax.php","ajaxError":"Ajax error","errorMessageTitle":"There was a problem","removeFile":"Remove","supportPageCaching":true}; 206//# sourceURL=quform-js-extra 207</script>
vendor: 1 bytes, line 207
207
208<script id="quform-js" src="https://joshncampbell.com/wp-content/plugins/quform/cache/quform.js?ver=1783525861"></script>
vendor: 1 bytes, line 208
208
209<script id="ea11y-widget-js-extra"> 210var ea11yWidget = {"iconSettings":{"style":{"icon":"person","size":"medium","color":"#9DB4FF","cornerRadius":{"radius":32,"unit":"px"}},"position":{"desktop":{"hidden":false,"enableExactPosition":false,"exactPosition":{"horizontal":{"direction":"right","value":10,"unit":"px"},"vertical":{"direction":"bottom","value":10,"unit":"px"}},"position":"bottom-right"},"mobile":{"hidden":false,"enableExactPosition":false,"exactPosition":{"horizontal":{"direction":"right","value":10,"unit":"px"},"vertical":{"direction":"bottom","value":10,"unit":"px"}},"position":"bottom-right"}}},"toolsSettings":{"bigger-text":{"enabled":true},"bigger-line-height":{"enabled":true},"text-align":{"enabled":true},"readable-font":{"enabled":true},"grayscale":{"enabled":true},"contrast":{"enabled":true},"page-structure":{"enabled":true},"sitemap":{"enabled":false,"url":"http://joshncampbell.com/wp-sitemap.xml"},"reading-mask":{"enabled":true},"hide-images":{"enabled":true},"pause-animations":{"enabled":true},"highlight-links":{"enabled":true},"focus-outline":{"enabled":true},"screen-reader":{"enabled":false},"remove-elementor-label":{"enabled":false}},"accessibilityStatementURL":"","analytics":{"enabled":false,"url":null}}; 211//# sourceURL=ea11y-widget-js-extra 212</script>
vendor: 1 bytes, line 212
212
213<script id="ea11y-widget-js" src="https://cdn.elementor.com/a11y/widget.js?api_key=ea11y-a0959695-4ae4-4bc4-bc28-d8f699dde0e6&ver=4.1.4"referrerPolicy="origin"></script>
vendor: 1 bytes, line 213
213
214<script id="ea11y-remediation-module-chunk-lib-postcss-js" src="https://joshncampbell.com/wp-content/plugins/pojo-accessibility/assets/build/lib-postcss.js?ver=dd3d6ae95e727956a431"></script>
vendor: 1 bytes, line 214
214
215<script id="wp-hooks-js" src="https://joshncampbell.com/wp-includes/js/dist/hooks.min.js?ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 215
215
216<script id="wp-i18n-js" src="https://joshncampbell.com/wp-includes/js/dist/i18n.min.js?ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 216
216
217<script id="wp-i18n-js-after"> 218wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 219//# sourceURL=wp-i18n-js-after 220</script>
vendor: 1 bytes, line 220
220
221<script id="remediation-module-js" src="https://joshncampbell.com/wp-content/plugins/pojo-accessibility/assets/build/remediation-module.js?ver=dd3d6ae95e727956a431"></script>
vendor: 1 bytes, line 221
221
222<script async data-wp-strategy="async" fetchpriority="low" id="comment-reply-js" src="https://joshncampbell.com/wp-includes/js/comment-reply.min.js?ver=7.1.3"></script>
vendor: 1 bytes, line 222
222
223<script id="googlesitekit-events-provider-content-events-js-before"> 224window._googlesitekit = window._googlesitekit || {}; 225window._googlesitekit.contentEvents = {"postID":3333,"isReadableSinglePost":true,"hasVimeoEmbed":false,"wordCount":377,"estimatedReadTimeSeconds":95,"isLastPageOfMultiPagePost":true,"readTimeThresholdPercent":85,"minimumReadTimeSeconds":5}; 226//# sourceURL=googlesitekit-events-provider-content-events-js-before 227</script>
vendor: 1 bytes, line 227
227
228<script id="googlesitekit-events-provider-content-events-js" src="https://joshncampbell.com/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-content-events-6b04077d00f0d606ba42.js" defer></script>
vendor: 1 bytes, line 228
228
229<script id="wpsec_show_captcha-js" src="https://captcha.wpsecurity.godaddy.com/api/v1/captcha/script?trigger=comment"></script>
vendor: 1 bytes, line 229
229
230<script defer id="akismet-frontend-js" src="https://joshncampbell.com/wp-content/plugins/akismet/_inc/akismet-frontend.js?ver=1787240903"></script>
vendor: 1 bytes, line 230
230
231<script>'undefined'=== typeof _trfq || (window._trfq = []);'undefined'=== typeof _trfd && (window._trfd=[]), 232_trfd.push({'tccl.baseHost':'secureserver.net'}), 233_trfd.push({'ap':'wpaas_v2'}, 234{'server':'71a4e459a432'}, 235{'pod':'c16-prod-p3-us-west-2'}, 236{'xid':'45913723'}, 237{'wp':'7.1.3'}, 238{'php':'8.3.35'}, 239{'loggedin':'0'}, 240{'cdn':'1'}, 241{'builder':'wp-block-editor'}, 242{'theme':'josh-campbell'}, 243{'wds':'0'}, 244{'wp_alloptions_count':'1141'}, 245{'wp_alloptions_bytes':'163004'}, 246{'gdl_coming_soon_page':'0'} 247, {'appid':'294768'} ); 248var trafficScript = document.createElement('script'); trafficScript.src = 'https://img1.wsimg.com/signals/js/clients/scc-c2/scc-c2.min.js'; window.document.head.appendChild(trafficScript);</script>
vendor: 1 bytes, line 248
248
249<script>window.addEventListener('click', function (elem) { var _elem$target, _elem$target$dataset, _window, _window$_trfq; return (elem === null || elem === void 0 ? void 0 : (_elem$target = elem.target) === null || _elem$target === void 0 ? void 0 : (_elem$target$dataset = _elem$target.dataset) === null || _elem$target$dataset === void 0 ? void 0 : _elem$target$dataset.eid) && ((_window = window) === null || _window === void 0 ? void 0 : (_window$_trfq = _window._trfq) === null || _window$_trfq === void 0 ? void 0 : _window$_trfq.push(["cmdLogEvent", "click", elem.target.dataset.eid]));});</script>
vendor: 1 bytes, line 249
249
250<script src='https://img1.wsimg.com/traffic-assets/js/tccl-tti.min.js' onload="window.tti.calculateTTI()"></script>
250 251</body> 252</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.