Automating Technical Blog Localization with Gemini CLI Agent Skills

Reading Time: 12 minutesThe Use Case: Scaling Content to Global Tech Communities When content writers write English blog posts, they often want to distribute them to different tech communities to share knowledge, increase impact, and reach. However, many readers in these communities do not read, write, or speak English. When the blog post is posted in these localized, … Read more

Building a Digital Docent: Master Agentic Vision with Gemini 3

Reading Time: 10 minutesThe Pain Point: The Invisible World of the “Granular” Masterpiece When a postcard miniaturizes a traditional Chinese painting, the reduced scale obscures details. Consider a standard postcard depicting workers and horses pulling wagons in a crowded street during the Qing dynasty. Adults and children walk on a busy bridge while shops on both sides sell … Read more

How to Refactor a Complex Blog Review Prompt into Reusable AI Agents

Reading Time: 14 minutesTechnical writers and ESL professionals often rely on complex prompts to polish our work. However, as prompts grow into monolithic walls of text, they become brittle, hard to debug, and expensive to run. Modularity addresses this challenge. In this post, I transition from a single Custom Command to a modular, portable Gemini CLI extension implemented … Read more

Fetching Live Sports Data with Gemini 3: A Guide to Grounded, Structured JSON

Reading Time: 13 minutesRetrieving accurate, up-to-date sports statistics with LLMs is notoriously difficult due to hallucinations and outdated training data. In this post, I will explore retrieving the Premier League 2025/2026 Player statistics using the Gemini 3 Flash Preview model, URL Context, Grounding with Google Search, and structured output. I will describe lessons learned and how I extracted … Read more

Building an AI-Powered Alt Text Generator with Angular, Firebase AI Logic, and Gemini 3

Reading Time: 5 minutesIn this project, I stepped out of my comfort zone to upgrade from Gemini 2.5 to Gemini 3 in Vertex AI. The goal was to build an intelligent Image Alt Text Generator that goes beyond simple description and hashtags. By leveraging Gemini 3.0 (Pro Preview), this application analyzes an image to generate alternate text, hashtags, … Read more

Day 29 – Add a Loader and Error State

Reading Time: 5 minutesOn day 29, I add a loader (A 

Loading …
) to show that the page is loading the data. It is incredibly easy in Angular 20 because it is a built-in functionality in httpResource. In Vue 3, I installed vueuse and applied the useFetch composable to initiate the network requests. In SvelteKit, a loader can be implemented with the navigating object in $app/state. It … Read more

Day 28 – Retrieve the Post Author

Reading Time: 4 minutesOn day 28, I use the userId of a post to call the users endpoint to retrieve the user name. In Vue 3, I created another composable to return a user Object with a name property. In Angular 20, it is a User service that uses the experimental httpResource to retrieve a user when the post is updated. In SvelteKit, I … Read more

Day 27 – Create a simple blog page

Reading Time: 5 minutesOn day 27, I completed Vue 3 Composition API course to build a simple blog to show blog posts. The site calls https://jsonplaceholder.typicode.com/posts to retrieve all the posts and display the users. The blog posts are built in 3 parts: Install Tailwindcss Refer to https://tailwindcss.com/docs/installation/framework-guides to install TailwindCSS for Vue 3, Svelte 5 and Angular. Copy Vue boilerplates Copy the boilerplates … Read more

Day 25 – Alert Component Part 4 – Update the Alert Bar to reopen closed alerts

Reading Time: 5 minutesComponent Fundamentals with JavaScript Frameworks On day 25, I extend the Alert Bar component to display buttons of closed alerts. Then, users can either reopen all the closed alerts or a specific type of alert. Track Closed Alerts Vue 3 application In the AlertBar component, use the defineModel to create a closedNotifications ref of type string[]. The default value of the closedNotifications is an … Read more