<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tool on Victor42</title><link>https://victor42.eth.limo/tags/tool/</link><description>Recent content in Tool on Victor42</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>hi@victor42.work (Victor42)</managingEditor><webMaster>hi@victor42.work (Victor42)</webMaster><lastBuildDate>Tue, 09 Jun 2026 16:12:00 +0000</lastBuildDate><atom:link href="https://victor42.eth.limo/tags/tool/index.xml" rel="self" type="application/rss+xml"/><item><title>What is an AI Native Data System</title><link>https://victor42.eth.limo/post-en/ai-native-data-system/</link><pubDate>Tue, 09 Jun 2026 16:12:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/ai-native-data-system/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2026-06/01a9a53be38ac38125ec5e439d0ee2d1.webp" alt="Featured image of post What is an AI Native Data System" /&gt;&lt;p&gt;I am a power user of Excel and Google Sheets, &lt;a class="link" href="https://qvokpfxqsh.feishu.cn/wiki/G8OywdlWji0H31kJ0KwciaJ8nAd" target="_blank" rel="noopener"
&gt;relying on them heavily to manage both work and life&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Later, I migrated some of my heavier data management tasks to visual databases like Feishu Bitable. While they might look like Excel, they are fundamentally different beasts. With much stricter data rules than spreadsheets, they trade some flexibility for the raw power of a true database. You can easily link multiple tables and build highly complex data systems—more than capable of running &lt;a class="link" href="https://victor42.eth.limo/post-en/automate-ai-illustrations-production/" target="_blank" rel="noopener"
&gt;a small business&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/fc6b17ebd80b1127ef989c46c9ed412b.webp"
loading="lazy"
alt="The task scheduling calendar interface inside Feishu Bitable project management system"
&gt;&lt;/p&gt;
&lt;p&gt;I once built a full-cycle task management system in Bitable, tracking everything from assignment to delivery. It seamlessly spun out weekly reports, project calendars, and annual stats. People asked for this system at least three times: a colleague for personal use, a manager for their team, and my previous employer for a company-wide rollout.&lt;/p&gt;
&lt;p&gt;But no matter how powerful the tool, you still have to do the heavy lifting yourself.&lt;/p&gt;
&lt;p&gt;I believe in what I call the &amp;ldquo;dishwasher philosophy&amp;rdquo;. The older generation often scoffs at dishwashers, arguing, &amp;ldquo;You still have to rinse the plates first. I could have just washed them by hand in that time!&amp;rdquo; Here is my take: washing by hand takes 15 minutes of pure human labor. Rinsing takes 5 minutes, and the machine runs for 40—but that is still only 5 minutes of &lt;em&gt;my&lt;/em&gt; time. I just bought back 10 minutes of my life.&lt;/p&gt;
&lt;p&gt;To me, technology is a tool to reclaim my life.&lt;/p&gt;
&lt;p&gt;Bitable has built-in AI features, and you can also use local Agents to control it via CLI or API. But if you try it, it feels like Usain Bolt running underwater—completely constrained. Bitable is not an AI-native product; it is designed for human eyes and human logic. Current AI Agents are text-based creatures, interacting with the world through code. Therefore, the most AI-native data system is simply a database.&lt;/p&gt;
&lt;p&gt;I spent a day overhauling this system with AI. I stripped it back to the basics and took it entirely local. It no longer relies on cloud services or third-party apps. Now, it is just a lightweight local SQLite database, entirely read, written, and managed by AI. It automatically generates four pages based on the data: a calendar, recent tasks, historical tasks, and project stats. These serve as my dashboard and command center. Here is how it looks:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/01a9a53be38ac38125ec5e439d0ee2d1.webp"
loading="lazy"
alt="The clean and clear task scheduling calendar page in the new data system"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/1ef49a58e0fc77e16de145b8a8f10935.webp"
loading="lazy"
alt="The recent tasks page listing ongoing tasks in the new data system"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/4493b8709a24ae2c1a2ebd66f351e0de.webp"
loading="lazy"
alt="The historical tasks page showing completed tasks with thumbnails in the new system"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/6c11adfcc19725d0155524aae1eedf6f.webp"
loading="lazy"
alt="The project statistics dashboard displaying various quantity charts and metrics"
&gt;&lt;/p&gt;
&lt;p&gt;Need to squeeze in a last-minute request? I just tell the AI to push all tasks from today onwards back by one workday, and it even splits overnight tasks to skip the weekend. Just one sentence.&lt;/p&gt;
&lt;p&gt;Finished a task? The AI automatically scans the schedule for the task&amp;rsquo;s last appearance, sets that as the delivery date, and marks it done. If I forget to add deliverable links or thumbnails, it nudges me to provide them. Again, just one sentence.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/d89b73b5ca2469be465cc6c1e9ddbb4a.webp"
loading="lazy"
alt="The interactive console showing a partial list of public holidays in the database"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2026-06/c865e3397af6f1488633198616b466ff.webp"
loading="lazy"
alt="The completed public holidays table displayed in the console interface"
&gt;&lt;/p&gt;
&lt;p&gt;Want to add public holidays to the calendar? It is a non-standard request, but since you are using AI, it always finds a way to make it happen.&lt;/p&gt;
&lt;p&gt;I am not saying this replaces Excel or Bitable entirely. Their perks are undeniable: WYSIWYG interfaces, cross-platform access, and zero environment dependencies. I still manage plenty of data in Google Sheets.&lt;/p&gt;
&lt;p&gt;Watching the AI carefully but slowly read specs, write SQL, verify data, and update pages does not bother me one bit. Sure, I could have done it in seconds in Excel or Bitable. But over a full day of intensive use, who knows how many of those seconds the AI has bought back for me.&lt;/p&gt;
&lt;p&gt;This system is open-source, so feel free to grab it. It will keep your work perfectly organized without draining your time on administrative chores:
&lt;a class="link" href="https://github.com/greenzorro/project-manager" target="_blank" rel="noopener"
&gt;https://github.com/greenzorro/project-manager&lt;/a&gt;&lt;/p&gt;</description></item><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>UI Canvas Size Calculator</title><link>https://victor42.eth.limo/post-en/ui-canvas-size-calculator/</link><pubDate>Tue, 10 Jun 2025 17:27:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/ui-canvas-size-calculator/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2025-06/593bba684765381e0ac910413a657590.webp" alt="Featured image of post UI Canvas Size Calculator" /&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;When designing a UI for this screen, how big should I make my canvas?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="background"&gt;Background
&lt;/h2&gt;&lt;p&gt;After my wife switched from UI to industrial design, she started running into all sorts of weird screen sizes. With her UI background, she was also tasked with designing interfaces for various industrial control machines. These screens often left her stumped, with no idea how large to make her design canvas.&lt;/p&gt;
&lt;p&gt;This is a common headache. Many UI designers don&amp;rsquo;t fully grasp the technical principles of screen displays. The problem became more widespread with the advent of Retina displays and their &amp;ldquo;pixel density&amp;rdquo; concept, leaving many designers guessing about the correct canvas dimensions.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t an issue for common devices, as design tools like Figma and Sketch provide presets. But in niche areas like industrial design, smart homes, and IoT, you&amp;rsquo;ll find a bewildering array of screen sizes. UI designers used to standard web and mobile projects are often stumped when they encounter these custom displays.&lt;/p&gt;
&lt;p&gt;Fortunately, there&amp;rsquo;s a method to the madness. The key is PPI (Pixels Per Inch), which acts as a bridge between physical dimensions and the pixel grid. You might also hear it called &amp;ldquo;pixel density&amp;rdquo;—a fitting term. Higher density means less pixelation and a sharper image.&lt;/p&gt;
&lt;p&gt;Plenty of articles dive deep into the technical details. But honestly, a UI designer shouldn&amp;rsquo;t need a degree in display engineering to do their job. In today&amp;rsquo;s specialized world, an artist doesn&amp;rsquo;t need to know how their canvas is woven.&lt;/p&gt;
&lt;p&gt;So, what designers really need isn&amp;rsquo;t a textbook, but a simple calculator. Input the screen specs, get the right canvas size. Simple.&lt;/p&gt;
&lt;h2 id="the-calculation"&gt;The Calculation
&lt;/h2&gt;&lt;p&gt;To build this simple tool, I had to break down the math. The calculator needs a few inputs from the user:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pixel width of the screen&lt;/li&gt;
&lt;li&gt;Pixel height of the screen&lt;/li&gt;
&lt;li&gt;Diagonal screen size in inches&lt;/li&gt;
&lt;li&gt;Typical viewing distance (e.g., Touch, Desktop, TV)&lt;/li&gt;
&lt;li&gt;Preferred design scale (based on common widths like 375px for @1x, 750px for @2x, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the pixel width and height, we use the Pythagorean theorem to find the diagonal pixel count. Divide that by the screen&amp;rsquo;s diagonal inch measurement, and you get the PPI.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PPI = Diagonal pixels / Screen size = √(Pixel width^2 + Pixel height^2) / Screen size&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next, we estimate the screen&amp;rsquo;s density multiplier (@1x, @2x, etc.). This is done by dividing the PPI by a constant that varies with viewing distance. While real-world multipliers can be fractional, design conventions round them to the nearest integer. It&amp;rsquo;s the standard way to handle screen fragmentation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Screen Multiplier = PPI / Divisor&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The magic numbers are: 150 for close-up (touch) screens, 110 for mid-range (desktops), and 40 for far-away (TVs).&lt;/p&gt;
&lt;p&gt;Where did these numbers come from? I reverse-engineered them by analyzing data from a wide range of devices. I noticed that for most touchscreens, if you divide their PPI by their native scale factor, the result hovers around 150. The same pattern emerged for mid-range and far-range screens, with values around 110 and 40.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-06/15386d1877e20780e6c1b43dbf92ab10.webp"
loading="lazy"
alt="Box plot of PPI divisors across different screen viewing distances"
&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve probably not seen a chart like this often. It&amp;rsquo;s a box plot, and it&amp;rsquo;s great for showing the distribution of data. You can&amp;rsquo;t whip this up in Excel; I had to use Python to generate it.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever looked at stock charts, this might look familiar, like a candlestick chart. The concept is similar, with four key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Top of the thin line: Maximum value (highest price)&lt;/li&gt;
&lt;li&gt;Bottom of the thin line: Minimum value (lowest price)&lt;/li&gt;
&lt;li&gt;Top of the thick box: Third quartile (opening/closing price)&lt;/li&gt;
&lt;li&gt;Bottom of the thick box: First quartile (closing/opening price)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The box plot has one extra feature: a line inside the box representing the median. I used the median value for each category as my divisor.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A quick stats refresher: the median is the middle value in a sorted dataset. The first and third quartiles are the medians of the lower and upper halves of the data.&lt;/p&gt;
&lt;p&gt;Why use the median instead of the average? The long &amp;ldquo;whiskers&amp;rdquo; on the plot show that there are outliers that would skew the average. The median gives a better sense of the central tendency, which is what we need to represent a typical device.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Okay, back to the formula:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Screen Multiplier = PPI / Divisor&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, we have the PPI and the right divisor. This gives us the screen&amp;rsquo;s scale multiplier, which is the key piece of the puzzle. The final step is to account for the designer&amp;rsquo;s workflow. Some prefer designing at @1x (common in Figma/Sketch), while others work at @2x or @3x (a holdover from Photoshop-centric days).&lt;/p&gt;
&lt;p&gt;We take the screen&amp;rsquo;s native resolution, divide by its scale multiplier to get the logical resolution (@1x). Then we multiply that by the designer&amp;rsquo;s preferred scale factor (@1x, @2x, or @3x) to get the final canvas dimensions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Canvas Width = (Screen Pixel Width / Screen Multiplier) × Design Canvas Multiplier
Canvas Height = (Screen Pixel Height / Screen Multiplier) × Design Canvas Multiplier&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This also helps answer two related questions: what scale should assets be exported at, and what font sizes are appropriate?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Asset Export Scale = Screen Multiplier / Design Canvas Multiplier&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For example, if the target screen is @2x and you design on a @1x canvas, you&amp;rsquo;ll need to export @2x assets. If you design on a @2x canvas, you&amp;rsquo;ll export @1x assets.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s one catch: your design scale can&amp;rsquo;t be higher than the target screen&amp;rsquo;s scale. It makes no sense to design at @3x for a @2x screen. In that case, you should just match the screen&amp;rsquo;s scale.&lt;/p&gt;
&lt;p&gt;Font sizes scale directly with your design canvas. A 12px font on a @1x canvas becomes 24px on a @2x canvas. The same rule applies: don&amp;rsquo;t use a design scale larger than the target screen&amp;rsquo;s scale.&lt;/p&gt;
&lt;p&gt;Is your head spinning from all the math? That&amp;rsquo;s exactly why I built this tool. Designers shouldn&amp;rsquo;t have to waste time on this stuff. A simple calculator can save everyone hours of headache.&lt;/p&gt;
&lt;p&gt;I first built a proof-of-concept in Excel to validate my formulas. But it was clunky and not something I could share widely. So I decided to turn it into a proper web app. Since I&amp;rsquo;d already specced out the logic in detail, I figured I could hand it off to an AI to code. It should be a piece of cake, right?&lt;/p&gt;
&lt;p&gt;Next, it was the AI&amp;rsquo;s turn to do the work. Using the logic and context above, I gave the AI the following prompt to generate a web tool:&lt;/p&gt;
&lt;h2 id="the-task"&gt;The Task
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Product name: &amp;ldquo;UI Canvas Size Calculator&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Make it responsive for desktop and mobile.&lt;/li&gt;
&lt;li&gt;Use vanilla HTML, CSS, and JS. No backend, no heavy frameworks.&lt;/li&gt;
&lt;li&gt;Keep CSS and JS in separate files for maintainability.&lt;/li&gt;
&lt;li&gt;Write modular JS with constants defined at the top.&lt;/li&gt;
&lt;li&gt;Include robust form validation with helpful error messages and placeholder examples in the input fields.&lt;/li&gt;
&lt;li&gt;The results should show: Canvas Width, Canvas Height, Asset Export Scale, and Suggested Font Size (e.g., 12px for @1x, 24px for @2x, etc.).&lt;/li&gt;
&lt;li&gt;Display the results visually. Instead of just text, draw a simple diagram of a screen and label it with the calculated dimensions.&lt;/li&gt;
&lt;li&gt;Add a light/dark mode toggle, defaulting to light.&lt;/li&gt;
&lt;li&gt;Use #2A9D8F for the primary brand color.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-result"&gt;The Result
&lt;/h2&gt;&lt;p&gt;And what do you know, it nailed it on the first try!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2025-06/Xnip2025-06-11_10-40-02.webp"
loading="lazy"
alt="UI Canvas Size Calculator web app showing input fields and canvas results"
&gt;&lt;/p&gt;
&lt;p&gt;Well, almost. It ignored my request for vanilla JS and went with a full-blown Next.js, TypeScript, and Tailwind CSS stack. As a front-end dinosaur who started in the IE6 days, that stack was a bit intimidating.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t even know how to run it locally at first. But a few questions to the AI got me up to speed. I ended up getting a crash course in modern web development, and deployment turned out to be surprisingly easy.&lt;/p&gt;
&lt;p&gt;And just like that, the app was live: &lt;a class="link" href="https://ui-size.victor42.work/" target="_blank" rel="noopener"
&gt;https://ui-size.victor42.work/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It seems like a great new workflow for simple tools: write the blog post first, and the post itself becomes the spec for building the tool.&lt;/p&gt;
&lt;p&gt;As a final check, I had the AI plug the screen data I&amp;rsquo;d collected into the new tool. The results were spot-on, especially for touch and desktop devices. The only place it stumbled was with large TVs and monitors, as many of them use a non-integer scale factor like 1.5x, which my simple model doesn&amp;rsquo;t account for.&lt;/p&gt;
&lt;p&gt;But for its main purpose—calculating sizes for niche industrial design screens—it works like a charm.&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>Where Will Our Generation's Last Words Be Written?</title><link>https://victor42.eth.limo/post-en/3653/</link><pubDate>Tue, 20 Aug 2024 14:23:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3653/</guid><description>&lt;p&gt;In my &lt;a class="link" href="https://victor42.eth.limo/post-en/3652/" target="_blank" rel="noopener"
&gt;previous post&lt;/a&gt; about AI-filtered news, some readers noticed a phone automation: &amp;ldquo;Send location to wife if I miss her call.&amp;rdquo; The comments were funny, but the idea is serious. While getting kidnapped is unlikely, unexpected things happen. It&amp;rsquo;s rational to prepare. We can record crucial information our families would need and ensure they receive it.&lt;/p&gt;
&lt;p&gt;As an average office worker, I&amp;rsquo;m not managing a family business or company shares. I just need to list my assets and debts, leaving clues for recovery.&lt;/p&gt;
&lt;p&gt;This boils down to three questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Where to store the info?&lt;/li&gt;
&lt;li&gt;When and how to send it?&lt;/li&gt;
&lt;li&gt;How to keep it secure?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tackling these in order proved difficult. Existing solutions lacked either automation or security. I even checked dedicated apps, but their data security was dubious. Rethinking the order (2, 1, 3), I realized a calendar app is ideal.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/ca91f7cba9e630d53033d7ef0d1253e2.jpg"
loading="lazy"
alt="A custom notification pop-up in calendar app configuring email reminder"
&gt;&lt;/p&gt;
&lt;p&gt;I created a recurring monthly event with email reminders.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/62579ed37df278f49d5021b071a10c2c.jpg"
loading="lazy"
alt="A screenshot of automatic forwarding filter rule configured in Gmail settings"
&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s set to email me. I then configured a filter in my email to forward it to my wife&amp;rsquo;s primary email if the body contains a specific keyword, like one at the start of my message.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/ab7f8b818ec04f4effe2bd9a11090dda.jpg"
loading="lazy"
alt="A calendar event details screen showing recurring settings and description"
&gt;&lt;/p&gt;
&lt;p&gt;The message itself is in the event notes. I list my assets: investments, savings, insurance, and usernames. For security, I omit passwords, only including the ID or phone number needed for a reset. I also list debts, primarily the mortgage, including the payment card, amount, and a reminder to keep it current.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2024-08/928065980cc3f8d0bc56f2ab9a441044.jpg"
loading="lazy"
alt="A calendar month view showing scheduled events and reminders"
&gt;&lt;/p&gt;
&lt;p&gt;But this would email my wife monthly – not exactly &amp;ldquo;last words.&amp;rdquo; So, I set up a second recurring event a day earlier, reminding me to delete the &amp;ldquo;last words&amp;rdquo; event – just that occurrence, not the series. This &amp;ldquo;negative trigger,&amp;rdquo; inspired by the Swordholder in &lt;em&gt;The Three-Body Problem&lt;/em&gt;, is activated by &lt;em&gt;inaction&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This prevents monthly emails and keeps the information out of my wife&amp;rsquo;s inbox, reducing the risk of leaks. Her data security habits aren&amp;rsquo;t as strong as mine. For added security, I created a separate, dedicated calendar account just for this, never used for sign-ups or other emails.&lt;/p&gt;
&lt;p&gt;Naturally, I&amp;rsquo;ll inform my wife about this, if only to ensure she doesn&amp;rsquo;t change her main email.&lt;/p&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></channel></rss>