Resources
Practical guides from real project work.
No-fluff field guides on the things that actually come up in production — APIs and auth, FileMaker, Azure and .NET, architecture and security, and payments — so other developers and teams can skip the trial and error.
APIs & auth
Talking to other systems
API keys vs OAuth2
The two ways you'll authenticate to an API, when to use each, and how to handle them without leaving a hole.
Read the guide → APIsConsuming an API end to end
The five steps past your first 200: auth, pagination, retries, and turning their JSON into your own types.
Read the guide → APIsThe OAuth2 redirect dance
Why the authorization-code flow makes you register an app, set a redirect URI, and trade a code for tokens — and how to build it.
Read the guide → Microsoft 365An Outlook add-in that saves a whole email thread
Office.js only sees the open email. Saving the full conversation needs Microsoft Graph — SSO, On-Behalf-Of, and conversationId.
Read the guide →FileMaker
Extending and integrating FileMaker
Calling AI APIs from FileMaker
Invalid base64 and a malformed JSON body break almost every FileMaker → AI call. Both are one-line fixes — plus the full request-build pattern.
Read the guide → FileMaker / AIA document intelligence engine in FileMaker
Turn PDFs into structured fields with PDF.js + an AI model — with document types and providers as configuration, not code.
Read the guide → FileMaker / AINatural-language search over a product catalog
When staff don't know the exact term, keyword search fails. Add a semantic layer — the options (native, SQL+embeddings, managed) and how to choose.
Read the guide → inRiver / FileMakerInRiver ↔ FileMaker integration patterns
Wiring an inRiver PIM into a FileMaker app over the REST API — config, entity CRUD, parent/child linking, and idempotent error handling.
Read the guide → inRiver / FileMakerReading data back from inRiver
The reverse of a one-way push: pull fields from inRiver into FileMaker with query + fetchdata — and the AND-criteria gotcha that drops records.
Read the guide → FileMakerUsing JavaScript in the FileMaker Web Viewer
A step-by-step guide to running JavaScript in a Web Viewer and talking back to your FileMaker solution.
Read the guide → FileMakerIntegrating JSONata into FileMaker
Bring JSONata into FileMaker for clean, powerful JSON querying and transformation.
Read the guide →Azure & .NET
Shipping to production
Azure Key Vault with App Services
Load ASP.NET Core secrets from Key Vault with a managed identity — and the two RBAC traps that turn a five-minute setup into an afternoon of 500.30s.
Read the guide → Azure / DebuggingWhen PATCH returns 500 on Azure
Every verb works except PATCH, which 500s in production. The culprit is IIS's WebDAV module — here's the fast workaround and the proper fix.
Read the guide → SecurityWhy your site looks broken only in production
The CSS deployed but the page renders wrong — in prod only. A Content-Security-Policy is stripping your inline styles. The diagnosis trail and fix.
Read the guide → Azure / .NETServer-side PDF rendering with PuppeteerSharp
When the browser can't print your page (hi, Safari), render it with headless Chromium — plus the deploy gotcha and an auth token for gated pages.
Read the guide → Azure / DNSCustom domain on Azure App Service
Apex A record, the asuid TXT, the managed SNI cert — and the HTTP 400 nobody warns you about, where ASP.NET Core's AllowedHosts rejects the new hostname.
Read the guide →Git & version control
Version control, day to day
Setting up git for the first time
Install, set your name and email, and sort out the one thing that trips everyone — the access token or SSH key git wants the first time you push.
Read the guide → GitGit basics: the everyday workflow
The commit / push / pull loop, branches, and how pull requests and merging fit — built up from a simple model of where your code actually lives.
Read the guide → GitReading git history: log, diff & blame
The read-only commands that turn a repo into searchable documentation: what changed, when, and who changed each line — and how to trace it back.
Read the guide → GitUndoing mistakes: reset, revert & restore
Three different "undo" commands that do different things. Which to reach for, what each touches, and how to undo without losing work or breaking shared history.
Read the guide → Gitgit stash: parking work without committing
Pocket your half-done changes for a clean working directory, handle the urgent thing, then bring them back — plus apply vs pop and the gotchas.
Read the guide → GitResolving a merge conflict
Those <<<<<<< markers aren't a disaster — they're git asking you to choose. What they mean, how to fix one calmly, and how to bail out.
.gitignore for .NET
What a .NET repo should keep out of git (bin/, obj/, secrets) and the catch nobody mentions: untracking files you already committed with git rm --cached.
The phantom "300 files changed" diff
A repo that shows hundreds of bogus "modified" files across environments — it's CRLF vs LF, not your code — and the committed .gitattributes that fixes it.
Read the guide →Architecture & security
Building systems that hold up
Multi-tenancy with EF Core query filters
Isolate tenants by default, build a super-admin that spans them, and avoid the traps (seeded creds, reads-vs-writes scoping).
Read the guide → .NET / DataSafe record merging & coalesce
Re-point foreign keys, backfill blanks, delete the source — and the soft-delete query filter that quietly causes FK violations.
Read the guide → SecurityFixing common DAST findings in ASP.NET
Triage a scary scan report: the handful of finding types that dominate (GET query-string data, exception leakage) and how to clear them.
Read the guide →iOS & payments
Mobile & billing
Taking iOS payments outside Apple's IAP
Charge through Stripe instead of Apple's 15–30% cut: open Safari to Checkout, then deep-link back into the app. Architecture, rules, and the Swift wiring.
Read the guide → Stripe / PaymentsStripe payment links, promo codes & free trials
What you can and can't pre-bake into a link, free-trial-without-card sign-ups, how promo codes really apply, and the clean off switch.
Read the guide →