<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Josh's Dev Blog</title>
    <link>https://joshhong.vercel.app/en</link>
    <description>Frontend engineering insights and personal development journey</description>
    <language>en</language>
    <atom:link href="https://joshhong.vercel.app/api/feed?locale=en" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Mon, 15 Jun 2026 03:49:30 GMT</lastBuildDate>
    
    <item>
      <title><![CDATA[Cost #6: Batch API + Cache Write Optimization — The Last 30% of Advanced Savings]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-08-17_Cost_06_Batch_Cache_Write_Optimization</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-08-17_Cost_06_Batch_Cache_Write_Optimization</guid>
      <description><![CDATA[Lay the foundation from the first 5 posts and monthly bill is usually 50%+ cut.]]></description>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
      <category>Claude Code</category>
      <category>Cost</category>
      <category>Batch API</category>
      <category>Prompt Engineering</category>
    </item>
    <item>
      <title><![CDATA[Cost #5: Monthly Bill Audit — Find the Token Burner in 926 Sessions]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-08-10_Cost_05_Monthly_Bill_Audit</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-08-10_Cost_05_Monthly_Bill_Audit</guid>
      <description><![CDATA[Everyone frowns at the monthly Claude bill amount, but few actually look at "where the money went, which session."]]></description>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
      <category>Claude Code</category>
      <category>Cost</category>
      <category>Audit</category>
      <category>Token Insights</category>
    </item>
    <item>
      <title><![CDATA[Cost #4: Pro / Max / API — Which ROI Is Highest for Which Workload]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-08-03_Cost_04_Pro_Max_API_ROI</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-08-03_Cost_04_Pro_Max_API_ROI</guid>
      <description><![CDATA[Over the past year I've paid for Claude Pro, Max, and pure API — months on each, real usage data.]]></description>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <category>Claude Code</category>
      <category>Cost</category>
      <category>Subscription</category>
      <category>ROI</category>
    </item>
    <item>
      <title><![CDATA[Cost #3: Agentic Loop Token Defense — Stop Ralph Burning $200 Overnight]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-07-27_Cost_03_Agentic_Loop_Token_Defense</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-07-27_Cost_03_Agentic_Loop_Token_Defense</guid>
      <description><![CDATA[The biggest value of Ralph Loop and Auto-Research is "working without sleep" — but for the same reason, they can burn your bill without sleep.]]></description>
      <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
      <category>Claude Code</category>
      <category>Cost</category>
      <category>Ralph Loop</category>
      <category>Auto-Research</category>
    </item>
    <item>
      <title><![CDATA[Cost #2: Model Selection Economics — When to Use Opus / Sonnet / Haiku]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-07-20_Cost_02_Model_Selection_Economics</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-07-20_Cost_02_Model_Selection_Economics</guid>
      <description><![CDATA[Lots of people default Claude Code to Opus, figuring "the strongest is the best." Then they see a triple-digit monthly bill and realize something's wrong.]]></description>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
      <category>Claude Code</category>
      <category>Cost</category>
      <category>Model Selection</category>
      <category>Routing</category>
    </item>
    <item>
      <title><![CDATA[Cost #1: Cache TTL Pro vs Max — The Physical Impact of 5 Minutes vs 1 Hour]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-07-13_Cost_01_Cache_TTL_Deep_Dive</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-07-13_Cost_01_Cache_TTL_Deep_Dive</guid>
      <description><![CDATA[My Threads post on Pro vs Max cache TTL difference got 8139 views. Half the comments were "is the gap really that big?" and "I didn't know this existed."]]></description>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
      <category>Claude Code</category>
      <category>Cost</category>
      <category>Cache</category>
      <category>Economics</category>
    </item>
    <item>
      <title><![CDATA[Recipe #10: Image 4-Layer Routing — Don't Re-Decide Tool Every Image]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-07-06_Recipe_10_Image_Routing_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-07-06_Recipe_10_Image_Routing_Pipeline</guid>
      <description><![CDATA[Every time before making an image: which tool? gti or ComfyUI or just HTML? 5 minutes thinking, still haven't started.]]></description>
      <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Image Generation</category>
      <category>ComfyUI</category>
      <category>Decision Tree</category>
    </item>
    <item>
      <title><![CDATA[Recipe #9: Wiki Knowledge Pipeline — Three-Layer Automation, raw → wiki → site]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-06-29_Recipe_09_Wiki_Knowledge_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-06-29_Recipe_09_Wiki_Knowledge_Pipeline</guid>
      <description><![CDATA[I've accumulated a lot of material: conversation transcripts, research notes, PDF excerpts, interviews... every time I want to find "that folder structure mentioned last time," it takes 30 minutes of digging.]]></description>
      <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Wiki</category>
      <category>Knowledge Management</category>
      <category>Static Site</category>
    </item>
    <item>
      <title><![CDATA[Recipe #8: Multi-Agent Orchestration — PM + Simon + Giselle + 3 Teammates]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-06-22_Recipe_08_Multi_Agent_Orchestration_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-06-22_Recipe_08_Multi_Agent_Orchestration_Pipeline</guid>
      <description><![CDATA["For this blog post I need to write the article body + companion SVG + verify sanitize-html whitelist + run evaluate script" — four things, sequential takes 4 hours.]]></description>
      <pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Multi-Agent</category>
      <category>Worktree</category>
      <category>PM</category>
    </item>
    <item>
      <title><![CDATA[Recipe #7: Ralph Loop — Stop Hook + Cross-Session Auto Relay]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-06-15_Recipe_07_Ralph_Loop_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-06-15_Recipe_07_Ralph_Loop_Pipeline</guid>
      <description><![CDATA[Many tasks aren't "session-complete-able" — for example "implement X feature and pass all e2e tests." One session burns 8 hours or 200K tokens before the task is done — do you reopen a session?]]></description>
      <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Ralph Loop</category>
      <category>Stop Hook</category>
      <category>Auto Iteration</category>
    </item>
    <item>
      <title><![CDATA[Recipe #6: Auto-Research Pipeline — Turn Taste Into a Number, Push It]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-06-08_Recipe_06_Auto_Research_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-06-08_Recipe_06_Auto_Research_Pipeline</guid>
      <description><![CDATA[Once tried to push the blog landing page design to "acceptable," but "acceptable" couldn't even be defined. I designed, Claude edited, looked again, edited again, looked... after hours of back and forth, uglier than the baseline.]]></description>
      <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Auto-Research</category>
      <category>Karpathy</category>
      <category>Auto Optimization</category>
    </item>
    <item>
      <title><![CDATA[Hexagon #6: Risk Awareness — Telegram Injection, Worktree Race Defense]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-06-05_Hexagon_06_Risk_Awareness</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-06-05_Hexagon_06_Risk_Awareness</guid>
      <description><![CDATA[The most dangerous agent loss of control isn't what it does wrong — it's doing it before you can look.]]></description>
      <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Security</category>
      <category>Permission</category>
      <category>Risk Awareness</category>
    </item>
    <item>
      <title><![CDATA[Recipe #5: Content Distribution — Threads → Blog → LinkedIn → X → YT]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-06-01_Recipe_05_Content_Distribution_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-06-01_Recipe_05_Content_Distribution_Pipeline</guid>
      <description><![CDATA[Every indie maker hits this: write a blog post, but no time for Threads opener, LinkedIn and Twitter each need rewrites, YT video even more so — time spent distributing one piece of content is 5x the creation time.]]></description>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Content</category>
      <category>Remotion</category>
      <category>Building in Public</category>
    </item>
    <item>
      <title><![CDATA[Hexagon #5: Prompt Craft — Reference Fidelity and Anti-Minimal, Two Iron Rules]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-29_Hexagon_05_Prompt_Craft</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-29_Hexagon_05_Prompt_Craft</guid>
      <description><![CDATA[Recent failure: gave an agent a 66-node ComfyUI workflow and said "port it to a new scene."]]></description>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Prompt</category>
      <category>CLAUDE.md</category>
      <category>Prompt Craft</category>
    </item>
    <item>
      <title><![CDATA[Recipe #4: Job Hunting Pipeline — 6 Scrapers + Supabase + GPT, End to End]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-25_Recipe_04_Job_Hunting_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-25_Recipe_04_Job_Hunting_Pipeline</guid>
      <description><![CDATA[I'm looking for remote overseas engineering roles, but checking job boards manually means 30 minutes scans only 2-3 sites a day.]]></description>
      <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Supabase</category>
      <category>Job Hunting</category>
      <category>MockMaster</category>
    </item>
    <item>
      <title><![CDATA[Hexagon #4: Output Verification — Turning Subjective Feel Into Numbers]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-22_Hexagon_04_Output_Verification</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-22_Hexagon_04_Output_Verification</guid>
      <description><![CDATA[The code the agent writes all looks right. Syntax correct, logic sound, naming reasonable.]]></description>
      <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Quality Gate</category>
      <category>Auto-Research</category>
      <category>Output Verification</category>
    </item>
    <item>
      <title><![CDATA[Recipe #3: VN Image Pipeline — Why You Can't Chop a Single One of the 66 Nodes]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-18_Recipe_03_VN_Image_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-18_Recipe_03_VN_Image_Pipeline</guid>
      <description><![CDATA[Recently did something dumb: chopped a 66-node ComfyUI workflow down to 23 nodes, called it "minimal v8," output was a disaster.]]></description>
      <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>ComfyUI</category>
      <category>SDXL</category>
      <category>VN</category>
    </item>
    <item>
      <title><![CDATA[Hexagon #3: Task Strategy — Knowing What to Delegate, What to Do Yourself]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-15_Hexagon_03_Task_Strategy</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-15_Hexagon_03_Task_Strategy</guid>
      <description><![CDATA[Throwing a whole feature at an agent in one shot, only to scrap what comes back within half an hour — almost every beginner goes through this pain.]]></description>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Task Decomposition</category>
      <category>Ralph Loop</category>
      <category>Task Strategy</category>
    </item>
    <item>
      <title><![CDATA[Recipe #2: Animation Pipeline — gpt-image-2 Keyframes + RIFE Interpolation]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-11_Recipe_02_Animation_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-11_Recipe_02_Animation_Pipeline</guid>
      <description><![CDATA[Need to make a 1-second waving animation.]]></description>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>ComfyUI</category>
      <category>Animation</category>
      <category>RIFE</category>
    </item>
    <item>
      <title><![CDATA[Hexagon #2: Iteration Learning — Turn Every Mistake Into a Permanent Rule]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-08_Hexagon_02_Iteration_Learning</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-08_Hexagon_02_Iteration_Learning</guid>
      <description><![CDATA[The most exhausting part of operating agents is not writing prompts — it is correcting the same mistake for the third time.]]></description>
      <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Memory</category>
      <category>Feedback Loop</category>
      <category>Iteration Learning</category>
    </item>
    <item>
      <title><![CDATA[Recipe #1: AV Translation Pipeline — Japanese Podcasts to Bilingual Markdown]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-04_Recipe_01_AV_Translation_Pipeline</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-04_Recipe_01_AV_Translation_Pipeline</guid>
      <description><![CDATA[Every time I wanted to consume a Japanese podcast / lecture / live stream, it was either grind through listening or hunt for subtitles. If neither worked, give up.]]></description>
      <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
      <category>Pipeline</category>
      <category>Whisper</category>
      <category>Claude</category>
      <category>Translation</category>
    </item>
    <item>
      <title><![CDATA[Hexagon #1: Context Management — How Agents Onboard in 30 Seconds]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-05-01_Hexagon_01_Context_Management</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-05-01_Hexagon_01_Context_Management</guid>
      <description><![CDATA[Every new agent session starts amnesic. That is not a bug — it is a physical fact. Once the context window burns out, it is gone.]]></description>
      <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Claude Code</category>
      <category>Memory</category>
      <category>Context Management</category>
    </item>
    <item>
      <title><![CDATA[The AI Agent Engineer Hexagon: Six Dimensions of Operational Ability]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-04-22_AI_Agent_Engineer_Hexagon</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-04-22_AI_Agent_Engineer_Hexagon</guid>
      <description><![CDATA[Harness Engineering is about system design — building the constraints and feedback mechanisms around an agent. But once the system is built, someone still has to operate it. This post covers the other half: the real-time operational ability of engineers working with AI agents.]]></description>
      <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Claude Code</category>
      <category>Engineering</category>
      <category>Career</category>
    </item>
    <item>
      <title><![CDATA[Three Tools for AI-Driven Development: Impeccable, Auto-Research, and Ralph]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-04-16_Three_Tools_for_AI_Driven_Development</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-04-16_Three_Tools_for_AI_Driven_Development</guid>
      <description><![CDATA[Introduction]]></description>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Claude Code</category>
      <category>Automation</category>
      <category>DevTools</category>
      <category>Guides</category>
    </item>
    <item>
      <title><![CDATA[The Three-Punch Combo: Impeccable + Auto-Research + Ralph]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-04-16_Impeccable_AutoResearch_Ralph_Combo</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-04-16_Impeccable_AutoResearch_Ralph_Combo</guid>
      <description><![CDATA[The Setup]]></description>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>Claude Code</category>
      <category>Automation</category>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[I Built a Pixel Art Virtual Office for My AI Team]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-03-25_Virtual_Office_Pixel_Dashboard</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-03-25_Virtual_Office_Pixel_Dashboard</guid>
      <description><![CDATA[I saw some OpenClaw users building pixel art AI Office dashboards and thought they looked pretty cool. So I decided to make my own.]]></description>
      <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>Side Project</category>
      <category>Pixel Art</category>
      <category>OpenClaw</category>
      <category>Build Log</category>
    </item>
    <item>
      <title><![CDATA[Automation Playbook: OpenClaw Memory Management]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-02-13_Playbook_Memory_Management</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-02-13_Playbook_Memory_Management</guid>
      <description><![CDATA[Goal
Set up a durable, queryable memory system for OpenClaw agents that persists across sessions and compactions.]]></description>
      <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
      <category>Automation</category>
      <category>Playbook</category>
      <category>OpenClaw</category>
      <category>Memory</category>
    </item>
    <item>
      <title><![CDATA[OpenClaw Field Notes Collection: 13 Pitfalls Across 4 Themes]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-02-13_OpenClaw_Field_Notes_Collection</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-02-13_OpenClaw_Field_Notes_Collection</guid>
      <description><![CDATA[Context
This collection consolidates the Field Notes accumulated while operating OpenClaw, grouped into four themes: Gmail OAuth delivery, session routing, agent config schema, and bootstrap files &amp; compaction. Every case here was actually hit with a real error message or symptom, kept in the original symptom / cause / fix format so future-you can keyword-search straight to the fix.]]></description>
      <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
      <category>OpenClaw</category>
      <category>Field Notes</category>
      <category>Gmail</category>
      <category>OAuth</category>
      <category>Sessions</category>
      <category>Config</category>
    </item>
    <item>
      <title><![CDATA[OpenClaw Field Notes: Cron Jobs Fix After Auto-Update]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-02-12_OpenClaw_Field_Notes_Cron_Jobs_Auto_Update_Fix</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-02-12_OpenClaw_Field_Notes_Cron_Jobs_Auto_Update_Fix</guid>
      <description><![CDATA[Background]]></description>
      <pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate>
      <category>OpenClaw</category>
      <category>Cron</category>
      <category>Field Notes</category>
      <category>Config</category>
    </item>
    <item>
      <title><![CDATA[Automation Playbook: Sending Gmail via Python OAuth in Cron]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-02-12_Automation_Playbook_Gmail_OAuth_in_Cron</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-02-12_Automation_Playbook_Gmail_OAuth_in_Cron</guid>
      <description><![CDATA[Problem]]></description>
      <pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate>
      <category>Automation</category>
      <category>Gmail</category>
      <category>OAuth</category>
      <category>Python</category>
      <category>Cron</category>
      <category>Playbook</category>
    </item>
    <item>
      <title><![CDATA[Automation Playbook: New Agent Onboarding SOP]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-02-09_New_Agent_Onboarding_SOP</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-02-09_New_Agent_Onboarding_SOP</guid>
      <description><![CDATA[Goal
Stand up a new OpenClaw agent with full identity, messaging, auth, and health checks. This playbook provides step-by-step instructions with examples and troubleshooting.]]></description>
      <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
      <category>Automation</category>
      <category>Playbook</category>
      <category>OpenClaw</category>
      <category>Onboarding</category>
    </item>
    <item>
      <title><![CDATA[Day 18: The Skills System (How to Write Your Own Skill)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-02-01_Learn_day18-skills</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-02-01_Learn_day18-skills</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>OpenClaw Deep Dive</category>
      <category>OpenClaw</category>
    </item>
    <item>
      <title><![CDATA[Day 17: Logging and Debugging]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-31_Learn_day17-logging</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-31_Learn_day17-logging</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Day 16: The Provider System (OpenAI, Anthropic, Google)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-30_Learn_day16-providers</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-30_Learn_day16-providers</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Day 15: The Hooks System]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-29_Learn_day15-hooks</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-29_Learn_day15-hooks</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Automation</category>
    </item>
    <item>
      <title><![CDATA[Day 14: Security (Sandbox, Tool Policies, SSRF Protection)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-28_Learn_day14-security</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-28_Learn_day14-security</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Security</category>
    </item>
    <item>
      <title><![CDATA[Speak2Type: A Lightweight Global Voice-to-Text Tool for Windows]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-27_speak2type</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-27_speak2type</guid>
      <description><![CDATA[I built a small Windows tool that turns voice into text anywhere. Press a hotkey, speak, and the text is pasted into the focused app. It's not a commercial product, just a practical utility I wanted for my own workflow, then decided to open-source.]]></description>
      <pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate>
      <category>Windows</category>
      <category>Side Project</category>
      <category>Tool</category>
    </item>
    <item>
      <title><![CDATA[Day 13: The Commands System]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-27_Learn_day13-commands</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-27_Learn_day13-commands</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Tool Use</category>
    </item>
    <item>
      <title><![CDATA[Day 12: Browser Control (CDP, Profiles, Snapshots)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-26_Learn_day12-browser</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-26_Learn_day12-browser</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Tool Use</category>
    </item>
    <item>
      <title><![CDATA[Day 11: Subagents (sessions_spawn)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-25_Learn_day11-subagents</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-25_Learn_day11-subagents</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Day 10: The Auto-Reply Mechanism (Heartbeat, Routing)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-24_Learn_day10-heartbeat</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-24_Learn_day10-heartbeat</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Automation</category>
    </item>
    <item>
      <title><![CDATA[Day 9: Context Management (Workspace Files, Project Context)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-23_Learn_day09-context</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-23_Learn_day09-context</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Context Management</category>
    </item>
    <item>
      <title><![CDATA[Day 8: The Config System (openclaw.json, agents, bindings)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-22_Learn_day08-config</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-22_Learn_day08-config</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Day 7: The Memory System (Compaction, Memory-Flush)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-21_Learn_day07-memory</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-21_Learn_day07-memory</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Memory</category>
    </item>
    <item>
      <title><![CDATA[Day 6: The Cron System (Schedule, Payload, Delivery)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-20_Learn_day06-cron</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-20_Learn_day06-cron</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Automation</category>
    </item>
    <item>
      <title><![CDATA[Day 5: Plugin Architecture (How Telegram/WhatsApp Integrate)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-19_Learn_day05-plugins</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-19_Learn_day05-plugins</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Plugins</category>
    </item>
    <item>
      <title><![CDATA[Day 4: The Tool System (exec, browser, message, etc.)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-18_Learn_day04-tools</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-18_Learn_day04-tools</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Tool Use</category>
    </item>
    <item>
      <title><![CDATA[Day 3: Session Mechanism (Isolated vs Main)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-17_Learn_day03-session</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-17_Learn_day03-session</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Context Management</category>
    </item>
    <item>
      <title><![CDATA[Day 2: The Agent System (Core Message Processing Logic)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-16_Learn_day02-agent-system</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-16_Learn_day02-agent-system</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Day 1: OpenClaw Overall Architecture]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-15_Learn_day01-architecture</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-15_Learn_day01-architecture</guid>
      <description><![CDATA[Concept]]></description>
      <pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>OpenClaw Deep Dive</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[12. Token Optimization and Cost Control: The Art of Saving Money]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-12_Learn_12-cost-optimization</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-12_Learn_12-cost-optimization</guid>
      <description><![CDATA[LLM API Cost Structure]]></description>
      <pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Cost Optimization</category>
    </item>
    <item>
      <title><![CDATA[11. Trust Boundary: What's Trusted and What's Not]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-11_Learn_11-trust-boundary</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-11_Learn_11-trust-boundary</guid>
      <description><![CDATA[Why Distinguish Trust Boundaries?]]></description>
      <pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Security</category>
    </item>
    <item>
      <title><![CDATA[10. Embeddings and Vector Search: An Agent's Long-Term Memory]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-10_Learn_10-embeddings</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-10_Learn_10-embeddings</guid>
      <description><![CDATA[The Limitation of Context]]></description>
      <pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Embeddings</category>
    </item>
    <item>
      <title><![CDATA[09. Provider Abstraction Layer: How OpenClaw Supports Multiple LLMs]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-09_Learn_09-provider-abstraction</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-09_Learn_09-provider-abstraction</guid>
      <description><![CDATA[The Problem: Every LLM API Is Different]]></description>
      <pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[08. Session State Machine: The Lifecycle of Agent Conversations]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-08_Learn_08-session-state</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-08_Learn_08-session-state</guid>
      <description><![CDATA[What Is a Session?]]></description>
      <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Context Management</category>
    </item>
    <item>
      <title><![CDATA[07. Context Management: Why Agents Need to "Forget"]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-07_Learn_07-context-management</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-07_Learn_07-context-management</guid>
      <description><![CDATA[The Problem: Context Windows Fill Up]]></description>
      <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Context Management</category>
    </item>
    <item>
      <title><![CDATA[06. The ReAct Pattern: The Agent's Thinking Loop]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-06_Learn_06-react-pattern</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-06_Learn_06-react-pattern</guid>
      <description><![CDATA[What Is ReAct?]]></description>
      <pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[05. The Role of System Prompts: Why They Can Control AI Behavior]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-05_Learn_05-system-prompt</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-05_Learn_05-system-prompt</guid>
      <description><![CDATA[What Is a System Prompt?]]></description>
      <pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Prompt Engineering</category>
    </item>
    <item>
      <title><![CDATA[04. Temperature and Top-p: Controlling LLM "Creativity"]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-04_Learn_04-temperature</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-04_Learn_04-temperature</guid>
      <description><![CDATA[How Does an LLM Choose the Next Token?]]></description>
      <pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Prompt Engineering</category>
    </item>
    <item>
      <title><![CDATA[03. Streaming: Why Text Can Appear as It Is Being Generated]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-03_Learn_03-streaming</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-03_Learn_03-streaming</guid>
      <description><![CDATA[The Problem: LLM Responses Are Slow]]></description>
      <pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Streaming</category>
    </item>
    <item>
      <title><![CDATA[02. Tool Calling Protocol: How Agents Can "Take Action"]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-02_Learn_02-tool-calling</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-02_Learn_02-tool-calling</guid>
      <description><![CDATA[Why Do LLMs Need Tools?]]></description>
      <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
      <category>Tool Use</category>
    </item>
    <item>
      <title><![CDATA[01. Token Mechanics: The Unit of Measurement for LLMs]]></title>
      <link>https://joshhong.vercel.app/en/posts/2026-01-01_Learn_01-tokens</link>
      <guid>https://joshhong.vercel.app/en/posts/2026-01-01_Learn_01-tokens</guid>
      <description><![CDATA[Why Understand Tokens First?]]></description>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <category>AI Agent</category>
      <category>LLM</category>
      <category>AI Agent Fundamentals</category>
    </item>
    <item>
      <title><![CDATA[Web Storage Strategies: Cookie, Session, and JWT in Practice]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-31_Web_Authentication_Storage_Strategy</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-31_Web_Authentication_Storage_Strategy</guid>
      <description><![CDATA["Why do I have to log in again even though I checked 'Remember me'?" "Why can some sites keep me logged in for 30 days while others log me out when I close the browser?" These seemingly simple questions touch on one of the most important topics in web development: properly managing authentication state.]]></description>
      <pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate>
      <category>Auth</category>
      <category>Security</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Memory Cache Implementation: Testing Cache Effectiveness]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-31_Memory_Cache_SSG_Comparison</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-31_Memory_Cache_SSG_Comparison</guid>
      <description><![CDATA[After converting my blog to SSG, I wanted to test Memory Cache effectiveness further. This article documents the implementation process and actual test results.]]></description>
      <pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate>
      <category>Cache</category>
      <category>Performance</category>
      <category>Next.js</category>
    </item>
    <item>
      <title><![CDATA[Port Management Cheat Sheet for Developers]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-30_Port_Management_Cheat_Sheet</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-30_Port_Management_Cheat_Sheet</guid>
      <description><![CDATA[During development, we often encounter "Port already in use" errors or need to diagnose network connectivity issues. This cheat sheet compiles commonly used port management commands across platforms to help resolve issues quickly.]]></description>
      <pubDate>Sat, 30 Aug 2025 00:00:00 GMT</pubDate>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[Complete Guide to Next.js Rendering Patterns: SSR/CSR/SSG/ISR]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-24_NextJS_Rendering_Patterns_Complete_Guide</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-24_NextJS_Rendering_Patterns_Complete_Guide</guid>
      <description><![CDATA[After refactoring my blog with SSG, I documented the rendering patterns I've encountered in Next.js.]]></description>
      <pubDate>Sun, 24 Aug 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>SSG</category>
      <category>SSR</category>
      <category>Rendering</category>
      <category>Performance</category>
    </item>
    <item>
      <title><![CDATA[Implementing SSG in a Next.js Blog: Migrating from SSR]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-23_SSG_Implementation_Next_Blog</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-23_SSG_Implementation_Next_Blog</guid>
      <description><![CDATA[Recently refactored my personal blog's rendering architecture, migrating from Server-Side Rendering (SSR) to Static Site Generation (SSG). Here's what I learned.]]></description>
      <pubDate>Sat, 23 Aug 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>SSG</category>
      <category>SSR</category>
      <category>Performance</category>
    </item>
    <item>
      <title><![CDATA[XSS Protection: From "100 Files" to "One Interceptor"]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-01_XSS_Protection_Architecture_Refactoring</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-01_XSS_Protection_Architecture_Refactoring</guid>
      <description><![CDATA[Recently got a requirement: all internal API calls in the project need XSS validation to prevent malicious scripts from reaching the backend through APIs. My first reaction was "alright, I'll just write a function and call it in every route."]]></description>
      <pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate>
      <category>Security</category>
      <category>XSS</category>
      <category>JavaScript</category>
      <category>API</category>
    </item>
    <item>
      <title><![CDATA[Frontend gRPC Integration: A Complete Migration Guide from REST to gRPC]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-08-01_Frontend_gRPC_Integration_Implementation</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-08-01_Frontend_gRPC_Integration_Implementation</guid>
      <description><![CDATA[Recently, I got an interesting assignment at work: migrating certain routes from REST APIs to gRPC calls as a technical POC. The entire implementation journey covered environment setup, Protocol Buffers compilation, route refactoring, error handling, and mock server testing.]]></description>
      <pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate>
      <category>gRPC</category>
      <category>TypeScript</category>
      <category>Next.js</category>
      <category>API</category>
    </item>
    <item>
      <title><![CDATA[Building a Context-Aware Video Chatbot with Multi-Turn Memory]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-06-22_video_summarizer_chatbot</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-06-22_video_summarizer_chatbot</guid>
      <description><![CDATA[This article documents how I integrated a chatbot into each video page of my VideoSummarizer project. This chatbot can remember context and answer questions based on video content, allowing for topic-based discussions similar to using ChatGPT:]]></description>
      <pubDate>Sun, 22 Jun 2025 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>Next.js</category>
      <category>API</category>
      <category>Node.js</category>
    </item>
    <item>
      <title><![CDATA[YouTube Video Manager, Summarizer & Note-taker: The "Video Summarizer" Project]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-06-21_Video_summarizer_project</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-06-21_Video_summarizer_project</guid>
      <description><![CDATA[My YouTube "Watch Later" list probably has over 50 videos. I often stumble upon interesting content but lack the immediate time to watch it, or I suspect it's clickbait, so I save it for later. Over time, these videos accumulate into a mountain I'll never get around to watching.
Most of these are non-entertainment videos (I always watch entertainment content right away, of course!). I eventually realized I needed a tool to quickly extract video information, determine if a 10-20 minute video was truly worth my time, and effectively condense useful insights along with my own thoughts. This need sparked the creation of this project.
For this iteration, I'm using Supabase (my MongoDB free tier unfortunately hit its limits).]]></description>
      <pubDate>Sat, 21 Jun 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>AI</category>
      <category>Node.js</category>
      <category>Video</category>
    </item>
    <item>
      <title><![CDATA[One Year as a Software Engineer: Reflections and the Road Ahead]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-06-15_after_a_year_being_swe</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-06-15_after_a_year_being_swe</guid>
      <description><![CDATA[A year has flown by. As I sift through my GitHub stats, I see nearly 200 PRs and 50,000 lines of code. Though it's only my first year after a career switch, I've gained significant insights.]]></description>
      <pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate>
      <category>Career</category>
    </item>
    <item>
      <title><![CDATA[Google Docs to Markdown: Auto-Convert with Cloudinary + AI Polish]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-06-01_Google_Docs_to_Markdown_Tool</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-06-01_Google_Docs_to_Markdown_Tool</guid>
      <description><![CDATA[As someone who constantly switches between writing and coding, I'm always concerned about the workflow. Writing directly in Markdown is convenient but sometimes I draft ideas on the phone, or when I don't have access to a computer, I use Google Docs. However, adapting content from Google Docs to my preferred Markdown format is overly cumbersome. Messy formatting and images that can't be directly used mean a lot of manual effort which significantly reduces my motivation to organize content.]]></description>
      <pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate>
      <category>Node.js</category>
      <category>AI</category>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[Considering a Career Switch to Software Engineering? My Honest Experience]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-04-14_Career_switch_experience</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-04-14_Career_switch_experience</guid>
      <description><![CDATA[This article is based on a reply I posted on PTT a couple of months ago, now slightly refined for broader sharing. My aim is to offer insights to those contemplating a career change.
The original poster had clearly thought deeply about their situation but came from an ordinary background and lacked clarity on what a career switch truly entailed or what the future might hold. Many responses they received were discouraging. Having personally navigated this journey, I felt compelled to offer a different perspective. Here’s my original response:]]></description>
      <pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate>
      <category>Career</category>
    </item>
    <item>
      <title><![CDATA[WhisperX + AiNiee + SakuraLLM: Generating Chinese Subtitles for Japanese Videos]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-03-20_Whisperx_AiNiee_Sakurallm</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-03-20_Whisperx_AiNiee_Sakurallm</guid>
      <description><![CDATA[This solution leverages existing tools to generate Chinese subtitles for Japanese videos or animations that lack them.]]></description>
      <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>Node.js</category>
      <category>DevTools</category>
      <category>Video</category>
    </item>
    <item>
      <title><![CDATA[2025 Side Projects and Tools: My Journey with LLMs and Node.js]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-03-13_side_projects_and_tools</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-03-13_side_projects_and_tools</guid>
      <description><![CDATA[Two months into 2025, I've been experimenting with various applications involving Large Language Models (LLMs) and Node.js. I wanted to briefly document them here, with plans to delve into more detail when time permits.]]></description>
      <pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>Node.js</category>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[Simple Implementation Process for NextAuth]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-15_Simple_Implementation_Process_for_NextAuth</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-15_Simple_Implementation_Process_for_NextAuth</guid>
      <description><![CDATA[NextAuth is a complete authentication solution for Next.js that supports OAuth (e.g., Google, Facebook, Line) and credential-based logins. It allows you to implement an account-password and third-party login mechanism within a few hours, making it much simpler than creating a custom OAuth implementation.]]></description>
      <pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>Auth</category>
      <category>Node.js</category>
    </item>
    <item>
      <title><![CDATA[Personal Blog Update Record(Part 1): Implementing Post Filters]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-12_Personal_Blog_Update_Post_Filters</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-12_Personal_Blog_Update_Post_Filters</guid>
      <description><![CDATA[As the number of articles grew, having a post filter feature became essential. So I implemented it on a Saturday night after my kid fell asleep.]]></description>
      <pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Next.js</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Using i18n in Next.js Applications]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-06_Using_i18n_in_Nextjs_Applications</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-06_Using_i18n_in_Nextjs_Applications</guid>
      <description><![CDATA[Two years ago, when I made this blog project, I didn't know about i18n. So, to enable language switching between English and Chinese, I created separate versions of page components for en and ch...]]></description>
      <pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>React</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Moonlight Remote Access Setup Notes]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-10_Moonlight_Remote_Access_Setup_Notes</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-10_Moonlight_Remote_Access_Setup_Notes</guid>
      <description><![CDATA[Since I'm using a desktop at home, and I sometimes need to watch my child in the living room, I needed a way to remotely control the desktop from the TV, laptop, or iPad.]]></description>
      <pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[Handling Next.js Routing and Context Fetch Issues]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-08_Handling_Nextjs_Routing_and_Context_Fetch_Issues</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-08_Handling_Nextjs_Routing_and_Context_Fetch_Issues</guid>
      <description><![CDATA[When API request parameters are constructed from URL params, navigating within the same router with different params generates distinct API requests, returning different data.]]></description>
      <pubDate>Wed, 08 Jan 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>React</category>
      <category>API</category>
    </item>
    <item>
      <title><![CDATA[Component Shared State Implementation with Context API]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-11_Component_State_Sharing_Options</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-11_Component_State_Sharing_Options</guid>
      <description><![CDATA[In frontend development, dividing pages or features into independent components (like Posts and PostsFilter here) is a common practice because it improves code reusability and maintainability. However, when components need to share state to determine UI or data processing logic, it's not as straightforward as writing everything in a single component.]]></description>
      <pubDate>Mon, 06 Jan 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Next.js</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[React Parent-Child Communication and Props Usage]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-05_React_Parent_Child_Communication_and_Props_Usage</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-05_React_Parent_Child_Communication_and_Props_Usage</guid>
      <description><![CDATA[For experienced developers, using props might be quite intuitive, but when I was starting out, the concept of props almost burned my brain. Despite reading many tutorials and articles, I couldn't quite grasp it. Ultimately, it all made sense after writing a few related components myself.]]></description>
      <pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Our Little Explorer Update Record(Part 1): Frontend and DB Date Handling]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-04_Our_Little_Explorer_Update_Record</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-04_Our_Little_Explorer_Update_Record</guid>
      <description><![CDATA[Initially, this project used months for frontend and backend inputs and data storage. On the frontend, the baby's age in months was entered, and the DB directly stored this value.]]></description>
      <pubDate>Sat, 04 Jan 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>React</category>
      <category>JavaScript</category>
      <category>Node.js</category>
    </item>
    <item>
      <title><![CDATA[Using IntersectionObserver for Lazyload Applications]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-03_Using_IntersectionObserver_for_Lazyload_Applications</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-03_Using_IntersectionObserver_for_Lazyload_Applications</guid>
      <description><![CDATA[Previously, I worked on a Product Table where lazyloading effects were needed for product images fetched from Redux. I explored a few methods and found that using IntersectionObserver was the simplest and most reliable approach.]]></description>
      <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
      <category>Performance</category>
      <category>React</category>
    </item>
    <item>
      <title><![CDATA[git fetch & git pull Project Errors]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-02_Git_Fetch_Pull_Project_Errors</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-02_Git_Fetch_Pull_Project_Errors</guid>
      <description><![CDATA[There was a time when HK notified about a .env update, and another when the main branch was changed from develop to main. I got issues during git pull both times.]]></description>
      <pubDate>Thu, 02 Jan 2025 00:00:00 GMT</pubDate>
      <category>Git</category>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[Using Postman to Query Github GraphQL API]]></title>
      <link>https://joshhong.vercel.app/en/posts/2025-01-01_Using_Postman_to_Query_Github_GraphQL_API</link>
      <guid>https://joshhong.vercel.app/en/posts/2025-01-01_Using_Postman_to_Query_Github_GraphQL_API</guid>
      <description><![CDATA[Following the previous post about using git commands to calculate commit lines, this article demonstrates how to use Postman and the Github GraphQL API for a more comprehensive query.]]></description>
      <pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate>
      <category>API</category>
      <category>Git</category>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[Git Commit Line Count]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-31_Git_Commit_Line_Count</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-31_Git_Commit_Line_Count</guid>
      <description><![CDATA[At the end of the year, we need to calculate the lines of code contributed by yourself or team members to assess the work done in a project.]]></description>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <category>Git</category>
      <category>DevTools</category>
    </item>
    <item>
      <title><![CDATA[MUI Select and Form Components]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-28_MUI_Select_and_Form_Components</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-28_MUI_Select_and_Form_Components</guid>
      <description><![CDATA[In React and Next.js projects, we have two types of form components: controlled and uncontrolled. Based on my experience, controlled components are more common, but uncontrolled ones also come up occasionally.]]></description>
      <pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[General Project Development Environment Setup]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-26_dev_env_setup_guide</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-26_dev_env_setup_guide</guid>
      <description><![CDATA[No matter if it's a new computer with a new project, a new computer with an old project, or an old computer with a new project, this is a general quick setup process.]]></description>
      <pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate>
      <category>DevTools</category>
      <category>Git</category>
      <category>Deployment</category>
    </item>
    <item>
      <title><![CDATA[Understanding JavaScript Array Methods: flat() and new Set()]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-13_Understanding_JavaScript_Array_Methods</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-13_Understanding_JavaScript_Array_Methods</guid>
      <description><![CDATA[Two practical JavaScript array processing methods, flat() and Set(), may not be encountered very often, but they are extremely useful when dealing with certain nested array data.]]></description>
      <pubDate>Fri, 13 Dec 2024 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Understanding Metadata]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-10_Understanding_Metadata</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-10_Understanding_Metadata</guid>
      <description><![CDATA[In web applications, metadata refers to information about a webpage that helps search engines and social media platforms better understand and display the content of the page. This information includes the page's title, description, keywords, OG (Open Graph), and more.]]></description>
      <pubDate>Tue, 10 Dec 2024 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>Performance</category>
    </item>
    <item>
      <title><![CDATA[VSCode Downgrade and Update Settings Notes]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-05_VSCode_Downgrade_and_Update_Settings_Notes</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-05_VSCode_Downgrade_and_Update_Settings_Notes</guid>
      <description><![CDATA[Since VSCode version 1.91, the commit interface has changed from a list to a graph. After trying it out, I found it less intuitive for my workflow. My development needs often require reviewing a large amount of committed but unpushed code, so I decided to downgrade to version 1.91. Here's the process I followed.]]></description>
      <pubDate>Thu, 05 Dec 2024 00:00:00 GMT</pubDate>
      <category>DevTools</category>
      <category>Git</category>
    </item>
    <item>
      <title><![CDATA[Convert URL Parameters to Object by a one-line JavaScript function]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-12-02_url_params_to_object</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-12-02_url_params_to_object</guid>
      <description><![CDATA[How to convert URL parameters into a JavaScript object using a one-liner function?]]></description>
      <pubDate>Mon, 02 Dec 2024 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Synchronous vs Asynchronous Notes]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-11-28_Synchronous_vs_Asynchronous_Notes</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-11-28_Synchronous_vs_Asynchronous_Notes</guid>
      <description><![CDATA[Synchronous (Sync) and Asynchronous (Async) are often misunderstood in both everyday contexts and programming.]]></description>
      <pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
      <category>Node.js</category>
    </item>
    <item>
      <title><![CDATA[Node.js fs.readdir, readdirSync Explained]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-11-26_Nodejs_fs_readdir_and_readdirSync_Explained</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-11-26_Nodejs_fs_readdir_and_readdirSync_Explained</guid>
      <description><![CDATA[Notes on commonly used fs, readdir(), and readdirSync() in Node.js.]]></description>
      <pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate>
      <category>Node.js</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Node.js Path.join and Process.cwd Explained]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-11-25_Nodejs_Path_join_and_Process_cwd_Explained</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-11-25_Nodejs_Path_join_and_Process_cwd_Explained</guid>
      <description><![CDATA[First Node.js note]]></description>
      <pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate>
      <category>Node.js</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Using DOMPurify]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-11-23_Using_DOMPurify</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-11-23_Using_DOMPurify</guid>
      <description><![CDATA[DOMPurify is a JavaScript library for sanitizing HTML, primarily used to prevent cross-site scripting (XSS) attacks. When rendering HTML from external or untrusted sources in a browser, DOMPurify can remove malicious code and ensure the content is safe.]]></description>
      <pubDate>Sat, 23 Nov 2024 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
      <category>Security</category>
    </item>
    <item>
      <title><![CDATA[Understanding String.replace() Method in JavaScript]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-11-22_Understanding_String_replace_Method_in_JavaScript</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-11-22_Understanding_String_replace_Method_in_JavaScript</guid>
      <description><![CDATA[The String.prototype.replace() method in JavaScript is used to find a substring in a string and replace it with another substring.]]></description>
      <pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Google Sheets API Setup and Troubleshooting Notes]]></title>
      <link>https://joshhong.vercel.app/en/posts/2024-09-13_Google_Sheets_API_Setup_and_Troubleshooting_Notes</link>
      <guid>https://joshhong.vercel.app/en/posts/2024-09-13_Google_Sheets_API_Setup_and_Troubleshooting_Notes</guid>
      <description><![CDATA[To simplify record-keeping for 「Our Little Explorer」, the Dashboard and Message board use Google Sheets as the data source, essentially treating Google Sheets as a database, which suited the initial requirements.]]></description>
      <pubDate>Fri, 13 Sep 2024 00:00:00 GMT</pubDate>
      <category>API</category>
      <category>Node.js</category>
      <category>Database</category>
    </item>
    <item>
      <title><![CDATA[Project Review - Our Little Explorer]]></title>
      <link>https://joshhong.vercel.app/en/posts/2023-05-28_06baby</link>
      <guid>https://joshhong.vercel.app/en/posts/2023-05-28_06baby</guid>
      <description><![CDATA[After the birth of my baby, I went about a month and a half without writing any articles. The severe sleep deprivation and constant busyness during this time prevented me from achieving my initial goal: publishing two articles per week.]]></description>
      <pubDate>Sun, 28 May 2023 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>API</category>
    </item>
    <item>
      <title><![CDATA[React Table Beginner Guide]]></title>
      <link>https://joshhong.vercel.app/en/posts/2023-04-18_reacttable</link>
      <guid>https://joshhong.vercel.app/en/posts/2023-04-18_reacttable</guid>
      <description><![CDATA[I use React Table for table components. There are also other table solutions like MUI and Data-grid there, but React Table seems to be the most popular and it's style-free for user to integrate themes and Tailwind CSS.]]></description>
      <pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[What is API and ..REST API]]></title>
      <link>https://joshhong.vercel.app/en/posts/2023-04-05_restfulapi</link>
      <guid>https://joshhong.vercel.app/en/posts/2023-04-05_restfulapi</guid>
      <description><![CDATA[How to explain API and RESTful API?]]></description>
      <pubDate>Wed, 05 Apr 2023 00:00:00 GMT</pubDate>
      <category>API</category>
      <category>Node.js</category>
    </item>
    <item>
      <title><![CDATA[useState explained]]></title>
      <link>https://joshhong.vercel.app/en/posts/2023-03-31_useState_explained</link>
      <guid>https://joshhong.vercel.app/en/posts/2023-03-31_useState_explained</guid>
      <description><![CDATA[useState is a hook in React that is almost indispensable for every component. When I first started using it, I didn't fully understand its potential, but now I instinctively think of useState whenever I need to manage a state for UI or logic handling.]]></description>
      <pubDate>Fri, 31 Mar 2023 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>JavaScript</category>
    </item>
    <item>
      <title><![CDATA[Tailwind CSS Usage Experience: Boosting Development Speed (Updated on 2025/1/3)]]></title>
      <link>https://joshhong.vercel.app/en/posts/2023-03-30_Tailwind_CSS_Usage_Experience</link>
      <guid>https://joshhong.vercel.app/en/posts/2023-03-30_Tailwind_CSS_Usage_Experience</guid>
      <description><![CDATA[Tailwind CSS is something you can't go back from once you've tried it. Why? The advantage is the ability to write HTML, CSS, and JS all together, making development fast and convenient.]]></description>
      <pubDate>Thu, 30 Mar 2023 00:00:00 GMT</pubDate>
      <category>CSS</category>
      <category>Tailwind</category>
    </item>
    <item>
      <title><![CDATA[My Reasons and Expectations for Writing a Dev Blog]]></title>
      <link>https://joshhong.vercel.app/en/posts/2023-03-29_Reasons_and_Expectations_for_Writing_a_Dev_Blog</link>
      <guid>https://joshhong.vercel.app/en/posts/2023-03-29_Reasons_and_Expectations_for_Writing_a_Dev_Blog</guid>
      <description><![CDATA[The main reason for writing this blog is to assist my learning and document my growth.]]></description>
      <pubDate>Wed, 29 Mar 2023 00:00:00 GMT</pubDate>
      <category>Career</category>
      <category>Blog</category>
    </item>
  </channel>
</rss>