Writings

The Journal

❦

Thoughts on programming, technology, and lessons learned along the way.

AI Solves the Problem You Describe, Not the One You Have

Your AI built exactly what you asked for. Here's how to give it context that's objective, complete and concise so it solves the real problem.

AISoftware EngineeringNon-technical
Continue Reading
AI Solves the Problem You Describe, Not the One You Have

Five Small Claude Code Mods That Changed How I Work With AI Agents

Popup and voice alerts, a one-click prompt enhancer, a detail slider, an assumptions tracker, and a context window bar: five small Claude Code mods, each a single row above the prompt box, that keep the human in the loop at the right moments.

AIClaude CodeSoftware EngineeringTechnical
Continue Reading
Five Small Claude Code Mods That Changed How I Work With AI Agents

Artificial Latency, AI Agents, and the UX We Keep Forgetting

Faster isn't always better: artificial latency and meaningful loaders can build user confidence, and a dedicated UX agent can catch what AI-generated interfaces miss. Building software is getting cheaper — making it worth using is still hard.

AIUXFrontendNon-technical
Continue Reading
Artificial Latency, AI Agents, and the UX We Keep Forgetting

Why You Should Keep Documentation Minimal When Working with Coding Agents

Coding agents can ship code changes while leaving stale docs that mislead the next session. Keep behavior in names, types, and tests; reserve prose for non-inferable constraints; keep docs minimal and close to code; and remind agents to finish documentation updates with the change.

AISoftware EngineeringNon-technical
Continue Reading
Why You Should Keep Documentation Minimal When Working with Coding Agents

Keeping Frontend and Backend Types in Sync with Typescript Magic

Keep hand-written frontend interfaces and pin them to backend service methods with compile-time type assertions — about sixty lines of TypeScript magic that turns silent API drift into a red build, adoptable one endpoint at a time.

TypeScriptFrontendBackendSoftware EngineeringTechnical
Continue Reading
Keeping Frontend and Backend Types in Sync with Typescript Magic

A Practical Approch in Maintaining and Reducing Tech Debt for Enterprise JavaScript/TypeScript Applications

A practical pipeline for reducing tech debt in enterprise JS/TS codebases: Knip for mechanical detection, TypeScript LSP for function-level analysis, CI automation with grace periods, and scoped LLM audits for architectural dead code — with detection and judgment kept separate.

TypeScriptJavascriptSoftware EngineeringAITechnical
Continue Reading
A Practical Approch in Maintaining and Reducing Tech Debt for Enterprise JavaScript/TypeScript Applications

You Can Animate Page Navigation

Page navigation in React SPAs doesn't have to be an instant hard cut. The View Transitions API lets the browser animate between route snapshots with a few lines of CSS — no animation library required.

FrontendReactWebTechnical
Continue Reading
You Can Animate Page Navigation

Create an Unused Function Detection Script Using the TypeScript Compiler and LSP API

An ~80-line script that finds unused TypeScript function candidates using the compiler AST and getReferencesAtPosition from the Language Service API — the same engine behind Find All References in your editor.

TypeScriptFrontendSoftware EngineeringTechnical
Continue Reading
Create an Unused Function Detection Script Using the TypeScript Compiler and LSP API

Explore Chrome Incognito Mode from a storage & cookie & caching perspective

Incognito mode is session isolation, not zero caching. A test suite across 11 scenarios reveals how Chrome shares cookies, storage, and HTTP cache within incognito sessions — and clears them when the last window closes.

ChromeWebFrontendTechnical
Continue Reading
Explore Chrome Incognito Mode from a storage & cookie & caching perspective

Using GitHub Copilot CLI in GitHub Actions CI

How to run GitHub Copilot CLI inside GitHub Actions for AI-powered CI checks — security review, requirements validation, and documentation checks — plus the pros, cons, and a recommended three-layer architecture.

AIDevOpsSoftware EngineeringTechnical
Continue Reading
Using GitHub Copilot CLI in GitHub Actions CI

Turn Your iPhone into a Remote Terminal for Your Mac — Completely Free and Open Source

SSH into your MacBook from your iPhone anywhere in the world using a-Shell, Tailscale, and tmux — a completely free, open-source setup that keeps terminal sessions alive across disconnects.

iOSMacProductivityTechnical
Continue Reading
Turn Your iPhone into a Remote Terminal for Your Mac — Completely Free and Open Source

Network Request Override with Chrome DevTools

Chrome DevTools' Override Content and Override Headers let you intercept network requests and replace responses locally — a game changer for frontend development, especially on large projects where backend changes are slow or impossible.

FrontendWebTechnical
Continue Reading
Network Request Override with Chrome DevTools

Flutter App Store Publishing: Common Pitfalls (Part 1)

After publishing 100+ Flutter apps, these are the App Store rejection reasons I see most often — missing Info.plist permissions, alpha-channel icons, in-app account deletion, XML escaping, debug banners in screenshots, and mandatory login issues.

FlutterMobileApp StoreTechnical
Continue Reading
Flutter App Store Publishing: Common Pitfalls (Part 1)

Understanding Side-Effect Imports in JavaScript

Side-effect imports run a module's top-level code without binding any exports — useful for polyfills, analytics, and startup configuration, but they hide behavior and introduce ordering concerns. This post explains the pattern with examples and when to use it carefully.

JavascriptSoftware EngineeringFrontendTechnical
Continue Reading
Understanding Side-Effect Imports in JavaScript

Using the BroadcastChannel API for Cross-Tab Communication

The BroadcastChannel API lets browser tabs, windows, iframes, and workers on the same origin exchange messages without a server. This post covers common use cases, a logout synchronization example, and how it compares to localStorage events, Shared Workers, and Service Workers.

WebJavascriptFrontendTechnical
Continue Reading
Using the BroadcastChannel API for Cross-Tab Communication

Common Problems with Vibe Coding (and How to Avoid Them)

Seven common problems with AI-assisted 'vibe coding' — from duplicated code and security gaps to generic frontends and missing context — with practical workflow solutions for each. These aren't fundamental AI limitations; they're fixable with the right habits.

AISoftware EngineeringProductivityNon-technical
Continue Reading
Common Problems with Vibe Coding (and How to Avoid Them)

Hopcroft's Algorithm: Efficient DFA Minimization

A walkthrough of Hopcroft's Algorithm for DFA minimization — partition refinement, a step-by-step six-state example, full Python implementation, and O(n·s·log n) complexity analysis. A final project for UVA's Advanced Data Structures and Algorithms class.

AlgorithmsComputer ScienceTechnical
Continue Reading
Hopcroft's Algorithm: Efficient DFA Minimization

Reflections from PyCon US 2026

Reflections from my first PyCon US — volunteering at the registration desk, GPU tiling with NVIDIA, AI economics, Python's generational garbage collector, Pablo Galindo's 'cathedral' keynote on open source, and the 'Silence is Gold' lightning talk. PyCon reminded me that Python is much bigger than a programming language — it's a community.

PyConPythonCommunityNon-technical
Continue Reading
Reflections from PyCon US 2026

Why Monorepos Make AI Coding Tools Way Smarter

Monorepos significantly enhance AI coding tools by providing full context across frontend, backend, and shared code. This article explains how unified codebases enable better AI suggestions, fewer errors, and more effective pair programming with AI assistants.

Software EngineeringAINon-technical
Continue Reading
Why Monorepos Make AI Coding Tools Way Smarter

Things that literally doubled my productivity as a programmer

Discover practical productivity tips and tools that can significantly boost your programming efficiency, from keyboard shortcuts to automation techniques.

Must-ReadProductivityNon-technical
Continue Reading
Things that literally doubled my productivity as a programmer

Xcode might be eating up your hard drive space!

Xcode's DerivedData folder can consume massive disk space on Mac. This article explains how to find and safely delete it to reclaim storage, with a real-life example of freeing up 276 GB.

XcodeMobileTechnical
Continue Reading
Xcode might be eating up your hard drive space!

How I learned git rebasing — a real life work scenario

A real-life scenario demonstrates how git rebase can help separate feature work from dependent changes. The article explains a branching situation, the problem with merging, and how 'git rebase --onto main A' solves it, highlighting the value of practical experience.

GitTechnical
Continue Reading
How I learned git rebasing — a real life work scenario

Canonical URL sharing on mobile browsers and a workaround for static sites

Mobile browsers often share canonical URLs, which can strip important context from links. This article explains why, the impact on users, and a workaround for static sites to preserve full URLs when sharing.

WebJavascriptFrontendTechnical
Continue Reading
Canonical URL sharing on mobile browsers and a workaround for static sites

Write clean Flutter code with extension methods

Learn how to write clean Flutter code using Dart extension methods. This article explains how to add new methods to existing classes, provides practical examples like date-only extraction and string capitalization, and encourages creating your own extensions for cleaner, more maintainable code.

FlutterDartTechnical
Continue Reading
Write clean Flutter code with extension methods

How to learn programming in 2024

Learning programming in 2024 is easier than ever thanks to abundant resources, but it's also easy to get overwhelmed. Focus on mastering core concepts, building real projects, and following your interests to stay motivated. Avoid "tutorial hell" by applying what you learn and tracking your progress.

Non-technicalLearning-to-program
Continue Reading
How to learn programming in 2024