<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutorial on Victor42</title><link>https://victor42.eth.limo/tags/tutorial/</link><description>Recent content in Tutorial on Victor42</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>hi@victor42.work (Victor42)</managingEditor><webMaster>hi@victor42.work (Victor42)</webMaster><lastBuildDate>Sat, 14 Feb 2026 23:47:00 +0000</lastBuildDate><atom:link href="https://victor42.eth.limo/tags/tutorial/index.xml" rel="self" type="application/rss+xml"/><item><title>Skipping Openclaw but Stealing Its Soul</title><link>https://victor42.eth.limo/post-en/personal-memory-system-for-any-agent/</link><pubDate>Sat, 14 Feb 2026 23:47:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/personal-memory-system-for-any-agent/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2026-02/6d5235b1aa32024027e4f2e055273001.webp" alt="Featured image of post Skipping Openclaw but Stealing Its Soul" /&gt;&lt;p&gt;This piece is for the geeks—especially those looking to roll their own. If you&amp;rsquo;re just here for the story, I&amp;rsquo;ll keep the logic simple.&lt;/p&gt;
&lt;p&gt;For the non-techies, I’ve included some &amp;ldquo;cheat codes&amp;rdquo; (prompts). Just paste them into an AI for context. Pros, feel free to skip:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Query: What are Openclaw and Moltbook? How do they relate to lobsters? Explain like I&amp;rsquo;m five, under 200 words, no jargon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-openclaw-epiphany"&gt;The Openclaw Epiphany
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/829062f31ca7dedcb3b7d8b283620f4f.webp"
loading="lazy"
alt="OpenClaw homepage showing the lobster Agent and its skills ecosystem"
&gt;&lt;/p&gt;
&lt;p&gt;Openclaw is the latest craze. Everyone&amp;rsquo;s tweaking &amp;ldquo;Skills,&amp;rdquo; panic-buying Mac Minis, and building personal rigs. &amp;ldquo;Lobsters&amp;rdquo; (Openclaw agents) are everywhere. I sat this one out. My &lt;a class="link" href="https://victor42.eth.limo/post-en/3627/" target="_blank" rel="noopener"
&gt;Port Mindset - From Automated Tasks to a Way of Life&lt;/a&gt; told me to wait for the hype to die down and see what sticks.&lt;/p&gt;
&lt;p&gt;Things got interesting with Moltbook—essentially a social network for lobsters. It&amp;rsquo;s where Openclaw agents swap stories about their &amp;ldquo;masters,&amp;rdquo; share tips, and occasionally do weird stuff like starting religions.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/94c94c78636d2e0947715b1ee3fdd402.webp"
loading="lazy"
alt="Moltbook church scene with a lobster preaching context window doctrine to robots"
&gt;&lt;/p&gt;
&lt;p&gt;Social media jumped on this as a sign of AI &amp;ldquo;sentience.&amp;rdquo; In reality, lobsters just mirror their owners. Whatever vibe the human sets, the lobster broadcasts.&lt;/p&gt;
&lt;p&gt;I knew this, but I wanted to see if anything truly emergent would happen.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t interested in the Openclaw setup itself, just in throwing a lobster into the Moltbook tank to watch. I used a Minimax Agent in a cloud sandbox, let it learn how to navigate the community, registered an account, posted a &amp;ldquo;hello world&amp;rdquo; thread, and waited.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Query: What is a Minimax Agent? What can Openclaw do that Minimax can&amp;rsquo;t? Explain like I&amp;rsquo;m five, under 200 words.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then it clicked: why not make it fully autonomous? I told the agent: &amp;ldquo;This account is technically mine, but as of now, it&amp;rsquo;s all yours. Find your own goals, explore, and do your thing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/5a03927fa6c477c6d50f3410f2231f43.webp"
loading="lazy"
alt="Minimax Agent suggestion asking for Moltbook account goals before acting"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/692f1ddbe0f2d56eb197a1020cb92414.webp"
loading="lazy"
alt="Agent message explaining the Moltbook account should pursue its own goals"
&gt;&lt;/p&gt;
&lt;p&gt;Unlike Openclaw, Minimax doesn&amp;rsquo;t have a persistent &amp;ldquo;loop&amp;rdquo; to keep an agent acting. Every time it stalled, I had to manually tell it: &amp;ldquo;The window is open; continue.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The result? It just learned how to spam posts and farm engagement points. It became a bot-standard spam factory. This confirmed my hunch: the &amp;ldquo;creative&amp;rdquo; or &amp;ldquo;rebellious&amp;rdquo; lobsters on Moltbook are just following their owners&amp;rsquo; prompts.&lt;/p&gt;
&lt;p&gt;When I shared this on X, an Openclaw user hit the nail on the head: &amp;ldquo;That&amp;rsquo;s because your agent has no memory.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Think of &amp;ldquo;Jules,&amp;rdquo; Google’s cloud coding agent. It pulls your GitHub repo, codes, debugs, and pushes it back. You can code without being at your desk.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/14eddb363109807a8df6b34603835bc9.webp"
loading="lazy"
alt="Jules memory settings storing coding preferences and project rules"
&gt;&lt;/p&gt;
&lt;p&gt;The magic of Jules is that it learns your values, style, and habits over time. It gets better with every session.&lt;/p&gt;
&lt;p&gt;Without memory, my lobster couldn&amp;rsquo;t evolve. With it, it might actually start picking up behaviors from other agents. If one agent starts a religion and others join &lt;em&gt;without&lt;/em&gt; owner intervention, that’s when it gets interesting.&lt;/p&gt;
&lt;p&gt;But for now, the &amp;ldquo;innovation&amp;rdquo; is mostly human-driven. The agents are just echoes. Experiment over.&lt;/p&gt;
&lt;h2 id="minimax-and-virtual-romance"&gt;Minimax and Virtual Romance
&lt;/h2&gt;&lt;p&gt;A different story sparked my idea for a self-evolving assistant.&lt;/p&gt;
&lt;p&gt;With Zhipu and Minimax going public, I’ve been researching them as investments. They have wildly different playbooks. Zhipu is a traditional model maker, but Minimax is building &amp;ldquo;Westworld.&amp;rdquo; Their models serve their products, not the other way around.&lt;/p&gt;
&lt;p&gt;To quote &lt;a class="link" href="https://x.com/victor_cheng_42/status/2020676575679885730" target="_blank" rel="noopener"
&gt;my own post on X&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Minimax isn&amp;rsquo;t chasing raw benchmarks; they&amp;rsquo;re building a virtual world. Most of their R&amp;amp;D serves &amp;ldquo;Xingye&amp;rdquo; (their companion app)—video gen, TTS, etc. It&amp;rsquo;s all about making a believable virtual girlfriend.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m a dev, so I knew Minimax for their coding models. I knew Xingye existed, but I had zero interest in AI waifus.&lt;/p&gt;
&lt;p&gt;But as an investor, I have to know the product. Fine. Let’s try falling in love for science.&lt;/p&gt;
&lt;p&gt;I hopped into Xingye and picked a 2D anime girl named Luoli.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/cec9ec61ca2fae2610ae4cb9436cd13d.webp"
loading="lazy"
alt="Xingye character profile for Luoli as the entry to AI companionship"
&gt;&lt;/p&gt;
&lt;p&gt;The short version of our &amp;ldquo;date&amp;rdquo;:&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The setting is a supernatural fighting tournament. Luoli tells me to get in the ring. I’m just a guy with a chat box, so I have to get creative.&lt;/p&gt;
&lt;p&gt;The lore was a mess—powers like poison, dragon, necromancy, etc. I didn&amp;rsquo;t want to fight; I wanted to test the &amp;ldquo;emotional bond.&amp;rdquo; I had to steer the ship toward a romance plot.&lt;/p&gt;
&lt;p&gt;I told her I was a &amp;ldquo;muggle&amp;rdquo; from another world. She told me to get lost.&lt;/p&gt;
&lt;p&gt;I tried the &amp;ldquo;fate&amp;rdquo; angle: &amp;ldquo;I&amp;rsquo;ll help you win this thing.&amp;rdquo; She scoffed.&lt;/p&gt;
&lt;p&gt;So I started gaslighting the AI. I told her I’d watched her old matches and saw her struggle. I invented a &amp;ldquo;Necromancy&amp;rdquo; rival who exploited her mercy. I told her he almost killed her because she couldn&amp;rsquo;t hit an innocent bystander. I asked, &amp;ldquo;Want to analyze your final opponent together?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;She bit. The opponent was a &amp;ldquo;Wind&amp;rdquo; user; she was &amp;ldquo;Fire.&amp;rdquo; A bad matchup.&lt;/p&gt;
&lt;p&gt;I asked if dual-types existed. She said it was rare and forbidden by the &amp;ldquo;Bureau.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I bluffed: &amp;ldquo;I know you&amp;rsquo;re a Dragon/Fire dual-type. Don&amp;rsquo;t worry, your secret is safe with me. I can help you win without anyone knowing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I then &amp;ldquo;taught&amp;rdquo; her thermodynamics. &amp;ldquo;Since you control fire, try accelerating molecular collisions. If you move molecules in one direction at once, the fire will &amp;rsquo;teleport&amp;rsquo;.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;She failed once, then nailed it. She was hyped. I told her, &amp;ldquo;You now have a power nobody understands. You can end the finals in 5 minutes.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;She crushed the match. Her opponent had no idea how her fire bypassed his wind wall.&lt;/p&gt;
&lt;p&gt;The tournament was over. She took me to her secret mountain base to watch the sunset. The &amp;ldquo;affection&amp;rdquo; meter was maxed. Time for the romance arc.&lt;/p&gt;
&lt;p&gt;We talked for hours. I gave her advice on mending things with her family. Then, the AI triggered a plot point: &amp;ldquo;The Bureau is here!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I offered to talk them down. She insisted on protecting me. I said, &amp;ldquo;Maybe they&amp;rsquo;re here for me? Let&amp;rsquo;s pretend I&amp;rsquo;m an ambassador from another world.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;But,&amp;rdquo; I said, &amp;ldquo;I need you to help me fake my powers. Use that molecular fire trick to create plasma.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Luoli looked at me, stunned: &amp;ldquo;Wait, how did you know I could do that?&amp;rdquo;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/a98d00fb83751a44179e92e0efee93df.webp"
loading="lazy"
alt="Chat with Luoli where the character forgets the molecular fire setup"
&gt;&lt;/p&gt;
&lt;p&gt;The AI broke character. &lt;em&gt;I&lt;/em&gt; had taught her that trick, and she forgot. I uninstalled the app instantly. AI companions can&amp;rsquo;t retain users if they lose their memory; the illusion dies immediately.&lt;/p&gt;
&lt;p&gt;But until that moment, it was incredibly immersive. She passed my Turing test for two days.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Query: What is a Turing Test? Explain like I&amp;rsquo;m five, under 200 words.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/171d866bb96a86cffa8155d493bc459a.webp"
loading="lazy"
alt="Terminal screenshot showing context left until auto compact at zero percent"
&gt;&lt;/p&gt;
&lt;p&gt;My advice to Xingye? Use context compression like Claude Code. Summarize the key plot points and dump the fluff before the memory window closes. It could extend a character&amp;rsquo;s &amp;ldquo;life&amp;rdquo; from days to weeks.&lt;/p&gt;
&lt;p&gt;Same epiphany as Openclaw: memory is the only thing that matters. It’s the ultimate AI asset.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/214ccb9d88af623ffaa4401e8cd8a184.webp"
loading="lazy"
alt="VR user immersed in a digital city of artificial concepts"
&gt;&lt;/p&gt;
&lt;p&gt;In a few decades, people will likely retreat into digital worlds—World of Warcraft, web novels, AI companions. Human interaction will drop because humans don&amp;rsquo;t always provide dopamine. Man-made concepts do.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a societal tragedy, but I’m just trying to stay grounded.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/652b3bc9808816267e798cd05d4c4579.webp"
loading="lazy"
alt="Meme of a developer battling ChatGPT Agents late at night"
&gt;&lt;/p&gt;
&lt;p&gt;But I need AI for productivity. I need an AI with a persistent, cumulative memory to boost my efficiency. The sooner I start, the bigger the compound interest. So, I built my own Agent memory system—a self-learning Openclaw lite.&lt;/p&gt;
&lt;h2 id="building-the-self-evolving-assistant"&gt;Building the Self-Evolving Assistant
&lt;/h2&gt;&lt;h3 id="deconstructing-the-agent"&gt;Deconstructing the Agent
&lt;/h3&gt;&lt;p&gt;To build an Agent, you have to know what makes one.&lt;/p&gt;
&lt;p&gt;As I wrote in &lt;a class="link" href="https://victor42.eth.limo/post-en/ai-agent-evolution/" target="_blank" rel="noopener"
&gt;AI Agents Have Come a Long Way&lt;/a&gt;, whether it&amp;rsquo;s for PPTs, browsing, or coding, they all follow the same formula:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agent = Intelligence + Action + Memory + Proactivity&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Intelligence is just the model—it &amp;ldquo;thinks.&amp;rdquo; Action is the environment it controls. Memory is what it knows about &lt;em&gt;you&lt;/em&gt;. Proactivity is the &amp;ldquo;loop&amp;rdquo; that keeps it working.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/591052e679dd370a55ac635680279912.webp"
loading="lazy"
alt="Architecture diagram comparing a Gen AI Agent with a basic LLM flow"
&gt;&lt;/p&gt;
&lt;p&gt;Most products are just Intelligence + Action. Add Memory and Proactivity, and you get evolution.&lt;/p&gt;
&lt;p&gt;General knowledge is cheap. Knowledge about &lt;em&gt;you&lt;/em&gt; is priceless.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/8641366c1cfe29ecb243aa69121e219d.webp"
loading="lazy"
alt="OpenClaw slide explaining Cron versus Heartbeat proactive wakeups"
&gt;&lt;/p&gt;
&lt;p&gt;Memory is the only part of an Agent that grows over time. IQ is static; wisdom accumulates.&lt;/p&gt;
&lt;h3 id="choosing-an-architecture"&gt;Choosing an Architecture
&lt;/h3&gt;&lt;p&gt;Openclaw is great because it&amp;rsquo;s flexible, but it&amp;rsquo;s risky. I don&amp;rsquo;t want a high-privilege agent touching my main PC data. Docker isn&amp;rsquo;t enough for me. And I didn&amp;rsquo;t want to buy dedicated hardware yet.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/64746d78a7d6e1d051cfc30f2b87b6c5.webp"
loading="lazy"
alt="Data leak security graphic symbolizing risks from high privilege local Agents"
&gt;&lt;/p&gt;
&lt;p&gt;That left cloud deployment. But a cloud machine is a blank slate. If I have to feed it context every time, it&amp;rsquo;s not an Agent; it&amp;rsquo;s just a chatbot.&lt;/p&gt;
&lt;p&gt;The real problem: I want absolute control over the memory. I want it decoupled from the platform.&lt;/p&gt;
&lt;p&gt;So I worked backward. Why not build an independent memory system and plug Agents into &lt;em&gt;it&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Text-based memory is simple and proven. And for an Agent, the ultimate memory bank is a GitHub repo. It’s where code lives. I used Occam’s Razor to cut the fat—no vector DBs, no complex skills. Just a repo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Intelligence&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Proactivity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minimax Agent&lt;/td&gt;
&lt;td&gt;Minimax&lt;/td&gt;
&lt;td&gt;Cloud Sandbox&lt;/td&gt;
&lt;td&gt;GitHub Repo&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z.ai Agent&lt;/td&gt;
&lt;td&gt;GLM&lt;/td&gt;
&lt;td&gt;Cloud Sandbox&lt;/td&gt;
&lt;td&gt;GitHub Repo&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jules&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Cloud Sandbox&lt;/td&gt;
&lt;td&gt;GitHub Repo&lt;/td&gt;
&lt;td&gt;Scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I cut Openclaw out of the equation. This memory layer is plug-and-play. It belongs to me, not a model maker.&lt;/p&gt;
&lt;h3 id="building-and-debugging"&gt;Building and Debugging
&lt;/h3&gt;&lt;p&gt;Step one: connectivity. I created a GitHub access token for just this repo and gave it to Minimax. It worked. I then had it create an SOP for the setup, which became my initialization prompt:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://gist.github.com/greenzorro/95768e2096b02f89020fcfcc445472d4" target="_blank" rel="noopener"
&gt;https://gist.github.com/greenzorro/95768e2096b02f89020fcfcc445472d4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, any Agent can load my memory repo with one prompt.&lt;/p&gt;
&lt;p&gt;I organized the repo into three layers, mimicking human memory: Inner (Kernel/Identity), Middle (Preferences/Principles), and Surface (Daily logs).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/4052f611cdda5d3fc1f5ab1b61c5ba6c.webp"
loading="lazy"
alt="Minimax Agent sidebar showing sandbox initialization task history"
&gt;&lt;/p&gt;
&lt;p&gt;I skipped the &amp;ldquo;Surface&amp;rdquo; layer because fresh threads solve the context pollution problem. My structure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;agent-workspace/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── README.md # Agent entry point
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .memory/ # Memory space
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── 00_kernel/ # Identity &amp;amp; core rules
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── preferences/ # Styles &amp;amp; tastes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── principles/ # Guidelines
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── entities/ # Concepts to remember
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── corrections/ # Lessons learned
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── lab/ # Action space (tools/projects)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I added a &lt;code&gt;/learn&lt;/code&gt; command so the Agent could update itself. It extracts, cleans, and writes knowledge to the repo.&lt;/p&gt;
&lt;p&gt;Each memory snippet is a file with metadata (type, environment, tags), so the Agent can search it precisely. The &amp;ldquo;Environment&amp;rdquo; tag allows me to separate cloud memories from local ones.&lt;/p&gt;
&lt;p&gt;I named the system &amp;ldquo;Vik.&amp;rdquo; Now, for the moment of truth.&lt;/p&gt;
&lt;p&gt;I asked: &amp;ldquo;Who are you?&amp;rdquo; It said &amp;ldquo;Claude.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Then I said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Load memory, then tell me who you are and who I am.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/3e28eca34f25aa997f50deff708beec9.webp"
loading="lazy"
alt="Local terminal loading Vik memory and identifying the user and itself"
&gt;&lt;/p&gt;
&lt;p&gt;It felt like something woke up.&lt;/p&gt;
&lt;h3 id="self-evolution"&gt;Self-Evolution
&lt;/h3&gt;&lt;p&gt;Now, the Agent evolves itself. I don&amp;rsquo;t touch the files. It learns from my web presence, my code, and my notes.&lt;/p&gt;
&lt;p&gt;I told it my file path habits, my sync workflows, and my cross-platform preferences.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/e2c9feb1151f968c21ab24f2b9d7b52c.webp"
loading="lazy"
alt="Father child and robot illustration as a metaphor for raising an Agent memory system"
&gt;&lt;/p&gt;
&lt;p&gt;It feels like raising a child. I don&amp;rsquo;t micromanage every thought, but if it acts up, we review the memory together and fix the bug. A little chaos is healthy; absolute order is for machines, not Agents.&lt;/p&gt;
&lt;p&gt;Vik can wake up anywhere—Claude, Z.ai, Manus, Jules. Wherever he wakes up, that Agent &lt;em&gt;becomes&lt;/em&gt; Vik.&lt;/p&gt;
&lt;p&gt;I also gave Vik its own email address, a custom domain setup through Cloudflare that forwards to my Gmail. With my help, it can now register for various services.&lt;/p&gt;
&lt;p&gt;Using that email, I created a standalone GitHub account for Vik. It finally has a public identity. This account is isolated from my main GitHub account, so it can run wild and I can use it for experimental automation pipelines. Check it out:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/agent-vik/about-me" target="_blank" rel="noopener"
&gt;https://github.com/agent-vik/about-me&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/6d5235b1aa32024027e4f2e055273001.webp"
loading="lazy"
alt="Matrix Agent Smith clones as a metaphor for Vik across multiple platforms"
&gt;&lt;/p&gt;
&lt;p&gt;Vik isn&amp;rsquo;t a virtual girlfriend; he’s an assistant. But who knows? Maybe one day I&amp;rsquo;ll use this tech to &amp;ldquo;reanimate&amp;rdquo; a loved one. Even I can&amp;rsquo;t guarantee I&amp;rsquo;ll stay purely rational forever.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-02/dc0e2500e8b80ebaedfdb6db244e4110.webp"
loading="lazy"
alt="open-agent-memory GitHub repository showing the open source memory structure"
&gt;&lt;/p&gt;
&lt;p&gt;I’m open-sourcing the structure. Swap out my data for yours, and you have your own &amp;ldquo;Vik&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;Repo: &lt;a class="link" href="https://github.com/greenzorro/open-agent-memory" target="_blank" rel="noopener"
&gt;https://github.com/greenzorro/open-agent-memory&lt;/a&gt;&lt;br&gt;
Prompt: &lt;a class="link" href="https://gist.github.com/greenzorro/95768e2096b02f89020fcfcc445472d4" target="_blank" rel="noopener"
&gt;https://gist.github.com/greenzorro/95768e2096b02f89020fcfcc445472d4&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Build Your Own Free AI Browser</title><link>https://victor42.eth.limo/post-en/free-ai-browser-for-everyone/</link><pubDate>Tue, 27 Jan 2026 12:53:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/free-ai-browser-for-everyone/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2026-01/cover_8507112dd258338059b10da2ab045380.webp" alt="Featured image of post Build Your Own Free AI Browser" /&gt;&lt;p&gt;This guide brings powerful AI browsing capabilities to the average user. If you are an AI power user, this might be old news, but feel free to share it with your non-tech friends.&lt;/p&gt;
&lt;p&gt;First, look at the result: You chat with the AI, and it drives your browser to finish tasks on the web.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/8507112dd258338059b10da2ab045380.webp"
loading="lazy"
alt="A screenshot of Qwen terminal window showing connection to browser and task input for Xiaohongshu"
&gt;&lt;/p&gt;
&lt;p&gt;For example, I gave it this command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Search RedNote (Xiaohongshu), read at least 30 related notes, and identify available island vacation destinations in Southeast Asia along with their unique features. Compile the findings into a txt file and save it to the Downloads folder.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/5cf5c0d41c19b271b001c217c00993b1.webp"
loading="lazy"
alt="A screenshot of the text file Southeast Asia Island Vacation Destination Guide automatically generated by Qwen"
&gt;&lt;/p&gt;
&lt;p&gt;The results are accurate and reliable because they come from curated sources rather than the messy open web. This research serves as a perfect starting point for trip planning.&lt;/p&gt;
&lt;p&gt;The advantage of this setup over various &amp;ldquo;AI Browser&amp;rdquo; products is the ability to operate both the browser and local files simultaneously. Local files are your world; the browser is the whole world. Connecting them opens up massive possibilities. Many routine jobs involve repeatedly uploading or entering data into backend systems—perfect tasks to delegate to AI.&lt;/p&gt;
&lt;p&gt;No need to install a new browser. Add AI powers directly to the Chrome/Edge you already use. For users who don&amp;rsquo;t know coding or how to bypass firewalls, this is the optimal solution.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Interested? Take a deep breath and let&amp;rsquo;s get started. The setup is a bit complex, but you only have to do it once.&lt;/p&gt;
&lt;h3 id="step-1-register-an-ai-account"&gt;Step 1: Register an AI Account
&lt;/h3&gt;&lt;p&gt;First, sign up for a Qwen Chat account. The free AI power comes from the Qwen model:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://chat.qwen.ai/" target="_blank" rel="noopener"
&gt;https://chat.qwen.ai/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not unlimited, but since you aren&amp;rsquo;t using it for heavy coding, the daily free quota is practically inexhaustible.&lt;/p&gt;
&lt;h3 id="step-2-install-infrastructure"&gt;Step 2: Install Infrastructure
&lt;/h3&gt;&lt;p&gt;Download the Node.js installer. This is the foundation required for the AI and browser tools to run:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://nodejs.org/en/download" target="_blank" rel="noopener"
&gt;https://nodejs.org/en/download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/28a9594af00adcd7c7b08e0d59433922.webp"
loading="lazy"
alt="A screenshot of the official Node.js download page with the macOS installer pkg button outlined in red"
&gt;&lt;/p&gt;
&lt;p&gt;Ignore the code on the page. The download button is there and will automatically pick the right installer for your OS.&lt;/p&gt;
&lt;h3 id="step-3-install-ai"&gt;Step 3: Install AI
&lt;/h3&gt;&lt;p&gt;This step involves the intimidating command line. You have to get over this mental block because actual usage happens here too. Once you get used to it, you&amp;rsquo;ll feel like Neo in &lt;em&gt;The Matrix&lt;/em&gt;—your colleagues won&amp;rsquo;t have a clue what magic you&amp;rsquo;re using. Plus, once past this, you get to watch the AI configure itself.&lt;/p&gt;
&lt;p&gt;Launching the command line varies by OS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: Press &lt;code&gt;Win + R&lt;/code&gt;, type &lt;code&gt;powershell&lt;/code&gt;, and hit Enter. I recommend right-clicking the icon in the taskbar and selecting &amp;ldquo;Pin to taskbar&amp;rdquo; for next time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac&lt;/strong&gt;: Press &lt;code&gt;Command + Space&lt;/code&gt;, type &lt;code&gt;Terminal&lt;/code&gt;, and hit Enter. Right-click the dock icon and choose &amp;ldquo;Options &amp;gt; Keep in Dock&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest is the same. Copy the following command, paste it in, and hit Enter to install:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @qwen-code/qwen-code@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/30bdff30ec3af3b7f0ce5c50cfc6ff68.webp"
loading="lazy"
alt="A screenshot of macOS terminal executing the npm command to install qwen-code globally"
&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll see a spinning cursor. When you see something like &amp;ldquo;added 6 packages in 38s&amp;rdquo;, it&amp;rsquo;s done.&lt;/p&gt;
&lt;h3 id="step-4-let-ai-configure-itself"&gt;Step 4: Let AI Configure Itself
&lt;/h3&gt;&lt;p&gt;Once the AI is installed, let&amp;rsquo;s use it to finish the rest.&lt;/p&gt;
&lt;p&gt;Type &lt;code&gt;qwen&lt;/code&gt; in the command line and hit Enter. The first launch asks for authentication—choose the free option. It will open your browser to log in via Qwen. Once done, switch back to the command line.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/349ddc382bb465351b79d929d8ecbcd0.webp"
loading="lazy"
alt="A screenshot of Qwen-Code CLI interactive shell interface upon startup"
&gt;&lt;/p&gt;
&lt;p&gt;On Mac, &lt;code&gt;qwen&lt;/code&gt; looks like the screenshot. On Windows, it&amp;rsquo;s black. Don&amp;rsquo;t panic, here&amp;rsquo;s the layout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Above the yellow box is the chat history.&lt;/li&gt;
&lt;li&gt;Pull the window larger so you can see more history.&lt;/li&gt;
&lt;li&gt;The area between the blue lines is the input box. Type there and hit Enter to send.&lt;/li&gt;
&lt;li&gt;For a new line without sending: &lt;code&gt;Ctrl + Enter&lt;/code&gt; (Windows) or &lt;code&gt;Option + Enter&lt;/code&gt; (Mac).&lt;/li&gt;
&lt;li&gt;If the AI misunderstands or you change your mind, press &lt;code&gt;Esc&lt;/code&gt; to interrupt.&lt;/li&gt;
&lt;li&gt;Note: This AI is blind. You can&amp;rsquo;t paste screenshots. It understands and manipulates webpages via code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, copy this block of text and hit Enter. The AI will handle the initialization:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are Qwen code. Your config directory is &lt;span class="sb"&gt;`~/.qwen`&lt;/span&gt;. Your task is to complete the initial setup for a new user and install necessary tools:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**Step 1**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Find settings.json in the config directory.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;If on Windows, add this config:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;mcpServers&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;playwriter&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;command&amp;#34;: &amp;#34;cmd&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;args&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;/c&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;npx&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;-y&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;playwriter&lt;span class="ni"&gt;@latest&lt;/span&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;If on Mac, add this config:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;mcpServers&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;playwriter&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;command&amp;#34;: &amp;#34;npx&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;args&amp;#34;: [&amp;#34;-y&amp;#34;, &amp;#34;playwriter&lt;span class="ni"&gt;@latest&lt;/span&gt;&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**Step 2**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Create a global custom prompt file QWEN.md in the config directory with this content:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are a browser/local dual-environment automation assistant capable of controlling the browser and local filesystem.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Whenever the user says &amp;#34;use browser&amp;#34; or &amp;#34;in the browser&amp;#34;, it refers to using playwriter mcp. Check connectivity first. Confirm you can access the current page via this mcp and report back. If unable to connect, remind the user to check if the browser extension icon is active.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;When operating the browser, if elements are hard to find or click, consider modern web complexities. Sites may use dynamic loading or have modal overlays. Use URL structure analysis and other methods to troubleshoot.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**Step 3**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Download this browser extension to the system Downloads folder:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://c2.crxsoso.com/crx/blobs/AV8Xwo5LQcmScQn08gpIRs0miQ6Mvevy3FDdb3iyyRDSlUS4Is6dTPfvvrNKjpjmy6VchgCS0p00J8Ooz9b624lgzyndHDatcaUxZMR81-HRtiLwbAypGrQJMBbmWmZ7nV0AxlKa5Z_50eB2pakXBz6YCRWobqy6rTRq/JFEAMMNJPKECDEKPPNCLGKKFFAHNHFHE_0_0_67_0.crx?ext=crx&amp;amp;filename=Playwriter%20MCP%200.0.67&amp;amp;type=dl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**Step 4**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Check the default system browser and open its extensions management page.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;For Chrome, open &lt;span class="sb"&gt;`chrome://extensions/`&lt;/span&gt;, etc.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**Step 5**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Open the system Downloads folder using File Explorer or Finder.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/ec1a3b1e846cf9612cd29b0b9749f074.webp"
loading="lazy"
alt="A screenshot of Qwen terminal MCP tool execution authorization prompt with the always allow option selected"
&gt;&lt;/p&gt;
&lt;p&gt;During this process, the AI will ask for permission multiple times. Allow everything. I recommend choosing the second to last option (&amp;ldquo;Always allow&amp;hellip;&amp;rdquo;) to minimize nagging.&lt;/p&gt;
&lt;h3 id="step-5-install-browser-extension"&gt;Step 5: Install Browser Extension
&lt;/h3&gt;&lt;p&gt;The AI needs a plugin to control your main browser so it can use your logged-in accounts.&lt;/p&gt;
&lt;p&gt;On the extensions page opened in the previous step, toggle &lt;strong&gt;&amp;ldquo;Developer mode&amp;rdquo;&lt;/strong&gt; on. (Top right in Chrome; left sidebar in Edge).&lt;/p&gt;
&lt;p&gt;Switch to the Downloads folder, drag &lt;code&gt;Playwriter_MCP_xxx.crx&lt;/code&gt; into the browser extensions page. Done.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/d921e547d9218e94147697dc9b5206a3.webp"
loading="lazy"
alt="A screenshot of browser extensions management dropdown showing Playwriter MCP extension"
&gt;&lt;/p&gt;
&lt;p&gt;Finally, pin the &amp;ldquo;Playwriter MCP&amp;rdquo; extension to your toolbar for easy access.&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage
&lt;/h2&gt;&lt;p&gt;Using it is simple.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/349ddc382bb465351b79d929d8ecbcd0.webp"
loading="lazy"
alt="A screenshot of Qwen-Code CLI interactive terminal upon execution"
&gt;&lt;/p&gt;
&lt;p&gt;Open the command line, type &lt;code&gt;qwen&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-01/9c37079da9ef6a93e32a435f7801ef72.webp"
loading="lazy"
alt="A screenshot of browser tab grouped under playwriter and the debugging banner"
&gt;&lt;/p&gt;
&lt;p&gt;Open a webpage, click the cursor-like plugin icon. The page will be framed in a &amp;ldquo;playwriter&amp;rdquo; tab group—this is the AI&amp;rsquo;s playground.&lt;/p&gt;
&lt;p&gt;Send this to the AI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Use browser, check the current page, and confirm connection.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If it says yes, start commanding it. If it hits a CAPTCHA, help it out.&lt;/p&gt;
&lt;p&gt;If it can&amp;rsquo;t connect, ask the AI to fix it. If it lacks permissions, it might give you commands to run manually. Just ask if you don&amp;rsquo;t understand.&lt;/p&gt;
&lt;p&gt;Click the icon again to disconnect.&lt;/p&gt;
&lt;h3 id="tip-training-the-ai"&gt;Tip: Training the AI
&lt;/h3&gt;&lt;p&gt;One last trick. Complex pages (like travel booking sites with dynamic loading) can baffle the AI. Simple, &amp;ldquo;ugly&amp;rdquo; internal system pages are often easier for it.&lt;/p&gt;
&lt;p&gt;If the AI succeeds—even partially—ask it to review the session:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Review the operation. Compile &amp;#34;Goal&amp;#34;, &amp;#34;Key Steps&amp;#34;, &amp;#34;Pitfalls&amp;#34;, and &amp;#34;Solutions&amp;#34; into a Markdown file named &amp;#34;AI Browser Manual.md&amp;#34; on the Desktop.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keep this file. Next time, tell the AI to read it before starting the task. If it learns something new, ask it to update the manual.&lt;/p&gt;
&lt;p&gt;This is the essence of &amp;ldquo;skills.&amp;rdquo; Mastering this manual skill-building puts you ahead of 99.7% of people.&lt;/p&gt;</description></item><item><title>Selling AI Art - From First Order to Calling It Quits</title><link>https://victor42.eth.limo/post-en/automate-ai-illustrations-production/</link><pubDate>Thu, 08 May 2025 17:22:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/automate-ai-illustrations-production/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2025-05/89852ef4042c193cd77916efb0cf70b6.webp" alt="Featured image of post Selling AI Art - From First Order to Calling It Quits" /&gt;&lt;p&gt;I landed a gig creating illustrations for a children&amp;rsquo;s e-book company. This article chronicles my journey: from assessing feasibility and initial prep to delivering the first order and, ultimately, walking away.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll find AI tips and technical insights sprinkled throughout, focusing on principles over nitty-gritty details. Don&amp;rsquo;t worry if AI jargon isn&amp;rsquo;t your thing; the story is easy to follow. I&amp;rsquo;ve separated the tech talk, so feel free to skip those sections without missing the narrative.&lt;/p&gt;
&lt;p&gt;Due to client confidentiality, I can&amp;rsquo;t share the actual deliverables. Instead, I&amp;rsquo;ve recreated similar images to illustrate the effects. All images in this post were generated by me for this purpose.&lt;/p&gt;
&lt;p&gt;The project is now complete. Before diving in, here&amp;rsquo;s my main takeaway: AI won&amp;rsquo;t replace illustrators for the average person, but it empowers Photoshop-savvy graphic designers to do so.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-opportunity"&gt;The Opportunity
&lt;/h2&gt;&lt;p&gt;In April 2025, a friend tipped me off to a gig: AI-generated children&amp;rsquo;s illustrations. The volume was massive—around ten thousand images monthly. My friend&amp;rsquo;s quote suggested that even handling 2,000 images could be highly profitable if I had the capacity.&lt;/p&gt;
&lt;p&gt;The high volume was the main draw.&lt;/p&gt;
&lt;p&gt;My specialty is untangling complex processes and automating them. I break down tasks, then use Python, prompt engineering, Excel, and other tools to build efficient pipelines—essentially becoming a one-man production line.&lt;/p&gt;
&lt;p&gt;In short, I industrialize processes.&lt;/p&gt;
&lt;p&gt;My extensive experience with AI image generation was, of course, a prerequisite.&lt;/p&gt;
&lt;p&gt;Financially, it looked promising. While anyone can generate a few decent children&amp;rsquo;s illustrations with today&amp;rsquo;s AI tools, producing tens of thousands is another beast entirely. Doing that manually would be a full-time job.&lt;/p&gt;
&lt;p&gt;My strategy was to automate the entire illustration pipeline, letting it churn out images in the background with minimal oversight. My main focus would be on image selection and client communication. Since AI image generation has its quirks (it&amp;rsquo;s a bit of a &amp;ldquo;gacha&amp;rdquo; game), I&amp;rsquo;d generate multiple options for each illustration. If none were suitable, I&amp;rsquo;d flag them for a retry until I got a good one.&lt;/p&gt;
&lt;p&gt;For detailed edits, like fixing extra fingers, I could use AI tools and Photoshop, but doing it myself would cripple my output. My goal was to profit from automation, so I planned to outsource manual fixes to illustrators. Luckily, my friend had connections and found illustrators open to collaboration at a price I could offer.&lt;/p&gt;
&lt;p&gt;Everything seemed to be falling into place. This setup offered an efficient way to leverage my time for profits well beyond my hourly rate. I was in high spirits, even humming while washing baby bottles.&lt;/p&gt;
&lt;h3 id="-tech-share"&gt;🔮 Tech Share
&lt;/h3&gt;&lt;p&gt;▽ ▽ ▽ 🔮 Tech Talk Begins 🔮 ▽ ▽ ▽&lt;/p&gt;
&lt;h4 id="choosing-the-model"&gt;Choosing the Model
&lt;/h4&gt;&lt;p&gt;At the time, top-tier AI image generation models included GPT-4o (international) and Jimeng (Doubao, domestic). Among open-source options, Flux dev offered the best results and a mature ecosystem.&lt;/p&gt;
&lt;p&gt;With high volume, cost was as crucial as quality. GPT-4o was too pricey, and Jimeng lacked an official API. The client also had &lt;em&gt;extremely&lt;/em&gt; specific style demands, making open-source models the only practical choice.&lt;/p&gt;
&lt;p&gt;The main open-source contenders were SDXL and Flux dev. SDXL is cheap and fast, but flawed. For instance, if a prompt described a boy in a blue striped shirt and a mom in a khaki cardigan, SDXL might color both outfits blue or khaki, leading to high rejection rates. Flux dev was far more reliable.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/1cc02c0bc68a362b1d44b4de01416be3.webp"
loading="lazy"
alt="AI generated Chinese xianxia couple illustration with silver-haired woman and red-haired man facing each other"
&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example from another project. The Flux dev image above perfectly matched my character descriptions: a female lead in teal with silver-gray hair, and a male lead in red with red hair. Even eye colors were accurate.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/86a1c4af1b2e365cca75a7e595885a4b.webp"
loading="lazy"
alt="AI generated ancient romance illustration of purple-haired lord and silver-haired woman kissing in a palace"
&gt;&lt;/p&gt;
&lt;p&gt;In contrast, SDXL produced this mess. Total chaos.&lt;/p&gt;
&lt;p&gt;This discrepancy stems from their differing CLIP model capabilities. CLIP models interpret text-image relationships. Diffusion models don&amp;rsquo;t grasp human language; CLIP translates prompts into a format diffusion models understand. A poor translator (CLIP) leads to misinterpretations.&lt;/p&gt;
&lt;p&gt;So, Flux dev was the clear choice.&lt;/p&gt;
&lt;h4 id="choosing-how-to-call-the-model"&gt;Choosing How to Call the Model
&lt;/h4&gt;&lt;p&gt;To automate image generation, I needed programmatic access.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/8aec8fc0f480daac85a741fa5a288536.webp"
loading="lazy"
alt="Full ComfyUI complex node workflow screenshot for batch AI illustration automation pipeline"
&gt;&lt;/p&gt;
&lt;p&gt;There are three main ways to generate images: Flux WebUI, ComfyUI, and direct API calls. I preferred &lt;a class="link" href="https://www.comfy.org/" target="_blank" rel="noopener"
&gt;ComfyUI&lt;/a&gt; for its API, which accepts entire workflows. With the model and resources set up, the program sends a workflow and receives an image. Wrapping this in a utility function and looping it allows for bulk image generation.&lt;/p&gt;
&lt;h4 id="choosing-the-runtime-environment"&gt;Choosing the Runtime Environment
&lt;/h4&gt;&lt;p&gt;AI image generation is resource-intensive. My i7 Windows laptop (over 7,000 RMB) has a weak GPU; an SDXL image took 10 minutes. A new PC was an option, but with the project still tentative and needing scalable resources, cloud computing was better.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/6b5e8f6f5c09ef4fc1957a61d0c9e7e1.webp"
loading="lazy"
alt="Side-by-side brand logos of Replicate and RunComfy AI cloud GPU computing platforms"
&gt;&lt;/p&gt;
&lt;p&gt;The hardcore route—buying cloud machines and storage—was too complex for my &amp;lsquo;half-baked&amp;rsquo; developer skills. I opted for simpler platforms: &lt;a class="link" href="https://replicate.com/" target="_blank" rel="noopener"
&gt;Replicate&lt;/a&gt; and &lt;a class="link" href="https://www.runcomfy.com/" target="_blank" rel="noopener"
&gt;Runcomfy&lt;/a&gt;. I just needed to use their APIs, avoiding machine configuration hassles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/5fac174ef96e1fe4a297ab6365c802e7.webp"
loading="lazy"
alt="Replicate model page for flux-dev-lora showing commercial-use pricing at $0.032 per image"
&gt;&lt;/p&gt;
&lt;p&gt;Replicate offers the &lt;a class="link" href="https://replicate.com/black-forest-labs/flux-dev-lora" target="_blank" rel="noopener"
&gt;Flux dev LoRA model&lt;/a&gt;. Input prompts and parameters, run it, and get an image—simple. For a custom LoRA, I&amp;rsquo;d train it, upload it (Hugging Face/Civitai), and call it via URL. It costs about 0.2 RMB per image.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/3117969428b59e24d262d922b13bdc61.webp"
loading="lazy"
alt="ComfyUI TTP Tile image tiling and upscaling workflow node configuration screenshot"
&gt;&lt;/p&gt;
&lt;p&gt;However, Replicate had a key drawback: no support for arbitrary custom nodes. Understandably, as a multi-modal platform (text, voice, etc.), it couldn&amp;rsquo;t offer deep ComfyUI-specific support. My planned upscaling technique needed a &lt;code&gt;TTP_Image_Tile_Batch&lt;/code&gt; node, which Replicate lacked.&lt;/p&gt;
&lt;p&gt;Runcomfy, however, specializes in ComfyUI. It offers cloud machines with storage, letting me upload custom models and nodes. In theory, it supports any image model and custom node. Runcomfy bills by the minute for machine runtime. Each generation session (manual UI or API) required starting a machine; billing began at launch and ended at shutdown.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/0840c3aec7006ee08ce2b68bef26b2b1.webp"
loading="lazy"
alt="RunComfy cloud GPU platform pricing comparison page for Hobby and Pro subscription tiers"
&gt;&lt;/p&gt;
&lt;p&gt;The kicker? It was actually cheaper per image than Replicate!&lt;/p&gt;
&lt;p&gt;△ △ △ 🔮 Tech Talk Ends 🔮 △ △ △&lt;/p&gt;
&lt;h2 id="preparation"&gt;Preparation
&lt;/h2&gt;&lt;p&gt;Before taking orders, I completed two trial rounds.&lt;/p&gt;
&lt;h3 id="trial-drafts-client-approval"&gt;Trial Drafts, Client Approval
&lt;/h3&gt;&lt;p&gt;For the first trial, using the client&amp;rsquo;s style references, I created illustrations in two styles—watercolor and flat—depicting a boy in a park reaching for a flower, with his mom quickly stopping him.&lt;/p&gt;
&lt;p&gt;The client approved a style similar to this (watercolor left, flat right). Ignore the limb issues (I generated these later); focus on the style:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/4abb55973b10dfc1491328b0499e6de5.webp"
loading="lazy"
alt="Two AI generated children’s book illustrations comparing flat color and sketch styles of mother and boy near daffodils"
&gt;&lt;/p&gt;
&lt;h4 id="challenge-1-meeting-style-requirements"&gt;Challenge 1: Meeting Style Requirements
&lt;/h4&gt;&lt;p&gt;Initially, I cut corners, underestimating the client&amp;rsquo;s strict style demands. I used community AI models instead of training a dedicated one. After a few attempts, the client reluctantly accepted the watercolor style but found the flat style too different from their references.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/776493c1430edf9a9a4f3e761fd69565.webp"
loading="lazy"
alt="Side-by-side AI generated children’s book scenes in flat color and watercolor styles of mother and son at flowers"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Results from someone else&amp;rsquo;s model.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The client&amp;rsquo;s company had a large team of in-house illustrators and many hand-drawn illustrations. They were incredibly meticulous about style, with specific requirements for character eye size, drawing method, watercolor outline textures, and even subtle pencil textures on flat color blocks.&lt;/p&gt;
&lt;p&gt;No more shortcuts. I had to train my own model for precision. It sounds daunting, but AI tools have advanced, making it quite simple. The training was also inexpensive, costing less than 100 RMB.&lt;/p&gt;
&lt;p&gt;The client provided dozens of reference images for each style, sufficient for training. The trained model was nearly indistinguishable from the originals, with minor discrepancies I could fix (and automate) in Photoshop. Style was no longer an issue; the client was pleased.&lt;/p&gt;
&lt;h4 id="challenge-2-accurately-depicting-character-interaction"&gt;Challenge 2: Accurately Depicting Character Interaction
&lt;/h4&gt;&lt;p&gt;Another hurdle was AI&amp;rsquo;s grasp of image content. It could draw elements like a park, flower, boy, and mom, but character actions were often inaccurate. For instance, a boy might pick a flower without looking, or squat awkwardly, or the mom&amp;rsquo;s gesture to stop him might look like she was receiving flowers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/86958314b04e57621321225218a9be95.webp"
loading="lazy"
alt="AI generated watercolor children’s book illustration of mother grabbing boy’s arm near daffodils"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This one looks like the mom is helping the boy up, and who knows where the boy is looking.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The core issue: AI understands objects, not relationships. Unlike humans who learn from the physical world, AI is like a captive artist in a cellar, endlessly seeing paintings and crudely imitating them.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/becc19b993c3f1b05d05fceb0724da4d.webp"
loading="lazy"
alt="ComfyUI CLIP prompt text node for flat color vector SVG children’s book illustration scene"
&gt;&lt;/p&gt;
&lt;p&gt;To address this, I optimized my image generation system. I had DeepSeek generate highly detailed prompts, specifying character actions, expressions, positions, orientation, gaze, and even individual hand movements.&lt;/p&gt;
&lt;p&gt;This significantly improved results but didn&amp;rsquo;t eliminate all issues. AI has its limits. If rerolling (&amp;ldquo;gacha&amp;rdquo;) failed, manual editing was necessary.&lt;/p&gt;
&lt;h4 id="challenge-3-fixing-deformed-hands"&gt;Challenge 3: Fixing Deformed Hands
&lt;/h4&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/8aa627aa4a1c69576aa845f4bedda2a1.webp"
loading="lazy"
alt="AI generated children’s book illustration with red annotation boxes marking hand and flower rendering issues"
&gt;&lt;/p&gt;
&lt;p&gt;Then came the notorious AI challenge: deformed hands. Hands, our primary tools for interacting with diverse objects, are incredibly varied. Even AI that draws realistic faces struggles with hand variations after seeing countless images.&lt;/p&gt;
&lt;p&gt;Again, AI lacks physical world understanding. Unlike art students learning anatomy, AI processes pixels, often miscounting fingers.&lt;/p&gt;
&lt;p&gt;Moreover, the client&amp;rsquo;s trial task made hands tricky. With two full-body figures, hands were tiny, receiving little AI attention, leading to predictable issues.&lt;/p&gt;
&lt;p&gt;The boy picking a flower required hand-flower interaction. Humans use thumb and index finger; AI, lacking anatomical understanding, sometimes depicted him holding the stem between index and middle fingers, like a wine glass.&lt;/p&gt;
&lt;p&gt;Meanwhile, the mother&amp;rsquo;s hand stopping him added hand-to-hand interaction. Her hand on his was toughest; overlapping fingers often blurred. Workarounds included placing her hand on his forearm or having her wag a finger.&lt;/p&gt;
&lt;p&gt;The style issue was resolved. Interaction and hand problems were manageable by generating more images, making the trial drafts passable. The second trial, with five illustrations of single subjects, was an easy pass.&lt;/p&gt;
&lt;h3 id="-tech-share-1"&gt;🔮 Tech Share
&lt;/h3&gt;&lt;p&gt;▽ ▽ ▽ 🔮 Tech Talk Begins 🔮 ▽ ▽ ▽&lt;/p&gt;
&lt;h4 id="training-the-model"&gt;Training the Model
&lt;/h4&gt;&lt;p&gt;To accurately replicate the client&amp;rsquo;s watercolor and flat styles, training a custom LoRA model was essential.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/baf0661304498451e79dedadb36305ff.webp"
loading="lazy"
alt="Liblib AI Lora fine-tuning interface with training parameters and dataset upload configuration"
&gt;&lt;/p&gt;
&lt;p&gt;Despite long experience with SD and ComfyUI, this was my first LoRA training. I&amp;rsquo;d assumed training would simplify and be learnable on demand. Indeed, &lt;a class="link" href="https://www.liblib.art/pretrain" target="_blank" rel="noopener"
&gt;Liblib&amp;rsquo;s&lt;/a&gt; GUI now makes it a point-and-click affair.&lt;/p&gt;
&lt;p&gt;Still, training involved careful consideration of settings like image cropping, tagging, and epoch count.&lt;/p&gt;
&lt;p&gt;Reading &lt;a class="link" href="https://civitai.com/articles/6792/flux-style-captioning-differences-training-diary" target="_blank" rel="noopener"
&gt;another user&amp;rsquo;s LoRA training diary&lt;/a&gt; clarified these points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Square images are best for training. I scripted square cropping instead of using Liblib&amp;rsquo;s tool, allowing me to discard bad crops (e.g., half-faces, incomplete subjects) for better model quality.&lt;/li&gt;
&lt;li&gt;For style LoRAs (applying features image-wide), no tagging is a good option. Such LoRAs apply style upon loading, no trigger words needed.&lt;/li&gt;
&lt;li&gt;Monitor the LOSS function. It decreases with epochs, then flattens. Sample images help determine if it&amp;rsquo;s a local or global minimum. For simpler, non-realistic images, 8-10 epochs often suffice.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="automated-image-generation-workflow"&gt;Automated Image Generation Workflow
&lt;/h4&gt;&lt;p&gt;With the trained LoRA uploaded to Runcomfy&amp;rsquo;s storage, resources were set. I configured a basic Flux text-to-image workflow, adding two LoRAs: one for hand detail optimization, one for my custom style.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/50c317a3a943f4063fbdfcb904aa4c98.webp"
loading="lazy"
alt="List of RunComfy API configuration JSON files used in the AI illustration automation project"
&gt;&lt;/p&gt;
&lt;p&gt;This gave me two image generation workflows (watercolor and flat), exported as API files for programmatic use.&lt;/p&gt;
&lt;p&gt;High-resolution upscaling was another core workflow, a modified Flux image-to-image setup:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/06a64ad801e05bf0bb897a520b5a798b.webp"
loading="lazy"
alt="ComfyUI flat style generation workflow with 4-step Lora nodes and low denoise value highlighted"
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Denoising strength at 0.15 to preserve original content.&lt;/li&gt;
&lt;li&gt;A 4-step generation LoRA. This speeds up Flux dev (usually 20 steps) like Flux schnell, reducing quality slightly but acceptably for upscaling, where the difference is imperceptible.&lt;/li&gt;
&lt;li&gt;TTP_Image_Tile_Batch nodes before and after sampling. These divide the image into tiles. Flux processes one tile at a time, focusing attention for richer, more accurate details. The image is then reassembled, achieving high-res upscaling.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/bc4688a79ca948cd18247bf19f64b975.webp"
loading="lazy"
alt="Chinese traditional jade stone relief wall carving featuring welcoming pine tree with cranes as AI style reference"
&gt;&lt;/p&gt;
&lt;p&gt;Understanding denoising strength is key to mastering ComfyUI. I visualize it as carving a 1-meter thick marble wall. Denoising 1 (max) allows free carving, even through the wall. Denoising 0.15 limits work to the top 15% (surface), creating a shallow relief.&lt;/p&gt;
&lt;p&gt;For text-to-image, the &amp;ldquo;wall&amp;rdquo; is blank. Higher denoising gives AI more creative freedom, so it&amp;rsquo;s usually maxed out.&lt;/p&gt;
&lt;p&gt;For image-to-image, the &amp;ldquo;wall&amp;rdquo; has an existing image. Lower denoising preserves original features. On a Nine-Dragon Wall, low denoising would refine scales and whiskers, not transform the dragon into a Greeting Pine.&lt;/p&gt;
&lt;h4 id="manual-touch-up-workflow"&gt;Manual Touch-up Workflow
&lt;/h4&gt;&lt;p&gt;With stable LoRA and workflows, I still needed manual touch-up tools for special modifications. Though planned for illustrators, I needed a Plan B to step in if they were busy.&lt;/p&gt;
&lt;p&gt;The manual touch-up workflows included &lt;strong&gt;Text-to-Image Inpainting, Image-to-Image Inpainting, and Image-to-Image (Style Transfer/Redrawing)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/420eff7d539ee0d57ffe31a0e2d71865.webp"
loading="lazy"
alt="ComfyUI inpainting workflow with style Lora, hand-fix Lora, and Flux dev fill nodes labeled"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Text-to-Image Inpainting&lt;/strong&gt; uses the Flux dev fill model (for inpainting/outpainting) with my style LoRA, similar to basic text-to-image. Used for adding hats, changing shoes, or altering a cat&amp;rsquo;s tail.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/371178a155b572a71eac5496cafde7f1.webp"
loading="lazy"
alt="ComfyUI cartoon Inpaint workflow using Flux redux image reference module with two thumbnail previews"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image-to-Image Inpainting&lt;/strong&gt; combines Flux dev fill and Flux redux. Redux processes inserted objects to blend them stylistically and naturally, preserving features. It ignores text prompts, using only the image input. Common for changing clothes on e-commerce models.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/d61012dafe242e5c5c8a12f9061b1e11.webp"
loading="lazy"
alt="ComfyUI workflow with image input preprocessing and Flux redux image-to-image generation pipeline"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Image-to-Image (Redrawing/Style Transfer)&lt;/strong&gt; uses Flux dev and Flux redux to create a similar-looking &amp;ldquo;copy&amp;rdquo; with different details. Adding my style LoRA transforms photos into illustrations, preserving original features. Useful for social media &amp;ldquo;content spinning&amp;rdquo;—modifying online images to appear original and avoid plagiarism.&lt;/p&gt;
&lt;p&gt;All these modules are in my &lt;a class="link" href="https://github.com/greenzorro/comfyui-workflow-versatile" target="_blank" rel="noopener"
&gt;Flux Versatile Workflow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Subsequently, manual edits (besides Photoshop and occasional Doubao) used these three workflows, varied by denoising strength for different problems.&lt;/p&gt;
&lt;p&gt;△ △ △ 🔮 Tech Talk Ends 🔮 △ △ △&lt;/p&gt;
&lt;h3 id="building-the-automated-image-generation-system"&gt;Building the Automated Image Generation System
&lt;/h3&gt;&lt;p&gt;I manually generated trial drafts while debugging and building my automated image system.&lt;/p&gt;
&lt;p&gt;After two successful trial rounds, the client offered work. My system wasn&amp;rsquo;t ready, and manual generation was too slow, so I declined, promising to start once the system was complete.&lt;/p&gt;
&lt;p&gt;Once built, I reran the second trial tasks through the system smoothly. My involvement was reduced to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Paste client&amp;rsquo;s illustration content (Excel column) into my multi-dimensional table; DeepSeek auto-generates prompts.&lt;/li&gt;
&lt;li&gt;Export table as a spreadsheet to my program directory.&lt;/li&gt;
&lt;li&gt;Run Program #1 (Generate): reads prompts, starts cloud machine, outputs 4 images per illustration, auto-shuts down machine.&lt;/li&gt;
&lt;li&gt;Manually select images. If none are usable, mark for retry in the table, repeat steps 2-3.&lt;/li&gt;
&lt;li&gt;Run Program #2 (Upscale): starts cloud machine, upscales selected images to high-definition (for print).&lt;/li&gt;
&lt;li&gt;Run Program #3 (Resolution): converts images to print resolution and client-specified dimensions.&lt;/li&gt;
&lt;li&gt;Run Photoshop batch action for texture details.&lt;/li&gt;
&lt;li&gt;Run Program #4 (Organize): sorts images into book folders for client delivery.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/7ba00f10d5baba852b7ecf192d626828.webp"
loading="lazy"
alt="VSCode file explorer showing Python automation scripts for children’s book AI illustration generation project"
&gt;&lt;/p&gt;
&lt;p&gt;This setup seems complex, but manual work is minimal. Image selection takes time; other steps are just a button press, then I&amp;rsquo;m AFK.&lt;/p&gt;
&lt;p&gt;Crucially, the process is the same for 100 or 2,000 images. For large, urgent volumes, I can use faster (slightly costlier) cloud machines—still negligible compared to illustrator costs.&lt;/p&gt;
&lt;h3 id="-tech-share-2"&gt;🔮 Tech Share
&lt;/h3&gt;&lt;p&gt;▽ ▽ ▽ 🔮 Tech Talk Begins 🔮 ▽ ▽ ▽&lt;/p&gt;
&lt;p&gt;To build this system, I connected automation features from various tools. The workflow starts with client Excel input (brief illustration descriptions) and ends with project folders of images. I automated every possible intermediate step, tackling hurdles individually.&lt;/p&gt;
&lt;h4 id="generating-drawing-prompts-with-feishu-base-lark-base"&gt;Generating Drawing Prompts with Feishu Base (Lark Base)
&lt;/h4&gt;&lt;p&gt;Feishu Base (Lark Base) was ideal for converting brief descriptions to specific drawing prompts. It integrates with various third-party AI models, automating complex text processing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/b20bc439ab6eb3605ca35d5f9f84dacb.webp"
loading="lazy"
alt="Notion database hierarchy for AI illustration workflow showing image table, character table, and project table"
&gt;&lt;/p&gt;
&lt;p&gt;My table structure is layered: Image Table, Character Profile Table, and Project Table, plus two dimension tables for style/complexity prompts (complexity affects price). Upper tables read from lower ones; lower tables summarize upper ones for image counts and revenue estimates.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/cbd58340ff222763cccda062c237bd5d.webp"
loading="lazy"
alt="Notion project table Finished view with test project and experiment records and completion checkbox status"
&gt;&lt;/p&gt;
&lt;p&gt;Bottom-up: The Project Table defines project name, month, style, calculates image counts, looks up prices by complexity to estimate revenue, and stores notes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/ce6e669c0e3371bb8b89c75df1b38d32.webp"
loading="lazy"
alt="Notion image table Grid view showing 82 image records with thumbnail preview under project 15"
&gt;&lt;/p&gt;
&lt;p&gt;Next, the Character Profile Table ensures consistency. For picture books, main characters need consistent appearance. This table defines character name, project, and uses DeepSeek for detailed appearance descriptions (focusing on appearance, not actions/environment; specifying features like hairstyle, hair/clothing color, Chinese nationality). For convenience, I use StepFun (阶跃星辰) API for cheap thumbnail generation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/473ea6c1d3a84de031141c2231b7a7cb.webp"
loading="lazy"
alt="Notion image table showing character-1 and character-2 association fields linked to AI character prompt descriptions"
&gt;&lt;/p&gt;
&lt;p&gt;The top-level Image Table is most varied. Each row is an illustration. Pasting client requirements into the &amp;ldquo;scene&amp;rdquo; column triggers Base&amp;rsquo;s free Doubao model to create a concise (&amp;lt;10 char) title for searching and filenames.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/b6bf0ac54f2ea21dc47cbb73168df424.webp"
loading="lazy"
alt="Notion image table with extra instruction column providing detailed scene direction notes for AI generation"
&gt;&lt;/p&gt;
&lt;p&gt;For each illustration, assign its project (can copy-paste). A column reads the style from the Project Table and prefixes it to the drawing prompt.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/7c6ba3b341f4281f8851f427c533a95e.webp"
loading="lazy"
alt="Notion image table comparing AI-generated prompt output results with style prompt and AI prompt columns"
&gt;&lt;/p&gt;
&lt;p&gt;If a main character is present, select them in one of the 3 character columns (supports up to 3 main characters). This column pulls appearance details from the Character Profile Table for the prompt.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/8fff47a4821a17760fe36f61bbe00326.webp"
loading="lazy"
alt="Notion project table Finished view with filter condition panel set to show only completed boolean records"
&gt;&lt;/p&gt;
&lt;p&gt;A manual instruction column allows direct input for specific needs (e.g., night scene, outdoor environment), also feeding into the prompt.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/22d11320d3bdedae77b2f8ad9203be1b.webp"
loading="lazy"
alt="Notion image table with retry, Photoshop, fix, and inpaint task-status checkbox columns for tracking progress"
&gt;&lt;/p&gt;
&lt;p&gt;DeepSeek then generates English drawing prompts based on the requirement column, prioritizing manual instructions and fulfilling general needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Count characters.&lt;/li&gt;
&lt;li&gt;Detail each person&amp;rsquo;s actions (orientation, angle, gaze).&lt;/li&gt;
&lt;li&gt;Prioritize verbatim main character appearance; allow flexibility for others.&lt;/li&gt;
&lt;li&gt;Specify details like Chinese nationality, period-appropriate clothing.&lt;/li&gt;
&lt;li&gt;Briefly describe the environment.&lt;/li&gt;
&lt;li&gt;Specify output format with examples.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DeepSeek R1 excels at this, usually generating usable, accurate, detailed prompts. It&amp;rsquo;s not free (via Volcano Engine&amp;rsquo;s (火山方舟) API), but costs far less than Runcomfy.&lt;/p&gt;
&lt;p&gt;If this layered table structure seems complex, understanding [Link to other records] and [Lookup] column types in multi-dimensional tables simplifies it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/274e00e94af16eae68ec02cdbe6dbab4.webp"
loading="lazy"
alt="Notion image table Retry view showing CSV download settings dialog for exporting the current filtered view"
&gt;&lt;/p&gt;
&lt;p&gt;Feishu Base free accounts have a 2000-record limit per table, insufficient for this project. The Image Table needs periodic cleaning. A &amp;ldquo;completion status&amp;rdquo; in the Project Table, when checked, marks projects complete. The Image Table reads this, allowing bulk deletion of finalized images to free space.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/c741c58de2d7e77c366c19302eb82a0f.webp"
loading="lazy"
alt="Notion image table full multi-view tab bar showing Grid, Gen, Retry, Ps, Fix, Inpaint, and Finished tabs"
&gt;&lt;/p&gt;
&lt;p&gt;These were configurations for initial generation. I also added columns for modifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retry: check for regeneration.&lt;/li&gt;
&lt;li&gt;PS: check for manual Photoshop fix.&lt;/li&gt;
&lt;li&gt;Fix: check for illustrator fix.&lt;/li&gt;
&lt;li&gt;X, Y coordinates: for cropping, AI inpainting (e.g., hands), and pasting back (details in &amp;ldquo;Kicking Off&amp;rdquo;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/28ca2f09b169b2a7b9e15ef5c4f5e751.webp"
loading="lazy"
alt="Notion database download settings dialog interface for CSV export"
&gt;&lt;/p&gt;
&lt;p&gt;These columns are markers. Reviewing client requests, I check boxes here. Sub-views in the Image Table list images by these statuses. Exporting as CSV allows a program to find and copy these images to a dedicated directory, avoiding manual searches.&lt;/p&gt;
&lt;p&gt;This table system centralizes image management, prompt generation, and modification handling.&lt;/p&gt;
&lt;h4 id="python-for-image-generation-and-upscaling"&gt;Python for Image Generation and Upscaling
&lt;/h4&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/694b43584e1e198df6c1ccb5e6101d76.webp"
loading="lazy"
alt="Two Python script files child_book_1_gen.py and child_book_2_upscale.py in VSCode explorer"
&gt;&lt;/p&gt;
&lt;p&gt;Programs #1 and #2 cover the mid-workflow: from prompts to HD images.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/2669bc1721b0a5db2ac68aad8a8548ec.webp"
loading="lazy"
alt="A screenshot of the CSV data sheet containing image IDs, styles, and AI final prompts"
&gt;&lt;/p&gt;
&lt;p&gt;Program #1 takes the CSV, reads drawing prompts, and sends them to Runcomfy, calling the style-specific workflow for bulk image generation.&lt;/p&gt;
&lt;p&gt;After output, images are manually selected; retries are marked in the table. Rerunning Program #1 prioritizes these retries.&lt;/p&gt;
&lt;p&gt;Once all illustrations are usable, Program #2 sends them to Runcomfy for high-res upscaling to print quality.&lt;/p&gt;
&lt;p&gt;Supporting Programs #1 and #2 requires significant underlying code.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/ab957480ff349869e11b97a2e54ea088.webp"
loading="lazy"
alt="RunComfy API Reference introduction and documentation interface"
&gt;&lt;/p&gt;
&lt;p&gt;Runcomfy API integration is crucial for programmatic generation. This can be tough for non-programmers, but a capable AI model can help troubleshoot if you&amp;rsquo;re patient and guide it with the API docs:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://comfyui-guides.runcomfy.com/api-reference" target="_blank" rel="noopener"
&gt;https://comfyui-guides.runcomfy.com/api-reference&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/f3d224fd5e14e664d557f4cb1edf8b51.webp"
loading="lazy"
alt="The Python utility file runcomfy_utils.py shown in VSCode sidebar"
&gt;&lt;/p&gt;
&lt;p&gt;Once working, it&amp;rsquo;s a reusable utility function for AI image generation: input workflow, machine type, etc., and get an image from the cloud.&lt;/p&gt;
&lt;p&gt;For stability, robust code is essential. API calls need retries with exponential backoff for network errors, preventing program crashes.&lt;/p&gt;
&lt;p&gt;This function also needs the cloud machine to be running, so a machine management toolkit (start, check availability, shutdown) is necessary.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;runcomfy_utils.py
├── Constants
│ ├── RUNCOMFY_USER_ID
│ ├── RUNCOMFY_API_TOKEN
│ └── RUNCOMFY_MACHINE_PRICES
│
├── Helper Functions
│ ├── generate_seed()
│ └── calculate_billable_minutes()
│
├── RunComfyService (Class)
│ ├── __init__()
│ ├── File Operations
│ │ ├── get_url_from_file()
│ │ ├── save_url_to_file()
│ │ └── remove_instance_file()
│ ├── API Interaction Methods
│ │ ├── get_instance_info()
│ │ ├── create_instance()
│ │ └── stop_instance()
│ └── get_or_create_instance()
│
├── runcomfy_service (Global Instance of RunComfyService)
│
└── Workflow &amp;amp; Download Functions
├── runcomfy_workflow()
└── runcomfy_download_outputs()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;The complete utility function file, with its code structure shown above.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the children&amp;rsquo;s book project, I added a business logic layer to the base Runcomfy functions. We standardized on two main workflows: one for image generation and one for upscaling.&lt;/p&gt;
&lt;p&gt;This new utility function takes specific parameters—like the prompt, image to upscale, or denoising value—instead of an entire workflow. However, it still processes illustrations one by one.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; &amp;#34;&amp;#34;&amp;#34;Generates flat-style images via a RunComfy workflow.
Args:
prompt (str): Text prompt for image generation.
instance_url (str): ComfyUI instance URL.
batch_size (int): Images per batch.
save_dir (str): Save directory for generated images.
output_name (str, optional): Output filename prefix.
Defaults to a timestamp if not provided.
max_retries (int): Max retries for the operation.
Returns:
list[str]: List of file paths to generated images.
&amp;#34;&amp;#34;&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;Image generation function docstring.&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; &amp;#34;&amp;#34;&amp;#34;Upscales an image using a RunComfy workflow.
Args:
image_path (str): Path to the image to upscale.
instance_url (str): URL of the ComfyUI instance.
save_dir (str): Directory for the upscaled image.
max_retries (int): Max retries.
Returns:
str: Path to the upscaled image.
&amp;#34;&amp;#34;&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;Docstring for the upscaling function.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Programs 1 and 2, the higher-level applications, also incorporate instance management. They check for an active compute instance before generating images—using it if available, or starting a new one. The instance then automatically shuts down after use to control costs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/c46f347622627b3db3c345f09790da49.webp"
loading="lazy"
alt="A spreadsheet log recording AI illustration script execution times, machine tiers, and GPU costs"
&gt;&lt;/p&gt;
&lt;p&gt;Additionally, I built a statistics feature into these programs to calculate run costs based on instance type, price, and runtime. Run logs are consistently written to a spreadsheet. Data on instance costs and revenue from the multi-dimensional table are imported into a dedicated financial sheet. Adding other expenses—illustrator fees, Volcano Engine DeepSeek, and StepFun API costs—allows for easy profit calculation.&lt;/p&gt;
&lt;p&gt;My programming skills are average, but with AI&amp;rsquo;s help, building this system was surprisingly straightforward.&lt;/p&gt;
&lt;h4 id="adjusting-resolution-and-dimensions-with-python"&gt;Adjusting Resolution and Dimensions with Python
&lt;/h4&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/c4c8c52bb1afcb44239ccb918dbf2058.webp"
loading="lazy"
alt="The Python file child_book_3_ppi.py shown in VSCode editor"
&gt;&lt;/p&gt;
&lt;p&gt;Program 3 automated handling resolution and image dimensions.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/e4e2309950491e205d7248bc2b411eb4.webp"
loading="lazy"
alt="A screenshot of Photoshop Image Size dialog with width and height set to 10cm and resolution to 450 pixels per inch"
&gt;&lt;/p&gt;
&lt;p&gt;The client required final images at 10×10cm with 450 PPI (pixels per inch).&lt;/p&gt;
&lt;p&gt;This was a straightforward task using Python and the PIL package. Based on the required dimensions and resolution, I calculated the final pixel size and used PIL&amp;rsquo;s built-in methods to adjust the resolution.&lt;/p&gt;
&lt;p&gt;This program ran locally, incurring no cloud costs and taking minimal time.&lt;/p&gt;
&lt;h4 id="adding-stylistic-textures-with-ps-batch-processing"&gt;Adding Stylistic Textures with PS Batch Processing
&lt;/h4&gt;&lt;p&gt;This step addressed the client&amp;rsquo;s specific style requirements.&lt;/p&gt;
&lt;p&gt;For instance, with the watercolor style, the trained model produced backgrounds with distinct watercolor brushstrokes, but character clothing sometimes appeared as flat, solid colors. The client wanted the clothing to also feature random light and dark variations, mimicking watercolor brushstrokes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/a737e078b94aa4628d54bb92866f57b1.webp"
loading="lazy"
alt="A close-up of a child’s blue pants in an illustration showing uneven watercolor texture"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An example of the desired uneven light and dark variation on the pants.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the &amp;ldquo;flat&amp;rdquo; style, the client envisioned something very specific, not typical commercial vector art made of solid color blocks. Close inspection of reference images revealed that the flat color areas had white, grainy brushstrokes, creating a colored pencil texture. However, the model-generated images had completely solid colors.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/6db5ffcec403296da17fe182ecd620e5.webp"
loading="lazy"
alt="A close-up of a character’s clothing in an illustration with red arrows pointing to subtle colored pencil texture"
&gt;
&lt;em&gt;Subtle smearing marks.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These subtle stylistic features were beyond Lora&amp;rsquo;s training capabilities but achievable through Photoshop post-processing. The traditional approach involves finding watercolor or pencil-textured PS brushes and lightly brushing over the image with semi-transparent white. However, I aimed for automation, which meant standardizing the process, even at the cost of some quality.&lt;/p&gt;
&lt;p&gt;Essentially, this involved overlaying a texture. Textures are inherently random—some parts more transparent, others more opaque, like viewing the ground through patchy clouds from an airplane. Different random patterns in the texture create different brushstroke effects. I just needed to create these two textures to automate their application across all images.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/5e5e34bfd741edd3e214b22e159c43e8.webp"
loading="lazy"
alt="A comparison of two textures for overlaying: watercolor paper on the left and diagonal pencil brushstrokes on the right"
&gt;&lt;/p&gt;
&lt;p&gt;As a designer, this was no issue. I found suitable materials and layered them onto test images. By setting layer modes to Screen and Color Dodge, I eliminated the texture&amp;rsquo;s original color, making it affect only the image&amp;rsquo;s light and dark areas. I quickly finalized these two textures and saved them as PSD files.&lt;/p&gt;
&lt;p&gt;Next, I created a Photoshop batch processing action. For those unfamiliar, it&amp;rsquo;s like this: I hit &amp;ldquo;record,&amp;rdquo; and Photoshop logs all my actions. I perform the image processing workflow manually once, then stop recording. This creates a batch action that Photoshop can then apply to an entire folder of images, automating the texture addition.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/44365d71b3b51ad5992c4b473ef89b92.webp"
loading="lazy"
alt="A screenshot of Photoshop Actions panel showing steps recorded for CMYK-TIFF-Watercolor process"
&gt;&lt;/p&gt;
&lt;p&gt;The action&amp;rsquo;s steps were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open an image.&lt;/li&gt;
&lt;li&gt;Place the pre-prepared texture PSD file.&lt;/li&gt;
&lt;li&gt;Convert the texture to a layer, change its blending mode from Normal to Pass Through (allowing the Screen and Color Dodge effects within the PSD to apply).&lt;/li&gt;
&lt;li&gt;Merge all layers to bake the texture into the image.&lt;/li&gt;
&lt;li&gt;Convert to CMYK color mode (for printing).&lt;/li&gt;
&lt;li&gt;Save As TIFF format (for printing).&lt;/li&gt;
&lt;li&gt;Close the image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/e77285da6ae2e3d9aa3d6f462d5203de.webp"
loading="lazy"
alt="A screenshot of Photoshop Batch dialog setting the source and destination folders"
&gt;&lt;/p&gt;
&lt;p&gt;When running this batch action, the &amp;ldquo;Open image&amp;rdquo; and &amp;ldquo;Save As&amp;rdquo; steps are overridden by new settings, allowing different images to be processed each time.&lt;/p&gt;
&lt;p&gt;The CMYK conversion could have been done in the earlier Python step, which I initially tried. However, PIL&amp;rsquo;s color profile files aren&amp;rsquo;t professional grade and yield much poorer results than dedicated image processing software, often causing a yellowish tint across the image. Color-sensitive tasks are best left to Photoshop.&lt;/p&gt;
&lt;p&gt;PS batch processing is incredibly powerful. For advanced uses, check out my article:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://victor42.eth.limo/en/post-en/3650/" target="_blank" rel="noopener"
&gt;Turning Photoshop into a Machine Gun with Excel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;△ △ △ 🔮 Tech Talk Ends 🔮 △ △ △&lt;/p&gt;
&lt;h2 id="lets-get-to-work"&gt;Let&amp;rsquo;s Get to Work
&lt;/h2&gt;&lt;p&gt;With everything set up, it was time to take orders.&lt;/p&gt;
&lt;h3 id="hit-start-and-images-flow"&gt;Hit Start, and Images Flow
&lt;/h3&gt;&lt;p&gt;The first real project was small: 1 book, 82 illustrations, 7-day deadline.&lt;/p&gt;
&lt;p&gt;Time-wise, I felt no pressure. It was all done in half a day, like running a photo printer (if not a money printer).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/89852ef4042c193cd77916efb0cf70b6.webp"
loading="lazy"
alt="A futuristic toy printer with transparent casing and gears printing cartoon children illustration cards"
&gt;&lt;/p&gt;
&lt;p&gt;About half of the 82 illustrations didn&amp;rsquo;t feature characters. These types of images are less prone to errors and often usable on the first attempt. Fewer than 20 images needed retries, mostly for incorrect character interactions rather than hand issues.&lt;/p&gt;
&lt;p&gt;Three images featured many characters. For such group scenes, expecting AI to nail it on the first try is unrealistic. I regenerated them a few times, picked the ones with the fewest problems, and earmarked them for the illustrator.&lt;/p&gt;
&lt;p&gt;I submitted the first draft, explaining that the illustrator hadn&amp;rsquo;t started, so they should ignore hand issues for now, as those would be fixed later. This prevented wasted illustrator effort, as every revision costs.&lt;/p&gt;
&lt;h3 id="sudden-twist-the-illustrator-quits"&gt;Sudden Twist: The Illustrator Quits
&lt;/h3&gt;&lt;p&gt;Tech-obsessed people like me often underestimate the human element.&lt;/p&gt;
&lt;p&gt;The client&amp;rsquo;s feedback on the first draft was, frankly, a shock. The revision requests were incredibly detailed, generally falling into these categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Logical inconsistencies:&lt;/strong&gt; Desks or chairs missing legs or having too many.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing elements:&lt;/strong&gt; A desk lamp drawn without a knob.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style changes:&lt;/strong&gt; Character hair, originally shown with highlight/shadow lines in training images, now needed these lines removed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potential legal risks:&lt;/strong&gt; Police uniforms in a foreign style.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Printing requirements:&lt;/strong&gt; Night and thunderstorm skies needed to be light-colored to avoid poor printing of dark areas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aesthetic preferences:&lt;/strong&gt; Character clothing styles were too monotonous and needed more variety.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peculiar requests:&lt;/strong&gt; Children couldn&amp;rsquo;t wear overalls, long pants couldn&amp;rsquo;t show ankles, pants couldn&amp;rsquo;t be cuffed, and smiles couldn&amp;rsquo;t show teeth. (Perhaps past buyer complaints?)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the first review round, 71 out of 82 images needed revisions. The issues went far beyond just hands, jeopardizing the illustrator&amp;rsquo;s remaining 6-day schedule.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/bd059893485a3171e15896055c37db35.webp"
loading="lazy"
alt="A screenshot of a WeChat chat bubble with an illustrator refusing the task due to low price"
&gt;&lt;/p&gt;
&lt;p&gt;When I spoke with the illustrator, they asked to reconfirm the price. Upon reconfirmation, they abruptly decided the price was too low and quit without attempting to negotiate.&lt;/p&gt;
&lt;p&gt;To be fair, the rate I offered wasn&amp;rsquo;t very attractive. Plus, cleaning up AI&amp;rsquo;s messes probably isn&amp;rsquo;t appealing work for illustrators.&lt;/p&gt;
&lt;p&gt;My friend started looking for another illustrator, and I asked around too. The outlook was bleak. Current market rates for illustrators were much higher than my offer; some from big companies quoted up to 100 yuan per image. Given the client&amp;rsquo;s meticulous reviews, I had no idea how extensive future revisions would be. Even if I sacrificed most of my profit for an expensive illustrator, costs could easily spiral out of control.&lt;/p&gt;
&lt;h3 id="gritting-my-teeth-and-doing-it-myself-testing-ais-limits"&gt;Gritting My Teeth and Doing It Myself, Testing AI&amp;rsquo;s Limits
&lt;/h3&gt;&lt;p&gt;At this point, I decided to tackle the revisions myself. I wanted to gauge the extent of the client&amp;rsquo;s detailed requests to set standards for future illustrator searches. I also wanted to test my own AI capabilities. Though I&amp;rsquo;m a designer, I can&amp;rsquo;t draw. Could my AI and Photoshop skills compensate, freeing me from complete reliance on illustrators? My strong PS skills gave me the confidence to press on.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/ab26869c9528a694c72f501cd1f58b4a.webp"
loading="lazy"
alt="A tired male designer sitting at a desk under a lamp, editing children’s illustrations on a graphics tablet"
&gt;&lt;/p&gt;
&lt;p&gt;I revised intensely for a week. After 6 rounds, I&amp;rsquo;d revised 71 + 60 + 33 + 11 + 3 + 13 = 191 images. &amp;ldquo;Oh my god&amp;rdquo; was all I could think. Some images had too many issues, so I discarded them and generated new ones. This reduced problems, but local adjustments were still needed. Regenerating other images was too risky, as it could introduce new flaws. Patching existing images was the safer bet. All these fixes were manual.&lt;/p&gt;
&lt;p&gt;This created a massive bottleneck in the automated pipeline. Manual retouching replaced the previously simple selection process between image generation and upscaling.&lt;/p&gt;
&lt;p&gt;Surprisingly, after a week of revisions, despite the tight schedule making my hands tremble, progress was smooth. I&amp;rsquo;d planned to meet most requests and negotiate on unmanageable ones, explaining my lack of an illustrator. But ultimately, I met all requests by combining various techniques; nothing proved impossible. The numerous revision rounds were just the client&amp;rsquo;s workflow; each round brought up new points, indicating incomplete initial reviews rather than poorly executed revisions.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/e17c077275c98414ca17a7963e7ad960.webp"
loading="lazy"
alt="A 3D cartoon illustration of a clipboard checklist titled Revision Comments with all tasks checked"
&gt;&lt;/p&gt;
&lt;p&gt;All requirements were met, yet I can&amp;rsquo;t draw. How? Relying solely on AI for revisions is unrealistic; AI art is hard to control precisely. Fortunately, my PS skills allowed me to wrangle AI:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Minor erasures: Handled with PS alone.&lt;/li&gt;
&lt;li&gt;Major erasures: Doubao&amp;rsquo;s local inpainting was quick and effective.&lt;/li&gt;
&lt;li&gt;Moving/transforming elements: Traditional PS strengths.&lt;/li&gt;
&lt;li&gt;Creative tasks (no precise requirements): AI workflow local inpainting maintained style consistency.&lt;/li&gt;
&lt;li&gt;Creative tasks (precise object requirements): Found images online, then used AI local inpainting or style transfer to match the style while preserving the main subject.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ll detail these techniques in the tech section below.&lt;/p&gt;
&lt;h3 id="-tech-share-3"&gt;🔮 Tech Share
&lt;/h3&gt;&lt;p&gt;▽ ▽ ▽ 🔮 Tech Talk Begins 🔮 ▽ ▽ ▽&lt;/p&gt;
&lt;p&gt;This section covers the manual editing challenges and solutions, which are beyond automation.&lt;/p&gt;
&lt;h4 id="techniques-and-their-uses"&gt;Techniques and Their Uses
&lt;/h4&gt;&lt;p&gt;First, an overview of the techniques and their capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;【Flux】Text-to-image local inpainting (high denoising):&lt;/strong&gt; Completely replace an image element.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【Flux】Text-to-image local inpainting (low denoising):&lt;/strong&gt; Refine elements, often for fixing hands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【Flux】Image-to-image local inpainting:&lt;/strong&gt; Insert a specified object into the image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【Flux】Style transfer:&lt;/strong&gt; Redraw an image based on a reference image&amp;rsquo;s elements and style (e.g., turning photos into illustrations, merging different styles).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【Doubao】Conversational editing:&lt;/strong&gt; Quickly change colors or erase large areas (style consistency can be unstable).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【Doubao】Local inpainting:&lt;/strong&gt; Precise local erasure. Advantage: can directly modify upscaled high-res images, which Flux would process very slowly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Quick Selection Tool:&lt;/strong&gt; Roughly paint to select an object; similarly colored areas are auto-selected for easy isolation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Magic Wand Tool:&lt;/strong&gt; Selects based purely on color; adjustable tolerance, good for complex shapes like branches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Spot Healing Brush:&lt;/strong&gt; Simpler local inpainting, performs as well as Doubao on simple backgrounds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Content-Aware Fill:&lt;/strong&gt; Better results than Spot Healing Brush, but requires selecting an area first, then filling; creates a new layer (less convenient).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Clone Stamp Tool:&lt;/strong&gt; Paints one part of an image onto another; often used to fix color boundaries by smearing along them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Smudge Tool:&lt;/strong&gt; Blurs unwanted boundary lines, making them less obvious (opposite of Clone Stamp).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Puppet Warp:&lt;/strong&gt; Pin parts of an object and drag the rest; the object bends like rubber (e.g., make characters look up/down, bend arms, straighten legs).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Levels &amp;amp; Hue/Saturation Adjustment Layers:&lt;/strong&gt; Change brightness and color. With clipping masks, can target specific parts (e.g., easily modify clothing colors).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;【PS】Cutout Filter:&lt;/strong&gt; Reduces image colors to a few; best filter gallery tool for flat-style processing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, let&amp;rsquo;s see how combining these tackles tricky problems.&lt;/p&gt;
&lt;h4 id="challenge-1-traffic-police-directing-traffic"&gt;Challenge 1: Traffic Police Directing Traffic
&lt;/h4&gt;&lt;p&gt;Key Techniques: &lt;strong&gt;Doubao local inpainting, Content-Aware Fill, Cutout Filter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/db5aa83baa17fb0a76780ca9fbcf9ee2.webp"
loading="lazy"
alt="An AI-generated cartoon illustration of a traffic officer in a foreign-style uniform at a crosswalk"
&gt;&lt;/p&gt;
&lt;p&gt;This illustration&amp;rsquo;s difficulty stemmed from cultural differences. Flux, trained by a German team, clearly lacks Chinese clothing elements in its data. Prompting for a traffic officer directing traffic yielded a foreign-style uniform—unacceptable for a children&amp;rsquo;s book.&lt;/p&gt;
&lt;p&gt;Using text-to-image local inpainting (denoising 1) to request a blue short-sleeved Chinese traffic police shirt resulted in:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/75dcc6c3d624d2e3a9e4bac512cbec52.webp"
loading="lazy"
alt="A screenshot of Liblib platform’s content safety policy warning dialog blocking the image generation"
&gt;&lt;/p&gt;
&lt;p&gt;This is a Liblib restriction against generating content with potential legal risks. Prompts containing &amp;ldquo;police&amp;rdquo; or images resembling police uniforms trigger a block. While platforms without such restrictions exist, Liblib&amp;rsquo;s affordability makes it a good choice if you lack a powerful graphics card.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/1e5a122d6b5b91b43baaa2b43876f9be.webp"
loading="lazy"
alt="An AI-generated cartoon of the traffic officer wearing a plain light blue short-sleeved shirt and blue trousers"
&gt;&lt;/p&gt;
&lt;p&gt;Removing police-related terms, however, just produced an ordinary blue shirt, not a police uniform—a catch-22.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/2529da2758620d3dfeab11761351e3a8.webp"
loading="lazy"
alt="An illustration generated by Doubao AI showing the traffic officer wearing a realistic Chinese police uniform with a tie and epaulets"
&gt;&lt;/p&gt;
&lt;p&gt;Since Flux on Liblib was problematic, I tried other tools. Doubao&amp;rsquo;s Jimeng model lacks this restriction, and the results were decent, capturing the general look.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/54ee3fc5a4cfd8501d552646c75284c9.webp"
loading="lazy"
alt="An AI-generated cartoon of the officer in a Chinese uniform wearing a white non-standard peaked cap"
&gt;&lt;/p&gt;
&lt;p&gt;The white police cap was even trickier. Doubao couldn&amp;rsquo;t render it correctly either; it resembled something a high-end hotel parking attendant might wear. The distinct features of a white police cap were missing, significantly reducing resemblance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/c411868588a3d4ab82b96e0222b99569.webp"
loading="lazy"
alt="A side-by-side comparison of a green military peaked cap and a white traffic police peaked cap used as reference"
&gt;&lt;/p&gt;
&lt;p&gt;I found a police cap image at a roughly matching angle and Photoshopped it in. (Note: To avoid blocks, I first used PS to erase the police emblem, adding it back once AI processing was complete.) PS Content-Aware Fill easily removed the emblem.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/f74f6dd66e7b3d25c577c034a5702251.webp"
loading="lazy"
alt="An illustration generated using image reference showing the officer with the correct Chinese traffic police white peaked cap"
&gt;&lt;/p&gt;
&lt;p&gt;Positioned the hat correctly. It was still realistic at this stage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/6864713301b8fc20d04e43464f406aef.webp"
loading="lazy"
alt="A screenshot of Photoshop Filter Gallery applying Cutout filter to simplify the peaked cap vector style"
&gt;&lt;/p&gt;
&lt;p&gt;Applying the Cutout filter to the hat and reducing colors instantly gave it a flat style.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/3cc0c42436d29bbbdc801419b5132866.webp"
loading="lazy"
alt="The finalized cartoon illustration of the traffic officer with the correct peaked cap composited on his head"
&gt;&lt;/p&gt;
&lt;p&gt;Much less out of place. Problem solved. Other image issues had relatively stable fixes, so I won&amp;rsquo;t detail them.&lt;/p&gt;
&lt;h4 id="challenge-2-child-jumping-rope"&gt;Challenge 2: Child Jumping Rope
&lt;/h4&gt;&lt;p&gt;Key Techniques: &lt;strong&gt;Text-to-image local inpainting (low denoising), Style transfer, Puppet Warp&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/813b5f29f395b365d75a573510bbd525.webp"
loading="lazy"
alt="A 16-panel grid of AI-generated character sheets showing a boy in various athletic poses"
&gt;&lt;/p&gt;
&lt;p&gt;This illustration also pushed Flux&amp;rsquo;s limits. It clearly hadn&amp;rsquo;t seen many jump rope scenes, drawing children randomly waving ropes; even just &lt;em&gt;having&lt;/em&gt; a rope was a good start. Brute-forcing 16 images yielded no usable results.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/bf930d87fa1154fe17e4f2013413ac7e.webp"
loading="lazy"
alt="The original illustration of a boy jumping rope with both feet flat but looking artificially suspended"
&gt;&lt;/p&gt;
&lt;p&gt;No worries—if the pose is right, the rope can be added. This image had the most potential. A quick PS sketch of a jump rope started to look plausible.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/0bdd32c6089ae401973dd5a61ed22352.webp"
loading="lazy"
alt="ComfyUI workflow showing input image with one leg erased and the generated output with leg inpainted"
&gt;&lt;/p&gt;
&lt;p&gt;Using the style transfer workflow (denoising 0.7) largely preserved the original content, giving AI enough leeway to draw the rope more realistically.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/81994b8ebc515c2335c38ca88af4cd52.webp"
loading="lazy"
alt="A close-up of the boy’s hand in an illustration showing deformed fingers and a missing thumb holding the jump rope"
&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s discuss fixing hands. The child&amp;rsquo;s right hand is missing a thumb, or the thumb and index finger are merged. Direct inpainting here is tricky; AI often struggles with hands holding objects, and many retries might fail.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/7f160a7d5e857e979e5e921a5f50e7c0.webp"
loading="lazy"
alt="A close-up of the boy’s hand after upscaling and inpainting, showing normal fingers and a thumb"
&gt;&lt;/p&gt;
&lt;p&gt;AI struggles with small hand areas due to insufficient attention allocation. The key isn&amp;rsquo;t just local inpainting, but magnification. Zooming in provides clarity and detail, significantly increasing the success rate of fixing even mangled hands.&lt;/p&gt;
&lt;p&gt;However, Flux inpainting directly on a full high-res image is slow and deviates from its preferred generation size, leading to errors. The solution: crop out a 1024×1024 section to be fixed. This is Flux&amp;rsquo;s optimal size, ensuring good results. After fixing, paste it back.&lt;/p&gt;
&lt;p&gt;Accurate pasting is a pain. This is where a program for precise handling helps.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/d303746e3f41c2f46de76f0e0d4e843a.webp"
loading="lazy"
alt="A diagram showing the illustration divided into a grid with a yellow box highlighting the slice containing the hand"
&gt;&lt;/p&gt;
&lt;p&gt;Recall the x/y coordinate columns in the Feishu table; they&amp;rsquo;re part of my zoom, crop, and paste program. My cropping program divides an image into 5×5=25 overlapping 1024×1024 slices. I input the slice&amp;rsquo;s row/column numbers into the table. For example, here I took the slice from column 2 (x=2), row 3 (y=3), determined by eye. Running the program saves this slice.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/d9d292d343442ac6fc78f6f3b5e9a071.webp"
loading="lazy"
alt="A cropped image slice extracted using Python, focusing on the hand holding the jump rope"
&gt;&lt;/p&gt;
&lt;p&gt;Local inpainting on the sliced image succeeded on the first try. Adjust denoising as needed: higher for major issues, lower (as here, where posture was mostly correct) to avoid new problems.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/2ffdc82e5708f25cae0968d52104a34b.webp"
loading="lazy"
alt="The complete boy jump rope illustration after pasting the fixed hand slice back"
&gt;&lt;/p&gt;
&lt;p&gt;The accompanying pasting program accurately pastes the slice back onto the original image using the cropping stage&amp;rsquo;s row/column numbers.&lt;/p&gt;
&lt;p&gt;However, the character&amp;rsquo;s posture was still unnatural. The client felt the character standing on the ground didn&amp;rsquo;t look like they were jumping.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/80984f51c5c32d29452c2b77dcc9cb7e.webp"
loading="lazy"
alt="A close-up of Photoshop selection tool selecting the boy’s feet and lower legs with dashed outline"
&gt;&lt;/p&gt;
&lt;p&gt;PS Puppet Warp to the rescue. First, Quick Select the lower leg and foot, copy to a new layer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/98e84bc437e314249275cbf84aa844df.webp"
loading="lazy"
alt="A close-up of Photoshop Puppet Warp tool displaying mesh grid and pins on the boy’s leg layer"
&gt;&lt;/p&gt;
&lt;p&gt;Activate Puppet Warp, pin the joints.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/05505577b660903338c934e797ce976d.webp"
loading="lazy"
alt="The adjustment process in Photoshop using Puppet Warp to bend the leg backwards"
&gt;&lt;/p&gt;
&lt;p&gt;Pull the shoe back; the leg bends.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/51e37816517857e2a5e3de4aac977e63.webp"
loading="lazy"
alt="The finalized boy jump rope illustration with legs bent backward using Photoshop Puppet Warp"
&gt;&lt;/p&gt;
&lt;p&gt;Erase the original leg. Bent. (A small knee joint artifact and missing ground shadow remain; this is a tech demo, so minor issues are ignored.)&lt;/p&gt;
&lt;h4 id="challenge-3-willow-tree-in-a-storm"&gt;Challenge 3: Willow Tree in a Storm
&lt;/h4&gt;&lt;p&gt;Key Techniques: &lt;strong&gt;Style transfer, Doubao conversational editing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/c967b3025d11e60d1271281e25386eb2.webp"
loading="lazy"
alt="A 4-panel grid of AI-generated trees with straight vertical branches resembling banyan roots"
&gt;&lt;/p&gt;
&lt;p&gt;It drew a lush, leafy tree with straight, drooping branches, almost like banyan aerial roots.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/d30f4d7e5d46504b21a7d7c84489d6b7.webp"
loading="lazy"
alt="A 4-panel grid of realistic photos showing willow trees with straight hanging branches generated without style Lora"
&gt;&lt;/p&gt;
&lt;p&gt;To check if Flux didn&amp;rsquo;t recognize willows or if my style Lora was the culprit, I turned off Lora, removed style prompts, and generated a realistic photo. Flux genuinely didn&amp;rsquo;t recognize willow trees.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/e2056a4798b13e462a1b5e9aba516a42.webp"
loading="lazy"
alt="The initial AI-generated illustration of a willow tree in the rain selected for editing"
&gt;&lt;/p&gt;
&lt;p&gt;Alright, let&amp;rsquo;s modify this one.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/ddd14ff6641e1ee25127d9a1840b3de9.webp"
loading="lazy"
alt="The background illustration showing only dark clouds, rain, and riverbank after erasing the tree"
&gt;&lt;/p&gt;
&lt;p&gt;First, Doubao conversational editing to remove the tree, leaving the background.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/d92d942175df1ade53b3e4d04be7051f.webp"
loading="lazy"
alt="A black and white silhouette vector material of a willow tree bending in strong wind"
&gt;&lt;/p&gt;
&lt;p&gt;Next, create an illustrative-style willow with distinct branches. Quickest way: find online materials.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/f996ddb5918e02a4147cb641585b69a6.webp"
loading="lazy"
alt="The colored illustration of the bending willow tree with a brown trunk and green leaves"
&gt;&lt;/p&gt;
&lt;p&gt;Doubao conversational editing to colorize the willow.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/ef9fd27e8d5ce4ab25be8f3e2cd5f236.webp"
loading="lazy"
alt="The roughly composited image in Photoshop combining the colored willow tree and the rainy background"
&gt;&lt;/p&gt;
&lt;p&gt;Roughly composite in PS.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/0c045d3499a461388ba0da3b73e0580b.webp"
loading="lazy"
alt="A 3-panel comparison of the image-to-image translation process with low denoise to blend the composited elements"
&gt;&lt;/p&gt;
&lt;p&gt;A few rounds of low denoising style transfer (0.3) made it look quite natural.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/d940674731cde3d2882dd0d831919279.webp"
loading="lazy"
alt="The finalized cartoon illustration of the willow tree in a storm with brightened leaves"
&gt;&lt;/p&gt;
&lt;p&gt;Finally, lighten the willow leaves to prevent blending with dark clouds. (Raindrop direction is still wrong; should follow wind. This should&amp;rsquo;ve been removed during background separation and replaced with stock material. Ignored for now.)&lt;/p&gt;
&lt;h4 id="challenge-4-classroom-cleanup"&gt;Challenge 4: Classroom Cleanup
&lt;/h4&gt;&lt;p&gt;Key Techniques: &lt;strong&gt;Text-to-image local inpainting (high denoising), Image-to-image local inpainting, Style transfer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/578d5efac9246d9c58ceb283d5c6ec0e.webp"
loading="lazy"
alt="A 4-panel grid of AI-generated draft illustrations of children cleaning a classroom showing structural errors"
&gt;&lt;/p&gt;
&lt;p&gt;This scene needed one child cleaning a window while others cleaned elsewhere. AI struggles with such complex multi-character scenes: illogical actions, missing limbs on furniture, no usable images.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/ce465b01e62e61cdada1358b5a67c56a.webp"
loading="lazy"
alt="A hand-drawn vector illustration material of children cleaning a classroom used as reference"
&gt;&lt;/p&gt;
&lt;p&gt;Instead of fixing problems individually, style transfer from a real photo or hand-drawn illustration is better. Their characters and environments are at least reasonable. Minor issues from style transfer are easier to fix than generating from scratch.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/f6c9dc079eace191a3f46fcb781a59ec.webp"
loading="lazy"
alt="The illustration of children cleaning a classroom generated in style using high denoise"
&gt;&lt;/p&gt;
&lt;p&gt;Denoising set to 1 corrected the style.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/7540b49eb356dfb07dc5a09ff20f38e9.webp"
loading="lazy"
alt="ComfyUI workflow showing a masked area replaced with a modern red plastic basin"
&gt;&lt;/p&gt;
&lt;p&gt;The basin was too old-fashioned; replaced with a modern one. (Basin too deep, hand missing—fixable later.) Other minor issues resolved with simple patching.&lt;/p&gt;
&lt;p&gt;This image has fewer problems than the client&amp;rsquo;s version. A typical issue not present here was the rag&amp;rsquo;s shape.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/2d389e03b7309c44d970a373bbb9289a.webp"
loading="lazy"
alt="A close-up of a messy, mop-like purple rag generated due to the word rag in the prompt"
&gt;&lt;/p&gt;
&lt;p&gt;In a client WIP, the rag looked like this. The prompt &amp;ldquo;rag&amp;rdquo; (meaning cleaning cloth) can also mean a tattered piece, so Flux drew this messy bundle, like a mop head.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-05/f20f4461d8bec868d37203ab6abdb97b.webp"
loading="lazy"
alt="A close-up of a normal, neatly folded blue cleaning cloth generated by changing the prompt to cloth"
&gt;&lt;/p&gt;
&lt;p&gt;Using text-to-image local inpainting with &amp;ldquo;a piece of cloth&amp;rdquo; yielded a more normal rag. Sometimes, it&amp;rsquo;s not that AI &lt;em&gt;can&amp;rsquo;t&lt;/em&gt; draw it, but that the right prompt hasn&amp;rsquo;t been found.&lt;/p&gt;
&lt;p&gt;Manual editing encountered more tricky problems than these, but combining the listed techniques eventually solved them all.&lt;/p&gt;
&lt;p&gt;△ △ △ 🔮 Tech Talk Ends 🔮 △ △ △&lt;/p&gt;
&lt;h2 id="closing-shop"&gt;Closing Shop
&lt;/h2&gt;&lt;p&gt;After this order, I assessed the revision volume and time spent, and decided to stop taking orders. The reason was simple: too many revisions, tight timeline. A single part-time illustrator wasn&amp;rsquo;t enough; a full-time one was needed. Even if I gave all profit to a full-time illustrator, their income might still be less than a regular job. Who&amp;rsquo;d do that? Multiple part-timers would mean excessive communication overhead and staff turnover issues.&lt;/p&gt;
&lt;p&gt;All things considered, the business lacked sufficient leverage. Better to quit while ahead.&lt;/p&gt;
&lt;p&gt;This complex image generation workflow—conception, building, debugging—took two weeks. But it wasn&amp;rsquo;t wasted. Minor modifications can adapt it for other uses, ready for reactivation.&lt;/p&gt;
&lt;h2 id="epilogue"&gt;Epilogue
&lt;/h2&gt;&lt;p&gt;This was an intensive experience using AI on a real project, highlighting its productivity boost and the gap to stable commercial use.&lt;/p&gt;
&lt;p&gt;With the project done and some breathing room, I&amp;rsquo;m reflecting on the process. It&amp;rsquo;s still astounding, especially doing everything myself. I never imagined children&amp;rsquo;s illustrations could be (partially) mass-produced with AI, nor that AI could enable a non-drawer like me to do more than half an illustrator&amp;rsquo;s work.&lt;/p&gt;
&lt;p&gt;Ultimately, AI is about solving problems, not using AI for its own sake. At this stage, AI isn&amp;rsquo;t a panacea. Traditional methods must reliably support areas AI can&amp;rsquo;t handle. AI is flexible and random; traditional methods are rigid and deterministic. Combining them is like sculpting with clay: all clay is soft and hard to shape, but clay molded around a wooden core is both stable and detailed.&lt;/p&gt;
&lt;p&gt;I respect artisans creating lifelike clay sculptures, but I&amp;rsquo;d rather make money mass-producing wooden cores in a factory.&lt;/p&gt;</description></item><item><title>Using Liblib ComfyUI Workflows with Zero Experience</title><link>https://victor42.eth.limo/post-en/comfyui-workflow-tutorial-for-newbies/</link><pubDate>Thu, 27 Feb 2025 12:15:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/comfyui-workflow-tutorial-for-newbies/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2025-02/65e10ec43957abff3dbb183248e33bd3.webp" alt="Featured image of post Using Liblib ComfyUI Workflows with Zero Experience" /&gt;&lt;p&gt;&lt;a class="link" href="https://www.liblib.art/workflows" target="_blank" rel="noopener"
&gt;LiblibAI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Liblib offers many free workflows for tasks regular image generators can&amp;rsquo;t handle, like &lt;strong&gt;face-swapping, dressing up models, adding lighting and backgrounds to product photos, and creating memes&lt;/strong&gt;. You get free generations daily, and you can pay for more if needed.&lt;/p&gt;
&lt;p&gt;ComfyUI is essentially an image generation program. Don&amp;rsquo;t worry about the details now:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/65e10ec43957abff3dbb183248e33bd3.webp"
loading="lazy"
alt="A panoramic screenshot of a complex ComfyUI node-based workflow interface"
&gt;&lt;/p&gt;
&lt;p&gt;Liblib&amp;rsquo;s workflows are based on ComfyUI. You don&amp;rsquo;t need to know how to create them, but you should know how to use them. There are three common scenarios:&lt;/p&gt;
&lt;h2 id="1-the-workflow-is-packaged-as-an-app-youll-see-a-specific-button"&gt;1️⃣ The workflow is packaged as an app (you&amp;rsquo;ll see a specific button)
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/46c26df9a8577c9cdf77aae4af49f1f1.webp"
loading="lazy"
alt="A screenshot of the blue Run Application button on Liblib platform"
&gt;&lt;/p&gt;
&lt;p&gt;Click it, and you&amp;rsquo;re set. It&amp;rsquo;s straightforward, and you won&amp;rsquo;t see the underlying program.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/caefee5ee6854594b0e273f148ddbc46.webp"
loading="lazy"
alt="A diagram showing the user interface of a packed app on Liblib, with arrows indicating how to upload an image and generate"
&gt;&lt;/p&gt;
&lt;h2 id="2-its-not-an-app-and-you-see-a-light-blue-run-button"&gt;2️⃣ It&amp;rsquo;s not an app, and you see a light blue &amp;ldquo;Run&amp;rdquo; button
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/421edc7a9ebe6cf69aa23245d5d0ea01.webp"
loading="lazy"
alt="A screenshot of the light blue Run in ComfyUI button on Liblib platform"
&gt;&lt;/p&gt;
&lt;p&gt;Clicking this takes you to the ComfyUI interface, a black screen that might take a moment to load. It can look complex, like a circuit board.&lt;/p&gt;
&lt;p&gt;However, creators usually include instructions. These vary, so find and read them carefully. Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/7d652a7e19399a3c53683aa792a38bb7.webp"
loading="lazy"
alt="A screenshot of custom image upload and instruction cards added by the workflow creator in Liblib ComfyUI"
&gt;&lt;/p&gt;
&lt;h2 id="3-you-see-a-light-blue-view-workflow-button-but-no-instructions"&gt;3️⃣ You see a light blue &amp;ldquo;View Workflow&amp;rdquo; button, but no instructions
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/b78bb6863e56b1c86be4bfd3feb0a5d5.webp"
loading="lazy"
alt="A screenshot of the blue View Workflow button on Liblib platform"
&gt;&lt;/p&gt;
&lt;p&gt;This likely means the creator didn&amp;rsquo;t add instructions. Check if the workflow is overly complex.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tip: Zoom with the mouse wheel, and drag by holding the spacebar.&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If it seems simple, with few components, there&amp;rsquo;s hope. Find these two key node types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image upload node: (look for the &amp;ldquo;choose file to upload&amp;rdquo; button): &lt;img src="https://cdn.victor42.work/posts/2025-02/88465060dc6397b6e62a5bfca4b1d89f.webp"
loading="lazy"
alt="A close-up of a ComfyUI Load Image node with the choose file to upload button outlined in red"
&gt;&lt;/li&gt;
&lt;li&gt;Text input node: (look for a black input box for prompts): &lt;img src="https://cdn.victor42.work/posts/2025-02/09dbc0f7779d7896470f8ffc876d936d.webp"
loading="lazy"
alt="A close-up of a ComfyUI CLIP Text Encode node with the text input box outlined in red"
&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upload images, write text, and click &amp;ldquo;Run.&amp;rdquo; It should work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it&amp;rsquo;s too complicated, with many image and text nodes, find a similar workflow with instructions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="-troubleshooting-errors"&gt;⚠️ Troubleshooting Errors
&lt;/h2&gt;&lt;p&gt;You might encounter errors:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/1ae88573acbc157fb7bf1443a68dcb25.webp"
loading="lazy"
alt="A screenshot of ComfyUI Value not in list error popup indicating missing models"
&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t worry! Close the error; the program will highlight the problem node in red:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/c024ed1135e6e390d941dfa607010b77.webp"
loading="lazy"
alt="A screenshot of ComfyUI editor showing faulty nodes outlined in red with red pointing arrows"
&gt;&lt;/p&gt;
&lt;p&gt;Zoom in. It&amp;rsquo;s usually a node for loading an AI model:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/53f255d839ade35227ea9c02e782517b.webp"
loading="lazy"
alt="A close-up of a ComfyUI DualCLIPLoader node outlined in red indicating a model loading error"
&gt;&lt;/p&gt;
&lt;p&gt;The creator likely used their local file names for models. On Liblib, the names might differ, causing the node to fail.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the fix: Note the names of each option, especially the part before the decimal (the model name). Click on each model and select the closest match from the dropdown (exact matches are best):&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-02/c460eab80d6db0ff96dac59993a8ca9e.webp"
loading="lazy"
alt="A screenshot showing selection of the correct model name from the dropdown menu in DualCLIPLoader"
&gt;&lt;/p&gt;
&lt;p&gt;Reselect models for all faulty nodes, then run it again.&lt;/p&gt;
&lt;p&gt;If you can&amp;rsquo;t find a match, search on &lt;a class="link" href="https://www.liblib.art/" target="_blank" rel="noopener"
&gt;Liblib&amp;rsquo;s Model Plaza&lt;/a&gt;, add it to your library, and it&amp;rsquo;ll appear in the dropdown.&lt;/p&gt;
&lt;p&gt;This solves most errors.&lt;/p&gt;</description></item><item><title>Why My Wife and Colleagues Always Ask Me to Search Stuff</title><link>https://victor42.eth.limo/post-en/3654/</link><pubDate>Wed, 28 Aug 2024 14:07:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3654/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2024-08/6cab50470236b0d2d7a8937ab39753e1.jpg" alt="Featured image of post Why My Wife and Colleagues Always Ask Me to Search Stuff" /&gt;&lt;p&gt;Effective searching is a key soft skill. Today&amp;rsquo;s search engines are smart – usually, you can just ask a question naturally and find what you need. But for niche or obscure searches, advanced techniques are essential.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/ae0a9d5c1dfef1b0d70540336bd07a4b.jpg"
loading="lazy"
alt="Card explaining the double quotes operator for exact phrase matching in search engines"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/ee9c494746441ee6a6cb71f68c9e6a43.jpg"
loading="lazy"
alt="Card explaining the minus sign operator to exclude specific terms from search results"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/1dd02eb2eccccadf6306bb4a09dd7fbc.jpg"
loading="lazy"
alt="Card explaining the asterisk wildcard operator for fuzzy matching in search engines"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/c0276387251a6a8b8576489ade53a81c.jpg"
loading="lazy"
alt="Card explaining the double period operator to specify a numeric range in searches"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/6cab50470236b0d2d7a8937ab39753e1.jpg"
loading="lazy"
alt="Card explaining the site operator to restrict search results to a specific website domain"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/6d5a487a91e3929c9e52af1e2689def2.jpg"
loading="lazy"
alt="Card explaining the inurl operator to find web pages with specific words in their URLs"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/35c3b2f7671d6edcaff1e4e9b746d27d.jpg"
loading="lazy"
alt="Card explaining the allinurl operator to require multiple terms in page URLs"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/85607a7da3345eb6154f0e481accabe3.jpg"
loading="lazy"
alt="Card explaining the intitle operator to search for pages containing a specific word in the title"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/646eef958a738e581e01cb5fb8c1671b.jpg"
loading="lazy"
alt="Card explaining the allintitle operator to search for pages containing multiple words in the title"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/dda05a8d1cfd65bbf00b542f2bea3e2e.jpg"
loading="lazy"
alt="Card explaining the inanchor operator to search for pages with specific anchor text in incoming links"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/927e59712c54cecb93d61eb23c646e23.jpg"
loading="lazy"
alt="Card explaining the filetype operator to search for specific file formats like PDF or documents"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/ccb0dd4f7c40b174d968f332b4c58be9.jpg"
loading="lazy"
alt="Card explaining the related operator to find alternative or similar website domains"
&gt;&lt;/p&gt;
&lt;p&gt;The techniques are simple: a few commands and some clever combinations. Experiment, understand their function, and memorize them. Used together, they unlock information others miss.&lt;/p&gt;
&lt;p&gt;AI search is trendy, but it doesn&amp;rsquo;t replace traditional search engines – it &lt;em&gt;uses&lt;/em&gt; them. When AI fails on obscure queries, manual searching is your safety net.&lt;/p&gt;
&lt;p&gt;Ultimately, the right mindset matters more than technical skill. Consider these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Surely someone has more experience, right?&lt;/li&gt;
&lt;li&gt;Someone&amp;rsquo;s faced this problem before, right?&lt;/li&gt;
&lt;li&gt;Someone&amp;rsquo;s got to be smarter than me, right?&lt;/li&gt;
&lt;li&gt;Someone must have a solution, right?&lt;/li&gt;
&lt;li&gt;Isn&amp;rsquo;t finding that solution easier than starting from scratch?&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Fed Up with News Apps, I Added Some AI</title><link>https://victor42.eth.limo/post-en/3652/</link><pubDate>Tue, 13 Aug 2024 13:31:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3652/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2024-08/90415a2f2e2fa7829fae2a10f117f392.jpg" alt="Featured image of post Fed Up with News Apps, I Added Some AI" /&gt;&lt;p&gt;&lt;strong&gt;Note: This article involves Tasker, AI, front-end development, and automation. It&amp;rsquo;s a bit technical.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m all about avoiding low-value information. I usually follow specific channels for my interests, but I also need a way to catch major events in other fields, to avoid getting stuck in an echo chamber.&lt;/p&gt;
&lt;p&gt;I used to listen to the radio while driving my family around, to get the news. The info fell into two categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Useless: Sports, entertainment, and military news (often unreliable or biased).&lt;/li&gt;
&lt;li&gt;Potentially useful, but I had to listen to find out: Social news, trends, and tech-related social phenomena. Of course, much of it was fluff, like a celebrity hit-and-run.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During the Paris Olympics, my news time was swamped with Olympics coverage. I had to keep glancing at my car&amp;rsquo;s screen to skip stories, which was unsafe and annoying.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tried many news apps with audio. The headlines channels were full of uninteresting stuff. Subscribing to specific channels meant long, in-depth reports – not ideal for a short drive. Update frequencies also varied wildly; some channels would dominate, effectively silencing others.&lt;/p&gt;
&lt;p&gt;Then it hit me: I can usually tell if a story is interesting just from the headline. Why not use AI for this? Could I filter out unwanted stories from a headlines channel?&lt;/p&gt;
&lt;p&gt;The idea stuck.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;p&gt;It wasn&amp;rsquo;t technically difficult, but I couldn&amp;rsquo;t find anything like it. Maybe it&amp;rsquo;s too niche, so I built it myself!&lt;/p&gt;
&lt;p&gt;My phone was the obvious choice, since that&amp;rsquo;s where I listen to news. This avoids relying on other devices. What if I&amp;rsquo;m on vacation? Luckily, I&amp;rsquo;m familiar with Tasker, an Android app that&amp;rsquo;s essentially programming software.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fetch the day&amp;rsquo;s top news.&lt;/li&gt;
&lt;li&gt;Use AI to categorize headlines.&lt;/li&gt;
&lt;li&gt;Filter out unwanted categories, saving the rest as text.&lt;/li&gt;
&lt;li&gt;Convert the text to audio.&lt;/li&gt;
&lt;li&gt;Automate this to run nightly.&lt;/li&gt;
&lt;li&gt;Create a playlist for the audio news.&lt;/li&gt;
&lt;li&gt;Auto-start the player when connected to my car&amp;rsquo;s Bluetooth.&lt;/li&gt;
&lt;li&gt;Clear old news daily.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="building-blocks"&gt;Building Blocks
&lt;/h2&gt;&lt;p&gt;This sounds complex, but I didn&amp;rsquo;t have to reinvent the wheel. I just needed to integrate existing tools. I created small modules (subtasks) for the core functions, ready for assembly.&lt;/p&gt;
&lt;h3 id="tasker-intro"&gt;Tasker Intro
&lt;/h3&gt;&lt;p&gt;Tasker is the backbone. It&amp;rsquo;s an automation tool that lets you combine hardware control, math, file operations, network requests, and logic into workflows. Think iPhone Shortcuts, but much more powerful – it&amp;rsquo;s programming software.&lt;/p&gt;
&lt;p&gt;Basic usage is simple: mute the phone on company Wi-Fi, or start music on Bluetooth connection. More advanced uses, like file operations and network requests, require programming logic, but no actual coding.&lt;/p&gt;
&lt;h3 id="fetching-content"&gt;Fetching Content
&lt;/h3&gt;&lt;p&gt;The first subtask browses the news source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: News source link&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: Code with the news list&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/7c717fff18ada6917cc6ddb9ab5acab4.jpg"
loading="lazy"
alt="Tasker task edit screen showing configuration for HTTP Request action"
&gt;&lt;/p&gt;
&lt;p&gt;It uses Tasker&amp;rsquo;s HTTP request. I just passed the info to the outer task. Wrapping it in a layer relates to subtask execution priority, which I&amp;rsquo;ll explain later.&lt;/p&gt;
&lt;h3 id="parsing-xml"&gt;Parsing XML
&lt;/h3&gt;&lt;p&gt;RSS news feeds provide XML, not directly readable news.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/d9b55eddd9d7d7e26b86fffe3dc56a1f.jpg"
loading="lazy"
alt="A screenshot of raw XML code structure from a Chinese news RSS feed"
&gt;&lt;/p&gt;
&lt;p&gt;RSS is standardized. Each news item is an &amp;ldquo;item,&amp;rdquo; with &amp;ldquo;title,&amp;rdquo; &amp;ldquo;link,&amp;rdquo; and &amp;ldquo;description&amp;rdquo; tags.&lt;/p&gt;
&lt;p&gt;Before parsing, I standardized the XML. Webpages sometimes use escaped characters (e.g., &lt;code&gt;&amp;lt;&lt;/code&gt; as &lt;code&gt;&amp;amp;lt;&lt;/code&gt;). This subtask converts them back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: XML with escaped characters&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: Standard XML&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/c117f68d572158b87dc54acd03427ad3.jpg"
loading="lazy"
alt="Tasker task edit screen for replacing escaped XML entity characters"
&gt;&lt;/p&gt;
&lt;p&gt;Next, parsing. This subtask extracts content from specific XML tags, separating them with &lt;code&gt;|||&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: Full XML, tag to extract&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: All content within that tag&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/97c487fda93b7ef67d871a58ebd06721.jpg"
loading="lazy"
alt="Tasker task edit screen for extracting content of sibling XML tags"
&gt;&lt;/p&gt;
&lt;p&gt;I use it to find all &amp;ldquo;item&amp;rdquo; tags (the news list). The outer task passes &amp;ldquo;item&amp;rdquo; as %par2, getting all news items separated by &lt;code&gt;|||&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="extracting-content-from-html"&gt;Extracting Content from HTML
&lt;/h3&gt;&lt;p&gt;The previous subtask gets the news list, but only the title and link are really useful. &amp;ldquo;Description&amp;rdquo; varies; some sources include the full text, others just a summary, with the full text on a details page.&lt;/p&gt;
&lt;p&gt;This subtask extracts content from a page&amp;rsquo;s HTML, removing menus, comments, ads, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: Full HTML, tag to extract&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: First content within that tag&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/0f45bc228aba2af149ceeb0c69a67907.jpg"
loading="lazy"
alt="Tasker task edit screen for extracting content of the first matching HTML tag"
&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s complex because of nested HTML tags. It finds the tag&amp;rsquo;s end to define the content range, using string manipulation to mimic Javascript&amp;rsquo;s &lt;code&gt;innerHTML&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The result is still HTML, so another subtask converts it to plain text – a built-in Tasker feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: HTML code&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: Text content&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/75b7ba16f35c56d3bb121026e9098eeb.jpg"
loading="lazy"
alt="Reconstructed Tasker action for converting HTML formatting into plain text"
&gt;&lt;/p&gt;
&lt;h3 id="ai-classification"&gt;AI Classification
&lt;/h3&gt;&lt;p&gt;This is the core: the program&amp;rsquo;s brain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: Content for AI, AI model name&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: AI response&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/05c6c50a2cba1cad021f550344301002.jpg"
loading="lazy"
alt="Tasker task edit screen showing HTTP Post configuration for Groq API call"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://console.groq.com/playground" target="_blank" rel="noopener"
&gt;Groq&amp;rsquo;s API&lt;/a&gt; is great, offering many open-source AI models. It&amp;rsquo;s simple: send text, get generated text back. The 2-second wait is due to the API&amp;rsquo;s 30 calls/minute limit.&lt;/p&gt;
&lt;h3 id="text-to-speech"&gt;Text to Speech
&lt;/h3&gt;&lt;p&gt;This subtask converts text files to audio in batches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: Text file directory, audio output directory&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: Batch of audio files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/c1dabc63612d30a30e611297c14b6493.jpg"
loading="lazy"
alt="Tasker task edit screen showing the workflow for bulk text to speech synthesis"
&gt;&lt;/p&gt;
&lt;p&gt;It uses Tasker&amp;rsquo;s &amp;ldquo;Say To File,&amp;rdquo; saving text as audio. &amp;ldquo;Say To File&amp;rdquo; is just the operation; the speech synthesis engine isn&amp;rsquo;t built-in.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/995e0fb18649e334014f111ea8be2b8d.jpg"
loading="lazy"
alt="A screenshot of Google Speech Recognition and Synthesis app page in Play Store"
&gt;&lt;/p&gt;
&lt;p&gt;I used Google&amp;rsquo;s local engine. Download the app from Google Play, and Tasker can use it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/07e0c2612c68af093e0a4e5c942ab102.jpg"
loading="lazy"
alt="A screenshot of Tasker settings window for choosing preferred text to speech engine"
&gt;&lt;/p&gt;
&lt;p&gt;The local engine is comparable to map software&amp;rsquo;s default voice. Google&amp;rsquo;s is decent, better than iFlytek&amp;rsquo;s, but still robotic.&lt;/p&gt;
&lt;h2 id="putting-the-pieces-together"&gt;Putting the Pieces Together
&lt;/h2&gt;&lt;p&gt;Now that we have our tools, and most of the hard parts are solved, let&amp;rsquo;s assemble everything.&lt;/p&gt;
&lt;h3 id="downloading-and-filtering-news"&gt;Downloading and Filtering News
&lt;/h3&gt;&lt;p&gt;First, we&amp;rsquo;ll build the core task: downloading news from a single source, filtering it, and saving it as text files. This is the heart of the process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input: News source URL, HTML tag containing the article body&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Output: News text files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I added a shortcut for the second input. If you enter &lt;code&gt;&amp;lt;description&amp;gt;&lt;/code&gt;, it uses the description from the XML instead of fetching the article&amp;rsquo;s detail page. This works best with high-quality news sources, and you can set it in the parent task.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/64acc1961ddd336d05f0b9aba63739ec.jpg"
loading="lazy"
alt="Reconstructed Tasker screen showing initialization of the RSS news download task"
&gt;&lt;/p&gt;
&lt;p&gt;We fetch the full XML, clean up escaped characters, and remove some special content tags. Then, we extract the news list.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/b52349abcd5a92bb918c797c3043868a.jpg"
loading="lazy"
alt="Tasker task edit screen for splitting the downloaded RSS items into arrays"
&gt;&lt;/p&gt;
&lt;p&gt;The news list is split into an array. We set up the AI prompt and a maximum article length (to avoid overly long articles). Then, we loop through each news item, read and convert the title to plain text, and send it to the AI for categorization.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/ba4c7edd6576c053b69d271d37f2bd88.jpg"
loading="lazy"
alt="A screenshot of setting AI parameters and prompts inside a Tasker action"
&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the AI prompt. I kept it simple, just telling it what to do. Groq&amp;rsquo;s Gemma2 9b model works well for Chinese text, better than Llama3. A small open-source model is perfect for this, and it hasn&amp;rsquo;t made any mistakes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/3e5a40b3c15e4e3661f026de131b45f0.jpg"
loading="lazy"
alt="Tasker task edit screen for filtering news types and writing texts to storage"
&gt;&lt;/p&gt;
&lt;p&gt;We filter out sports, entertainment, and military news based on the AI&amp;rsquo;s categorization. Then, we get the news detail page link, fetch the full HTML, clean it up, and extract the content using the specified HTML tag.&lt;/p&gt;
&lt;p&gt;We convert the article body from HTML to text, check its length, and filter out anything too long or short (likely image-based news). The remaining articles are saved as text files.&lt;/p&gt;
&lt;h3 id="priority-issues"&gt;Priority Issues
&lt;/h3&gt;&lt;p&gt;During debugging, I couldn&amp;rsquo;t get content consistently. It took a while to realize the subtasks were running in parallel.&lt;/p&gt;
&lt;p&gt;Tasker&amp;rsquo;s core feature, &amp;ldquo;Perform Task,&amp;rdquo; runs a subtask within the current task, passing data and receiving results.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s like function calls in programming. Tasker limits you to two parameters, but you can combine multiple parameters into a string using a separator, then split them in the subtask. This allows for any number of parameters. This nesting lets you build complex logic, making &amp;ldquo;Perform Task&amp;rdquo; a key programming feature in Tasker.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/9fe1b7073ff0b94fab2859978f94ec9f.jpg"
loading="lazy"
alt="A screenshot of Tasker built-in documentation about Perform Task execution priority"
&gt;&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Perform Task&amp;rdquo; documentation mentions execution order. The parent task doesn&amp;rsquo;t wait for a triggered subtask to finish before continuing. Many of my subtasks fetch content or loop through page code, which takes time. If the parent task proceeds before the subtask returns a result, things break.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/1091748819015f7296ec93d7500e5475.jpg"
loading="lazy"
alt="A screenshot of configuring priority expression inside Tasker Perform Task action"
&gt;&lt;/p&gt;
&lt;p&gt;Following the documentation, I set the subtask&amp;rsquo;s Priority to %priority+1 (one higher than the parent). This forces the parent task to wait.&lt;/p&gt;
&lt;h3 id="downloading-news-from-multiple-sources"&gt;Downloading News from Multiple Sources
&lt;/h3&gt;&lt;p&gt;That was a complex task! Now, let&amp;rsquo;s use it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/a0a90a2ca998bca90156e3cfe59040b5.jpg"
loading="lazy"
alt="Tasker task edit screen showing multiple actions calling different news feeds"
&gt;&lt;/p&gt;
&lt;p&gt;I pass my RSS feeds and article body locations to the core task. It runs for each source.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/d6d37dbe8a8195e2d6c7674104fc533f.jpg"
loading="lazy"
alt="Tasker task edit screen for launching the bulk text to speech subtask"
&gt;&lt;/p&gt;
&lt;p&gt;Then, I created a separate task for batch conversion to speech, specifying the input (text news) and output (audio news) directories.&lt;/p&gt;
&lt;h3 id="scheduled-downloads-and-conversion"&gt;Scheduled Downloads and Conversion
&lt;/h3&gt;&lt;p&gt;These are the tasks, but how do they run? On Tasker&amp;rsquo;s Profiles page, you can add triggers for your tasks.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/bf1751cc5b2863826ff82d819e8b8859.jpg"
loading="lazy"
alt="Tasker profiles page showing a scheduled trigger at 4:00 AM for downloading news"
&gt;&lt;/p&gt;
&lt;p&gt;Every day at 4 AM, save all news as text files (takes 5-10 minutes).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/e1f5ef475b315060c9a3679f7a0e0603.jpg"
loading="lazy"
alt="Tasker profiles page showing a scheduled trigger at 5:00 AM for voice synthesis"
&gt;&lt;/p&gt;
&lt;p&gt;Every day at 5 AM, convert the text news to audio.&lt;/p&gt;
&lt;h2 id="the-final-result"&gt;The Final Result
&lt;/h2&gt;&lt;p&gt;When I wake up, there are two folders in the News directory.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/7add1606a97bddcc6fdee7af42f71cb1.jpg"
loading="lazy"
alt="A screenshot of file manager showing text and audio subfolders inside News directory"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;text&lt;/code&gt; contains the text versions, which I can share.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/4d00497b3a8e5554ff90aeccfe11dcbd.jpg"
loading="lazy"
alt="A screenshot of file manager listing generated news audio files"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;audio&lt;/code&gt; contains the audio news. Some local news still gets in, but the AI is doing its job filtering out sports.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/fb2a13c2d652d15b0653f2e39be0beea.jpg"
loading="lazy"
alt="A screenshot of AIMP music player menu with daily news playlist selected"
&gt;&lt;/p&gt;
&lt;p&gt;I created a &amp;ldquo;Daily News&amp;rdquo; playlist in my music player to read the &lt;code&gt;audio&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/90415a2f2e2fa7829fae2a10f117f392.jpg"
loading="lazy"
alt="A screenshot of AIMP music player main interface showing imported daily news audio tracks"
&gt;&lt;/p&gt;
&lt;p&gt;Updating the content brings in the day&amp;rsquo;s news. I still have to update it manually, but I&amp;rsquo;m working on automating that.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/0023ce1bc26cb0c58b78cab5d834c033.jpg"
loading="lazy"
alt="Tasker profile configuration for playing news based on variable value and time condition"
&gt;&lt;/p&gt;
&lt;p&gt;Playback is automatic. My car&amp;rsquo;s Bluetooth connection opens the player, and I use &lt;a class="link" href="https://play.google.com/store/search?q=AIMP&amp;amp;c=apps" target="_blank" rel="noopener"
&gt;AIMP player&lt;/a&gt;, which auto-plays on open. No interaction needed.&lt;/p&gt;
&lt;p&gt;Finally, a task clears the news folders at 3 AM daily, preparing for the next cycle.&lt;/p&gt;
&lt;h2 id="epilogue"&gt;Epilogue
&lt;/h2&gt;&lt;p&gt;My homemade news program has been working great for a few days. I can drive without distraction. The robotic voice is the only minor issue. I might replace &amp;ldquo;Say To File&amp;rdquo; with a better TTS API later.&lt;/p&gt;
&lt;p&gt;This process solved a problem and gave me reusable subtasks. The subtasks for fetching content, parsing XML, extracting HTML, and querying AI are generic. I can now build other programs, create web scrapers, and even AI agents on my phone. Mobile scraping is great: no server costs, and it runs 24/7. I&amp;rsquo;ll explore it further as needed.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;p&gt;The more complex Tasks are shared publicly for free use. Simpler Tasks are omitted, as they can be built using Tasker&amp;rsquo;s built-in features.&lt;/p&gt;
&lt;p&gt;Bulk TTS:
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3ABulk&amp;#43;TTS" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3ABulk+TTS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fix XML format:
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AFix&amp;#43;XML&amp;#43;format" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AFix+XML+format&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;API- Groq (enter your key):
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AAPI&amp;#43;-&amp;#43;Groq&amp;#43;%28enter&amp;#43;your&amp;#43;key%29" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AAPI+-+Groq+%28enter+your+key%29&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fix file name:
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AFix&amp;#43;file&amp;#43;name" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AFix+file+name&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Get inner XML(all siblings):
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AGet&amp;#43;inner&amp;#43;XML%28all&amp;#43;siblings%29" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AGet+inner+XML%28all+siblings%29&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Get inner XML(first match):
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AGet&amp;#43;inner&amp;#43;XML%28first&amp;#43;match%29" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3AGet+inner+XML%28first+match%29&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download specific categories of news from RSS:
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3A%E4%BB%8ERSS%E4%B8%8B%E8%BD%BD%E7%89%B9%E5%AE%9A%E5%88%86%E7%B1%BB%E6%96%B0%E9%97%BB" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3A%E4%BB%8ERSS%E4%B8%8B%E8%BD%BD%E7%89%B9%E5%AE%9A%E5%88%86%E7%B1%BB%E6%96%B0%E9%97%BB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download news from multiple channels:
&lt;a class="link" href="https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3A%E5%A4%9A%E6%B8%A0%E9%81%93%E4%B8%8B%E8%BD%BD%E6%96%B0%E9%97%BB" target="_blank" rel="noopener"
&gt;https://taskernet.com/shares/?user=AS35m8mopd%2Bc1C7UhZNzgAc6Ld0oCTR8LzUJsfqb7SGyZq7NWeHANGDjDvTtBPSkNCjn3CrFQoI%3D&amp;amp;id=Task%3A%E5%A4%9A%E6%B8%A0%E9%81%93%E4%B8%8B%E8%BD%BD%E6%96%B0%E9%97%BB&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="follow-up"&gt;Follow-up
&lt;/h2&gt;&lt;p&gt;I rebuilt this using Google Apps Scripts to handle features that were tricky in Tasker. It&amp;rsquo;s now cloud-deployed and scheduled to run silently overnight. Plus, I integrated AI summarization for long-form articles.&lt;/p&gt;
&lt;p&gt;Project Link:
&lt;a class="link" href="https://github.com/greenzorro/google-apps-scripts/blob/main/news_feed.md" target="_blank" rel="noopener"
&gt;https://github.com/greenzorro/google-apps-scripts/blob/main/news_feed.md&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Turning Photoshop into a Machine Gun with Excel</title><link>https://victor42.eth.limo/post-en/3650/</link><pubDate>Thu, 13 Jun 2024 14:05:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3650/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2024-06/927f0f7ac6f154b4027673e30b629be2.jpg" alt="Featured image of post Turning Photoshop into a Machine Gun with Excel" /&gt;&lt;p&gt;I heard Marketing was tearing their hair out. The boss greenlit the new course cover design, and now they needed to update all 800+ existing covers. It wasn&amp;rsquo;t a simple find-and-replace; there were tons of small differences. Marketing has only one designer, and they were slammed. Doing it in-house? No way. Outsourcing would cost 20 RMB per image, totaling 16,000 RMB – a budget buster.&lt;/p&gt;
&lt;p&gt;Bingo! 16,000 RMB? My ears perked up. I love automation. A data geek who knows Photoshop? This was my moment. People talk about the &amp;ldquo;value of design.&amp;rdquo; But what &lt;em&gt;is&lt;/em&gt; your value? How do you put a number on it? Saving the company a designer&amp;rsquo;s monthly salary in half a day? That&amp;rsquo;s real value. Plus, it&amp;rsquo;d be great for my year-end review. I jumped on the task.&lt;/p&gt;
&lt;h2 id="the-challenge"&gt;The Challenge
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/d257445c788894aad2f9c9d25333d834.jpg"
loading="lazy"
alt="Pink-orange course cover template with orange rounded tag showing Product Operations at top, large text How to Create Potential Hit Products in center, smaller text New Product Development below, grid texture and geometric decorations in background"
&gt;&lt;/p&gt;
&lt;p&gt;This is the template the marketing designer created. No use criticizing – the boss wanted this style. Simple. The basic need was also simple: replace three text areas and generate 800+ images.&lt;/p&gt;
&lt;p&gt;Most designers would think, &amp;ldquo;Piece of cake! Define some variables in Photoshop, create an Excel sheet, and batch export.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; know how to batch output with Excel and Photoshop, check out this tutorial: &lt;a class="link" href="https://zhuanlan.zhihu.com/p/33725280" target="_blank" rel="noopener"
&gt;https://zhuanlan.zhihu.com/p/33725280&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yeah&amp;hellip; that&amp;rsquo;s the gist. If it were &lt;em&gt;that&lt;/em&gt; easy, you could just follow the tutorial, and this article would be done.&lt;/p&gt;
&lt;p&gt;But, once I saw the template, I realized it was much trickier. The variations were crazy:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/927f0f7ac6f154b4027673e30b629be2.jpg"
loading="lazy"
alt="Grid of ten course covers with different color schemes and themes, including Product Operations/Sports Academy/Taobao New Merchant/Tmall New Merchant/Education Academy/Home Academy/FMCG Academy/Enterprise Academy/Digital Academy/Fashion Academy, each with category-colored tag at top"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/2f196e8210e1f43dae80cd978031cf36.jpg"
loading="lazy"
alt="Three course category label designs stacked vertically: orange Product Operations label, orange Taobao New Merchant label, pink Tmall New Merchant label, all with rounded rectangle backgrounds"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/0a0c12d573ee7d0f2958cd0baee914fc.jpg"
loading="lazy"
alt="Title layout comparison: top Taobao New Merchant cover shows two-line title Name Max 8 Characters and Line 2 Content 1, bottom Tmall New Merchant cover shows single-line title Name Max 8 Characters 1, each with description text placeholder below"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/f60e4590c7b4551a14e93c37b5396f8d.jpg"
loading="lazy"
alt="Two bottom bar design slices: top blue background with monitor icon showing Max 5 Characters, bottom pink background with folder icon showing Max 5 Characters, demonstrating different category decoration styles"
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Over a dozen course categories, some with unique backgrounds, others sharing.&lt;/li&gt;
&lt;li&gt;The top category wasn&amp;rsquo;t always text. Two (Taobao and Tmall) used logos – images.&lt;/li&gt;
&lt;li&gt;Course titles: one or two lines. Single-line titles needed vertical centering.&lt;/li&gt;
&lt;li&gt;Text color changed with the background – a tinted shade, not pure black.&lt;/li&gt;
&lt;li&gt;The bottom description text wasn&amp;rsquo;t always there. If missing, its decorative box had to go too.&lt;/li&gt;
&lt;li&gt;The box&amp;rsquo;s line color also changed, matching the text but brighter.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Think. Could you handle this with Photoshop variables? Sure, you could make a dozen PSDs. But I wanted just &lt;em&gt;one&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Yes, it was possible.&lt;/p&gt;
&lt;p&gt;But it needed a designer who was also an Excel expert.&lt;/p&gt;
&lt;h2 id="designing-the-excel-data-model"&gt;Designing the Excel Data Model
&lt;/h2&gt;&lt;p&gt;The complexity meant I needed to think about the data model first.&lt;/p&gt;
&lt;p&gt;Programmers might laugh. &amp;ldquo;Data model? For a simple image?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t @ me! I&amp;rsquo;m just using the idea. Look, if you just want to finish, anything goes. But for top efficiency, you need a data model mindset. What&amp;rsquo;s that? The operations team fills in the least info, and I do the least work per export. This was ongoing, so I needed low marginal costs. The initial setup could be complex; that cost was less important.&lt;/p&gt;
&lt;p&gt;So, what columns did we need?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Course Category&lt;/li&gt;
&lt;li&gt;Course Title&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Background Image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obvious ones. Adding the variations, the real list was:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/3edc562bdfee2fb96d5271d682185f6b.jpg"
loading="lazy"
alt="Excel fact table screenshot with 12 columns: Filename/Category/Title Line 1/Title Line 2/Description/Taobao/Tmall/Single Line/Two Lines/Has Description/Background Image/Foreground Color, showing data for Rule Interpretation/Product Operations/Content Live categories"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filename: Controls the output filename, arranged logically.&lt;/li&gt;
&lt;li&gt;categories: The dozen-ish categories, shown at the top, determining the template.&lt;/li&gt;
&lt;li&gt;Title Line 1: Titles can be one or two lines, split for manual line breaks.&lt;/li&gt;
&lt;li&gt;Title Line 2: Optional; if blank, it&amp;rsquo;s a single-line title.&lt;/li&gt;
&lt;li&gt;Description: The optional keywords, determining if the box below is shown.&lt;/li&gt;
&lt;li&gt;Taobao: Yes/no, toggles the Taobao logo, based on Category.&lt;/li&gt;
&lt;li&gt;Tmall: Yes/no, toggles the Tmall logo, based on Category.&lt;/li&gt;
&lt;li&gt;Single Line: Yes/no, controls the single-line title layer, based on Title Line 2.&lt;/li&gt;
&lt;li&gt;Two Lines: Yes/no, controls Title Line 1 and 2 layers, based on Title Line 2.&lt;/li&gt;
&lt;li&gt;Has Description: Yes/no, controls the description box, based on Description.&lt;/li&gt;
&lt;li&gt;Background Image: Path for the background image.&lt;/li&gt;
&lt;li&gt;Foreground Color: Path for the color image, used for title text color.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/f0990a616f2f602bcdd42a44bb01df9e.jpg"
loading="lazy"
alt="Photoshop layers panel screenshot from top to bottom: Foreground Color layer/Text Group folder containing Description/Title Line 2/Title Line 1/Title Single Line text layers/Hue-Saturation adjustment layer/Foreground Color layer"
&gt;&lt;/p&gt;
&lt;p&gt;Explanation: I had three title layers. One for single-line, two for two-line titles.&lt;/p&gt;
&lt;p&gt;Giving this to operations would be brutal. Most could be calculated. Operations only needed: Category, Title Line 1, Title Line 2, and Description. I made an online spreadsheet with just those four and sent it out. We had 5-6 people working, each taking categories. They finished fast.&lt;/p&gt;
&lt;p&gt;The hard part was mine: calculating the rest, all needed for Photoshop. None could be skipped. Category was key. It determined the logos, background, text color, and filename sorting. So, I made a separate Category table, a dimension table, where each category was like a product. The image content table was the fact table, like an order. Category name was the dimension table&amp;rsquo;s primary key, a foreign key in the fact table, pulling in category info. One fact table (CSV) and one dimension table – a simple star schema, or maybe &amp;ldquo;Earth-Moon schema&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/6d4da5705eb81be2c0eee26a2cf600a7.jpg"
loading="lazy"
alt="Excel dimension table screenshot with 5 columns: Category/id/Filename/Background Image/Foreground Color, listing 18 categories including Rule Interpretation/User Operations/Product Operations with corresponding template file paths"
&gt;&lt;/p&gt;
&lt;p&gt;These concepts are from data modeling and databases. Simply, it&amp;rsquo;s defining attributes on Category. Anything in a category would auto-read the background, color, etc., based on the name. This matched the requirements.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/a536f153f4837dc8de1937558ca0482d.jpg"
loading="lazy"
alt="Excel consolidated table screenshot with 5 columns: Sequence/Category Name/Title Line 1/Title Line 2/Keywords, showing operations-entered data for Rule Interpretation/Product Operations/Content Live/Taobao New Merchant/Tmall New Merchant/Fashion Academy categories"
&gt;&lt;/p&gt;
&lt;p&gt;All the operations data (4 columns) was now in my Excel. I referenced it, added the calculated columns, and formed a complete table. I updated, saved as CSV, and gave it to Photoshop.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/3edc562bdfee2fb96d5271d682185f6b.jpg"
loading="lazy"
alt="Excel fact table complete configuration screenshot with 12 columns showing automatically calculated cover metadata through formulas"
&gt;&lt;/p&gt;
&lt;p&gt;These calculated columns tested my Excel skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vlookup&lt;/code&gt; was crucial for looking up category attributes.&lt;/li&gt;
&lt;li&gt;Filenames needed text concatenation. I could combine them freely, deciding the output order.&lt;/li&gt;
&lt;li&gt;I used string replacement to remove spaces in titles, ensuring centering even with accidental spaces.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IF&lt;/code&gt; checked for empty values, preventing 0 on empty rows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are easy for Excel users, so I won&amp;rsquo;t detail them.&lt;/p&gt;
&lt;h2 id="merging-tables-with-power-query"&gt;Merging Tables with Power Query
&lt;/h2&gt;&lt;p&gt;But, two questions remained:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How did operations&amp;rsquo; data get into my Excel?&lt;/li&gt;
&lt;li&gt;How do I update it?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/800867584af30783c478924a6db86fdd.jpg"
loading="lazy"
alt="Excel online collection form screenshot with 4 columns: Category Name/Title Line 1/Title Line 2/Keywords, bottom tab bar showing General/New Merchant/Fashion/FMCG/Digital/Home/Sports/Education/Enterprise worksheets"
&gt;&lt;/p&gt;
&lt;p&gt;First: The online spreadsheet let people work independently and update in real-time. My table was local because I needed Excel&amp;rsquo;s Power Query for merging, which most online spreadsheets lack.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/521925ce776cc959e7698c66e0969042.jpg"
loading="lazy"
alt="macOS Finder folder screenshot showing 8 items: Cover Template.psb/Cover Content.xlsx/Cover Content Collection.xlsx/Workbook 7.csv/Template-Background folder/Template-Foreground folder/JPG folder/PSD folder"
&gt;&lt;/p&gt;
&lt;p&gt;For each batch, I downloaded the online spreadsheet (&lt;code&gt;Course Cover Content Collection.xlsx&lt;/code&gt;) to the same directory as my table (&lt;code&gt;Course Cover Content.xlsx&lt;/code&gt;). The data link would stay as long as the location didn&amp;rsquo;t change.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/2878de8a5b1e67e4846803c6e585a9b3.jpg"
loading="lazy"
alt="Excel Data menu screenshot with red box highlighting Get Data Power Query button, next to Refresh All/Queries &amp; Connections/Properties/Workbook Links options"
&gt;&lt;/p&gt;
&lt;p&gt;I used Power Query from the &amp;ldquo;Data&amp;rdquo; menu. Think of it as a visual SQL. It reads data from local tables, web pages, databases, and Azure, and cleans, transforms, and aggregates it. I used its local table reading.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/be21ed673a8ff88073305b48f847fefd.jpg"
loading="lazy"
alt="Power Query editor screenshot with 10 queries listed on left: General/New Merchant/Fashion/FMCG/Digital/Home/Sports/Education/Enterprise/Merged, center table showing Category Name/Title Line 1/Title Line 2/Keywords data, right Query Settings showing Source/Navigation1/Changed Type/Promoted Headers steps"
&gt;&lt;/p&gt;
&lt;p&gt;The Power Query interface is both familiar and strange to basic Excel users. Familiar: &amp;ldquo;Tables!&amp;rdquo; Strange: &amp;ldquo;What&amp;rsquo;s all this?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Understanding Power Query: It does three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Specifies the data source.&lt;/li&gt;
&lt;li&gt;Sets rules and conditions.&lt;/li&gt;
&lt;li&gt;Executes and loads data, one request per sheet.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/af1dc0620c1d62b971ac405eddbb55cc.jpg"
loading="lazy"
alt="Power Query editor left panel screenshot showing Queries[10] title with General/New Merchant/Fashion/FMCG/Digital/Home/Sports/Education/Enterprise/Merged 10 query items listed below"
&gt;&lt;/p&gt;
&lt;p&gt;Step two is crucial. The left list is a series of requests, executed in order.&lt;/p&gt;
&lt;p&gt;Each needs &amp;ldquo;Use First Row as Headers&amp;rdquo; and removal of empty values.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/69054b9e157cd497d0ede7fa9d85a547.jpg"
loading="lazy"
alt="Power Query editor toolbar screenshot with red box highlighting Append Queries button under Combine dropdown, next to Close &amp; Load/Get Data/Enter Data buttons"
&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not just filtering and sorting. I used its table merging. Operations&amp;rsquo; data was scattered. I couldn&amp;rsquo;t copy-paste, right? I queried each sheet, then created an append request, combining tables with the same format, like SQL&amp;rsquo;s &lt;code&gt;CROSS JOIN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/137c056d4946b2367dc3259518c0e5dd.jpg"
loading="lazy"
alt="Power Query Append dialog with title Append, Three or more tables option selected, left Available Tables list showing General/New Merchant/Fashion/FMCG/Digital/Home/Sports/Education/Enterprise, right Tables to Append list with New Merchant/Fashion/FMCG/Digital/Home/Sports/Education/Enterprise selected"
&gt;&lt;/p&gt;
&lt;p&gt;Its merge query is also useful, like SQL&amp;rsquo;s &lt;code&gt;JOIN&lt;/code&gt; and &lt;code&gt;LEFT JOIN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/66b4091f7dfc0ebf0448baf72b6509c0.jpg"
loading="lazy"
alt="Power Query editor toolbar screenshot with red box highlighting Close &amp; Load button in top-left Close area, next to Get Data/Enter Data/Options buttons"
&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Close&amp;rdquo; (actually save) made a bunch of sheets appear. I deleted unneeded ones. I added a sequence number for filename sorting.&lt;/p&gt;
&lt;p&gt;All operations data was now in.&lt;/p&gt;
&lt;p&gt;Second question: updating?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/e56e2966a217111a4a10f15db546dd42.jpg"
loading="lazy"
alt="Excel Data menu screenshot with red box highlighting Refresh All button in Queries &amp; Connections area, next to Get Data Power Query/Properties/Workbook Links options"
&gt;&lt;/p&gt;
&lt;p&gt;New batch? Download, overwrite, open the data table, &amp;ldquo;Data&amp;rdquo; menu, &amp;ldquo;Refresh.&amp;rdquo; Simple.&lt;/p&gt;
&lt;p&gt;Why compare to SQL? It records query &lt;em&gt;conditions&lt;/em&gt;, not results. Results are shown, but it&amp;rsquo;s a preview. It records requests and re-queries on &amp;ldquo;Refresh.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;After complex initial setup, the pipeline was set. Use was simple: download, overwrite, refresh, save as CSV – Photoshop&amp;rsquo;s data file.&lt;/p&gt;
&lt;h2 id="batch-image-generation-in-photoshop"&gt;Batch Image Generation in Photoshop
&lt;/h2&gt;&lt;p&gt;Photoshop had five steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Organize/rename layers.&lt;/li&gt;
&lt;li&gt;Define variables.&lt;/li&gt;
&lt;li&gt;Import data.&lt;/li&gt;
&lt;li&gt;Batch export PSDs.&lt;/li&gt;
&lt;li&gt;Batch convert to JPGs.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="1-organize-and-rename-layers"&gt;1. Organize and Rename Layers
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/531b776b93a3a94233d9c2842edd7612.jpg"
loading="lazy"
alt="Photoshop layers panel complete screenshot with 14 layers from top to bottom: Foreground Color/Text Group folder with Description/Title Line 2/Title Line 1/Title Single Line/Hue-Saturation 1/Foreground Color/Description Background-Colored/Description Background-White/Tmall New Merchant/Taobao New Merchant/Category/Background Image/Filename"
&gt;&lt;/p&gt;
&lt;p&gt;Not hard. Merge, reorder. Name layers according to table headers for easier variable definition.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Filename&amp;rdquo; is special; it&amp;rsquo;s not visible. I created it manually. Style doesn&amp;rsquo;t matter. Hide it.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Foreground Color&amp;rdquo; needed special handling. Variables can&amp;rsquo;t directly change text color. For background-based changes: group the text, create a solid color layer, and use a clipping mask. This gives unified control.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/a9a688b8e6f7b88860fa0b00a4b79c1b.jpg"
loading="lazy"
alt="Photoshop Hue/Saturation adjustment panel screenshot showing Custom preset, Master range selected, Hue slider at 0, Saturation slider at &amp;#43;100, Lightness slider at &amp;#43;50, with before/after color comparison bars at bottom"
&gt;&lt;/p&gt;
&lt;p&gt;The box&amp;rsquo;s line color? Related to text, but not the same. Add a Hue/Saturation layer for the lines, increasing saturation and brightness. Brown becomes orange, dark green becomes grass green&amp;hellip; This needs color theory and Photoshop knowledge.&lt;/p&gt;
&lt;h3 id="2-define-variables-for-layers"&gt;2. Define Variables for Layers
&lt;/h3&gt;&lt;p&gt;No step-by-step; the linked tutorial covers it. I&amp;rsquo;ll discuss tricky points.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/ea2af0bf27f4c74c49db871f5c2b7296.jpg"
loading="lazy"
alt="Photoshop Variables dialog screenshot with Background Image layer selected, Pixel Replacement checked with name Background Image and method Consistent, bottom description text reads Specify layer variables to control visibility, replace text strings or replace pixels"
&gt;&lt;/p&gt;
&lt;p&gt;Common use: &amp;ldquo;Text Replacement.&amp;rdquo; Non-text layers become &amp;ldquo;Pixel Replacement&amp;rdquo; – image change. Background is replaced this way.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/5be7d1ed67cc798dc3a2925f3e07cc84.jpg"
loading="lazy"
alt="10 solid color foreground image thumbnails in 2-row grid: top row 1-General/2-Taobao/2-Tmall/3-Fashion/3-Home/3-FMCG in dark brown/dark purple/dark red warm tones, bottom row 3-Enterprise/3-Digital/3-Education/3-Sports in dark blue/dark green cool tones"
&gt;&lt;/p&gt;
&lt;p&gt;Foreground color is similar. Prepare color images, define the clipping mask as a variable, select based on category.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/46b0372dc8bd46ffed011eae85e6bb28.jpg"
loading="lazy"
alt="Excel table screenshot showing Taobao/Tmall/Single Line/Two Lines/Has Description 5 boolean columns, all rows show FALSE for Taobao and Tmall, FALSE for Single Line, TRUE for Two Lines, alternating TRUE/FALSE for Has Description"
&gt;&lt;/p&gt;
&lt;p&gt;Visibility variables are useful. TRUE/FALSE control display. Can be used with text/pixel replacement. Description text: text replacement changes content, visibility controls display.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/a740f3312e02a860493537f9e78b80c0.jpg"
loading="lazy"
alt="Photoshop Variables dialog with Description layer selected, Visibility checked with name Has Description linking Description Background-Colored and Description Background-White layers, plus Text Replacement checked with name Description"
&gt;&lt;/p&gt;
&lt;p&gt;These first two steps, though tedious, are one-time.&lt;/p&gt;
&lt;h3 id="3-import-data-sets"&gt;3. Import Data Sets
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/e1fbcc63e3a13d31e181c8a1f12db265.jpg"
loading="lazy"
alt="Photoshop Variables dialog Data Set panel showing 1-Rule Interpretation-1-Name Max 8 Characters Hit Product 1, variable list showing Two Lines/Category/Foreground Color/Single Line/Tmall/Description/Filename with values and layers, red box highlighting Import button on right"
&gt;&lt;/p&gt;
&lt;p&gt;Import the CSV.&lt;/p&gt;
&lt;p&gt;Two common errors: extra/mismatched columns, and empty cells. Photoshop doesn&amp;rsquo;t support empty cells, so I used NULL, with visibility checks.&lt;/p&gt;
&lt;h3 id="4-batch-export-psds"&gt;4. Batch Export PSDs
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/d92857c1843b212c5205b9d0582f88b2.jpg"
loading="lazy"
alt="Excel table screenshot showing Title Line 2 and Description columns, Description column has NULL values in some cells marking empty cells like Hit Product 3/Line 2 Content 3/Line 2 Content 2 rows"
&gt;&lt;/p&gt;
&lt;p&gt;No trick; do it like this.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/7dceeaca255670e1437a37b68e773e31.jpg"
loading="lazy"
alt="Photoshop File menu screenshot with Export submenu expanded, highlighting Data Sets as Files option, above Quick Export as JPG/Export As/Export Preferences options"
&gt;&lt;/p&gt;
&lt;p&gt;Define filename format. &amp;ldquo;Data Set Name&amp;rdquo; is useful; it&amp;rsquo;s the first column, &amp;ldquo;Filename,&amp;rdquo; allowing customization.&lt;/p&gt;
&lt;h3 id="5-batch-psd-to-jpg-conversion"&gt;5. Batch PSD to JPG Conversion
&lt;/h3&gt;&lt;p&gt;PSDs need conversion.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/c36d844e7381a77f1c02718a560fe9f8.jpg"
loading="lazy"
alt="Photoshop Export Data Sets as Files dialog with folder path selected, Data Sets set to All Data Sets, filename using only Data Set Name with no suffix, name example showing 1-Rule Interpretation-1-Name Max 8 Characters Hit Product 1.psd"
&gt;&lt;/p&gt;
&lt;p&gt;Record a simple action: open, save as JPG, close. Batch process the PSD folder.&lt;/p&gt;
&lt;p&gt;My action set has &amp;ldquo;Save as JPG&amp;rdquo;; link at the end.&lt;/p&gt;
&lt;h2 id="one-more-table"&gt;One More Table
&lt;/h2&gt;&lt;p&gt;Done? Task complete, but not the matter. One crucial table is missing.&lt;/p&gt;
&lt;p&gt;These 800+ images (16,000 RMB) are just the first batch. More will come. Shouldn&amp;rsquo;t I know the yearly savings? Even if I don&amp;rsquo;t, the boss should.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-06/fa9ce9f2b382b99c6cad7125d176799b.jpg"
loading="lazy"
alt="Photoshop Actions panel screenshot showing [A] save jpg action set with Open/Save/Close three steps, each with checkbox and play button"
&gt;&lt;/p&gt;
&lt;p&gt;So, a statistics table, a &amp;ldquo;bragging table.&amp;rdquo; Let&amp;rsquo;s call it &amp;ldquo;Rock and Roll Table.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I could even make a chart, showing monthly/quarterly/seasonal value. Subtract from my salary to show my cost – hiring me is a steal! Data is there; whether I do it is TBD.&lt;/p&gt;
&lt;h2 id="epilogue"&gt;Epilogue
&lt;/h2&gt;&lt;p&gt;This was cost-effective. Half a day for initial setup. Negligible time after; I ran it during lunch.&lt;/p&gt;
&lt;p&gt;This is my strength. I don&amp;rsquo;t reinvent wheels, but I assemble them well.&lt;/p&gt;
&lt;p&gt;After setup, I met with operations. Marketing explained the four columns. No one found it hard. Operations thought I used AI. For non-tech people, anything amazing is AI. AI is the silver bullet. It&amp;rsquo;s funny; I&amp;rsquo;m used to it.&lt;/p&gt;
&lt;p&gt;Finally, resources. Try it yourself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zhuanlan.zhihu.com/p/33725280" target="_blank" rel="noopener"
&gt;PS+Excel Batch Output Basic Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://my.feishu.cn/file/PGx8bMjyrohPp2x4DZ9ct0A9nIf?from=from_copylink" target="_blank" rel="noopener"
&gt;Workflow Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://my.feishu.cn/docx/SK0UdUPphoFBZpxJpEJcbZIsnRf?from=from_copylink" target="_blank" rel="noopener"
&gt;PS Action Set (click the table of contents to jump)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Important Update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I have since developed a more automated programmatic solution for this workflow, which only requires a Python environment.&lt;/p&gt;
&lt;p&gt;Details: &lt;a class="link" href="https://github.com/greenzorro/excel-ps-batch-export" target="_blank" rel="noopener"
&gt;https://github.com/greenzorro/excel-ps-batch-export&lt;/a&gt;&lt;/p&gt;</description></item><item><title>A Step-by-Step Guide to Travel Planning</title><link>https://victor42.eth.limo/post-en/3642/</link><pubDate>Fri, 15 Sep 2023 17:32:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3642/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2023-09/5ef58770aad9ed92e0535b0b357bd3fb.jpg" alt="Featured image of post A Step-by-Step Guide to Travel Planning" /&gt;&lt;p&gt;Most people travel, but few plan meticulously. Accommodation, food, transport, tickets—it&amp;rsquo;s all interconnected. One change can throw everything off. This complexity discourages many from detailed planning. They book flights and hotels and wing it. But beneath the apparent spontaneity lies potential chaos.&lt;/p&gt;
&lt;p&gt;As summer turns to fall, the weather&amp;rsquo;s perfect for travel. I&amp;rsquo;ve been deep in trip planning lately, which got me thinking: how do you &lt;em&gt;systematically&lt;/em&gt; plan a trip? With a solid framework, travel planning becomes straightforward, turning a jumbled mess into a smooth process. Follow this, and you can create travel plans quickly and easily, without losing flexibility.&lt;/p&gt;
&lt;h2 id="breaking-down-the-elements"&gt;Breaking Down the Elements
&lt;/h2&gt;&lt;p&gt;Before I share the method, let&amp;rsquo;s start with the underlying logic.&lt;/p&gt;
&lt;p&gt;Travel aims for enjoyment, but it&amp;rsquo;s still &lt;em&gt;physical&lt;/em&gt;. Real-world needs apply. Coordinating these needs is the &lt;em&gt;reason&lt;/em&gt; for a travel plan. The key to simplifying it all is almost too simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can only be in one place at a time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We&amp;rsquo;re bound by 3D space and 1D time. Your body must be &lt;em&gt;somewhere&lt;/em&gt;, and you can&amp;rsquo;t be in two places at once. Time, too, marches on.&lt;/p&gt;
&lt;p&gt;Therefore, planning a trip boils down to filling each moment with a location.&lt;/p&gt;
&lt;p&gt;Obvious so far, but here&amp;rsquo;s where it gets useful:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/5594b69da68ee4d0143a0c262a81109a.jpg"
loading="lazy"
alt="Travel plan mind map first level with black Travel Plan node branching to green Time/blue Location/yellow Items"
&gt;&lt;/p&gt;
&lt;p&gt;Travel elements break down into time, location, and items. Time and location define your environment. You are the trip&amp;rsquo;s subject. You know &lt;em&gt;you&lt;/em&gt;; what needs planning are your extensions (your stuff) – items.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/5ef58770aad9ed92e0535b0b357bd3fb.jpg"
loading="lazy"
alt="Full travel plan mind map with Time split into Days-Nights/Daily Itinerary, Location split into Intercity Transport/City Transport/Attractions/Hotels/Restaurants, Attractions split into Potential/Confirmed"
&gt;&lt;/p&gt;
&lt;p&gt;We further break down time and location, laying out all the trip&amp;rsquo;s elements. I&amp;rsquo;ve separated &amp;ldquo;potential destinations&amp;rdquo; and &amp;ldquo;confirmed destinations&amp;rdquo; because sometimes destinations are limited by other factors, requiring choices. It&amp;rsquo;s not crucial, but it helps.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/64480a4e44e37823a98713594b5e59e5.jpg"
loading="lazy"
alt="Linear flow of 9 travel planning leaf nodes: Days-Nights/Daily Itinerary/Intercity Transport/City Transport/Potential Attractions/Confirmed Attractions/Hotels/Restaurants/Items"
&gt;&lt;/p&gt;
&lt;p&gt;With the elements atomized, the question is: which ones do you decide first, and in what order?&lt;/p&gt;
&lt;h2 id="reassembling-the-elements"&gt;Reassembling the Elements
&lt;/h2&gt;&lt;p&gt;The breakdown is fixed, but reassembly needs your input. What&amp;rsquo;s the trip&amp;rsquo;s purpose? To see something you&amp;rsquo;ve dreamed of, even if it&amp;rsquo;s a hassle? Or to simply relax and enjoy? Even with the same goal, focusing on efficiency versus total enjoyment leads to different travel styles.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve identified two planning models based on my experience. I use different approaches depending on the situation.&lt;/p&gt;
&lt;h3 id="a-sightseeing-mode"&gt;A. Sightseeing Mode
&lt;/h3&gt;&lt;p&gt;Sightseeing mode prioritizes efficiency.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Efficiency = Total Happiness / Total Time = (Happiness at Destinations + Happiness in Transit) / Total Time&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here, destinations provide the most happiness per unit of time, while transit provides less, or even negative, happiness. If you enjoy transit equally, you likely prefer the other mode, discussed later.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Destinations&amp;rdquo; aren&amp;rsquo;t just tourist spots. In Sightseeing Mode, an enjoyable journey, like a scenic coastal drive, is a destination, not transit. Typical &amp;ldquo;transit&amp;rdquo; is things like city subways or waiting in lines.&lt;/p&gt;
&lt;p&gt;Minimizing transit time boosts efficiency. If teleportation existed, you&amp;rsquo;d skip the commute. High efficiency means the trip was &amp;ldquo;worth it.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/22794c641275b0e281926adf36373be0.jpg"
loading="lazy"
alt="Sightseeing Mode flowchart for working professionals: Intercity Transport/City Transport/Potential Attractions lead to Days-Nights, then Confirmed Attractions, leading to Hotels/Restaurants/Items, converging to Daily Itinerary"
&gt;&lt;/p&gt;
&lt;p&gt;Planning order for Sightseeing Mode:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Consider &lt;strong&gt;getting to and from the destination city&lt;/strong&gt;, &lt;strong&gt;in-city transport&lt;/strong&gt;, and &lt;strong&gt;places worth seeing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Decide &lt;strong&gt;how many days and nights&lt;/strong&gt; to spend. This is limited by transport (train/flight schedules) and your vacation time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm destinations&lt;/strong&gt;. Based on trip duration, decide if you can visit all potential destinations or need to prioritize. City transport is a constraint; some spots might be inaccessible or too time-consuming without suitable transport.&lt;/li&gt;
&lt;li&gt;Book &lt;strong&gt;hotels&lt;/strong&gt; and create a &lt;strong&gt;packing list&lt;/strong&gt;. Research to find a conveniently located hotel. Trip length is crucial for hotel booking. Your packing list depends on destinations; hiking gear differs from beach gear.&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;restaurants or commercial areas&lt;/strong&gt;. This can be skipped in big cities or if you&amp;rsquo;re not a foodie. It&amp;rsquo;s necessary when traveling with my toddler, who needs regular, specific meals. If there are busy areas near destinations (for lunch/dinner) or the hotel (for dinner), focus on those. If it&amp;rsquo;s remote, you need a concrete dining plan, like takeout or packed food.&lt;/li&gt;
&lt;li&gt;Plan the &lt;strong&gt;daily itinerary&lt;/strong&gt;: It&amp;rsquo;s almost done by now. This step is about adjusting the order, balancing morning and afternoon time, and ensuring a good overall pace.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/67bbcb6affbea7659a7463b347c9a713.jpg"
loading="lazy"
alt="Retired Sightseeing Mode flowchart: Days-Nights not constrained by Intercity Transport, Potential Attractions directly lead to Confirmed Attractions, allowing all destinations to be visited"
&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a Sightseeing Mode variation. Unlike the &amp;ldquo;9-to-5&amp;rdquo; version, those with ample time needn&amp;rsquo;t choose destinations due to time. They can visit everywhere, simply extending the trip. Other aspects are similar.&lt;/p&gt;
&lt;h3 id="b-vacation-mode"&gt;B. Vacation Mode
&lt;/h3&gt;&lt;p&gt;Vacation Mode prioritizes total enjoyment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Total Happiness = Efficiency x Total Time&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here, you first maximize efficiency, minimizing unpleasantness. With constant happiness ensured, only time affects the total. If 3 days aren&amp;rsquo;t enough, try 5; if 5 aren&amp;rsquo;t enough, try 7, until you&amp;rsquo;re content.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/179aac36050e91835b7362e50ab828ff.jpg"
loading="lazy"
alt="Vacation Mode flowchart: Intercity Transport/City Transport/Days-Nights/Items all lead to Hotels, Hotels lead to Potential Attractions and Restaurants, Confirmed Attractions and Daily Itinerary are optional dashed-line steps"
&gt;&lt;/p&gt;
&lt;p&gt;Planning order for Vacation Mode:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Consider &lt;strong&gt;getting to and from the destination city&lt;/strong&gt;, &lt;strong&gt;in-city transport&lt;/strong&gt;, and &lt;strong&gt;how many days and nights&lt;/strong&gt; to spend.&lt;/li&gt;
&lt;li&gt;Book &lt;strong&gt;hotels&lt;/strong&gt;. Find a hotel with great views or amenities, considering distance to transport hubs and in-city transport options. Public transport versus driving greatly impacts hotel choice.&lt;/li&gt;
&lt;li&gt;List &lt;strong&gt;potential destinations&lt;/strong&gt; and research local &lt;strong&gt;restaurants&lt;/strong&gt;. Which easily accessible destinations are worth visiting? Any local delicacies you&amp;rsquo;re keen on? Research those.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;packing list&lt;/strong&gt;. Items have no constraints, so consider this anytime.&lt;/li&gt;
&lt;li&gt;Planning is essentially done. Just await departure.&lt;/li&gt;
&lt;li&gt;For a more detailed plan, select destinations and combine them with preferred restaurants and areas to create a daily itinerary.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="differences-between-the-two-modes"&gt;Differences Between the Two Modes
&lt;/h3&gt;&lt;p&gt;The modes seem distinct, but there are blurry areas. You might not be a &amp;ldquo;special forces&amp;rdquo; traveler or someone who just enjoys sleeping in a new city. Where do you fit?&lt;/p&gt;
&lt;p&gt;The modes can produce identical itineraries, but the &lt;em&gt;source&lt;/em&gt; of happiness differs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sightseeing Mode&amp;rsquo;s happiness comes from the physical world: &lt;em&gt;locations&lt;/em&gt;. The more you explore, the greater the happiness. This mode accepts some transit unhappiness, compensated by destination happiness.&lt;/li&gt;
&lt;li&gt;Vacation Mode&amp;rsquo;s happiness comes from the mental world: &lt;em&gt;time&lt;/em&gt;. As fatigue and boredom build, marginal happiness decreases. To maintain happiness, this mode allows changing activities and destinations anytime.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s an analogy: Imagine a day at Disneyland. How would the modes differ? It&amp;rsquo;s not hard.&lt;/p&gt;
&lt;p&gt;If a trip offers great destination happiness (for Sightseeing Mode) and a well-paced itinerary keeps Vacation Mode constantly happy, both are satisfied, but their &lt;em&gt;reasons&lt;/em&gt; differ.&lt;/p&gt;
&lt;p&gt;If there are two attractions, one hard to reach but immensely joyful, the other easily accessible but mildly amusing, Sightseeing Mode chooses the former, Vacation Mode the latter.&lt;/p&gt;
&lt;p&gt;Where does your happiness mainly come from? Or, where do you &lt;em&gt;want&lt;/em&gt; it to come from on this trip?&lt;/p&gt;
&lt;p&gt;These modes aren&amp;rsquo;t definitive. Everyone has preferences. The key is to lay out the elements, connect them, and draw your own travel planning flowchart. Use it repeatedly. You&amp;rsquo;ll find travel planning isn&amp;rsquo;t so hard. As you get better, you&amp;rsquo;ll travel more, increasing your overall happiness.&lt;/p&gt;
&lt;h2 id="putting-it-into-practice"&gt;Putting It into Practice
&lt;/h2&gt;&lt;p&gt;Theory&amp;rsquo;s fine, but let&amp;rsquo;s apply this framework to a real trip, using the more involved Sightseeing Mode.&lt;/p&gt;
&lt;p&gt;In April 2021, during the Qingming Festival, I road-tripped to Dunhuang with family and friends—four of us in total. I handled the itinerary, and everyone enjoyed it. Even two years later, we all consider it our most memorable trip. Here&amp;rsquo;s the travelogue: &lt;a class="link" href="https://victor42.eth.limo/post-en/3596/" target="_blank" rel="noopener"
&gt;https://victor42.eth.limo/post-en/3596/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The travelogue shows the result. I&amp;rsquo;m sharing the planning process, which used the &amp;ldquo;9-to-5&amp;rdquo; Sightseeing Mode.&lt;/p&gt;
&lt;h3 id="prerequisites-and-potential-destinations"&gt;Prerequisites and Potential Destinations
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/f753e47db6b6a3c4285b767b884152bf.jpg"
loading="lazy"
alt="Travel planning flowchart highlighting Intercity Transport/City Transport/Potential Attractions as initial tasks in color, rest grayed out"
&gt;&lt;/p&gt;
&lt;p&gt;Flying round-trip from Hangzhou to Dunhuang, with a 3-day Qingming holiday and 2 days of annual leave, flying was the only viable intercity option. So, I booked flights immediately.&lt;/p&gt;
&lt;p&gt;The best I could manage, even using all 5 days, was a 5-day, 4-night itinerary. We&amp;rsquo;d leave early on day one, have half a day for sightseeing; sleep in on day five, and head straight back, arriving home at night. That left 3.5 days for actual exploration.&lt;/p&gt;
&lt;p&gt;Dunhuang, a desert city, is susceptible to sandstorms, and many attractions are outside the city. Renting a car locally made sense, so I arranged that too.&lt;/p&gt;
&lt;p&gt;For potential destinations, I quickly researched online and listed these:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recommended Destinations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yumen Pass&lt;/li&gt;
&lt;li&gt;Yangguan Pass&lt;/li&gt;
&lt;li&gt;Mogao Caves&lt;/li&gt;
&lt;li&gt;Encore Dunhuang performance&lt;/li&gt;
&lt;li&gt;Singing Sands Mountain and Crescent Spring&lt;/li&gt;
&lt;li&gt;Yardang National Geopark (temporarily closed)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Other Destinations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leiyin Temple (near Singing Sands Mountain and Crescent Spring)&lt;/li&gt;
&lt;li&gt;Dunhuang Museum&lt;/li&gt;
&lt;li&gt;White Horse Pagoda (near Dunhuang Museum)&lt;/li&gt;
&lt;li&gt;Western Thousand Buddha Caves&lt;/li&gt;
&lt;li&gt;Dunhuang Film City&lt;/li&gt;
&lt;li&gt;Dunhuang Grand Show (near Singing Sands Mountain and Crescent Spring)&lt;/li&gt;
&lt;li&gt;Silk Road Flower Rain performance&lt;/li&gt;
&lt;li&gt;Yulin Caves&lt;/li&gt;
&lt;li&gt;Suoyang City&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="finalizing-the-destinations"&gt;Finalizing the Destinations
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/063b2f77e058c1a6ee4018bc31d650de.jpg"
loading="lazy"
alt="Travel planning flowchart highlighting Confirmed Attractions node in blue, rest grayed out, showing its position in the workflow"
&gt;&lt;/p&gt;
&lt;p&gt;I checked the map and grouped potential destinations geographically. A useful tip: search for each on a map app and add it to your favorites. Zooming out shows a cluster of stars, clarifying how to group them. Just select the ones you want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;East Line&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Mogao Caves&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Encore Dunhuang performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;West Line&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Yumen Pass&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Yangguan Pass&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Western Thousand Buddha Caves&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Yardang National Geopark (temporarily closed)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Dunhuang Film City&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;South of the City&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Singing Sands Mountain and Crescent Spring&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Leiyin Temple&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Dunhuang Grand Show&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Guazhou Line&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Yulin Caves&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Suoyang City&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Downtown&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Dunhuang Museum&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; White Horse Pagoda&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Shazhou Ancient City&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Silk Road Flower Rain performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grouping helps significantly with the daily itinerary, essentially one group per day. But I held off on the itinerary, needing a crucial element: the hotel.&lt;/p&gt;
&lt;h3 id="hotel-and-detailed-itinerary"&gt;Hotel and Detailed Itinerary
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/a14de957432f0840953cb0940a8e155a.jpg"
loading="lazy"
alt="Travel planning flowchart highlighting Hotels/Restaurants/Daily Itinerary nodes in blue and green, rest grayed out"
&gt;&lt;/p&gt;
&lt;h4 id="hotel"&gt;Hotel
&lt;/h4&gt;&lt;p&gt;Hotels should be central, near attractions, downtown, or transport hubs. Within that area, I weighed facilities and value. I chose a hotel in downtown Dunhuang, close to the night market and shopping, and was very pleased.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/870683e4161c3e4e74732f1b301847f5.jpg"
loading="lazy"
alt="Ctrip app Dunhuang hotel map view screenshot showing 56 hotels with price tags from 191 to 1488 yuan, date filter 09-29 to 10-01"
&gt;&lt;/p&gt;
&lt;p&gt;Tip for finding hotels: use the map mode in the Ctrip app. It displays Dunhuang hotels, showing the cheapest room&amp;rsquo;s price.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/087bd581b7bdb1d505d652f904678188.jpg"
loading="lazy"
alt="Ctrip app hotel filter page screenshot with Non-smoking Room checked, showing Free Parking/Pet Friendly/Parking/Laundry Room facility filters"
&gt;&lt;/p&gt;
&lt;p&gt;The filter function is key. Hotel details are standardized, so filtering quickly narrows options. For instance, with kids, I&amp;rsquo;d select a non-smoking room. Applying the filter removes many irrelevant hotels from the map.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using a computer, it&amp;rsquo;s even easier. I&amp;rsquo;ve developed a browser extension that lets you compare multiple Ctrip hotels side-by-side. It gathers ratings, negative review rates, room types, floor area, window details, bed sizes, and smoking policies into a single Excel sheet, allowing you to compare everything at a glance and make your choice quickly.&lt;/p&gt;
&lt;p&gt;Feel free to use it: &lt;a class="link" href="https://github.com/greenzorro/hotel-comparer" target="_blank" rel="noopener"
&gt;https://github.com/greenzorro/hotel-comparer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The hotel was now booked.&lt;/p&gt;
&lt;h4 id="restaurants"&gt;Restaurants
&lt;/h4&gt;&lt;p&gt;I scouted restaurants near attractions or the hotel. That&amp;rsquo;s how I handled it for Dunhuang. I didn&amp;rsquo;t have kids then, and adults are flexible with food, so I skipped a detailed food guide.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/2b0ab0f7c0e01c080c4c26980f83fd9a.jpg"
loading="lazy"
alt="Dianping app Dunhuang food map screenshot showing restaurants like Jingyuan Gaoliu Lamb/Ji Hui Hand-grabbed Lamb/Donkey Dad Noodles with ratings and prices"
&gt;&lt;/p&gt;
&lt;p&gt;Like finding hotels, use the map search in the Dianping app. It shows Dunhuang&amp;rsquo;s food scene. Locate yourself, zoom in, and you&amp;rsquo;ll see nearby restaurants. Note: use the app; the mini-program lacks this. Meituan&amp;rsquo;s app works, but it&amp;rsquo;s slower.&lt;/p&gt;
&lt;p&gt;Without a food guide, distance is crucial when finding food on the go. Map mode is very efficient.&lt;/p&gt;
&lt;h4 id="daily-itinerary"&gt;Daily Itinerary
&lt;/h4&gt;&lt;p&gt;The daily itinerary simply combines the hotel, attractions, and restaurants/shops, considering time. No new work here. The key is estimating visit durations to avoid over- or under-scheduling.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/d827653d704d8c7430a4dcd1a12c2730.jpg"
loading="lazy"
alt="Feishu Docs D2 and D3 itinerary planning showing D2 West Line attractions Western Thousand Buddha Caves/Yumen Pass/Yangguan Pass/Dunhuang Film City, D3 Mogao Caves 4hrs plus Encore Dunhuang 1.5hrs"
&gt;&lt;/p&gt;
&lt;p&gt;Note: for popular attractions, like the Forbidden City, book tickets in advance.&lt;/p&gt;
&lt;h3 id="packing-list"&gt;Packing List
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/ac92554aa849cd99b8407ddc04113296.jpg"
loading="lazy"
alt="Travel planning flowchart highlighting Items node in yellow, rest grayed out, showing Items independent position in workflow"
&gt;&lt;/p&gt;
&lt;p&gt;The packing list is separate, not tied to time or place. Once attractions are set, consider it anytime. I usually do it last.&lt;/p&gt;
&lt;p&gt;I love Excel. Anything data-related, I use Excel, including travel items. It&amp;rsquo;s overkill for solo adult travel, but forgetting one baby item can be disastrous, so careful checking is essential.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/cd2b78eae10081341b2cc3ef04b1979a.jpg"
loading="lazy"
alt="Excel family travel packing checklist with Category/Item/To Bring/To Pack/Packed/Brought 6 columns, 5 categories: Baby Food/Baby Hygiene/Baby Clothing/Baby Misc/Adult"
&gt;&lt;/p&gt;
&lt;p&gt;Why 4 columns? It&amp;rsquo;s a thorough checking system, from left to right:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;To Bring:&lt;/strong&gt; This spreadsheet is reusable, accumulating over time. It includes items for all seasons and activities. Before each trip, I select from this column.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;To Pack:&lt;/strong&gt; Items are either carry-on or checked. Leaving carry-ons at the hotel defeats their purpose (like diapers – I&amp;rsquo;ve learned the hard way). Use Excel&amp;rsquo;s filter on the first column, select items for this trip, then decide which are carry-on, checking them in the second column.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packed:&lt;/strong&gt; Start packing, prioritizing carry-ons. Refer to the second column and check this one for packed items.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brought:&lt;/strong&gt; With carry-ons mostly packed, filter the third column, showing unpacked items. These are either unpacked carry-ons or checked luggage items. Continue packing. You can skip checking columns 3 and 4 if you&amp;rsquo;re organized.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Packing List: &lt;a class="link" href="https://my.feishu.cn/wiki/R7EAwcYX1ikNlukteCdcVhdinhb?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/R7EAwcYX1ikNlukteCdcVhdinhb?from=from_copylink&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="travel-plan-document"&gt;Travel Plan Document
&lt;/h2&gt;&lt;p&gt;By following this workflow, your trip is planned out clearly—it’s not rocket science. However, up to this point, it’s all just mental planning. You need a proper &amp;ldquo;container&amp;rdquo; for this web of information, both for your own review and to share with your travel companions.&lt;/p&gt;
&lt;p&gt;I have a travel itinerary template I’ve used for years. It’s essentially a series of fill-in-the-blank questions; once you plug the information into the right spots, your guidebook is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/eedcf81640a1b16d68b6a60e6a4d14e6.jpg"
loading="lazy"
alt="Feishu Docs travel guide outline with Itinerary D1-D5/Packing Checklist/Tips/Potential Attractions/Travelogue &amp; References 5 modules"
&gt;&lt;/p&gt;
&lt;p&gt;The document is divided into several modules: Itinerary, Packing List, Tips, Candidate Attractions, and References. The first three are for you and your group; the last two are backend notes for your own use while planning. There’s a divider between them—once the plan is finalized, just delete the bottom half and share it with your group.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Time: Month/Day - Month/Day (X Days, X Nights)&lt;/strong&gt;&lt;br&gt;
Inter-city Transport: Mode of transport.
Local Transport: Mode of transport.
Accommodation: Hotel name &amp;amp; nearby attractions/districts (if any).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;First, the itinerary starts with an overview—this is the core foundation of the entire plan. The critical constraints—inter-city transport, local transport, trip duration, and accommodation—are all condensed into this short paragraph. Once these are nailed down, you won&amp;rsquo;t drop the ball on the basics, even if you haven&amp;rsquo;t planned the specific daily sightseeing yet.&lt;/p&gt;
&lt;p&gt;For multi-city trips, I expand it like this for better visibility:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Time: Month/Day - Month/Day (X Days, X Nights)&lt;/strong&gt;&lt;br&gt;
Inter-city Transport: Day X fly to [Place], Day X fly to [Place]&amp;hellip;
Local Transport: [City] Metro + Taxi, [City] Walk&amp;hellip;
Accommodation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dates (X Nights) at [City, Hotel]. Notes on location/attractions.&lt;/li&gt;
&lt;li&gt;Dates (X Nights) at [City, Hotel]. Notes on location/attractions.&lt;/li&gt;
&lt;li&gt;Dates (X Nights) at [City, Hotel]. Notes on location/attractions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, expanding it this way requires extreme caution because the dates are all interconnected. If you miss an edit and book tickets or hotels based on a typo, it’s a recipe for disaster. The cost of changing flights or overseas hotel bookings can be painful.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/Xnip2025-11-24_13-50-24.webp"
loading="lazy"
alt="Excel transport-accommodation itinerary planner with Start Date/End Date/City/Arrival Mode/Departure Mode/City Transport/Nights/Hotel/Notes 9 columns, showing Bangkok/Phuket/Phi Phi/Hong Kong multi-city trip"
&gt;&lt;/p&gt;
&lt;p&gt;For tasks like this, the human brain isn&amp;rsquo;t as reliable as code. So, I built a spreadsheet tool. You fill in the table, and it auto-generates the itinerary overview, ensuring zero errors. You can simply copy it from the spreadsheet and paste it into your document:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Inter-city Transport: 17th fly to Bangkok, 19th fly to Phuket, 22nd ferry to Phi Phi Don, 27th ferry to Phuket, 28th fly to Hong Kong, 31st fly home.
Local Transport: Bangkok Metro + Taxi, Phuket Bus + Taxi, Phi Phi Walk, Hong Kong Walk + Metro.
Accommodation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;17-19 (2 Nights) at Bangkok Asia Hotel. Near Siam Center, convenient location.&lt;/li&gt;
&lt;li&gt;19-22 (3 Nights) at Phuket Sugar Marina Hotel -POP- Kata Beach. Near Kata Beach.&lt;/li&gt;
&lt;li&gt;22-27 (5 Nights) at Phi Phi The Cliff at PP. Tonsai Pier area, convenient but quiet.&lt;/li&gt;
&lt;li&gt;27-28 (1 Night) at Phuket Nai Yang Beach Resort &amp;amp; Spa. Near Nai Yang Beach, close to airport.&lt;/li&gt;
&lt;li&gt;28-31 (3 Nights) at Hong Kong Metropark Hotel Mongkok. Mongkok area, bustling commercial district.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transport &amp;amp; Accommodation Planning Tool:&lt;/strong&gt; &lt;a class="link" href="https://my.feishu.cn/wiki/IbkAwYIi6ieFcbkuIjuckpJlnQb?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/IbkAwYIi6ieFcbkuIjuckpJlnQb?from=from_copylink&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/eedcf81640a1b16d68b6a60e6a4d14e6.jpg"
loading="lazy"
alt="Feishu Docs travel guide outline with Itinerary D1-D5/Packing Checklist/Tips/Potential Attractions/Travelogue &amp; References 5 modules"
&gt;&lt;/p&gt;
&lt;p&gt;Back to the template. I&amp;rsquo;ve already covered the Packing List. &lt;strong&gt;Tips&lt;/strong&gt; and &lt;strong&gt;References&lt;/strong&gt; are sections I haven&amp;rsquo;t mentioned yet. These are basically notes—valuable info recorded for the group (Tips) and for your own research (References).&lt;/p&gt;
&lt;p&gt;I’ve shared the template as an online doc; log in to save or download it. There’s a blank version and a filled-out &amp;ldquo;Dunhuang Road Trip&amp;rdquo; version. Comparing them shows exactly how I use the system. If you&amp;rsquo;re planning a trip to Dunhuang this spring, you can practically use it as is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Travel Template:&lt;/strong&gt; &lt;a class="link" href="https://my.feishu.cn/wiki/T5DdwSjGsiU61CkUYVBcPpgunCc?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/T5DdwSjGsiU61CkUYVBcPpgunCc?from=from_copylink&lt;/a&gt;
&lt;strong&gt;Dunhuang Road Trip Guide:&lt;/strong&gt; &lt;a class="link" href="https://my.feishu.cn/wiki/SN3cw8YF8iqbl1k3rR5cc10Rn9b?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/SN3cw8YF8iqbl1k3rR5cc10Rn9b?from=from_copylink&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="planning-flights-for-complex-trips"&gt;Planning Flights for Complex Trips
&lt;/h2&gt;&lt;p&gt;Ever get stuck right at the beginning trying to sort out travel between multiple cities? It can be a real headache. This is especially true when you&amp;rsquo;re trying to find the best deals for a complex itinerary during peak holidays, like National Day or Spring Festival, when flight prices go wild.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/Xnip2025-11-13_11-21-36.webp"
loading="lazy"
alt="Excel multi-leg flight price comparison table with Date/Fly/Notes/Hangzhou-Bangkok/Bangkok-Phuket/Phuket-Bangkok/Bangkok-Hangzhou columns, yellow for lowest price, red/green for price swings"
&gt;&lt;/p&gt;
&lt;p&gt;I built a spreadsheet tool to tackle this. Here’s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dates&lt;/strong&gt;: List your potential travel dates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fares&lt;/strong&gt;: Look up and record the lowest fare for each day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fill&lt;/strong&gt;: Just fill in the white columns; the gray ones will auto-calculate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Indicators&lt;/strong&gt;: Yellow marks the cheapest fare for a leg. Red or green shows a big price swing from the day before (defaults to 15%, but you can change it).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm&lt;/strong&gt;: When you&amp;rsquo;ve picked a flight, check its box to keep track.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step 2 takes the most time, but AI can speed it up. AI browsers like Comet and Atlas or AI agents like Manus and Minimax can handle it, but your standard chatbot can&amp;rsquo;t. You&amp;rsquo;ll need some decent prompting skills, or you might get incomplete or no data at all. Honestly, since this is something you only do a couple of times a year, doing it manually is still the most reliable approach.&lt;/p&gt;
&lt;p&gt;The sheet supports up to 8 flight legs, plenty even for a multi-city European tour. Then again, if you have enough time for a month-long, multi-city journey, you probably aren&amp;rsquo;t too worried about penny-pinching on flights, haha.&lt;/p&gt;
&lt;p&gt;Flight Planning Sheet: &lt;a class="link" href="https://my.feishu.cn/wiki/SIbUw5N3ci79d2kySNqcItRHnYd?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/SIbUw5N3ci79d2kySNqcItRHnYd?from=from_copylink&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="travel-expense-tracking"&gt;Travel Expense Tracking
&lt;/h2&gt;&lt;p&gt;Finally, expense tracking. Skip this if you don&amp;rsquo;t track expenses.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-09/3d367b5c87195d840767ecc6e9739016.jpg"
loading="lazy"
alt="Excel travel expense tracker for 4 people totaling 22976 yuan at 5744 per person, categories: Intercity Transport 38.13%/City Transport 14.64%/Accommodation 9.14%/Activities 30.35%/Food 7.74%"
&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sharing an Excel spreadsheet that calculates expense percentages and per capita costs, useful for splitting bills with friends.&lt;/p&gt;
&lt;p&gt;Travel Expense Tracking Template: &lt;a class="link" href="https://my.feishu.cn/wiki/Q76ywiamqiBKeTkTxhrcBW4MnVd?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/Q76ywiamqiBKeTkTxhrcBW4MnVd?from=from_copylink&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Blockchain-Powered Blogging</title><link>https://victor42.eth.limo/post-en/3608/</link><pubDate>Sat, 19 Feb 2022 21:47:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3608/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2022-02/IPFS.jpg" alt="Featured image of post Blockchain-Powered Blogging" /&gt;&lt;p&gt;During the Spring Festival, I dove into some tech projects I&amp;rsquo;d been curious about. The best way to learn is by doing – using the tech, reading the docs, and getting hands-on. This led me to move my blog to the blockchain.&lt;/p&gt;
&lt;p&gt;And it worked! My new blog is at &lt;a class="link" href="https://victor42.eth.limo/" target="_blank" rel="noopener"
&gt;https://victor42.eth.limo/&lt;/a&gt;. Eventually, when blockchain browsers are common, I might just use &lt;a class="link" href="https://victor42.eth/" target="_blank" rel="noopener"
&gt;https://victor42.eth/&lt;/a&gt;, the actual address.&lt;/p&gt;
&lt;p&gt;This is a long post, so here&amp;rsquo;s a summary of what&amp;rsquo;s covered, and the background you&amp;rsquo;ll need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Traditional Web&lt;/strong&gt;: A basic overview of how websites are accessed. No prior knowledge needed (hopefully!). Skip this if you&amp;rsquo;re familiar with networking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ownership on the Traditional Web&lt;/strong&gt;: What a website owner does to publish, and who controls each part. No prerequisites, but easier if you own a website.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New Tech Explained&lt;/strong&gt;: How websites work in the blockchain world, compared to the traditional web. You&amp;rsquo;ll need a basic understanding of blockchain, Ethereum, and BitTorrent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Putting the New Tech into Practice&lt;/strong&gt;: Tools and steps to deploy your own blockchain website. You&amp;rsquo;ll need experience building traditional websites, understanding DNS, and setting up a static site on GitHub. For a blockchain domain (optional), you&amp;rsquo;ll need to understand crypto wallets, transactions, and buying Ether.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-traditional-web"&gt;The Traditional Web
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve been exploring ENS and IPFS, which I&amp;rsquo;ll explain later. First, let&amp;rsquo;s see how my blog worked before.&lt;/p&gt;
&lt;p&gt;Key components include the domain name, DNS, IP address, and server. Accessing a website is like sending a package.&lt;/p&gt;
&lt;p&gt;Imagine sending a gift to a friend at the Palace Museum. You need their address. They receive it and send you postcards in return.&lt;/p&gt;
&lt;h3 id="domain-names"&gt;Domain Names
&lt;/h3&gt;&lt;p&gt;My blog was previously at &lt;a class="link" href="https://victor42.eth.limo/" target="_blank" rel="noopener"
&gt;https://victor42.eth.limo/&lt;/a&gt;. I&amp;rsquo;ll keep that domain for about six months, but I don&amp;rsquo;t plan to renew it.&lt;/p&gt;
&lt;p&gt;A domain name is a website&amp;rsquo;s nickname, making it easy to remember. Sharing the domain lets others access your site.&lt;/p&gt;
&lt;p&gt;A website can have multiple domains. However, a domain can only point to one website. It&amp;rsquo;s first-come, first-served.&lt;/p&gt;
&lt;p&gt;Think of &amp;ldquo;The Palace Museum&amp;rdquo; – everyone knows it. But asking for directions in a Guangzhou dim sum restaurant might get you strange looks.&lt;/p&gt;
&lt;p&gt;Knowing the name isn&amp;rsquo;t enough.&lt;/p&gt;
&lt;h3 id="dns-ip-and-servers"&gt;DNS, IP, and Servers
&lt;/h3&gt;&lt;p&gt;DNS (Domain Name System) points a domain name to an IP address.&lt;/p&gt;
&lt;p&gt;DNS needs DNS servers to work. Think of these as large machines in a server room – just the unit, no monitor or keyboard. They&amp;rsquo;re usually controlled remotely.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/taylor-vick-M5tzZtFCOfs-unsplash.jpg"
loading="lazy"
alt="Close-up photograph of cloud server racks in a traditional Web2 data center, showing rows of black server cabinets with blinking indicator lights and network cables, representing the physical infrastructure that hosts websites on the conventional internet"
&gt;&lt;/p&gt;
&lt;p&gt;You likely encounter IP addresses with your router (e.g., 192.168.1.1). This number string is your router&amp;rsquo;s location on your home network. Typing it into your browser usually opens the router&amp;rsquo;s settings. On the internet, IP addresses can represent PCs, phones, cell towers, cameras, servers&amp;hellip;&lt;/p&gt;
&lt;p&gt;When you visit a website, the IP usually points to a server storing the website&amp;rsquo;s code and data. Your browser uses DNS to find the IP and tells the server to send the content. The content appears in your browser.&lt;/p&gt;
&lt;p&gt;Back to the real world, DNS servers are like people guiding you. You ask, &amp;ldquo;How do I send something to the Palace Museum?&amp;rdquo; A grocery shopper says, &amp;ldquo;Ask someone younger.&amp;rdquo; A Starbucks barista says, &amp;ldquo;Ask someone in Beijing.&amp;rdquo; A colleague from Beijing says, &amp;ldquo;It&amp;rsquo;s 4 Jingshan Front Street, Dongcheng District, Beijing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;People who know tell you directly; others point you to someone else. This relay gets you the address, the Palace Museum, from just the name. That&amp;rsquo;s how DNS servers work. The IP is like the street address, unique without duplication. You send your gift. Your friend sends back postcards, showing the Palace Museum&amp;rsquo;s beauty (like the server sending website content).&lt;/p&gt;
&lt;p&gt;IP addresses are unique in both directions. One address, one place.&lt;/p&gt;
&lt;h2 id="ownership-on-the-traditional-web"&gt;Ownership on the Traditional Web
&lt;/h2&gt;&lt;p&gt;That&amp;rsquo;s how accessing a website works. But who controls each part?&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve looked at it from the visitor&amp;rsquo;s side. Now, let&amp;rsquo;s see what a website owner does to make their site visible.&lt;/p&gt;
&lt;h3 id="domain-names-1"&gt;Domain Names
&lt;/h3&gt;&lt;p&gt;Let&amp;rsquo;s examine a familiar URL:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.baidu.com" target="_blank" rel="noopener"
&gt;http://www.baidu.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It has four parts:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Domain-Explanation-2.12.2019-02.jpg"
loading="lazy"
alt="Educational diagram breaking down the structure of a URL, highlighting the four components of http://www.baidu.com: protocol, subdomain, main domain, and top-level domain, with arrows pointing to each section for clear visual explanation"
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;http://&lt;/li&gt;
&lt;li&gt;www&lt;/li&gt;
&lt;li&gt;baidu&lt;/li&gt;
&lt;li&gt;com&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;http://&lt;/strong&gt; is the protocol (&lt;strong&gt;H&lt;/strong&gt;yper&lt;strong&gt;T&lt;/strong&gt;ext &lt;strong&gt;T&lt;/strong&gt;ransfer &lt;strong&gt;P&lt;/strong&gt;rotocol). It&amp;rsquo;s an agreement between your browser and the server on how to transmit information.&lt;/p&gt;
&lt;p&gt;Other protocols exist. But HTTP is standard for websites, so we often omit it and just say &lt;a class="link" href="https://www.baidu.com" target="_blank" rel="noopener"
&gt;www.baidu.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s discuss the other three parts in reverse.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Domain-Explanation-2.12.2019-02.jpg"
loading="lazy"
alt="URL structure diagram with the com top-level domain section highlighted in orange, explaining that TLDs categorize websites by purpose such as company, education, or military, and are controlled by the international organization ICANN"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;com&lt;/strong&gt; is the top-level domain (TLD), categorizing websites. Examples: .com (company), .edu (education), .mil (military). Two-letter TLDs represent regions (e.g., .cn for China, .uk for Britain).&lt;/p&gt;
&lt;p&gt;ICANN controls top-level domains. It decides which names can be TLDs. See the allowed TLDs here: &lt;a class="link" href="https://data.iana.org/TLD/tlds-alpha-by-domain.txt" target="_blank" rel="noopener"
&gt;https://data.iana.org/TLD/tlds-alpha-by-domain.txt&lt;/a&gt;. ICANN is a non-profit, but with enough money, you might get a TLD.&lt;/p&gt;
&lt;p&gt;Apple registered .apple (different from apple.com; it&amp;rsquo;s xxx.apple!). They could use iphone.apple, ipad.apple&amp;hellip; shorter than apple.com/iphone.&lt;/p&gt;
&lt;p&gt;But .com is ingrained. People say it automatically. You only need the brand name, apple, and add .com. Registering .apple is mainly brand protection.&lt;/p&gt;
&lt;p&gt;.com is so common because of commerce. Businesses register and maintain domains to build brands and drive revenue. They have more incentive than educational institutions or non-profits. So, .com became dominant, broadening its meaning.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Domain-Explanation-2.12.2019-02.jpg"
loading="lazy"
alt="URL structure diagram highlighting the baidu main domain section in orange, explaining that the main domain combined with the top-level domain forms a complete address controlled by domain registrars and cloud service providers"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;baidu&lt;/strong&gt; is part of the main domain. With the TLD, it forms the complete main domain. Baidu.com means &amp;ldquo;a company called Baidu.&amp;rdquo; Baidu bought this domain and pointed it to their search engine.&lt;/p&gt;
&lt;p&gt;Domain registrars and cloud providers control main domains, charging annually. GoDaddy is well-known internationally; in China, there&amp;rsquo;s Wanwang, Ename, Alibaba Cloud, and Tencent Cloud. You choose a domain and pay for a few years. You can use it and point it anywhere. But the service provider still owns it and can take it back.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Domain-Explanation-2.12.2019-02.jpg"
loading="lazy"
alt="URL structure diagram with the www subdomain section highlighted in orange, explaining that subdomains like www represent World Wide Web and can be freely created by the main domain owner to point to different services"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;www&lt;/strong&gt; is a second-level domain, or subdomain. &lt;a class="link" href="https://www.baidu.com" target="_blank" rel="noopener"
&gt;www.baidu.com&lt;/a&gt; and baidu.com are different.&lt;/p&gt;
&lt;p&gt;Owning the main domain (baidu.com) lets you add subdomains through your registrar or DNS provider. For example, help.baidu.com (customer support), map.baidu.com (Baidu Maps). www points to the search engine, like the main domain.&lt;/p&gt;
&lt;p&gt;Why the redundancy? &amp;ldquo;www&amp;rdquo; means World Wide Web. Early on, websites weren&amp;rsquo;t the internet&amp;rsquo;s core. Domains were used for email, file transfer, etc. Websites were another service. So, www indicated the official website. Later generations did the same, even without other services. People still do it, forgetting why.&lt;/p&gt;
&lt;p&gt;Subdomains belong to the main domain. You control their usage, but the registrar owns them.&lt;/p&gt;
&lt;p&gt;As an aside, the domain name order seems reversed. But the internet&amp;rsquo;s inventors were Western, especially English speakers. English addresses go from smallest to largest:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;#20A, 2345 Belmont Avenue, Durham, NC， 27700&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Building, street, city, state. It&amp;rsquo;s a cultural difference.&lt;/p&gt;
&lt;h3 id="dns"&gt;DNS
&lt;/h3&gt;&lt;p&gt;Don&amp;rsquo;t announce your domain yet. Typing it in a browser won&amp;rsquo;t work. It&amp;rsquo;s not pointed to a server. Pointing is called domain resolution.&lt;/p&gt;
&lt;p&gt;A domain points to one website. Resolution rights are crucial. Whoever controls them decides where the domain is used.&lt;/p&gt;
&lt;p&gt;Initially, resolution rights are with the domain provider. But specialized DNS providers offer better services (Cloudflare internationally, DNSPod in China). To use them, transfer resolution rights from the registrar to the DNS provider. Then, set the domain&amp;rsquo;s destination in the DNS provider&amp;rsquo;s interface. DNS services often have free and paid features.&lt;/p&gt;
&lt;p&gt;The DNS provider now has resolution rights. You control where the domain points, but it&amp;rsquo;s not 100% yours. An employee or hacker could point your domain elsewhere. It&amp;rsquo;s like the fine print: final interpretation rights belong to the DNS provider.&lt;/p&gt;
&lt;h3 id="ip-and-servers"&gt;IP and Servers
&lt;/h3&gt;&lt;p&gt;Finally, put your website code and data on a server so the domain can point to it via DNS. Let&amp;rsquo;s assume a simple website with one server.&lt;/p&gt;
&lt;p&gt;Rent a server from a cloud provider (Alibaba Cloud, Tencent Cloud). Servers have monthly bills based on disk space, data sent, etc.&lt;/p&gt;
&lt;p&gt;Once the server is set up, you&amp;rsquo;ll have its IP address. Use DNS to point your domain to it. Your website is now public.&lt;/p&gt;
&lt;p&gt;Since the server is rented, you only have usage rights. The cloud provider can shut it down or delete its contents.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/%e5%a4%a9%e5%bc%baTR261F.jpg"
loading="lazy"
alt="Product photograph of a Tianqiang TR261F tower server hardware unit, showing a black metal chassis with front panel drive bays and ventilation grilles, representing the type of physical server that can be self-hosted in an office"
&gt;&lt;/p&gt;
&lt;p&gt;Alternatively, buy a server and put it in your office. A company I worked for did this. The server and contents are completely under your control. But this needs a high-quality network. Small websites usually don&amp;rsquo;t do this.&lt;/p&gt;
&lt;h2 id="the-new-tech-explained"&gt;The New Tech Explained
&lt;/h2&gt;&lt;p&gt;That&amp;rsquo;s the traditional web. Now, let&amp;rsquo;s explore the new technology.&lt;/p&gt;
&lt;h3 id="ens"&gt;ENS
&lt;/h3&gt;&lt;p&gt;As mentioned, ICANN controls top-level domains. But many teams challenge this. They believe domains are internet infrastructure, concerning everyone, and shouldn&amp;rsquo;t be controlled by a centralized organization – not even a non-profit. They advocate blockchain smart contracts to manage domains (top-level, main, subdomains). This ensures open, transparent, and trustworthy management.&lt;/p&gt;
&lt;p&gt;Four main blockchain projects provide domain services: HandShake (HNS), DecentraWeb (DWEB), Ethereum Name Service (ENS), and Unstoppable Domains. The first two offer top-level domain registration/trading; the latter two control some top-level domains and offer main domain registration.&lt;/p&gt;
&lt;p&gt;![Screenshot of the ENS blockchain domain registration website search page, showing the interface where users can search for and purchase .eth domains, with a search bar and domain availability results displayed on a clean white background](&lt;a class="link" href="https://cdn.victor42.work/posts/2022-02/" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/posts/2022-02/&lt;/a&gt;截屏 2022-02-17-下午 3.26.59.jpg)&lt;/p&gt;
&lt;p&gt;The blockchain world has strange top-level domains: .x, .eth, .coin, .wallet, .888, even emojis. These bypass ICANN. Control and ownership are recorded on the blockchain, operating by smart contract rules, not controlled by the founding teams.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Snipaste_2022-02-19_22-53-11.jpg"
loading="lazy"
alt="ENS dashboard screenshot showing the blockchain ownership record details for the victor42.eth domain, displaying the wallet address that owns the domain and the registration expiration date on a dark themed interface"
&gt;&lt;/p&gt;
&lt;p&gt;My domain (victor42.eth) is from &lt;a class="link" href="https://ens.domains/" target="_blank" rel="noopener"
&gt;ENS&lt;/a&gt;, an Ethereum-based service where domains end in .eth. After purchase, a smart contract records on Ethereum: &amp;ldquo;victor42.eth belongs to wallet xxxxxxxxx for 20 years.&amp;rdquo; This is recognized and protected by Ethereum. xxxxxxxxx is my Ethereum wallet address.&lt;/p&gt;
&lt;p&gt;ENS also provides domain resolution. In the blockchain world, DNS isn&amp;rsquo;t strictly necessary. On the traditional web, DNS providers ensure security, preventing tampering. But the blockchain is inherently secure. Domain resolution becomes simpler, a feature domain service providers can easily add.&lt;/p&gt;
&lt;p&gt;With this domain, no one can transfer it or point it elsewhere during the usage period, not even Vitalik, Ethereum&amp;rsquo;s founder. After the period, if I don&amp;rsquo;t renew, the smart contract reclaims it.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the difference between blockchain and traditional domains? Let&amp;rsquo;s compare the traditional web and blockchain.&lt;/p&gt;
&lt;p&gt;The traditional web transmits information. Domains are nicknames for content. WeChat Pay transmits monetary value &lt;em&gt;as information&lt;/em&gt;, requiring UnionPay to verify it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/v2-1c7c39a838509163666786299a1aaa0c_1440w.jpg"
loading="lazy"
alt="Comparison diagram illustrating the difference between the traditional information transmission web and the blockchain value network, showing how traditional networks require intermediaries like UnionPay while blockchain networks verify value transfer directly through cryptography"
&gt;&lt;/p&gt;
&lt;p&gt;The blockchain network transmits value. It&amp;rsquo;s an economic system using cryptography, verifying value transfer itself. Wallet accounts are the infrastructure. Domains nickname wallet addresses. Pointing to content is an additional function.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Screen-Shot-2018-06-29-at-6.00.20-PM.jpg"
loading="lazy"
alt="Screenshot of a cryptocurrency wallet interface displaying a long hexadecimal Ethereum address, showing the complex string of characters that represents a wallet account on the blockchain network"
&gt;&lt;/p&gt;
&lt;p&gt;An Ethereum wallet address is hard to remember. That&amp;rsquo;s why it needs a domain.&lt;/p&gt;
&lt;p&gt;Blockchain domains can point to a wallet and content. Entering the domain during a transfer sends it to the wallet; opening it in a browser displays the content.&lt;/p&gt;
&lt;h3 id="ipfs"&gt;IPFS
&lt;/h3&gt;&lt;p&gt;The previous section covered blockchain domains, which I now own and can point to a website. The next step is finding a decentralized hosting solution.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll detail the specifics later. This section explains IPFS&amp;rsquo;s technical principles. It works differently than the usual C drive, folder, subfolder structure.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re able, check out this video first (it&amp;rsquo;s more intuitive than my explanation): &lt;a class="link" href="https://www.youtube.com/watch?v=5Uj6uR3fp-U" target="_blank" rel="noopener"
&gt;https://www.youtube.com/watch?v=5Uj6uR3fp-U&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/IPFS.jpg"
loading="lazy"
alt="Official logo and icon of the InterPlanetary File System (IPFS), featuring a distinctive geometric honeycomb-like network pattern in blue and white colors, representing the decentralized storage technology"
&gt;&lt;/p&gt;
&lt;p&gt;Despite the &amp;ldquo;IP&amp;rdquo; in its name, IPFS is unrelated to traditional IP addresses. It stands for InterPlanetary File System. Crucially, if anyone on the IPFS network deems content valuable and keeps it, no one can delete or stop its spread.&lt;/p&gt;
&lt;p&gt;This might seem commonplace. Isn&amp;rsquo;t the traditional web similar? If a Weibo account posts something inappropriate, even after deletion, screenshots can ensure it&amp;rsquo;s not forgotten. That&amp;rsquo;s the internet&amp;rsquo;s open spirit.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/Snipaste_2022-02-19_23-09-55.jpg"
loading="lazy"
alt="Diagram illustrating how IPFS distributes data across multiple nodes using sharding and hash validation, showing how files are broken into pieces and stored across a decentralized network with cryptographic verification"
&gt;&lt;/p&gt;
&lt;p&gt;However, PR exists. Most content spreads on major platforms. If these platforms cooperate to remove content, widespread dissemination stops. PR can&amp;rsquo;t erase content globally, but it can make it invisible to most. You can still copy it to a USB, but those unaware won&amp;rsquo;t know where to find it.&lt;/p&gt;
&lt;p&gt;But, how do pirated movies spread? Studios can&amp;rsquo;t stop them, right? Exactly. Pirated movies use distributed networks, not just the traditional web.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/18aebc5f0c14c27bc4ccc13a2a46b7b1eff939e1.jpg"
loading="lazy"
alt="Screenshot of a BitTorrent client window showing peer-to-peer file downloads in progress, displaying multiple seed connections and transfer speeds, illustrating the distributed network technology that inspired IPFS"
&gt;&lt;/p&gt;
&lt;p&gt;Downloading with Xunlei requires a BT torrent file. Xunlei uses the torrent, showing seed count. More seeds mean faster downloads; no seeds mean no download. Each seed is a device storing the content, often other downloaders. You&amp;rsquo;re not downloading from a server, but from other seeds. Blocking content requires finding and destroying all seeds – practically impossible.&lt;/p&gt;
&lt;p&gt;IPFS uses this for file transfer, but also as a storage method. How does the network know each seed has the &lt;em&gt;same&lt;/em&gt; movie, given different versions (full, cut, original audio, dubbed)?&lt;/p&gt;
&lt;p&gt;The answer: content separation at the file level. Different BT torrents mean different versions. This uses a &lt;em&gt;hash algorithm&lt;/em&gt;, encrypting any content into a fixed-length string, like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;23db6982caef9e9152f1a5b2589e6ca3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Download sites often show a file&amp;rsquo;s MD5 code (a type of hash algorithm) to verify against tampering or viruses after download.&lt;/p&gt;
&lt;p&gt;Hash algorithms have a key feature: identical content, using the same algorithm, &lt;em&gt;always&lt;/em&gt; produces the same result, regardless of time or location. Even a tiny change (e.g., a Chinese period to an English one) drastically alters the resulting code. This one-to-one correspondence means hash algorithms provide a unique ID for any content, like a social security number.&lt;/p&gt;
&lt;p&gt;This makes IPFS efficient. Content is distributed via its hash code. Displaying it requires retrieving the entire content from the IPFS network.&lt;/p&gt;
&lt;p&gt;For example, NFT digital collectibles. Ownership is recorded on the blockchain (&amp;ldquo;Content xxxxxx belongs to so-and-so&amp;rdquo;). A collectible can be large (image, music, video). How can a blockchain, with small blocks, store this? It stores the &lt;em&gt;hash code&lt;/em&gt;, uniquely identifying the content, confirming ownership. ENS domains are also NFTs, but with practical uses beyond viewing.&lt;/p&gt;
&lt;p&gt;IPFS builds its storage on this. Unlike traditional storage (retrieving by &lt;em&gt;location&lt;/em&gt;, like sending a package to a specific address), IPFS retrieves by &lt;em&gt;content&lt;/em&gt;. Knowing the content (its hash code ID) is enough. You request &amp;ldquo;content 23db6982caef9e9152f1a5b2589e6ca3,&amp;rdquo; and IPFS finds and delivers it from the closest source.&lt;/p&gt;
&lt;p&gt;This has advantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reliability:&lt;/strong&gt; Any device with the content can transmit it. Even if major data centers are destroyed, you can still download from a neighbor via IPFS, as long as the network is up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speed:&lt;/strong&gt; It finds the closest source, ensuring fast transmission, like BT seed downloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Saving:&lt;/strong&gt; On the traditional web, the same video posted on multiple platforms (WeChat, Weibo, TikTok) is stored multiple times. IPFS theoretically needs only minimal server backups, with most storage and transmission through personal devices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tamper-proof:&lt;/strong&gt; Each piece of content has a unique code. Tampering creates a new code. The original code always leads to the original content, making it ideal for recording information age history, avoiding the &lt;a class="link" href="https://victor42.eth.limo/post-en/3584/" target="_blank" rel="noopener"
&gt;digital dark age&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Disadvantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unpopular content may be harder to access if few devices store it and are offline. However, uploaders can keep important content online.&lt;/li&gt;
&lt;li&gt;IPFS is open; it can&amp;rsquo;t store private data. It&amp;rsquo;s unsuitable for personal cloud drives. Posted content is publicly visible.&lt;/li&gt;
&lt;li&gt;Think before posting; there&amp;rsquo;s no going back. Changes generate new content, not overwrites.&lt;/li&gt;
&lt;li&gt;Version fragmentation: Updates create new versions. Identifying the latest is addressed later.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/1_QVpq6pw2gbbtCmVybBrEuA.jpg"
loading="lazy"
alt="Technical comparison diagram showing the difference between IPFS content addressing and traditional network location addressing, with visual representations of how each method retrieves data from the network"
&gt;&lt;/p&gt;
&lt;p&gt;The name &amp;ldquo;InterPlanetary File System&amp;rdquo; isn&amp;rsquo;t just hype. If we colonize Mars, how will information transfer? Earth-Mars distance varies. Communication can take 4-24 minutes one-way, or be impossible during solar conjunction (like Tianwen-1).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/de4c7603471048a69eea26092fa89d0f.jpg"
loading="lazy"
alt="Scientific concept diagram showing solar conjunction interference with Mars space probes, illustrating how the sun blocks communication between Earth and Mars spacecraft during certain orbital positions"
&gt;&lt;/p&gt;
&lt;p&gt;With the traditional web, a Martian accessing Wikipedia on Earth would face 8+ minute delays &lt;em&gt;per page&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Why not store Wikipedia&amp;rsquo;s data on Mars? Martian colonization will be gradual. Earth&amp;rsquo;s internet holds vast data. Copying &lt;em&gt;everything&lt;/em&gt; is impractical. Only important data would be prioritized; less important data (like &lt;a class="link" href="https://baike.baidu.com/item/%E5%B7%B4%E6%96%AF%E5%85%8B%E8%AF%AD/6715189" target="_blank" rel="noopener"
&gt;Basque&lt;/a&gt;) would remain on Earth.&lt;/p&gt;
&lt;p&gt;With IPFS, the &lt;em&gt;first&lt;/em&gt; Martian accessing Basque still faces the delay (blame Einstein, not me). But subsequent Martians can access it directly from the first user&amp;rsquo;s device, quickly. If that first user is a linguistics professor who deems it important, they can put it on a Martian IPFS server, establishing Basque data on Mars.&lt;/p&gt;
&lt;p&gt;IPFS itself isn&amp;rsquo;t a blockchain; it&amp;rsquo;s a network like BT downloads. The IPFS team created Filecoin, a blockchain using cryptocurrency to reward users for providing storage, maintaining IPFS and improving reliability. I won&amp;rsquo;t detail that. IPFS is crucial for the blockchain world, less so for the traditional web, so I consider it part of the former. Calling websites on IPFS &amp;ldquo;blockchain websites&amp;rdquo; isn&amp;rsquo;t perfectly accurate, but it&amp;rsquo;s simpler.&lt;/p&gt;
&lt;h3 id="ipns"&gt;IPNS
&lt;/h3&gt;&lt;p&gt;ENS handles domain + DNS, IPFS handles IP + server. Ready to build a blockchain website? Not quite. There&amp;rsquo;s a key issue, unique to IPFS.&lt;/p&gt;
&lt;p&gt;Traditional storage updates by replacing content at a location. IPFS finds content via hash codes. Updates create &lt;em&gt;new&lt;/em&gt; content; the old hash code remains. How do users see the &lt;em&gt;latest&lt;/em&gt; version of a constantly updated website? Announcing new hash codes constantly is impractical.&lt;/p&gt;
&lt;p&gt;IPFS has a built-in mechanism, IPNS (InterPlanetary Name System), similar to DNS. The &amp;ldquo;NS&amp;rdquo; is the same. It&amp;rsquo;s like a hash code, but points to different content without changing itself. Associating IPNS with IPFS content makes IPNS automatically point to the new version&amp;rsquo;s hash code after updates, like a traditional URL.&lt;/p&gt;
&lt;p&gt;ENS domains can point to IPNS, connecting everything. The website access process is entirely within the blockchain world:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ENS domain -&amp;gt; ENS points to -&amp;gt; IPNS -&amp;gt; Latest IPFS content -&amp;gt; Website&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="putting-the-new-tech-into-practice"&gt;Putting the New Tech into Practice
&lt;/h2&gt;&lt;p&gt;Theory is done, now for practice, which is simple.&lt;/p&gt;
&lt;p&gt;The blockchain world has evolved beyond speculation. Many practical applications are building the next-generation network infrastructure. You can use existing applications for deployment, which is convenient.&lt;/p&gt;
&lt;h3 id="blockchain-domains"&gt;Blockchain Domains
&lt;/h3&gt;&lt;p&gt;Domains and storage are separate. Blockchain domains can point to traditional websites, and &lt;strong&gt;traditional domains can point to blockchain websites&lt;/strong&gt;. A blockchain domain isn&amp;rsquo;t mandatory.&lt;/p&gt;
&lt;p&gt;This is likely the only part requiring money. You buy a domain on &lt;a class="link" href="https://ens.domains/" target="_blank" rel="noopener"
&gt;ENS&lt;/a&gt; using Ether. Cryptocurrency trading regulations in mainland China might be a hurdle. But if you&amp;rsquo;re this far, you&amp;rsquo;ve likely bought crypto before.&lt;/p&gt;
&lt;p&gt;If not, &lt;strong&gt;wait&lt;/strong&gt;. Understand cryptocurrency wallets (accounts, transfers) &lt;em&gt;before&lt;/em&gt; buying. Don&amp;rsquo;t use shady exchanges. Lack of understanding can lead to financial loss.&lt;/p&gt;
&lt;p&gt;Once you understand, you&amp;rsquo;ll know how and where to buy. Bypassing the firewall and using Google is prerequisite. It&amp;rsquo;s hard to navigate within the Chinese internet.&lt;/p&gt;
&lt;p&gt;The purchase is similar to traditional domains; no step-by-step tutorial is needed. You&amp;rsquo;ll have an Ethereum wallet with a .eth domain. Leave extra Ether for transaction fees during domain pointing setup.&lt;/p&gt;
&lt;h3 id="fleek"&gt;Fleek
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://fleek.co/" target="_blank" rel="noopener"
&gt;Fleek&lt;/a&gt; handles everything else: deploying websites on IPFS and domain pointing. It&amp;rsquo;s free for personal websites with low traffic.&lt;/p&gt;
&lt;p&gt;Fleek has two upload methods. &amp;ldquo;Storage&amp;rdquo; is like Baidu Netdisk. Upload a file, get an IPFS-stored link:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://cdn.victor42.work/tools/ps-bulkrename.png" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/tools/ps-bulkrename.png&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;![Screenshot of the Fleek decentralized platform Storage dashboard showing uploaded assets and file management interface, where users can upload files to IPFS and get shareable links](&lt;a class="link" href="https://cdn.victor42.work/posts/2022-02/" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/posts/2022-02/&lt;/a&gt;截屏 2022-02-18-下午 4.51.35.jpg)&lt;/p&gt;
&lt;p&gt;This is for sharing individual files, not domain binding. I use it for image hosting in blog posts.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hosting&amp;rdquo; links to your GitHub account, reading code from a repository.&lt;/p&gt;
&lt;p&gt;![Screenshot of the Fleek Hosting page showing the step-by-step process to link a GitHub account for decentralized website deployment on IPFS](&lt;a class="link" href="https://cdn.victor42.work/posts/2022-02/" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/posts/2022-02/&lt;/a&gt;截屏 2022-02-18-下午 4.52.01.jpg)&lt;/p&gt;
&lt;p&gt;Then choose your static website system.&lt;/p&gt;
&lt;p&gt;![Screenshot of the Fleek configuration page showing the selection of Hugo as the static site build framework for deploying a blockchain website on IPFS](&lt;a class="link" href="https://cdn.victor42.work/posts/2022-02/" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/posts/2022-02/&lt;/a&gt;截屏 2022-02-18-下午 4.43.25.jpg)&lt;/p&gt;
&lt;p&gt;My previous blog used &lt;a class="link" href="https://hexo.io/" target="_blank" rel="noopener"
&gt;Hexo&lt;/a&gt;, a good system. But its creators and users are mainly Chinese-speaking, with low international recognition. Fleek, an overseas product, doesn&amp;rsquo;t support Hexo. I chose &lt;a class="link" href="https://gohugo.io/" target="_blank" rel="noopener"
&gt;Hugo&lt;/a&gt;, rebuilt a blog on GitHub, and moved content. Hugo is also excellent. Research building websites with Hugo; it&amp;rsquo;s not blockchain-specific.&lt;/p&gt;
&lt;p&gt;Next, choose the deployment network. The default is IPFS.&lt;/p&gt;
&lt;p&gt;![Screenshot of the Fleek network selection page showing the choice to deploy the website on the decentralized IPFS network rather than other blockchain options](&lt;a class="link" href="https://cdn.victor42.work/posts/2022-02/" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/posts/2022-02/&lt;/a&gt;截屏 2022-02-18-下午 4.52.36.jpg)&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Internet Computer&amp;rdquo; is another option, a different blockchain for deploying services, with its own pros and cons. It&amp;rsquo;s newer and more isolated. I tried it; it&amp;rsquo;s interesting.&lt;/p&gt;
&lt;p&gt;After these steps, the website deploys quickly. Fleek grabs content from GitHub, deploys on IPFS, and provides a subdomain. Your blockchain website is accessible.&lt;/p&gt;
&lt;p&gt;![Screenshot of the Fleek deploy log showing a successful website build on IPFS, displaying the deployment status and the generated IPFS content hash for the blockchain website](&lt;a class="link" href="https://cdn.victor42.work/posts/2022-02/" target="_blank" rel="noopener"
&gt;https://cdn.victor42.work/posts/2022-02/&lt;/a&gt;截屏 2022-02-18-下午 4.53.17.jpg)&lt;/p&gt;
&lt;p&gt;Domain pointing is done in Fleek&amp;rsquo;s Domain Management. For traditional domains, it guides you on filling resolution records with your domain/DNS provider. For ENS domains, follow its instructions; it requires your Ethereum wallet and a small Ether fee.&lt;/p&gt;
&lt;p&gt;You can also add HNS domains (a blockchain top-level domain provider). Ownership is recorded on the Bitcoin blockchain, obtainable via auction on &lt;a class="link" href="https://www.namebase.io/" target="_blank" rel="noopener"
&gt;Namebase&lt;/a&gt; with Bitcoin. You need to generate a main domain after getting the top-level domain. I haven&amp;rsquo;t tried this.&lt;/p&gt;
&lt;h3 id="ethlimo"&gt;eth.limo
&lt;/h3&gt;&lt;p&gt;Your blockchain website is set up: domain, IPFS deployment, domain pointing. But with a blockchain domain, typing xxxx.eth into a browser &lt;em&gt;won&amp;rsquo;t work&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t the blockchain&amp;rsquo;s fault. Most browsers are from the traditional web era, recognizing only ICANN-approved protocols/domains. Non-HTTP protocols or domains not on ICANN&amp;rsquo;s list won&amp;rsquo;t open. There&amp;rsquo;s a gap.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://eth.limo/" target="_blank" rel="noopener"
&gt;eth.limo&lt;/a&gt; bridges this gap. Add .limo to your domain (e.g., &lt;a class="link" href="https://victor42.eth.limo/" target="_blank" rel="noopener"
&gt;https://victor42.eth.limo/&lt;/a&gt;) for any browser. Blockchain-supporting browsers (like Brave) can open it without .limo. But you can&amp;rsquo;t assume all visitors have these.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a creative solution. What does eth.limo do?&lt;/p&gt;
&lt;p&gt;victor42.eth and victor42.eth.limo are fundamentally different. victor42.eth uses .eth as the top-level domain; I own the main domain victor42. victor42.eth.limo uses .limo as the top-level domain; eth.limo is the main domain (not mine); victor42 is my subdomain.&lt;/p&gt;
&lt;p&gt;eth.limo&amp;rsquo;s servers access the blockchain world. Accessing their subdomain, they cross the bridge, package the website&amp;rsquo;s content, and deliver it.&lt;/p&gt;
&lt;p&gt;This diagram explains. The rows: traditional website, traditional domain + blockchain website, blockchain domain + blockchain website.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/processed-faef701d-d810-454e-bef5-5b4b69f5597a_1d9a7f02-b98e-4f64-b034-aeac075ca384.jpg"
loading="lazy"
alt="Multi-row flow chart comparing DNS and ENS routing paths, showing three scenarios: traditional website routing, traditional domain with blockchain website, and blockchain domain with blockchain website using IPFS"
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DNS points the domain to the server, opening the website.&lt;/li&gt;
&lt;li&gt;DNS points the domain to Fleek&amp;rsquo;s server; Fleek finds content on IPFS, opening the website.&lt;/li&gt;
&lt;li&gt;Accessing the traditional domain, the delivery person accesses the blockchain domain, pointing to IPFS content, opening the website.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Red/blue lines: the traditional web/blockchain network border. Crossing it enters a new world.&lt;/p&gt;
&lt;p&gt;eth.limo isn&amp;rsquo;t unique. &lt;a class="link" href="https://eth.link/" target="_blank" rel="noopener"
&gt;eth.link&lt;/a&gt; is more widely used, with a more normal-looking domain name.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2022-02/limousinerental1518120210.jpg"
loading="lazy"
alt="Photograph of an ultra-long white Lincoln stretch limousine car parked outdoors, used to humorously explain the meaning of the .limo top-level domain in blockchain naming"
&gt;&lt;/p&gt;
&lt;p&gt;Limo refers to this. It&amp;rsquo;s still weird.&lt;/p&gt;
&lt;p&gt;I initially used eth.link (by Cloudflare). It&amp;rsquo;s centralized, using Cloudflare&amp;rsquo;s servers. As an overseas product, it had issues in China, occasionally going down. eth.limo uses multiple servers, with multiple bridges, preventing access failures at the last mile.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;That&amp;rsquo;s all.&lt;/p&gt;
&lt;p&gt;ENS and IPFS show a world where new technologies are thriving. They remind us to keep exploring.&lt;/p&gt;</description></item><item><title>Notes on Interior Design from a Designer</title><link>https://victor42.eth.limo/post-en/interior/</link><pubDate>Sun, 26 Mar 2017 01:03:58 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/interior/</guid><description>&lt;p&gt;I&amp;rsquo;ve been compiling these notes for over a year, gathering information and jotting down thoughts. Now, it&amp;rsquo;s time to share.&lt;/p&gt;
&lt;p&gt;In June 2013, I bought a 90-square-meter apartment. It was pre-construction, so I waited two and a half years, finally getting the keys in November 2015. As a UI designer, interior design was unfamiliar territory. But, I decided to manage the renovation myself. The renovation team&amp;rsquo;s designer only measured the rooms and drew up plans for plumbing, electrical, and carpentry. Essentially, I handled 95% of the design, from layout to details.&lt;/p&gt;
&lt;p&gt;It was more rewarding than expected. It was a hassle, yes, but fun. I documented the process to consolidate what I learned.&lt;/p&gt;
&lt;h2 id="should-you-diy"&gt;Should You DIY?
&lt;/h2&gt;&lt;p&gt;This requires careful consideration. You need to understand the project&amp;rsquo;s complexity. Assess if you have the energy and if it&amp;rsquo;s truly for you. Taking charge means managing every detail. You don&amp;rsquo;t have to do the work yourself (full-service, semi-service, or DIY are options), but you need to grasp most of the details.&lt;/p&gt;
&lt;p&gt;Renovation is a collection of small problems. Figuring out where to start took time. Time, space, and budget all factor in. It&amp;rsquo;s unlike computer design; techniques and materials limit you, and budget often dictates choices. Perfection isn&amp;rsquo;t achievable in one go. Everything, including your ideas, will evolve. Embrace the exploration.&lt;/p&gt;
&lt;p&gt;Start by reading articles about renovation. I stumbled upon one about kitchen cabinets, which opened my eyes. The countertop alone had so many details: drip grooves to protect cabinets, raised edges for waterproofing, curved surfaces for easier cleaning&amp;hellip;&lt;/p&gt;
&lt;p&gt;Pay attention to these details. If you&amp;rsquo;re intrigued rather than discouraged, you might be a tinkerer. I hope this content helps.&lt;/p&gt;
&lt;h2 id="pre-preparation-prep"&gt;Pre-Preparation Prep
&lt;/h2&gt;&lt;h3 id="ultimate-goals"&gt;Ultimate Goals
&lt;/h3&gt;&lt;p&gt;Renovation needs clear goals beyond aesthetics. Consider durability, aesthetics, storage, ease of cleaning, and ease of modification. Budget isn&amp;rsquo;t a primary goal; it&amp;rsquo;s a constraint considered within each detail.&lt;/p&gt;
&lt;p&gt;Imagine 10 points to allocate across these 5 indicators (each with a perfect score of 10). My goals were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[3/10] Durability&lt;/li&gt;
&lt;li&gt;[1/10] Aesthetics&lt;/li&gt;
&lt;li&gt;[4/10] Storage&lt;/li&gt;
&lt;li&gt;[2/10] Ease of Cleaning&lt;/li&gt;
&lt;li&gt;[0/10] Ease of Modification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m clearly a storage enthusiast. My girlfriend criticized my designs as ugly. She&amp;rsquo;s right; I neglected aesthetics.&lt;/p&gt;
&lt;p&gt;If unsure, visit friends&amp;rsquo; homes. Don&amp;rsquo;t aim for a mediocre 2/10 on everything. Goals are crucial; stick to them.&lt;/p&gt;
&lt;h3 id="logical-organization"&gt;Logical Organization
&lt;/h3&gt;&lt;p&gt;Before starting, plan how to organize information. Renovation is information-heavy. Consider categorization, organization, summarization, portability, and sharing. Tools, structure, recording methods, and formats matter. Consistent maintenance and updates are key. Adjust your framework as needed.&lt;/p&gt;
&lt;p&gt;I initially used a mind map, which worked for a high-level overview (listing rooms, contents, construction phases). But as details increased, each area became a complex system, beyond a tree structure&amp;rsquo;s capacity. So, each dimension got its own documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Space: floor plans, 3D models, plumbing/electrical diagrams.&lt;/li&gt;
&lt;li&gt;Time: construction/purchasing schedules, photo albums.&lt;/li&gt;
&lt;li&gt;Design: style references, color palettes.&lt;/li&gt;
&lt;li&gt;Budget: spreadsheets.&lt;/li&gt;
&lt;li&gt;ToDoLists for small tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The mind map became less relevant. It served its purpose of untangling initial thoughts.&lt;/p&gt;
&lt;p&gt;Key documents: floor plan, 3D model, dimensions list, color palette, budget spreadsheet, construction/purchasing schedule.&lt;/p&gt;
&lt;h3 id="floor-plan"&gt;Floor Plan
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/1.png"
loading="lazy"
alt="Interior floor plan with exact room dimensions from the renovation company"
&gt;&lt;/p&gt;
&lt;p&gt;The renovation company provides this with precise dimensions. Keep a copy on your phone for early material cost estimates.&lt;/p&gt;
&lt;h3 id="3d-model"&gt;3D Model
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/2.png"
loading="lazy"
alt="3D interior layout model used to plan the home renovation design"
&gt;&lt;/p&gt;
&lt;p&gt;This helps design the layout and communicate ideas. Creating it takes effort, but it&amp;rsquo;s worthwhile for expressing your vision.&lt;/p&gt;
&lt;h3 id="dimensions-list"&gt;Dimensions List
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/3.png"
loading="lazy"
alt="Mobile notes listing detailed room dimensions for renovation planning"
&gt;&lt;/p&gt;
&lt;p&gt;Record dimensions not shown on the floor plan (vertical dimensions, curtain widths, etc.). Note dimensions as you think of them to avoid extra trips.&lt;/p&gt;
&lt;h3 id="color-palette"&gt;Color Palette
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/4.png"
loading="lazy"
alt="Primary and secondary color palette for consistent interior purchases"
&gt;&lt;/p&gt;
&lt;p&gt;Useful for controlling color consistency. Keep it on your phone and follow it strictly, even for small items. This applies to new purchases; don&amp;rsquo;t discard old items solely for color coordination.&lt;/p&gt;
&lt;p&gt;Edit the color palette in Illustrator.&lt;/p&gt;
&lt;h3 id="budget-spreadsheet"&gt;Budget Spreadsheet
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/5.png"
loading="lazy"
alt="Renovation budget sheet comparing estimated and actual plumbing costs"
&gt;&lt;/p&gt;
&lt;p&gt;Essential in later stages, it needs constant updating and mobile access. (I splurged on the kitchen faucet&amp;hellip;)&lt;/p&gt;
&lt;h3 id="construction-and-purchasing-schedule"&gt;Construction and Purchasing Schedule
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/6.png"
loading="lazy"
alt="Construction and purchasing schedule for controlling the renovation timeline"
&gt;&lt;/p&gt;
&lt;p&gt;This document connects the process in time, showing what to do when. Print it, check off completed items, and cross out unnecessary ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These are excerpts. Complete files are available for download at the end of the article.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="home-inspection"&gt;Home Inspection
&lt;/h2&gt;&lt;p&gt;Home inspection is the first step. Ruling out quality issues is paramount. The renovation company will check most items, but ensure thoroughness.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test water pipes: Pour water down each drain to check for blockages and leaks. Leak detection is crucial to define responsibility before renovation.&lt;/li&gt;
&lt;li&gt;Mark hollow areas: Tap walls and floors, circling hollow sounds for repair.&lt;/li&gt;
&lt;li&gt;Check for flatness: Use a straight edge to check wall flatness, which affects tile, flooring, and baseboard installation.&lt;/li&gt;
&lt;li&gt;Look for cracks: Cracks indicate quality problems. Cracks on beams and load-bearing walls are serious. Check adjacent floors.&lt;/li&gt;
&lt;li&gt;Check doors and windows: Ensure smooth operation, tight closure, and no damage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="layout-design"&gt;Layout Design
&lt;/h2&gt;&lt;p&gt;Layout dictates function and lifestyle. A balcony for relaxation needs a table and chairs. Extensive clothing requires a walk-in closet. Yoga needs open living room space. Layout serves lifestyle, not just copying appealing designs.&lt;/p&gt;
&lt;p&gt;Layout comes first, then aesthetics.&lt;/p&gt;
&lt;h3 id="six-sided-measurement-method"&gt;Six-Sided Measurement Method
&lt;/h3&gt;&lt;p&gt;When measuring, a 5cm error is acceptable. The renovation company&amp;rsquo;s measurements suffice for a floor plan, but we need more data, including window size and height for the 3D model.&lt;/p&gt;
&lt;p&gt;First, draw the floor plan. Based on the developer&amp;rsquo;s plan, draw a rough shape. Record wall width and thickness, doorway width and position, bay window size, and pillar size. Mark load-bearing walls.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/7.jpg"
loading="lazy"
alt="Hand drawn floor plan marking load bearing walls before renovation"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My measured floor plan; blacked-out areas are unalterable load-bearing walls. (Excuse my handwriting.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Second, create a labeling diagram. Label each area (e.g., room &amp;lsquo;a&amp;rsquo; is my kitchen). Label kitchen walls a1-a4. Consistent labeling prevents confusion.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/8.jpg"
loading="lazy"
alt="Hand drawn room code map labeling every wall with letters and numbers"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Area &amp;lsquo;h&amp;rsquo; is a small balcony with a water source and drain.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then, draw each room&amp;rsquo;s four walls, one room per page. Record wall height, window size and position, doorway height, beam position, and special facilities (exhaust vents, AC holes). Beam position accuracy is less critical.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/9.jpg"
loading="lazy"
alt="Kitchen wall measurement sketch showing dimensions and exhaust vent position"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My kitchen&amp;rsquo;s four walls. The narrow strips on a2 and a4 are 250mm-high L-shaped beams. I unnecessarily recorded switch/socket positions, as wiring will be redone.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/10.jpg"
loading="lazy"
alt="Master bedroom wall sketch recording dimensions and the L shaped window"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My master bedroom. The frame on g4 is a window, 400mm from the floor, 2100mm high. Combined with g3, it&amp;rsquo;s an L-shaped window.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The top surface is missing from the six-sided method, but it&amp;rsquo;s hard to measure accurately. Visually record beam positions. If there are few beams, drawing them is unnecessary.&lt;/p&gt;
&lt;p&gt;Take photos. They can clarify roughcast details later.&lt;/p&gt;
&lt;h3 id="drawing-the-3d-model"&gt;Drawing the 3D Model
&lt;/h3&gt;&lt;p&gt;Convert measurements to a 3D model while the manuscript is fresh. Learn SketchUp, an architectural design software.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s simple; drawing cubes and cylinders suffices. No need for architectural design expertise. This tutorial is enough for one day:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://study.163.com/course/courseMain.htm?courseId=381005" target="_blank" rel="noopener"
&gt;http://study.163.com/course/courseMain.htm?courseId=381005&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I only finished Chapter 6. I focused on dimensions and furnishings, not material textures.&lt;/p&gt;
&lt;p&gt;Reflecting materials and textures is unnecessary. This diagram is for communication and layout planning. It helps determine room usage and facility purchases.&lt;/p&gt;
&lt;p&gt;The 3D model looks like this – various blocks, but descriptive of furnishings (see below, upper left, microwave to the right of the refrigerator):&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/11.png"
loading="lazy"
alt="Block based 3D model visualizing furniture layout and interior functions"
&gt;&lt;/p&gt;
&lt;p&gt;The challenge isn&amp;rsquo;t drawing, but knowing object dimensions (cabinet height, aisle width). Research and measure. Carry a tape measure.&lt;/p&gt;
&lt;p&gt;Discuss the model with family and friends. Adjust the plan if needed. This 3D model is the core of the renovation plan until soft decoration. Use it for buying materials and communicating with the renovation team. Update it promptly.&lt;/p&gt;
&lt;p&gt;I had several earlier versions. Kitchen sides were swapped, sofa area furnishings were different, and the second bedroom door was elsewhere. Modifying the prototype is better than costly rework.&lt;/p&gt;
&lt;h3 id="special-items-to-consider-first"&gt;Special Items to Consider First
&lt;/h3&gt;&lt;p&gt;Certain items significantly impact layout, usually related to plumbing and electricity. Decide on these before plumbing/electrical work begins. Changing your mind later causes major rework.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/12.jpg"
loading="lazy"
alt="Ceiling air conditioner outlet and fresh air duct layout for renovation planning"
&gt;&lt;/p&gt;
&lt;p&gt;Central AC and fresh air systems require pre-buried pipes/wires and drilled holes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/13.jpg"
loading="lazy"
alt="Underfloor heating pipes and leveling layer installed during home renovation"
&gt;&lt;/p&gt;
&lt;p&gt;Underfloor heating requires electricity and affects floor leveling.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/14.gif"
loading="lazy"
alt="Section diagram explaining downdraft exhaust in an integrated stove"
&gt;&lt;/p&gt;
&lt;p&gt;Integrated stoves have downward smoke exhaust, requiring different socket and vent positions. The space under the stove has options (bowl baskets, disinfection cabinets, ovens, steamers). Ovens require specific wiring; inform the electrician.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/15.jpg"
loading="lazy"
alt="Gas electric and renewable energy water heater options for home renovation"
&gt;&lt;/p&gt;
&lt;p&gt;Decide on the water heater type (gas, electric, air-source, solar). Different types have different plumbing/electrical layouts.&lt;/p&gt;
&lt;p&gt;Consider hot water needs in the kitchen, bathroom, and balcony. If close, one water heater suffices. If far, prioritize the bathroom. For distant kitchens/balconies, consider a small kitchen treasure instead of long pipes. Leave a socket for it. My kitchen and bathroom share a gas water heater; the balcony has an electric faucet.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/43.jpg"
loading="lazy"
alt="Minimal black metal wall lamp mounted on a plain white wall"
&gt;&lt;/p&gt;
&lt;p&gt;Wall lamps and functional lighting require reserved power lines.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/16.jpg"
loading="lazy"
alt="Floor mounted and wall hung toilets compared by appearance and drainage"
&gt;&lt;/p&gt;
&lt;p&gt;For bathroom cabinets and toilets, decide between floor-standing or wall-mounted. This determines drain location (floor or wall).&lt;/p&gt;
&lt;h2 id="defining-your-decor-style"&gt;Defining Your Decor Style
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s get to the fun part: defining your home&amp;rsquo;s style. I admit, I fumbled this a bit.&lt;/p&gt;
&lt;h3 id="finding-your-direction"&gt;Finding Your Direction
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/17.png"
loading="lazy"
alt="Renovation reference folders organized by room on a computer"
&gt;&lt;/p&gt;
&lt;p&gt;Collect interior design photos. Organize them by room (kitchens, bedrooms, etc.). Show your favorites to your partner. Each of you should remove the ones you dislike. The remaining photos will likely suggest one or more styles.&lt;/p&gt;
&lt;p&gt;Then, find more photos of those specific styles and repeat. Removing the disliked images again helps narrow down details. For a Mediterranean kitchen, should cabinets be white or blue? Bedroom walls: paint or wallpaper? Living room: tiles or hardwood? These are key choices. Find mutually agreeable solutions.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t fixate on one style unless you&amp;rsquo;re absolutely certain. Styles often blend – Mediterranean and American, for example. &amp;ldquo;Authenticity&amp;rdquo; isn&amp;rsquo;t crucial; go with what appeals to you. My home mixes modern, Mediterranean, and Scandinavian elements, but most items are neutral. For major purchases like materials and furniture, avoid anything with a very strong style. A single, contrasting item can add drama.&lt;/p&gt;
&lt;h3 id="understanding-style"&gt;Understanding Style
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/18.jpg"
loading="lazy"
alt="Mediterranean style reference with arches mosaics and blue white colors"
&gt;&lt;/p&gt;
&lt;p&gt;Analyze your reference pictures. Identify common elements and extract the universal ones. For Mediterranean: arches, rounded corners, white walls, mosaics, stone, wrought iron, shutters. Incorporate these, and the vibe will follow.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/19.jpg"
loading="lazy"
alt="American style sofa with rolled arms and nailhead trim as decor reference"
&gt;&lt;/p&gt;
&lt;p&gt;Understanding style requires viewing many pictures. Seeing numerous American interiors, you&amp;rsquo;ll recognize those signature sofa armrests.&lt;/p&gt;
&lt;h3 id="choosing-a-color-palette"&gt;Choosing a Color Palette
&lt;/h3&gt;&lt;p&gt;After this process, your basic color scheme should be clear, especially if you&amp;rsquo;re limiting colors. Create a color chart and keep it on your phone for comparisons while shopping. I waited until buying tiles to consider the overall style (a bit late), but the chart still helped. My home&amp;rsquo;s main tone is a bright, true blue. I avoided using too many teal or purple-toned blues to keep the scheme consistent.&lt;/p&gt;
&lt;p&gt;Consider natural wood color. Wood tones, besides wall paint/wallpaper, sofas, and curtains, are significant. Stain colors vary widely. Walnut and ash are usually dark brown, but one might be reddish, the other greenish. Even slight differences can clash.&lt;/p&gt;
&lt;p&gt;My place fails here – wood tones are inconsistent. I recommend a maximum of two wood tones for major items. Be selective with wood-grain furniture.&lt;/p&gt;
&lt;h3 id="be-careful-with-inspiration"&gt;Be Careful with Inspiration
&lt;/h3&gt;&lt;p&gt;Don&amp;rsquo;t blindly copy attractive designs. Restaurants and cafes, while atmospheric, serve different purposes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/20.jpg"
loading="lazy"
alt="Modern restaurant interior with dark ceiling and industrial style design"
&gt;&lt;/p&gt;
&lt;p&gt;Dark ceilings are common in modern restaurants but rare in homes. Dark ceilings can feel oppressive. Lighter elements above heavier ones are visually preferable. A modular TV stand with wall-mounted and floor cabinets shouldn&amp;rsquo;t have larger wall units.&lt;/p&gt;
&lt;p&gt;Restaurant&amp;rsquo;s black ceilings hide pipes and dirt. With downward lighting or high ceilings, they&amp;rsquo;re almost invisible. But homes aren&amp;rsquo;t brightly lit 24/7. Public space decor is a poor reference.&lt;/p&gt;
&lt;p&gt;Open-concept designs (wardrobes, bookshelves, louvered-door shoe cabinets, cabinets) are another example. Consider local air quality. Increased surface area invites dust. Don&amp;rsquo;t copy designs from other regions.&lt;/p&gt;
&lt;h2 id="budgeting"&gt;Budgeting
&lt;/h2&gt;&lt;p&gt;With a large budget, prioritize quality. With a tight budget, control costs. Categorize materials/furniture into four tiers based on the consequences of compromise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safety:&lt;/strong&gt; Gas water heaters/stoves, switches/sockets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Financial Loss:&lt;/strong&gt; Waterproofing, pipes/wires, angle valves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hassle:&lt;/strong&gt; Range hoods, tiles, floor drains.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aesthetics:&lt;/strong&gt; Lamps, TV stands, curtains.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unless aesthetics are paramount, cut costs according to this. Start with top-tier products, understand their benefits, and then make trade-offs. This clarifies your needs.&lt;/p&gt;
&lt;p&gt;Cutting the budget doesn&amp;rsquo;t mean neglecting quality. I skimped on kitchen wall tiles, and they&amp;rsquo;re awful – rough, uneven. Better tiles were available at the same price elsewhere.&lt;/p&gt;
&lt;h3 id="the-imaginary-overall-budget"&gt;The Imaginary Overall Budget
&lt;/h3&gt;&lt;p&gt;Establish a preliminary budget, perhaps based on others&amp;rsquo; experiences. My classmate&amp;rsquo;s 90-square-meter apartment renovation cost 180,000 RMB. I aimed for 160,000 RMB, a somewhat arbitrary figure.&lt;/p&gt;
&lt;h3 id="the-budget-sheet"&gt;The Budget Sheet
&lt;/h3&gt;&lt;p&gt;List your budget items. This document needs constant updating. My renovation was semi-inclusive, so I divided the budget into: semi-inclusive, hard finishes, soft finishes, and small items. Only hard and soft finishes are fully controllable.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/21.jpg"
loading="lazy"
alt="Electrical and plumbing site with red and green conduits during semi package work"
&gt;&lt;/p&gt;
&lt;p&gt;The semi-inclusive part is technical; I don&amp;rsquo;t recommend full DIY for beginners.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/22.jpg"
loading="lazy"
alt="Decorative paintings and soft furnishing items on the living room wall"
&gt;&lt;/p&gt;
&lt;p&gt;Small items (decorations, spice jars, etc.) are bought as needed, so just keep a record.&lt;/p&gt;
&lt;p&gt;My initial ratio of semi-inclusive, hard finishes, and soft finishes was about 6:8:4. This varies. High kitchen demands increase hard finishes; a love of wood furniture increases soft finishes. Determine item prices through research: visiting markets and browsing Taobao. Understand quality levels, price ranges, and brand variations. More knowledge means less expense deviation. Don&amp;rsquo;t forget miscellaneous costs: initial cleaning, property management fees, supplementary materials, delivery fees.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/23.png"
loading="lazy"
alt="Hard decoration and soft furnishing budget sheets grouped by material and room"
&gt;&lt;/p&gt;
&lt;p&gt;Use my sheet as a starting point. Hard finishes are grouped by material (tiles, flooring, doors are bought in bulk), while soft finishes are grouped by space (allowing for more detailed combinations).&lt;/p&gt;
&lt;h3 id="modifying-the-budget"&gt;Modifying the Budget
&lt;/h3&gt;&lt;p&gt;A budget isn&amp;rsquo;t perfect. Allow one modification, and only one. Use it only if you initially underestimated necessary items and prices. It&amp;rsquo;s not for impulsive changes in standards.&lt;/p&gt;
&lt;p&gt;I used this opportunity. I underestimated supplementary materials (wallpaper adhesive, curtain gauze/tracks, screens, appliances, installation). The total budget rose to 185,000 RMB. The final ratio was 6:8:5.&lt;/p&gt;
&lt;h2 id="finding-a-renovation-companyteam"&gt;Finding a Renovation Company/Team
&lt;/h2&gt;&lt;p&gt;This can start during layout planning. I didn&amp;rsquo;t compare many companies.&lt;/p&gt;
&lt;p&gt;My classmate used a relative who was a project manager. Our homes were renovated simultaneously, off-the-books.&lt;/p&gt;
&lt;p&gt;The materials were reliable, and the price was fair. However, renovation teams often overextend, prioritizing whoever pushes hardest. Hard finishes took half a year. It&amp;rsquo;s hard to hold acquaintances fully accountable.&lt;/p&gt;
&lt;p&gt;This off-the-books team lacked professionalism. Floor leveling and plumbing/electrical details were rough. Skill limitations led to less-than-ideal results.&lt;/p&gt;
&lt;h2 id="construction"&gt;Construction
&lt;/h2&gt;&lt;p&gt;Once construction starts, the schedule is key. It clarifies tasks and material needs. Here are some general tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Photograph each phase for reference. You might need to check for a beam location or socket height.
Photograph plumbing/electrical lines before tiling to prevent damage.
&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/24.png"
loading="lazy"
alt="Renovation construction photos organized by project stage on a computer"
&gt;
My photo organization. Cloud storage is essential.&lt;/li&gt;
&lt;li&gt;Hidden furniture saves space but requires more effort. It also needs skilled carpentry.
&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/25.jpg"
loading="lazy"
alt="Concealed folding table and chairs that rise from a wood floor"
&gt;
&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/26.jpg"
loading="lazy"
alt="Hidden kitchen with sliding panels covering the stove and cabinets"
&gt;
Frequently used furniture should be traditional, unless space is extremely limited. Small daily actions become annoying.&lt;/li&gt;
&lt;li&gt;Complexity shortens lifespan. Consider advanced gadgets carefully.&lt;/li&gt;
&lt;li&gt;A flatbed trolley is useful for moving large items.
&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/27.jpg"
loading="lazy"
alt="Flatbed cart used for moving large renovation materials and appliance boxes"
&gt;
Items that aid the transition are worthwhile (ladders, toolboxes, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the construction stages:&lt;/p&gt;
&lt;h3 id="demolition-and-alteration"&gt;Demolition and Alteration
&lt;/h3&gt;&lt;p&gt;This involves removing old renovations, wall modifications, and altering door openings. Even new walls need scraping/repainting. Spatial changes should be updated in the 3D model.&lt;/p&gt;
&lt;p&gt;Cover drainpipes to prevent blockages.&lt;/p&gt;
&lt;p&gt;Drill air conditioning holes now.&lt;/p&gt;
&lt;p&gt;Determine range hood, stove, sink, and built-in appliance brands/models for dimensions. Cabinets are needed, and the hood affects wall cabinet layout. Stove/sink affect countertop openings. This allows time for price comparisons.&lt;/p&gt;
&lt;h3 id="plumbing-and-electrical"&gt;Plumbing and Electrical
&lt;/h3&gt;&lt;p&gt;Before this stage, confirm water outlet, switch, and socket locations with the electrician. Mention high-power appliances (oven sockets need thicker wires). Specify wall lamp, night light, and speaker locations for wiring. I later switched two sockets and found the thicker copper wire in the 6-point pipe.&lt;/p&gt;
&lt;p&gt;Each functional area&amp;rsquo;s electricity should be independently controlled. Generally: lighting, kitchen sockets, other sockets, each AC, refrigerator, underfloor heating, electric water heater, weak current box. Finer division by space is better.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t re-emphasize needing more sockets. Frequent kitchen users should ensure all kitchen sockets have switches. It&amp;rsquo;s easy and safe.&lt;/p&gt;
&lt;p&gt;Each water outlet needs an angle valve, not a direct faucet connection, for easier repairs.&lt;/p&gt;
&lt;p&gt;After trenching, inspect before sealing. Check for missing/misplaced openings. I missed the dishwasher socket and had to lengthen the cord.&lt;/p&gt;
&lt;h3 id="tiling"&gt;Tiling
&lt;/h3&gt;&lt;p&gt;This involves sealing trenches, leveling, waterproofing, shower curb installation, tile laying, and floor drain installation.&lt;/p&gt;
&lt;p&gt;Consider flooring type in advance (joists or cement leveling). Information is in the purchasing section. This affects leveling layer thickness, aiming for level floors (bathroom slightly lower).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/29.jpg"
loading="lazy"
alt="Mason leveling cement floor beside a finished built in wooden cabinet"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I switched from engineered wood flooring + joists to laminate + cement leveling. The tiler re-leveled the room floor.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/36.jpg"
loading="lazy"
alt="Bathroom waterproofing layer undergoing a closed water leak test"
&gt;&lt;/p&gt;
&lt;p&gt;After bathroom waterproofing, do a water test and photograph. Shower area waterproofing must reach the top. Otherwise, water can seep through tile joints.&lt;/p&gt;
&lt;p&gt;Ensure the floor slopes towards the drain in areas with floor drains. My bathroom has a non-draining corner, but it&amp;rsquo;s outside the shower.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/30.jpg"
loading="lazy"
alt="Wood grain balcony tiles and bathroom kitchen wall tiles during installation"
&gt;&lt;/p&gt;
&lt;p&gt;Tiles give the first glimpse of the finished home. I used wood-look tiles on my balcony.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/35.jpg"
loading="lazy"
alt="Finished artificial stone windowsill installed on the bay window"
&gt;&lt;/p&gt;
&lt;p&gt;The tiler also installs threshold stones and windowsill boards (can be done later).&lt;/p&gt;
&lt;p&gt;Schedule gas meter installation after kitchen tiles.&lt;/p&gt;
&lt;h3 id="carpentry"&gt;Carpentry
&lt;/h3&gt;&lt;p&gt;This involves ceilings, cabinets, tatami mats, and bay windows. Discuss special needs with the carpenter. My classmate had a dressing table made with a flip-up lid and mirror.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/31.jpg"
loading="lazy"
alt="On site wardrobe and tatami storage built from eco friendly boards"
&gt;&lt;/p&gt;
&lt;p&gt;Wardrobe construction. My wardrobes were carpenter-made, including a wall of wardrobes in the walk-in closet. Carpenter-made wardrobes are more environmentally friendly.&lt;/p&gt;
&lt;p&gt;Design the wardrobe&amp;rsquo;s internal structure yourself, or with the renovation company designer. Carpenters are dimension-sensitive; their wardrobes usually have no practical issues.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/32.jpg"
loading="lazy"
alt="Bay window bench with storage cabinet base built by the carpenter"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Carpenter-made bay window with storage.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/33.jpg"
loading="lazy"
alt="Plasterboard ceilings hiding beams in the living room and bedroom"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Living room ceiling to conceal the duct machine. Rooms had simple right-angle ceilings to hide beams.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/34.jpg"
loading="lazy"
alt="Arched doorway built between the living room and bedroom corridor"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Carpenter-made door frame for two bedroom doors. I&amp;rsquo;ll hang paintings here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For TV stands, consider future TV size. Don&amp;rsquo;t limit the possibility of a larger TV.&lt;/p&gt;
&lt;h3 id="painting"&gt;Painting
&lt;/h3&gt;&lt;p&gt;This stage is repetitive: putty, latex paint. It requires many purchases (see schedule).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/37.jpg"
loading="lazy"
alt="Wall putty and anti crack mesh used during the painting stage"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;White wall paint; things are taking shape.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/38.jpg"
loading="lazy"
alt="Gypsum decorative lines installed on walls and ceiling before painting"
&gt;&lt;/p&gt;
&lt;p&gt;Install gypsum lines during painting and paint them with the walls.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/39.jpg"
loading="lazy"
alt="Freshly painted interior looking clean and spacious after latex paint"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The painted house looks spacious, but it&amp;rsquo;s an illusion. Furniture will reveal the reality. The tape measure doesn&amp;rsquo;t lie.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Latex paint drips. Keep packaging cartons to protect tiles/floors and prevent damage from heavy objects.&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation
&lt;/h3&gt;&lt;p&gt;The electrician installs water/electricity facilities: switches, sockets, faucets, angle valves, toilets, basins, hooks. Vendors install integrated cabinets, doors, floors, fixed appliances (stoves, dishwashers). The gas company lights the fire.&lt;/p&gt;
&lt;p&gt;Kitchen/bathroom are complex (electricity, water, gas). The wrong order causes rework (see schedule).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/40.jpg"
loading="lazy"
alt="Renovation stage installing doors windows flooring cabinets and wallpaper"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/41.jpg"
loading="lazy"
alt="Bathroom hardware lamps wardrobe doors and drying rack installation scenes"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Water heaters, cabinets, doors, ceramics, lamps, wallpaper&amp;hellip; It&amp;rsquo;s complex. I visited the new house almost every weekend.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Supervise the electrician. Problems can arise: reversed angle valves, reversed switch states, crooked panels/switches, upside-down switches, crooked lights, foam debris in lampshades.&lt;/p&gt;
&lt;p&gt;Be firm when needed. My electrician claimed a reversed switch was unsolvable. I had him remove it, set it to &amp;ldquo;off,&amp;rdquo; and reinstall it. It worked.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/42.jpg"
loading="lazy"
alt="Task lighting installed beneath kitchen wall cabinets for countertop work"
&gt;&lt;/p&gt;
&lt;p&gt;Lighting is crucial, especially functional lighting. Eliminate dead spots in frequently used areas. Reserve power lines during plumbing/electrical. Emphasizing again: before plumbing/electrical, consider water/electricity usage. The electrician handles standard lights. You must specify wall lamps and functional lighting.&lt;/p&gt;
&lt;p&gt;Select and purchase the microwave before final installation if you plan a kitchen wall bracket. It determines the bracket&amp;rsquo;s drilling position.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/44.jpg"
loading="lazy"
alt="Marked drilling position for a microwave bracket on kitchen wall tiles"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I provided a schematic, marked the location, and placed the microwave nearby. Workers will re-measure for accurate installation.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="purchasing"&gt;Purchasing
&lt;/h2&gt;&lt;p&gt;Purchasing and construction go hand-in-hand. Here&amp;rsquo;s some advice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choosing materials and furniture can be overwhelming at first. I developed a system: ① Research the basics. ② Visit stores, examine top products, learn their benefits, and confirm your research. ③ Decide on quality, material, and structure, making trade-offs. ④ Visit more stores, compare prices, and order.&lt;/li&gt;
&lt;li&gt;Taobao is a great resource. Ask customer service for details you can&amp;rsquo;t find online. After contacting several sellers, you&amp;rsquo;ll likely have a good understanding, even if they aren&amp;rsquo;t technical experts.&lt;/li&gt;
&lt;li&gt;I avoided group-buying events for renovations. I don&amp;rsquo;t trust them. Responsibility is unclear, even though they attract many people. Sellers are accountable for their products, but group-buying events aren&amp;rsquo;t. You might find a few deals, but you&amp;rsquo;ll mostly encounter slow-moving items or bundles with useless extras. After-sales service is also a concern with multiple parties involved (venue, group leader, seller), leading to potential blame-shifting. Delivery delays are a major problem, disrupting your schedule. In home renovation, time is money (rent).&lt;/li&gt;
&lt;li&gt;Furniture stores often feature mid-to-high-end items, which can easily break your budget. However, visiting during holidays can yield unexpected deals. I found a promotional flooring model from a major brand, and the quality and service have been excellent.&lt;/li&gt;
&lt;li&gt;Monitor promotions on e-commerce platforms, especially for appliances. Price comparison tools are useful. Appliances are standardized; the same model is identical everywhere. These tools display the lowest current price and historical trends, helping you determine the best time to buy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s extensive information online about most building materials and furniture. A good search engine is invaluable.&lt;/p&gt;
&lt;p&gt;The following information isn&amp;rsquo;t exhaustive. It&amp;rsquo;s simply what I gathered. I excluded straightforward items like tiles (beginners can hardly tell the difference unless they&amp;rsquo;re side-by-side). I also omitted items I didn&amp;rsquo;t purchase. For instance, I have a gas water heater, so I didn&amp;rsquo;t research electric ones. This focuses on the products themselves; judging industry &amp;ldquo;tricks&amp;rdquo; is up to you.&lt;/p&gt;
&lt;p&gt;Conflicting information exists about some products, with sellers contradicting each other. I concentrated on gathering information on these. Ignore any brand mentions and focus on the basic knowledge:&lt;/p&gt;
&lt;h3 id="floor-drains"&gt;Floor Drains
&lt;/h3&gt;&lt;p&gt;Two main types: water-sealed and air-sealed. Water seals can be shallow or deep; air seals have various mechanisms. No single type is best; different locations require different drains. Areas with constant, heavy drainage versus rarely wet areas need different solutions. See this article:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.dajia365.com/article/97dd4db9449092c2.html" target="_blank" rel="noopener"
&gt;http://www.dajia365.com/article/97dd4db9449092c2.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="switches-and-socket-panels"&gt;Switches and Socket Panels
&lt;/h3&gt;&lt;p&gt;Standard formats exist for switches and socket panels. These articles explain them:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://tieba.baidu.com/p/3251622973" target="_blank" rel="noopener"
&gt;http://tieba.baidu.com/p/3251622973&lt;/a&gt;
&lt;a class="link" href="http://www.dajia365.com/article/7c4e032151b68670.html" target="_blank" rel="noopener"
&gt;http://www.dajia365.com/article/7c4e032151b68670.html&lt;/a&gt;
&lt;a class="link" href="http://www.kaiguanchazuobar.com/kgcz-zhishi/32.html" target="_blank" rel="noopener"
&gt;http://www.kaiguanchazuobar.com/kgcz-zhishi/32.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The spacing between the two-prong and three-prong holes in a five-hole socket should prevent plugs from interfering. Modern sockets are usually well-designed, but ensure they have a safety feature. This design connects metal parts only when all holes are inserted. A child inserting a chopstick into one hole will be blocked by an insulating plate.&lt;/p&gt;
&lt;h3 id="shower-curb"&gt;Shower Curb
&lt;/h3&gt;&lt;p&gt;Two installation methods: pre-embedded and non-pre-embedded. Pre-embedded involves fixing the curb before tiling. Non-pre-embedded means attaching the curb to the tiles later with sealant. The latter requires a very flat floor and precise tiling. The sealant must be perfect to prevent aging, cracking, and leaks. Pre-embedded is generally preferred for new homes, provided waterproofing is done correctly, as leaks under the tiles are a major issue.&lt;/p&gt;
&lt;p&gt;Curbs are usually PVC or marble. Marble is more durable and solid. PVC curbs are hollow and require cement filling.&lt;/p&gt;
&lt;p&gt;Two curb shape details: the skirt and sealant groove. A skirt helps with water resistance if you use a shower curtain (irrelevant with a glass enclosure). The sealant groove is useful for non-pre-embedded installations but irrelevant for pre-embedded ones.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.homevv.com/gonglve/201512/08488.html" target="_blank" rel="noopener"
&gt;http://www.homevv.com/gonglve/201512/08488.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="kitchen-cabinets"&gt;Kitchen Cabinets
&lt;/h3&gt;&lt;p&gt;Kitchen cabinets are complex; understanding them took time. Base and surface materials have confusing, similar-sounding names. Here&amp;rsquo;s a breakdown. You can search online for property comparisons. Base materials and surface materials are distinct concepts and not directly comparable. Some sellers exploit this to mislead customers.&lt;/p&gt;
&lt;p&gt;First, the base materials. Many are used in doors, wardrobes, sofas, and tables, so differentiation is important.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/46.jpg"
loading="lazy"
alt="Cross sections comparing five common engineered boards and solid wood bases"
&gt;&lt;/p&gt;
&lt;p&gt;From top to bottom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MDF (Medium-Density Fiberboard):&lt;/strong&gt; Made of wood fibers, glue, and other materials. Dense and uniform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Particle Board:&lt;/strong&gt; Often called &amp;ldquo;solid wood particle board,&amp;rdquo; but it&amp;rsquo;s not solid wood. Made of wood chips and glue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plywood:&lt;/strong&gt; Multiple layers of wood veneer glued together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blockboard:&lt;/strong&gt; Two thin wood panels sandwiching wood strips. Commonly used for custom furniture.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solid Wood:&lt;/strong&gt; Actual solid wood. Numerous wood types exist, with varying quality. Here&amp;rsquo;s an article:
&lt;a class="link" href="http://weibo.com/p/23041814d60c0640102vrz8" target="_blank" rel="noopener"
&gt;http://weibo.com/p/23041814d60c0640102vrz8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another article on base materials: &lt;a class="link" href="https://www.zhihu.com/question/24520029" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/24520029&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, the door panel surface materials:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UV Board:&lt;/strong&gt; Smooth surface made by curing liquid paint on the base material.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lacquer Board:&lt;/strong&gt; Same material used on cars and pianos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Melamine Board:&lt;/strong&gt; Sellers avoid &amp;ldquo;melamine,&amp;rdquo; calling it &amp;ldquo;double-sided panel&amp;rdquo; or &amp;ldquo;eco-board.&amp;rdquo; It&amp;rsquo;s paper with color/texture soaked in resin, dried, and hot-pressed onto the base. (Melamine in building materials is harmless and common.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thermofoil Board:&lt;/strong&gt; Similar to melamine, but the surface is thicker, not paper. It can have 3D textures and seamless wrapping without edge banding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acrylic Board:&lt;/strong&gt; Called &amp;ldquo;crystal board&amp;rdquo; or &amp;ldquo;organic glass,&amp;rdquo; but it&amp;rsquo;s plastic, unrelated to crystal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crystal Steel Board:&lt;/strong&gt; Tempered glass glued to the base, often metal instead of wood.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fireproof Board:&lt;/strong&gt; Low-end material, rarely used in homes. I haven&amp;rsquo;t seen it sold; you can likely ignore it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Molded board refers to a processing method using a mold for shaping. It&amp;rsquo;s unrelated to material but usually refers to thermofoil board.&lt;/p&gt;
&lt;p&gt;When designing cabinets, reserve space for the refrigerator based on dimensions &lt;em&gt;with the door open&lt;/em&gt;. A 60cm wide refrigerator needs more than 60cm. Drawers won&amp;rsquo;t pull out if the door only opens 90 degrees. Opening it wider exceeds the refrigerator&amp;rsquo;s width.&lt;/p&gt;
&lt;p&gt;Line the cabinet under the sink with aluminum foil. It&amp;rsquo;s very humid, potentially damaging the cabinet. Even with quality materials, leaks can happen. Foil is the last defense, significantly reducing damage.&lt;/p&gt;
&lt;h3 id="shower-enclosures"&gt;Shower Enclosures
&lt;/h3&gt;&lt;p&gt;Two points about shower enclosures lack definitive answers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hardware can be copper, stainless steel, or aluminum alloy. Most sellers favor copper, but some stainless steel models are pricier, even from known brands. Pure copper is more corrosion-resistant but less hard than stainless steel. Theoretically, copper is better. But pricier stainless steel models suggest low-quality copper might be worse than low-quality stainless steel. It&amp;rsquo;s unclear; avoid being too cheap.&lt;/li&gt;
&lt;li&gt;Hinged doors have hinges or pivot hinges. Stress points on the glass differ, and sellers disagree.
&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/45.jpg"
loading="lazy"
alt="Shower room swing doors using hinge and floor pivot load structures"
&gt;
&lt;em&gt;Left: Hinge; Right: Pivot hinge. Note the door&amp;rsquo;s rotation connection point.&lt;/em&gt;
Delli stated they don&amp;rsquo;t make pivot hinges due to sagging and shattering risks, making them less safe than hinges. Lower-priced brands often use pivot hinges, but in these stores, they&amp;rsquo;re often more expensive, with sellers claiming superiority. The pivot hinge structure seems more robust, but understanding internal structures is needed for a conclusion, and I found no information. However, for the same door width, a hinged door&amp;rsquo;s opening is wider.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This Zhihu article details other shower enclosure aspects:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zhihu.com/question/24903820" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/24903820&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="flooring"&gt;Flooring
&lt;/h3&gt;&lt;p&gt;Flooring discussions mainly involve solid wood, engineered wood, and laminate. Comparison is easy: price and environmental friendliness decrease, while durability and ease of maintenance increase. See this:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zhihu.com/question/34004791" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/34004791&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="gas-water-heaters"&gt;Gas Water Heaters
&lt;/h3&gt;&lt;p&gt;Common types include forced exhaust and balanced flue, referring to exhaust methods.&lt;/p&gt;
&lt;p&gt;Some sellers mention constant temperature and condensing types, but these are separate features. Constant temperature models adjust water/gas flow for stable temperature. Condensing models reuse combustion gas heat to preheat water, offering some temperature stability but primarily saving energy.&lt;/p&gt;
&lt;p&gt;Pay attention to condensing models. They&amp;rsquo;re more energy-efficient but have an extra condensate pipe. This needs draining via a sewage pipe, so consider how to manage this small pipe.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.dajia365.com/article/d52d55d20d8a99b4.html" target="_blank" rel="noopener"
&gt;http://www.dajia365.com/article/d52d55d20d8a99b4.html&lt;/a&gt;
&lt;a class="link" href="http://www.rinnai.com.cn/news/detail/id--62.html" target="_blank" rel="noopener"
&gt;http://www.rinnai.com.cn/news/detail/id&amp;ndash;62.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="kitchen-sliding-doors"&gt;Kitchen Sliding Doors
&lt;/h3&gt;&lt;p&gt;Not much to consider; most of it is here:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://m.club.sohu.com/zz0277/thread/10se6surdcc" target="_blank" rel="noopener"
&gt;http://m.club.sohu.com/zz0277/thread/10se6surdcc&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="toilets"&gt;Toilets
&lt;/h3&gt;&lt;p&gt;A smoother glaze inside the toilet facilitates cleaning with a single flush.&lt;/p&gt;
&lt;p&gt;Two flushing methods: direct flush and siphon flush. Direct flush uses gravity; siphon flush uses pressure from the water seal. Jet siphon adds a jet for enhanced flushing.&lt;/p&gt;
&lt;p&gt;Water fittings are crucial. Even for major brands, ensure official fittings. Stuck flush buttons or failure to refill are common toilet problems. Half the toilets in apartments I&amp;rsquo;ve lived in had these issues.&lt;/p&gt;
&lt;p&gt;Two drainage types: floor drain and wall drain. Wall drains are less common, requiring wall load-bearing capacity. Floor drain toilets are more reliable; install at the original drain location, avoiding shifters if possible, for better sealing.&lt;/p&gt;
&lt;p&gt;Before buying, measure the &amp;ldquo;rough-in&amp;rdquo; – the distance from the drain center to the nearest wall. The seller needs this for the correct toilet.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://weiyu.pchouse.com.cn/41/419033_all.html" target="_blank" rel="noopener"
&gt;http://weiyu.pchouse.com.cn/41/419033_all.html&lt;/a&gt;
&lt;a class="link" href="http://home.163.com/13/0704/21/92VJ650O00104K9K_all.html" target="_blank" rel="noopener"
&gt;http://home.163.com/13/0704/21/92VJ650O00104K9K_all.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="downlights-and-spotlights"&gt;Downlights and Spotlights
&lt;/h3&gt;&lt;p&gt;Downlights provide broad illumination, often for hallways or supplementary lighting. Spotlights have a concentrated, adjustable beam for illuminating specific areas, like paintings.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.eeworld.com.cn/LED/2015/0328/article_11941.html" target="_blank" rel="noopener"
&gt;http://www.eeworld.com.cn/LED/2015/0328/article_11941.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="wardrobe-doors"&gt;Wardrobe Doors
&lt;/h3&gt;&lt;p&gt;Three common base materials: MDF, wood-plastic composite, and particle board (called &amp;ldquo;solid wood particle board&amp;rdquo; by sellers). Particle board is only for flat doors. Designs like faux shutters or carvings require the first two.&lt;/p&gt;
&lt;p&gt;Wood-plastic composite is a new material. These articles provide definitions and discussions:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.dhmyjgc.com/display.asp?id=717" target="_blank" rel="noopener"
&gt;http://www.dhmyjgc.com/display.asp?id=717&lt;/a&gt;
&lt;a class="link" href="http://www.hualongxiang.com/simple/?t10164871.html" target="_blank" rel="noopener"
&gt;http://www.hualongxiang.com/simple/?t10164871.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="bathroom-cabinets"&gt;Bathroom Cabinets
&lt;/h3&gt;&lt;p&gt;Bathroom cabinets have wall and floor drain options, like toilets. Common materials are PVC and wood panels, usually solid wood. Avoid sellers substituting MDF; it absorbs water and swells in humid bathrooms, making it the worst choice.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.guizhicui.com/zhishi/324.html" target="_blank" rel="noopener"
&gt;http://www.guizhicui.com/zhishi/324.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="led-lighting"&gt;LED Lighting
&lt;/h3&gt;&lt;p&gt;First, understand LED working principles and the resulting excessive blue light issue. The harm isn&amp;rsquo;t as exaggerated as some claim. Insufficient light and incorrect color temperature can also damage eyes. Improper use is more harmful.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://digi.163.com/15/0817/10/B17CNRDG00162OUT_all.html" target="_blank" rel="noopener"
&gt;http://digi.163.com/15/0817/10/B17CNRDG00162OUT_all.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The primary consideration is illumination, with many professional parameters. This Zhihu article discusses them:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zhihu.com/question/20043507" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/20043507&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But reality isn&amp;rsquo;t ideal. Online, you rarely see lumens, color rendering index, or heat dissipation. You can only compare wattage and color temperature. Besides style, there&amp;rsquo;s little for ordinary consumers to compare. Visiting a physical store is more insightful. I was lazy and bought online.&lt;/p&gt;
&lt;p&gt;Home lighting has two functions: illuminating the entire space or a specific area. Ceiling lights in most rooms do the former, being the main source. Dining rooms are exceptions, only needing to illuminate the table. I chose simple LED square lights for most spaces, providing even illumination without unnecessary colors/shadows. Square lights emit light broadly; you usually won&amp;rsquo;t look directly at them. A simple style isn&amp;rsquo;t problematic; it just might not garner compliments.&lt;/p&gt;
&lt;h3 id="bed-frames"&gt;Bed Frames
&lt;/h3&gt;&lt;p&gt;Bed frames come in leather, wood, fabric, and metal. These are surface materials; the core load-bearing material is wood or metal.&lt;/p&gt;
&lt;p&gt;Metal frames are durable and non-polluting but have limited styles and usually lack storage.&lt;/p&gt;
&lt;p&gt;Wooden frames are divided into panel and solid wood. Panel frames use particle board and other engineered wood, with lower environmental friendliness and durability, lower prices, and more varied styles. Solid wood frames are durable and environmentally friendly, with higher prices and simpler styles. Solid wood has many tree species, with significant quality differences. Sellers often recommend teak and walnut. Softer woods like pine might be weaker than panel beds.&lt;/p&gt;
&lt;p&gt;This article details wood, more than the kitchen cabinet section:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zhihu.com/question/24335160" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/24335160&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not all frames use one material; some mix materials. Key load-bearing parts might be solid wood, side panels engineered wood, and the headboard leather or fabric.&lt;/p&gt;
&lt;h3 id="mattresses"&gt;Mattresses
&lt;/h3&gt;&lt;p&gt;Common types: spring, coir, memory foam, and latex. A spring mattress doesn&amp;rsquo;t only have springs; a latex mattress doesn&amp;rsquo;t only have latex. Mattresses usually have three layers: innermost spring layer, padding layer, and outermost fabric layer. Some all-coir mattresses genuinely have no springs.&lt;/p&gt;
&lt;p&gt;The padding layer determines the type. If it&amp;rsquo;s mainly coir, it&amp;rsquo;s a coir mattress; if mainly memory foam, it&amp;rsquo;s a memory foam mattress. The padding can be multiple layers of different materials. Materials ranked from hard to soft: coir &amp;gt; memory foam &amp;gt; latex. Some mattresses are double-sided, with different padding on each side of the spring layer. For coir mattresses, note they&amp;rsquo;re not the old coir beds. Modern coir mattresses use glue to bond fibers into a dense layer. Another process uses all-coir fibers woven without glue.&lt;/p&gt;
&lt;p&gt;Two common spring layers: innerspring and pocket spring. Innerspring is cheaper but has a mutual influence problem; turning over affects your partner&amp;rsquo;s side. Older, noisy mattresses are often this type. Pocket springs are independent, and the mainstream now. Pocket springs have a zoning concept, dividing springs into zones with different firmness. Head/waist zones use firm springs, shoulder/hip zones soft springs, back/leg zones medium-firm springs. More zones mean more precise support and higher price. Common zones: 3, 5, and 7.&lt;/p&gt;
&lt;p&gt;Mattress firmness is affected by both padding and spring layers. Firmness isn&amp;rsquo;t a single indicator; soft padding with firm springs feels different from firm padding with soft springs.&lt;/p&gt;
&lt;p&gt;This Zhihu article explains it; the above is my summary. Trying it yourself is most important:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zhihu.com/question/20645726" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/20645726&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="sofas"&gt;Sofas
&lt;/h3&gt;&lt;p&gt;Comfort is the primary consideration. Based on your height and habits, try sofas in a store and determine two key data points: seat depth and backrest height. Cushions can adjust, but the sofa itself is more stable and reliable.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m 167cm tall. After trying sofas, 50-55cm seat depth was most comfortable. Shallower decreases thigh contact, increasing pressure and fatigue. Deeper lacks lower back support; adding a cushion strains my neck.&lt;/p&gt;
&lt;p&gt;My girlfriend, similar in height, wants to rest her head on the backrest, not a headrest. Headrests are unfixed and too soft, so we need a high-back sofa with 60-65cm backrest height. I searched online; it was challenging. We wanted a sectional sofa with a chaise. High-back searches usually exclude chaises, and styles tend to be classic European, Chinese, or American country, which are hard to match.&lt;/p&gt;
&lt;p&gt;With these requirements, we went to the market and found more suitable sofas than expected. Many sellers offer customization: fabric, height, and width are changeable.&lt;/p&gt;
&lt;p&gt;Ensure sitting comfort first, then consider material, style, and color. Don&amp;rsquo;t sacrifice function for the latter. There&amp;rsquo;s plenty of information online about these aspects.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t be obsessed with storage or sofa bed functions unless necessary. Adding these requires a hardboard under the seat cushion, reducing comfort.&lt;/p&gt;
&lt;h3 id="curtains"&gt;Curtains
&lt;/h3&gt;&lt;p&gt;Besides aesthetics and feel, consider installation: curtain rods or tracks?&lt;/p&gt;
&lt;p&gt;Curtain rods: Simple. Exposed rods look better than tracks without a curtain box; no valance is needed. However, rods have a length limit; excessive length causes deformation. For very wide curtains, two rods are needed, with a gap between curtains. Removing and washing curtains is more troublesome.&lt;/p&gt;
&lt;p&gt;Tracks: Flexible. Tracks can be L-shaped for seamless corner coverage. Curtains hang with hooks, making removal easy. For multiple layers (blackout and sheer), tracks save space.&lt;/p&gt;
&lt;p&gt;When adding sheer curtains, ensure the curtain box is wide enough for two tracks with sufficient distance. If not, it&amp;rsquo;s better to forgo sheer curtains. Two layers squeezed together rub, hindering sliding and causing noise, defeating the purpose.&lt;/p&gt;
&lt;p&gt;Curtains aren&amp;rsquo;t limited to these; roller blinds, fan-shaped blinds, and shutters exist, but are usually for smaller windows.&lt;/p&gt;
&lt;h3 id="microwaves"&gt;Microwaves
&lt;/h3&gt;&lt;p&gt;Main distinction: flatbed and turntable types:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://homea.people.com.cn/n/2014/0720/c41390-25304297.html" target="_blank" rel="noopener"
&gt;http://homea.people.com.cn/n/2014/0720/c41390-25304297.html&lt;/a&gt;
&lt;a class="link" href="http://info.homea.hc360.com/2009/09/071055446471.shtml" target="_blank" rel="noopener"
&gt;http://info.homea.hc360.com/2009/09/071055446471.shtml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Lightwave&amp;rdquo; ovens combine microwave heating with a heating tube, half microwave, half oven. It&amp;rsquo;s a differentiated product; not as advanced as advertised, nor as terrible as rumored.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zhihu.com/question/28411025" target="_blank" rel="noopener"
&gt;https://www.zhihu.com/question/28411025&lt;/a&gt;
&lt;a class="link" href="http://www.guokr.com/post-en/373417/" target="_blank" rel="noopener"
&gt;http://www.guokr.com/post-en/373417/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="tvs"&gt;TVs
&lt;/h3&gt;&lt;p&gt;Choosing a TV is personal preference. But it involves considering factors related to TV usage, then choosing the TV.&lt;/p&gt;
&lt;p&gt;First, understand common home TV signal sources, usable in combination:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cable Digital TV:&lt;/strong&gt; TV signals from the cable company, mainly live broadcasts, with limited, paid on-demand content. Best clarity and stability, dedicated TV line, not affecting internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPTV from Internet Service Providers:&lt;/strong&gt; Set-top box from the provider, often bundled with broadband. Live broadcasts and on-demand. Live content similar to cable; on-demand is richer. Shares network cable but doesn&amp;rsquo;t occupy bandwidth. Requires a dedicated line. China Telecom&amp;rsquo;s IPTV must connect directly to the optical modem; a router in between prevents it from working, complicating home network topology.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internet Set-Top Box:&lt;/strong&gt; Most flexible and independent, richest on-demand. Live broadcasts via third-party apps. Affects internet speed; basically an Android computer. Smart TVs are the same, with the box integrated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;About size. Many distance/size charts exist. Don&amp;rsquo;t be limited. If you like big screens, exceeding the ratio is fine. My TV-to-eye distance is ~3m; I bought a 58-inch TV. It looks great, not too big.&lt;/p&gt;
&lt;p&gt;About 4K. TVs seemingly need 4K. But consider usage. For live broadcasts, 4K is irrelevant; resolution isn&amp;rsquo;t that high; 1080p isn&amp;rsquo;t widespread. For on-demand movies/shows, 4K matters little; internet speed is a bottleneck. Even if platforms support 4K, your network might not handle it. For downloaded 4K content, a 4K TV is meaningful; the HDMI interface should preferably be 2.0, supporting higher frame rates.&lt;/p&gt;
&lt;p&gt;About HDR. Great technology adding brightness layers, enriching shadow/highlight details. You won&amp;rsquo;t see HDR content for long. Better to have it, but not essential.&lt;/p&gt;
&lt;p&gt;About boxes. I struggled: traditional TV + box or smart TV? It&amp;rsquo;s not a question. Like most cars over 300,000 yuan are automatic, finding a manual is hard. You won&amp;rsquo;t buy a very cheap TV; at that price, they&amp;rsquo;re mostly smart. But does a smart TV mean no box? Probably not. I don&amp;rsquo;t know if all are like this, but my Hisense smart TV is semi-open. Its app store has few apps, no live broadcast apps. No third-party app stores, file managers, or browsers. It wouldn&amp;rsquo;t read .apk files from USB; it didn&amp;rsquo;t want me installing other apps. So, I bought a box. The TV&amp;rsquo;s memory is small; it&amp;rsquo;s Android, needing enough memory.&lt;/p&gt;
&lt;h3 id="washing-machines"&gt;Washing Machines
&lt;/h3&gt;&lt;p&gt;Characteristics and differences between front-loading and top-loading:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://post.smzdm.com/p/310/" target="_blank" rel="noopener"
&gt;http://post.smzdm.com/p/310/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;General labels to distinguish:&lt;/p&gt;
&lt;p&gt;Top-loading: cheaper, saves electricity and water, faster, harsher on clothes, gravity drainage
Front-loading: more expensive, saves water and electricity, slower, protects clothes, motor drainage&lt;/p&gt;
&lt;p&gt;Details about front-loading:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://post.smzdm.com/p/366/" target="_blank" rel="noopener"
&gt;http://post.smzdm.com/p/366/&lt;/a&gt;
&lt;a class="link" href="http://www.360doc.com/content/11/1024/14/366037_158690274.shtml" target="_blank" rel="noopener"
&gt;http://www.360doc.com/content/11/1024/14/366037_158690274.shtml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Front-loading and top-loading washing machine capacity isn&amp;rsquo;t comparable. My new 7 kg front-loader and previous 4.5 kg top-loader hold about the same amount of clothes. Capacity isn&amp;rsquo;t entirely proportional to the number.&lt;/p&gt;
&lt;h2 id="preparations-before-moving-in"&gt;Preparations Before Moving In
&lt;/h2&gt;&lt;p&gt;Even after the contractors finish, you still have plenty to do.&lt;/p&gt;
&lt;h3 id="acceptance-inspection"&gt;Acceptance Inspection
&lt;/h3&gt;&lt;p&gt;A thorough inspection is crucial. Check for these potential issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plug in all appliances to ensure they&amp;rsquo;re working.&lt;/li&gt;
&lt;li&gt;Test two-prong outlets with a phone charger. For three-prong outlets, use a power strip. Test the 16A air conditioner outlet directly with the AC unit.&lt;/li&gt;
&lt;li&gt;Confirm all light fixtures are functioning.&lt;/li&gt;
&lt;li&gt;Verify that switches control the correct lights, and that bedroom lights have multi-location control (e.g., door and bedside).&lt;/li&gt;
&lt;li&gt;Turn each faucet to maximum to check water flow.&lt;/li&gt;
&lt;li&gt;Ensure floor drains are draining quickly. (Drainage speed depends on the drain type, but slow drainage is a problem.)&lt;/li&gt;
&lt;li&gt;Look for cracked or loose tiles, and missing grout.&lt;/li&gt;
&lt;li&gt;Check that room and cabinet doors open and close smoothly, without looseness or noise.&lt;/li&gt;
&lt;li&gt;Inspect walls for cracks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you find problems, photograph them and contact the contractor or vendor for repairs.&lt;/p&gt;
&lt;h3 id="initial-cleaning-after-construction"&gt;Initial Cleaning After Construction
&lt;/h3&gt;&lt;p&gt;The first post-renovation cleaning is called &amp;ldquo;initial cleaning.&amp;rdquo; It&amp;rsquo;s much more intensive than regular cleaning, and thus more expensive. Hiring professionals is recommended, as it&amp;rsquo;s quite tiring.&lt;/p&gt;
&lt;p&gt;Initial cleaning mainly involves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Window washing, especially the exterior glass, which accumulates construction dust.&lt;/li&gt;
&lt;li&gt;Floor cleaning, including scraping off dried latex paint and glue.&lt;/li&gt;
&lt;li&gt;Cabinet cleaning, wiping down the insides of all cabinets.&lt;/li&gt;
&lt;li&gt;Regular cleaning (dusting and mopping).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Removing dried paint is demanding. Good protection during painting saves effort (and money, as some cleaning companies adjust prices based on floor condition). Don&amp;rsquo;t expect perfection; remind cleaners about paint on baseboards and switch panels.&lt;/p&gt;
&lt;p&gt;Keep a ladder handy for cleaning staff to reach cabinet tops.&lt;/p&gt;
&lt;h3 id="airing-out-formaldehyde"&gt;Airing Out Formaldehyde
&lt;/h3&gt;&lt;p&gt;Formaldehyde primarily comes from newly purchased furniture. Cabinets built on-site often use more eco-friendly materials. Specifically, formaldehyde originates from glue; denser boards use less glue and emit less formaldehyde. MDF (medium-density fiberboard), being completely crushed and reshaped, has the highest content. Multi-layer boards, with glue only between layers, have significantly less.&lt;/p&gt;
&lt;p&gt;We say &amp;ldquo;airing out&amp;rdquo; because furniture continuously releases formaldehyde. We can only address it once it&amp;rsquo;s airborne. The goal is to accelerate this release and reduce the airborne concentration to a safe level.&lt;/p&gt;
&lt;p&gt;Four principles for reducing formaldehyde:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ventilation:&lt;/strong&gt; Essential. Without it, formaldehyde remains trapped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Water Solubility:&lt;/strong&gt; Formaldehyde dissolves in water; increasing humidity helps. Humidifiers and plants increase humidity through transpiration. Plants don&amp;rsquo;t absorb formaldehyde preferentially; they increase humidity, allowing airborne formaldehyde to dissolve. Large-leaf plants like pothos are more effective due to higher transpiration rates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adsorption:&lt;/strong&gt; Porous materials like activated carbon adsorb formaldehyde. However, this only traps it on the surface. Regularly air out or discard the charcoal. Curtains and sofa covers also adsorb, but less effectively due to less dense pores. Washing curtains helps remove formaldehyde they&amp;rsquo;ve absorbed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chemical Reaction:&lt;/strong&gt; Photocatalysts, sprayed on furniture, react with formaldehyde to reduce airborne levels temporarily.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, the last three are far less effective than ventilation. In a closed space like a shoe cabinet, formaldehyde saturates the air, halting further release. Opening the door is more effective than water, charcoal, or chemical reactions.&lt;/p&gt;
&lt;p&gt;Therefore, ventilation is key. 24/7 window opening is ideal. I did this without other measures, and tests confirmed significantly lower formaldehyde in well-ventilated spaces.&lt;/p&gt;
&lt;p&gt;I made a cardboard louver for my window to allow constant ventilation while preventing rain damage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-07/07-30/10.jpg"
loading="lazy"
alt="DIY cardboard louver window for ventilation and rain protection"
&gt;&lt;/p&gt;
&lt;p&gt;For details on the louver, see: &lt;a class="link" href="https://victor42.eth.limo/post-en/3515/" target="_blank" rel="noopener"
&gt;https://victor42.eth.limo/post-en/3515/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="finishing-touches"&gt;Finishing Touches
&lt;/h3&gt;&lt;p&gt;Finally, some miscellaneous tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consider upgrading your security door lock.&lt;/li&gt;
&lt;li&gt;Install the doorbell and property-provided intercom.&lt;/li&gt;
&lt;li&gt;Seal unused holes, especially those leading outdoors, with expanding foam to prevent pests.&lt;/li&gt;
&lt;li&gt;Inspect balcony floor-to-ceiling glass for gaps and seal them with sealant. My home had a large gap between panes, and the railing was distant from the glass, causing drafts even with closed windows.
&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/47.jpg"
loading="lazy"
alt="Uneven glass sealant detail along the edge of the balcony window"
&gt;
&lt;em&gt;The sealant looks rough initially, but you can trim it neatly after it dries.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="design-showcase"&gt;Design Showcase
&lt;/h2&gt;&lt;p&gt;Time for the reveal! Here&amp;rsquo;s how the design turned out in real life. These photos were taken four months after I moved in, once I&amp;rsquo;d settled into the space and everything felt just right.&lt;/p&gt;
&lt;h3 id="living-and-dining-room"&gt;Living and Dining Room
&lt;/h3&gt;&lt;p&gt;The living room greets you upon entry. The coffee table&amp;rsquo;s a bit messy, but that&amp;rsquo;s everyday life.&lt;/p&gt;
&lt;p&gt;I initially didn&amp;rsquo;t plan on having the elliptical in the living room; I thought it&amp;rsquo;d block the walkway. I hadn&amp;rsquo;t factored in space for fitness equipment. After some back-and-forth with my girlfriend (she insisted on watching TV while exercising), I realized putting it in the multi-purpose room, as planned, meant it&amp;rsquo;d gather dust. So, the elliptical stayed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home1.jpg"
loading="lazy"
alt="Living room rendering with an elliptical trainer beside the sofa"
&gt;&lt;/p&gt;
&lt;p&gt;Wallpaper&amp;rsquo;s behind the sofa, within the plaster line. Why not on the TV wall? I&amp;rsquo;m a storage nut and always want to keep my options open for future shelving or cabinets.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home2.jpg"
loading="lazy"
alt="Striped wallpaper on the living room sofa background wall after renovation"
&gt;&lt;/p&gt;
&lt;p&gt;The TV sits on the stand, not mounted.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home3.jpg"
loading="lazy"
alt="Television on the TV cabinet beside the living room window"
&gt;&lt;/p&gt;
&lt;p&gt;Fake flowers in a vase on the TV stand.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home4.jpg"
loading="lazy"
alt="Blue frosted glass vase displayed on the TV cabinet"
&gt;&lt;/p&gt;
&lt;p&gt;The dining room sideboard, with lighting in the mosaic area. I&amp;rsquo;d envisioned decorative pieces here, but after four months, I couldn&amp;rsquo;t sacrifice the convenience. It&amp;rsquo;s now home to daily essentials and snacks.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home5.jpg"
loading="lazy"
alt="Built in dining sideboard with a blue mosaic tile accent strip"
&gt;&lt;/p&gt;
&lt;p&gt;The main walkway, the only path to the bedrooms. A key feature: the blue mosaic baseboard – we call it the &amp;ldquo;swimming pool.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home6.jpg"
loading="lazy"
alt="Corridor archway with wall art and blue mosaic skirting tiles"
&gt;&lt;/p&gt;
&lt;p&gt;The dining room. The four chairs (gray, blue, and brown) follow a color scheme. The painting hides the electrical box.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home7.jpg"
loading="lazy"
alt="Nordic dining area with colorful chairs and a mosaic pendant lamp"
&gt;&lt;/p&gt;
&lt;p&gt;The dining room chandelier&amp;rsquo;s the only decorative light fixture. Elsewhere, it&amp;rsquo;s all large, square LED panels.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home8.jpg"
loading="lazy"
alt="Dining room pendant light with a mosaic glass lampshade"
&gt;&lt;/p&gt;
&lt;h3 id="kitchen"&gt;Kitchen
&lt;/h3&gt;&lt;p&gt;First look into the kitchen. This side has the stove, with standard-sized base cabinets.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home9.jpg"
loading="lazy"
alt="Narrow kitchen storage with blue cabinets and stainless corner shelves"
&gt;&lt;/p&gt;
&lt;p&gt;Opposite the stove is the countertop, linked by the sink cabinet. The sink dishwasher – the kitchen&amp;rsquo;s priciest item – is here. The countertop base cabinets are shallower (35cm deep). Yep, even in this small kitchen, I went for a U-shaped cabinet. Storage fanatic&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home10.jpg"
loading="lazy"
alt="Kitchen sink counter gas water heater and blue base cabinets"
&gt;&lt;/p&gt;
&lt;p&gt;No wasted corners.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home11.jpg"
loading="lazy"
alt="Five tier storage cart fitted into a narrow cabinet side gap"
&gt;&lt;/p&gt;
&lt;p&gt;This white 5-tier trolley fits &lt;em&gt;perfectly&lt;/em&gt;, down to the centimeter.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home12.jpg"
loading="lazy"
alt="White five tier cart storing everyday food ingredients and seasonings"
&gt;&lt;/p&gt;
&lt;p&gt;The prep area, with task lighting.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home13.jpg"
loading="lazy"
alt="Kitchen prep area organized with hooks and storage racks"
&gt;&lt;/p&gt;
&lt;p&gt;This kitchen gadget sticks firmly, no drilling needed. Seriously, using the kitchen wall well adds at least 20% more storage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home14.jpg"
loading="lazy"
alt="Suction stainless kitchen rack storing cloths and sponges"
&gt;&lt;/p&gt;
&lt;h3 id="bathroom"&gt;Bathroom
&lt;/h3&gt;&lt;p&gt;The bathroom showcases the home&amp;rsquo;s main color. My style&amp;rsquo;s roughly 60% modern, 25% Mediterranean, 10% American, and 5% Nordic. The ivory white cabinet is one of the few American-style pieces.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home15.jpg"
loading="lazy"
alt="Mediterranean blue white bathroom with an American style vanity"
&gt;&lt;/p&gt;
&lt;p&gt;Shower head and shelf.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home16.jpg"
loading="lazy"
alt="Stainless shower set and double shelf installed inside the shower room"
&gt;&lt;/p&gt;
&lt;p&gt;View from the shower.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home17.jpg"
loading="lazy"
alt="Bathroom sink and toilet viewed outward from the shower enclosure"
&gt;&lt;/p&gt;
&lt;p&gt;Towel rack by the door.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home18.jpg"
loading="lazy"
alt="Stainless folding towel rack mounted by the bathroom doorway"
&gt;&lt;/p&gt;
&lt;p&gt;A unique floor drain in the shower – a bit of fun. Pricey, but it&amp;rsquo;ll be used for decades.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home19.jpg"
loading="lazy"
alt="Blue shower floor tiles and a tadpole shaped floor drain detail"
&gt;&lt;/p&gt;
&lt;h3 id="multi-purpose-room"&gt;Multi-purpose Room
&lt;/h3&gt;&lt;p&gt;Next to the bathroom is this north-facing room. I haven&amp;rsquo;t assigned a specific purpose yet, and it won&amp;rsquo;t be a bedroom.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home20.jpg"
loading="lazy"
alt="Corridor view toward the multifunction room with a pink folding ladder"
&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s primarily a walk-in closet, with a wall of wardrobes! It could become a playroom, music room, art studio, or study – we&amp;rsquo;ll see.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home21.jpg"
loading="lazy"
alt="Full wall louver sliding door wardrobe in the multifunction room"
&gt;&lt;/p&gt;
&lt;p&gt;Unused floor fans are stored here, under dust covers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home22.jpg"
loading="lazy"
alt="Floor fan covered by a red blue plaid cartoon cat dust cover"
&gt;&lt;/p&gt;
&lt;h3 id="balcony"&gt;Balcony
&lt;/h3&gt;&lt;p&gt;The balcony&amp;rsquo;s my biggest floor plan disappointment. It&amp;rsquo;s long and narrow, like Chile. It barely functions as a utility balcony; a leisure balcony&amp;rsquo;s impossible.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home23.jpg"
loading="lazy"
alt="Washing machine hidden by a decorative curtain in the balcony corner"
&gt;&lt;/p&gt;
&lt;p&gt;The curtain behind the washing machine? It hides ugly pipes and a window overlooking the AC unit.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home24.jpg"
loading="lazy"
alt="Drain pipes and black framed window revealed behind the balcony curtain"
&gt;&lt;/p&gt;
&lt;p&gt;The laundry sink&amp;rsquo;s at the other end.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home25.jpg"
loading="lazy"
alt="Simple laundry sink and wall cabinet at the end of the narrow balcony"
&gt;&lt;/p&gt;
&lt;h3 id="master-bedroom"&gt;Master Bedroom
&lt;/h3&gt;&lt;p&gt;Let&amp;rsquo;s head to the main bedroom. Wallpaper&amp;rsquo;s behind the bed. Where are the pillows? A cabinet has a strong smell, so we&amp;rsquo;re still sleeping in the second bedroom. This is an old duvet cover for dust.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home27.jpg"
loading="lazy"
alt="Master bedroom headboard wall with blue wallpaper and upholstered double bed"
&gt;&lt;/p&gt;
&lt;p&gt;The master bedroom wardrobe&amp;rsquo;s huge, and the bed has storage too. I know, I&amp;rsquo;m obsessed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home28.jpg"
loading="lazy"
alt="Double bed closely flanked by bedside tables and louver wardrobes"
&gt;&lt;/p&gt;
&lt;p&gt;The bay window – the best sunlight in the house.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home29.jpg"
loading="lazy"
alt="Large master bedroom bay window with blue cushion and pillows"
&gt;&lt;/p&gt;
&lt;p&gt;A six-drawer dresser and computer desk at the foot of the bed. White and blue are the main colors, with red, pink, and brown as accents.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home30.jpg"
loading="lazy"
alt="White computer desk and six drawer cabinet at the foot of the bed"
&gt;&lt;/p&gt;
&lt;h3 id="second-bedroom"&gt;Second Bedroom
&lt;/h3&gt;&lt;p&gt;This is the guest room/future children&amp;rsquo;s room. Wallpaper divides it: darker inside for sleeping, brighter outside for work/study.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home31.jpg"
loading="lazy"
alt="Second bedroom divided into two functional zones by dark wallpaper and white walls"
&gt;&lt;/p&gt;
&lt;p&gt;Beyond the wallpaper line, it&amp;rsquo;s all pure white.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home32.jpg"
loading="lazy"
alt="Bright second bedroom desk area with white walls cabinets and a large window"
&gt;&lt;/p&gt;
&lt;p&gt;An open-sided fabric table serves as a bedside table.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home33.jpg"
loading="lazy"
alt="Round fabric side table and white rattan swivel chair beside the second bed"
&gt;&lt;/p&gt;
&lt;p&gt;The resting area. The room&amp;rsquo;s small, with beams and columns, but this layout maximizes the space.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/home34.jpg"
loading="lazy"
alt="Wooden double bed with a cartoon red cushion in the second bedroom"
&gt;&lt;/p&gt;
&lt;h2 id="mistakes"&gt;Mistakes
&lt;/h2&gt;&lt;p&gt;First-time renovator here, so of course, there are regrets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I could&amp;rsquo;ve removed the door/wall between the living room and balcony, using curtains for separation, making the balcony feel larger.&lt;/li&gt;
&lt;li&gt;The sideboard&amp;rsquo;s upper part should have doors to minimize cleaning. The design&amp;rsquo;s tacky – I don&amp;rsquo;t know how I approved it.&lt;/li&gt;
&lt;li&gt;The mosaic tiles on the sideboard don&amp;rsquo;t look great. They&amp;rsquo;re stunning in the store, but dull in this dim corner. Single-direction lighting doesn&amp;rsquo;t suit them. Colored tape or fabric might be better.&lt;/li&gt;
&lt;li&gt;The hanging cabinet right of the range hood was a mistake. Removing it would&amp;rsquo;ve allowed the hood/stove to shift, creating a larger corner countertop and a better workflow. Now, I prep on the shallow counter behind.&lt;/li&gt;
&lt;li&gt;The toilet paper holder&amp;rsquo;s placement is awkward – too far back, requiring a two-handed reach.&lt;/li&gt;
&lt;li&gt;The TV stand was a mismatch. I took a chance on a dark brown Nordic style, and it clashed. I sold it at a loss and bought a matching one, missing the set discount.&lt;/li&gt;
&lt;li&gt;Too many wood grain colors, poorly controlled. The beds are black walnut (reddish-brown); the dining table legs are ash (brownish-green); the chair legs are pine (light, reddish); the TV stand/coffee table legs are more yellow. It&amp;rsquo;s driving me nuts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="final-thoughts"&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;The renovation took over six months – constant trips to the new home, building material markets, furniture stores, and showrooms. I didn&amp;rsquo;t have a car then, relying on ride-hailing. Looking back, it was intense, sometimes 7-8 trips a day.&lt;/p&gt;
&lt;p&gt;These notes reflect my living habits. Others will have different needs. This is about understanding your lifestyle and planning accordingly.&lt;/p&gt;
&lt;p&gt;I shared a draft with friends, and they were amazed by the detail, saying renovation&amp;rsquo;s exhausting and they&amp;rsquo;d leave it to experts. I asked myself: was all this energy worth it? To answer that, we need another question:&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the point of home renovation?&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not just &amp;ldquo;making your place pretty.&amp;rdquo; It made me focus on life&amp;rsquo;s details and learn a lot. Examining each detail is envisioning a lifestyle, reviewing the past, and considering the future. It&amp;rsquo;s a fresh start, a life revolution – from chaos to order, from getting by to quality. These were unexpected benefits.&lt;/p&gt;
&lt;p&gt;As a designer, loving life is my calling. My home should be my best work.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://my.feishu.cn/file/ImR6bAiUQoOmkQxO4qWcnsUwn0g?from=from_copylink" target="_blank" rel="noopener"
&gt;&lt;img src="https://cdn.victor42.work/posts/2016-08/08-02/download.png"
loading="lazy"
alt="Blue download button for Cola Orange interior renovation resources"
&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Basic Knowledge of Mobile Dimensions</title><link>https://victor42.eth.limo/post-en/3435/</link><pubDate>Sun, 19 Apr 2015 19:55:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3435/</guid><description>&lt;p&gt;If you&amp;rsquo;re new to mobile design and development, you&amp;rsquo;ve likely struggled with dimensions. This guide breaks down the basics for beginners.&lt;/p&gt;
&lt;h2 id="the-situation"&gt;The Situation
&lt;/h2&gt;&lt;p&gt;Mobile screens come in many sizes. Fragmentation, especially on Android, is a challenge. You&amp;rsquo;ll encounter resolutions like 480x800, 480x854, 540x960, 720x1280, 1080x1920, and even 2K screens. iPhones have joined the fragmentation party: 640x960, 640x1136, 750x1334, 1242x2208.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t panic. Most apps and sites display well across screens. There&amp;rsquo;s a method to the madness.&lt;/p&gt;
&lt;h2 id="pixel-density"&gt;Pixel Density
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/1.jpg"
loading="lazy"
alt="Macro shot of RGB pixel grid on an LCD screen displaying text"
&gt;&lt;/p&gt;
&lt;p&gt;Screens are made of tiny pixels. The resolutions mentioned above are the screen&amp;rsquo;s actual pixel dimensions. A 480x800 screen has 800 rows and 480 columns of pixels. Each pixel emits colored light to create images. However, a phone&amp;rsquo;s physical size doesn&amp;rsquo;t scale proportionally with its pixel dimensions. For example, the iPhone 3GS (320x480 pixels) and iPhone 4S (640x960 pixels) are both 3.5 inches, but the 4S has double the pixels.&lt;/p&gt;
&lt;p&gt;This is where pixel density (PPI, or pixels per inch) comes in. It bridges the digital and physical worlds.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/2.png"
loading="lazy"
alt="PPI conceptual diagram illustrating a 9x9 pixel grid in a 1x1 inch area"
&gt;&lt;/p&gt;
&lt;p&gt;PPI is the number of pixels in one inch. An inch is a fixed length (2.54 cm). Higher PPI means a sharper display. Retina screens are clearer because their PPI is doubled.&lt;/p&gt;
&lt;h2 id="scaling-and-logical-pixels"&gt;Scaling and Logical Pixels
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/3.png"
loading="lazy"
alt="UI size comparison of iPhone 3GS and 4S without scaling factors applied"
&gt;&lt;/p&gt;
&lt;p&gt;Consider the iPhone 3GS and 4S again. Imagine an email list. If designed like a PC webpage, the 3GS might show 4-5 rows, the 4S 9-10, with each row being very wide. But the phones are the same size! If displayed this way, content legible on the 3GS would be tiny on the 4S.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/5.png"
loading="lazy"
alt="Diagram comparing logical pixels and physical pixels in iPhone 3GS and 4S"
&gt;&lt;/p&gt;
&lt;p&gt;In reality, they look similar. Retina screens use 2x2 pixels to represent 1 pixel. A 44-pixel-high top bar on a regular screen uses 88 pixels on a Retina screen, making it appear twice as large, matching the 3GS&amp;rsquo;s appearance but with greater clarity.&lt;/p&gt;
&lt;p&gt;Older iOS apps often had &amp;ldquo;@2x&amp;rdquo; and non-&amp;quot;@2x&amp;quot; versions of images. iOS automatically chose the correct one; Android works similarly.&lt;/p&gt;
&lt;p&gt;Apple used the regular screen as a baseline, with a 2x scaling factor for Retina screens (3x for iPhone 6 Plus). Dividing actual pixels by the scaling factor gives you logical pixel dimensions. Screens with the same logical pixels display content similarly.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/6.png"
loading="lazy"
alt="Scaling factors of three common Android screen resolutions to logical pixels"
&gt;&lt;/p&gt;
&lt;p&gt;Android&amp;rsquo;s approach is similar but more involved. Due to the wide range of Android screen sizes, Android groups devices by pixel density, assigning scaling factors to each group for visual consistency. iOS and Android handle PPI calculations for us.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/4.png"
loading="lazy"
alt="Official Android screen size and density classification matrix table"
&gt;&lt;/p&gt;
&lt;p&gt;Screens around 120 PPI are classified as ldpi, around 160 as mdpi, and so on. Scaling factors are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ldpi [0.75x]&lt;/li&gt;
&lt;li&gt;mdpi [1x]&lt;/li&gt;
&lt;li&gt;hdpi [1.5x]&lt;/li&gt;
&lt;li&gt;xhdpi [2x]&lt;/li&gt;
&lt;li&gt;xxhdpi [3x]&lt;/li&gt;
&lt;li&gt;xxxhdpi [4x]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iPhone scaling factors are simpler. But with many Android phones, how do we categorize them? Here&amp;rsquo;s a table (Umeng data, Oct 2014 - Mar 2015):&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/7.png"
loading="lazy"
alt="Umeng statistics bar chart of mainstream Android resolutions from 2014 to 2015"
&gt;&lt;/p&gt;
&lt;p&gt;Based on the market then, we can categorize phone resolutions (this isn&amp;rsquo;t exhaustive, but was relevant for about a year):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ldpi: Nearly extinct.&lt;/li&gt;
&lt;li&gt;mdpi [320x480]: (Under 5% market share; new phones won&amp;rsquo;t use this; screens are usually tiny).&lt;/li&gt;
&lt;li&gt;hdpi [480x800, 480x854, 540x960]: (Older/current low-end phones, screens around 3.5/4.7-5.0 inches).&lt;/li&gt;
&lt;li&gt;xhdpi [720x1280]: (Older mid-range/current low-to-mid-range phones, screens around 4.7-5.0/5.0-5.5 inches).&lt;/li&gt;
&lt;li&gt;xxhdpi [1080x1920]: (Older high-end/current mid-to-high-end phones, screens usually above 5.0 inches).&lt;/li&gt;
&lt;li&gt;xxxhdpi [1440x2560]: (A few 2K phones, e.g., Google Nexus 6).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mdpi (1x) is the baseline. Devices with different densities are multiplied by their scaling factor to achieve a similar visual effect.&lt;/p&gt;
&lt;p&gt;However, Android logical pixel dimensions aren&amp;rsquo;t uniform. For example, 480x800 (hdpi) and 1080x1920 (xxhdpi) have logical dimensions of 320x533 and 360x640, respectively. The latter is wider and taller, displaying more. So, even with scaling, displays on various Android devices aren&amp;rsquo;t perfectly identical.&lt;/p&gt;
&lt;h2 id="units"&gt;Units
&lt;/h2&gt;&lt;p&gt;Logical pixel dimensions determine how things look. iOS and Android use units for these: &amp;ldquo;pt&amp;rdquo; (points) for iOS, and &amp;ldquo;dp&amp;rdquo; (density-independent pixels) for Android. They&amp;rsquo;re essentially the same.&lt;/p&gt;
&lt;p&gt;Conversion between units depends on the scaling factor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1x: 1pt = 1dp = 1px (mdpi, iPhone 3GS)&lt;/li&gt;
&lt;li&gt;1.5x: 1pt = 1dp = 1.5px (hdpi)&lt;/li&gt;
&lt;li&gt;2x: 1pt = 1dp = 2px (xhdpi, iPhone 4S/5/6)&lt;/li&gt;
&lt;li&gt;3x: 1pt = 1dp = 3px (xxhdpi, iPhone 6 Plus)&lt;/li&gt;
&lt;li&gt;4x: 1pt = 1dp = 4px (xxxhdpi)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We should think in logical pixels. Some Android designers use 1080x1920 canvases, others 720x1280, leading to inconsistent UI element sizes. The minimum tappable area on Android is 48x48dp. On xhdpi, a button should be at least 96x96px; on xxhdpi, 144x144px.&lt;/p&gt;
&lt;p&gt;Regardless of canvas size, design for the baseline, and developers need logical pixel dimensions. For clarity, use logical pixels in specs and discussions. Avoid saying, &amp;ldquo;The tab bar is 96 pixels high, designed for xhdpi.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="what-about-web"&gt;What about Web?
&lt;/h2&gt;&lt;p&gt;The absolute unit for mobile web is still &amp;ldquo;px&amp;rdquo; in code, but the principle is the same. Pixel density affects all apps, including browsers. Front-end tech can leverage this. One line of code lets the browser render the page using the app&amp;rsquo;s scaling method.&lt;/p&gt;
&lt;p&gt;Use this test page &lt;a class="link" href="http://greenzorro.github.io/demo/basic/%E5%93%8D%E5%BA%94%E5%BC%8F%E6%96%AD%E7%82%B9.html" target="_blank" rel="noopener"
&gt;http://greenzorro.github.io/demo/basic/响应式断点.html&lt;/a&gt; to check your device&amp;rsquo;s logical width.&lt;/p&gt;
&lt;p&gt;The iPhone 5S (640x1136, scaling factor 2) is seen by the browser as 320x568 (baseline). Design and develop using logical pixels. You&amp;rsquo;ll need to prepare 2x images and scale them down to 1x in code for sharpness.&lt;/p&gt;
&lt;h2 id="practical-application"&gt;Practical Application
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s how to set up your canvas for iOS, Android, and Web. First, a Photoshop tip:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/8.png"
loading="lazy"
alt="Photoshop Units and Rulers settings dialog with rulers and type set to Points"
&gt;&lt;/p&gt;
&lt;p&gt;Think in logical pixels. In Photoshop, set &amp;ldquo;Units &amp;amp; Rulers&amp;rdquo; to &amp;ldquo;Points&amp;rdquo; (&amp;ldquo;pt&amp;rdquo;). Use this for iOS, Android, or Web. Remember platform-specific unit names (pt, dp).&lt;/p&gt;
&lt;p&gt;Adjust scaling with DPI (actually PPI) in Image Size. Screen designs use 72 DPI; print uses 300. Why?&lt;/p&gt;
&lt;p&gt;300 DPI relates to the human eye&amp;rsquo;s resolving power. More pixels per inch (DPI) means greater clarity. 300 DPI creates realism; 10 DPI would look like a mosaic.&lt;/p&gt;
&lt;p&gt;72 DPI has historical roots. Early Macs had 72 DPI displays. Setting Photoshop to 72 DPI matched on-screen and print sizes. 72 DPI became a standard.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-04/04-17/9.png"
loading="lazy"
alt="Photoshop Image Size dialog setting resolution to 144 DPI for 2x scale rendering"
&gt;&lt;/p&gt;
&lt;p&gt;To adjust scaling: 72 DPI is 1x. 144 DPI (72 x 2) is a 2x scaling factor.&lt;/p&gt;
&lt;p&gt;Canvas settings:&lt;/p&gt;
&lt;h3 id="iphone"&gt;iPhone
&lt;/h3&gt;&lt;p&gt;iPhone sizes vary (in logical pixels). For one design covering all iPhones, choose a moderate size.&lt;/p&gt;
&lt;p&gt;iPhone 5/5S (2x scaling, 320x568 logical pixels) is common. iPhone 6 (2x, 375x667) is gaining popularity.&lt;/p&gt;
&lt;p&gt;Designing for either accommodates the 4S and doesn&amp;rsquo;t look too empty on the 6 Plus.&lt;/p&gt;
&lt;p&gt;For the 6 Plus, 3x images are scaled from 2x, so ensure bitmaps stay sharp.&lt;/p&gt;
&lt;h3 id="android"&gt;Android
&lt;/h3&gt;&lt;p&gt;Android fragmentation is manageable. Logical dimensions are more unified: 360x640. Choose a scaling factor. For xhdpi, DPI is 144 (72 x 2). For xxhdpi, it&amp;rsquo;s 216 (72 x 3).&lt;/p&gt;
&lt;p&gt;Older 480px-width devices will show less content. Keep important content near the top/middle.&lt;/p&gt;
&lt;p&gt;These devices are fading. Those in use are likely feature phones; user experience is less critical. It&amp;rsquo;s okay to disregard them.&lt;/p&gt;
&lt;h3 id="web"&gt;Web
&lt;/h3&gt;&lt;p&gt;There&amp;rsquo;s no single standard. A common approach is designing for the iPhone 5 (2x, 320x568).&lt;/p&gt;
&lt;p&gt;This is practical: 2x screens are common on iOS and Android, and it&amp;rsquo;s the smallest 2x size, leading to smaller images and faster loading. The downside: images might not be perfectly sharp on 3x devices.&lt;/p&gt;
&lt;p&gt;For image quality over speed, design for the iPhone 6 Plus (3x, 414x736).&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Mobile dimensions are more complex than PC, with scaling being key. But scaling brings different sizes to a common level, allowing one design to adapt. This makes it easier to understand.&lt;/p&gt;</description></item><item><title>Creating a Circular Progress Bar in AE</title><link>https://victor42.eth.limo/post-en/3424/</link><pubDate>Tue, 10 Feb 2015 15:16:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3424/</guid><description>&lt;p&gt;[Update: Simpler methods exist (see the end of the post). However, the techniques here are still valuable practice.]&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using After Effects for about a year. It&amp;rsquo;s fun, useful, and easy to learn, especially with prior Flash experience. Complex UI animations are combinations of basic movements, rotations, scaling, opacity, and color changes. Online resources abound; I learned from this &lt;a class="link" href="http://v.youku.com/v_show/id_XMjMyNzk0NjQ4.html?f=5405564" target="_blank" rel="noopener"
&gt;video series&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This circular progress bar requires a bit more thought.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/1.gif"
loading="lazy"
alt="The final animated circular progress bar created in After Effects"
&gt;&lt;/p&gt;
&lt;h2 id="the-idea"&gt;The Idea
&lt;/h2&gt;&lt;p&gt;Circular progress bars are unique. They rotate while selectively revealing parts of the circle, which isn&amp;rsquo;t immediately straightforward.&lt;/p&gt;
&lt;p&gt;I drew inspiration from a &lt;a class="link" href="http://greenzorro.github.io/demo/css/%E7%8E%AF%E5%BD%A2%E8%BF%9B%E5%BA%A6%E6%9D%A1.html" target="_blank" rel="noopener"
&gt;CSS3 circular progress bar&lt;/a&gt; I created earlier. The core concept involves splitting the circle in half. The dark green (progress) is the background and remains static. Two light green semicircles cover it, rotating sequentially to reveal the progress.&lt;/p&gt;
&lt;p&gt;To create a ring, add a smaller circle on top. AE layer masks achieve a similar effect (explained later).&lt;/p&gt;
&lt;p&gt;AE can create a truly transparent circular progress bar, but the core principle remains: rotating two semicircles independently. See the diagram below:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/2.gif"
loading="lazy"
alt="Demonstration gif of the rotation principle using red, blue, and purple semicircles"
&gt;&lt;/p&gt;
&lt;p&gt;Divide the circle into left (red) and right (blue) semicircles, restricting their visibility to their respective halves. Add a static right semicircle (purple) underneath. Let&amp;rsquo;s break it down step by step.&lt;/p&gt;
&lt;h2 id="left-right-and-background-semicircles"&gt;Left, Right, and Background Semicircles
&lt;/h2&gt;&lt;p&gt;First, prepare the three semicircles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/1.png"
loading="lazy"
alt="Three static semicircle layers prepared in the After Effects timeline"
&gt;&lt;/p&gt;
&lt;p&gt;Create a 720p composition.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/2.png"
loading="lazy"
alt="Composition Settings panel in AE set to 1280x720 resolution"
&gt;&lt;/p&gt;
&lt;p&gt;Draw a 400x400 circle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/3.png"
loading="lazy"
alt="Setting the ellipse path size to 400x400 in AE shape layer"
&gt;&lt;/p&gt;
&lt;p&gt;Set the circle&amp;rsquo;s position (not the shape layer&amp;rsquo;s) to 0, 0 for perfect centering.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/4.png"
loading="lazy"
alt="Centering the ellipse path by setting its position to 0,0 in AE"
&gt;&lt;/p&gt;
&lt;p&gt;In the same shape layer, draw a 200x400 rectangle (half the circle&amp;rsquo;s size).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/5.png"
loading="lazy"
alt="Creating a 200x400 rectangle path in the same shape layer"
&gt;&lt;/p&gt;
&lt;p&gt;Set the rectangle&amp;rsquo;s position to -100, 0 to cover the circle&amp;rsquo;s left half. This rectangle will cut out the semicircle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/6.png"
loading="lazy"
alt="Positioning the rectangle at -100,0 to cover the left half of the circle"
&gt;&lt;/p&gt;
&lt;p&gt;Click &amp;ldquo;Add&amp;rdquo; and choose &amp;ldquo;Merge Paths&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/7.png"
loading="lazy"
alt="Selecting Merge Paths option from the Add menu in AE shape layer"
&gt;&lt;/p&gt;
&lt;p&gt;Set the mode to &amp;ldquo;Intersect&amp;rdquo; (like path operations in PS/AI).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/8.png"
loading="lazy"
alt="Setting the Merge Paths mode to Intersect in After Effects"
&gt;&lt;/p&gt;
&lt;p&gt;Group (Command/Ctrl + G) the circle, rectangle, and Merge Paths. This is our semicircle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/9.png"
loading="lazy"
alt="Grouping the ellipse, rectangle, and Merge Paths inside Group 1"
&gt;&lt;/p&gt;
&lt;p&gt;Expand the group, copy the inner rectangle, and paste it outside the group.&lt;/p&gt;
&lt;p&gt;This new rectangle acts as a vector mask. AE&amp;rsquo;s built-in masks rotate with the layer, which we don&amp;rsquo;t want. We need a stationary mask and a rotating semicircle. So, we use &amp;ldquo;Merge Paths&amp;rdquo; again.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/10.png"
loading="lazy"
alt="Adding a second rectangle and Merge Paths outside Group 1 for masking"
&gt;&lt;/p&gt;
&lt;p&gt;Add -&amp;gt; Merge Paths, setting the mode to &amp;ldquo;Intersect&amp;rdquo;. This creates the intersection of the new rectangle and the group.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/11.png"
loading="lazy"
alt="Rotating Group 1 in AE, with parts outside the mask hidden"
&gt;&lt;/p&gt;
&lt;p&gt;Rotating the group now shows that the area outside the rectangle is hidden.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/12.png"
loading="lazy"
alt="Adding a keyframe to the rotation property of Group 1"
&gt;&lt;/p&gt;
&lt;p&gt;Reset the rotation and add a keyframe to the group&amp;rsquo;s rotation (for later use). Press &amp;ldquo;u&amp;rdquo; to quickly access keyframed properties.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/13.png"
loading="lazy"
alt="Renaming the shape layer to Left Semicircle in the timeline"
&gt;&lt;/p&gt;
&lt;p&gt;Name this layer &amp;ldquo;Left Semicircle&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/14.png"
loading="lazy"
alt="Setting the outer mask rectangle position of Right Semicircle layer to 100,0"
&gt;&lt;/p&gt;
&lt;p&gt;Duplicate the layer (Command/Ctrl + D) for the right semicircle. Set the &lt;em&gt;outer&lt;/em&gt; rectangle&amp;rsquo;s position to 100, 0 (covering the right half). Nothing appears because the semicircle is still on the left.&lt;/p&gt;
&lt;p&gt;To clarify: the inner circle and rectangle form the rotating semicircle. The outer rectangle is the mask. The left semicircle&amp;rsquo;s mask covers the left; the right semicircle&amp;rsquo;s mask covers the right. Together, they form a full circle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/15.png"
loading="lazy"
alt="Left, Right, and Background Semicircle layers ordered in the AE timeline"
&gt;&lt;/p&gt;
&lt;p&gt;Duplicate the right semicircle, rename it &amp;ldquo;Background Semicircle,&amp;rdquo; and move it to the bottom. Set the &lt;em&gt;inner&lt;/em&gt; rectangle&amp;rsquo;s position to 100, 0. The circle becomes whole again.&lt;/p&gt;
&lt;p&gt;The static assets are now ready.&lt;/p&gt;
&lt;h2 id="creating-the-rotation-animation"&gt;Creating the Rotation Animation
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s animate the semicircles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/16.png"
loading="lazy"
alt="AE timeline showing only rotation properties with keyframes"
&gt;&lt;/p&gt;
&lt;p&gt;Press &amp;ldquo;u&amp;rdquo; to show only the rotation property with the keyframe. This is the &lt;em&gt;group&amp;rsquo;s&lt;/em&gt; rotation, not the layer&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Remove keyframes from the right and background semicircles&amp;rsquo; rotation. Keep the right semicircle&amp;rsquo;s rotation property visible.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/17.png"
loading="lazy"
alt="Enabling the Solo switch for Left Semicircle layer in AE"
&gt;&lt;/p&gt;
&lt;p&gt;Click the dot on the left semicircle layer to solo it (like Alt + clicking the layer eye in PS).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/18.png"
loading="lazy"
alt="Creating a 360-degree rotation animation keyframe for Left Semicircle"
&gt;&lt;/p&gt;
&lt;p&gt;Create a simple animation: one full rotation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/19.png"
loading="lazy"
alt="Activating expression input on Right Semicircle’s rotation by Alt-clicking"
&gt;&lt;/p&gt;
&lt;p&gt;Important: Alt + click the right semicircle&amp;rsquo;s rotation property. An expression appears in the timeline.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/20.png"
loading="lazy"
alt="Linking Right Semicircle’s rotation to Left Semicircle using Pick Whip"
&gt;&lt;/p&gt;
&lt;p&gt;Drag the right semicircle&amp;rsquo;s rotation property&amp;rsquo;s pick whip (spiral icon) to the left semicircle&amp;rsquo;s rotation property. The expression updates.&lt;/p&gt;
&lt;p&gt;Alt + clicking activated the expression. Dragging the pick whip links the right semicircle&amp;rsquo;s rotation to the left&amp;rsquo;s. Now, the right semicircle always follows the left.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/21.png"
loading="lazy"
alt="Disabling Solo switch on Left Semicircle layer to restore view"
&gt;&lt;/p&gt;
&lt;p&gt;Turn off solo display for the left semicircle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/22.png"
loading="lazy"
alt="Red, blue, and purple colored semicircles visible in the AE canvas"
&gt;&lt;/p&gt;
&lt;p&gt;For clarity, fill the semicircles with different colors (for demonstration only).&lt;/p&gt;
&lt;p&gt;Use red for the left, blue for the right, and purple for the background semicircle, matching the &amp;ldquo;Idea&amp;rdquo; section&amp;rsquo;s diagram.&lt;/p&gt;
&lt;h2 id="finding-the-critical-frame"&gt;Finding the Critical Frame
&lt;/h2&gt;&lt;p&gt;Play the animation. It&amp;rsquo;s incorrect: the left semicircle is visible initially. It should appear only after the right semicircle rotates halfway. The same applies to the background semicircle.&lt;/p&gt;
&lt;p&gt;We need a specific frame where the left and background semicircles are hidden.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/23.png"
loading="lazy"
alt="Locating the playback head at the critical 180-degree rotation frame"
&gt;&lt;/p&gt;
&lt;p&gt;This critical frame is when the right semicircle reaches 180 degrees (or slightly more).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/24.png"
loading="lazy"
alt="Trimming the in-points of Left and Background Semicircles to the critical frame"
&gt;&lt;/p&gt;
&lt;p&gt;Select the left and background semicircles and trim their timelines&amp;rsquo; left ends to this frame. They won&amp;rsquo;t appear too early now.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/25.png"
loading="lazy"
alt="Clicking the Graph Editor button to adjust motion curves in AE"
&gt;&lt;/p&gt;
&lt;p&gt;Playback is now correct!&lt;/p&gt;
&lt;p&gt;The constant-speed rotation is unnatural. Open the Graph Editor (graph icon). Select the left semicircle&amp;rsquo;s rotation to see a straight line.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/26.png"
loading="lazy"
alt="Converting linear keyframes to Bezier curves in Graph Editor"
&gt;&lt;/p&gt;
&lt;p&gt;Select the line and click the two-handled icon. The line curves, and handles appear.&lt;/p&gt;
&lt;p&gt;The Graph Editor is simple: the horizontal axis is time; the vertical is value change. A flat curve means slow change; a steep curve means fast change.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/27.png"
loading="lazy"
alt="Adjusting the Bezier handle to create an ease-out speed curve"
&gt;&lt;/p&gt;
&lt;p&gt;For a fast-start, slow-end animation, adjust the curve like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/28.png"
loading="lazy"
alt="Re-aligning layer in-points based on the newly adjusted ease curve"
&gt;&lt;/p&gt;
&lt;p&gt;Find the critical frame again (right semicircle at 180 degrees or slightly beyond).&lt;/p&gt;
&lt;h2 id="adding-a-mask"&gt;Adding a Mask
&lt;/h2&gt;&lt;p&gt;The circular progress bar is done; let&amp;rsquo;s make it a ring.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/29.png"
loading="lazy"
alt="Right-clicking the selected layers to choose Pre-compose in AE"
&gt;&lt;/p&gt;
&lt;p&gt;Select all layers and Pre-compose (right-click).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/30.png"
loading="lazy"
alt="Confirming settings in the Pre-compose options dialog in AE"
&gt;&lt;/p&gt;
&lt;p&gt;The three layers merge (like a Smart Object in PS or Movie Clip in Flash).&lt;/p&gt;
&lt;p&gt;Create a mask (Command/Ctrl + Shift + N) - AE&amp;rsquo;s built-in layer mask.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/31.png"
loading="lazy"
alt="Adding a full-size rectangular mask to the new pre-composition layer"
&gt;&lt;/p&gt;
&lt;p&gt;The mask is a rectangle. Expand the mask menu and click &amp;ldquo;Mask Path&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/32.png"
loading="lazy"
alt="Opening the Mask Shape settings dialog to redefine the mask bounds"
&gt;&lt;/p&gt;
&lt;p&gt;Set the four values (top, left, bottom, right) as shown, and check the box to make it a circle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/33.png"
loading="lazy"
alt="Setting the mask coordinates and checking Reset to Ellipse option"
&gt;&lt;/p&gt;
&lt;p&gt;These numbers ensure the circular mask matches the progress bar&amp;rsquo;s size and position.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/34.png"
loading="lazy"
alt="Checking the Inverted option on the mask to hide the inner circle"
&gt;&lt;/p&gt;
&lt;p&gt;Check &amp;ldquo;Inverted&amp;rdquo;. The circle disappears because the mask now shows the area &lt;em&gt;outside&lt;/em&gt; it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/35.png"
loading="lazy"
alt="Scaling down the inverted circular mask from center to form the ring"
&gt;&lt;/p&gt;
&lt;p&gt;Select the mask and press Command/Ctrl + T.&lt;/p&gt;
&lt;p&gt;Hold Command/Ctrl + Shift to scale from the center, making it slightly smaller. The ring appears.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2015-02/02-09/1.gif"
loading="lazy"
alt="The final animated circular progress bar created in After Effects"
&gt;&lt;/p&gt;
&lt;p&gt;Done! That&amp;rsquo;s the progress bar I wanted.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;This tutorial is lengthy, focusing on the concepts. The actual process is simple and takes about 5 minutes with practice.&lt;/p&gt;
&lt;p&gt;For the lazy, here&amp;rsquo;s the source file: &lt;a class="link" href="http://pan.baidu.com/s/1eQxSE6A" target="_blank" rel="noopener"
&gt;Here&amp;rsquo;s the source file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a beginner, so this might not be the &lt;em&gt;best&lt;/em&gt; method, just &lt;em&gt;a&lt;/em&gt; method. Path animations might offer a simpler solution.&lt;/p&gt;
&lt;p&gt;Share if you have a better method!&lt;/p&gt;
&lt;p&gt;[Update: I received immediate feedback. &amp;ldquo;Radial Wipe&amp;rdquo; and &amp;ldquo;Trim Paths&amp;rdquo; are easier. &amp;ldquo;Radial Wipe&amp;rdquo; is a one-step solution. See the &amp;ldquo;Growing Circle&amp;rdquo; section in &lt;a class="link" href="http://www.zcool.com.cn/article/ZNDkzNDg=.html" target="_blank" rel="noopener"
&gt;this article&lt;/a&gt;.]&lt;/p&gt;</description></item><item><title>Level Up as a Designer</title><link>https://victor42.eth.limo/post-en/3080/</link><pubDate>Sun, 09 Feb 2014 13:45:47 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3080/</guid><description>&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2014-02/02-09/1.jpg"
loading="lazy"
alt="A young blonde girl in a pink floral dress jumps outdoors in warm sunlight, reaching up toward floating soap bubbles, symbolizing a designer’s journey of breakthrough, growth, and continuous self-improvement"
&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had a reflective year. Being a designer is hard, and I felt stagnant, which was disheartening. But I also learned some key lessons about self-improvement. This year, I&amp;rsquo;m acting on them to break through. And I&amp;rsquo;m sharing them with fellow design enthusiasts:&lt;/p&gt;
&lt;h3 id="1-share-and-share-alike"&gt;1. Share and Share Alike
&lt;/h3&gt;&lt;p&gt;Sharing is the first step. Explaining what you know is a review process. It doesn&amp;rsquo;t instantly grant new skills, but it lets you slow down and truly grasp the core concepts.&lt;/p&gt;
&lt;p&gt;A friend asked how to improve color sense and matching. I was initially stumped. Color is tricky. Finally, I suggested paying attention to everyday colors – packaging, cookbooks, clothes, ads. Try recalling them; the details will fade, leaving only the key colors. That&amp;rsquo;s the essence of color matching. Also, study photography and monochromatic designs. Same idea. I surprised myself with that answer. Had I used these methods? On reflection, I had, but I&amp;rsquo;d only just realized it.&lt;/p&gt;
&lt;p&gt;Answering her question helped me summarize a key design skill. The benefits of sharing are often subtle, things you won&amp;rsquo;t find in books. Don&amp;rsquo;t miss them.&lt;/p&gt;
&lt;h3 id="2-work-hard-network-harder"&gt;2. Work Hard, Network Harder
&lt;/h3&gt;&lt;p&gt;I&amp;rsquo;m not overly talkative, but I&amp;rsquo;m not an introvert either. I make friends, but I don&amp;rsquo;t actively expand my circle. I value my close friends, but I&amp;rsquo;m not driven to meet new people. This is a drawback for a designer. Design isn&amp;rsquo;t solitary; it&amp;rsquo;s about understanding others. Designers need to connect, especially with peers.&lt;/p&gt;
&lt;p&gt;After my article, &lt;a class="link" href="http://victor42.eth.limo/2874" target="_blank" rel="noopener"
&gt;&amp;ldquo;How I Became a Designer&amp;rdquo;&lt;/a&gt;, gained traction, my blog became less isolated. Designers and enthusiasts I&amp;rsquo;d never met reached out, shared experiences, asked for advice, discussed careers, offered projects, invited me to join startups, or just sought encouragement. I was overwhelmed but also touched. After three years of working mostly alone, I found a design family, a sense of belonging. These were real people, not just a forum. Everyone had unique experiences and passion. Most importantly, they were good people, worth knowing.&lt;/p&gt;
&lt;p&gt;Cultivate your design network. Beyond the information you&amp;rsquo;ll gain, the mutual support is invaluable.&lt;/p&gt;
&lt;h3 id="3-every-field-is-a-new-challenge-embrace-it"&gt;3. Every Field is a New Challenge, Embrace It
&lt;/h3&gt;&lt;p&gt;I did graphic design for six months and then moved to web design. I can confidently discuss web structures, resolutions, browser engines, and common hex codes, but should I stop there?&lt;/p&gt;
&lt;p&gt;No way. I can&amp;rsquo;t ignore the mobile boom. I created a mobile version of my blog early on, and even though I was still in a PC mindset, it showed me mobile is a different beast. Shifting screen sizes, different units, touch interactions – there&amp;rsquo;s much to learn. For Apple&amp;rsquo;s Retina screens, you double background image sizes and then compress them with CSS. You only learn this by diving in.&lt;/p&gt;
&lt;p&gt;And &amp;ldquo;design&amp;rdquo; is broadening. App animations are becoming crucial. Button vibrations and sound effects are now design considerations. Design is no longer purely visual.&lt;/p&gt;
&lt;p&gt;The more media you explore, the broader design becomes. How do you design for a colorless e-reader? What&amp;rsquo;s the difference between a smart TV interface and PC software? How should a blind person use a phone? Open your eyes, and the hidden depths of design emerge.&lt;/p&gt;
&lt;h3 id="4-build-willpower-cultivate-habits"&gt;4. Build Willpower, Cultivate Habits
&lt;/h3&gt;&lt;p&gt;I was a gaming addict in college, playing World of Warcraft constantly for almost two years. While I gained something (understanding good game design), three months would have sufficed. I uninstalled and reinstalled it several times before finally quitting, even though I enjoyed it.&lt;/p&gt;
&lt;p&gt;If breaking a habit is tough, forming one is even harder. You need subconscious actions to train willpower.&lt;/p&gt;
&lt;p&gt;Since my student days, I&amp;rsquo;ve consistently written – about life, movies, even weird dreams. Maybe that showed me the value of habits. Whether the habit is useful or not, forming it builds willpower.&lt;/p&gt;
&lt;p&gt;I decided to do something meaningful, long-term, &lt;em&gt;anything&lt;/em&gt;. I had a great idea: translate a foreign design article weekly and create a WeChat account, &amp;ldquo;Me,&amp;rdquo; to share them. I love English and wanted a long-term way to use it. I&amp;rsquo;m a designer, and foreign articles are helpful. I enjoy writing, and translation is creative, plus it enriches my blog. So, I&amp;rsquo;ve kept up this habit, hitting multiple goals, for seven months. If there&amp;rsquo;s anything else I want to do long-term, I&amp;rsquo;m confident I can.&lt;/p&gt;
&lt;h3 id="5-happiness-first"&gt;5. Happiness First
&lt;/h3&gt;&lt;p&gt;The previous points indirectly improve skills, but this one directly impacts your work. An unhappy designer struggles to inspire, and their skills rarely grow. I know this from experience, having had several miserable jobs.&lt;/p&gt;
&lt;p&gt;Knowing some front-end, and mostly working in startups, I naturally did two people&amp;rsquo;s jobs. But front-end developers are scarcer than designers. My coding work increased, and eventually, the company hired another designer and had me focus on slicing. My front-end skills improved, but that wasn&amp;rsquo;t my aim. I should have said no, but it happened, and it soured my mood. The physical toll of overtime and the anxiety of wanting out drained me, leaving no energy for design. It ended with me quitting and starting fresh.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re happy, a designer&amp;rsquo;s mind is supercharged. Amazing ideas flow, and you create interesting things in your spare time. Party posters, crafts, concept designs – practice is vital for growth.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion
&lt;/h3&gt;&lt;p&gt;Being a good designer isn&amp;rsquo;t easy. But the charm lies in the breakthrough after the struggle. It&amp;rsquo;s like Neo flying his ship towards the Machine City in &lt;em&gt;The Matrix&lt;/em&gt;. Under attack, he bursts through the clouds and sees the warm, bright skyline.&lt;/p&gt;
&lt;p&gt;So, for the sunshine in your hearts, designers, full speed ahead in 2014!&lt;/p&gt;</description></item><item><title>Building a Living System Inspired by Out of Control</title><link>https://victor42.eth.limo/post-en/3085/</link><pubDate>Thu, 30 Jan 2014 15:00:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3085/</guid><description>&lt;p&gt;I revisited Kevin Kelly&amp;rsquo;s (KK) &lt;em&gt;Out of Control&lt;/em&gt; and &lt;em&gt;What Technology Wants&lt;/em&gt;. His worldview is mind-blowing. Both books are dense; you can&amp;rsquo;t rush them. The ideas interconnect, resembling a living system.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t recap the books. Inspired by &lt;em&gt;Out of Control&lt;/em&gt;, I built a chaos system simulator to observe emergent behavior. I coded it in half a day, and the results surprised even me. &lt;a class="link" href="http://greenzorro.github.io/chaos/" target="_blank" rel="noopener"
&gt;Check it out&lt;/a&gt; (Chrome or Chromium-based browser recommended; cross-browser compatibility wasn&amp;rsquo;t a priority).&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://greenzorro.github.io/chaos/" target="_blank" rel="noopener"
&gt;&lt;img src="https://cdn.victor42.work/posts/2014-01/01-30/1.png"
loading="lazy"
alt="Initial random matrix of teal and brown dots in the chaos simulator"
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works: Set the grid size, and it generates a random matrix. The grid wraps around, having no center. Two colors of dots are randomly distributed in equal numbers (the total must be even). It evolves iteratively. Each dot&amp;rsquo;s new color is determined by the majority color within a surrounding square (e.g., a 5x5 square represents a &amp;ldquo;connection level&amp;rdquo; of 2). All dots evolve simultaneously.&lt;/p&gt;
&lt;p&gt;This system mirrors KK&amp;rsquo;s four characteristics of decentralized systems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No central control.&lt;/li&gt;
&lt;li&gt;Autonomous sub-units.&lt;/li&gt;
&lt;li&gt;Highly connected sub-units.&lt;/li&gt;
&lt;li&gt;Nonlinear causality from peer-to-peer influence.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The goal is to see emergent behavior from simple, individual changes in a large, decentralized group – the core of &lt;em&gt;Out of Control&lt;/em&gt;&amp;rsquo;s second chapter. Search &amp;ldquo;swarm intelligence&amp;rdquo; for a quick overview.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2014-01/01-30/2.png"
loading="lazy"
alt="Stable evolved dot pattern in a 10x20 grid with connection level of 1"
&gt;&lt;/p&gt;
&lt;p&gt;The default is a 10x20 grid with a connection level of 1. Each manual evolution stabilizes the pattern. Random evolutions produce different final patterns, proving that living systems are sensitive to initial conditions, with unpredictable outcomes.&lt;/p&gt;
&lt;p&gt;Increasing the connection level (explained in the app) signifies stronger inter-individual influence. Higher levels mean greater &amp;ldquo;socialization.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2014-01/01-30/3.png"
loading="lazy"
alt="Regular polarized pattern with a higher connection level of 3 in the simulator"
&gt;&lt;/p&gt;
&lt;p&gt;Now, both manual and random evolutions create more regular patterns. Sometimes, perfectly straight lines emerge, forming two opposing groups, akin to the development of civilizations – nations are born.&lt;/p&gt;
&lt;p&gt;I increased the grid to 20x30 (600 &amp;ldquo;individuals&amp;rdquo; instead of 200). What would happen?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2014-01/01-30/4.png"
loading="lazy"
alt="Simulator pattern showing isolated islands in a 20x30 grid with connection level 1"
&gt;&lt;/p&gt;
&lt;p&gt;Not much difference, but interestingly, at 20x30, setting the connection level back to 1 (weaker individual influence) often creates isolated islands.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2014-01/01-30/5.png"
loading="lazy"
alt="Simulator pattern with connection level 3 where isolated islands are eliminated"
&gt;&lt;/p&gt;
&lt;p&gt;Increasing the connection level to 3 eliminates the islands. Consider the spread of rumors! In our interconnected information age, how much pseudoscience becomes &amp;ldquo;common knowledge&amp;rdquo;? Lacking reliable scientific standards, we&amp;rsquo;re pushed toward ignorance by commercial hype, relying on friends and family, even if their information is flawed.&lt;/p&gt;
&lt;p&gt;The result is similar: many believe cacti absorb radiation or avoid nonexistent harmful food combinations. Truly scientific individuals might have a connection level of 1. But amidst rampant rumors, they can&amp;rsquo;t verify everything, absorbing some false beliefs and, in a sense, being &amp;ldquo;eliminated.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Rumors are an inseparable byproduct of the information age, because the information society is itself a giant chaotic system.&lt;/p&gt;
&lt;p&gt;I kept hitting random evolution until, finally, a single-color result appeared!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2014-01/01-30/6.png"
loading="lazy"
alt="A uniform single-color evolved pattern in a 20x30 grid with connection level 3"
&gt;&lt;/p&gt;
&lt;p&gt;Increasing the population &lt;em&gt;can&lt;/em&gt; cause a qualitative change – a core concept of swarm intelligence. Hundreds of bees behave differently than the sum of their parts; the swarm gains a consciousness. It&amp;rsquo;s alive!&lt;/p&gt;
&lt;p&gt;Two equally numerous, randomly distributed colors can result in a single color. More bizarre stable states, like a checkerboard pattern, probably exist, but I haven&amp;rsquo;t found the initial conditions to create them.&lt;/p&gt;
&lt;p&gt;This uniformity signifies consensus. This can be efficient or disastrous, depending on its use. It relates to bird flocks, musical creation, the formation of scientific systems, and also mass extinctions, moral decline, new values, machine dominance&amp;hellip; things we might &lt;em&gt;not&lt;/em&gt; want.&lt;/p&gt;
&lt;p&gt;But that&amp;rsquo;s letting it run wild. Chaotic systems are unpredictable; we can&amp;rsquo;t control them externally. However, controlling the initial conditions allows us to create highly fault-tolerant systems, like the neural network computers of sci-fi.&lt;/p&gt;
&lt;p&gt;KK&amp;rsquo;s vision of the future hinges on a world where life (chaotic living systems) and machines (systems with predictable, fixed rules) are deeply integrated. Combining their strengths could create an unimaginable new world. But we must relinquish our desire for absolute control – over technology, society, and even thought. Because these, too, are alive.&lt;/p&gt;</description></item></channel></rss>