PageSourceSearch

https://joshncampbell.com/v1-3-brew-search-filters/

html joshncampbell.com collected 2026-10-09 01:38:29 UTC 81,396 bytes, 252 lines download raw bytes

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 &amp; 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 &raquo; Feed" href="https://joshncampbell.com/feed/" /> 
44<link rel="alternate" type="application/rss+xml" title="Joshua Campbell &raquo; Comments Feed" href="https://joshncampbell.com/comments/feed/" /> 
45<link rel="alternate" type="application/rss+xml" title="Joshua Campbell &raquo; 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&#8217;s aimed at a problem that only shows up once you&#8217;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&#8217;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&#8217;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&#8217;ve logged with it, no matter how far back it goes.</p> <h2 class="wp-block-heading">Narrow it down to exactly what you&#8217;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&#8217;t answer before — like which grind setting actually produced your five-star shots, or how a specific grinder performs across every bean you&#8217;ve run through it.</p> <h2 class="wp-block-heading">Small updates matter</h2> <p class="wp-block-paragraph">Nine Bar 1.3 isn&#8217;t a redesign, and it isn&#8217;t meant to be.</p> <p class="wp-block-paragraph">It&#8217;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&#8217;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&#8217;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&#8217;re new to Nine Bar, it&#8217;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>&#916;<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 &amp; 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&#038;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.