<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Site-Server v@build.version@ (http://www.squarespace.com) on Fri, 10 Apr 2026 15:27:39 GMT
--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://www.rssboard.org/media-rss" version="2.0"><channel><title>Product leader scaling B2B2C platforms with AI, data &#x26; UX</title><link>https://www.geoffmosher.me/blog/</link><lastBuildDate>Mon, 02 Mar 2026 22:44:16 +0000</lastBuildDate><language>en-US</language><generator>Site-Server v@build.version@ (http://www.squarespace.com)</generator><description><![CDATA[]]></description><item><title>AI agent personas: service design, updated</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Tue, 24 Feb 2026 22:44:15 +0000</pubDate><link>https://www.geoffmosher.me/blog/632ayjcv5lrcvd5z87evpikbnwdpov</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:69a5a4de8c43bf4babca5d43</guid><description><![CDATA[A practical guide to mapping AI agents and humans together, before autonomy 
makes your UX blurry.]]></description><content:encoded><![CDATA[<h3>A practical guide to mapping AI agents and humans together, before autonomy makes your UX blurry.</h3><h4><strong>Humans have company: agent users</strong></h4><p class="">AI agents have joined human users inside digital ecosystems. That shift makes parallel optimization for both user types table stakes, especially for products moving toward Level 3 to Level 5 autonomy.</p><p class="">This is where nuanced design thinking pays off. Agentic systems raise new questions about oversight, permissions, and control; the good news is we already have proven ways to model complexity without losing the human-centered plot.</p><p class="">Empathy maps and personas still do what they have always done: they turn ambiguity into clarity. Now they do it across a blended ecosystem of humans, agents, and the products that connect them.</p><p class="">In my work as a product strategy consultant, I’m currently helping build an agentic AI platform designed to analyze, verify and remediate user experience issues <em>before</em> they become fuel for churn. That means adapting the same service-design empathy and persona techniques I’ve used for years; then extending them to represent the interplay between humans, agents and product surfaces, with explicit lines of visibility and control.</p><p class="">This post shares practical approaches that scale. They also leave room for what matters most in agentic systems: evaluation, training and governance that stay grounded in user intent.</p><p class="">From here, the pattern is clear. Agents have evolved from assistants to semi-autonomous participants that hold state and make choices. They also introduce new failure modes. The symptoms are familiar: confusion, loss of control and “why did it do that?”</p><p class="">Nuanced UX thinking is how product teams tame complexity with clarity. Here’s what extending the craft looks like today. </p><p class=""><a href="https://www.geoffmosher.me/s/Agent-Persona-Playbook-Templates-Mosher-Enterprises_2-2026pptx.pdf" target="_blank"><strong>Download the companion PDF</strong></a>, a reusable blueprint for building human and AI agent archetypes, complete with templates and source links. It’s FREE!</p><h4><strong>Empathy maps: same grid, smarter labels</strong></h4><p class="">Classic empathy maps translate messy qualitative inputs into patterns you can act on.</p><p class="">Chris Butler’s <a href="https://uxdesign.cc/robots-need-love-too-empathy-mapping-for-ai-59585ad3548d" target="_blank">ML-era framing</a> still holds: focus on what a system <strong>does</strong>, <strong>senses</strong>, <strong>says</strong>, <strong>thinks</strong>, and what we might be tempted to call “feels.” </p><p class="">For AI agents, two quadrants transfer cleanly: <strong>Says</strong> and <strong>Does</strong>. And two subtle evolutions keep the exercise useful while avoiding anthropomorphism:</p><ul data-rte-list="default"><li><p class=""><strong>Thinks → Thinks/Infers</strong> (or simply <strong>Infers</strong>)</p></li><li><p class=""><strong>Feels → Senses</strong> (or simply <strong>Senses</strong>)</p></li></ul><p class="">Use these definitions as guardrails… </p><ul data-rte-list="default"><li><p class=""><strong>Says:</strong> what the agent outputs, including refusals, tool results, and error states</p></li><li><p class=""><strong>Does:</strong> actions it takes, including API calls, retrieval, updates, and escalation</p></li><li><p class=""><strong>Infers:</strong> underlying heuristics and decision logic; tag as inferred</p></li><li><p class=""><strong>Senses:</strong> the input signals it processes, including context, telemetry, and feedback</p></li></ul><p class="">One discipline makes this powerful: <strong>Says + Does = observed; Infers + Senses = inferred </strong>(when evidence supports it). Cluster the evidence. Then crystallize it into bios, quotes, motivations and frustrations.</p><h4><strong>Personas: demographic for humans, system for agents</strong></h4><p class="">Human personas need demographics because those attributes shape constraints and intent. Your template should reflect that structure habitually.</p><p class="">Agent personas need the functional equivalent to demographics: the <strong>LLM(s)</strong>, <strong>feedback mechanisms</strong>, <strong>training data</strong> and more. These fields explain why an agent behaves the way it does, how it learns and how safe it is to trust.</p><p class="">This is also where UX and model design must meet. System prompts, tools and evaluations are part of the experience. Treat them like product surfaces.</p><h4><strong>A playbook for Level 3–5 autonomy</strong></h4><p class="">The autonomy ladder is a design choice. The <a href="https://knightcolumbia.org/content/levels-of-autonomy-for-ai-agents-1" target="_blank">framework</a> from Feng, McDonald and Zhang describes five levels, defined by the user’s role: operator, collaborator, consultant, approver and observer.</p><p class="">If you’re building toward Levels 3 to 5, take this approach:</p><ul data-rte-list="default"><li><p class="">Revisit your critical journeys each time an agent enters the flow.</p></li><li><p class="">Spot the lonely moments: the cognitive, logistical, and creative burden points.</p></li><li><p class="">Assign agent strengths to those moments, with explicit permissions and reversibility.</p></li><li><p class="">Bring it to life: narrate the “before/after” so stakeholders feel the value.</p></li></ul><p class="">Then balance autonomy with control. <a href="https://www.uxmatters.com/mt/archives/2025/12/designing-for-autonomy-ux-principles-for-agentic-ai.php" target="_blank">UXmatters</a> nails the core tension: as systems become more agentic, design must define the rules of engagement, including transparency, oversight and safe intervention.</p><h4><strong>Closing inference: name your new users</strong></h4><p class="">Personas turn scattered signals into shared direction. They translate governance into plain language.</p><p class="">Whenever agents are part of your product’s social graph, give them names, constraints, goals and pain points. Then design the shared interface as if both humans and agents must succeed.</p><p class="">Your future UX depends on it.</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1772492158770-3MM38RZAUKUX8KEO6VE7/AI+agent+personas.png?format=1500w" medium="image" isDefault="true" width="1264" height="848"><media:title type="plain">AI agent personas: service design, updated</media:title></media:content></item><item><title>TikTok’s death by a thousand shadow bans</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Wed, 28 Jan 2026 17:07:42 +0000</pubDate><link>https://www.geoffmosher.me/blog/tiktoks-death-by-a-thousand-shadowbans</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:697a1baf0340ee0df91ff480</guid><description><![CDATA[When the ‘For You’ page turns against you]]></description><content:encoded><![CDATA[<h3><strong>When the ‘For You’ page turns against you</strong></h3><p class="">TikTok is good at algorithms but not math.</p><p class="">When ~25% of your user base creates ~98% of your content, and you start “disappearing” posts critical of hot-button political issues, congratulations: you’ve unlocked the recipe for self-inflicted churn.</p><p class="">On Sunday, TikTok stopped the clock on its credibility, at least for me.</p><p class="">I was one of countless users whose videos were hit with the dreaded <strong>"Visibility restricted"</strong> label for allegedly violating Community Guidelines.</p><p class="">My post? A call for justice after the murder of ICU nurse Alex Pretti by masked Border Patrol agents. No profanity. No threats. Just indignation, and a demand for accountability.</p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png" data-image-dimensions="800x800" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=1000w" width="800" height="800" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ebd1c21d-df14-4afb-9997-d962d63e143d/TikTokery.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p data-rte-preserve-empty="true">The TikTok that ran afoul of guidelines, and the one that didn’t. Go figure. </p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="">A day later, TikTok restored the video following my appeal. But it was already buried. Four likes. Four.</p><p class="">Meanwhile, a satirical clip I posted the day before poking fun at DHS’s bizarre winter storm messaging (ice = "freezing rain") hit 1,123 views.</p><p class="">I'm no influencer. Micro-influencer would be generous. But the trend is telling.</p><p class="">When your supposedly-neutral algorithm starts acting like a nervous PR intern for a political family dynasty, you’re announced “glitching” looks and feels a lot more like signaling.</p><p class="">And what timing. The censorship came just as TikTok’s U.S. operations were handed off to the Trump-aligned Ellison family. Yes, that Ellison family, flush with Oracle cash and fresh off acquiring Paramount Global, CBS's parent company.</p><p class="">A year ago, in that wake of that deal, CBS axed "The Late Show with Stephen Colbert," a ratings leader. Staffers said it was to appease Trump, the same president who’d publicly attacked Colbert for doing what comedians do: satire.</p><p class="">In October, CBS appointed conservative commentator Bari Weiss to oversee editorial direction of the network. Her tenure so far? Spiking a "60 Minutes" exposé on DHS deporting migrants to CECOT, El Salvador’s notorious mega-prison. Since then, over a million viewers have exited a network increasingly mocked as "See BS News".</p><p class="">Now, the Ellisons are eyeing Warner Brothers Discovery. That’s CNN, HBO and DC Comics.</p><p class="">And, with the FCC defanged by Trump-era appointees, its chairman openly declaring it's no longer independent, the stage is set for a domino effect: partisan capture of media ecosystems masquerading as “restructuring” that’s “good for the consumer”.</p><p class="">Consumers and watchdogs are right to be concerned about CNN devolving to "Censored News Network," streaming programs like "Succession: The Trump Family Edition," and even Superman sporting a state insignia on his chest.</p><p class="">To be clear, as a former journalist and media salesperson—and an avid news consumer—I welcome diverse news and entertainment ecosystems, so long as they don't brazenly violate established federal broadcasting standards, aren't anti-competitive monopolies, and don't cave to political or oligarchical whims.</p><p class="">Concerning as it may be, this moment isn’t a fait accompli.</p><p class="">Corruption thrives when citizens go passive: When we stop following the money. When we accept press releases as journalism. When we let the loudest buyers dictate the quietest truths.</p><p class="">In democratic societies, a free press and a thriving entertainment amount to civic infrastructure. They, and courageous citizens with smartphone cameras and live-streams, document the cracks before the collapse.</p><p class="">If algorithms skew toward suppression, citizens highlight it. If ownership shifts warp editorial voice, citizens interrogate it.</p><p class="">We, citizens, have agency. We can and should… </p><ul data-rte-list="default"><li><p class="">Uninstall the apps that erase dissent</p></li><li><p class="">Cancel the subscriptions funding silence</p></li><li><p class="">Speak clearly where platforms hope we mumble</p></li><li><p class="">Pressure lawmakers and regulators to act</p></li><li><p class="">Back institutions that defend journalistic and artistic independence</p></li><li><p class="">And most of all: vote</p></li></ul><p class="">The clock only stops ticking when we stop listening for it.</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1769619573144-UGE0T612YNRV5XTDI5H3/TikTok+%27Visibility+Restricted%27.png?format=1500w" medium="image" isDefault="true" width="1024" height="1024"><media:title type="plain">TikTok’s death by a thousand shadow bans</media:title></media:content></item><item><title>25 tracks I kept on replay in ‘25</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Sat, 29 Nov 2025 00:30:15 +0000</pubDate><link>https://www.geoffmosher.me/blog/cry2a5u55b628kyqp747mcqpnztxhz</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6929bdf704cc5366eeaf1a04</guid><description><![CDATA[The tracks that shaped my year, each a portal into albums worth exploring]]></description><content:encoded><![CDATA[<h3>The tracks that shaped my year, each a portal into albums worth exploring</h3><p class="">2024 gave me two generational cornerstones with <a href="https://cindylee.bandcamp.com/album/diamond-jubilee" target="_blank">Cindy Lee</a> and <a href="https://shop.my-gnx.com/" target="_blank">Kendrick Lamar</a>.<br>2025 didn’t deliver a comparable watershed, <a href="https://www.discogs.com/lists/WWDND-What-Would-Dieter-Not-Doif-He-Were-a-Vinyl-Collector-with-Just-One-Crate-This-companion-list-/1281003" target="_blank"><em>top-50-all-time</em></a> LP. Instead, it served a scattering of significant entry‑points.<br>Each of these 25 tracks pried open an album, and led me down rabbit‑holes of atmosphere and groove with unexpected turns. All but one have links to <strong>Bandcamp</strong>, the most artist‑friendly way to listen, support and collect.</p><p class="">Here they are INPO with short descriptions of their gusto and gravity.</p>


  


  



<hr />
  
  <ol data-rte-list="default"><li><p class=""><strong>Sharp Pins – (I Wanna) Be Your Girl</strong><br> Jangly garage‑rock haze, a Chicago solo offshoot sharpening the edges of Lifeguard’s youthful buzz. Hooks in lo‑fi tones, and <a href="https://www.guidedbyvoices.com/" target="_blank">GBV</a> nostalgia riff‑forward energy that hit me like a shot of summer in early spring.<br> <a href="https://sharppins.bandcamp.com/track/i-wanna-be-your-girl" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Decius, Lias Saoudi – Arctic Spring (Album Version)</strong><br> Nightclub pulse with punk’s urgency, Decius fused dancefloor swagger and youthful urgency. This one track unlocked a full record layered with moody grooves and subterranean energy, my summer banger.<br><a href="https:// https://decius.bandcamp.com/track/arctic-spring-album-version-feat-lias-saoudi" target="_blank"> Bandcamp →</a> </p></li><li><p class=""><strong>Ale Hop, Titi Bakorta – Nitaangaza</strong><br> Kampala-meets-Lima psych-ritual; swirling guitar lines echo over syrupy psych-rock textures. They culminate in a track that feels like watching dust motes move in golden afternoon light.<br> <a href="https://nyegenyegetapes.bandcamp.com/track/nitaangaza" target="_blank">Bandcamp → </a></p></li><li><p class=""><strong>dreamcastmoe, NAPPYNAPPA – heyyheyy</strong><br> Davon Bryant-Mason twists contours of R&amp;B, jazz and hip-hop into something playful yet astute. This cut was my compass to a series of genre-hopping experiments, mostly coherent under his crooned code.<br> <a href="https://dreamcastmoe.bandcamp.com/track/heyy-heyy-feat-nappynappa" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Gryphon Rue – Blue Eraser</strong><br> Ambient collage that dissolves structure into ghostly fragments. It feels like listening to a memory unsplintering: eerie, beautiful and elusive.<br> <a href="https://gryphonrue.bandcamp.com/track/blue-eraser" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Mary Halvorson – Polyhedral</strong><br> Sextet jazz with razor-sharp interplay among guitar, vibes, brass and drums. Brief but as dense as the NYC guitarist’s 2025 album on which improvisation breeds a modern architecture built to last.<br> <a href="https://maryhalvorson.bandcamp.com/track/polyhedral" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Gelli Haha – Spit</strong><br> Alien disco-club chaos with warped analog effects and half-serious carnival-pop energy. Hearing “Spit” once was like crashing through a wall and realizing there’s a rollicking funhouse beyond, a wrecking‑ball of musical convention from the City of Angels.<br> <a href="https://gellihaha.bandcamp.com/track/spit" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Surprise Chef – Bully Ball</strong><br> Melbourne cinematic funk, dusted with smoke-room soul and muscle. A cocktail of ‘70s jazz-funk, DIY grit and afro-beat warmth. Recommended to fans of Clutchy Hopkins, Money Mark and Madlib.<br> <a href="https://surprisechef.bandcamp.com/track/bully-ball-2" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Pink Butter – Voice Memo</strong><br> This Stockholm quartet bends jazz improvisation with hip-hop and soul energy. The deep-groove undercurrents on this track reminded me why spontaneous music still matters.<br> <a href="https://pinkbutter.bandcamp.com/track/voice-memo" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Matthew Herbert &amp; Momoko Gill – Babystar</strong><br> Textural subtlety and emotional weight. Herbert’s tactile production meets Gill’s intimate voice to spawn clay‑like songs. This track is reminiscent of his ‘90s-‘00s house collabs with Dani Siciliano.<br> <a href="https://matthewherbert.bandcamp.com/track/babystar" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Mdou Moctar – Funeral for Justice (Injustice Version)</strong><br> Saharan guitar fury, urgent and relentless. A howl and a prayer at once. This song pulled me deep into Tuareg psychedelic tradition…updated for today’s fractures. It’s a fitting title for a year that saw the steady decline of democracy and human rights globally. <br> <a href="https://mdoumoctar.bandcamp.com/track/funeral-for-justice-injustice-version" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Adam Fairhall &amp; Johnny Hunter – Nicole</strong><br> Sparse upright piano and snare drums channel early chamber jazz with modern tenderness. Their tribute to Mary Lou Williams reimagines musical history with affection and subtle reinvention.<br> <a href="https://discusmusic.bandcamp.com/track/nicole" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Rose City Band – Open Roads</strong><br> Sun‑drenched Americana: guitar-forward country rock cruising toward dusty horizon lines. A song built for endless late‑night drives or quiet re‑reads of forgotten postcards.<br> <a href="https://rosecityband.bandcamp.com/track/open-roads" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Baxter Dury – Alpha Dog</strong><br> Louche London nightlife crystallized in sonic form: half‑insomnia, half‑cocktail hour melancholy. The track I dug most on the ninth studio album from an artist whose outsider wit ages weirdly well.<br> <a href="https://baxterdury.bandcamp.com/track/alpha-dog" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Bios Contrast, Nilotpal Das – 115.14 Bm (Jazz Edit)</strong><br> A textural collage from India that blends harmonium drones, electronic fractures, ethereal vocals and environmental noise. This sonic labyrinth demands multiple visits to fully appreciate it.<br> <a href="https://bioscontrast.bandcamp.com/track/11514-bm-jazz-ed1t" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>The Cords – When You Said Goodbye</strong><br> This Scottish sister-duo’s DIY jangle pop boasts tender melodies and lo‑fi charm that’s beautifully simple; and this track manages to feel at once new and nostalgic. What’s not to love?<br> <a href="https://thecordsband.bandcamp.com/track/when-you-said-goodbye-2" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Brandee Younger – Breaking Point</strong><br> Harp-led jazz soul that’s as spiritual as it is sparkly. Younger, Alice Coltrane’s harp in hand, bridges ancestry and the present on this track that shimmers with elegance and courage.<br> <a href="https://brandee.bandcamp.com/track/breaking-point" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Dictaphone – Casca il mondo</strong><br> Dictaphone’a minimal post‑punk that’s somewhere between dark ambient and musique‑concrète is well captured on this track. It’s framed with ghosts of sax and violin melodies that produce a complex, global‑rooted sound. Unsettling, meditative and essential.<br> <a href="https://dictaphonemusic.bandcamp.com/album/unstable" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Los Pirañas – Despectiva caridad</strong><br> Bogota’s avant‑Latin jam: improvisation married to dance rhythms and dub sway. This track moves as if alive, looping, writhing and breathing. It makes me nervous in the best possible way.<br> <a href="https://los-piranas.bandcamp.com/track/despectiva-caridad" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Bitchin Bajas – Skylarking</strong><br> Meditative Chicagoland cosmic kraut drift that’s airy and weightless, like floating inside a slowly-rotating orb. Skylarking is the sonic equivalent of exhaling after a long-held breath. It’s immersive and hypnotic yet still grounding.<br> <a href="https://bitchinbajas.bandcamp.com/track/skylarking" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Bb Trickz – Super</strong><br> Barcelona‑bred rapper Bb Trickz is bold and unpredictable. She has a penchant for hyper‑pop with street‑corner edge. This track on a release barely long enough to be an EP was a spark that kept me ‘rewinding’.<br> <a href="https://www.youtube.com/watch?v=C8WmCFg65C0" target="_blank">YouTube →</a> </p></li><li><p class=""><strong>Maria Somerville – Stonefly</strong><br> This cut from the Irish shoegazer makes me feel as though I’m drifting into a Galway fog at TR6 speed. It’s folk roots tangled with post‑punk wings. Beautiful melancholy.<br> <a href="https://mariasomerville.bandcamp.com/track/stonefly" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Milkweed – Drinking in the House of Fedlimid</strong><br> Speaking of Irish roots, Milkweed’s modern folk LP earned accolades for transforming ancient tales through an experimental lens. The distorted vocals, shimmering synths and existential echo of this track’s analog elements refused to leave my headphones.<br> <a href="https://milkweedfolk.bandcamp.com/track/drinking-in-the-house-of-fedlimid-2" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>JB Dunckel &amp; Jonathan Fitoussi – Tanzanite</strong><br> I stumbled on this album from AIR’s Dunckel and fellow Parisian Fitoussi while in the City of Light this summer. Their electronic minimalism has copious retro‑futurist polish, and this track’s floating rhythms and crystalline melodies create moments of pure sonic light. <br> <a href="https://transversales.bandcamp.com/track/tanzanite" target="_blank">Bandcamp →</a> </p></li><li><p class=""><strong>Ben LaMar Gay – roller stakes</strong><br> Chicago composer and instrumentalist Gay weaves a percussion‑rich tapestry that’s kaleidoscopic in motion. This track brought me into a world every bit as warm as I hear the quartet’s jam sessions are.<br> <a href="https://intlanthem.bandcamp.com/track/roller-skates" target="_blank">Bandcamp →</a> </p></li></ol>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>2025’s musical register?</strong> </p><p class="">In a word, polychromatic. Eschewing labels. Shards of sound. Each capable of piercing the dimmest environs.</p><p class="">All of these tracks guided me deeper into new releases I returned to often.</p><p class="">If my 2024 post, <a href="https://www.geoffmosher.me/blog/signals-from-the-deep"><em>Signals from the Deep</em></a>, was about albums that settled like bedrock, this 2025 list captures the scatter and fracture of colors that refract.</p><p class="">Bright pieces. Sharp corners. Resonance…waiting to be rediscovered.</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1764343508548-ATQ5ZSC54APQHMX903UL/2025+music+recap.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">25 tracks I kept on replay in ‘25</media:title></media:content></item><item><title>Browser wars 2025: the AI‑driven surge</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Thu, 30 Oct 2025 02:20:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/browser-ears2025-the-aidriven-surge</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:69153fe91e962717d88f7c87</guid><description><![CDATA[Challengers emerge, incumbents evolve; browsing shifts from passive 
rendering to active collaboration]]></description><content:encoded><![CDATA[<h4>Challengers emerge, incumbents evolve; browsing shifts from passive rendering to active collaboration</h4><p class="">I should have hit publish on this piece a week ago. But, between a consulting sprint and some long-overdue hands-on time with Chrome/Safari/Explorer alternatives, I hit pause purposefully. </p><p class="">The new wave of AI browsers defy weekend reviews. You inhabit them, noticing what sticks, what nags and what surprises.</p><p class="">Spend time with them and it's clear: the browser, once a passive window into the web, is now an active partner. Launches from ChatGPT Atlas (OpenAI), Microsoft Edge (Copilot Mode), Opera Neon and others have born witness to an arms race that seeks to redefine the browser in the AI era.</p><p class="">Below are my hot takes on browsers vying for active user-base supremacy in order by beta/launch date. I've called out distinguishing features, downsides and other takeaways observed by yours truly and/or commented on widely by others.</p><p class="sqsrte-large"><strong>Atlas, the challenger</strong></p><p class="">OpenAI launched <a href="https://chatgpt.com/atlas/" target="_blank"><strong>Atlas</strong></a> (macOS‑only at launch) as a full browser with built‑in chat, memory and agent‑mode. </p><p class=""><strong>Key features</strong></p><p class="">• Sidebar chatbot across every tab: summarise, edit, ask for context </p><p class="">• Memory store: the browser remembers your patterns and gives personalised responses </p><p class="">• Agent mode (for Pro/Business): automates tasks like form‑filling, booking and research </p><p class=""><strong>Limitations:</strong> On top of the OS limitation, the assistant is sometimes flat-out wrong. </p><p class=""><strong>Why it matters:</strong> If browsing becomes a dialogue rather than a tool, Atlas could rewrite the script.</p><p class="sqsrte-large"><strong>Edge with Copilot Mode, the incumbent evolves</strong></p><p class="">Two days after Atlas made headlines, Microsoft turned up the volume with Edge’s <a href="https://www.microsoft.com/en-us/edge/copilot-mode?form=MG0AWI&amp;cs=2282084340" target="_blank"><strong>Copilot Mode</strong></a>. </p><p class=""><strong>Key features</strong></p><p class="">• A single input box that blends chat, search and navigation; tabs become part of the “conversation” </p><p class="">• “Journeys” groups your past browsing into topics </p><p class="">• “Actions” let the browser intervene: clear cache, compare info across tabs, voice commands, etc.</p><p class=""><strong>Why it matters:</strong> The giant is pivoting from rendering webpages to interpreting and acting on them.</p><p class="sqsrte-large"><strong>Arc</strong> (and other productivity‑first browsers)</p><p class=""><a href="https://arc.net/" target="_blank"><strong>Arc Browser</strong></a> from The Browser Company (acquired by Atlassian) isn’t entirely AI‑first, but its UI innovations point toward the future.</p><p class="">It’s fresh tab model includes a vertical sidebar, side‑by‑side views and a revived “spaces” concept. </p><p class=""><strong>Downsides:</strong> development has reportedly stalled, and the company is focussing on a new AI‑centric “<a href="https://www.diabrowser.com/" target="_blank"><strong>Dia</strong></a>” browser. </p><p class=""><strong>Why it matters:</strong> If AI is the engine, then Arc’s interface could be the chassis for the ride.</p><p class="sqsrte-large"><strong>Agentic browsers &amp; niche challengers</strong></p><p class="">Beyond the names above, I've tinkered with these upstart browsers, further proof that web browsing is not a two‑horse race.</p><p class="">• <a href="https://polabrowser.com/" target="_blank"><strong>Pola Browser</strong></a><strong>:</strong> macOS‑only, project‑focused, sidebar tabs + AI summariazation. </p><p class="">• <a href="https://www.operaneon.com/" target="_blank"><strong>Opera Neon</strong></a><strong>:</strong> AI‑agentified; “Do,” “Cards, and “Tasks” for workflows. </p><p class="">• Niche open‑source/alternative projects (e.g., <a href="https://zen-browser.app/" target="_blank"><strong>Zen Browser</strong></a>) that focus on tab‑management and custom workflows. </p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>Why this matters to you</strong></p><p class="">Well, what used to be a simple job (“render a webpage”) has evolved into something more: the browser as your assistant. The implications include but are not limited to...</p><p class="">• <strong>For research,</strong> summarize long articles and elevate their key points</p><p class="">• <strong>For productivity,</strong> group tabs into tasks, and let AI suggest next steps</p><p class="">• <strong>For choice: y</strong>ou’re no longer forced into the mainstream browser; niches matter.</p><p class="">And, yes: I encourage you to try out these browsers. </p><p class="">But, before you do so, some cautionary notes…</p><p class="">• <strong>Privacy:</strong> If your browser has a memory store or agent mode, check what it remembers and shares</p><p class="">• <strong>Battery/RAM trade‑offs:</strong> Some experimental browsers (or feature‑heavy ones) can tax your machine</p><p class="">• <strong>Feature maturity:</strong> Many AI‑browser features are early stage, so usefulness will vary</p><p class="">• <strong>Ecosystem compatibility:</strong> Extensions, sync and profile support are all still differentiators</p><p class="sqsrte-large"><strong>Let the arms‑race drive innovation</strong></p><p class="">We’re watching a dramatic shift in how consumers access the web: from search‑first to agent‑first; from tabs to tasks; and from passive viewing to active collaboration.</p><p class="">Which browser wins? </p><p class="">The user wins. </p><p class="">And your best bet: pick one, give it a few weeks, and see if it opens possibilities you didn’t expect.</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1763003952991-DBUB9OHJAXC3Z0O0SMUP/broswer+wars.png?format=1500w" medium="image" isDefault="true" width="1024" height="938"><media:title type="plain">Browser wars 2025: the AI‑driven surge</media:title></media:content></item><item><title>Connected intelligence: wired for AI</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Wed, 24 Sep 2025 18:03:11 +0000</pubDate><link>https://www.geoffmosher.me/blog/connected-intelligence-wired-for-ai</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:68d42ac6dc7fe13fbaccc9e7</guid><description><![CDATA[From power-hungry DCs to ambient edge, four shifts reshaping the rules of 
networking]]></description><content:encoded><![CDATA[<h3>From power-hungry DCs to ambient edge, four shifts reshaping the rules of networking</h3><p class="sqsrte-large">Much "ink" has been spilled over AI's gourmand appetite for compute, something akin to Pac-Man on a speed boost. In the process, it’s rewriting the blueprint for how networks are built, scaled and monetized. From GW-scale data centers to proximity compute at the edge, the demands of real-time intelligence are forcing a rethink across the entire networking stack.</p><p class="sqsrte-large">These four shifts reveal where the future is headed, and what it means for communication service providers (CSPs) and networking hardware and software providers globally.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>1 | The GW‑scale buildout is the new baseline</strong></p><p class="">Move over megawatts, AI infrastructure is now being measured in gigawatts. </p><p class="">OpenAI’s <a href="https://www.datacenterfrontier.com/machine-learning/article/55316610/openai-and-oracles-300b-stargate-deal-building-ais-national-scale-infrastructure" target="_blank">Stargate initiative</a>, in partnership with Oracle, recently committed to an additional 4.5 GW of data center capacity in the U.S. </p><p class="">Far from incremental growth, this is a redefinition of scale.</p><p class=""><strong>Why it matters</strong></p><ul data-rte-list="default"><li><p class="">Power is the new scarce resource. Securing reliable, low-cost energy and negotiating utility partnerships are now central to any data center strategy.</p></li><li><p class="">Location and land matter. Hyperscalers are racing for grid-adjacent, regulation-friendly real estate.</p></li><li><p class="">Network becomes mission-critical. These AI superclusters demand non‑blocking, low-latency fabrics so thousands of GPUs can talk to each other at full line rate.</p></li></ul><p class="">For CSPs this surge in compute demand is both a headache and an opportunity. They must evolve beyond “dumb pipes” to offering high-bandwidth wavelength services (100G → 400G → 800G), GPU-as-a-Service and edge AI hosting.</p><p class="">For vendors, the mandate is clear: build ultra-low latency, high-capacity switches, software that automates operations at scale and security drawn around AI workloads.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>2 | Edge + 5G + wearables = intelligence everywhere</strong></p><p class="">The age of centralized compute is giving way to a model of distributed intelligence. AI inference and real-time decision-making is migrating to the network’s edge: to cell sites, local data centers, even wearables. This to meet the sub‑millisecond demands of AR/VR, robotics and smart systems.</p><p class=""><a href="https:// https://www.vogelitlawblog.com/2025/09/is-ai-making-smartphones-passe" target="_blank">Qualcomm</a> and others argue that traditional OS/app frameworks will recede into the background; AI will become the operating layer itself. (Think: your headset, earbuds or glasses managing context and intent locally.)</p><p class=""><strong>What shifts for players</strong></p><ul data-rte-list="default"><li><p class="">CSPs can monetize their geography: deploying private 5G, slicing network contexts, embedding compute into their footprint. They cease being mere transporters and become enablers of localized AI.</p></li><li><p class="">Vendors must deliver compact, rugged, high-density hardware and orchestrated software that spans from core to edge, all managed via APIs and intent-based control.</p></li></ul>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>3 | Grok and the invisible infrastructure war</strong></p><p class="">Grok’s <a href="https://www.infoq.com/news/2024/11/xai-grok-api/" target="_blank">builder-first strategy</a> signals a deeper shift: engineering first, eyeballs second. It’s embedding AI where work actually happens, not where users merely consume it.</p><p class="">Natural language becomes the interface. Code becomes the output. And AI becomes the collaborator.</p><p class="">That user-facing shift depends on invisible infrastructure: sub-100 ms inference pipelines, context caching, fast routing and ultra-close compute. In other words, the infra itself becomes a product.</p><p class="">The battleground has moved solely from model performance to the infrastructure layer on which developers write, run and scale AI quickly.</p><p class="">The winners won’t just be good LLMs. They’ll be the models and platforms that deliver programmable, intelligent networking and compute fabrics, with developer-level control baked in.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>4 | Amazon’s quiet de-centralization: the cloud continuum</strong></p><p class="">Amazon’s posture is sometimes misread. They’re not abandoning the cloud. They’re redefining the cloud as a continuum, from core to edge, to you.</p><p class=""><strong>The drivers</strong></p><ul data-rte-list="default"><li><p class="">Latency, data gravity, regulation make remote compute untenable for many workloads.</p></li><li><p class="">Amazon is embedding compute deeper into the network (<a href="https://aws.amazon.com/blogs/compute/aws-local-zones-and-aws-outposts-choosing-the-right-technology-for-your-edge-workload/" target="_blank">Outposts</a>, <a href="https://aws.amazon.com/about-aws/global-infrastructure/localzones" target="_blank">Local Zones</a>, <a href="https://aws.amazon.com/wavelength/" target="_blank">Wavelength</a>).</p></li><li><p class="">This plays into the CSP narrative: their assets (telco real estate, fiber and presence) become essential nodes in that continuum.</p></li></ul><p class="">For CSPs, this is validation. They must position as the platform, not the underbelly. Integration, assurance, identity-aware policy enforcement and per-session visibility. These aspects become their differentiators.</p><p class="">For vendors, this means converging cloud and edge designs. Software must tie disaggregated compute, identity, telemetry and policies into a consistent fabric, regardless of location.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>Final Thought: Networks <em>are</em> the Product. Plain and simple.</strong> </p><p class="">We’re in a moment where compute, data and traffic are collapsing into a single, AI-driven continuum across control and management planes. In the near future, AI’s ubiquity may render terms like “AI-defined networking” obsolete.</p><p class="">For CSPs: the mission has evolved from “carry everyone’s traffic” to “orchestrate compute where it matters most” while delivering intent‑aware connectivity and monetizing real estate, trust and identity.</p><p class="">For hardware/software vendors: size and speed are still battlegrounds, but so, too, are autonomy, observability and programmability. And, increasingly, the ability to embed AI into the network fabric, from edge to core.</p><p class="">The builders who treat networks as both AI’s front line and its foundational backend will be the architects of the era of connected intelligence. </p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1758735291945-I7T70S7WS5HAMYI99HUG/data+streams+and+nodes.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Connected intelligence: wired for AI</media:title></media:content></item><item><title>Why isn’t Google showing your new site?</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Thu, 28 Aug 2025 13:23:35 +0000</pubDate><link>https://www.geoffmosher.me/blog/why-isnt-google-showing-your-new-site</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:688448d60661085fd3fb1dca</guid><description><![CDATA[How to fix the “parked domain” problem and get indexed right away.]]></description><content:encoded><![CDATA[<h3>How to fix the “parked domain” problem and get indexed right away.</h3><p class="sqsrte-large">You launch. You search. And then…crickets.</p><p class="">Instead of your new site, Google serves up a stale parked-domain placeholder or, worse, nothing at all.</p><p class="">Sound familiar? </p><p class="">It’s a common problem for site owners on platforms like Squarespace, Framer, GoDaddy, Wix and others. You build a sharp new site, point your custom domain, but when you <em>type site:yourdomain.com</em> into Google, it’s like it doesn’t exist.</p><p class="">Here’s why it happens and exactly how to fix it.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>The problem</strong></p><p class="">Google hasn’t <em>seen</em> your site yet. Or it has, but it's still clinging to outdated DNS data or hasn't indexed the live version.</p><p class="">That’s what happened to me. Despite launching <a href="https://www.mosher.enterprises" target="_new">mosher.enterprises</a>, a search for <em>site:mosher.enterpries</em> showed this ghost of a page:</p><blockquote><p class=""><strong>“</strong>[my domain register]<strong> | parked domain”</strong><br> <em>mosher.enterprises has been registered at [my domain register] but the owner has not put up a site yet.</em></p></blockquote><p class="">👎</p><p class="">Time to introduce your site to Google, formally.</p><p class="sqsrte-large"><strong>The solution</strong></p><p class=""><strong>Verify ownership + submit sitemap + request indexing.</strong></p><p class="">For Squarespace users, here’s the <strong>HTML Tag Method</strong>: fast, reliable, and built for humans:</p><p class=""><strong>Step 1: Add your site to Google Search Console</strong></p><ul data-rte-list="default"><li><p class="">Head to <a href="https://search.google.com/search-console" target="_new">Google Search Console</a></p></li><li><p class="">Select “URL Prefix”</p></li><li><p class="">Enter your full site URL (e.g., <code>https://www.mosher.enterprises</code>)</p></li><li><p class="">Choose <strong>HTML Tag</strong> as your verification method</p></li></ul>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png" data-image-dimensions="757x614" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=1000w" width="757" height="614" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/62018b11-ff6c-4231-956a-920ceb784627/Search+dot-Google+console+property+type+options.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  



  
  <p class=""><strong>Step 2: Copy the Meta Tag</strong></p><ul data-rte-list="default"><li><p class="">Google will give you something like:<br> <code>&lt;meta name="google-site-verification" content="your-unique-code" /&gt;</code></p></li></ul><p class=""><strong>Step 3: Paste it in Squarespace</strong></p><ul data-rte-list="default"><li><p class="">Go to <code>Pages &gt; Code Injection</code></p></li><li><p class="">Paste the meta tag in the <strong>Header</strong> section</p></li><li><p class="">Hit Save</p></li></ul>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png" data-image-dimensions="871x343" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=1000w" width="871" height="343" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/91cf0722-29cf-4c1e-b422-d0f909f49d68/Squarespace+code+injection+window.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  



  
  <p class=""><strong>Step 4: Back to Google</strong></p><ul data-rte-list="default"><li><p class="">Hit <strong>Verify</strong> in Google Search Console</p></li><li><p class="">You’re in.</p></li></ul>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png" data-image-dimensions="635x303" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=1000w" width="635" height="303" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/d8e4cc34-5bd7-4fb6-90da-7fa8af2baab4/URL+prefix+meta+tag+code+injection+confirmation.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  


<hr />
  
  <p class="sqsrte-large"><strong>Take Google’s advice</strong></p><p class="">Shortly after verifying my site, Google sent this no-nonsense checklist. Here's what they recommend—condensed and translated:</p><ol data-rte-list="default"><li><p class=""><strong>Cover all domain variants</strong><br> Add both <code>http://</code> and <code>https://</code>, with and without <code>www</code>. Or use the <strong>Domain Property</strong> option for one-and-done coverage.</p></li><li><p class=""><strong>Share access if you collaborate</strong><br> Grant access to others inside Search Console. Transparency = smarter fixes.</p></li><li><p class=""><strong>Submit your sitemap</strong><br> This helps Google know what to crawl. For Squarespace:<br> <code>https://yourdomain.com/sitemap.xml</code></p></li><li><p class=""><strong>Read their crash course</strong><br> Google’s Search Console Basics doc is worth the scroll.</p></li></ol><p class="sqsrte-large"><strong>Then request indexing.</strong></p><p class="">Use the “URL Inspection” tool in GSC. Paste in your homepage URL and click <strong>Request Indexing</strong>.<br>This triggers Google’s bots to prioritize your fresh content.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>For Other Platforms: Quick Hit Tutorials</strong></p><p class="sqsrte-large"><strong>Framer</strong></p><ul data-rte-list="default"><li><p class="">Go to <strong>Site Settings &gt; SEO</strong></p></li><li><p class="">Paste your Google HTML tag in the <strong>Custom &lt;head&gt; code</strong> field</p></li><li><p class="">Publish → verify</p></li><li><p class="">Sitemap auto-generates at <code>yourdomain.com/sitemap.xml</code></p></li></ul><p class=""><strong>GoDaddy Website Builder</strong></p><ul data-rte-list="default"><li><p class="">Open your site editor</p></li><li><p class="">Go to <strong>Settings &gt; Site Settings &gt; SEO</strong></p></li><li><p class="">Add your tag in <strong>Header Code</strong></p></li><li><p class="">Save + publish → verify</p></li><li><p class="">Add <code>/sitemap.xml</code> manually in GSC</p></li></ul><p class=""><strong>Webflow</strong></p><ul data-rte-list="default"><li><p class="">Navigate to <strong>Project Settings &gt; SEO &gt; Custom Code</strong></p></li><li><p class="">Paste HTML tag in <strong>&lt;head&gt;</strong> section</p></li><li><p class="">Publish your domain → verify</p></li><li><p class="">Sitemap lives at <code>yourdomain.com/sitemap.xml</code></p></li></ul><p class="sqsrte-large"><strong>Pro tips to stay visible</strong></p><p class="">- Make sure your site is <strong>Public</strong>, not password-protected<br>- Avoid “Hide from search engines” toggles in page settings<br>- Don’t use <code>&lt;meta name="robots" content="noindex"&gt;</code> unless you're intentionally blocking indexing<br>- Build backlinks—quality links signal authority<br>- Use relevant keywords, compelling meta descriptions, and image alt text<br>- Be patient. Google takes time. But with the right signals, it moves faster.</p><p class="sqsrte-large"><strong>Site navigation and security</strong></p><p class="">The simpler and shallower your site <strong>navigation</strong> patterns are, the better. This helps bots crawl efficiently, and it can lead to faster conversions. </p><p class="">Steer clear of orphan pages, which have no internal links pointing to them, and dense nav menus that diminish internal link equity. </p><p class="">Stick to clear, top-down hierarchies and ensure every important page is reachable in 2–3 clicks. Breadcrumbs and footer navs can also help reinforce your site structure for search engines.</p><p class="">Last but not least, HTTPS is your site’s top <strong>security</strong> ranking signal. If any pages are served over HTTP, you risk them being flagged as "Not Secure" by browsers, a warning that will stop most visitors in their tracks. </p><p class="">Ensure your SSL cert is active and properly configured across all pages, and fend off mixed content errors, such as loading HTTP assets on HTTPS pages, as this can confuse crawlers and, worse, break page rendering.</p><p class="">Other pitfalls to avoid: JavaScript-heavy navigation that hides links from crawlers and duplicate or unlinked versions of pages (for example, having both /products and /our-products on the same site).</p><p class="sqsrte-large"><strong>The final test</strong></p><p class="">Search <code>site:yourdomain.com</code> in incognito mode.</p><p class="">If there are still no results, reinspect your site in GSC.</p><p class="">Still stuck? Reverify, resubmit your sitemap and request re-indexing.</p>


  


  



<hr />
  
  <p class="sqsrte-large">Need help indexing your site faster or just want to know if Google sees you? </p><p class="sqsrte-large">Drop me a <a href="https://www.geoffmosher.me/contact">note</a>. </p><p class="sqsrte-large">We’ll diagnose the issue and solve it  together.</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1753501792058-50M2NS8BC2Q3XOJXI5OH/Search+Everywhere+Optimization+Pillar+%3F.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Why isn’t Google showing your new site?</media:title></media:content></item><item><title>The check that came back</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Mon, 11 Aug 2025 10:39:07 +0000</pubDate><link>https://www.geoffmosher.me/blog/the-check-that-came-back</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6898b0b0159f991051858978</guid><description><![CDATA[A family’s survival, and how one detail shows the art of telling a lasting 
story]]></description><content:encoded><![CDATA[<h3><strong>A family’s survival, and how one detail shows the art of telling a lasting story</strong></h3><p class="">Some stories write themselves. Others hand their author a blank check to cash in full.</p><p class="">Case in point: the tale of a family who narrowly survived an epochal storm I captured early in my career as a newspaper reporter.&nbsp;</p><p class="">On the 50-year anniversary of the Worcester Tornado, I sat down with the Harvey family of Westborough, MA as they recalled the day in 1953 the sky turned black and nearly everything they owned was lost. Out of the wreckage, one detail—a missing check that turned up weeks later, thirty miles away—became the thread that tied the whole tale together.</p><p class="">It’s the kind of detail that shapes a story, gives it pace and import. And it’s the kind of storytelling that’s shaped my own work ever since: find the human center, follow it to the end and let it speak for itself. </p><p class="">It could be a single surviving anecdote in a storm’s wreckage, or a key insight uncovered through user and market research that anchors product pillars and drives deep user engagement.</p><p class="">This piece, a reminder that the best stories are the ones that capture the most lasting details, was originally published by <strong>Herald Media Inc.</strong> and <strong>Community Newspaper Company</strong>, and later in <a href="https://www.milforddailynews.com/story/news/2003/06/08/harvey-family-weaves-harrowing-tale/41206302007/" target="_blank"><em>The Milford Daily News</em></a>. You can also download a PDF of the original newsprint version [available <a href="https://www.geoffmosher.me/s/Geoff-Mosher-Worcester-Tornado-story_Herald-Media_2003.pdf" target="_blank">here</a>], alongside the verbatim text reproduced below.</p>


  


  



<hr />
  
  <h2><span class="sqsrte-text-color--accent"><strong>Harveys' harrowing tale</strong></span></h2><p class="sqsrte-small">By Geoff Mosher | News Staff Writer</p><p class="sqsrte-small"><em>Originally published on June 8, 2003</em></p><p class="">On the morning of the Worcester Tornado, Robert Harvey took a load of calves to market in Brighton, MA. When he returned home later that afternoon, Harvey placed a check he received as payment on top of the refrigerator. It was the last time he would see the unendorsed check until weeks later.</p><p class="">Around 5:30 p.m., Harvey was bailing hay near the large dairy barn behind his parents' house at 120 South St. when he caught sight of ominous thunderclouds looming above his head. Unaware that a funnel cloud was fast approaching, Harvey raced back to the cinderblock barn. He had a brand new John Deere tractor and didn't want it to get wet.</p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png" data-image-dimensions="801x321" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=1000w" width="801" height="321" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/770eca9d-f9bf-44b3-8f3b-ce54aff6268d/path+of+the+Worcester+Tornado+-+Geoff+Mosher.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p data-rte-preserve-empty="true">The 1953 Worcester Tornado cut a path of destruction the likes of which central Massachusetts residents hadn’t experienced in more than 130 years.</p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="">“I unhooked the bailer, drove it down into the barn, and I tried to shut the barn doors," Harvey said. "The wind was blowing so hard at that time, I couldn't move them."</p><p class="">After a few moments, he gave up the struggle, ran through the barn, and came out the door at the other end just as the barn was blown away.</p><p class="">Instinctively, Harvey fell flat an the ground and grabbed hold of an iron post that had been cemented into the steps of the cinderblock milk house to form a railing.</p><p class="">His shirt was torn to shreds, but somehow he didn't have a cut on his body. His new tractor, however, was destroyed, and the barn and his house across the street were flattened. The only part of the milk house that wasn't completely demolished was the corner near the iron post he clung to.</p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg" data-image-dimensions="2397x1648" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=1000w" width="2397" height="1648" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/6bcc1e05-ee08-49be-879a-8ab8da3fd8e0/Post+Harvey+held+on+to+during+the+Worcester+Tornado_copy.jpeg?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p data-rte-preserve-empty="true">Photo courtesy of the Harvey family</p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="">"(The tractor) would have been a lot better if I'd left it outdoors and let it get wet," Harvey said with a laugh.</p><p class="">As soon as the wind subsided, he ran down the street to his father's house. Though still standing, the house was badly damaged; all of the windows and doors were missing. It would later have to be rebuilt. Harvey's brother, Jim, his wife and two children, also lived in the house. </p><p class="">The wind had blown Harvey's mother out of her house, and she landed on a wooden timber with a spike in it. She survived the injury and was later taken to the hospital. Harvey's father, Emory, quickly came to his wife's aid. Once assured that his mother was okay, Harvey then dashed toward his house at 91 South Street.</p><p class="">Harvey's wife, Jane, had just finished preparing supper when it began to get dark outside. She looked out the window and saw a large maple tree uprooted and blown down the driveway.</p><p class="">Fearing that the other maple trees on the property might fall on the house, she ordered her three boys—Robert Jr., 9; Bill, 7; and Ben, 4—into the cellar. She followed them carrying her 3-month-old baby, Dorothy. She just reached the bottom of the stairs when the house was blown away.</p><p class="">"We didn't know what had happened," Jane Harvey said in an essay written years later. "We didn't know it was a tornado. It was light again. The wind had stopped blowing. I could hear the hiss of gas escaping from the pipes." </p><p class="">Shirtless from and caked in mud from nearby Ruggles Pond, Robert Harvey arrived at the spot where his house had stood just minutes before. There was nothing left but a cellar hole and a large pile of debris southeast of the house. </p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg" data-image-dimensions="5191x2417" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=1000w" width="5191" height="2417" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/807164bb-455c-43ae-bc80-caf044deff45/Harvey+home+ruins+from+the+Worcester+Tornado.jpeg?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p data-rte-preserve-empty="true">Photo courtesy of the Harvey family</p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="">In the middle of the wreckage, he noticed the family piano standing upright and still in playable condition. As he approached the cellar hole, Harvey heard his oldest son, Robert Jr., shout, "Hey, Daddy, we're here." </p><p class="">Music to his ears.</p><p class="">"Then he jumped down in the cellar and hugged us all," Jane Harvey said. "We said a prayer of thanks to God because our lives had been saved."</p><p class="">The old cellar was made of large granite slabs that each weighed several tons. All of the slabs had collapsed into the cellar except the three directly above the heads of Harvey's wife and children.</p><p class="">Harvey rebuilt his house on the same spot, around the three slabs he now refers to as the "miracle stones."</p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg" data-image-dimensions="3849x2557" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=1000w" width="3849" height="2557" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/f70567fc-1ca0-418b-8e73-addbf7f4b709/Cellar+where+Harvey+family+hunkered+down+during+the+Worcester+Tornado.jpeg?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p data-rte-preserve-empty="true">Photo courtesy of the Harvey family</p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="">Harvey's sister lived nearby and let them stay with her family temporarily, before they moved into the newly-built Kirkside house in town and later into a relative's house in Quonset.</p><p class="">"That night we didn't sleep very much," Jane Harvey said. "All night long the chain saws whined and howled cutting up the trees to clear the road."</p><p class="">The tornado left 12 members of the Harvey family homeless. Relatives and friends sheltered them until new homes were built.</p><p class="">About two-and-half weeks after the tornado ravaged Westborough and left him homeless, Robert Harvey received his missing check in the mail. It had been found 30 miles away in Boston and was still legible.</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1754861668372-P73HBD9DXDAGL51ACCEE/The+check+that+came+back.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">The check that came back</media:title></media:content></item><item><title>Everywhere SEO, defined</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Sun, 27 Jul 2025 00:35:49 +0000</pubDate><link>https://www.geoffmosher.me/blog/everywhere-seo-defined</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6884076fb933924c8a056ee6</guid><description><![CDATA[A 4-pillar playbook for brands navigating AI-era search and omni-channel 
visibility]]></description><content:encoded><![CDATA[<h3><strong>A 4-pillar playbook for brands navigating AI-era search and omni-channel visibility</strong></h3>


  


  




  
  <p class="">Search doesn’t live in a box anymore.</p><p class="">Consumers bounce between platforms, apps and assistants in search of answers. And your brand needs to meet them there: on every channel, in every format and in every model.</p><p class="">That’s what Search Everywhere Optimization is all about.</p><p class="">This 4-pillar playbook is built for product marketers, SEO strategists and founders like me dusting off skills previously practiced for companies. It’s a blueprint for visibility across AI answers, app stores, social platforms and old-school SERPs.</p><p class="">Inside you’ll find...</p><p class="">• How to optimize for LLM engines (LEO) and track generative engine mentions (GEO)</p><p class="">• Tools for reverse-engineering AI overviews and claiming citation-worthy status</p><p class="">• Where and how to amplify content ecosystems across TikTok, Substack, YouTube, LinkedIn and more</p><p class="">• The new rules of ASO, contextual targeting and mobile app re-engagement</p><p class="">• Why ad performance data should inform SEO and not exist in a silo</p><p class="">The guide also breaks down what’s free vs. what’s paid: ideal if, like me, you’re scaling and watching SaaS spend closely.</p><p class="">I hope it helps you engineer smarter ways for your brand to show up and stick.</p><p class="sqsrte-large">📖 Download the full playbook <a href="https://www.geoffmosher.me/s/Mosher-Enterprises-Search-Everywhere-Optimization_July-2025.pdf" target="_blank"><strong>here</strong></a>. Or dive into it in 4 serialized chapters on Medium.</p><p class="">   🔎 <a href="https://medium.com/@info_89810/train-the-bots-earn-the-mentions-1b47f6a28fcf" target="_blank"><strong>Pillar 1</strong></a><span class="sqsrte-text-color--accent"><strong>:</strong></span> LEO + GEO—AI search, structured and cited</p><p class="">   🌐 <a href="https://medium.com/@info_89810/structure-still-wins-f3ec2c36c543" target="_blank"><strong>Pillar 2</strong></a><span class="sqsrte-text-color--accent"><strong>:</strong></span> On-site SEO—the established art+science</p><p class="">   🔗 <a href="https://medium.com/@info_89810/your-reputation-ranks-before-you-do-cfa4637a4a92" target="_blank"><strong>Pillar 3</strong></a><span class="sqsrte-text-color--accent"><strong>:</strong></span> Off-site SEO—links, mentions &amp; contributions</p><p class="">   📊 <a href="https://medium.com/@info_89810/discoverability-demands-a-wider-lens-3efc7279000e" target="_blank"><strong>Pillar 4</strong></a><span class="sqsrte-text-color--accent"><strong>:</strong></span> Platform SEO, ASO, paid media and analytics</p><p class="">Learning something new? Share the knowledge. ♻️ </p><p class="">Optimizing already? Comment with your takes. 🗣️</p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1753483406869-NJ4LPVAS62AWE1IGGBIW/Search+Everywhere+Optimization+Pillar+4.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Everywhere SEO, defined</media:title></media:content></item><item><title>Build a blog carousel that belongs</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Thu, 10 Jul 2025 21:23:15 +0000</pubDate><link>https://www.geoffmosher.me/blog/build-a-blog-carousel-that-belongs</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:687007242206584d7eee9193</guid><description><![CDATA[No plugins. No patchwork. Just Swiper.js, your style, and a sprinkle of 
script.]]></description><content:encoded><![CDATA[<h3>No plugins. No patchwork. Just Swiper.js, your style, and a sprinkle of script.</h3>


  


  




  
  <p class="">Not everything native to your CMS <em>feels</em> native.</p><p class="">Take Squarespace.</p><p class="">Elegant templates, sure. But when it comes to embedding dynamic content, like a blog carousel, the default blocks are (not going to sugarcoat it) blocky.</p><p class="">So, I built my own carousel, one that sidestepped the functional, monetary and stylistic constraints in pursuit of a positively native look and feel. </p><p class="">And, to my delight, the result was more seamless than I expected.</p><p class="sqsrte-large"><strong>What I used (and why it worked)</strong></p><ul data-rte-list="default"><li><p class=""><a href="https://swiperjs.com/" target="_blank"><strong>Swiper.js</strong></a>: The gold standard in modern sliders. Light, responsive and extendable.</p></li><li><p class=""><a href="https://rss2json.com/#rss_url=https%3A%2F%2Ffeeds.feedburner.com%2Fgeoffmosher%2Fblog" target="_blank"><strong>rss2json.com</strong></a>: A free, no-login-needed API that converts any RSS feed into clean, easily-parsed JSON.</p></li><li><p class=""><strong>One code block</strong>: That’s all you need. Paste it in and style it up. It’s that simple.</p></li></ul><p class="">The result?</p><p class="">A responsive, CMS-agnostic carousel that fetches your latest blog posts—thumbnail, headline, excerpt and date—and displays them cleanly across mobile, tablet and desktop.</p><p class="">It can be customized to end with a call-to-action: a button linking to a blog landing page. </p><p class="sqsrte-large"><strong>Why I built my own</strong></p><p class="">I’d been using Elfsight. It’s good but gets pricey fast.</p><p class="">Worse still, it about as well as a stock image in a personal album.</p><p class="">The Swiper-powered alternative? Code to joy. The style I soght, the copy I could own.<br> Typography, colors, padding: dialed into my brand. No guessing. Just a little fine tuning.</p><p class="">Now it lives natively on <a href="https://www.geoffmosher.me" target="_new">www.geoffmosher.me</a>. And, TBH, it’s hard to tell it wasn’t built into Squarespace itself.</p><p class="sqsrte-large"><strong>Want the code?</strong></p><p class="">I published the full snippet on <a href="https://github.com/geoffmosher/web-dev/blob/911fb8a0c3ffe38c8a869217472f8c9a0c1033e6/Swiper%20Blog%20Carousel%20for%20websites%20overview.txt" target="_blank">GitHub</a>.</p><p class="">Fork it. </p><p class="">Adapt it. </p><p class="">Make it <em>yours</em>.</p><p class="">I hope it gives your blog the best first impression imaginable. </p>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1752182548231-U5O5HLL427Q1MLNXG5QJ/blog+widget+blog+post+art.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Build a blog carousel that belongs</media:title></media:content></item><item><title>Applied AI in my work</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Fri, 13 Jun 2025 17:45:58 +0000</pubDate><link>https://www.geoffmosher.me/blog/applied-ai-in-my-work</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:684c56dba7aa545d40afceed</guid><description><![CDATA[Real-world implementations across agentic tools, APIs, cloud, video and 
more]]></description><content:encoded><![CDATA[<p class="sqsrte-large">After departing Verizon at the end of 2024, I took a brief sabbatical to reflect, recharge and build. I created the portfolio website I always wanted, took on consulting work and filed paperwork for an LLC (more on that to come). Oh, and I developed a lightweight AI agent that applies to jobs on my behalf, a personal experiment in agentic automation broken down <a href="https://www.geoffmosher.me/blog/go-go-agent-job-hunt">here</a>.</p><p class="sqsrte-large"><strong>2025: Roadmaps, reinforcement and real-time scoring</strong></p><p class="">Recently, I teamed up with an enterprise video communication platform. Its product suite was evolving to include more AI features, and I helped define a shared product vision that positioned AI prominently within broader vertical and horizontal go-to-market narratives.</p><p class="">One initiative involved migrating to a more efficient <a href="https://www.audiology.org/news-and-publications/audiology-today/articles/communication-strategies-and-speech-to-text-transcription/#:~:text=Speech-to-text%20transcription%20(,being%20transcribed%20in%20some%20way." target="_blank"><strong>speech-to-text (STT)</strong></a> model and integrating it with noise suppression software trained on real-world customer videos.</p><p class="">Another initiative: a machine learning– and <a href="https://www.ibm.com/think/topics/computer-vision" target="_blank">computer vision</a>–powered <strong>video scoring system</strong> that assessed both technical quality and adherence to industry workflows. Using a hybrid of open-source and proprietary models trained to detect blur, content elements, framing and motion artifacts, the system enabled customizable and scalable visual intelligence. It was being enhanced to support shake detection, PII blurring, profanity filtering and reinforcement learning from users’ datasets.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>2024: GenAI in the API stack</strong></p><p class="">As the senior-most product manager within Verizon’s <a href="https://www.geoffmosher.me/telecom/api-first-delivery-and-growth"><span class="sqsrte-text-color--accent"><strong>API First Initiative</strong></span></a>, I led efforts to enhance a new developer platform with AI capabilities. One future-facing project involved collaboration with the GenAI and Quantum Computing team to operationalize Gorilla, a <strong>large language model (LLM)</strong> built at UC Berkeley.</p><p class="">Gorilla was tapped to power two core features…</p><ul data-rte-list="default"><li><p class="">an API discovery assistant that recommended integration opportunities based on application use cases, and </p></li><li><p class="">a documentation enhancement engine that drew on governance standards to suggest improved taxonomy, metadata and reference descriptions. </p></li></ul><p class="">In both cases, Gorilla was intended to act as a <a href="https://blogs.nvidia.com/blog/what-is-retrieval-augmented-generation/" target="_blank"><strong>retrieval-augmented (RAG)</strong></a> model, continuously trained on internal documentation repos and fine-tuned to respond with accuracy and context sensitivity.</p><p class="">These implementations were aimed not only at making API First’s API catalog more discoverable and helpful, they also demonstrated how <strong>generative AI</strong> could support enterprise developers without compromising on standards or scalability.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>2022: Making the case for ML at scale</strong></p><p class="">Following hands-on implementation work with Verizon Cloud, I was tapped to co-author and lead-edit a technical paper for Verizon’s Global Network &amp; Technology division: <em>Machine Learning: Transformative, Data-Driven Decision Making at Scale</em>. </p><p class="">The paper outlined how supervised, unsupervised and reinforcement <a href="https://www.pecan.ai/blog/3-types-of-machine-learning/" target="_blank">learning models</a> were being applied across platforms and products to enhance operations, improve retention and reduce fraud.</p><p class="">Use cases spanned anomaly detection, demand forecasting, content personalization and identity verification. </p><ul data-rte-list="default"><li><p class="">In <a href="https://www.bankingdive.com/news/verizon-targets-gen-z-market-with-new-digital-banking-app/602066/" target="_blank">fintech</a> and consumer wireless, ML powered real-time fraud scoring. </p></li><li><p class="">In <a href="https://www.verizon.com/solutions-and-services/add-ons/protection-and-security/verizon-cloud/" target="_blank">Verizon Cloud</a>, it enabled frictionless content organization and recovery through smart tagging and visual analysis. </p></li></ul><p class="">The paper emphasized the need for robust data infrastructure and ongoing investment, illustrating how investment can yield outsized value as systems mature.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>2019–2022: Turning Storage into Storytelling</strong></p><p class="">My AI journey began in earnest while leading product for <a href="https://www.geoffmosher.me/telecom/cloud"><span class="sqsrte-text-color--accent"><strong>Verizon Cloud</strong></span></a>, where cross-functional teams I led evolved from offering basic backup to delivering smart, personalized photo and video experiences. Over several years, I worked closely with engineers, other PMs, designers, copywriters and data scientists to introduce machine learning features that became central to the product’s value proposition.</p><p class="">These features were grounded in computer vision techniques, models that could interpret visual content as humans might, tag images, detect people and objects, evaluate quality, and find meaningful connections across billions of media files. </p><p class="">This was achieved through... </p><ul data-rte-list="default"><li><p class="">Image recognition and tagging using <a href="https://www.intel.com/content/www/us/en/internet-of-things/computer-vision/convolutional-neural-networks.html" target="_blank">CNNs</a> </p></li><li><p class="">Gallery generation and face clustering using <a href="https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Schroff_FaceNet_A_Unified_2015_CVPR_paper.pdf" target="_blank">FaceNet</a> and <a href="https://www.sciencedirect.com/topics/computer-science/k-means-clustering" target="_blank">K-Means</a></p></li><li><p class="">Similarity- and quality-scoring based on embedded vectors, blur detection and user engagement signals</p></li><li><p class="">Content personalization using feedback loops, <a href="https://www.aimasterclass.com/glossary/online-learning-algorithms" target="_blank">online learning</a> and region-specific model tuning</p></li></ul><p class="">Two marquee features, Flashbacks and Stories, combined metadata, <a href="https://www.aimasterclass.com/glossary/online-learning-algorithms" target="_blank">vector similarity</a> and <a href="https://www.opentrain.ai/glossary/heuristic" target="_blank">heuristic</a> scoring to auto-generate albums that surfaced timely, emotionally-resonant memories. Whether it was “New Year’s Eve 2020” or “Hot Fun in the Summertime” (R.I.P., Sly Stone), users received curated collections that reflected not just content, but context…enhanced by clever, human-written copy that added a layer of delight.</p><p class="">The impact of both features was measurable: app ratings climbed from 4.3 to 4.6, and user engagement surged as the product shifted from a passive utility into an intelligent curator of personal memories that automatically organized content into meaningful collections. </p><p class="">And, behind the scenes, the Cloud team explored how ML could power operational insights like ingest anomaly detection and performance optimization across a <a href="https://cloud.google.com/learn/what-is-microservices-architecture" target="_blank">micro-services</a>-based infrastructure. These efforts were aimed at reducing false positives during high-traffic periods (like holidays), while helping development teams stay ahead of performance dips and potential outages.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>Closing inference: patterns with purpose</strong></p><p class="">For the last eight years of my career, AI has been a through-line, a technical and creative lever I’ve pulled to help deliver smarter systems, sharper tools and more responsive experiences. </p><p class="">I’ve learned to treat AI like a product in its own right: trainable, tuneable and most powerful when guided by clear intent, thoughtful design and ethical grounding. </p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1749836675100-0VV7ZRZ0SQMAJ3XDUIPO/Applied+AI.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Applied AI in my work</media:title></media:content></item><item><title>Advice for launching your biz</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Thu, 08 May 2025 12:08:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/advice-for-launching-your-biz</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6849cd9cdb0fdb3c9d0c3b16</guid><description><![CDATA[Six steps to register, protect and grow your service-based business]]></description><content:encoded><![CDATA[<h3><strong>Six steps to register, protect and grow your service-based business</strong></h3><p class="">Starting a product consulting business, or any new business for that matter, doesn’t require much overhead or cash, or even a legal team.</p><p class="">A clear plan, some homework and a few key filings are all you need.</p><p class="">Take it from a future LLC owner going through the motions in Massachusetts.</p><p class="sqsrte-large"><strong>Here’s what I've learned </strong>(and wish I'd known sooner)... </p><p class=""><strong>Step 1: Register your business name</strong></p><p class="">Registering a business name with your state typically costs between $10 to $100. The Small Business Association has a <a href="https://www.sba.gov/business-guide/launch-your-business/register-your-business#register-with-state-agencies" target="_blank">form</a> you can use to look up your state and find a link to the department that handles registrations. </p><p class=""><strong>Step 2: Determine the most suitable type of business</strong> </p><ul data-rte-list="default"><li><p class=""><strong>Sole Proprietorship:</strong> Simple but offers <em>no</em> liability protection</p></li></ul><ul data-rte-list="default"><li><p class=""><strong>Partnership:</strong> Shared ownership and responsibility</p></li><li><p class=""><strong>Limited Liability Company (LLC):</strong> Offers liability protection and flexible tax options (A Delaware LLC? That’s generally only worth the extra cost and compliance when you're scaling or raising funds.)</p></li><li><p class=""><strong>Corporation (C Corp or S Corp):</strong> Suitable for fast-growing or investor-backed companies, but involves more complexity. And C Corps involve double taxation.</p></li></ul><p class="">While LLC’s are the most common choice for individually-owned small businesses, they’re not one-size-fits-all. If you’re unsure which legal structure fits your business best, the SBA offers a clear, widely-used <a href="http://www.sbaguide.org/YourBusinessStructure.html" target="_blank">overview</a>. And, if you’re stuck on the difference between an LLC and a S corp, you’re not alone. <a href="https://www.investopedia.com/articles/personal-finance/011216/s-corp-vs-llc-which-should-i-choose.asp" target="_blank">Investopedia</a> has a solid breakdown. </p><p class=""><strong>Step 3: File your Certificate of Organization online</strong> </p><p class="">I have not come across a single website that centralizes direct links  to every state’s business registration forms. However, for LLCs, <a href="https://www.bizee.com/" target="_new">Bizee.com</a> provides a comprehensive directory for all 50 states. For other business structures, your best starting point is your state’s Secretary of State website.</p><p class=""><strong>Note:</strong> If you plan to operate under a different name than your legal entity, you’ll need to register a <strong>DBA (Doing Business As)</strong> with your local municipality.</p><p class=""><strong>Step 4: Get Your EIN</strong> (Free!)</p><p class="">Apply for your Employer Identification Number via the IRS <a href="https://www.irs.gov/businesses/small-businesses-self-employed/get-an-employer-identification-number" target="_blank">website</a>. You’ll use it to open bank accounts and file taxes.</p><p class=""><strong>Step 5: Open a Business bank account</strong></p><p class=""><a href="https://www.nerdwallet.com/best/small-business/best-business-bank-accounts" target="_blank">NerdWallet</a> offers regularly updated, in-depth comparisons and reviews of business bank accounts from big to boutique institutions. You’ll need to have the following information to open an account.</p><ul data-rte-list="default"><li><p class="">A government-issued ID (it doesn’t have to be a REAL ID)</p></li><li><p class="">EIN</p></li><li><p class="">Formation docs from your state</p></li><li><p class="">Operating agreement (if applicable)</p></li></ul><p class=""><strong>Step 5: Get insured</strong> </p><p class="">You can shop for professional liability insurance through aggregators <a href="https://www.coverwallet.com/">Coverwallet.com</a> and <a href="https://www.policygenius.com">Policygenius.com</a>. For policy comparisons, check out NerdWallet, the International Risk Management Institute (<a href="https://subscribe.irmi.com/professional-liability-insurance" target="_blank">IRMI</a>), <a href="https://www.insureon.com/small-business-insurance/professional-liability/best-companies" target="_blank">Insureon</a> and <a href="https://fitsmallbusiness.com/best-professional-liability-insurance/" target="_blank">Fit Small Business</a>.</p><p class=""><strong>Step 6: Be legal-ready</strong></p><p class="">Use platforms like <a href="https://www.docusign.com" target="_blank">DocuSign</a>, <a href="https://www.pandadoc.com" target="_blank">PandaDoc</a> or <a href="https://sign.dropbox.com" target="_blank">Dropbox Sign</a> (formerly HelloSign) for contracts and forms requiring signature. </p><p class="">Examples include MNDAs (Mutual Non-disclosure Agreement), MSAs (Master Service Agreement) and SoWs (Statement of Work).</p><p class=""><strong>Bonus steps</strong></p><ul data-rte-list="default"><li><p class="">Build a professional <strong>website</strong>. Add tiered pricing and easy payment options, such as Stripe or PayPal. Include strong CTAs, like “Schedule a Free Consult” and “Pay Now”. Add proof points, like client testimonials, and clear terms of service.</p></li><li><p class="">Use a form builder or CRM (Customer Relationship Management) tool to create standard forms for collecting client info and to automate onboarding and other common emails. Popular options for small businesses include <a href="https://www.dubsado.com" target="_blank">Dubsado</a>, <a href="https://www.honeybook.com" target="_blank">HoneyBook</a>, <a href="https://paperform.co" target="_blank">Paperform</a> and <a href="https://www.hubspot.com" target="_blank">HubSpot</a>. </p></li></ul>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1749730034355-CDWZI4NSC1O0WO866PYV/small+biz+startup.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Advice for launching your biz</media:title></media:content></item><item><title>Build the map, move the team </title><dc:creator>Geoff Mosher</dc:creator><pubDate>Mon, 14 Apr 2025 16:58:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/build-the-map-move-the-team</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:68499b285de937332a39e103</guid><description><![CDATA[A smarter approach to roadmapping that illuminates what and why—not just 
when]]></description><content:encoded><![CDATA[<h3><strong>A smarter approach to roadmapping that illuminates what and why—not just when</strong></h3><p class="">Too many software teams operate without a single, shared roadmap that keeps everyone focused on where a product is headed and why. Instead, they navigate a swirl of Jira stories, buried Confluence pages and outdated slides.</p><p class="">The result?<br> Confusion, siloed decisions and duplicate work. These gaps slow momentum, waste time, and erode morale.</p><p class="">I help teams break that cycle by designing roadmaps that are more than delivery schedules. They’re <span data-text-attribute-id="dd248397-dcae-458e-9ffe-7d49a7e42bef" class="sqsrte-text-highlight">communication engines</span>. <em>Always </em>clear and consistent. </p><p class="">A <strong>smart roadmap</strong> isn’t just a list of features and dates. It’s a strategic artifact: anchored in business goals, shaped to drive execution and built to scale across centralized and distributed teams.</p><h4><strong>Why strategy needs a map</strong></h4><p class="">A roadmap becomes truly powerful when it rallies a company around clear goals and outcomes: quarterly and annual targets across product, engineering, marketing, finance, security and operations. It becomes a north star that empowers teams to prioritize wisely, and say no with confidence.</p><p class="">This strategy-backed approach echoes the Objectives and Key Results (OKR) framework popularized by John Doerr in “<a href="https://www.whatmatters.com" target="_blank">Measure What Matters</a>”, which champions aligning business objectives with measurable outcomes to drive focus and accountability.</p><h4><strong>What a smart roadmap looks like</strong></h4><p class="">Approaches vary by industry, but smart roadmaps typically reinforce multi-quarter objectives, whether boosting revenue from strategic partners (financial) or leapfrogging competitors through AI-powered workflows (tech advancements). What matters is that each initiative ties back to a clear, measurable outcome.</p><p class="">My standard Slides template (<a href="https://www.geoffmosher.me/contact" target="_blank">Contact me</a> for availability) builds in the following plug-and-play structure:</p><ul data-rte-list="default"><li><p class=""><strong>Themes</strong> that signal purpose: <em>Performance</em>, <em>Engagement</em>, <em>Differentiator</em>, <em>Catch-up</em></p></li><li><p class=""><strong>Short-form entries</strong>: Item name (&lt;25 characters) + description (&lt;85 characters)</p></li><li><p class=""><strong>“What + Why” summaries</strong> that are clear to both engineers and executives</p></li><li><p class=""><strong>Links to technical reports, SWOT analyses</strong> <strong>and PRDs</strong> for deeper context</p></li></ul><h4><strong>Integrating your smart roadmap into your workflow</strong></h4><p class="">Once you’ve built your roadmap and secured buy-in, it’s time to embed it into your development workflow, without creating software sprawl or duplicating planning efforts. </p><h4><strong>Stitch, don’t sprawl</strong></h4><p class="">If you're using a project management tool like Monday, Asana or ClickUp, don’t rush to replace it. Instead, cascade roadmap themes and descriptions directly into your project workspaces. They can accommodate the longer-form "what" and "why" summaries from the roadmap. </p><p class="">What’s more, these tools integrate with Jira and Confluence plus Google Workspace and Microsoft 365, making it easy to sync progress tracking, execution details and documentation. For example… </p><ul data-rte-list="default"><li><p class="">Use Jira smart links in Monday to expose Jira epic-level tracking</p></li><li><p class="">Surface Product Requirements Documents (PRDs) and competitor analyses in Confluence, Drive or 365</p></li><li><p class="">Create timeline swimlanes (quarterly or Now / Next / Later) that match roadmap structure—check out my post on <a href="https://www.geoffmosher.me/blog/less-but-better">decision-making frameworks</a></p></li><li><p class="">Auto-trigger notifications in Slack, Gmail or Office to maintain high visibility of Monday board items</p></li><li><p class="">Connect support tools like Zendesk to Monday to automate and track feature requests from customers, prospects and employees of all levels</p></li></ul><h4><strong>Make it </strong><span data-text-attribute-id="378c11e9-d982-4177-9db8-7dc6d4ec534f" class="sqsrte-text-highlight"><strong>shareable</strong></span></h4><p class=""><em>Remember:</em> many stakeholders, especially executives and cross-functional partners, won’t have access to project management tools. And even if they do, they may not use them.</p><p class="">That’s why a shareable roadmap artifact is critical. </p><p class="">Whether a linked doc or an exported deck, it should reflect the tactical roadmap in Monday and serve as both a source of truth and an invitation for feedback.</p><h4><strong>Clarity as a competitive advantage</strong></h4><p class="">With a smart roadmap in use, you don’t have to choose between visibility and velocity.  </p><p class="">These roadmaps are designed to accelerate teams <em>and</em> keep everyone aligned. </p><p class="">When each item ladders up to a business objective and is transparently shared (within reason) teams gain confidence in what to build, when to build it and why it matters.</p><p class="">That’s how roadmap planning transforms from a pain point into a power play.</p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1749760076686-K7ZLH2IVY88EJBUHVX37/roadmap+planning+5.png?format=1500w" medium="image" isDefault="true" width="1284" height="1326"><media:title type="plain">Build the map, move the team</media:title></media:content></item><item><title>Go, go agent job hunt!</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Tue, 18 Mar 2025 01:06:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/go-go-agent-job-hunt</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6848d370af166f7aa7e04a28</guid><description><![CDATA[An agentic AI workflow that tailors resumes and cover letters automatically]]></description><content:encoded><![CDATA[<h3><strong>An agentic AI workflow that tailors resumes and cover letters automatically</strong></h3><p class="">Applying for jobs shouldn’t be a full-time job. </p><p class="">That’s the principle behind the open-source AI Jobs Applier Agent I built and shared on <a href="https://github.com/geoffmosher/AI-Jobs-Applier-Agent" target="_blank">GitHub</a>. </p><p class="">Designed to streamline the repetitive burden of tailoring resumes and cover letters, this agent automates the grunt work, so applicants can focus on preparing for interviews instead of filling out the same form countless times.</p><p class="">The tool consists of several core components:</p>


  


  














































  

    

      <figure data-test="image-block-v2-outer-wrapper" class="
            sqs-block-image-figure
            image-block-outer-wrapper
            image-block-v2
            design-layout-stack
            combination-animation-site-default
            individual-animation-site-default
            individual-text-animation-site-default
            image-position-left
            
          " data-scrolled
      >

        
          
            
            
              
              
              
              
              
              
              
              <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png" data-image-dimensions="1196x668" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=1000w" width="1196" height="668" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1f3c88f6-4480-4c48-b8c3-ff2c4998bd7b/AI+Jobs+Applier+Agent+flow+diagram.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

              
            
          
            
          

        

        

      </figure>

    

  



  
  <ul data-rte-list="default"><li><p class="">A <strong>master resume and cover letter template</strong> in plain-text format for easy parsing into YAML or JSON. The cover letter functions as a dynamic template, filled with logic and modular sections that highlight experience and skills based on the industry and role. Variants allow you to emphasize the right traits for the right opportunity.</p></li><li><p class="">Next comes <strong>job description extraction</strong>, where the agent automatically pulls in listings from sites like LinkedIn, BuiltIn and Indeed. It then uses Natural Language Processing (NLP) to extract keywords from the responsibilities and qualifications summaries of each listing, feeding them into the tailoring engine.</p></li><li><p class="">The third stage, <strong>auto-application</strong> on the job portals, uses Selenium and Robotic Process Automation (RPA) tactics to log in to Applicant Tracking Systems like Greenhouse and Workday, populate the forms each system requires, and upload your resume and cover letter. OpenAI’s API fine-tunes the resume and cover letter to the job, and Pandas help match your achievements with what each posting emphasizes.</p></li><li><p class="">Finally, a <strong>pipeline</strong> ties it all together: job description in, tailored documents out...with auto-apply or review-ready drafts saved to a local folder. This gives you more control over what's submitted than paid tools like Jobscan, Sonara AI, AIApply, Careerflow.ai and others.</p></li></ul>


  


  



<hr />
  
    
  
  <p class="sqsrte-large"><strong>Ethics in, ethics out</strong></p><p class="">⚠️ <strong>Use responsibly</strong> </p><p class="">This workflow is meant to streamline applications for roles you’re <span data-text-attribute-id="085a9380-e8df-4f6f-9221-745812bcdbee" class="sqsrte-text-highlight">genuinely qualified</span> for. It is by no means meant for mass submitting resumes and cover letters at random.</p><p class="">Misusing automation and tailoring to apply en masse for jobs outside your expertise adds to the <a href="https://www.wsj.com/lifestyle/careers/ai-job-application-685f29f7" target="_blank">growing noise</a> recruiters face and contributes to a system where <a href="https://www.hcamag.com/us/specialization/hr-technology/application-overload-is-ai-making-recruitment-harder-for-hr/526765" target="_blank">bots screen bots</a>, burying real talent in the process. </p><p class="">Tools like this should amplify credibility, not undermine it.</p>


  


  



<hr />
  
  <p class="sqsrte-large">Below are a few representative snippets from the agent’s logic.</p>


  


  




  
    <pre class="source-code"># Load the resume and job description
with open(resume_path, &quot;r&quot;) as file:
    resume_text = file.read()
with open(job_description_path, &quot;r&quot;) as file:
    job_description = file.read()</pre>
  

<hr />
  
    <pre class="source-code"># Choose resume style interactively
style_answer = inquirer.prompt([
    inquirer.List(&quot;style&quot;, message=&quot;Select a resume style&quot;, choices=choices)
])</pre>
  

<hr />
  
    <pre class="source-code"># Generate PDF from LLM-tailored content
result_base64 = resume_facade.create_resume_pdf()
with open(&quot;resume.pdf&quot;, &quot;wb&quot;) as f:
    f.write(base64.b64decode(result_base64))</pre>
  

<hr />
  
  <p class="sqsrte-large"><strong>Shipping yourself smarter</strong></p><p class="">Getting this workflow running requires some technical setup: Python, pip, Selenium and API keys. </p><p class="">But the long-term savings in time and effort can be substantial. </p><p class="">It’s not magic. It’s product thinking applied to your job hunt, freeing you up to focus on networking and interviewing while the “paperwork” handles itself.</p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1749604153564-U531HICANT5DGAI6FHMV/AI+jobs+applier+agent.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Go, go agent job hunt!</media:title></media:content></item><item><title>Less but better</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Fri, 21 Feb 2025 21:37:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/less-but-better</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6848936017d0501605f13572</guid><description><![CDATA[Why the Impact/Effort matrix suits lean product teams]]></description><content:encoded><![CDATA[<h3><strong>Why the Impact/Effort matrix suits lean product teams</strong></h3><p class="">As a product leader who's worked across startups and the Fortune 25, I’ve implemented prioritization frameworks galore: RICE, MoSCoW, you name it. </p><p class="">They all have merit. </p><p class="">But when teams need to move fast and stay aligned, I'd be remiss if I didn't recommend the simplest and most enduring of them all: the <strong>Impact/Effort matrix</strong>.</p><p class="">Why? Because clarity and speed are often more important than perfection.</p><p class="">For small- to mid-sized software companies, where decision-making bottlenecks are as lethal as tech debt, this framework can be a game-changer. It accelerates consensus, builds transparency and gives teams a shared language for ruthless prioritization. Most importantly, it scales from gut-check brainstorms to stakeholder roadshows.</p><p class="">I’m not alone in valuing this level of simplicity. </p><p class="">Dieter Rams, the legendary industrial designer behind Braun and a guiding light for generations of designers and product leaders, championed the philosophy of "Weniger, aber besser", Less but better. Rams’ influence echoes through modern product development, including the prioritization systems many companies rely on today. </p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg" data-image-dimensions="4157x4199" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=1000w" width="4157" height="4199" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/a7c0611f-1753-42ab-a0a2-5a1cbcbf4922/dieter+record+player.jpg?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p data-rte-preserve-empty="true">As Sophie Lovell documents in “Dieter Rams: As Little Design as Possible” (Phaidon, 2011), Rams’ emphasis on clarity, function and purpose laid the groundwork for making better decisions by doing less.</p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="sqsrte-large"><strong>What Makes Impact/Effort effective?</strong> </p><p class="">The matrix distills choices into four quadrants:</p><ul data-rte-list="default"><li><p class=""><strong>Do</strong> (High Impact, Low-Medium Effort): Obvious wins to be prioritized</p></li><li><p class=""><strong>Decide</strong> (High Impact, High Effort): Worth the investment, but needs scrutiny</p></li><li><p class=""><strong>Defer</strong> (Medium-Low Impact, Low Effort): Save for when bandwidth allows</p></li><li><p class=""><strong>Delete</strong> (Low Impact, High-Medium Effort): Better skipped for higher ROI items</p></li></ul><p class="">What’s powerful is how quickly this lens can be applied. And when coupled with clear criteria for what “impact” means, it becomes not just fast but smart.</p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png" data-image-dimensions="1266x1196" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=1000w" width="1266" height="1196" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/ad7d104d-dc35-436e-8083-c92822aa40dd/Impact+-+Effort+framework.png?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
      
        </figure>
      

    
  


  



  
  <p class=""><strong>The 5 Impact factors</strong> </p><p class="">In my work as both a product leader and consultant, I recommend "Impact" be evaluated through five lenses:</p><ul data-rte-list="default"><li><p class=""><strong>Customer demand with broad applicability:</strong> If many users request it or it benefits a wide segment, the ROI on effort spikes.</p></li><li><p class=""><strong>Performance or Reliability gains:</strong> Enhancements that reduce friction or instability create long-tail value and reduce costs.</p></li><li><p class=""><strong>Revenue enablement or expansion:</strong> Features tied to sales, monetization or customer expansion often justify expedited delivery.</p></li><li><p class=""><strong>Clear competitive differentiation:</strong> Standing out in the market, even with small innovations, can tilt customer decisions your way.</p></li><li><p class=""><strong>Regulatory compliance or Security requirements:</strong> Sometimes the highest-impact move is simply avoiding future legal or operational headaches.</p></li></ul><p class="">Great frameworks don’t just inform decisions they ignite them. The Impact/Effort matrix does exactly that. </p><p class="">When backed by thoughtful criteria and a shared philosophy of doing “less but better,” it becomes more than a tool. It becomes a mindset. </p><p class="">And for many teams today, that mindset is invaluable.</p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1749600555472-6LCGFUDYQGSBJJSTTWUC/dieter+record+player_blue+drawing.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Less but better</media:title></media:content></item><item><title>Scripting the job search</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Sat, 25 Jan 2025 00:10:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/scripting-the-job-search</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:6847419ea26d6d1085f53464</guid><description><![CDATA[The job hunt helper I built with a few lines of JavaScript]]></description><content:encoded><![CDATA[<p class="sqsrte-large"><strong>The job hunt helper I built with a few lines of JavaScript  </strong></p><p class="">Refreshing job boards and reapplying filters every day is tedious. </p><p class="">When I reentered the job market after 8 years and began networking in earnest, I heard this gripe often. So, I built a JavaScript automation to simply the process. </p><p class="">Running in <a href="https://developers.google.com/apps-script/" target="_blank">Google Apps Script</a>, the script fetches and parses RSS feeds from LinkedIn, BuiltIn and Power to Fly. It extracts structured job data into a Google Sheet, filtering out duplicates and expired links—all without me lifting a finger!</p><p class="">To keep it flexible, I designed each parser as a modular component. If I, or anyone else, wants to add a new job board, it’s just a matter of plugging in a new parser class without touching the core logic.  </p><p class="">The script uses regex and logic to accurately extract metadata, such as company name, job title, location, job board URL and (when available) an external job application URL. It can run at regular intervals (daily, hourly, etc.), and it filters out duplicate and expired postings.</p><p class="">The end result is not flashy, but it works. It shifts the focus from sifting through listings to applying for high-fit roles, saving effort and time.</p><p class="">I have included the source code below for anyone to explore the parser logic and the scheduler structure, and to extend it for other use cases.</p><p class="">If you're looking to simplify your job search, or just want a project to sharpen your JavaScript automation skills, this one’s easy to fire up and pays off quickly. </p><p class="">Feel free to reach out for more details or to share your automation success stories.</p>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>Fetch RSS code</strong> </p>


  


  




  
    <pre class="source-code">&lt;function fetchAllRSSJobs() {
  const feeds = [
    { url: 'https://rss.app/feeds/v1.1/PVhoP8nk6gvgKH97.json', sheetName: 'LinkedIn PM Jobs', parser: parseLinkedInRSS },
    { url: 'https://rss.app/feeds/v1.1/MDIHJNe31rKTxLyW.json', sheetName: 'BuiltIn BOS', parser: parseBuiltInBOSRSS },
    { url: 'https://rss.app/feeds/v1.1/QPSAF6S4BNU3Oqmv.json', sheetName: 'Power to fly', parser: parsePowerToFlyRSS }
  ];

  const spreadsheet = SpreadsheetApp.openByUrl('https://&lt;destination Goolge Sheet URL here&gt;');

  feeds.forEach(feed =&gt; {
    const sheet = spreadsheet.getSheetByName(feed.sheetName);

    if (sheet.getLastRow() === 0) {
      sheet.appendRow(['Company', 'Job Title', 'Job Location', 'Job Board URL']);
    }

    const response = UrlFetchApp.fetch(feed.url);
    const data = JSON.parse(response.getContentText());

    let existingLinks = [];
    if (sheet.getLastRow() &gt; 1) {
      existingLinks = sheet.getRange(2, 4, sheet.getLastRow() - 1).getValues().flat();
    }

    const parsedItems = feed.parser(data, existingLinks);
    parsedItems.forEach(row =&gt; {
      sheet.appendRow(row);
    });
  });
}</pre>
  


  
  <p class="sqsrte-large"><strong>LinkedIn parser code</strong></p>


  


  




  
    <pre class="source-code">}
function parseLinkedInRSS(data, existingLinks) {
  return data.items
    .filter(item =&gt; !existingLinks.includes(item.url || 'No URL provided'))
    .map(item =&gt; {
      const rawTitle = item.title || 'No title provided';
      const company = extractLinkedInCompany(rawTitle);
      const jobTitle = extractLinkedInJobTitle(rawTitle);
      const location = extractLinkedInLocation(rawTitle);
      const url = item.url || 'No LinkedIn URL provided';
      return [company, jobTitle, location, url];
    });
}
function extractLinkedInCompany(rawTitle) {
  const match = rawTitle.match(/^(.*?) hiring/i);
  return match ? match[1].trim() : 'No company provided';
}
function extractLinkedInJobTitle(rawTitle) {
  const match = rawTitle.match(/hiring (.*?) in/i);
  return match ? match[1].trim() : 'No job title provided';
}
function extractLinkedInLocation(rawTitle) {
  const match = rawTitle.match(/in (.*?)(,|$)/i);
  return match ? match[1].trim() : 'No location provided';
}</pre>
  


  
  <p class=""><span class="sqsrte-text-color--black"><strong>Key features</strong></span></p><p class="sqsrte-small"><strong>Regex </strong></p><ul data-rte-list="default"><li><p class="sqsrte-small"><span class="sqsrte-text-color--accent"><strong>extractLinkedInCompany</strong> </span>- extracts the company name using at as the keyword anchor</p></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--accent"><strong>extractLinkedInJobTitle</strong></span> - extracts job title as the string before at</p></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--accent"><strong>extractLinkedInLocation</strong></span> - corrects logic for location extraction, ensuring full city names appear </p><ul data-rte-list="default"><li><p class="sqsrte-small">Adjusted patterns to match the LinkedIn job title format: <code>Job Title at Company in Location</code></p></li><li><p class="sqsrte-small">Specifically captures the <span class="sqsrte-text-color--accent"><strong>Company</strong></span> after <code><span class="sqsrte-text-color--accent">at</span></code> and the<span class="sqsrte-text-color--accent"> <strong>Job Title</strong></span> before <code><span class="sqsrte-text-color--accent">at</span></code>.</p></li><li><p class="sqsrte-small">Captures the <span class="sqsrte-text-color--accent"><strong>Location</strong></span> after <code>in</code>.</p></li></ul></li></ul><p class="sqsrte-small"><strong>Fallback defaults</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">Ensures that  <code><span class="sqsrte-text-color--accent">No company provided</span></code>  and <span class="sqsrte-text-color--accent"> </span><code><span class="sqsrte-text-color--accent">No job title provided</span></code><span class="sqsrte-text-color--accent"> </span> appear <em>only</em> when data is genuinely missing.</p></li></ul>


  


  



&nbsp;
  
  <p class="sqsrte-large"><strong>BuiltIn Boston parser code</strong></p>


  


  




  
    <pre class="source-code">}
function parseBuiltInBOSRSS(data, existingLinks) {
  return data.items
    .filter(item =&gt; !existingLinks.includes(item.url || 'No URL provided'))
    .map(item =&gt; {
      const rawTitle = item.title || 'No title provided';
      const content = item.content_text || '';
      const url = item.url || 'No URL provided';
      const company = extractBuiltInCompany(rawTitle, url);
      const jobTitle = extractBuiltInJobTitle(rawTitle, url);
      const location = extractBuiltInLocation(content);
      return [company, jobTitle, location, url];
    });
}
function extractBuiltInCompany(rawTitle, url) {
  const titleMatch = rawTitle.match(/-\s(.+?)\s(?:in|Remote|USA|$)/);
  if (titleMatch) return titleMatch[1].trim();

  // Extract from URL if rawTitle doesn't provide company
  const urlMatch = url.match(/company\/([^/]+)/);
  return urlMatch ? decodeURIComponent(urlMatch[1].replace(/-/g, ' ')) : 'No company provided';
}
function extractBuiltInJobTitle(rawTitle, url) {
  const titleMatch = rawTitle.match(/^(.+?)\s-/);
  if (titleMatch) return titleMatch[1].trim();

  // Extract from URL if rawTitle doesn't provide job title
  const urlMatch = url.match(/jobs\/product\/search\/([^/]+)/);
  return urlMatch ? decodeURIComponent(urlMatch[1].replace(/-/g, ' ')) : 'No job title provided';
}
function extractBuiltInLocation(content) {
  const locationMatch = content.match(/in\s(.+?),?\s(USA|MA|Remote)/i);
  return locationMatch ? locationMatch[1].trim() : 'No location provided';
}</pre>
  


  
  <p class=""><span class="sqsrte-text-color--black"><strong>Key features</strong></span></p><ol data-rte-list="default"><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent"><strong>Company extraction</strong></span></p><ul data-rte-list="default"><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent">Fallback to extract the company name from URLs containing </span><code><span class="sqsrte-text-color--accent">/company/</span></code><span class="sqsrte-text-color--darkAccent">.</span></p></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent">Converts into spaces for a clean company name</span></p></li></ul></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent"><strong>Job Title extraction</strong></span></p><ul data-rte-list="default"><li><p class="sqsrte-small">Enhanced to parse data from both title and URL, if available.</p></li><li><p class="sqsrte-small">Extracts Job Title and Company from specific patterns, including fallback logic for URL-based parsing.</p></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent">Fallback to extract job titles from URLs containing </span><code><span class="sqsrte-text-color--accent">/jobs/product/search/</span></code><span class="sqsrte-text-color--darkAccent">.</span></p></li></ul></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent"><strong>Location extraction</strong></span></p><ul data-rte-list="default"><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent">Left unchanged, as it relies on content or defaults to: "No location provided"</span></p></li></ul></li></ol><p class=""><span class="sqsrte-text-color--darkAccent"><strong>Expected behavior</strong></span></p><ul data-rte-list="default"><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent">For URLs like </span><code><span class="sqsrte-text-color--darkAccent">https://www.builtinboston.com/company/liberty-mutual-insurance</span></code><span class="sqsrte-text-color--darkAccent">, the company should now extract as <strong>Liberty Mutual Insurance</strong>.</span></p></li><li><p class="sqsrte-small"><span class="sqsrte-text-color--darkAccent">For URLs like </span><code><span class="sqsrte-text-color--darkAccent">https://www.builtinboston.com/jobs/product/search/head-of-product</span></code><span class="sqsrte-text-color--darkAccent">, the job title should now extract as <strong>Head of Product</strong>.</span></p></li></ul>


  


  



&nbsp;
  
  <p class="sqsrte-large"><strong>Power to Fly parser code</strong></p>


  


  




  
    <pre class="source-code">}
function parsePowerToFlyRSS(data, existingLinks) {
  return data.items
    .filter(item =&gt; !existingLinks.includes(item.url || 'No URL provided'))
    .map(item =&gt; {
      const rawTitle = item.title || 'No title provided';
      const content = item.content_text || '';
      const url = item.url || 'No URL provided';
      const company = extractPowerToFlyCompany(rawTitle, content);
      const jobTitle = extractPowerToFlyJobTitle(rawTitle, content);
      const location = extractPowerToFlyLocation(rawTitle, content);
      return [company, jobTitle, location, url];
    });
}
function extractPowerToFlyCompany(rawTitle, content) {
  const match = rawTitle.match(/at\s(.+?)\sin/i);
  return match ? match[1].trim() : 'No company provided';
}
function extractPowerToFlyJobTitle(rawTitle, content) {
  const match = rawTitle.match(/^(.*?)\sat/i);
  return match ? match[1].trim() : 'No job title provided';
}
function extractPowerToFlyLocation(rawTitle, content) {
  const match = rawTitle.match(/in\s(.+?),/i);
  return match ? match[1].trim() : 'No location provided';
}</pre>
  


  
  <p class=""><span class="sqsrte-text-color--black"><strong>Key features</strong></span></p><ul data-rte-list="default"><li><p class="">Adjusted to account for specific patterns from Power to Fly JSON data</p></li><li><p class="">Uses similar fallback logic and tailored patterns for extracting the required fields from <code><span class="sqsrte-text-color--accent">title</span></code>, <code>c<span class="sqsrte-text-color--accent">ontent</span></code>, and <code><span class="sqsrte-text-color--accent">URL</span></code></p></li><li><p class="">Also has fallback logic for missing fields</p></li></ul>


  


  



<hr />
  
  <p class="sqsrte-large"><strong>Script testing</strong></p><p class="sqsrte-large">Follow these steps to test your script to ensure the RSS URL passes data to Google Sheets.</p><p class=""><strong>Step 1: Verify your script</strong></p><p class="sqsrte-small"><strong>Double-check it</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">Ensure the correct RSS JSON URL is set in the <code>url</code> variable:</p><p class="sqsrte-small"><code>const url = 'YOUR_RSS_JSON_URL'; // Replace with your RSS JSON feed URL</code></p></li><li><p class="sqsrte-small">Confirm the sheet name matches your actual Google Sheet tab name in this line:</p><p class="sqsrte-small"><code>const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');</code></p></li></ul><p class="sqsrte-small"><strong>Save it</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">Click <strong>File &gt; Save</strong> and name your project (e.g., <code>FetchRSSJobs</code>).</p></li></ul><p class="sqsrte-small"> <strong>Note:</strong> If you want to specify a specific Google Sheet (e.g., your "daily job search automation" sheet), you need to replace the <code>getActiveSpreadsheet()</code> call with <code>openByUrl()</code> and use the URL of your Google Sheet. </p><p class=""><strong>Step 2: Test your script</strong></p><p class="sqsrte-small"><strong>Run it</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">In the Apps Script editor, select the function <code>fetchRSSJobs</code> from the dropdown menu.</p></li><li><p class="sqsrte-small">Click the <strong>Run</strong> button ▶️.</p></li></ul><p class="sqsrte-small"><strong>Authorize it</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">On the first run, you’ll need to authorize the script.</p><ul data-rte-list="default"><li><p class="sqsrte-small">A prompt will appear asking for permission to access your spreadsheet and fetch data.</p></li><li><p class="sqsrte-small">Click <strong>Review Permissions</strong> and log in with your Google account.</p></li><li><p class="sqsrte-small">Choose <strong>Advanced Options &gt; Go to Project (unsafe)</strong> if you see a warning.</p></li><li><p class="sqsrte-small">Click <strong>Allow</strong> to authorize.</p></li></ul></li></ul><ol data-rte-list="default"><li><p class="sqsrte-small"><strong>Check for errors</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">If the script runs successfully, it will append the data from the RSS JSON to your Google Sheet.</p></li><li><p class="sqsrte-small">If there’s an error, the <strong>Execution Log</strong> (found under <strong>View &gt; Execution Log</strong>) will provide debugging information.</p></li></ul></li></ol><p class=""><strong>Step 3: Verify data in Sheets</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">Open your Google Sheet and check if the data from the RSS feed appears in the appropriate columns.</p></li><li><p class="sqsrte-small">If the data doesn’t look right…</p><ul data-rte-list="default"><li><p class="sqsrte-small">Double-check the structure of the RSS JSON feed or</p></li><li><p class="sqsrte-small">modify the <code>forEach</code> loop in the script to correctly reference JSON keys.</p></li></ul></li></ul><p class="sqsrte-small"><strong>Example of adjusting keys</strong></p><p class="sqsrte-small"><code>data.items.forEach((item) =&gt; { sheet.appendRow([item.title, item.company, item.location, item.link]); // Update keys as needed });</code></p><p class=""><strong>Step 4: Common issues and resolutions *</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small"><strong>"TypeError: Cannot read property 'items' of undefined"</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">The structure of the JSON feed might differ from the script's expectations. Use the <code>Logger</code> to inspect the JSON structure:</p><p class="sqsrte-small"><code>Logger.log(data);</code></p><ul data-rte-list="default"><li><p class="sqsrte-small">View the log under <strong>View &gt; Logs</strong> to identify the correct keys.</p></li></ul></li></ul></li><li><p class="sqsrte-small"><strong>"Authorization Required"</strong> <strong>error</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">Ensure you’ve authorized the script to access Google Sheets and external services.</p></li></ul></li></ul><p class=""><strong>Step 5: Deploy the script </strong>(optional)</p><p class="sqsrte-small">You don’t need to deploy the script for testing, but if you want it to be accessible as a web app or trigger-able externally, then… </p><ol data-rte-list="default"><li><p class="sqsrte-small">Click <strong>Deploy &gt; Test Deployments</strong>.</p></li><li><p class="sqsrte-small">Follow the prompts to set up a deployment method.</p></li></ol>


  


  



<hr />
  
  <p class="sqsrte-large">* <strong>Additional errors and resolutions</strong></p><p class=""><strong>"Error 401: deleted_client" </strong></p><p class="">This indicates that the OAuth client (your script project) was deleted or is misconfigured, likely preventing Google from authorizing access to services like Google Sheets or external APIs. Here’s how to <strong>fix it and reauthorize the script</strong>:</p><p class="sqsrte-small"><strong>Step 1: Reset your script's OAuth credentials</strong></p><p class="sqsrte-small">If the OAuth client was deleted, you need to reset the script's authorization settings.</p><ol data-rte-list="default"><li><p class="sqsrte-small"><strong>Reauthorize the script</strong></p></li><ul data-rte-list="default"><li><p class="sqsrte-small">In the Apps Script editor, click <strong>Project Settings</strong> (gear icon on the left sidebar).</p></li><li><p class="sqsrte-small">Scroll down to <strong>"Show" under Scopes</strong> and click it to see the script’s OAuth scopes.</p></li><li><p class="sqsrte-small">Click <strong>Reset Authorization</strong> to reauthorize your script.</p></li></ul><li><p class="sqsrte-small"><strong>Re-save your script</strong></p></li><ul data-rte-list="default"><li><p class="sqsrte-small">After saving the script, try running it to re-trigger the authorization flow.</p></li></ul></ol><p class="sqsrte-small"><strong>Step 2: Verify script permissions</strong></p><p class="sqsrte-small">Ensure that your script uses the following scopes:</p><ol data-rte-list="default"><li><p class="sqsrte-small"><strong>Google Sheets API</strong> – For accessing your spreadsheet:</p></li><ul data-rte-list="default"><li><p class="sqsrte-small">"https://www.googleapis.com/auth/spreadsheets"</p></li></ul><li><p class="sqsrte-small"><strong>External API (UrlFetchApp)</strong> – For fetching the RSS feed:</p></li><ul data-rte-list="default"><li><p class="sqsrte-small">"https://www.googleapis.com/auth/script.external_request"</p></li></ul></ol><p class="sqsrte-small">If you still see the error…</p><ul data-rte-list="default"><li><p class="sqsrte-small"><strong>Click "Deploy &gt; Test Deployment"</strong> to reinitialize the OAuth client.</p></li><li><p class="sqsrte-small">Test the deployment using the test version.</p></li></ul><p class="sqsrte-small"><strong>Step 3: (If necessary) Create a new script project </strong></p><p class="sqsrte-small">If the OAuth client is permanently deleted and cannot be reinitialized… </p><ol data-rte-list="default"><li><p class="sqsrte-small"><strong>Create a new Script Project</strong></p></li><ul data-rte-list="default"><li><p class="sqsrte-small">Open your Google Sheet.</p></li><li><p class="sqsrte-small">Click <strong>Extensions &gt; Apps Script</strong> to create a new script project.</p></li></ul><li><p class="sqsrte-small"><strong>Copy-paste your code</strong></p></li><ul data-rte-list="default"><li><p class="sqsrte-small">Copy and paste the code from your current script into the new project.</p></li></ul><li><p class="sqsrte-small"><strong>Reauthorize and run</strong></p></li><ul data-rte-list="default"><li><p class="sqsrte-small">Save and run the script as before.</p></li><li><p class="sqsrte-small">Authorize the script again when prompted.</p></li></ul></ol><p class="sqsrte-small"><strong>Step 4: Debugging</strong></p><p class="sqsrte-small">If you still encounter issues…</p><ol data-rte-list="default"><li><p class="sqsrte-small">Check <strong>View &gt; Logs</strong> in the Apps Script editor for error messages.</p></li><li><p class="sqsrte-small">Verify that your Google account is authorized for both <strong>Google Sheets</strong> and <strong>external API calls</strong>.</p></li></ol><p class=""><strong>"Google hasn’t verified this app"</strong></p><p class="">This message appears because your Apps Script project hasn't been verified by Google, which is common for personal scripts. You can bypass this message for your own use without needing to verify the app. Here’s how.</p><p class="sqsrte-small"><strong>Step 1: Proceed past the warning</strong></p><ol data-rte-list="default"><li><p class="sqsrte-small">When the "Google hasn’t verified this app" screen appears…</p></li><ul data-rte-list="default"><li><p class="sqsrte-small">Click <strong>Advanced</strong> at the bottom of the warning.</p></li><li><p class="sqsrte-small">Click <strong>Go to [Project Name] (unsafe)</strong>.</p></li><li><p class="sqsrte-small">Grant the requested permissions to allow your script to access your Google Sheets and external services.</p></li></ul><li><p class="sqsrte-small">Once permissions are granted, the script should run as expected.</p></li></ol><p class="sqsrte-small"><strong>Step 2: Confirm permissions granted</strong></p><ul data-rte-list="default"><li><p class="sqsrte-small">In the Apps Script editor, re-run your script.</p></li><li><p class="sqsrte-small">If prompted again, authorize the permissions following the steps above.</p></li><li><p class="sqsrte-small">Check your Execution Log (<strong>View &gt; Execution Log</strong>) to ensure the script executes without errors.</p></li></ul><p class="sqsrte-small"><strong>Step 3: Debugging </strong></p><p class="sqsrte-small">If you see the warning in the Execution Log: <em>"This project requires access to your Google Account to run. Please try again and allow it this time"</em>, this means authorization was not completed. Repeat <strong>Step 1</strong> to bypass the verification warning and grant access.</p><p class="sqsrte-small"><strong>Optional: Avoid future warnings</strong></p><p class="sqsrte-small">For smoother execution…</p><ol data-rte-list="default"><li><p class="sqsrte-small"><strong>Use Triggers for Automation</strong>:</p></li><ul data-rte-list="default"><li><p class="sqsrte-small">Set up a time-driven trigger to run the script automatically.</p></li><li><p class="sqsrte-small">Triggers typically bypass the manual authorization process after the first setup.</p></li></ul><li><p class="sqsrte-small"><strong>Deploy as a Test Deployment</strong>:</p></li><ul data-rte-list="default"><li><p class="sqsrte-small">Click <strong>Deploy &gt; Test Deployments</strong>.</p></li><li><p class="sqsrte-small">Test the deployment to ensure it works without further manual intervention.</p></li></ul></ol>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1749662090727-GMOW5FU10EOD09X6XJHF/job+search+script+2.png?format=1500w" medium="image" isDefault="true" width="1500" height="1500"><media:title type="plain">Scripting the job search</media:title></media:content></item><item><title>Signals from the deep</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Sun, 22 Dec 2024 15:48:06 +0000</pubDate><link>https://www.geoffmosher.me/blog/signals-from-the-deep</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:67682bdd74795e61dd2db910</guid><description><![CDATA[10 albums from 2024's vast musical waters]]></description><content:encoded><![CDATA[<h3>Ten albums that illuminated 2024's vast musical waters</h3><p class="">In 2000, Napster upended the music industry, giving listeners <a href="https://streamingmachinery.wordpress.com/2020/07/13/how-much-music-is-really-released-per-year/?utm_source=chatgpt.com" target="_blank">unprecedented access to music</a> at their fingertips. That year marked the beginning of digital disruption, as illegally-downloaded tracks threw the music industry into chaos and transformed how music was consumed and commercialized.</p><p class="">In 2024, we're submerged in an even vaster <a href="https://www.albumoftheyear.org/ratings/6-highest-rated/2024/1" target="_blank">ocean of music</a>, with more albums released this year than in the entire 2000s combined.&nbsp;</p><p class="">We’re all effectively divers in increasingly deep sonic waters, and even the most sophisticated digital tools can't fully illuminate every corner of this musical expanse. Yet amid these immense depths, the thrill of discovery remains as timeless as ever.</p><p class="">Here are ten albums that stood out to me in 2024 — in no particular order. Each cut through the digital abyss to reveal the hypnotic sounds of tomorrow, bright signals in an era of staggering abundance.</p><p class=""><strong>Cindy Lee — “Diamond Jubilee”</strong></p><p class="">I haven’t been this thrilled about a pre-order since “<a href="https://soundcloud.com/theavalanches/sets/wildflower" target="_blank"><em>Wildflower</em></a><em>”</em> by The Avalanches dropped nearly a decade ago. </p><p class="">Cindy Lee’s sprawling 32-track opus landed on YouTube in early 2024, igniting the internet with its ghostly echoes of ’60s girl group harmonies and its kaleidoscopic soundscapes. </p><p class="">From jangly garage rock to hazy synth-pop and ambient bliss-outs, each reverb-drenched track feels suspended in its own dreamlike time-scape. </p><p class="">I can’t wait to experience it on vinyl — and, hopefully, live someday!</p>


  


  




  
  <p class=""><strong>Bolbec — “Victime De L’aube”</strong></p><p class="">A timeless treasure you’d be forgiven for thinking is the soundtrack to a ‘70s Franco-Italian melodrama. </p><p class="">“Victime De L’aube” has a sound I can best describe as <a href="https://cinematicorchestramusic.bandcamp.com" target="_blank">The Cinematic Orchestra</a> meets Antonio Carlos Jobim’s “<a href="https://youtu.be/eqs_vgwVavI?si=U7eSjufYbRoRYAHP" target="_blank">Wave</a>” with a smattering of space age pop and krautrock. </p><p class="">Throw it on while you’re entertaining guests, and they’re bound to ask you what “playlist” they’re hearing.</p><p class=""><strong>Jessica Pratt — “Here In The Pitch”</strong></p><p class="">The California singer-songwriter’s fourth album elevates her trademark ethereal voice and fingerpicked guitar sound with rich production and varied instrumentation that suggests a gradual stylistic evolution, not a radical departure. </p><p class="">It’s easily one of the most beautiful albums of the year.&nbsp;Hands down. </p>


  


  




  
  <p class=""><strong>Martina Berther — “Bass Works: As I Venture Into”&nbsp;</strong></p><p class="">A dozen one-take compositions that redefine the possibilities of the bass guitar. </p><p class="">The Swiss bassist and composer’s <a href="https://martinaberther.bandcamp.com/album/bass-works-as-i-venture-into" target="_blank">debut solo album</a> crafts exhilarating bass textures through techniques as varied as bowing, detuning and electronic manipulation. </p><p class="">It rewards repeated listens.&nbsp;</p><p class=""><strong>Dummy — Free Energy</strong></p><p class="">If “<a href="https://youtube.com/playlist?list=PLeWZxmD5UF70gu0UieZeB4TaAsIp3mWgf&amp;si=ywhaiCmba8b6ew5E" target="_blank">Screamadelica</a>”-era Primal Scream were a band today, they just might sound like Los Angeles-based Dummy. </p><p class="">The quartet’s <a href="https://notdummy.bandcamp.com/album/free-energy" target="_blank">sophomore album</a> is awash in infectious psych-rock groove that’s occasionally interspersed with jazz interludes and field recordings. </p><p class="">A real party pleaser.&nbsp;</p><p class=""><strong>Jahari Massamba Unit — “YHWH Is Love"&nbsp;</strong></p><p class="">Madlib and Karriem Riggins’ sophomore output delivers the head-nodding future jazz goods you’d expect from the beat-maker and drummer who were introduced two decades ago while working with legendary producer-rapper J Dilla. </p><p class="">Electric relaxation that’s equally fit for work and play. &nbsp;</p>


  


  




  
  <p class=""><strong>MJ Lenderman — “Manning Fireworks”</strong></p><p class="">The poet laureate of Asheville’s <a href="https://mjlenderman.bandcamp.com/album/manning-fireworks" target="_blank">fourth album</a> excels on many levels: atmosphere, interplay and wit to name a few. </p><p class="">Imagine Jason Molina occasionally veering into “<a href="https://youtu.be/YaMYh1pmon4?si=WNkc-ZdWOn1qIVT4" target="_blank">Wowee Zowee</a>”-era Pavement sounds and safely landing back in twangy indie rock territory. </p><p class="">That gets you part of the way to the land of Lenderman. &nbsp;</p><p class=""><strong>Nala Sinephro — "Endlessness"</strong></p><p class="">Known for her experimental approach to jazz that incorporates elements of ambient music and field recordings, Nala Sinephro’s latest listening experience, “<a href="https://youtu.be/IyvqVDAGU0s?si=9XXZWMZ3nHqtExgD" target="_blank">Endlessness</a>”, is as dynamic and multi-layered as its title suggests.</p><p class="">&nbsp;The Caribbean-Belgian multi-instrumentalist, who lives in London, bases each of the album’s ten tracks around a central arpeggio motif that reemerges throughout, providing a unifying thread as warm synth textures collide with saxophone and drums.</p><p class="">You won’t want it to end.&nbsp;</p><p class=""><strong>Ka — “The Thief Next to Jesus”</strong></p><p class="">Less than two months before his unexpected passing this fall, Brooklyn rapper Ka released his ninth album to wide critical acclaim. </p><p class="">One listen, and it’s clear why. </p><p class="">The album seamlessly blends gospel samples and themes with Ka’s trademark introspective lyricism, minimalist production and understated delivery reminiscent of his influence, Guru. </p><p class="">A NYC firefighter and 9/11 first responder, Ka used to personally mail his CDs and LPs to fans who purchase them online. </p><p class="">Sleep not on his discography. &nbsp;</p>


  


  




  
  <p class=""><strong>The Innocence Mission — “Midwinter Swimmers”</strong></p><p class="">The Innocence Mission has been putting out gossamery folk-rock goodness for going on three decades. </p><p class="">“<a href="https://theinnocencemission.bandcamp.com/album/midwinter-swimmers" target="_blank">Midwinter Swimmers</a>” is yet another reason to stay on top of their discography or dive into it.</p><p class="">Intricate vocals and intimate instrumentation wrapped together in a lo-fi production collage you’ll want to unwrap this holiday.&nbsp;</p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1734883729509-BLG4H4Q87SQSKS198MC2/Geoff+Mosher+blog+post+-+Signals+from+the+Deep_12-2024.png?format=1500w" medium="image" isDefault="true" width="1500" height="1117"><media:title type="plain">Signals from the deep</media:title></media:content></item><item><title>My next career chapter</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Mon, 25 Nov 2024 18:15:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/blog-post-my-next-career-chapter</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:673645e456153457786ec1d6</guid><description><![CDATA[Finishing one momentous journey, forging another]]></description><content:encoded><![CDATA[<h2><strong>Finishing one momentous journey, forging another one</strong></h2><p class="">After 8 incredible years, I have made the difficult decision to leave my role as an Associate Director of Product Development at Verizon Global Network &amp; Technology.</p><p class="">This was not an easy choice. My division, my senior director and my colleagues have been a huge part of my professional journey.</p><p class="">However, there was no escaping that the time is right for me to pursue new opportunities to grow my skills and make broader professional impacts.</p><p class="">Make no mistake, my time at Verizon has been immensely rewarding. I have had the privilege of working on digital platforms and products that have transformed lives.</p><p class="">From modernizing America’s most reliable network to redefining cloud backup and storage services to building innovative API-powered solutions, I have continually expanded my expertise across the software development lifecycle. The variety of projects and the freedom to ideate have been especially fulfilling.</p><h4><strong>A career defined by adaptability and acumen </strong></h4><p class="">From journalism to telecom, I have consistently applied knowledge and skills gained in one career path to another, all while rapidly mastering emerging technologies and new business models. </p><p class="">While I have many professional strengths, one of the greatest is my ability to translate complex technical initiatives into world-class user experiences that solve real-world problems through enhanced product and tooling capabilities.</p><p class="">But don't just take my word for it. I invite you to browse the accounts and data contained within these pages. They provide tangible evidence of when and how my blend of technical depth and breadth — coupled with my strategic and creative mindset — made me a valuable asset to past employers.</p><h4><strong>Embracing what’s next</strong></h4><p class="">While I am truly sad to depart Verizon, I could not be more excited about the opportunities that lie ahead.</p><p class="">I look forward to forging a new career chapter in which I can contribute my expertise and skills to shape the future of emerging digital solutions and services for consumers and enterprises alike. </p><p class="">My goal is to join a collaborative, fast-paced team tackling complex challenges with creativity and ingenuity. I thrive when and where I can catalyze new ideas, foster team growth, and contribute to a company’s success and industry position. </p><p class="">I am open to diverse business landscapes and committed to finding a role that will allow me to make a lasting impact in areas such as agile development, product strategy, data analytics, business operations and growth marketing.</p><p class="">I am confident that I will continue to grow as a digital product leader, driving transformative change within organizations building next-generation technologies.<strong> </strong></p><p class="">On the way out, I am grateful for my time at Verizon and all that I have learned and achieved. Here’s to the next stage of my career, and making a lasting impact once more!</p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/png" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1731614818487-DM98P5NPBJZ6VWNJ7ACI/leaving+Verizon+art.png?format=1500w" medium="image" isDefault="true" width="900" height="983"><media:title type="plain">My next career chapter</media:title></media:content></item><item><title>Back in the blogosphere</title><dc:creator>Geoff Mosher</dc:creator><pubDate>Fri, 08 Nov 2024 18:07:00 +0000</pubDate><link>https://www.geoffmosher.me/blog/blog-post-title-two-2ybl8</link><guid isPermaLink="false">6735ff5486988f3367441625:673645e456153457786ec1d5:673645e456153457786ec1dc</guid><description><![CDATA[Once again poised to provide truncated thoughts on work and play]]></description><content:encoded><![CDATA[<p class="">After years of spearheading all manner of internal company communications that rarely entered the public domain, I am happy to announce that I am starting another personal blog from which to voice distinctive points of view and share one-of-a-kind expertise, plus occasional anecdotes and insights from the frontlines of work and play.</p><p class="">It’s been a minute since I made a name for myself in the blogosphere.</p><p class="">More than a decade ago, I created, maintained and promoted the <strong>@MediaBeeswax</strong> blog and other websites while employed as business development manager in the financial trade publishing industry on Wall Street. </p><p class="">My former blog offered an irreverent look at the digital convergence of media, entertainment and marketing with an eye on mobile innovation and futuristic technology.</p><p class="">Here’s a screenshot of a post from March 2011 drawing parallels between Tom Wolfe's The Painted Word and the state of the journalism-for-hire industry.</p>


  


  














































  

    
  
    

      

      
        <figure class="
              sqs-block-image-figure
              intrinsic
            "
        >
          
        
        

        
          
            
          
            
                
                
                
                
                
                
                
                <img data-stretch="false" data-image="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg" data-image-dimensions="800x610" data-image-focal-point="0.5,0.5" alt="" data-load="false" elementtiming="system-image-block" src="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=1000w" width="800" height="610" sizes="(max-width: 640px) 100vw, (max-width: 767px) 100vw, 100vw" onload="this.classList.add(&quot;loaded&quot;)" srcset="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=100w 100w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=300w 300w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=500w 500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=750w 750w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=1000w 1000w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=1500w 1500w, https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/7fa181c0-584c-4349-85c2-be3067f91407/mediabeeswax+post.jpeg?format=2500w 2500w" loading="lazy" decoding="async" data-loader="sqs">

            
          
        
          
        

        
          
          <figcaption class="image-caption-wrapper">
            <p>The New Media Boho Dance</p>
          </figcaption>
        
      
        </figure>
      

    
  


  



  
  <p class="">Before moving from New York to Los Angeles — where I entered the mobile gaming space and didn’t look back — I sold the URL, <strong>DigMyMix.com</strong>, an un-developed site I had been intending to build into a user-generated digital jukebox for artists and audiophiles like me to collaborate and expand on the art of the mix tape, to a marketing agency that later used it to brand an iOS app of the same name it created for a client.</p>


  


  



&nbsp;



<a href="https://feeds.feedburner.com/geoffmosher/blog" title="Mosher's musings RSS" class="social-rss">Mosher's musings RSS</a>]]></content:encoded><media:content type="image/jpeg" url="https://images.squarespace-cdn.com/content/v1/6735ff5486988f3367441625/1731615610635-8BHIVK27MJ6MOXUOZFX4/data+analysis+.jpeg?format=1500w" medium="image" isDefault="true" width="1024" height="1024"><media:title type="plain">Back in the blogosphere</media:title></media:content></item></channel></rss>