Articles
Long-form, practical writing on AI engineering, React and JavaScript — hosted right here.
Using a Teleprompter for TikTok: Where Scripted Videos Actually Lose People
TikTok punishes polish differently from Reels or Shorts. How to script for it, which teleprompter mode fits, and the videos where you should not use one at all.
Object.groupBy and Map.groupBy: Grouping Arrays Without reduce()
ES2024 gave JavaScript native array grouping. How Object.groupBy and Map.groupBy work, the null-prototype and key-coercion details, and when reduce is still the right call.
Using a Teleprompter for YouTube Shorts: What Actually Changes from Reels
Shorts and Reels look identical and reward different scripts. How to write, set up and record a Shorts script with a teleprompter — including when not to use one.
Five Small ES2026 APIs That Delete Utility Code You Have Been Writing for Years
Error.isError, Map.getOrInsert, Uint8Array base64 and hex, Math.sumPrecise and Iterator.concat — the unglamorous half of ES2026, and the helper functions each one retires.
Using a Teleprompter for Instagram Reels (Without Looking Like You Are Reading One)
How to script, position and record Instagram Reels with a teleprompter app — the vertical crop problem, the nine-second hook, and when a prompter makes Reels worse.
Deep Copying in JavaScript: structuredClone, JSON Round-Tripping, and What Each One Quietly Breaks
structuredClone is in every modern browser and Node 17+. Here is exactly what it copies, what it throws on, and why JSON.parse(JSON.stringify(x)) silently corrupts data.
Voice-Follow vs Auto-Scroll: Which Teleprompter Mode to Use When
Voice-driven scrolling and classic auto-scroll solve different problems. A practical comparison of when each one wins, when each one fails, and how to choose per video.
TC39 Type Annotations: What 'Types as Comments' Actually Proposes, and Where It Stands
The proposal to put type syntax in JavaScript is still Stage 1 — while Node quietly shipped type stripping anyway. What is in scope, what is not, and what to do today.
How to Write a Video Script That Doesn't Sound Written
The reason scripted videos sound stiff is not the teleprompter — it's the sentences. Eight rewriting habits that make a written script sound like you talking.
Importing JSON in Node.js: require, Import Attributes, and TypeScript
How to import JSON in Node.js in 2026 - require vs import attributes vs fs.readFile, why `with { type: 'json' }` is mandatory, and how to make TypeScript agree with you.
9 Benefits of Using a Teleprompter App (And When You Should Not Use One)
What actually changes when you read from a teleprompter: fewer takes, real eye contact, tighter scripts and less on-camera anxiety — plus the situations where a teleprompter makes your video worse.
WhatsApp Link Generator: Create a wa.me Click-to-Chat Link, QR Code and a Profile Picture That Does Not Crop
How wa.me links work, how to add a pre-filled message, common number-format mistakes, how to print a WhatsApp QR code for a menu or business card, and how to set a full-size profile picture without cropping.
How to Export a WhatsApp Chat to PDF on iPhone (Printable, With Statistics)
WhatsApp only exports a chat as a .txt inside a .zip. This guide shows where the Export Chat option is, what you get, and how to turn it into a clean, paginated PDF with message bubbles and statistics, without uploading the conversation.
How to Transcribe WhatsApp Voice Messages to Text on iPhone (Any Language, Offline)
WhatsApp’s own voice-to-text is missing for many countries and languages and never covers saved files. Here is a two-tap way to transcribe any voice note on the iPhone itself, with nothing uploaded.
How to Convert a WhatsApp Voice Note to MP3 on iPhone (Offline, No Upload)
WhatsApp voice messages are .opus files that most players cannot open. Here is how to get the file out of WhatsApp and convert it to MP3 or WAV on the iPhone itself, without uploading it to a website.
Work With Me: AI Engineering, MCP Architecture, AI Enablement and Training
I build MCP architectures, ship agentic AI in production, and train teams to actually use it. Here is exactly what I do, how engagements run, and how to hire me or book training.
import defer: Lazy Module Evaluation in JavaScript and TypeScript 5.9
How the TC39 import defer proposal delays module evaluation until first use — the semantics, what TypeScript 5.9 does with it, runtime support in Deno and Bun, and where it actually helps startup time.
Array.fromAsync: The Complete Guide to Collecting Async Iterables
A practical Array.fromAsync guide: how it works, how it differs from Promise.all and for await, mapping with async functions, pagination, and the gotchas.
JSON Modules and Import Attributes: Import JSON Without fetch or a Bundler
JSON modules are Baseline: import JSON directly with the ES2025 with { type: 'json' } syntax in every modern browser, Node 22+ and Deno — and when fetch still wins.
Array.fromAsync, Promise.try and RegExp.escape: Three ES2026 Features Worth Using Today
A practical guide to the most useful ES2026 additions — Array.fromAsync for collecting async iterables, Promise.try for unifying sync/async calls, and RegExp.escape for safe dynamic regexes.
React's use() Hook: Reading Promises and Context the New Way
React 19's use() reads promises and context right in render — even conditionally. How it works with Suspense and Server Components, plus the caching gotcha.
The Navigation API Is Baseline: A Practical Guide to Replacing History Hacks
The Navigation API now works in Chrome, Edge, Firefox and Safari. How navigation.navigate, intercept() and entries() replace History API hacks in real SPAs — with code.
AbortController in Practice: Cancel Fetch, Add Timeouts, and Auto-Clean Event Listeners
A practical guide to AbortController and AbortSignal — cancelling fetch requests, AbortSignal.timeout and AbortSignal.any, React useEffect cleanup, and one-line event listener removal.
React Server Components in 2026: A Practical Mental Model (Finally)
React Server Components are now the default for new projects — but the mental model still trips people up. What actually runs where, what 'use client' really marks, and where to draw the boundary.
JavaScript's using Keyword: Explicit Resource Management, Explained with Real Code
ES2026's using and await using declarations auto-dispose resources when a scope exits. How Symbol.dispose, DisposableStack and async disposal work in practice.
JavaScript Set Methods: union, intersection, difference and Friends, Explained
JavaScript finally has real set operations: union, intersection, difference, symmetricDifference and the subset checks. How each works, the set-like rules, and where they beat array tricks.
JavaScript Signals: A Practical Guide to the TC39 Proposal
What the TC39 Signals proposal actually gives you: Signal.State, Signal.Computed, and Watchers explained with runnable code, framework context, and honest caveats.
React ViewTransition and Activity: Smooth UI Transitions the React Way
A practical guide to React's ViewTransition component and the Activity API: animated navigation, shared element transitions, and state-preserving hidden UI — with code.
MCP Architecture Explained: Hosts, Clients, Servers, and the 2026 Spec
How the Model Context Protocol actually works — hosts, clients, servers, transports, and primitives — plus what the 2026 spec changes for anyone building MCPs.
Building MCPs: A Practical Guide to Your First MCP Server in TypeScript
Building MCPs demystified: what an MCP server actually is, how to write one in TypeScript with the official SDK, wire it into Claude, test it, and avoid the classic stdio mistakes.
React's Activity Component: Hide UI Without Losing State
A practical guide to React 19.2's Activity component: hide tabs, modals and routes without losing state, and pre-render the screens users visit next.
JavaScript using Declarations: Deterministic Cleanup Without try/finally Pyramids
Explicit Resource Management brings using and await using to JavaScript. How Symbol.dispose, Symbol.asyncDispose and DisposableStack replace nested try/finally - with real code.
Migrating from Create React App to Vite: A Practical 2026 Guide
Create React App is dead and Vite is the default. A step-by-step migration guide: index.html, env vars, proxies, Jest to Vitest, and the gotchas nobody mentions.
Popover API + CSS Anchor Positioning: Tooltips and Dropdowns Without a Library
Build accessible tooltips and dropdown menus with the native Popover API and CSS anchor positioning - no Floating UI required - and wire them into React 19.
React Compiler in Practice: Adopting Automatic Memoization Without Surprises
React Compiler auto-memoizes your components so you can delete most useMemo/useCallback calls. How it works, how to adopt it incrementally, and where it will not save you.
The Temporal API Is Finally Here: A Practical Guide to JavaScript's New Dates
Temporal is now shipping in Chrome and Firefox. A hands-on tour of PlainDate, ZonedDateTime, Instant and Duration — with the recipes you actually need day to day.
JavaScript Iterator Helpers: Lazy .map, .filter and .take Pipelines Without Intermediate Arrays
Iterator helpers are now Baseline in every browser. A hands-on guide to .map, .filter, .take and .toArray — lazy pipelines with no intermediate arrays.
React 19 Form Actions: useActionState, useFormStatus and useOptimistic Explained
How React 19's Actions replace the useState/loading/error boilerplate in forms — a practical walkthrough of useActionState, useFormStatus and useOptimistic with real code.
Looking for my posts on Medium, dev.to and elsewhere? See external writing.