First Shipment: Setting the Baseline
Editor’s Note: Every journey needs a starting point. This blog is mine. It’s not just a collection of articles, but a living product log where I document the reality of building for the global market as a beginner.
Context
For over 10 years, I’ve been writing code for others. As a Senior Engineer, I was comfortable with technology but increasingly distant from the product itself. I wanted to change that. I wanted to build, ship, and grow my own products.
But “Indie Hacking” is overwhelming. There are endless things to learn: marketing, SEO, design, copywriting, legal compliance… The list goes on.
I realized I needed a home base. A place to:
- Document my learnings (to solidify them).
- Showcase my work (to build credibility).
- Experiment with growth tactics (SEO, analytics, monetization) in a low-risk environment.
So, I decided to treat this blog as my Product #0.
The Challenge
The goal was simple: Ship a production-ready blog in 24 hours.
However, “production-ready” for an indie hacker means more than just hugo new site. It requires:
- Performance: Must be blazing fast (Core Web Vitals).
- SEO: Sitemap, robots.txt, semantic HTML, meta tags.
- Analytics: Google Analytics 4 (to track traffic).
- Monetization Ready: Google AdSense integration (ads.txt, placeholders).
- Compliance: ICP Beian (for China access) + Global accessibility (Vercel).
- Workflow: Zero-friction deployment (Push to Git -> Live).
The Solution
I chose a minimalist tech stack to focus on content and speed:
1. The Stack
- Engine: Hugo (Static Site Generator). It’s incredibly fast and produces zero-dependency HTML.
- Hosting: Vercel. Free, fast global CDN, and automatic Git deployments.
- Theme: Custom-built “Portfolio + Log” theme. I didn’t want a generic template. I wanted a specific “Shipping” focus.
2. Key Implementations
The “Portfolio First” Layout I modified the homepage to prioritize Products over Posts.
{{ range .Site.Data.projects }}
<a href="{{ .url }}" class="project-card">
<div class="project-icon"><img src="{{ .icon }}" ...></div>
<!-- ... -->
</a>
{{ end }}
Production Hygiene
I set up a rigorous hugo.toml configuration to ensure search engines and ad networks are happy:
enableRobotsTXT = true- Custom
layouts/partials/head.htmlfor conditional GA4/AdSense injection (production only). ads.txtin the static folder to verify inventory ownership.
Cross-Border Accessibility
- China: Hosted on a specific domain/server with ICP filing (future plan).
- Global: Vercel handles the rest of the world.
- Build System: Used
hugo-binand custom npm scripts to avoid local dependency hell and ensure consistent builds across Windows/Mac/CI.
Results & Learnings
I successfully shipped v1.0 within the timeframe.
What I learned:
- Don’t over-engineer: A simple static site is powerful enough.
- Content is King, Distribution is Queen: Building the blog was the easy part. Writing consistently and getting readers will be the real challenge.
- Small wins matter: Seeing the “WeChat QR Code” and “Project Cards” render correctly gave me a disproportionate amount of joy. It feels real now.
What’s Next? Now that the baseline is set, I will focus on Project Alpha (a productivity tool) and Mindgift. I will log every major milestone here.
Stay tuned.
About the Author
Amiko is a software engineer turned indie hacker, learning to build and sell to the global market. Follow my journey on X (Twitter) or subscribe to the RSS Feed.