115 lines
5.8 KiB
Markdown
115 lines
5.8 KiB
Markdown
# Content Guide — what to write & what to avoid
|
||
|
||
Read this **before** planning or writing any post on blog.hoelee.com. It encodes the positioning, taxonomy, post types, cadence, and anti-patterns so every piece of content serves the two goals: get hired, and win freelance clients.
|
||
|
||
---
|
||
|
||
## 1. The job of every post
|
||
|
||
A post is not "content marketing". It is a **proof-of-expertise artifact**. After reading it, a recruiter or client should think: *"this person can actually do this, and I trust how they explain it."*
|
||
|
||
Two hard rules flow from that:
|
||
1. **Attach your identity to every post** — photo, bio, links. Anonymous content kills E-E-A-T and defeats the whole purpose.
|
||
2. **Pitch to learners, not experts.** Most search traffic comes from people learning. Write down, not up.
|
||
|
||
---
|
||
|
||
## 2. Categories (stable — don't invent new ones casually)
|
||
|
||
Use these 7 categories. Everything else is a free-form **tag** (`traefik`, `solidity`, `gitea`, `n8n`…).
|
||
|
||
| Category | What goes in it |
|
||
|---|---|
|
||
| `engineering` | Java/Spring, PHP/CodeIgniter, React/TS, WordPress deep dives |
|
||
| `devops` | Docker/Portainer, Traefik, Cloudflare tunnels, NAS, backups, monitoring — **my most differentiated material** |
|
||
| `ai` | n8n workflows, Telegram bots, local LLM (LM Studio), mem0 memory stack, TTS |
|
||
| `web3` | Solidity, Foundry/Hardhat, ERC-20/721, Chainlink — honestly framed |
|
||
| `tutorials` | Beginner-facing how-tos |
|
||
| `case-studies` | "How I built X" — the portfolio |
|
||
| `notes` | Short low-friction entries: fixes, gotchas, link roundups |
|
||
|
||
---
|
||
|
||
## 3. Post types that work (ranked by hiring ROI)
|
||
|
||
1. **"How I built X" case studies** — highest value. Recruiters read these. (DigiKedai bot, self-hosted mem0, mailcow email platform, NAS product delivery, SifuMail.)
|
||
2. **"Hard problem → solution" tutorials** — e.g. "The Traefik forward-auth gotcha that cost me a day", "Site-to-site OpenVPN behind CGNAT".
|
||
3. **Gotcha / debugging posts** — short, extremely Google-friendly, compound over time.
|
||
4. **Tool roundups & comparisons** — I have genuine first-hand material (Astro vs WP, Gitea vs GitHub, Foundry vs Hardhat).
|
||
5. **Config / recipe posts** — reusable Traefik/Docker/Pi-hole configs with explanation.
|
||
|
||
---
|
||
|
||
## 4. The "hard job done → public post" template
|
||
|
||
When I finish a difficult piece of work, publish with this shape. It is simultaneously a tutorial, a case study, and a proof-of-expertise — the highest-ROI post type I can write.
|
||
|
||
```
|
||
① The problem → phrased as the searchable question a learner would type
|
||
② What I tried & why it failed → the debugging story (this is what no one else can copy)
|
||
③ The fix → runnable code/config, explained
|
||
④ What I'd do differently → shows judgment, not just luck
|
||
⑤ The result → one quantified outcome
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Cadence
|
||
|
||
- **Realistic target:** 2 posts/month to start, then 1/week.
|
||
- Sonmez playbook: Month 1–2 = 1/week → Month 3 = 2/week → Month 4+ = 1–2/week mixing 500-word tactical posts with 2,000+ word guides.
|
||
- **Ship a `notes` entry anytime** I solve something — keeps the feed alive between deep posts.
|
||
- Long guides bring search traffic; short posts keep me consistent.
|
||
|
||
---
|
||
|
||
## 6. Frontmatter shape (reference)
|
||
|
||
```yaml
|
||
---
|
||
title: "How I built the DigiKedai Telegram bot"
|
||
description: "A ~155-char meta description with the target keyword."
|
||
pubDate: 2026-09-06
|
||
category: case-studies
|
||
tags: ["telegram", "n8n", "docker", "cloudflare"]
|
||
ogImage: "/og/digikedai-bot.png" # 1200×630, custom per post
|
||
draft: false
|
||
---
|
||
```
|
||
|
||
**No `lang:` field** — language is derived from the file location:
|
||
- `posts/hello-world.md` → English (`en`)
|
||
- `posts/zh/hello-world.md` → Chinese (`zh`), served at `/posts/zh/hello-world/`
|
||
|
||
---
|
||
|
||
## 7. What to AVOID (anti-patterns)
|
||
|
||
| Anti-pattern | Why it hurts |
|
||
|---|---|
|
||
| **Anonymous / no author identity** | Kills E-E-A-T; defeats the name-search strategy. Always show photo + bio + sameAs links. |
|
||
| **Writing for experts, not learners** | Most search traffic is beginners. |
|
||
| **AI-spam / content-farm filler** | Google aggressively demotes unedited AI churn. My first-hand case studies are the moat — never dilute them with filler. |
|
||
| **Perfectionism before publishing** | Procrastination. Ship it, edit later. A dormant blog is worse than an imperfect one (mine was dormant Dec 2023 → now). |
|
||
| **Reused logo as og:image** | Every post needs its own 1200×630 image, or shares look broken. |
|
||
| **Orphaned / thin pages** | hoelee.com has ~400 orphaned image-attachment pages. Don't recreate — keep the sitemap clean. |
|
||
| **Hosting on Medium/Dev.to as primary** | Platform risk + no SEO ownership. Use them for **syndication only** (cross-post + canonical back to my domain). |
|
||
| **Overclaiming Web3 experience** | Be honest: "learning Foundry, deployed test ERC-20/721" is credible; "production DeFi engineer" is not yet. |
|
||
| **Broken resume/CV link** | About page + author bio must link a *working* resume. Fix the source of truth. |
|
||
| **Monetizing before audience** | No ads, sponsored posts, or ebooks yet. Build trust + traffic for a year first. |
|
||
|
||
---
|
||
|
||
## 8. i18n policy
|
||
|
||
- **English is primary and non-negotiable** — the whole SEO strategy targets English queries.
|
||
- **Chinese (zh): translate every post.** Same filename in `posts/zh/` (auto language-switch). Opens zh-SG/zh-MY search and covers bilingual recruiters.
|
||
- **Malay: skip for v1** — no dev-audience demand (the main site already has a dangling Malay config; don't repeat it).
|
||
|
||
### File layout (enforced by code)
|
||
|
||
- English posts: `src/content/posts/*.md` (flat, no subfolder).
|
||
- Chinese posts: `src/content/posts/zh/*.md` (subfolder → `/posts/zh/<slug>/`).
|
||
- Language is derived from the folder (see `src/lib/lang.ts`), so **do not** set a `lang:` field in frontmatter.
|
||
- Never let "I should translate this" block publishing an English post.
|