Skip to content

Common sticking points

This collects the spots you commonly hit on the way to a first publish. Find by symptom and read only the relevant item. For a symptom not here, copying the error message verbatim into Claude Code and asking is faster.

Python 3 isn’t installed. macOS: brew install python3. Linux and WSL2: sudo apt install -y python3 python3-pip. After installing, check with python3 --version.

Try pip3 instead of pip.

Terminal window
pip3 install -r scripts/requirements.txt

If that still fails, call it as python3 -m pip install -r scripts/requirements.txt. On a permission error, add --user.

Publishing stops at dry-run saying a file is missing

Section titled “Publishing stops at dry-run saying a file is missing”

scripts/credentials.json isn’t there. In the Google Cloud console, enable the Blogger API, issue an OAuth client ID of the desktop app type, and save it as scripts/credentials.json. The detailed screen order is in scripts/README.md.

Section titled “The consent screen doesn’t appear on first publish”

token.json is generated via browser consent on first publish. If the consent window doesn’t appear, check that credentials.json is in place (under scripts/) and was issued as the desktop app type. The consent flow is different if it was issued as a web app type.

token.json has expired or its permissions changed. Delete scripts/token.json and call publish again; the consent screen reappears and reissues the token.

The list-blogs command shows your Google account’s blog list and IDs. Write the ID of the blog the Korean version goes to into .env’s BLOG_ID_KO, and the English one’s into BLOG_ID_EN.

BLOG_ID_KO and BLOG_ID_EN may be swapped in .env. Check both IDs again and see that the Korean blog and English blog IDs are in their right slots.

The AI-smell gate fail won’t let it publish

Section titled “The AI-smell gate fail won’t let it publish”

The post’s AI-flavor score is over 60. Publishing gets blocked on purpose. Read the post once and look at the intro, paragraph lengths, and whether there’s first-person experience. The detailed way out is in when-ai-gets-stuck.

A signal that might trip ad policy got caught. Fix the spot the gate pointed at, or if it’s a post you won’t put ads on, decide whether to proceed as is.

Only the Korean version exists, no English one

Section titled “Only the Korean version exists, no English one”

You didn’t run translation, or the slug drifted. Call translation with “make the English version of the post I just wrote,” and confirm with find _workspace/posts/new -iname "*{slug}*" that the two files are paired under the same slug.

The quality gate saw the hreflang cross-reference or structure correspondence between the Korean and English versions drift. Say “realign ko/en parity” and the gate fixes the spot it pointed at.

”Permission denied: ./scripts/deploy.sh”

Section titled “”Permission denied: ./scripts/deploy.sh””

The script doesn’t have execute permission.

Terminal window
chmod +x scripts/deploy.sh

That’s when you called publish-new without a slug. Every post in staging becomes a target. To put up just one, narrow with --slug {slug}.

Open a GitHub issue or post in the team Slack. Write down three things together.

  • Where you got stuck (which step, which command)
  • The full error message
  • Environment info (operating system, Python version)