About
I'm a Developer Relations Engineer at Google, focusing on Google Workspace. My work involves creating tools and supporting the open-source community. Before Google, I had the opportunity to work with geospatial data at Descartes Labs and the US Geological Survey. When I'm not coding, I'm usually running long distances in the mountains of Colorado, and I enjoy writing about my experiences in both tech and ultrarunning.
Tags
#code (51)#google (28)#google workspace (27)#apps script (20)#run (17)#ultramarathon (14)#link (12)#GitHub (10)#google cloud (8)#race report (7)#automation (6)#workflows (6)#rust (5)#ai (4)#Arizona (4)#Colorado (4)#docker (4)#javascript (4)#Moab (4)#100 mile (3)#100mile (3)#aravaipa running (3)#dependabot (3)#drive (3)#firestore (3)#gh (3)#google maps (3)#mcp (3)#Mogollon Monster (3)#oauth (3)#performance (3)#python (3)#snippet (3)#Utah (3)#wasm (3)#webassembly (3)
Recent posts
- - Securing Gmail AI Agents against Prompt Injection with Model Armor
- - Google Workspace Developer Tools MCP Server
- - React Wrapper for Google Drive Picker
- - Google Workspace Developer Tools VS Code Extension
- - Google Drive Picker TypeScript - Types Updated
- - Google Forms - title vs name vs documentTitle
- - Converting between Office docx and Google Docs in Google Apps Script
- - Google Workspace Developer Summits - 2024 - Boston and Berlin
- - Google Sheets API - IMPORT / Image - Bypass User Consent
- - How do I get access to the chrome.sidePanel API from the latest manifest v3? - Stack Overflow
- - Arizona Monster 300
- - Running the Zion 100
- - Apps Script and WebAssembly - A comprehensive guide
- - Alfalfa Uses More Water Than All Cities, Industries in Colorado River Basin
- - Google Workspace Developers
- - SvelteKit: Convert base64 slugs to UUIDs automatically in a derived store
- - Google Apps Script: google.script.run vs. doGet/doPost Endpoints
- - Feds May Be Underestimating Broadband Woes
- - Multipass Mini – Janji
- - TDS - les Traces du Duc de Savoie - Dacia UTMB Mont Blanc
- - Share Openly
- - Rust Teams Twice as Productive as C++
- - Drive File Get Blob and Scopes in Google Apps Script
- - My Debian development environment setup
- - Key Value Store Options in Google Apps Script
- - Google Cloud Region Latency in Google Apps Script
- - Optimizing Parallel Jobs in a Github Workflow
- - Apps Script V8 Runtime Limitations
- - Google Next 24 - Rust, Python, and WASM in Apps Script
- - Promises, async and await in Google Apps Script
- - Cloudflare workers with Wrangler for dev, staging, and prod
- - Google Calendar - Usage Limits Exceeded
- - Embed images from Google Drive in your website
- - Using Firestore in Apps Script
- - Apps Script Service Account Impersonation
- - Optimized Dockerfile for Rust
- - Generating Text with Gemini Pro in Apps Script
- - Memoization in Apps Script
- - Using Vertex AI in Apps Script
- - Building a Google Chat App with n8n
- - Combining Google Workspace Add-ons and Editor Add-ons
- - Moab 240 Training Camp
- - A Trail Marathon Race Win Was Stolen From Me
- - Rust Compiler Whack-a-Mole
- - Using Cloudflare Pages and Functions for email magic links
- - Recovering from a 100 mile ultramarathon
- - Google User Credentials in non-interactive workflows
- - Verify a Google access token
- - Automator's Hole
- - La Sportiva Cyklon Cross GTX Review
- - A look back at running in 2022 and plans for 2023
- - Track all Firestore write activity in Firestore
- - Delete Old GitHub Forks
- - 2022 Moab 240 DNF
- - 2022 Mogollon Monster 100 Mile Race Report
- - Strongly Typed Yup Schema in TypeScript
- - Caching Playwright Binaries in GitHub Actions
- - Environment Variables in GitHub Docker build-push-action
- - Using Google Container Registry, Docker Buildx, and GitHub Actions
- - Mogollon Monster 100 Mile Planning
- - 2022 Creede 100 Race Report
- - 2022 Mace's Hideout 100 Race Report
- - Strava Webhooks with Stokehook.com
- - Unwatch All Repositories in a GitHub Organization
- - Automatically Archiving Dependabot and Semantic Release Emails
- - Automatically Approving and Merging Dependabot Pull Requests
- - Rebasing All Dependabot Pull Requests
- - What is DevRel?
- - Drop Bag Plan for Cocodona 250
- - Eleventy Related Posts Using TF-IDF
- - Running and Chronic Exertional Compartment Syndrome
- - GitHub Workflow to Sync Branches
- - 2022 Sedona Stage Race Report
- - Eleventy Progressive Web App
- - What about the cows...
- - 2022 Behind the Rocks 50k Race Report
- - Mountain Bike Bear Spray Holder
- - 2021 Mogollon Monster 100 Mile Race Report
- - Google Maps React Wrapper
- - Molas Lake to Vallecito Reservoir
- - Automate Email Bankruptcy using Apps Script
- - WMS Layer on Google Maps
- - Microservice Usage Logging with Openresty and Google BigQuery
Races
• TrailRun • 163.50 km • 5553 m
• TrailRun • 20.15 km • 712 m
• TrailRun • 173.22 km • 6428 m
• Run • 77.68 km • 1427 m
• Run • 50.99 km • 1132 m
• Run • 18.64 km • 759 m
• Run • 51.60 km • 1332.5 m
• Run • 19.65 km • 625 m
• Run • 162.53 km • 4855.9 m
• Run • 118.19 km • 4417 m
• Run • 76.40 km • 3097.1 m
• Run • 29.98 km • 753 m
Recent activities
• TrailRun • 8.06 km • 164 m
• Hike • 3.51 km • 96 m
• TrailRun • 10.47 km • 272 m
• Hike • 2.75 km • 66 m
• TrailRun • 11.52 km • 338 m
• Hike • 2.12 km • 102 m
• TrailRun • 9.67 km • 260 m
• Hike • 2.83 km • 62 m
• Hike • 5.65 km • 157 m
• Hike • 3.61 km • 101 m
