[{"content":"I run a personal static blog built with Hugo, deploying through an automated GitHub Actions pipeline. The text publishing part is frictionless. Writing in Obsidian, pushing to the repository, and triggering the build is a solved problem. The visual part was the annoyance. Every time I needed a header image, I would ask an AI generator, and it always spat out a hyper-polished, mathematically perfect render. It looked like cheap stock photography.\nI look at abstract art like Joan Miró and Cy Twombly often. What makes a doodle work is the physical traces. I wanted blog illustrations that looked like someone drew them quickly on scrap paper. I needed wobbly lines, colors bleeding outside the edges, and rough textures.\nI engineered a specific set of rules to force the AI out of its default plastic aesthetic. The linework had to be wobbly, shaky, loose, and of slightly varied weight, mimicking a real felt-tip pen drawn in a single breath. For colors, I specified a \u0026ldquo;Lazy Offset\u0026rdquo; style where the color fill does not align with the line boundaries, recreating a misregistered screen-print error. The palette was restricted entirely to desaturated Morandi tones like dusty blue, sage green, cocoa brown, and aged creams, banning primary colors.\nI initially tried packaging these rules into a dedicated Gemini Gem. That approach failed my friction test. Using a custom Gem means you have to start a completely new chat context. If I was already in a standard Gemini window brainstorming, drafting, or polishing a post, I would have to copy the final text, open the Gem, paste it, and run it. That breaks the flow. I wanted everything in one continuous conversation.\nThe solution was dropping the Gem and moving the logic to my Google Drive. I saved the entire design spec and generation prompt templates into a plain document named skill-blog-visual and dumped it in Drive.\nNow, the workflow actually makes sense. I write and edit the blog post inside a standard Gemini chat. When the text is finalized, I do not switch windows. I just type a command in the same chat telling it to retrieve the skill-blog-visual document from Drive and generate the art. It seamlessly pulls the design constraints, reads the article from our immediate chat history, and calls the image generation tool on the spot.\nIt spits out a 16:9 banner with the title embedded into the negative space, plus a couple of 1:1 spot illustrations. I download the banner, drop it into my Obsidian vault inside the specific post\u0026rsquo;s folder, and rename it to banner.jpg. The markdown links are simple. I hit one button to commit and push to GitHub. The GitHub Actions pipeline picks it up, Hugo rebuilds the site, and the post goes live with art that actually looks like human hands made it.\n","permalink":"https://robertluwang.github.io/life/posts/2026-08-26-blogging-visual-design/","summary":"\u003cp\u003eI run a personal static blog built with Hugo, deploying through an automated GitHub Actions pipeline. The text publishing part is frictionless. Writing in Obsidian, pushing to the repository, and triggering the build is a solved problem. The visual part was the annoyance. Every time I needed a header image, I would ask an AI generator, and it always spat out a hyper-polished, mathematically perfect render. It looked like cheap stock photography.\u003c/p\u003e","title":"blogging visual design"},{"content":"It happened on a Friday night, which is exactly when plumbing problems always decide to strike. The shower handle had been stiff for days, feeling like turning a rusty steering wheel. Then, right as I was trying to turn it off, something inside gave way. The water kept running. Not a drip, but a steady stream. A weekend emergency call to a plumber was going to cost a fortune. I pulled out my phone and opened Gemini, figuring I had nothing to lose by asking an artificial intelligence how to shut off a broken Moen shower. That kicked off a weekend of guided hardware debugging.\nThe entire repair process, from diagnosing the leak to tightening the final screw, was directed by Gemini from start to finish. I described the symptoms. It told me I was dealing with a failed Moen 1222 Posi-Temp cartridge inside the wall. The first step was getting the handle off, but the tiny hex set screw at the bottom of the heavy metal teardrop handle was completely stripped. A standard Allen key just spun uselessly. I took a photo of the stripped hole and uploaded it. Gemini suggested finding a slightly larger star shaped Torx bit and hammering it gently into the soft metal to get enough mechanical bite. I dug through my toolbox, found a T15 bit, forced it in, and the screw finally cracked loose.\nTaking off the heavy chrome escutcheon plate was straightforward. That exposed the rough brass valve body set deep in the drywall. A small U shaped copper retaining clip held the pressurized system together. Gemini warned me to pull it straight up with needle nose pliers and set it far away from the drain. Dropping that piece behind the wall cavity means driving to the hardware store before you can turn the water back on.\nWith the clip gone, the cartridge was supposed to slide out. It did not budge. Calcification had cemented the plastic cartridge body to the inside of the brass pipe. I typed my frustration into the chat. The advice was clear: do not force it, do not pull on the brass stem with pliers, or the plastic sleeve will shatter inside the wall. Gemini told me to buy a dedicated cartridge puller. I found one at the local hardware store the next morning. It is a heavy steel tool that threads directly into the center brass stem of the old cartridge. You engage the two metal side tabs into the brass valve body, then slowly turn a massive hex nut clockwise with a large adjustable wrench. The mechanical advantage pushes against the pipe and pulls the stubborn cartridge straight out. When it popped free, the problem was obvious. The two large black oval rubber O-rings on the sides were shredded and unseated.\nMoen provides a lifetime warranty on these parts. I drove to RONA with the ruined cartridge in a ziplock bag. I handed it to the person at the plumbing desk, and they handed me a brand new Moen 1222 cartridge in return. Free of charge.\nInstalling the new replacement requires specific steps. Gemini reminded me to lubricate the new rubber O-rings, otherwise they would simply tear again when forced into the tight brass pipe. I used a small silicone grease packet to coat the black oval seals thoroughly. I slipped the white plastic installation tool over the stem, using an adjustable wrench to push the cartridge flush into the wall while keeping it perfectly straight. The instruction from my AI guide was strict: make sure the \u0026ldquo;HC\u0026rdquo; marking on the front plastic face is pointing straight up at 12 o\u0026rsquo;clock.\nI slipped the retaining clip back into its top slot, went down to the basement, turned the main water shutoff valve back on, and checked the brass fitting for leaks. It was completely dry.\nThere was one final hardware glitch. I put the black plastic adapter, the white limit stop gear, and the heavy metal handle back on. The hot and cold lines were reversed, and the handle pointed straight up when the water was off. Worse, when I turned it to the side, the heavy handle just fell down under its own weight. I went back to Gemini with a photo and a description of the symptoms.\nThe diagnosis came back immediately. If the \u0026ldquo;HC\u0026rdquo; is facing up but the water is reversed, I had accidentally rotated the brass stem 180 degrees during the installation. The fix is to pull the handle off, grip the bare brass stem with pliers, and rotate it exactly 180 degrees so the flat spot faces up again. As for the falling handle, Gemini explained it was a classic case of \u0026ldquo;Ghost Handle.\u0026rdquo; The fresh factory silicone grease inside the new cartridge provides zero friction, so the heavy metal teardrop handle just falls under gravity. The advice was to do absolutely nothing. After a few days of regular showers, the hot water would melt away the excess grease and the friction would return to normal.\nI rotated the brass stem. The handle pointed down for off, and turned left for cold and then hot water. The ghost handle issue resolved itself a few days later, exactly as predicted. It was a strange but satisfying weekend. I fixed a piece of physical household infrastructure using real tools, while a large language model sat on the bathroom counter walking me through every stripped screw and reversed valve. It felt like a very quiet, very perfect slice of daily life in the AI era.\n","permalink":"https://robertluwang.github.io/life/posts/2026-08-26-hardcore-diy-friday-ai-and-my-plumbing-repair/","summary":"\u003cp\u003eIt happened on a Friday night, which is exactly when plumbing problems always decide to strike. The shower handle had been stiff for days, feeling like turning a rusty steering wheel. Then, right as I was trying to turn it off, something inside gave way. The water kept running. Not a drip, but a steady stream. A weekend emergency call to a plumber was going to cost a fortune. I pulled out my phone and opened Gemini, figuring I had nothing to lose by asking an artificial intelligence how to shut off a broken Moen shower. That kicked off a weekend of guided hardware debugging.\u003c/p\u003e","title":"Hardcore DIY Friday: AI and My Plumbing Repair"},{"content":"Life is beautiful, let\u0026rsquo;s hugo!\n","permalink":"https://robertluwang.github.io/life/posts/2026-08-25-first-post/","summary":"\u003cp\u003eLife is beautiful, let\u0026rsquo;s hugo!\u003c/p\u003e","title":"My First Post"}]