How a Telegram Bot Lets Me Run My Blog From Anywhere

EDIBLOG · 2-MONTH RETRO · BOT OPS

AI Cut My Writing 90% — But I Still Couldn’t Leave My Desktop

Hi, I’m Eddy. I’m writing this post from abroad, replying only through Telegram. After two months of running this setup, my conclusion is simple: wire Claude Code to a Telegram bot and you can basically leave your desktop off.

Writing from abroad Desktop off One-line prompt Alerts 7→2

01 · ORIGIN4 sparks that pushed me to build the bot

Bottom line. I hit a moment where being glued to my desktop felt wildly inefficient. Four things had stacked up at once.

01 · CAPTCHA BLOCK

Jobs stall

If a Tistory captcha pops up while I’m out, I can’t see it. Publishing halts and I have no way to know.

02 · OVERNIGHT FAILURES

Caught late

If a job fails at 3am, I only find out the next morning. A whole publish slot, gone.

03 · DAILY REVIEW

Stuck at the desk

Every publish meant coming back to the desk for review. No freedom to actually leave the house.

BIGGEST

04 · IDEAS

Lost on the go

Topics and ops ideas that hit me out walking died as memos. No way to apply them in the moment.

The biggest one for me was #4. I had to break the memo-it-then-forget pattern. When a topic hit me on the street, I wanted to apply it right there.

02 · MOMENTS4 moments where the bot really earns its keep

After installing the bot, four moments delivered the biggest payoff. These four, I’d argue, are the bot’s real value.

MOMENT 01 · CAPTCHA REPLY

Claude Code ships captcha screenshots to Telegram

When a captcha image lands in Telegram, I reply with the text. The bot auto-fills it and publishing continues. Jobs don’t stall even while I’m out. One glance at my phone, one-line reply, done.

Telegram captcha alert I receive — actual message

🔒 Tistory captcha detected
Time: 2026-05-10 14:22 KST
Post: AI Update — Claude Mythos Preview...
Session: jessyt

[Image attached — captcha]

Reply with just the captcha text.
No reply within 30 min → auto-abort + draft preserved.

MOMENT 02 · INTERVIEW FROM ABROAD

I’m writing this very post from abroad, via Telegram interview

The bot fires 5–6 questions per topic and I just answer. Those answers become a first-person draft as-is.

I’ve written posts this way from planes, airports, cafés. No desktop needed.

My interview polling — actual message flow

🤖 BOT: Today's topic — "Running 30 Claude Code slash commands"
        Q 1/6: What pushed you to make your first slash command?

👤 ME : Got tired of copy-pasting the same prompt every time. Once I
        forgot a line and the output came back completely different.

🤖 BOT: Q 2/6: How many are you running now? Any naming convention?
        ...

Interview answers → first-person draft conversion prompt

# interview-to-draft.md (Claude Code slash command)
---
description: Convert Telegram interview answers into a first-person draft
---

Take the interview Q&A below and write:
1. Don't quote answers verbatim — restructure as first-person flow
2. Match voice.md tone ("I tried ~", "I found ~")
3. CLAUDE.md soft rules — 80%+ first-person / cite external sources
4. Apply blog-style-guide §A~§Q
5. Save HTML to drafts/ + send Telegram preview alert

MOMENT 03 · OVERNIGHT FAILURES

“3am failures? I’m just going to sleep through them.”

24/7 alerts don’t mean 24/7 response capability — I learned that the hard way.

I decided to just pass on overnight failures. Batch them the next day. Accepting my own limits turned out to be the healthier ops mode.

MOMENT 04 · INSTANT FEATURE & QUALITY TWEAKS

The second an idea hits, I instruct the bot

When Claude Code ships a good new feature, I push the apply-it instruction through Telegram immediately. Post quality? I grade and decide through the bot too.

The biggest shift was getting an apply-on-the-spot cycle. Fastest way I found to escape the procrastinate-then-forget loop.

03 · ALARMSMy alert policy evolved with the scale of automation

When I first installed the bot, every job result became an alert. At the time I was running 7 blogs, and so many alerts came in that I stopped looking altogether.

Now I’ve trimmed alerts down to just two streams.

  • Failures batched and reported twice daily. No instant alerts — I’m going to be asleep at 3am anyway.
  • Drafts trigger instant alerts every time. That’s the exact moment my action (quality review & publish) is needed.
  • Once I scaled ops down to one focus, alerts stabilized on their own. Cutting automation, I learned, is also a skill.

My alert taxonomy — policy table

Event                    Alert policy             Why
─────────────────────────────────────────────────────────────────
Job failure (publish)    Batched 2x/day           I sleep at 3am
Captcha detected         Instant                  Reply needed in 30 min
Draft saved              Instant                  User review + publish needed
Success / progress       No alert                 "Still running" = noise
Captcha quota near       Instant + pause publish  Block captcha pile-up
Session corrupted        Instant + alert channel  Recovery procedure needed

04 · EFFECTHow my way of working changed

Comparing before and after the bot, the biggest change is being able to operate, write, and decide anywhere, anytime.

BEFORE · DESKTOP HOSTAGE

Stuck at my desk daily

  • 📍 Back at the desk daily for review
  • 🖥 Monitor on 24/7
  • ⛔ Captcha mid-outing stalls publishing
  • 💭 Ideas become memos, then evaporate
→

AFTER · BOT INTEGRATED

Phone is enough

  • 📱 Desktop barely opens
  • 🌍 Operating & writing from abroad
  • ⚡ Quality & ops decisions instant
  • 💡 Apply ideas on the spot (no evaporation)

The biggest payoff, for me, is being able to make quality and ops decisions instantly. Turning the monitor off and saving electricity is a side effect at best.

05 · BUILDMy setup started with one line

I didn’t actually write a single line of code myself. I gave Claude Code one line of instruction and it worked.

FIRST PROMPT

“Make it so I can respond via Telegram!”

— the exact one line I first typed

That’s the only line I typed. Claude Code walked me through bot token issuance, then dropped in the alert module, captcha image relay, and the interview polling loop, one step at a time.

First alert module — skeleton Claude laid in

#!/usr/bin/env python3
# lib/telegram_send.py — alert module dropped in from the first one-liner

import os, requests

def send(message: str, category: str = "blog") -> None:
    token = os.environ['TELEGRAM_BOT_TOKEN']
    chat_id_map = {
        'blog':     os.environ.get('TELEGRAM_CHAT_BLOG'),
        'alert':    os.environ.get('TELEGRAM_CHAT_ALERT'),
        'briefing': os.environ.get('TELEGRAM_CHAT_BRIEFING'),
    }
    chat_id = chat_id_map.get(category) or os.environ['TELEGRAM_CHAT_ID']
    requests.post(
        f'https://api.telegram.org/bot{token}/sendMessage',
        json={'chat_id': chat_id, 'text': message},
        timeout=10,
    )

I didn’t try to make it perfect from the start. I asked for one missing piece at a time and grew it. Starting with alerts, then captcha replies, interviews, ops instructions — I grew the cycle by iterating.

My reply command router — /publish /skip /schedule

# lib/telegram_bot.py — publish review reply handling (excerpt)
COMMAND_ROUTER = {
    '/publish':    handle_publish_now,      # Publish immediately
    '/skip':       handle_skip_draft,       # Keep as draft, don't publish
    '/cancel':     handle_cancel_draft,     # Delete post + return to queue
    '/schedule':   handle_schedule,         # /schedule 14:30 → schedule at 14:30
}

def handle_telegram_reply(msg):
    """30-min timeout polling — review possible even while out."""
    cmd = msg.get('text', '').strip().split()[0]
    handler = COMMAND_ROUTER.get(cmd)
    if handler:
        return handler(msg)
    # No command match → treat as captcha reply
    return handle_captcha_answer(msg)

My bot feature evolution timeline

Day 1   Alert module (publish success/failure alerts)
Day 7   Captcha image relay + reply handling
Day 14  Interview polling loop (5–6 Qs → answers → draft)
Day 21  Batched failure reports 2x/day (kill instant alerts)
Day 30  Ops instruction reply handling (/publish /skip /schedule HH:MM)
Day 45  Quality review gate (pre-publish card + reply branch)
Day 60  Alerts compressed 7 streams → 2 (normalized)

You don’t need every feature on day one — that was my biggest lesson.

CODAIf I had to land it in one line

Build the environment that lets you work anywhere, anytime — first. That’s how your hours getting smarter alongside Claude Code actually grow.

— Eddy · replying from abroad

I realized the desktop isn’t something to keep on — turning it off is the right answer. That’s how your time working with AI grows.

CODA

The essence of automation isn’t working 24 hours — it’s that work keeps rolling even when you go to sleep.

Sources · References

Series · Related posts

  • 5 real Claude Code tips I learned in 2 months (previous post)
  • Context Engineering 3-file pattern — Claude writing in my voice
  • How to fully use Claude Code memory

Disclaimer: My personal 2-month ops log. No ads, no affiliates.


This post is part of an English mirror of a Korean dev experiments blog. Cross-posted for the global developer audience.




Leave a Comment