<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Toothbrush&#39;s Blog</title>
        <link>https://www.tianhao.me/en/posts/</link>
        <description>Recent content in Posts on Toothbrush&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <copyright>牙刷刷</copyright>
        <lastBuildDate>Sat, 12 Jul 2025 17:42:38 +0800</lastBuildDate><atom:link href="https://www.tianhao.me/en/posts/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>NT Creative Gallery: One Picture to Explain Core Assets – A Great Assistant for Home Users</title>
        <link>https://www.tianhao.me/en/posts/nt-assets-creative/</link>
        <pubDate>Sat, 12 Jul 2025 17:42:38 +0800</pubDate>
        
        <guid>https://www.tianhao.me/en/posts/nt-assets-creative/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;br&gt;
All images displayed on this page were generated by the &lt;strong&gt;Google Gemini&lt;/strong&gt; AI model, automatically synthesized based on user-provided prompts. They are &lt;strong&gt;not photographs&lt;/strong&gt; nor representations of real events. The content is provided for &lt;strong&gt;visual creative reference only&lt;/strong&gt; and does &lt;strong&gt;not represent real people, locations, products, or events&lt;/strong&gt;, nor does it constitute any form of advice or commitment.&lt;/p&gt;
&lt;p&gt;According to the &lt;a class=&#34;link&#34; href=&#34;https://ai.google/disclaimers/gemini/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Gemini Terms of Use&lt;/a&gt; and its &lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/13881882&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Content Policy&lt;/a&gt;, the copyright of generated images belongs to Google or is produced under its authorization. Users are responsible for ensuring compliance with applicable laws and regulations, and the content &lt;strong&gt;must not be used for any commercial purpose that violates copyright, trademark, or publicity rights&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you have questions or request content removal, please contact us using the method at the bottom of this page.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/2e4f9b81-3cde-4082-a8aa-12f6a5b79277.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;2e4f9b81-3cde-4082-a8aa-12f6a5b79277&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/6f3a9f0c-7b26-4c0f-a79b-2e9f8f5e6fd0.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;6f3a9f0c-7b26-4c0f-a79b-2e9f8f5e6fd0&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/938db72a-2b1c-4a2f-9e5f-45d3e2f6c70f.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;938db72a-2b1c-4a2f-9e5f-45d3e2f6c70f&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/b051a6ee-c3a0-44d8-bb38-52e7d9b08ed9.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;b051a6ee-c3a0-44d8-bb38-52e7d9b08ed9&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/cba2794c-6e0e-4382-973d-75b2d2f2c72a.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;cba2794c-6e0e-4382-973d-75b2d2f2c72a&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/f1707f1a-31a7-49f5-9582-621c024a2fbe.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;f1707f1a-31a7-49f5-9582-621c024a2fbe&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Get in touch (Google Mail): wth88888888&lt;/p&gt;
</description>
        </item>
        <item>
        <title>My Smart Assistant 3.0: Building a Fully Automated &#34;Time Screening Room&#34;</title>
        <link>https://www.tianhao.me/en/posts/rk-camera-capture-merge/</link>
        <pubDate>Sat, 12 Jul 2025 17:10:27 +0800</pubDate>
        
        <guid>https://www.tianhao.me/en/posts/rk-camera-capture-merge/</guid>
        <description>&lt;p&gt;Welcome back to my &amp;ldquo;lazy&amp;rdquo; photography system series. In the previous chapters, we witnessed how an ordinary webcam was endowed with the ability to &amp;ldquo;think,&amp;rdquo; and how I built an elegant and convenient &amp;ldquo;control room&amp;rdquo; for it. However, the story doesn&amp;rsquo;t end there. Our clever photographer has been smartly &amp;ldquo;slacking off&amp;rdquo; every day, accurately capturing a vast number of valuable moments. These photos, like scattered pearls, contain the secrets of time, quietly resting deep within the server&amp;rsquo;s hard drive.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to string these pearls together, letting them shine brilliantly through the flow of light and shadow. Today, I will show you the final chapter of this project, which I personally find the most exciting — building a fully automated &amp;ldquo;Time Screening Room.&amp;rdquo; At the core of this screening room is a powerful and reliable shell script. It is the &amp;ldquo;behind-the-scenes director&amp;rdquo; of my entire system, entrusted with a sacred mission: before each quiet dawn arrives, automatically merging tens of thousands of photos from the previous day into wonderful time-lapse videos.&lt;/p&gt;
&lt;p&gt;Project code: &lt;a class=&#34;link&#34; href=&#34;https://github.com/AndroidOL/camera-capture/tree/main/merge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/AndroidOL/camera-capture/tree/main/merge&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;from-material-pileup-to-visual-poems-the-final-billion-step&#34;&gt;From &amp;ldquo;Material Pileup&amp;rdquo; to &amp;ldquo;Visual Poems&amp;rdquo;: The Final &amp;ldquo;Billion&amp;rdquo; Step
&lt;/h2&gt;&lt;p&gt;Imagine what life would be like without this automated &amp;ldquo;director.&amp;rdquo; It would mean that every day, I’d have to act like a &amp;ldquo;miner&amp;rdquo; in the digital age — manually logging into a remote server to dig through tens of thousands of photos from the previous day, which might amount to dozens of gigabytes; then carefully downloading these &amp;ldquo;raw ores&amp;rdquo; to my local computer; next, launching complex video editing software, painstakingly dragging each photo onto the timeline, setting frame rates, encoders, bitrates&amp;hellip; and finally clicking &amp;ldquo;render&amp;rdquo; after a long wait.&lt;/p&gt;
&lt;p&gt;This entire process is not only a battle of patience and endurance with no creativity but also prone to errors. If one day I forget or get too busy at work and miss it, the &amp;ldquo;visual diary&amp;rdquo; for that day will have an irreplaceable gap. That&amp;rsquo;s not what I want.&lt;/p&gt;
&lt;p&gt;What I need is a fully unattended, extremely stable and reliable, and smart enough automated process. It should be a tireless artist that quietly starts at a fixed time every day, for example, in the dead of night, and like a skilled film editor, carefully arranges the scattered materials of the previous day into a complete film, then elegantly places it on the digital shelf of the &amp;ldquo;family film library,&amp;rdquo; waiting for my review.&lt;/p&gt;
&lt;p&gt;Thus, this labor of love — the automation script &lt;code&gt;daily_photo_to_video.sh&lt;/code&gt; — was born. It’s far from a simple ffmpeg command wrapper; it is an industrial-grade robust &amp;ldquo;smart production line.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;the-directors-extraordinary-skills-revealing-the-core-design-of-the-automation-script&#34;&gt;The Director&amp;rsquo;s Extraordinary Skills: Revealing the Core Design of the Automation Script
&lt;/h2&gt;&lt;p&gt;The design philosophy of this script is &lt;strong&gt;&amp;ldquo;pursue ultimate stability and efficiency.&amp;rdquo;&lt;/strong&gt; I armed it to the teeth so that it can calmly handle all foreseeable and even unforeseeable complex situations.&lt;/p&gt;
&lt;h3 id=&#34;1-ultimate-efficiency-squeezing-every-drop-of-hardware-potential&#34;&gt;1. Ultimate Efficiency: Squeezing Every Drop of Hardware Potential
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Highway — Ramdisk (In-Memory Disk)&lt;/strong&gt;&lt;br&gt;
Reading tens of thousands of scattered small images on a traditional hard drive while writing a huge video file immediately exposes disk I/O bottlenecks, making the whole process painfully slow. My solution is radical: directly carve out a high-speed virtual disk (Ramdisk) in the server’s precious memory.&lt;/p&gt;
&lt;p&gt;When the script starts, it first synchronizes all photos to be processed from the photo server to this memory disk via high-speed network. Then, all intensive read-write operations of video synthesis (encoding) are performed entirely on this virtual disk. Memory read/write speeds are tens or even hundreds of times faster than ordinary hard drives, which is like building a &amp;ldquo;star highway&amp;rdquo; that ignores physical laws and travels at light speed for data migration, greatly shortening processing time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Professional Engine — Hardware Encoding (HEVC_RKMPP)&lt;/strong&gt;&lt;br&gt;
Video encoding is a typical CPU-intensive task. Relying solely on the CPU to &amp;ldquo;hard compute&amp;rdquo; is like asking a versatile but tired butler to do a highly specialized woodworking job — inefficient and causing the server’s &amp;ldquo;heartbeat&amp;rdquo; (CPU usage) to spike and the fans to roar. Fortunately, the server I use (based on Rockchip chips) has a dedicated video processing unit (VPU).&lt;/p&gt;
&lt;p&gt;My script precisely calls ffmpeg and specifies the use of the &lt;code&gt;hevc_rkmpp&lt;/code&gt; hardware encoder. This is equivalent to handing the professional work to a specially hired, highly skilled &amp;ldquo;film editor,&amp;rdquo; letting the VPU handle the heaviest encoding tasks, fully freeing the CPU. Meanwhile, I choose the efficient HEVC (H.265) encoding format, which maintains very high picture quality while compressing the video size to about half of traditional H.264, saving massive precious space in my &amp;ldquo;family film library.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;2-foundation-of-stability-industrial-grade-fault-tolerance-and-self-healing&#34;&gt;2. Foundation of Stability: Industrial-Grade Fault Tolerance and Self-Healing
&lt;/h3&gt;&lt;p&gt;A spaceship sailing alone in the wilderness values not only speed but also its ability to survive cosmic storms. Likewise, a script that needs to run unattended for years requires strong resilience. I built four layers of &amp;ldquo;security protocols&amp;rdquo; to handle various possible accidents.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Scenario&lt;/th&gt;
          &lt;th&gt;Script’s Smart Response Strategy&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Unexpected script interruption&lt;/td&gt;
          &lt;td&gt;Uses &lt;code&gt;trap&lt;/code&gt; cleanup mechanism to automatically clear temp files and unmount Ramdisk on interruption&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Concurrent run conflicts&lt;/td&gt;
          &lt;td&gt;Uses &lt;code&gt;flock&lt;/code&gt; file lock to avoid conflicts from multiple instances running concurrently&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Insufficient storage space&lt;/td&gt;
          &lt;td&gt;Pre-checks available space in target path to avoid write failures midway&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Target disk disconnection&lt;/td&gt;
          &lt;td&gt;Automatically switches to backup storage path, ensures task completion, and pauses old task catch-up&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;3-smart-scheduling-never-miss-a-days-highlights&#34;&gt;3. Smart Scheduling: Never Miss a Day’s Highlights
&lt;/h3&gt;&lt;p&gt;I want every day’s video in my &amp;ldquo;screening room&amp;rdquo; to be complete, like a coherent chronicle. Therefore, the smartest and proudest part of the script is its almost obsessive &amp;ldquo;completion&amp;rdquo; logic.&lt;/p&gt;
&lt;p&gt;When running, the script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reviews logs from the past 7 days, checking for missing or failed videos;&lt;/li&gt;
&lt;li&gt;If omissions are found, it prioritizes filling gaps starting from the earliest day;&lt;/li&gt;
&lt;li&gt;Verifies that remote materials still exist to avoid pointless runs;&lt;/li&gt;
&lt;li&gt;Only after confirming completeness does it process &amp;ldquo;yesterday’s&amp;rdquo; new materials.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This way, the system gains memory and responsibility, always maintaining a complete &amp;ldquo;visual diary.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;the-birth-of-a-family-epic&#34;&gt;The Birth of a &amp;ldquo;Family Epic&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Now, this has become a ritual-filled daily routine. Every morning, when I brew coffee and open the &amp;ldquo;family film library,&amp;rdquo; a brand-new time-lapse video named after yesterday’s date quietly rests there.&lt;/p&gt;
&lt;p&gt;It might capture the entire thunderstorm outside the window, or my figure working late into the night, or simply portray the traces of sunlight flowing through the home.&lt;/p&gt;
&lt;p&gt;This automated script is like a silent but powerful heart, injecting endless vitality into my entire smart photography project. It transforms day-after-day trivial visual data into distilled visual poems full of time’s essence, turning cold data into warm memories, allowing me to truly &amp;ldquo;see&amp;rdquo; and &amp;ldquo;cherish&amp;rdquo; those silently passing moments.&lt;/p&gt;
&lt;h2 id=&#34;the-joy-of-creation&#34;&gt;The Joy of Creation
&lt;/h2&gt;&lt;p&gt;The joy of creation lies here — using code and logic to build a system that automatically creates, organizes, and presents beauty for us.&lt;/p&gt;
&lt;p&gt;Next steps might be training an AI to automatically add the most fitting background music to these videos, or editing &amp;ldquo;weekly highlights.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The journey to a &amp;ldquo;better life&amp;rdquo; through creation is endless, and that is its true charm.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>My Smart Assistant 2.0: Giving the “Lazy” Photography System a Panoramic Window</title>
        <link>https://www.tianhao.me/en/posts/rk-camera-capture-webui/</link>
        <pubDate>Sat, 12 Jul 2025 16:19:04 +0800</pubDate>
        
        <guid>https://www.tianhao.me/en/posts/rk-camera-capture-webui/</guid>
        <description>&lt;p&gt;It&amp;rsquo;s been a while since I last shared my “lazy” photography system—the one that decides when to snap a photo and when to chill. This little helper has been quietly working for me all this time. But as time went on, a new pain point emerged: while its inner workings were smart, the way I interacted with it remained&amp;hellip; primitive.&lt;/p&gt;
&lt;p&gt;Project code: &lt;a class=&#34;link&#34; href=&#34;https://github.com/AndroidOL/camera-capture/tree/main/web-ui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/AndroidOL/camera-capture/tree/main/web-ui&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;from-command-line-archaeology-to-tap-of-a-finger-a-revolution-in-experience&#34;&gt;From “Command Line Archaeology” to “Tap of a Finger”: A Revolution in Experience
&lt;/h2&gt;&lt;p&gt;In the past, every interaction with the system felt like digital archaeology inside a server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Want to see yesterday’s shots? Fire up your SSH client, connect to the server, and navigate through a maze of directories with &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Want to tweak sensitivity settings? Use Vim or Nano to edit config files, save, and &lt;code&gt;systemctl restart&lt;/code&gt;—then cross your fingers you didn’t miss a comma.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was cumbersome and emotionally distant. My smart assistant—its joys, its output—was locked behind the black box of a terminal.&lt;/p&gt;
&lt;p&gt;So I opened a window for it: a wide &lt;strong&gt;panoramic floor-to-ceiling window&lt;/strong&gt; in the form of a &lt;strong&gt;web control console&lt;/strong&gt;, designed for intuitive, elegant interaction—even from the comfort of a couch.&lt;/p&gt;
&lt;p&gt;Now, everything has changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open a browser and enter the local address;&lt;/li&gt;
&lt;li&gt;A beautiful and powerful interface appears;&lt;/li&gt;
&lt;li&gt;The once-silent background photographer now has a vivid “face” and nimble “hands.”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;its-components&#34;&gt;Its components:
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eyes&lt;/strong&gt;: A real-time monitor with zero delay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hands&lt;/strong&gt;: Clickable button menus for full control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brain&lt;/strong&gt;: Complex logic wrapped in an intuitive design.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;four-superpowers-of-the-web-console&#34;&gt;Four Superpowers of the Web Console
&lt;/h2&gt;&lt;h3 id=&#34;1-time-drawer-a-tiered-photo-archive&#34;&gt;1. Time Drawer: A Tiered Photo Archive
&lt;/h3&gt;&lt;p&gt;Inspired by real-life “drawers,” navigating photos now feels like opening a set of Russian nesting dolls:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Year/Month&lt;/strong&gt; view: See all months with recordings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daily preview&lt;/strong&gt;: Thumbnail grid for each date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hourly drawers&lt;/strong&gt;: Tap to reveal 24-hour distributions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minute-level access&lt;/strong&gt;: Dig down to individual images.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Browsing becomes light, fun, and ceremonial.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-real-time-window-a-watchful-never-blinking-guardian&#34;&gt;2. Real-Time Window: A Watchful, Never-Blinking Guardian
&lt;/h3&gt;&lt;p&gt;Tap “Live Monitor,” and the system enters watch mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Heartbeat refresh&lt;/strong&gt;: The frontend fetches a new frame every 2.5 seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-reconnect&lt;/strong&gt;: Camera outages are self-healed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Night mode&lt;/strong&gt;: Auto-dimming for dark environments—no eye strain.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;3-time-tunnel-your-personal-documentary-generator&#34;&gt;3. Time Tunnel: Your Personal Documentary Generator
&lt;/h3&gt;&lt;p&gt;The “Slideshow” mode is my favorite feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select any date range (e.g., “2025 Cherry Blossom Season”);&lt;/li&gt;
&lt;li&gt;The system stitches together all relevant photos into a dynamic time-lapse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slide mode&lt;/strong&gt;: Chronologically ordered playback.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smooth transitions&lt;/strong&gt;: Fade-in/out between shots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timestamp overlay&lt;/strong&gt;: Auto-displayed capture time at the bottom.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;🎞️ I used this to relive the cherry blossom bloom—from bud to fall—utterly moving and magical.&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-thoughtful-themes-a-smart-and-caring-interface&#34;&gt;4. Thoughtful Themes: A Smart and Caring Interface
&lt;/h3&gt;&lt;p&gt;As a night owl, I added a theme toggle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Day mode&lt;/strong&gt;: Blue-white for clarity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Night mode&lt;/strong&gt;: Deep black and crimson for eye comfort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-memory&lt;/strong&gt;: Remembers your last-used theme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like a friend who just gets you.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;dev-diary-humanizing-the-system-one-mishap-at-a-time&#34;&gt;Dev Diary: Humanizing the System, One Mishap at a Time
&lt;/h2&gt;&lt;h3 id=&#34;the-midnight-panic&#34;&gt;The Midnight Panic
&lt;/h3&gt;&lt;p&gt;One night while debugging live view, the screen started flashing like crazy!&lt;br&gt;
Turned out I mistakenly set &lt;code&gt;250ms&lt;/code&gt; instead of &lt;code&gt;2500ms&lt;/code&gt;—the camera nearly became a strobe light.&lt;/p&gt;
&lt;h3 id=&#34;the-naming-crisis&#34;&gt;The Naming Crisis
&lt;/h3&gt;&lt;p&gt;Initially, I named my API &lt;code&gt;get_image_list&lt;/code&gt;.&lt;br&gt;
A few weeks later, even I had no clue what it did.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;a-new-lens-on-life-when-tech-becomes-daily-ritual&#34;&gt;A New Lens on Life: When Tech Becomes Daily Ritual
&lt;/h2&gt;&lt;p&gt;The web console made this system part of my life:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☕ &lt;strong&gt;Morning coffee ritual&lt;/strong&gt;: Wake up with the latest time-lapse visuals.&lt;/li&gt;
&lt;li&gt;🌱 &lt;strong&gt;Plant growth journal&lt;/strong&gt;: Weekly recaps via the “Time Tunnel.”&lt;/li&gt;
&lt;li&gt;🖼️ &lt;strong&gt;Family time machine&lt;/strong&gt;: Cast time-lapse memories during gatherings.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;an-invitation-to-makers&#34;&gt;An Invitation to Makers
&lt;/h2&gt;&lt;p&gt;Building this isn’t hard:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ----- Essentials -----&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Hardware: Raspberry Pi / any Linux device + webcam&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Image processing: Python + OpenCV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Frontend: HTML + JavaScript + CSS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Backend: PHP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Each module is like a LEGO block—ready to be customized, expanded, or swapped.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;The warmth of technology lies in how we use it to illuminate and document life. I hope you too can open your own “window of time” and watch your story unfold.&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>My Smart Assistant: A Time-Lapse System That Knows When to Be Lazy</title>
        <link>https://www.tianhao.me/en/posts/rk-camera-capture/</link>
        <pubDate>Sat, 12 Jul 2025 15:38:51 +0800</pubDate>
        
        <guid>https://www.tianhao.me/en/posts/rk-camera-capture/</guid>
        <description>&lt;p&gt;There’s a quiet poetry flowing through everyday life, often unnoticed. I became fascinated with time-lapse photography because it compresses long stretches of time into captivating moments, letting us witness slow transformations with the naked eye—it’s like magic unfolding through time.&lt;/p&gt;
&lt;p&gt;So I dusted off an old USB webcam that had been asleep in a drawer for years, sparked by a gentle thought: I want to record life’s subtle breath—the kind we often overlook in our hurried pace. Like the succulent on the balcony slowly stretching toward sunlight; the drifting clouds outside, sculpted into shapes by an invisible hand; or how the evening sun casts long, warm shadows across the living room floor inch by inch…&lt;/p&gt;
&lt;p&gt;Project Code: &lt;a class=&#34;link&#34; href=&#34;https://github.com/AndroidOL/camera-capture&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/AndroidOL/camera-capture&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;from-diligent-fool-to-smart-slacker-a-shift-in-philosophy&#34;&gt;From &amp;ldquo;Diligent Fool&amp;rdquo; to &amp;ldquo;Smart Slacker&amp;rdquo;: A Shift in Philosophy
&lt;/h2&gt;&lt;p&gt;At first, my approach was simple and direct, like many others: write a script to turn the webcam into a tireless “model worker,” snapping a photo every minute on the dot. The moment I finished and successfully ran the code, I felt a wave of achievement. But that joy quickly turned into mixed disappointment the next morning.&lt;/p&gt;
&lt;p&gt;There they were—1,440 neatly organized photos, a testament to my program’s “diligence.” Yet scrolling through them felt lifeless and frozen. Especially during the long hours of the night—say, between 3:00 and 3:01 AM—everything looked identical: the dust on the coffee table hadn’t budged, and even the air seemed still. I realized I hadn’t built a tool for recording “change,” but a factory for producing repetition.&lt;/p&gt;
&lt;p&gt;Once I calmly calculated this “digital legacy,” the scale of the problem became clear:&lt;/p&gt;
&lt;h3 id=&#34;alarming-storage-consumption&#34;&gt;Alarming Storage Consumption
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Daily output&lt;/strong&gt;: 43,200 photos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly output&lt;/strong&gt;: ~1,296,000 photos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annual output&lt;/strong&gt;: Over 473 million photos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assuming 0.2MB per 1920×1080 photo, that’s nearly 8GB per day—reasonable for a desktop setup, but excessive for embedded devices like the ESP32 or RK boards.&lt;/p&gt;
&lt;h3 id=&#34;destructive-post-production-workload&#34;&gt;Destructive Post-Production Workload
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Footage screening&lt;/strong&gt;: To produce a few minutes of highlights, you’d have to sift through hundreds of thousands of nearly identical “waste shots.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time cost&lt;/strong&gt;: This isn’t artistic creation—it’s soul-draining manual labor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To better illustrate the contrast, I created this table:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;“Diligent Fool” Mode&lt;/th&gt;
          &lt;th&gt;“Smart Slacker” Mode&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Operating Principle&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Uniform, scheduled capturing&lt;/td&gt;
          &lt;td&gt;Intelligent, on-demand capture&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Photos per hour&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Constant 1,800&lt;/td&gt;
          &lt;td&gt;Dozens to hundreds (based on changes)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Storage efficiency&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Very low, linear explosion&lt;/td&gt;
          &lt;td&gt;Very high, only saves useful data&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Post-workload&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Huge, painful screening&lt;/td&gt;
          &lt;td&gt;Minimal, most shots are valuable&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Final output quality&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Filled with static “waste time”&lt;/td&gt;
          &lt;td&gt;Tight pacing, focused on change&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Clearly, the latter is what I needed—a wise system that knows &lt;strong&gt;when to act and when to chill&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;giving-the-camera-a-brain-laziness-as-productivity&#34;&gt;Giving the Camera a Brain: Laziness as Productivity
&lt;/h2&gt;&lt;p&gt;So I set out to upgrade my system with real intelligence. This time, I didn’t teach it to work harder—I taught it a more elegant skill: how to slack off smartly.&lt;/p&gt;
&lt;p&gt;Its core principle is like a seasoned intelligence officer who only reports when something actually matters—no boring “all clear” updates, just action when there&amp;rsquo;s movement.&lt;/p&gt;
&lt;p&gt;To empower this discernment, I designed a three-step “smart pipeline”:&lt;/p&gt;
&lt;h3 id=&#34;visual-purification-seeing-the-essence-not-the-surface&#34;&gt;Visual Purification: Seeing the Essence, Not the Surface
&lt;/h3&gt;&lt;p&gt;Morning cool light and evening warm light may color the scene differently, even if nothing has moved. So before comparison, the system converts both current and archived frames to grayscale “sketch mode.”&lt;/p&gt;
&lt;h3 id=&#34;quantifying-change-giving-weight-to-differences&#34;&gt;Quantifying Change: Giving Weight to Differences
&lt;/h3&gt;&lt;p&gt;The system overlays two grayscale images pixel by pixel, generating a “change map.” It calculates the percentage of light areas to assess the degree of difference.&lt;/p&gt;
&lt;h3 id=&#34;the-art-of-decision-making-a-smart-laziness-threshold&#34;&gt;The Art of Decision-Making: A Smart Laziness Threshold
&lt;/h3&gt;&lt;p&gt;I set a threshold—say 0.5%. If the detected change is below this, the frame is skipped. Only significant changes are recorded, saving resources and capturing only the meaningful.&lt;/p&gt;
&lt;h2 id=&#34;a-thoughtful-housekeeper-a-system-that-runs-itself&#34;&gt;A Thoughtful Housekeeper: A System That Runs Itself
&lt;/h2&gt;&lt;p&gt;To ensure 24/7 stability, I implemented multiple layers of resilience:&lt;/p&gt;
&lt;h3 id=&#34;a-custom-biological-clock&#34;&gt;A Custom “Biological Clock”
&lt;/h3&gt;&lt;p&gt;Sampling frequencies tuned to household rhythms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Morning glow (6–8 AM)&lt;/strong&gt;: every 5 seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daytime activity (8 AM–6 PM)&lt;/strong&gt;: every 2 seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evening mood (6–10 PM)&lt;/strong&gt;: every 5 seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Midnight patrol (10 PM–6 AM)&lt;/strong&gt;: every 10 seconds&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;strategic-storage-management&#34;&gt;Strategic Storage Management
&lt;/h3&gt;&lt;p&gt;When storage usage hits 85%, the system auto-deletes the oldest photos to maintain space.&lt;/p&gt;
&lt;h3 id=&#34;survival-instincts&#34;&gt;Survival Instincts
&lt;/h3&gt;&lt;p&gt;In case of power loss or camera disconnects, the system includes auto-reconnect and retry logic to self-heal and stay online.&lt;/p&gt;
&lt;h2 id=&#34;unexpected-rewards-becoming-a-quiet-observer-of-life&#34;&gt;Unexpected Rewards: Becoming a Quiet Observer of Life
&lt;/h2&gt;&lt;p&gt;The results far exceeded my expectations. It allowed me to observe:&lt;/p&gt;
&lt;h3 id=&#34;a-miniature-home-sundial&#34;&gt;A Miniature Home Sundial
&lt;/h3&gt;&lt;p&gt;By tracking sunlight shifts on the floor, it became a massive clock of shadow and light.&lt;/p&gt;
&lt;h3 id=&#34;the-silent-dance-of-plants&#34;&gt;The Silent Dance of Plants
&lt;/h3&gt;&lt;p&gt;In time-lapse, my succulent turned toward the sun like it was engaging in a dialogue with life.&lt;/p&gt;
&lt;h3 id=&#34;the-moving-landscape-outside&#34;&gt;The Moving Landscape Outside
&lt;/h3&gt;&lt;p&gt;It captured drifting clouds, droplets melting from the roof after snow, everything like a living poem.&lt;/p&gt;
&lt;h2 id=&#34;the-joy-of-creation-lies-in-the-process&#34;&gt;The Joy of Creation Lies in the Process
&lt;/h2&gt;&lt;p&gt;From the initial spark to a mature system, this 0-to-1 journey gave me indescribable satisfaction.&lt;/p&gt;
&lt;p&gt;The beauty of technology isn’t in complexity, but in how we use it to understand and embrace life.&lt;/p&gt;
&lt;p&gt;If you also feel passion for creation, start with a tiny idea. The real barrier is never the tools—it’s whether you&amp;rsquo;re willing to tinker, to explore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Begin your journey now. Go capture your own, one-of-a-kind story in time.&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Next-Terminal: A Secure Access Solution for Home Networks</title>
        <link>https://www.tianhao.me/en/posts/nt-web-assets/</link>
        <pubDate>Fri, 11 Jul 2025 19:43:25 +0800</pubDate>
        
        <guid>https://www.tianhao.me/en/posts/nt-web-assets/</guid>
        <description>&lt;h1 id=&#34;a-new-secure-access-approach-for-home-networks-next-terminal-in-practice&#34;&gt;A New Secure Access Approach for Home Networks: Next-Terminal in Practice
&lt;/h1&gt;&lt;p&gt;With the rapid spread of information technology, more and more home users are building their own servers, mini NAS systems, and home automation centers. At the same time, how to &lt;strong&gt;securely, efficiently, and cost-effectively&lt;/strong&gt; access these devices from the public internet has become an urgent issue to solve.&lt;/p&gt;
&lt;p&gt;The open-source project &lt;a class=&#34;link&#34; href=&#34;https://github.com/dushixiang/next-terminal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Next-Terminal&lt;/a&gt; (abbreviated as NT) offers an elegant solution for home users. It’s not only open-source and free, but also extremely lightweight (only around 200MB) and highly performant. It can be easily deployed on public nodes such as Alibaba Cloud, Tencent Cloud, or other lightweight cloud instances, serving as the single entry point for all traffic. NT securely forwards requests to various services in the home network, achieving &lt;strong&gt;unified management of secure proxy and access control&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-security-risks-of-exposing-home-networks-to-the-internet&#34;&gt;1. Security Risks of Exposing Home Networks to the Internet
&lt;/h2&gt;&lt;h3 id=&#34;11-common-ways-of-home-network-exposure&#34;&gt;1.1 Common Ways of Home Network Exposure
&lt;/h3&gt;&lt;p&gt;Suppose you’ve set up a website or NAS device at home and want to access it remotely. Common approaches include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Port forwarding on the home router&lt;/strong&gt; (using a public IP);&lt;/li&gt;
&lt;li&gt;Domain name resolution to a dynamic home IP (Dynamic DNS);&lt;/li&gt;
&lt;li&gt;Direct connection using IPv6 address.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;12-potential-security-risks-from-public-exposure&#34;&gt;1.2 Potential Security Risks from Public Exposure
&lt;/h3&gt;&lt;p&gt;Regardless of whether you use DDNS or IPv6, exposing your device to the public internet means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A significantly increased chance of being scanned by attackers;&lt;/li&gt;
&lt;li&gt;Anyone who knows your IP can try to connect;&lt;/li&gt;
&lt;li&gt;If there are any vulnerabilities (e.g., outdated NAS, PHP flaws), attackers might compromise your internal network.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In IPv4, NAT allows many internal devices to access the internet using one public IP. However, with IPv6, &lt;strong&gt;each device can have its own public IP&lt;/strong&gt;, which facilitates direct communication but introduces new threats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Predictable addresses — attackers can guess address ranges based on a known /60 prefix;&lt;/li&gt;
&lt;li&gt;Every device at home (router, NAS, cameras, smart TVs) has its own IPv6 address;&lt;/li&gt;
&lt;li&gt;Knowing one server address could allow inference of the entire network prefix;&lt;/li&gt;
&lt;li&gt;Despite the vast IPv6 space, &lt;strong&gt;targeted scans and brute force attacks are still feasible&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Many home devices lack strict IPv6 firewall configurations, meaning open ports might be directly accessible.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Alert&lt;/strong&gt;: The global reachability of IPv6 makes home devices more vulnerable to targeting and attacks.&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-how-does-next-terminal-help-solve-these-problems&#34;&gt;2. How Does Next-Terminal Help Solve These Problems?
&lt;/h2&gt;&lt;p&gt;Next-Terminal uses a &amp;ldquo;unified entry proxy + fine-grained access control&amp;rdquo; approach with key features such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No exposure of internal ports to the public internet&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ports open only to trusted entry points&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supports fine-grained access control and login authentication&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auditable, manageable, and authorizable access to your services&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graph LR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    A[User] --&amp;gt; B[NT Public Node]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    B --&amp;gt; C[Home Gateway]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    C --&amp;gt; D[Internal Services]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;scenario-securely-exposing-a-home-website-to-the-internet&#34;&gt;Scenario: Securely Exposing a Home Website to the Internet
&lt;/h3&gt;&lt;p&gt;Suppose you have a website at &lt;code&gt;http://192.168.1.100:8080&lt;/code&gt; on your home network and want to access it from outside — but don’t want anyone to be able to connect directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traditional method&lt;/strong&gt;: Port forwarding — risky&lt;br&gt;
&lt;strong&gt;Improved method&lt;/strong&gt;: Use NT for &lt;strong&gt;reverse proxy + authentication&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;steps-with-public-ip&#34;&gt;Steps (With Public IP):
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Deploy Next-Terminal on a public server (e.g., Alibaba Cloud);&lt;/li&gt;
&lt;li&gt;Configure your home firewall to &lt;strong&gt;only allow the public server’s IP to access relevant ports&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Add internal assets (like your home website) and configure port mapping;&lt;/li&gt;
&lt;li&gt;Enable authentication and authorization (multi-factor authentication, passkeys, etc.);&lt;/li&gt;
&lt;li&gt;External users access via NT’s web interface — requests are proxied to your internal service after verification.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;steps-without-public-ip&#34;&gt;Steps (Without Public IP):
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Deploy Next-Terminal on a public server;&lt;/li&gt;
&lt;li&gt;Deploy NT secure gateway in your home (e.g., container or mini host);&lt;/li&gt;
&lt;li&gt;Register the NT gateway with the NT platform;&lt;/li&gt;
&lt;li&gt;Add internal assets to be accessed;&lt;/li&gt;
&lt;li&gt;Enable authentication and authorization;&lt;/li&gt;
&lt;li&gt;External users access through NT — the public server proxies requests to the NT gateway, which forwards to internal services.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/f47ac10b-58cc-4372-a567-0e02b2c3d479.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;NT Architecture&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-firewall-strategy-trust-only-the-public-server-reject-everything-else&#34;&gt;3. Firewall Strategy: Trust Only the Public Server, Reject Everything Else
&lt;/h2&gt;&lt;p&gt;To further enhance security, configure firewall rules on your home router or soft router:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Only allow the NT public server’s IP&lt;/strong&gt; (e.g., Alibaba Cloud) to access specific ports (like NAS port 8080);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block all other IPs from accessing these ports&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This ensures &amp;ldquo;&lt;strong&gt;only trusted servers can access your home network&lt;/strong&gt;&amp;rdquo;, preventing connections even if your public IP is known.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Example firewall rule (assuming home gateway uses iptables)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Allow access from Alibaba Cloud IP to port 8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -A INPUT -p tcp -s &amp;lt;NT_Public_IP&amp;gt; --dport &lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Drop access from all other IPs to port 8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -A INPUT -p tcp --dport &lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt; -j DROP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://www.tianhao.me/550e8400-e29b-41d4-a716-446655440000.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Firewall Configuration&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-comparison-with-traditional-vpn-and-frp-solutions&#34;&gt;4. Comparison with Traditional VPN and FRP Solutions
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;VPN&lt;/th&gt;
          &lt;th&gt;FRP&lt;/th&gt;
          &lt;th&gt;NextTerminal ✅&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Security&lt;/td&gt;
          &lt;td&gt;High (requires hardware)&lt;/td&gt;
          &lt;td&gt;Medium (requires setup)&lt;/td&gt;
          &lt;td&gt;High (granular control)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Usability&lt;/td&gt;
          &lt;td&gt;Requires client&lt;/td&gt;
          &lt;td&gt;Complex config&lt;/td&gt;
          &lt;td&gt;Web-based access&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Deployment Difficulty&lt;/td&gt;
          &lt;td&gt;Easy (hardware)&lt;/td&gt;
          &lt;td&gt;Moderate&lt;/td&gt;
          &lt;td&gt;Easy (container deployment)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;User Access Control&lt;/td&gt;
          &lt;td&gt;✅ Supported&lt;/td&gt;
          &lt;td&gt;❌ Not supported&lt;/td&gt;
          &lt;td&gt;✅ Supported&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Logging &amp;amp; Audit&lt;/td&gt;
          &lt;td&gt;Hard to query&lt;/td&gt;
          &lt;td&gt;❌ Not supported&lt;/td&gt;
          &lt;td&gt;✅ Supported&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Internal Service Proxy&lt;/td&gt;
          &lt;td&gt;✅ Auto config&lt;/td&gt;
          &lt;td&gt;Manual port mapping&lt;/td&gt;
          &lt;td&gt;✅ Auto proxy&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-extended-use-cases-more-than-just-website-access&#34;&gt;5. Extended Use Cases: More Than Just Website Access
&lt;/h2&gt;&lt;p&gt;NextTerminal can proxy not only websites, but also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remote SSH access to home Linux machines;&lt;/li&gt;
&lt;li&gt;RDP access to Windows desktops;&lt;/li&gt;
&lt;li&gt;NAS directory browsing (e.g., via WebDAV);&lt;/li&gt;
&lt;li&gt;Access to camera admin panels;&lt;/li&gt;
&lt;li&gt;Connect to HomeAssistant, Aria2, Transmission, and other home services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All with a unified entry point and unified identity authentication.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;a-note-to-developers-dont-let-open-source-go-unnoticed&#34;&gt;A Note to Developers: Don’t Let Open Source Go Unnoticed
&lt;/h2&gt;&lt;p&gt;Next-Terminal is a free, open-source secure ops platform developed by a Chinese developer and maintained actively on GitHub. Whether you&amp;rsquo;re a developer, ops engineer, or home user, it&amp;rsquo;s strongly recommended to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try deploying and using the platform yourself;&lt;/li&gt;
&lt;li&gt;Give the project a ⭐️ Star;&lt;/li&gt;
&lt;li&gt;Share it in your blog or community;&lt;/li&gt;
&lt;li&gt;Suggest features or contribute docs to help improve it!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-references-and-recommended-links&#34;&gt;📘 References and Recommended Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/dushixiang/next-terminal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/dushixiang/next-terminal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docs: &lt;a class=&#34;link&#34; href=&#34;https://next-terminal.dushixiang.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://next-terminal.dushixiang.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IPv6 Security (Google Research Paper): &lt;a class=&#34;link&#34; href=&#34;https://research.google/pubs/pub46246/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://research.google/pubs/pub46246/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Home Security Setup Guide (Zhihu): &lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/620203743&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://zhuanlan.zhihu.com/p/620203743&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Next-Terminal is not just a great enterprise remote ops platform — it’s also &lt;strong&gt;perfect for home users&lt;/strong&gt;. By building a unified and secure access point, you no longer have to worry about public internet attacks, deal with complex VPN setups, or risk exposing your internal network.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The security of home IT infrastructure is something every tech enthusiast should care about. Start today by deploying Next-Terminal and level up your network security.&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>Getting Started with Hugo Website Setup</title>
        <link>https://www.tianhao.me/en/posts/hello/</link>
        <pubDate>Fri, 11 Jul 2025 15:25:51 +0800</pubDate>
        
        <guid>https://www.tianhao.me/en/posts/hello/</guid>
        <description>&lt;p&gt;This article provides a detailed guide on how to build a Hugo static website from scratch on macOS without relying on Homebrew. It includes key operations such as adding a Git-based theme, modifying configurations, and creating content, helping you quickly set up your own high-performance blog.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-preparation-install-hugo-and-git&#34;&gt;1. Preparation: Install Hugo and Git
&lt;/h2&gt;&lt;h3 id=&#34;11-manually-download-and-install-hugo&#34;&gt;1.1 Manually Download and Install Hugo
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open the &lt;a class=&#34;link&#34; href=&#34;https://github.com/gohugoio/hugo/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo official Releases page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download the Extended version for macOS, such as:&lt;br&gt;
&lt;code&gt;hugo_extended_0.148.0_darwin-universal.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following commands in the terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~/Downloads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -zxvf hugo_extended_0.148.0_darwin-universal.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mv hugo /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x /usr/local/bin/hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-mysql&#34; data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Verify&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;installation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;```&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bash&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hugo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;```&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Make&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sure&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;includes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;word&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;extended&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;### 1.2 Install and Verify Git
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;macOS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;comes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Git&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;preinstalled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;If&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;not&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;follow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;the&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Xcode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Command&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Line&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;```&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bash&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ensure the Git version is displayed correctly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-create-a-hugo-project&#34;&gt;2. Create a Hugo Project
&lt;/h2&gt;&lt;h3 id=&#34;21-create-a-new-site&#34;&gt;2.1 Create a New Site
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hugo new site www-blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;www-blog&lt;/code&gt; is the name of the new folder. You can name it anything — it does not affect your blog&amp;rsquo;s title or content, only the root directory name.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;22-enter-the-project-directory&#34;&gt;2.2 Enter the Project Directory
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; www-blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-add-a-theme&#34;&gt;3. Add a Theme
&lt;/h2&gt;&lt;h3 id=&#34;31-add-an-official-theme-via-git-example-ananke&#34;&gt;3.1 Add an Official Theme via Git (Example: Ananke)
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: If you encounter network or proxy issues, manually download the ZIP file and extract it into the &lt;code&gt;themes/ananke&lt;/code&gt; folder.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;32-modify-config-file-to-enable-the-theme&#34;&gt;3.2 Modify Config File to Enable the Theme
&lt;/h3&gt;&lt;p&gt;Edit &lt;code&gt;hugo.toml&lt;/code&gt; in the project root directory and add or modify the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;baseURL&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://example.org/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;languageCode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;zh-CN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;My Hugo Blog&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;theme&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ananke&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-create-content&#34;&gt;4. Create Content
&lt;/h2&gt;&lt;h3 id=&#34;41-create-a-new-markdown-post&#34;&gt;4.1 Create a New Markdown Post
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hugo new posts/hello.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;42-edit-the-post-content&#34;&gt;4.2 Edit the Post Content
&lt;/h3&gt;&lt;p&gt;Open &lt;code&gt;content/posts/hello.md&lt;/code&gt;, change &lt;code&gt;draft: true&lt;/code&gt; to &lt;code&gt;draft: false&lt;/code&gt;. Example content:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello Hugo&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;ld&#34;&gt;2025-07-11T14:00:00&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;+08&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;draft&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;This is my first blog post created with Hugo.  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Welcome to read and share!&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-preview-the-website-locally&#34;&gt;5. Preview the Website Locally
&lt;/h2&gt;&lt;p&gt;Start the local Hugo server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then open your browser and visit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://localhost:1313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You’ll see the homepage rendered with your theme and content.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-generate-static-site-files&#34;&gt;6. Generate Static Site Files
&lt;/h2&gt;&lt;p&gt;After stopping the server, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The static files will be generated in the &lt;code&gt;public/&lt;/code&gt; folder under the project root.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-deploy-to-github-pages&#34;&gt;7. Deploy to GitHub Pages
&lt;/h2&gt;&lt;h3 id=&#34;71-create-a-new-github-repository-eg-www-blog&#34;&gt;7.1 Create a New GitHub Repository (e.g., &lt;code&gt;www-blog&lt;/code&gt;)
&lt;/h3&gt;&lt;h3 id=&#34;72-push-the-public-folder-content-to-gh-pages-branch&#34;&gt;7.2 Push the &lt;code&gt;public&lt;/code&gt; Folder Content to &lt;code&gt;gh-pages&lt;/code&gt; Branch
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; public
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add origin https://github.com/your-username/www-blog.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b gh-pages
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;Initial Hugo site deployment&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git push -f origin gh-pages
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;73-enable-github-pages-in-repository-settings&#34;&gt;7.3 Enable GitHub Pages in Repository Settings
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Pages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;gh-pages&lt;/code&gt; branch as the publishing source&lt;/li&gt;
&lt;li&gt;After saving, wait a few minutes and visit:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://your-username.github.io/www-blog/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;8-summary-notes&#34;&gt;8. Summary Notes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The folder name in &lt;code&gt;hugo new site &amp;lt;folder-name&amp;gt;&lt;/code&gt; is only the project directory name&lt;/strong&gt;, it does not affect the blog title or URL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blog title and site configuration are set in &lt;code&gt;hugo.toml&lt;/code&gt;&lt;/strong&gt;, and can be changed anytime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Themes are added via Git submodules&lt;/strong&gt;, but you can also download and extract the theme manually.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make sure to set &lt;code&gt;draft: false&lt;/code&gt; when writing posts&lt;/strong&gt;, or they won’t be published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;hugo server -D&lt;/code&gt; for local preview, and &lt;code&gt;hugo&lt;/code&gt; command to generate static site files.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
