I'm running the Crazy Mountain 100 in 2026! It's a rugged 100 miler in Montana that serves as a Hardrock qualifier.
A secure strategy to resolve Google Chat User IDs to email addresses without using Domain-Wide Delegation. By combining Direct Role Assignment with Service Account Impersonation, you can maintain Least Privilege security.
A deep dive into Apps Script CacheService limits. I verify key/value constraints and uncover the undocumented FIFO batch eviction policy at the 1000-item limit.
A comprehensive deep-dive into UrlFetchApp. Covers architecture, authentication, web scraping, and debugging notorious infrastructure errors (Address Unavailable, 60s timeout, Gzip truncation).
Do not hardcode secrets in Google Apps Script. Use Properties Service or Google Cloud Secret Manager.
Securing Gmail AI agents against Prompt Injection and untrusted content using Google Cloud Model Armor.
Announcing the new React component for the Google Drive Picker, wrapping usage of the web component for easier integration.
Announcing the new MCP server for Google Workspace Developer Tools, providing AI agents with access to official documentation and API snippets.
Announcing the new Google Workspace Developer Tools extension for VS Code, working with Antigravity and providing OAuth2 scope linting and MCP support.
Last week I submitted a pull request to the DefinitelyTyped repository for the Google Drive Picker API. Not a big deal in itself, but these types are generated from the same source as the Google Drive Picker reference documentation and should be more correct and consistent than the community types that were previously in the DefinitelyTyped repository.
Recently I had to clarify some confusion around the title and name of a Google Form. Here is a quick explanation of the difference between the two.
Learn how to programmatically convert, open, and edit Microsoft Word .docx files using Google Apps Script and the Drive API.
Use the Spreadsheets v4 API to set the importFunctionsExternalUrlAccessAllowed property to true and allow access to external URLs without requiring user consent.
Save the date for the Google Workspace Developer Summits in 2024! Boston - September 12, 2024 and Berlin - September 17, 2024.
Link shared about: How do I get access to the chrome.sidePanel API from the latest manifest v3? - Stack Overflow
Link shared about: Alfalfa Uses More Water Than All Cities, Industries in Colorado River Basin
You can use WebAssembly with Google Apps Script! This post will cover how to do that and provide a comprehensive guide on how to get started.
A SvelteKit store that automatically converts slugs to UUIDs from the URL path parameters.
Learn about the different options for making API calls in Google Apps Script web apps: `google.script.run` and GET/POST endpoints (`doGet` and `doPost`). Understand their strengths and weaknesses to choose the best approach for your project.
TDS - les Traces du Duc de Savoie - Dacia UTMB Mont Blanc
Link shared about: Feds May Be Underestimating Broadband Woes
Working with binary files like PDFs or images in Google Drive with Google Apps Script can be a bit tricky due to scopes. Here is a comparison of the three main ways to get the Blob of a file in Google Drive and the scopes required.
A comparison of key-value store options in Google Apps Script, including PropertiesService, CacheService, Firestore, and Sheet Developer Metadata.
Ping results to Google Cloud regions and short code snippet demonstrating how to measure latency from Google Apps Script.
A pattern for persisting the workspace files between parallel jobs in a GitHub Workflow.
A comparison of the WinterCG Minimum Common Web Platform API draft with the Apps Script V8 runtime.
I will be giving a talk at Google Next 2024 on how to use Rust, Python and WASM to extend Google Apps Script.
Google Apps Script is based on the V8 engine and supports the use of Promises, async and await. However, there are almost no APIs available that are asynchronous except for the WebAssembly API.
Deploying Cloudflare workers to dev, staging, and prod with Wrangler and automatically promoting with GitHub actions.
Cleanup repositories on GitHUb by deleting old forks.
Google Drive broke the ability to embed images with the /uc path. Here's how to embed images from Google Drive in your website.
Avoid downloading private service account keys by using impersonation in Apps Script to obtain access tokens.
Firestore can be a powerful tool when using Apps Script. This post shows how to use the [Firestore REST API] in Apps Script.
A simple Dockerfile for a Rust project that caches dependencies and uses a minimal Debian image.
A short code snippet demonstrating how to generate text with the Gemini Pro Rest API in Apps Script.
How to use the Vertex AI API in Apps Script to make predictions on your data or use it in any of your other Google Workspace processes.
A generic Apps Script memoization function can be written to cache any function.
I created a n8n workflow to implement a Google Chat App that translates messages.
Both Add-on types have their own strengths and weaknesses. Combining them could be a powerful way to build Add-ons for Google Workspace but with some caveats.
Training camp, 3 days, 92.79 mi, 17,123 ft! I'm planning a 3 day training camp for the upcoming Moab 240 covering some of the highest and most technical sections of the course.
A race director gave the win to two runners that skipped the final climb and 3.8 miles of the course.
Playing whack-a-mole with the rust compiler is both frustrating and a great learning experience.
This blog post demonstrates how to implement email magic links for a login page using Cloudflare Pages, Cloudflare Functions, and Sendgrid. It provides code examples and explanations for each step of the process, including form creation, token generation and validation, session management, and user authentication.
What my body is telling me a week after running a 100 mile ultramarathon.
Using an offline Oauth2 flow to get Google user credentials for use as application default credentials in APIs that do not allow service accounts or API keys and require user credentials.
A simple endpoint to verify a Google access token
There is a point between manual tasks and automation where nothing gets done.
In 2022 I ran nearly 2400 miles and have big plans for 2023
An ultrarunner reviews the La Sportiva Cyklon Cross GTX for winter running.
Capture all user activity in a Firestore collection using Audit Logs, Pub/Sub, and Cloud Functions.
Race report for the 2022 Mogollon Monster 100 mile ultramarathon.
Race Report for the 2022 Moab 240. I had a DNF at the midpoint, Shay Mountain.
A basic pattern for strongly typing Yup schemas in TypeScript using conditionals.
A pattern for authenticating to gcr.io from docker/build-push-action.
A basic pattern for passing environment variables to the docker/build-push-action from a GitHub secret.
A simple strategy to effectively speed up use of Playwright in GitHub Actions with caching.
Planning and splits for the 2022 Mogollon Monster 100
Race Report for the 2022 Creede 100 mile ultramarathon. I finished 2nd in 29:16:01.
Race Report for the 2022 Mace's Hideout 100 mile ultramarathon. I finished 3th in 29:20:53.
Using the GitHub CLI to unsubscribe from repositories.
An app I built using Svelte, Firebase, and the Strava API.
Using Google Apps Script as part of my open source workflow.
Short code snippet showing how I rebased all Dependabot pull requests across a GitHub org.
A simple GitHub workflow to automatically approve and merge Dependabot pull requests.
DevRel is a lot things: marketing, engineering, product management, support; my experience as a Developer Relations Engineer at Google.
Running a 250 mile race without crew or pacers requires adaptability and a good plan for drop bags. This is a work in progress...
Automating related posts in Eleventy with term frequency-inverse document frequency and eleventy-plugin-related.
Understanding and treating a new running injury, Chronic Exertional Compartment Syndrome. Can I run? Can I race?
It is easy to sync branches in a GitHub workflow without using a third party GitHub Action.
Race Report for the 2022 Red Rocks Stage Race in Sedona, AZ. I finished the 50k Saturday, 50k Sunday version second overall in a little over 11 hours total.
Catching the Eleventy Lighthouse obsession bug!
Don't bust the crust (unless you are a cow). A greenwashing campaign by our public land management agencies.
Race Report for the 2022 Behind the Rocks Ultra 50k in Moab, Utah. I finished 8th in 4:55.
Instructions for a DIY mountain bike bear spray holder
Race report for the 2021 Mogollon Monster 100 mile
A wrapper for loading Google Maps JavaScript in React
A solo adventure running 36 miles from Molas Lake to Vallecito Reservoir in the Weminuche Wilderness
Archiving emails older than 30 days automatically.
Instructions for adding a WMS Layer to Google Maps
Using Lua to log requests to BigQuery.