AI Tips Ladder · Full Guides
The complete walkthroughs from that post
THU · JUL 23 · ED 568
BEGINNER
WORKFLOW
01 · Your Quick-Win SEO Pages Are Hiding
Pages ranking in positions 4–15 already have relevance signals Google accepts; a sharper title and meta description is often the smallest change that moves them onto page one, where click-through rates are several times higher. Use this monthly, or whenever traffic plateaus, because it targets pages you are already close to winning instead of creating new content.
- 01Open search.google.com/search-console, sign in, and select your site property from the dropdown in the top-left corner.
- 02In the left sidebar click Performance (or Performance > Search results). Above the chart, click the 'Average CTR' and 'Average position' tiles so both metrics are enabled, and set the date filter above the chart to 'Last 3 months'.
- 03In the table below the chart, select the 'Queries' tab, then click the 'Position' column header to sort ascending. GSC has no built-in position-range filter, so either scroll to the rows showing positions 4–15, or click Export (top right) > Google Sheets and filter the Position column for values between 4 and 15 there.
- 04For each qualifying query, click the query in the table, then switch to the 'Pages' tab to see which URL ranks for it. Record the top 5 URL + query pairs with their position, clicks, and impressions.
- 05Collect each page's current title tag and meta description: open the page, view the page source (Ctrl+U / Cmd+Option+U) and copy the <title> and <meta name="description"> values, or read them from your CMS SEO fields.
- 06Run the rewrite prompt below in your AI tool once per page, filling in the placeholders, and review the output for accuracy — the title must still describe what the page actually delivers.
- 07Paste the new title and meta description into your CMS. In WordPress with Yoast or AIOSEO, edit the page and update the 'SEO title' and 'Meta description' fields in the SEO panel, then save/publish. In other CMSs, search the page settings for 'SEO' or 'meta'.
- 08Back in Search Console, paste each updated URL into the URL Inspection bar at the top and click 'Request indexing'. Re-check the same queries in Performance after 2–3 weeks using the date comparison tab.
You are an SEO copywriter. Rewrite the title tag and meta description for the page below to lift click-through rate for its target query, without changing the page's meaning or over-promising.
URL: [PASTE URL]
Target query: [PASTE QUERY]
Current position: [PASTE POSITION]
Current title: [PASTE TITLE]
Current meta description: [PASTE META]
Rules:
- Title: max 60 characters, put the target query (or a close variant) near the front, add one concrete differentiator (number, year, outcome, or audience).
- Meta description: max 155 characters, one clear benefit plus a reason to click now; no clickbait, no keyword stuffing.
- Keep brand name at the end of the title if one exists.
Return 3 title options and 2 meta description options, then mark which pairing you recommend and why in one sentence.
Watch out: 'Average position' is an average across all queries and impressions — a page showing 8 may rank 3 for one query and 40 for another, so always check position per query, not per page. · Only change the title tag and meta description; never touch the URL slug while doing this, or you'll reset the rankings you're trying to improve. · Google rewrites titles it considers poor matches, and metas are suggestions, not guarantees — if your new title isn't shown in results after a few weeks, it likely doesn't match query intent closely enough. · Don't judge results after a few days; positions fluctuate naturally, so compare equal date ranges 2–3 weeks apart before iterating again.
INTERMEDIATE
TOOLS
02 · Your Own Private ChatGPT, No Cloud Needed
You get a ChatGPT-style assistant that runs entirely on your own machine: no subscription, no per-token fees, and no client data ever leaving your computer. Use it for confidential work (contracts, client notes, medical or legal text), offline environments like flights, or as a free local backend for any tool that expects an OpenAI API.
- 01Go to ollama.com/download and install for your OS: on macOS drag Ollama.app to Applications, on Windows run OllamaSetup.exe, on Linux run: curl -fsSL https://ollama.com/install.sh | sh
- 02Open a terminal and confirm the install with: ollama --version (Ollama also starts a background server on localhost:11434)
- 03Download the model with: ollama pull gpt-oss:20b — it is roughly a 13 GB download, wait until it prints 'success'
- 04Start chatting with: ollama run gpt-oss:20b — type your question at the >>> prompt; type /bye to exit
- 05In a second terminal run: ollama ps — the PROCESSOR column should say '100% GPU'; if part shows CPU, responses will be much slower
- 06Connect any OpenAI-compatible app (chat UIs, IDE plugins, scripts): set Base URL to http://localhost:11434/v1, API key to any non-empty string such as 'ollama', and model name to gpt-oss:20b
- 07Test the API end-to-end with the curl snippet below — a JSON reply containing 'choices' proves any OpenAI-style tool can now use your local model
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss:20b",
"messages": [
{"role": "user", "content": "Draft a polite 3-line follow-up email to a client who missed our call."}
]
}'
Watch out: The first run can sit silent for a long time while the ~13 GB model downloads — run 'ollama pull gpt-oss:20b' first so you can see progress instead of assuming it froze. · With under ~16 GB of free VRAM the model spills into system RAM and slows to a crawl; close other GPU-heavy apps or fall back to a smaller model like llama3.1:8b. · Ollama's default context window is small (~4k tokens), so long documents get silently truncated — raise it inside a chat with '/set parameter num_ctx 16384' before pasting big files.
ADVANCED
AUTOMATION
03 · Your Inbox Can Triage Itself
Email triage is repetitive classification work, and this offloads the 80% of it that is routine: a scheduled agent reads your inbox overnight, archives the noise, and leaves pre-written reply drafts for everything that needs you. You start the day approving and sending drafts instead of composing from zero. Worth it once you receive roughly 20+ real emails a day and reply latency matters.
- 01In Google Cloud Console (console.cloud.google.com), create a project, open APIs & Services > Library and enable 'Gmail API', then go to APIs & Services > Credentials > Create Credentials > OAuth client ID, choose 'Desktop app', and download the JSON key.
- 02Run: mkdir -p ~/.gmail-mcp and save the downloaded key as ~/.gmail-mcp/gcp-oauth.keys.json.
- 03Run: npx @gongrzhe/server-gmail-autoauth-mcp auth — a browser window opens; approve the Gmail scopes; tokens are saved to ~/.gmail-mcp/credentials.json.
- 04Register the server with Claude Code: claude mcp add gmail -- npx @gongrzhe/server-gmail-autoauth-mcp, then confirm it shows as connected with: claude mcp list.
- 05Save the triage prompt (snippet below) as ~/triage.md, then test interactively: run claude, tell it to run the instructions in ~/triage.md, and approve each gmail tool call once.
- 06Do a headless dry run: claude -p "$(cat ~/triage.md)" --allowedTools "mcp__gmail__search_emails,mcp__gmail__read_email,mcp__gmail__draft_email,mcp__gmail__modify_email,mcp__gmail__batch_modify_emails" — send_email is deliberately left off the allowlist.
- 07Get the absolute binary path with: which claude, then run crontab -e and add one line: 0 7 * * * /full/path/to/claude -p "$(cat $HOME/triage.md)" --allowedTools "mcp__gmail__search_emails,mcp__gmail__read_email,mcp__gmail__draft_email,mcp__gmail__modify_email,mcp__gmail__batch_modify_emails" >> $HOME/triage.log 2>&1
- 08Each morning open Gmail > Drafts, edit and send the replies you approve, and skim ~/triage.log for anything the agent listed as UNSURE.
Triage my Gmail inbox.
1. Fetch every unread email from the last 24 hours (skip spam and promotions).
2. Classify each one as exactly one of:
- ACT: needs a reply from me
- DELEGATE: someone else should own it
- ARCHIVE: newsletters, receipts, FYIs, automated notifications
3. For every ACT email: create a DRAFT reply (never send). Tone: brief, direct, no filler.
4. For every DELEGATE email: create a draft forward note naming the owner and the one thing they must do.
5. For every ARCHIVE email: archive it (remove the INBOX label).
Hard rules:
- Drafts only. Never send, never delete.
- If a real person is waiting on me and you are unsure, classify as ACT.
- If confidence is low, leave the email untouched and list it under UNSURE.
End with a summary: sender | subject | class | action taken.
Watch out: Google OAuth apps left in 'Testing' mode expire refresh tokens after 7 days — publish the app to production (or re-run the auth command weekly) or the cron run dies silently. · cron runs with a minimal PATH — always use the absolute path to the claude binary and redirect output to a log file, or failures are invisible. · Keep send_email and delete_email out of --allowedTools: a misclassification then costs you a wrong draft, not a sent email — and archiving is reversible (mail stays in All Mail).
PRO
AGENTS
04 · Ship A Nightly AI Employee
The agent does the first 30 minutes of your workday while you sleep: pulls the numbers, explains what moved, files the follow-ups, and posts a finished brief to Slack. Worth setting up for any daily check you currently do by hand, as long as the metrics are reachable from a terminal (API, CLI, or database).
- 01Install and sign in: npm install -g @anthropic-ai/claude-code, then run claude once in a terminal to log in (or export ANTHROPIC_API_KEY to bill the API directly).
- 02Make a folder the agent will work in: mkdir -p ~/nightly-agent/data ~/nightly-agent/briefs, and add a pull_metrics.sh script (or notes on how to query your metrics API) so the agent has something to pull.
- 03Save the snippet below as two files: ~/nightly-agent/job.md (the whole job as one prompt) and ~/nightly-agent/run.sh, then chmod +x ~/nightly-agent/run.sh.
- 04Get a Slack webhook: at api.slack.com/apps create an app, enable Incoming Webhooks, add one for your channel, and paste the URL into run.sh (Telegram alternative: create a bot via @BotFather and curl its sendMessage endpoint instead).
- 05Fill in the CLAUDE= line in run.sh with the output of running which claude in your normal shell — cron will not have your PATH.
- 06Dry-run it in daylight: ~/nightly-agent/run.sh, read what lands in Slack, and edit job.md until one full run completes with no surprises.
- 07Schedule it: crontab -e, add the line 0 6 * * * $HOME/nightly-agent/run.sh >> $HOME/nightly-agent/cron.log 2>&1 and save.
- 08Babysit the first week: skim cron.log each morning and add one rule to job.md for every mistake it made, then leave it alone.
# ---- ~/nightly-agent/job.md ----
You are my nightly ops analyst. Work inside this folder only.
1. Run ./pull_metrics.sh and save the raw output to data/<today>.json. If the pull fails, the brief is only: what failed, when, the exact error. Stop there.
2. Compare today's key metrics against the trailing 7 days of files in data/.
3. Write briefs/<today>.md - max 5 bullets: what moved, the likely cause, the first thing a human should check.
4. For any metric more than 20% off its 7-day average, file a ticket: gh issue create --title "[anomaly] <metric>" --body "<numbers and context>" (no gh configured? append to tickets.md instead).
5. Print the finished brief as your final message; it is posted to Slack as-is.
Rules: never invent a number. No filler. If nothing moved, say "Quiet night." and stop.
# ---- ~/nightly-agent/run.sh ----
#!/bin/bash
CLAUDE=/paste/output/of/which-claude
WEBHOOK=https://hooks.slack.com/services/XXX/YYY/ZZZ
cd "$HOME/nightly-agent"
BRIEF="$("$CLAUDE" -p "$(cat job.md)" --allowedTools "Bash,Read,Write" 2>&1)"
printf '%s' "$BRIEF" | python3 -c 'import json,sys; print(json.dumps({"text": sys.stdin.read()[:3900]}))' | curl -s -X POST -H 'Content-type: application/json' -d @- "$WEBHOOK"
Watch out: Cron runs with an almost empty environment - no PATH, no shell profile, no aliases. Use absolute paths for everything and keep secrets in the script or a file it sources, never in .zshrc. · Headless mode cannot answer permission prompts: without --allowedTools the agent quietly skips the tools it needs and finishes with half the job undone. Grant exactly Bash, Read, Write - nothing more. · A broken job and a quiet night look identical in Slack. Keep >> cron.log 2>&1 on the cron line and make the prompt report failures explicitly instead of improvising numbers.
🛠️ We build the AI systems & automations behind tips like these.
Follow @conon.ai for the daily brief — news + tips, every day.