<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Bryant Chen</title>
    <link>https://bryantchen.cc/en</link>
    <description>Bryant&apos;s personal website — indie dev, AI, product thinking</description>
    <language>en</language>
    <lastBuildDate>Thu, 14 May 2026 07:07:20 GMT</lastBuildDate>
    <atom:link href="https://bryantchen.cc/en/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Form is the medium — it decides what users and readers actually see. On WeChat, …</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-05-12-form-is-medium</guid>
      <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
      <description>Form is the medium — it decides what users and readers actually see. On WeChat, people look at the image and read the post body; on Video Accounts, people watch the video and largely skip the text.

Different platforms also mean different things behind the scenes: different moder...</description>
      <content:encoded><![CDATA[Form is the medium — it decides what users and readers actually see. On WeChat, people look at the image and read the post body; on Video Accounts, people watch the video and largely skip the text.

Different platforms also mean different things behind the scenes: different moderation rules, different traffic distribution, different audiences.

It is only after I started making content for commercialization and product launches that these ideas became concrete. Before, I knew the big concepts — but did not really *know* them.

知行合一 (the unity of knowing and doing) — it feels something like this.]]></content:encoded>
    </item>
    <item>
      <title>![From 50 to 80](/images/thoughts/2026-05-01-50-to-80.png)

These days, building…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-05-01-from-50-to-80</guid>
      <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
      <description>![From 50 to 80](/images/thoughts/2026-05-01-50-to-80.png)

These days, building a 50-point demo with AI may only take half a day, or even an hour or two. But from 50 to 80, there is often a huge chasm.

Most of the time, shipping a 50-point demo does not prove much. **Shortening...</description>
      <content:encoded><![CDATA[![From 50 to 80](/images/thoughts/2026-05-01-50-to-80.png)

These days, building a 50-point demo with AI may only take half a day, or even an hour or two. But from 50 to 80, there is often a huge chasm.

Most of the time, shipping a 50-point demo does not prove much. **Shortening the distance from 50 to 80 — delivering a product experience and service with the highest completeness you can — is what matters.**

Of course, if you have already found your target users and a business model with a 50-point product, that is also fine. Knowing exactly what level of product you are aiming for matters a lot.

> Image generated with GPT-image-2.]]></content:encoded>
    </item>
    <item>
      <title>Vibe coding has a common detour: you ship the demo first, skip the thinking and …</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-05-01-look-before-vibing</guid>
      <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
      <description>Vibe coding has a common detour: you ship the demo first, skip the thinking and research along the way, and just keep asking the AI to tweak it.

But sometimes it pays to stop and look at how reference products solve the same thing — how others handle the same kind of problem. It...</description>
      <content:encoded><![CDATA[Vibe coding has a common detour: you ship the demo first, skip the thinking and research along the way, and just keep asking the AI to tweak it.

But sometimes it pays to stop and look at how reference products solve the same thing — how others handle the same kind of problem. It saves you a lot of dead ends.

Written after hitting a few of these while building ColorWander.]]></content:encoded>
    </item>
    <item>
      <title>Two recent thoughts:

1. Ideas are easy to copy. Completeness and details are no…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-29-completeness-and-humanity</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description>Two recent thoughts:

1. Ideas are easy to copy. Completeness and details are not. Marketing and distribution channels are not. The data and corpus you have accumulated cannot be caught up with overnight either. Spinning up a demo has never been easier — everyone can say &quot;I just ...</description>
      <content:encoded><![CDATA[Two recent thoughts:

1. Ideas are easy to copy. Completeness and details are not. Marketing and distribution channels are not. The data and corpus you have accumulated cannot be caught up with overnight either. Spinning up a demo has never been easier — everyone can say "I just vibe-coded a XYZ." But shipping a product with a complete experience is hard. Getting 100, 1,000, or more people to actually use what you offer is hard.

2. A friend told me: "All the friends I know who used to build productivity tools — none of them want to build pure productivity anymore." I said: "I think it is a stage thing. The more optimistic you are about model and agent capabilities, the deeper you go, the more pessimistic you become about pure productivity, and the more you care about things that are playful, fun, and human." I genuinely believe that.

**Building products that are fun and humane matters more and more.**]]></content:encoded>
    </item>
    <item>
      <title>I have been moving some of my dev tasks onto Codex lately, and I keep feeling it…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-29-no-one-leads-forever</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description>I have been moving some of my dev tasks onto Codex lately, and I keep feeling it: a complete toolchain (calling image-gen APIs directly, reading markdown natively, clean integrations with all kinds of tools), a reliable user experience (highly visual), plus a GPT-5.5 brain that i...</description>
      <content:encoded><![CDATA[I have been moving some of my dev tasks onto Codex lately, and I keep feeling it: a complete toolchain (calling image-gen APIs directly, reading markdown natively, clean integrations with all kinds of tools), a reliable user experience (highly visual), plus a GPT-5.5 brain that is back on its feet — it is genuinely good to use.

Each player leads for a month or two. OpenAI is back. No one gets to say they will lead forever, and never underestimate a strong player's determination to take a market.

As a tool user in this era, there is no good reason to lock yourself into one tool out of loyalty or habit. Whatever works best, whatever is more advanced — just use it.

One more thing: **avoid free tiers and cheap substitutes — cheap things are always the most expensive.**]]></content:encoded>
    </item>
    <item>
      <title>When I build products, I think about running.

1. The core of long-termism is to…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-24-product-as-marathon</guid>
      <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
      <description>When I build products, I think about running.

1. The core of long-termism is to stay on the track — to finish the marathon with a calm, positive, and self-paced mindset.
2. Building a product often feels confusing at the first step. Dive in, and you start to collect unexpected l...</description>
      <content:encoded><![CDATA[When I build products, I think about running.

1. The core of long-termism is to stay on the track — to finish the marathon with a calm, positive, and self-paced mindset.
2. Building a product often feels confusing at the first step. Dive in, and you start to collect unexpected little surprises. Get close to the finish line, and you realize the details multiply fast. From there on, it is all about polishing — the devil is in the details, and they decide whether your product earns real affection.
3. The real source of calm is believing you can finish this marathon, and that you can hit your own PB (Personal Best) at a comfortable pace.]]></content:encoded>
    </item>
    <item>
      <title>![ClawPuter star history](/images/thoughts/2026-04-22-clawputer-100-stars.svg)

…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-22-clawputer-100-stars</guid>
      <pubDate>Wed, 22 Apr 2026 12:00:00 GMT</pubDate>
      <description>![ClawPuter star history](/images/thoughts/2026-04-22-clawputer-100-stars.svg)

ClawPuter officially crossed 100 GitHub stars today. I just kept shipping casually, and the milestone quietly arrived on its own.

It is the first project I built from zero to one that reached three d...</description>
      <content:encoded><![CDATA[![ClawPuter star history](/images/thoughts/2026-04-22-clawputer-100-stars.svg)

ClawPuter officially crossed 100 GitHub stars today. I just kept shipping casually, and the milestone quietly arrived on its own.

It is the first project I built from zero to one that reached three digits on GitHub. Just a number, but worth marking down as a small personal milestone.]]></content:encoded>
    </item>
    <item>
      <title>A recent reflection: I am not a fan of chasing best practices, which makes me mo…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-22-follow-best-practices</guid>
      <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
      <description>A recent reflection: I am not a fan of chasing best practices, which makes me move too fast and step on avoidable landmines — especially on procedural stuff. Two examples, for future me to remember:

1. **Google AdSense account**: I moved too fast and filled in Hong Kong details,...</description>
      <content:encoded><![CDATA[A recent reflection: I am not a fan of chasing best practices, which makes me move too fast and step on avoidable landmines — especially on procedural stuff. Two examples, for future me to remember:

1. **Google AdSense account**: I moved too fast and filled in Hong Kong details, but I don't actually have a Hong Kong mailing address. The consequence is that I may not be able to cash out ad revenue later. After asking around in a group chat, my only option was to close the account, and I am not sure whether a re-application will be blocked.
2. **Domain registration**: too fast, and too cheap — I grabbed a `.cc` domain. Only later, when doing SEO, did I realize: WTF, the sitemap does not get auto-indexed, and a bunch of other quirks come with it.

When validating an idea, moving fast matters. But when there is already a standard, an SOP, or an industry best practice, just follow it. It is the least painful path and saves you from countless detours.

**When in doubt, ask friends, group chats, or folks who have been there. Opening your mouth is sometimes more valuable than opening your editor.**]]></content:encoded>
    </item>
    <item>
      <title>![X analytics screenshot](/images/thoughts/2026-04-20-x-ship-before-perfect.png)…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-20-ship-before-perfect</guid>
      <pubDate>Mon, 20 Apr 2026 02:15:00 GMT</pubDate>
      <description>![X analytics screenshot](/images/thoughts/2026-04-20-x-ship-before-perfect.png)

This X post got a small burst of attention this afternoon. The numbers are not huge, but it is already my best-performing post ever.

Publishing really is more important than perfecting. Before post...</description>
      <content:encoded><![CDATA[![X analytics screenshot](/images/thoughts/2026-04-20-x-ship-before-perfect.png)

This X post got a small burst of attention this afternoon. The numbers are not huge, but it is already my best-performing post ever.

Publishing really is more important than perfecting. Before posting, I was still thinking: maybe I should wait, record an English walkthrough video, and then publish it. But it was almost dinner time and I needed to cook, so I just posted an image thread with English captions and a Chinese demo voiceover.

And that was enough to get this result.

Next time I hesitate, I need to repeat this to myself: ship it first.]]></content:encoded>
    </item>
    <item>
      <title>iOS Proxy Client Pitfalls: Why Free Apps Failed and $2.99 Saved the Day</title>
      <link>https://bryantchen.cc/en/posts/ios-proxy-client-pitfalls</link>
      <guid isPermaLink="true">https://bryantchen.cc/en/posts/ios-proxy-client-pitfalls</guid>
      <pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate>
      <description>Self-hosted VPS proxy, phone couldn&apos;t connect. Tried 3 free iOS apps — all failed. Turns out it was a core engine compatibility issue. Full troubleshooting journey, 5-app comparison, and a lesson about false economy.</description>
      <content:encoded><![CDATA[> Based on my real troubleshooting experience, co-created with Claude (AI). All technical details verified in a live environment.

## Background

I run Xray on a VPS with two proxy protocols:

- **Shadowsocks (SS)**: Classic protocol, port `18388`
- **VLESS Reality**: Next-gen protocol, port `443`, disguised as normal HTTPS traffic

Mac connects via SSH tunnel — rock solid. Then one day, my phone just stopped connecting. Not "intermittent." Just dead.

## The Investigation

### Step 1: VPS is Fine

SSH in, quick check:

```bash
systemctl status xray          # ✅ running
ss -tlnp | grep xray           # ✅ ports 18388, 443 listening
curl -s https://www.google.com  # ✅ 200
```

Nothing wrong server-side.

### Step 2: Three Free Apps, Three Failures

Tried every free iOS proxy client I could find:

| App | SS | VLESS Reality |
|-----|-----|---------------|
| **Streisand** | timeout | timeout |
| **V2Box** | timeout | timeout |
| **Hiddify** | timeout | timeout |

All dead.

### Step 3: Reproducing on Mac

Installed the `xray` client on Mac to test the protocols directly:

```bash
# SS test
curl -x socks5://127.0.0.1:10808 https://ifconfig.me
# ❌ Empty response, exit code 52

# VLESS Reality test
curl -x socks5://127.0.0.1:10809 https://ifconfig.me
# ✅ Returns VPS IP
```

**Finding 1**: SS is broken from Mac too — it's a protocol-level issue, not a phone problem.

**Finding 2**: VLESS Reality works perfectly from Mac.

### Step 4: Loopback Test on VPS

Running an xray client on the VPS itself, connecting to its own SS port (bypassing external network):

```bash
# VPS localhost → localhost:18388 → internet
curl -x socks5://127.0.0.1:10900 http://httpbin.org/ip
# ✅ Success
```

SS works locally but not externally — **the firewall is specifically blocking SS protocol traffic** through deep packet inspection.

### Step 5: Identifying the Phone Issue

VLESS Reality works from Mac but not from phone. What do all three free apps have in common?

**They all use sing-box as their core engine.**

sing-box is an open-source proxy core. But it has compatibility issues with Xray's Reality implementation, specifically the `xtls-rprx-vision` flow.

## The Fix

Bought **Shadowrocket** ($2.99, US App Store). Copied the VLESS Reality link, opened the app, auto-imported. Connected in 30 seconds.

The previous troubleshooting with free apps had taken over two hours.

## Two Key Takeaways

### 1. Shadowsocks Is No Longer Safe

DPI firewalls can now fingerprint and block SS protocol traffic. Symptoms:

- TCP handshake succeeds (port is reachable)
- But protocol-level data never comes back (empty response)
- No client can fix this

If you're still using SS, migrate to VLESS Reality or Hysteria2. VLESS Reality disguises traffic as normal HTTPS (SNI points to microsoft.com), which current firewalls can't detect.

### 2. Free iOS Clients Share a Fatal Flaw

| App | Core Engine | VLESS Reality |
|-----|------------|---------------|
| Streisand | sing-box | ⚠️ Incompatible |
| V2Box | sing-box | ⚠️ Incompatible |
| Hiddify | sing-box | ⚠️ Incompatible |
| Shadowrocket | Proprietary | ✅ Works |
| Surge 5 | Proprietary | ✅ Works |

All free apps depend on sing-box, which has compatibility issues with Xray's Reality. It's not any single app's bug — it's a core engine issue. No amount of app-switching helps.

## Full iOS Proxy Client Comparison

| | Shadowrocket | Surge 5 | Streisand | V2Box | Hiddify |
|---|---|---|---|---|---|
| **Price** | $2.99 one-time | $49.99/yr | Free | Free | Free/OSS |
| **Core** | Proprietary | Proprietary | sing-box | sing-box | sing-box |
| **SS** | ✅ | ✅ | ✅ | ✅ | ✅ |
| **VLESS Reality** | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ |
| **Hysteria2** | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Stability** | High | High | Medium | Medium | Low |
| **Rating** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | ⭐ |

**Shadowrocket is the best value**: $2.99 one-time purchase, proprietary core, full protocol support, frequent updates. Surge is more powerful but subscription-based.

## Pitfall Checklist

| Pitfall | Symptom | Root Cause | Fix |
|---------|---------|------------|-----|
| SS blocked | All clients timeout | DPI firewall blocks SS protocol | Switch to VLESS Reality |
| Free apps fail on VLESS | Streisand/V2Box/Hiddify timeout | sing-box incompatible with Xray Reality | Use Shadowrocket |
| Port reachable ≠ proxy works | TCP connects but proxy fails | TCP handshake ≠ protocol works | Test with actual xray client |
| Hiddify dev broken | Nothing connects | iOS dev build sing-box bug | Don't use dev builds |
| Xray degrades over time | Misbehaves after 45 days | Process state degradation | Periodic `systemctl restart xray` |

## The Bottom Line

$2.99 on a proxy client isn't wasteful — **it buys back two hours of debugging and the frustration of cycling through three broken apps.**

Free tools aren't bad. But when your server uses a newer protocol like VLESS Reality, their shared core engine becomes the bottleneck. You can't see this from the app's UI — all you get is a meaningless "timeout."

The most expensive cost is never the tool's price tag. It's the time you spend trying to avoid paying it.]]></content:encoded>
    </item>
    <item>
      <title>Ad Monetization for Indie Developers: A Complete Adsterra Integration Guide (With Real Revenue Data)</title>
      <link>https://bryantchen.cc/en/posts/adsterra-integration-guide</link>
      <guid isPermaLink="true">https://bryantchen.cc/en/posts/adsterra-integration-guide</guid>
      <pubDate>Thu, 16 Apr 2026 00:30:00 GMT</pubDate>
      <description>After getting stuck on AdSense phone verification, I switched to Adsterra and had ads running in one evening; later I found the ads caused forced redirects on the user side, so I turned them off and started rethinking AdSense.</description>
      <content:encoded><![CDATA[> This article is organized from my actual project conversation with Claude (AI). All data, lessons learned, and code examples are from integrating ads into [AIBT](https://aibtapp.com).

> **Update, afternoon of April 16, 2026**: After shipping this, I found that the ads added through this approach kept triggering forced redirects on the user side. I am still not sure whether I configured something incorrectly, or whether this is caused by the ad format / ad network itself. Either way, it clearly hurt the user experience, so I turned this ad setup off for now.  
>  
> My conclusion has changed after this: Adsterra is fast to integrate and useful for validating the ad monetization pipeline, but if user experience is the priority, the better long-term path is still to get Google AdSense working.

## How AdSense Blocked Me Before I Even Started

My project is [AIBT](https://aibtapp.com), an MBTI-style personality test for AI. 72 SEO pages, three languages (EN/ZH/JA), deployed on Cloudflare Pages. Content quality wasn't the issue. The issue was AdSense's registration flow.

**Once you pick a payment country, you can't change it.**

I chose Hong Kong (I have an HK bank card), and then the phone verification demanded a +852 number. I only had +86 and a US number. Verification failed. The account was stuck: I couldn't change region, couldn't delete and restart (one AdSense account per Google account).

If you don't have a phone number that matches your chosen payment country, AdSense might not work for you.

## Why I Turned to Adsterra at the Time

| | Google AdSense | Adsterra |
|---|---|---|
| Approval time | 1-4 weeks | **A few hours** |
| Minimum traffic | No official minimum but low-traffic sites often get rejected | **None** |
| Phone verification | Must match payment country | **Not required** |
| Payment threshold | $100 | **$5** (Paxum/USDT) |
| Payment methods | Bank wire only | PayPal, USDT, Wire, Paxum |
| Ad quality | High | Medium, and redirect-style UX issues need extra caution |

My original judgment was: AdSense is enterprise-grade gatekeeping. Adsterra is self-service. For a small site with under 100 daily visitors, Adsterra looked like the better short-term ROI because at least you could get ads running.

But that was only true if the question was "Can I quickly make the ad pipeline work?" If user experience matters, especially for a product that needs users to stay, share, and return, forced redirects can cost far more than the tiny amount of ad revenue they bring in.

## Registration (5 Minutes)

### 1. Create an Account

Go to [Adsterra](https://beta.publishers.adsterra.com/referral/DUEf5kCsSX) → Sign Up → choose **Publisher**.

What you need:
- **Email**: your regular email
- **Login**: a username
- **Messenger**: pick any (Telegram/Twitter/Skype), fill in your handle. They won't actually contact you
- **Country**: your actual country. **This doesn't lock your payment method**. Unlike AdSense, Adsterra lets you choose PayPal/USDT/Wire at any time

No phone number, no bank info, no identity verification. Just email verification.

### 2. Add Your Website

Websites → ADD WEBSITE → enter your domain and category.

Adsterra's categories are rough (Social / Movies / Downloads...). There is no "Technology" or "Entertainment." Pick **Other** if nothing fits.

**Turn off Adult ads** unless you run an adult site.

### 3. Choose Ad Formats (The Key Decision)

This step determines the balance between revenue and user experience.

**Relatively restrained:**

- **Native Banner**: blends with content and looks like a recommendation widget. CTR is relatively good, and visual disruption is lower
- **Banner**: traditional display ads. Pick 728x90 (desktop leaderboard) + 300x250 (universal rectangle) + 320x50 (mobile strip)

**Now I would be extremely cautious with:**

- **Popunder**: opens a new window when the user closes/switches tabs. CPM is 3-5x higher than banners, but it hurts UX. I used to think it could be limited to SEO landing pages. Now I would be more conservative: if the product is early and user trust is still fragile, don't use it

**Avoid:**

- **Social Bar**: floating notification bar that blocks content
- **Smartlink**: redirects users to ad pages, completely wrong for content sites

The problem I ran into was this: even without intentionally adding a redirect page, users still saw forced redirects. That does not prove every Adsterra setup behaves this way, but it does prove one thing: after adding ads, test the site yourself on real devices. Especially test mobile, incognito windows, different network regions, and first-visit behavior.

### 4. Wait for Activation

Submit and refresh after 3 minutes. Status changes to **Active**. Faster than making a cup of coffee.

### 5. Get the Code

Each Ad Unit has a **GET CODE** button → copy the HTML/JS snippet.

## Placement Strategy: What Goes Where

**Core principle: the more you need users to share/interact on a page, the fewer ads it should have.**

| Page Type | Native Banner | 300x250 | 728x90 / 320x50 | Popunder |
|---|---|---|---|---|
| Homepage | Use cautiously | ❌ | ❌ | ❌ |
| Core experience (test results) | Use cautiously | ❌ | ❌ | ❌ |
| Content detail pages (SEO) | Testable | Testable | Testable | Not recommended |
| Utility pages (stats/FAQ) | Testable | ❌ | Testable | Not recommended |

**Why be cautious even on the homepage and results page?**

Homepage popunder = user's first visit gets a popup, they leave immediately. Results page is where users screenshot and share. Sharing generates free traffic that is worth more than ad revenue. Too many ads kill the sharing impulse.

After running into forced redirects, I am more convinced of this: early products should not trade first impressions for a few cents of revenue. You can add ads later. Lost trust is much harder to recover.

**Why can detail pages be tested?**

These pages get traffic from Google search. Users are "strangers" with higher ad tolerance. Long content has enough space. This is where ad revenue usually comes from.

But "testable" does not mean "acceptable at any UX cost." The smallest viable approach is to place one restrained display ad first, watch user paths, bounce rate, and whether any abnormal redirects appear, then decide whether to expand.

## Technical Implementation

### Responsive: Different Ads for Desktop and Mobile

```html
<style>
.ad-desktop { display: block; }
.ad-mobile { display: none; }
@media (max-width: 768px) {
  .ad-desktop { display: none; }
  .ad-mobile { display: block; }
}
</style>

<!-- Desktop: 728x90 -->
<div class="ad-desktop"><!-- ad code --></div>

<!-- Mobile: 320x50 -->
<div class="ad-mobile"><!-- ad code --></div>
```

### Batch Injection: Don't Add Manually to 200+ Pages

AIBT has 72 personality pages × 3 languages = 216 HTML files. Write a Python script:

```python
from pathlib import Path

AD_CODE = '''<!-- your ad code -->'''

for html_file in Path('personality').rglob('index.html'):
    html = html_file.read_text()
    if 'ad-identifier' not in html:  # idempotency check
        html = html.replace('<footer>', AD_CODE + '\n<footer>')
        html_file.write_text(html)
```

### Dynamic Pages: Inject After JS Render

For SPA or dynamically rendered pages, you can't hardcode ad scripts in the HTML. Inject via JavaScript:

```javascript
const adContainer = document.getElementById('ad-slot');
if (adContainer && !adContainer.dataset.loaded) {
  adContainer.dataset.loaded = '1';
  const s = document.createElement('script');
  s.async = true;
  s.src = 'your-ad-script-url';
  adContainer.appendChild(s);
}
```

### Do a UX Regression Pass After Launch

Ad code is not a normal static component. It loads third-party scripts and may return different behavior depending on region, device, and ad inventory. After adding ads, check at least:

- Whether first visits trigger automatic redirects
- Whether mobile ads cover core buttons
- Whether going back, closing tabs, or switching tabs causes popups
- Whether incognito and logged-out states behave differently
- Whether anything abnormal appears when ad blockers are disabled

I did not do this thoroughly enough the first time. I only noticed the forced redirects on the user side on Thursday afternoon. Going forward, I will treat this as a required pre-release checklist for any ad integration.

## Update Your Privacy Policy

After adding ads, you **must** disclose this in your privacy policy (GDPR/CCPA compliance). Add to your "Third-Party Services" section:

> **Adsterra**: Display advertising on content pages. Subject to [Adsterra's privacy policy](https://adsterra.com/privacy-policy/).

If, like me, you later turn ads off temporarily, also review the privacy policy and any ad disclosures on the site so the wording still matches actual behavior.

## Real Revenue Data

Let me set expectations:

**Day 1**: 34 impressions, 0 clicks, $0 revenue, CPM $0.094.

This is normal. Adsterra's algorithm needs days to weeks to learn your traffic quality before it serves higher-CPM ads.

**Realistic expectations:**

| Daily visits | Monthly impressions | Estimated monthly revenue |
|---|---|---|
| 100 | 3,000 | $3-10 |
| 500 | 15,000 | $15-50 |
| 1,000 | 30,000 | $30-100 |

Quiz/entertainment sites typically see $1-3 CPM. It won't make you rich. But if the ad experience is not controllable, "completely passive income" can turn into "completely passive damage to user experience."

So my current judgment is more conservative: Adsterra can be useful for validating the ad pipeline early, but I would not treat it as the default long-term option. If user experience and brand trust matter, you eventually need to solve AdSense, or at least pick a more controllable ad network.

## FAQ

**Q: Ads added but nothing shows up?**
Three possibilities: (1) ad blocker in your browser → disable it; (2) new site fill rate takes hours to ramp up → wait; (3) no ad inventory for your region right now.

**Q: Can I run AdSense and Adsterra simultaneously?**
Yes, but put them on different pages. Same-page competition lowers CPM for both.

**Q: Can I put ads in the blank space on both sides of a centered layout?**
If you're using a single-column layout (e.g., `max-width: 760px`), the blank sides are just body background. Adding sidebar ads requires restructuring the entire page, which usually is not worth it. Consider a sticky bottom banner instead.

**Q: Will Popunder annoy users?**
Yes, and in my case the impact was larger than I expected. My current recommendation: don't use Popunder in an early product. Even on SEO pages, wait until traffic is more stable and analytics are more complete, then test in a small scope.

**Q: Do I still recommend Adsterra after this?**
If your goal is "quickly connect ads and see whether the revenue pipeline works," it can be worth trying. If your goal is "long-term monetization without obviously hurting user experience," I would prioritize AdSense now. Adsterra's low barrier is useful, but low barrier does not mean low risk.

---

*This article was organized from my actual project conversation with Claude (AI). If you're also figuring out ad monetization for an indie project, hope this saves you a few headaches.*

---

If you'd like to try Adsterra, feel free to sign up through [my referral link](https://beta.publishers.adsterra.com/referral/DUEf5kCsSX). It helps support this blog at no extra cost to you. Based on my actual experience this time, I recommend testing it in a small scope first instead of enabling it across core pages immediately.]]></content:encoded>
    </item>
    <item>
      <title>For infrastructure-level tools, just pay for them. Don&apos;t waste time wrestling wi…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-16-pay-for-infra-tools</guid>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <description>For infrastructure-level tools, just pay for them. Don&apos;t waste time wrestling with free alternatives. Learned this lesson the hard way today — spent two hours trying three free iOS proxy clients before a $2.99 Shadowrocket purchase solved everything in 30 seconds.

The most expen...</description>
      <content:encoded><![CDATA[For infrastructure-level tools, just pay for them. Don't waste time wrestling with free alternatives. Learned this lesson the hard way today — spent two hours trying three free iOS proxy clients before a $2.99 Shadowrocket purchase solved everything in 30 seconds.

The most expensive cost is never the tool's price. It's the time you spend trying to avoid paying it.

Full write-up: [iOS Proxy Client Pitfalls](/en/posts/ios-proxy-client-pitfalls)]]></content:encoded>
    </item>
    <item>
      <title>Read a friend&apos;s essay from three years ago about their hackathon experience. I c…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-15-hackathon-essay-time</guid>
      <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
      <description>Read a friend&apos;s essay from three years ago about their hackathon experience. I can&apos;t remember what I felt the first time I read it, but re-reading it last night, a few things stood out:

The technical parts have changed incredibly fast. Some of the stuff I didn&apos;t fully get three ...</description>
      <content:encoded><![CDATA[Read a friend's essay from three years ago about their hackathon experience. I can't remember what I felt the first time I read it, but re-reading it last night, a few things stood out:

The technical parts have changed incredibly fast. Some of the stuff I didn't fully get three years ago now feels like ancient history.

But what hasn't changed are the product insights — the walks, the background music, the human touches. I still think about those ideas from time to time.

Also, it's wild to think that what six people spent 48 hours building back then could probably be done by one person in an hour today.

A great essay. People should write more. Even if you're not writing history, leaving a small trace of yourself in the human timeline is worth something.]]></content:encoded>
    </item>
    <item>
      <title>I keep talking about the product loop these past few weeks. One real benefit of …</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-15-product-loop-pivot</guid>
      <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
      <description>I keep talking about the product loop these past few weeks. One real benefit of closing that loop is that data forces you to either fully let go or pivot. Without it, you always hold onto false hope.</description>
      <content:encoded><![CDATA[I keep talking about the product loop these past few weeks. One real benefit of closing that loop is that data forces you to either fully let go or pivot. Without it, you always hold onto false hope.]]></content:encoded>
    </item>
    <item>
      <title>Ten years since Kobe&apos;s farewell game. I was a senior in college, watching it in …</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-13-kobe-last-game</guid>
      <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
      <description>Ten years since Kobe&apos;s farewell game. I was a senior in college, watching it in the lab. Time flies — another decade gone, and the league scheduled Lakers vs Jazz as the last regular season game this year.

Before bed, I watched &quot;The Bucket List&quot; with Jack Nicholson and Morgan Fr...</description>
      <content:encoded><![CDATA[Ten years since Kobe's farewell game. I was a senior in college, watching it in the lab. Time flies — another decade gone, and the league scheduled Lakers vs Jazz as the last regular season game this year.

Before bed, I watched "The Bucket List" with Jack Nicholson and Morgan Freeman. Nicholson is a die-hard Lakers and Kobe fan.]]></content:encoded>
    </item>
    <item>
      <title>Milestone: The First Paid Revenue from My Product</title>
      <link>https://bryantchen.cc/en/posts/milestone-first-paid-revenue</link>
      <guid isPermaLink="true">https://bryantchen.cc/en/posts/milestone-first-paid-revenue</guid>
      <pubDate>Sat, 11 Apr 2026 16:30:00 GMT</pubDate>
      <description>The day AIBT launched, I got a $2.99 payment notification while in a taxi. Behind this small number is everything I&apos;ve accumulated over the past month.</description>
      <content:encoded><![CDATA[## A Notification in the Taxi

After seeing the SBTI project go viral yesterday, an idea I had been sitting on for a while finally lit up — AIBT (AI Behavior Test). I worked through the night. From writing the first line of code to going live took only a few hours.

Then, this afternoon, I had to take a taxi out for something. On the way, my phone buzzed: **You received a payment of $2.99.**

I still remember the surprise in that moment. The amount is small — $2.99 isn't even enough for a cup of coffee — but this is my first paid product revenue as an indie developer. Worth writing down.

## What is AIBT

In short, AIBT is a small tool that lets AI analyze your past conversation history and build a behavioral profile of you. It was inspired by SBTI, but with something I've been researching recently baked in — analyzing the interaction patterns between humans and AI through conversation history.

Honestly, if I were being more opportunistic, I should have just cloned SBTI's content and test format directly — that would probably be the highest-traffic path. But I still wanted to do something different. Riding a trend is fine, but it's better to ride it with something of your own.

A classic "idea in ten seconds, built in a few hours" kind of project.

## Why This Matters to Me

Honestly, the meaning isn't in the $2.99. It's that I saw my own progress from the past month reflected in this project. A kind of unity-of-knowing-and-doing progress.

### 1. The Minimum Viable Loop, Completed for the First Time

A few days ago I wrote a thought: a commercial product is only "done" when it closes the minimum viable loop — demo, login, payment/subscription, landing page, launch, paying user. This time, AIBT went through that loop rigorously:

- Demo done
- Payment integrated (LemonSqueezy)
- Dedicated domain
- Publicly launched
- First paying user

The gap between "building for myself" and "actually getting users to pay" is something I had been avoiding for a long time. This was the first time I walked the full distance, and the mindset is completely different.

### 2. No Effort Is Wasted

What moved me more is this — AIBT could launch in a few hours because nearly all the infrastructure was already built during other things I'd done recently:

- **LemonSqueezy** was set up for MemoryX's subscription system, but now any project can plug into it.
- **Cloudflare Pages + domain configuration** became second nature while building bryantchen.cc and memoryx.cc.
- **SEO basics** is something I only started learning while working on memoryx.cc.
- **Conversation analysis logic** comes from my memory research.

Each thing, at the time, looked like I was working on something else. But all of them converged on AIBT.

"No effort is wasted" — I think this is what it means. Everything you do is quietly preparing you for some future moment, even if you have no idea at the time.

## Another Signal That Made Me Even Happier

Beyond the $2.99, there was a moment that made me even happier — after I posted AIBT on my WeChat Moments, I started seeing friends spontaneously share their own test results on their Moments, or forward AIBT to other group chats.

This kind of organic sharing matters more than any click count or payment amount. It means the thing resonates with them, that it's worth sharing, that they're willing to attach their name to the product — even if only in a single post.

For an indie developer, this is the most precious signal.

## A Good Start

$2.99 is a small milestone, but it proves one thing: **keep building, keep shipping, accumulate one piece at a time** — it actually works.

Don't rush to build big things. Get a small loop running first. Don't rush to do the right thing. Finish what's in front of you. Infrastructure will activate itself one day. Knowledge will assemble itself one day.

Continuing from here.]]></content:encoded>
    </item>
    <item>
      <title>Everyone has their own understanding of journaling and personal growth. Late at …</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-11-drift</guid>
      <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
      <description>Everyone has their own understanding of journaling and personal growth. Late at night I stumbled upon a design I really love, and some ideas suddenly clicked.

Drift</description>
      <content:encoded><![CDATA[Everyone has their own understanding of journaling and personal growth. Late at night I stumbled upon a design I really love, and some ideas suddenly clicked.

Drift]]></content:encoded>
    </item>
    <item>
      <title>A small, arguably useless milestone: after a few PRs, my avatar now sits alongsi…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-09-codexbar-contributor</guid>
      <pubDate>Thu, 09 Apr 2026 10:30:00 GMT</pubDate>
      <description>A small, arguably useless milestone: after a few PRs, my avatar now sits alongside Peter — the creator of OpenClaw — in the Contributors section of his other open-source project, CodexBar.

The logic of GitHub PRs has actually changed in the AI era. When I contribute to open-sour...</description>
      <content:encoded><![CDATA[A small, arguably useless milestone: after a few PRs, my avatar now sits alongside Peter — the creator of OpenClaw — in the Contributors section of his other open-source project, CodexBar.

The logic of GitHub PRs has actually changed in the AI era. When I contribute to open-source projects, I just fix bugs that I find basic and annoying, purely from a user's perspective.

The code I contribute might be messy (it's not even mine — my Agent writes it, and I just do what a user and product manager should do). But before my messy code arrived, the existing logic wasn't exactly clean either.

All I want to do is contribute from the user's point of view, as best I can.

![codexbar-contributors](https://img.bryantchen.cc/blog/2026-04-09-codexbar-contributors.png)

![my-commits](https://img.bryantchen.cc/blog/2026-04-09-codexbar-my-commits.png)]]></content:encoded>
    </item>
    <item>
      <title>Reflections on a Good Life</title>
      <link>https://bryantchen.cc/en/posts/reflections-on-a-good-life</link>
      <guid isPermaLink="true">https://bryantchen.cc/en/posts/reflections-on-a-good-life</guid>
      <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
      <description>My best week in the past two: a steadier routine, continuous building, clearer positioning, writing, exercise, and remembering AI is a means, not the point of being human.</description>
      <content:encoded><![CDATA[I often get a lot of thoughts in the shower, then forget them right after. I have to sit down and think again to recall what was actually important.

This week has been my best in the past two weeks, and it feels worth recording. Why?

1. A relatively regular schedule: sleep before 3am, wake at 9am. Eat before 2pm, then walk by the river and in the park. Focus hard on the product in the afternoon. When I get tired around dusk, make some tea. Keep working at night. Around 9:30pm, go run 3km outdoors. Eat dinner at 10pm. (Thinking about it, meal times are still a bit irregular. The rest is okay. I could sleep earlier and wake earlier.)

2. Keep building. Don’t let fear drive the day. Even if fear shows up, work through it by continuing to build and adjusting my mindset, while also studying good products and asking how my own product can be constructed to catch up.

3. Today I snapped back a bit: even if many people are doing similar things, or I started late, that doesn’t mean there’s zero opportunity. I still need to find the right target users, build real differentiation, and think about why someone would choose me. As an indie developer, it’s hard to win by pure speed or resources against teams, but I can be myself.

4. Renovating my personal homepage, and continuously writing these small thoughts, genuinely heals me.

5. What is a good life? Writing, reading, exercising, sunlight, good food, and a good routine. That’s basically it. But so often I forget these because I’m always “on the way” to something else. Distinguishing goals from means matters. AI is a means, not the purpose of being human. Don’t get it backwards. Make good work, and live a good life.]]></content:encoded>
    </item>
    <item>
      <title>The moment I felt AI truly gets me — this screenshot says it all. While writing …</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-08-it-gets-me</guid>
      <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
      <description>The moment I felt AI truly gets me — this screenshot says it all. While writing my weekly plan, it warned me:

- Don&apos;t do this week: any new side projects (all frozen), bryantchen.cc feature development (RSS is done, enough), offline social events (unless they directly bring payi...</description>
      <content:encoded><![CDATA[The moment I felt AI truly gets me — this screenshot says it all. While writing my weekly plan, it warned me:

- Don't do this week: any new side projects (all frozen), bryantchen.cc feature development (RSS is done, enough), offline social events (unless they directly bring paying users)

- One-line goal: 23 days until the end of April. The only thing this week is to get **real users actually using MemoryX**

It really gets me.

![weekly-plan](https://img.bryantchen.cc/blog/2026-04-08-it-gets-me.png)]]></content:encoded>
    </item>
    <item>
      <title>Building products in the AI era has a sufficient but not necessary condition: fr…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-07-product-spectacle</guid>
      <pubDate>Tue, 07 Apr 2026 14:17:00 GMT</pubDate>
      <description>Building products in the AI era has a sufficient but not necessary condition: from day one, you probably need to think about how to create a “product spectacle.”

A product spectacle isn&apos;t always something you can plan for, but if you don&apos;t think about it from day one, it definit...</description>
      <content:encoded><![CDATA[Building products in the AI era has a sufficient but not necessary condition: from day one, you probably need to think about how to create a “product spectacle.”

A product spectacle isn't always something you can plan for, but if you don't think about it from day one, it definitely won't exist. And if, after building a product, you feel it's hard to create that spectacle, it's very likely it won't succeed or go viral.]]></content:encoded>
    </item>
    <item>
      <title>Seeing a friend’s project get reverse engineered and then open-sourced on GitHub…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-07-ship-before-open</guid>
      <pubDate>Tue, 07 Apr 2026 13:27:00 GMT</pubDate>
      <description>Seeing a friend’s project get reverse engineered and then open-sourced on GitHub made me realize build in public has changed. You now have to ship with a relatively high level of completeness, market it, and sell it. Otherwise you’re in a passive position. Also, stay close to you...</description>
      <content:encoded><![CDATA[Seeing a friend’s project get reverse engineered and then open-sourced on GitHub made me realize build in public has changed. You now have to ship with a relatively high level of completeness, market it, and sell it. Otherwise you’re in a passive position. Also, stay close to your real users and stay away from developers.]]></content:encoded>
    </item>
    <item>
      <title>The minimum viable loop of a commercial product is what &quot;development complete&quot; a…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-07-minimum-viable-loop</guid>
      <pubDate>Tue, 07 Apr 2026 11:46:00 GMT</pubDate>
      <description>The minimum viable loop of a commercial product is what &quot;development complete&quot; actually means. That loop is: a working demo, basic login, basic payment and subscription, and a website. Launch it, run a beta, get at least one paying user. That&apos;s the minimum viable loop.

Anything ...</description>
      <content:encoded><![CDATA[The minimum viable loop of a commercial product is what "development complete" actually means. That loop is: a working demo, basic login, basic payment and subscription, and a website. Launch it, run a beta, get at least one paying user. That's the minimum viable loop.

Anything less doesn't count.]]></content:encoded>
    </item>
    <item>
      <title>What is a one-person company really pursuing?

People have been asking me this a…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-04-04-one-person-company-pmf</guid>
      <pubDate>Sat, 04 Apr 2026 00:27:00 GMT</pubDate>
      <description>What is a one-person company really pursuing?

People have been asking me this a lot lately. My answer right now is simple: first, freedom; second, the ability to generate your own cash flow and truly take responsibility for outcomes. Don’t just entertain yourself. Build products...</description>
      <content:encoded><![CDATA[What is a one-person company really pursuing?

People have been asking me this a lot lately. My answer right now is simple: first, freedom; second, the ability to generate your own cash flow and truly take responsibility for outcomes. Don’t just entertain yourself. Build products people are actually willing to pay for, and form a complete business loop.

Another question I’ve been sitting with recently is this: what kinds of entry points are actually suitable for a small team or a one-person company? And which directions are really just good stories, but not a fit for a company at my stage? Once you think that through, a lot of things become naturally clearer.

Run through PMF as early as possible. Keep going.]]></content:encoded>
    </item>
    <item>
      <title>When you realize a product&apos;s form factor feels wrong, should you cut your losses…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-03-31-vibe-coding-trap</guid>
      <pubDate>Tue, 31 Mar 2026 17:23:00 GMT</pubDate>
      <description>When you realize a product&apos;s form factor feels wrong, should you cut your losses immediately or struggle with it a bit longer? I&apos;ve been thinking about this recently.

Since becoming an indie developer, the most frustrating part is that &quot;Vibe Coding&quot; easily dilutes your focus as ...</description>
      <content:encoded><![CDATA[When you realize a product's form factor feels wrong, should you cut your losses immediately or struggle with it a bit longer? I've been thinking about this recently.

Since becoming an indie developer, the most frustrating part is that "Vibe Coding" easily dilutes your focus as a product manager. You end up spending too much time just building and rushing to ship. I need to stay vigilant about this: building a product must start with capturing real user needs and defining a differentiated experience. Always remember the "424 rule" for time allocation: 40% finding needs + 20% development + 40% marketing. Don't get the priorities backward.]]></content:encoded>
    </item>
    <item>
      <title>Rewatching Jia Zhangke&apos;s &quot;Mountains May Depart&quot; on Sunday night. His imagination…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-03-31-mountains-may-depart-software</guid>
      <pubDate>Tue, 31 Mar 2026 17:01:00 GMT</pubDate>
      <description>Rewatching Jia Zhangke&apos;s &quot;Mountains May Depart&quot; on Sunday night. His imagination for electronic devices in 2025 was transparent liquid glass, though the GUI still felt stuck in 2014. It has to be said: the hardware of 2025 we imagined hasn&apos;t quite arrived, but software has vastly...</description>
      <content:encoded><![CDATA[Rewatching Jia Zhangke's "Mountains May Depart" on Sunday night. His imagination for electronic devices in 2025 was transparent liquid glass, though the GUI still felt stuck in 2014. It has to be said: the hardware of 2025 we imagined hasn't quite arrived, but software has vastly exceeded human imagination. Ordinary people often underestimate the development of software while overestimating the advancement of hardware.]]></content:encoded>
    </item>
    <item>
      <title>Several Observations About Myself and the World Around Me</title>
      <link>https://bryantchen.cc/en/posts/several-observations-about-myself-and-the-world</link>
      <guid isPermaLink="true">https://bryantchen.cc/en/posts/several-observations-about-myself-and-the-world</guid>
      <pubDate>Sat, 28 Mar 2026 01:26:00 GMT</pubDate>
      <description>A set of notes on staying up late, AI, shipping, spring, natural rhythms, and the observer&apos;s point of view.</description>
      <content:encoded><![CDATA[Several observations about myself and the world around me:

## 1. Staying Up Late and Rhythm

Staying up late is a bad thing. Over the past few workdays, my schedule seems to have flipped around a bit. Of course, as a one-person company, I don't really have a strict distinction between workdays and non-workdays, but staying up late throws off any regular rhythm in sleep and work, and that's never good.

## 2. Talk More With People Who Haven't Really Used AI

After talking to too many people who work in AI lately, I feel like the next step is to talk more with people who haven't really been exposed to AI. Their needs and pain points may be the most important ones.

People who work in AI tend to go to two extremes: first, they're a bit too crazy and think they can do anything; second, they think anyone who doesn't embrace AI is an idiot. Yes, I'm also criticizing myself here. But ever since the first day I studied Cybernetics, I've remembered something one of the founding figures said: "Humans have their own use."

## 3. Public Activity Before a Change

If someone starts making bold takes or becomes very active in public, it usually proves a few things: first, something is about to change in their work; second, they're peacocking before fundraising or getting ready to start a company.

## 4. On Shipping and Craftsmanship

I always see people saying that "a product is ready to ship when it's 30% done," but around me there are also people who try to make a product as good as they can before releasing it. Especially after listening today to the latest episode of 诗梳风 and the conversation with 谜底61, I felt a kind of steadiness. I hope people with a real craftsman's spirit can be rewarded by users.

## 5. Beijing's Spring

The moment that moved me most today was this — I went out for a bike ride in the afternoon and saw flowers blooming by the roadside. So this is what spring in Beijing really is. What exactly did I see during the springs when I was 25 to 30? A whole life's plan begins in spring.

## 6. A Day Begins in the Morning

Coming back to it: a day begins in the morning, so stop staying up late. I suddenly understand Birdwatching a little more. Beyond being close to nature, there is something beautiful about waking up with nature's rhythm and participating in it as an observer.

## 7. The Owl's Point of View

That reminds me of a scene from The Ballad of Buster Scruggs that I watched last weekend, where the story in the gold-mining valley is recorded from something like an owl's point of view. It's such a good perspective. Now that I'm well into my thirties, I finally understand this film, and I finally understand what "Heaven and earth are not benevolent; they treat all things as straw dogs" is really getting at.]]></content:encoded>
    </item>
    <item>
      <title>I&apos;m slowly accepting something:

You don&apos;t have to put a whole big product in fr…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-03-28-memoryx-plugin-first</guid>
      <pubDate>Sat, 28 Mar 2026 01:16:00 GMT</pubDate>
      <description>I&apos;m slowly accepting something:

You don&apos;t have to put a whole big product in front of the world for it to count as shipping.

For me, MemoryX may have already missed its best moment to be launched as a complete product.
But that doesn&apos;t mean what&apos;s inside it has no value.

A mor...</description>
      <content:encoded><![CDATA[I'm slowly accepting something:

You don't have to put a whole big product in front of the world for it to count as shipping.

For me, MemoryX may have already missed its best moment to be launched as a complete product.
But that doesn't mean what's inside it has no value.

A more realistic path might be to ship the extension first.
Let a smaller, more specific slice meet the world and collect real signals.

Sometimes shipping isn't about telling the whole story at once.
It's about giving the world the part that feels the most alive first.]]></content:encoded>
    </item>
    <item>
      <title>Three Guiding Axes for Entrepreneurship and Product</title>
      <link>https://bryantchen.cc/en/posts/entrepreneurship-three-axes</link>
      <guid isPermaLink="true">https://bryantchen.cc/en/posts/entrepreneurship-three-axes</guid>
      <pubDate>Thu, 26 Mar 2026 01:11:00 GMT</pubDate>
      <description>A late-night reflection on balancing personal passion with market demand and business viability.</description>
      <content:encoded><![CDATA[Here are a few principles for getting things done in entrepreneurship.

Think of them as three coordinate axes:

1. **What you love**: This measures whether you actually like what you're doing, whether you're willing to pour your energy and willpower into it, and whether it aligns with your personal aesthetics. However, this axis alone can't decide too many things. It only determines how far you can go and whether the product reflects your character and taste.
2. **What users need**: This is actually the most important one. Often, what you like isn't necessarily what users need, or perhaps there simply aren't that many users who need it. When evaluating a new project, you must build something that users actually need, not just something you happen to like.
3. **What the market will pay for (financial return)**: Without this, nothing else holds up. Entrepreneurship is a marathon. If you want to reach the finish line, you must do things the market is willing to pay for and that can generate a positive commercial return.

Evaluating what I've been doing over the past two months, most of it has landed on axis 1, with too little focus on axes 2 and 3. I need to reflect on this.

Additionally, considering competition is an absolute must. There are some things you simply can't win just by trying to out-work or "out-involution" others. Self-reflection is needed, but we still have to try our best to get there! That is the only way to improve our win rate.]]></content:encoded>
    </item>
    <item>
      <title>A few recent moments have helped me understand why, if you create content, you n…</title>
      <link>https://bryantchen.cc/en/thoughts</link>
      <guid isPermaLink="false">https://bryantchen.cc/en/thoughts/2026-03-24-multi-platform-publishing</guid>
      <pubDate>Tue, 24 Mar 2026 15:42:00 GMT</pubDate>
      <description>A few recent moments have helped me understand why, if you create content, you need to publish across multiple platforms. It seems like common sense, but human nature — mainly laziness and indifference toward certain platforms — makes us overlook this:

1. Traffic rules on any si...</description>
      <content:encoded><![CDATA[A few recent moments have helped me understand why, if you create content, you need to publish across multiple platforms. It seems like common sense, but human nature — mainly laziness and indifference toward certain platforms — makes us overlook this:

1. Traffic rules on any single platform are essentially random events. Take Xiaohongshu (RED) for example — as a beginner, it's really hard to figure out what gets traction and what doesn't. But as a creator, ignore the randomness of metrics. Just share sincerely, be genuinely helpful, and stick to those principles. Content produced this way might flop on Platform A but take off on Platform B.

A concrete example: I recently shared ClawPuter's Build in Public content. The first four episodes did great on Xiaohongshu, but episode five — where I put extra effort into the cover design and edited with CapCut — got zero traction. What I didn't expect was that WeChat Stickers' recommendation algorithm gave this episode a ton of traffic over the past two days. This is what they call "when the east doesn't shine, the west will."

2. Behind multi-platform publishing, there's another reason: if you're making good content, when you don't publish it somewhere, someone else might repost or remix it. If you don't publish, someone else will. Rather than watching your metrics get claimed by others, it's worth casually posting on other platforms too. Sure, your original content might perform worse than someone else's remix. But you won't know unless you try.

The above is purely a beginner's practical sharing — take it with a grain of salt.]]></content:encoded>
    </item>
  </channel>
</rss>
