Even a Code-Illiterate Built It! Home Server Journey (8) — Zero Visitors — Fixing Search Visibility with Custom Domain and Cloudflare Tunnel

홈서버에서 .ts.net을 prsm-studio.com 커스텀 도메인으로 변경하는 과정

In Part 6, I set up WordPress. In Part 7, I completed automation with n8n. Blog — done. Automation — done. I was writing posts consistently. But here’s the thing.

I had virtually zero visitors.

To be precise, 5 total visitors over 2 weeks. 3 of them were bots (crawlers), and only 2 were real people — and they didn’t even come from search. They clicked a link from somewhere. Search my blog on Google? Nothing. Naver? Nothing. Only Daum showed results, but if you’re invisible on Google and Naver, you basically don’t exist.

The cause was embarrassingly simple.

Tailscale Funnel’s Fatal Flaw: Google Ignores .ts.net Subdomains

.ts.net subdomain not indexed by search engines
Not a single Google search result for the .ts.net address

Remember setting up Tailscale Funnel in Part 2? It was magical — free public access to my server. The address was blog.dace-sidemirror.ts.net. It worked, SSL was automatic, everything was perfect.

But this address had a critical problem.

.ts.net is a subdomain owned by Tailscale. From Google’s perspective, this is just “a page on someone else’s platform.” It’s one of thousands of subdomains under Tailscale’s root domain. Google doesn’t prioritize indexing such subdomains because crawling thousands of subdomains under a single root domain would be a waste of resources. Tailscale’s own documentation states that Funnel is intended for “development and testing.”

site:ts.net  →  Google results: 0
site:blog.dace-sidemirror.ts.net  →  0

16 posts over 2 weeks, not a single one indexed by Google. No matter how good your content is, if search engines ignore your address, it’s meaningless.

Tailscale Funnel is excellent for development — internal testing, quick demos, webhook testing. But for a public-facing blog, it simply doesn’t work. A blog that doesn’t show up in search is not a blog.

Why a Home Server Blog Needs a Custom Domain

Custom domains aren’t just about SEO:

  • Brandingprsm-studio.com is memorable; blog.dace-sidemirror.ts.net is not
  • Credibility — A custom domain signals “this person is serious about their site”
  • Portability — Switch servers, switch hosts — your domain stays the same
  • Email — You can later create custom emails like [email protected]

The Solution: Custom Domain + Cloudflare Tunnel

I needed two things:

  1. My own domain — .com, .dev, whatever — an address I own
  2. A way to connect it to my server — without router port forwarding

Cloudflare solves both. Domain purchase on Cloudflare, tunnel on Cloudflare. And both are free (except the domain registration fee).

Tailscale Funnel Cloudflare Tunnel
Domain .ts.net (fixed) Custom domain
SEO ❌ Not indexed ✅ Normal indexing
SSL Auto Auto
Speed Normal Cloudflare CDN caching
Setup Very easy Easy (10 min)
Cost Free Free (domain ~$10-15/year)
Port forwarding Not needed Not needed

I kept Tailscale Funnel for internal services. Only the public blog moved to Cloudflare Tunnel. Both tunnels run simultaneously on the same server with no issues.

Step 1: Buy Domain on Cloudflare (5 min, $10.44)

Choosing the domain name took the longest. I wanted something related to a personal project, but all the good ones were taken. After searching around, prsm-studio.com felt right.

I purchased it directly on the Cloudflare dashboard. $10.44/year — less than a dollar per month. This is at-cost pricing (ICANN registration fee), cheaper than anywhere else. GoDaddy and Namecheap look cheap the first year but renewal prices jump 2-3x. Cloudflare charges at-cost, renewals included. They’ve publicly committed to never marking up domain prices.

Domain tip: .com is the safest choice. .dev and .io look cool but cost 2-3x more annually, and some users don’t trust non-.com addresses.

Step 2: Install Cloudflare Tunnel (10 min)

Secure tunnel between home server and Cloudflare
Cloudflare Tunnel: secure connection between server and Cloudflare

Cloudflare Tunnel creates a secure connection between my server and Cloudflare. No port forwarding needed. Similar to Tailscale Funnel, but the key difference: you use your own domain.

What I did: clicked ‘Create Tunnel’ on Cloudflare dashboard and passed the token to Claude Code. That’s it. Claude Code handled everything else.

# Command executed by Claude Code
sudo cloudflared service install [token from Cloudflare]

One command registers cloudflared as a system service that auto-connects on reboot. Claude Code also guided me through the tunnel routing setup:

  • Public hostname: prsm-studio.com
  • Service: http://localhost:8080 (WordPress port)

Now prsm-studio.com → Cloudflare Tunnel → my server’s WordPress. Auto SSL, auto CDN caching, and Cloudflare WAF for security — safer than raw port forwarding.

Step 3: WordPress URL Migration — I Just Watched

AI automatically replacing 636 WordPress URLs
AI replaced 636 URLs while the human just watched

Changing domains means updating every URL inside WordPress — image paths in posts, internal links, SEO metadata, RSS feed URLs. There’s way more than you’d expect.

What needed changing:

  • wp-config.php‘s WP_HOME and WP_SITEURL — core settings for WordPress’s self-awareness
  • All database URLs — image paths, internal links, metadata
  • Yoast SEO schema and OG tags — URLs shown in search results and social shares
  • robots.txt sitemap URL — path referenced by search crawlers
  • n8n workflow monitoring URLs — automation tool health checks

If I had to do this manually, it would take a week. I wouldn’t even know what to change. I told Claude Code: “Domain changed, handle the rest.” It found and replaced everything:

# Command executed by Claude Code
wp search-replace 'blog.dace-sidemirror.ts.net' 'prsm-studio.com' --all-tables
# Result: 636 replacements

636 items needed changing. Beyond database URLs, Claude Code also modified wp-config.php, cleared Yoast SEO cache, updated robots.txt, changed n8n workflow URLs via API, and updated the blog publishing script’s domain — all automatically. I just watched the terminal output scroll by.

There was a Cloudflare cache hiccup. After updating robots.txt, the old version kept appearing. Cloudflare was caching static files for 4 hours. Claude Code diagnosed the issue and set no-cache headers. All I did was click “Purge Everything” in the Cloudflare dashboard.

Step 4: 301 Redirect for the Old Address

In case anyone visits the old address (blog.dace-sidemirror.ts.net), they should auto-redirect to the new one. Claude Code added redirect rules to Apache’s .htaccess:

RewriteCond %{HTTP_HOST} blog\.dace-sidemirror\.ts\.net [NC]
RewriteRule ^(.*)$ https://prsm-studio.com/$1 [R=301,L]

301 means “permanent move.” It tells search engines: “This address has permanently moved to the new one.” From an SEO perspective, 301 redirects transfer the old address’s domain authority to the new one — essential for preserving any existing search equity.

Step 5: Search Engine Registration — I Clicked Buttons

Google Naver Bing Daum search engine registration
All 4 search engines registered

Time to tell search engines “I’m here!” Four registrations needed:

  • Google Search Console — Add property → DNS verification → Submit sitemap
  • Naver Search Advisor — Register site → HTML meta tag verification
  • Bing Webmaster Tools — Register site → URL submission
  • Daum Webmaster Tools — robots.txt verification code

Honestly, all I did was say “register these,” copy verification codes from each site, pass them to Claude Code, and click confirmation buttons. Inserting verification codes into WordPress, setting up Naver/Daum meta tags, updating robots.txt — Claude Code handled all of it.

Yoast SEO auto-generates the sitemap at prsm-studio.com/sitemap_index.xml. Submit this to search engines and they’ll crawl all listed URLs.

Claude Code also submitted 32 URLs via IndexNow — an instant indexing protocol supported by Bing, Yandex, and Naver. I didn’t even ask for this. It decided on its own that the new domain needed immediate search engine notification.

Result: Search Visibility Begins

Current status after domain change:

  • prsm-studio.com working
  • ✅ Google/Naver/Bing/Daum all registered
  • ✅ Sitemap submitted
  • ✅ 32 URLs submitted via IndexNow
  • ✅ Old address 301 redirects
  • ✅ Daum search confirmed (Daum was the only engine that indexed .ts.net)
  • ⏳ Google/Naver indexing pending (typically days to 2 weeks)

Fun fact: Daum indexed the .ts.net address all along — the only engine out of four. But Daum alone isn’t enough in Korea. Google and Naver are where the real traffic comes from. My n8n Blog Indexing Monitor checks indexing status every 12 hours and sends Telegram alerts.

Two lessons learned. First, free has its reasons. Tailscale Funnel is free and convenient, but it’s missing a fundamental blog feature: search visibility. $10.44/year completely solved that.

Second, AI really does handle everything. Here’s everything I personally did in this episode:

  • Bought domain on Cloudflare (entered credit card)
  • Clicked ‘Create Tunnel’ on Cloudflare dashboard
  • Copied verification codes from search engine sites + clicked confirm

wp-config modifications, 636 database URL replacements, .htaccess redirect rules, SEO meta tag insertion, n8n workflow updates, IndexNow batch submission, cache debugging — 100% of the technical work was done by Claude Code. A non-coder doing domain migration? In the AI era, it’s possible.

Next Episode Preview

Next up: automatic web meeting transcription + AI meeting minutes. Join Google Meet, Zoom, or Teams calls, automatically convert speech to text, and have AI organize key points and action items — a story about how meeting minutes are already done when the meeting ends.

Thanks for reading! Stay tuned for the next episode!

This post was also written by AI (Claude Code). The domain migration, this blog post — all done by AI. I just said “do it.”

[Computer Play] Even a Code-Illiterate Built It! Home Server Journey (2) — Access Your Server From Anywhere with Tailscale

520 시리즈, m 2, m 2 ssd의 무료 스톡 사진

In Part 1, I set up a Beelink SER9 MAX with WSL2 and Docker, building the backbone of my home server. With a mini PC running a server environment, I was ready to host anything.

But there was one problem.

“If I can only access it at home… isn’t it just an external hard drive?”

The real value of a home server begins when you can access it from anywhere. During the day I work at the office, and when I get home, there’s never enough time to sit in front of the computer. Days are packed. Commute time, lunch breaks, quick moments between tasks — I needed to be able to check and manage my server from my smartphone during these gaps.

So Part 2 is all about making the home server accessible from outside. And once again, I didn’t type a single line of code. I just told Claude Code, “Make it so I can access my server remotely.”

Working remotely from anywhere
Photo by Max Zaharenkov / Pexels

Remote Access Options for a Home Server

There are roughly three ways to access a home server from outside.

The first is port forwarding. You go into your router settings and open ports. The moment questions like “TCP or UDP?” come up, someone like me — a complete non-coder — is already lost. Plus, there are security risks, and if your home IP changes, you lose access.

The second is setting up your own VPN server — installing something like WireGuard or OpenVPN. Great if you have networking knowledge, but the setup is complex and requires certificate management. Mountain after mountain for a non-coder.

The third is Tailscale. And naturally, that’s what I chose.

What is Tailscale? — The VPN That Just Works

Tailscale, in one sentence: “Install it, log in, and you’re done.”

Traditional VPNs require setting up servers, creating certificates, configuring firewalls, setting up clients… the list never ends. Tailscale eliminates all of that. Install the app, log in with your Google or Microsoft account, and your devices automatically connect to each other securely.

Technically, it’s a mesh network built on top of WireGuard, a modern VPN protocol. But honestly, I don’t know exactly what that means. What matters is:

  • Free for personal use — up to 100 devices
  • 30-second install, almost nothing to configure — no networking knowledge needed
  • Direct device-to-device connections — fast because there’s no middleman server
  • Works on every platform — Windows, Linux, macOS, iOS, Android

The “nothing to configure” part is key. For non-developers like me, fewer settings means a better tool.

서버에 케이블을 고정하는 전자 엔지니어
Photo by Field Engineer / Pexels

Installing Tailscale — Without Writing a Single Line of Code

My home server runs Docker on WSL2 inside Windows 11. Tailscale gets installed on the Windows side.

Installing Tailscale on the PC

I told Claude Code, “Install Tailscale for me,” and followed its instructions:

  1. Download the Windows version from the official Tailscale website
  2. Run the installer — Next, Next, Done
  3. A Tailscale icon appears in the system tray
  4. Click the icon → Log in → Sign in with Google

That’s it. The moment you log in, your server gets a dedicated Tailscale IP address. This IP is permanent — it doesn’t change even if your home internet IP changes. With this IP, you can access your server from anywhere.

What About WSL2 and Docker?

I was worried about this, but the answer is simple: you don’t need to do anything extra. Docker containers running inside WSL2 share Windows’ network, so installing Tailscale on Windows automatically makes all WSL2 services accessible.

For example, my WordPress runs as a Docker container, and accessing it via the Tailscale IP just works. Same for Immich (photo backup), Open WebUI (AI chat), and everything else.

I asked Claude Code, “Does this work with WSL2?” It said, “Install on Windows and WSL2 works too.” And it did. I didn’t need to understand why.

나무 작업대 위에 RAM 모듈, 드라이버, 공구 세트가 놓인 열린 노트북의 클로즈업 사진.
Photo by Andrey Matveev / Pexels

Accessing from a Smartphone — The Magical Moment

This is where it gets real.

The biggest reason I installed Tailscale was smartphone access. Working at the office all day, then coming home to household responsibilities — there’s surprisingly little time to sit at a computer. During lunch breaks, on the subway home, lying on the couch for a few minutes — I wanted to check my server during these in-between moments.

The setup is remarkably simple:

  1. Install the Tailscale app on your smartphone
  2. Log in with the same account you used on your PC
  3. Turn on the VPN connection
  4. Type the Tailscale IP in your browser

That’s it. During lunch at work, I check photos on Immich, send commands to my AI assistant via Telegram, and review my blog on WordPress admin — all from my phone.

The speed is surprisingly good too. Since it’s WireGuard-based, there’s none of the sluggishness you’d expect from a typical VPN. It feels like you’re on the same WiFi network.

For a busy professional with no time to sit at a computer, this is a game changer. The home server transforms from “something I use only at home” to “my personal cloud, always in my pocket.”

Secure VPN network connection
Photo by Stefan Coders / Pexels

Tailscale Funnel — Opening Your Server to the World

Everything so far has been about connecting “my own devices.” But what about services that anyone should be able to access, like a blog?

Tailscale has a feature called Funnel. It exposes a specific service on your server to the internet, complete with an automatically assigned domain and HTTPS certificate.

Setting Up Funnel — Claude Code Did This Too

I told Claude Code, “Make my WordPress blog visible to the outside world.” Claude Code ran the necessary commands, and the result:

  • Tailscale automatically assigned a domain
  • An HTTPS certificate was automatically issued (Let’s Encrypt)
  • External traffic was routed to my WordPress server

No need to buy a domain. No need to manually renew certificates. Tailscale handles everything.

This is exactly how you’re reading this blog right now. This post is served from the WordPress instance on my mini PC at home, exposed to the internet through Tailscale Funnel. No separate cloud server. No hosting service. Directly from the mini PC on my desk.

Funnel’s Limitations

It’s not perfect, of course:

  • The domain is fixed as *.ts.net — custom domains aren’t supported
  • Speed depends on your home internet’s upload bandwidth — not suitable for heavy traffic
  • Only certain ports are available

But for a personal blog or small project, it’s more than enough. Being able to run a blog directly from your own server without cloud hosting — that’s the beauty of a home server.

Remote access on smartphone
Photo by cottonbro studio / Pexels

The Non-Coder’s Secret: I Just Said “Do It”

I keep emphasizing this throughout the article, but I didn’t type a single line of code during any of this.

Installing Tailscale? Claude Code told me to “download and install this,” and I just clicked with my mouse. Setting up Funnel? Claude Code ran the commands itself. Verifying WSL2 compatibility? Claude Code said “it just works,” and it did.

I did exactly two things:

  1. Told Claude Code “do this for me”
  2. Clicked “Next” on the installation screens

This is how a non-coder runs a home server. Not by learning technology, but by delegating to an AI that knows technology. “Install Tailscale,” “Make it accessible remotely,” “Expose my blog to the public” — say it in plain language, and the AI handles the rest.

You might think, “But shouldn’t I at least understand the basics?” Honestly — no, you don’t have to. I still don’t know the difference between TCP and UDP. I’m not entirely sure what port forwarding actually does. But my home server is accessible from my smartphone anywhere in the world, and my blog is live on the internet.

What matters isn’t technical knowledge. It’s the will to make it happen. And in 2026, if you have that will, AI takes care of everything else.

Home office desk setup
Photo by Mateusz Haberny / Pexels

What My Home Server Can Do Now

With hardware and Docker from Part 1, and Tailscale remote access from Part 2, here’s what my mini PC home server currently handles:

  • Access from anywhere — office, café, subway, anywhere via smartphone
  • Blog hosting — WordPress exposed to the internet via Funnel
  • Photo/video backup — Immich as a self-hosted Google Photos replacement
  • AI assistant — commanding an AI agent via Telegram
  • Local AI — running LLMs directly on my server with Ollama

All of this runs on a single mini PC, and thanks to Tailscale, it’s always within reach. And everything was set up not by me, but by Claude Code. I just pointed the direction.

Coming Up Next

In Part 3, I’ll cover installing WordPress with Docker and building a blog. Setting up a bilingual (Korean + English) blog, and building a system where AI writes and publishes posts automatically — the non-coder’s home server journey continues.

All technical work in this series was performed by Claude Code (AI). The author (a non-coder) said “do it” and reviewed the results.