What we are cooking in our lab..

How to see heart rate and power from a GPX file
GPX files from Garmin, Strava, Wahoo, Coros, Suunto and Apple Watch carry heart rate, cadence, power and temperature on every point. Most viewers ignore them. Here is how to see them, and what the numbers mean.

How to localize an iOS and Mac app in four languages in a day
String Catalogs generated from the compiler, the strings the compiler cannot see, screenshots per language, and localized App Store listings and screenshots uploaded from the command line.

How to open a GPX file on a Mac
Three ways to open a GPX file on a Mac, what you will see in each, and how to make one app the default for every .gpx file.

GPX Explore 1.5: the whole file, and the whole workout
Heart rate, power and cadence charted from your GPX, a real workout summary with moving time and splits, files that used to fail now open, and a way to share the map as a picture.

iRetroPhone 3: the 2008 app, done properly
Our App Store opening-day rotary dialer, rewritten in SwiftUI: a measured Western Electric dial, synthesized clicks, and nothing on the screen the 2008 version did not have.

iSeismometer 1.7: from a novelty app to a home seismic network
A complete rebuild for iPhone, iPad and Mac: a real gravity filter, an event detector, recordings you can open in NumPy, and a Mac that receives every phone in the house. Plus a new site, seismograph.com.

WorkoutGPX 1.5: export many workouts at once
Select several workouts, or everything under a filter, and share every GPX file in one go. The most-asked-for thing since 1.4.
Notification tap crashes with "Call must be made on main thread" (async UNUserNotificationCenterDelegate)
On iOS 26.6 every notification tap crashed because the async didReceive bridge calls UIKit's completion off the main thread. The fix is the completion-handler delegate methods, answered on the main thread.
OpenAI 400: "Function tools with reasoning_effort are not supported" in /v1/chat/completions
GPT-5.5 and GPT-5.6 reason at medium effort when a request sends no reasoning_effort, and Chat Completions rejects reasoning together with function tools. Send reasoning_effort "none" when you want tools without reasoning, or use /v1/responses when you want both.

Ollama "truncating input prompt": Why Long Prompts Lose Their Instructions
When a prompt is longer than the context window, Ollama keeps the first few tokens and the end and drops the middle, instruction included. Cap the input, put the instruction last, and set num_ctx or OLLAMA_CONTEXT_LENGTH.

Ollama think: false Not Working? Use reasoning_effort "none"
Ollama's OpenAI-compatible endpoint has no think field, so Gemma 4 and other thinking models keep thinking. Send reasoning_effort: "none" there, or think: false on the native /api/chat.

Reach Your Local Ollama from a Cloud Server with Tailscale (No CORS, No Open Port)
A server calling Ollama is not a browser, so OLLAMA_ORIGINS does not apply. Put the machine on a Tailscale tailnet, bind OLLAMA_HOST to its tailnet address, and point the server there.

MCP Server Returns 401 Unauthorized: Implementing OAuth in an MCP Client
What an MCP client does after a 401 from a remote MCP server: find the authorization server, register with RFC 7591, authorize with PKCE (S256) and the RFC 8707 resource parameter, exchange and refresh tokens. Python and httpx code from a working client.

One-Shotting an Apple Silicon Monitor with Claude Opus 4.7
A macOS TUI that shows E-cores, P-cores, GPU, and the Neural Engine — designed, built, published to PyPI, and shipped to Homebrew in a single Claude Code session. Here is the prompt and the result.

Introducing Catalyst: All Your AI in One Place
A multi-tenant AI platform with multi-provider models, Python execution, image generation, web search, and more — deployed at catalyst.voov.ai

Training Your Own ChatGPT on DGX Spark: Getting nanochat to Work with CUDA 13.0
How I adapted Andrej Karpathy's nanochat to run on NVIDIA DGX Spark with CUDA 13.0 - complete training results included

A Much Needed Update for GeoSquare
Major updates to GeoSquare including elevation profiles, GPX viewer, and GeoJSON tools for our 10k monthly users

Add Swap To Linux
How to add Swap to Linux

Building MCP PyExec: Python Execution Server with Docker, Authentication & HTTP Streaming
Complete guide to building a secure Python execution MCP server with Docker isolation, JWT authentication, session management, and HTTP streaming support

Migrating from Static JWT Secrets to JWKS in Supabase
How to upgrade your FastAPI authentication to use Supabase JWKS for better security and performance

MCP Inspector: the Session Token, DANGEROUSLY_OMIT_AUTH and a Local Server
Run MCP Inspector against a local FastMCP server over streamable HTTP, what the session token and DANGEROUSLY_OMIT_AUTH do, and what changed in Inspector 2.
Geo Tracker - Create GPX Files using GPS
Geo Tracker - Create GPX Files using GPS for iOS Devices
GPX Explore - Advanced GPX Viewer
GPXExplore – An Advanced GPX Viewer for iOS and macOS

Walks, Vibes, and Code: Vibe coding a GPX Viewer and iOS HealthKit Exporter using Claude Code
Vibe coding a GPX Viewer and iOS HealthKit Exporter using Claude Code