casesdanang-group-bot

rudiscuss your taskmenuclose

Telegram group for Russian-speaking expats, Da Nang · 

A Telegram feed that fills itself

Weather and exchange rates at seven in the morning, a news story at nine, a language lesson at noon: three sections go out on schedule with no one involved. The hardest part turned out not to be writing the bots; it was finding out in time that one of them had gone quiet.

474 Unattended posts March 31 to September 16, 2026

6,173 Repeats kept out of the feed the number of times a news story was recognized as already published

0 Manual actions per day the schedule lives on the server; someone steps in only for edits

The morning digest in the group: weather, air quality, exchange rates, and prices

The task

A topic-based group runs on regularity. As long as there is something in the feed every day, people drop in; once gaps appear, they stop, and getting them back is harder than it was to bring them in.

Regularity comes down to a person. When the owner does the posting, it usually goes like this: every day at first, then every other day, then “didn’t get to it this week.” A hired social media manager costs money every month, gets sick, goes away, and one day quits. And content for an expat group is also work done by hand: news about the city comes out in English and Vietnamese, and each story has to be found, checked for its date, translated, rewritten for your audience, and formatted. And that is every day, with no days off.

And there is a separate problem, one that members notice: the same news story arrives from five aggregators under different headlines. A week later you no longer remember whether you posted it or not, and you post it a second time.

What it delivered

The group’s feed goes out by itself on weekends, during vacations, and at night: the schedule lives on the server, not in someone’s head. The same news story from different sources is filtered out before it is published. How much went out in total and how many repeats were caught are in the numbers on the first screen, next to the source.

What goes out in the feed

Three sections, each with its own time and its own place in the group. In all, 21 posts go out per week: three times a day, seven days.

Schedule in Da Nang time
TimeWhat goes out
07:00Morning digest: weather and a three-day forecast, air quality, exchange rates, fuel and gold prices
09:00A news story about the city and the province: a retelling in Russian with a link to the source
12:00Vietnamese lesson: phrase of the day, a word-by-word breakdown, a hint on tones

A news story is not a bare translation. At the end of each one, AI adds a short “For expats” paragraph («Для экспатов»): one or two sentences on how this news will affect the lives of foreigners in Da Nang. Before sending, the bot checks that the paragraph is in place; without it, the post does not go out. An illustration from the article itself and a link to the source are also required.

A news story in the group: a photo of a cable car, a headline, the retelling, the “For expats” block, and a link to the source
At the top is the end of yesterday’s story: the “For expats” paragraph with a palm tree and a link to the source. Below is the start of today’s, with an illustration from the article.

The Vietnamese lesson runs as a course designed for 365 days: lessons are prepared in batches, and as of September 16, 2026, 120 are ready and day 94 has been published. These are not random phrases. Each is tied to a place where it will come in handy: a market, a cafe, a motorbike rental.

A Vietnamese lesson in the group: phrase of the day, transcription, translation, a word-by-word breakdown, and a hint on tones
The lesson for day 94 of 365: the phrase, a breakdown of each word, and an explanation of exactly where it is said

What I did

I split the feed into independent sections

Each section is a separate program with its own schedule and its own memory of where it left off. If one goes down, the others go out as usual. A new section can be added without touching the ones that are running: that is how news was added to the weather, and then language lessons.

I taught the bot to write in the audience’s language

The news sources are in English and Vietnamese. What has to come out is natural Russian with local context, not machine translation. The retelling is done by AI to a strict template: headline, the gist, money and dates, a separate “for expats” paragraph, source, hashtags.

AI models have a habit of opening an answer with “Here is the translation of the article:” or adding a note at the end, and in a finished post that looks like a defect. Such signs that AI wrote it are cut out by a separate check that the text of every section passes through; nothing is published without going through it.

I set up three checks for repeats

A duplicate in the feed is the kind of thing that makes members stop trusting a group, so there is more than one check.

How many times each check stopped a post, March 31 to September 16
CheckRejected
Same article address2,394
Similar headline2,423
Same story in another language1,356

The third check is the most interesting one. A news story that was published in Russian yesterday arrives today in English from a different aggregator. The texts have nothing in common, but the numbers, people’s names, and names written in Latin letters survive translation: “20 million,” “SKYTRAX,” and “2030” are identical in both. That is how the story is recognized.

I gave the bot a memory of posts published by hand

A separate program reads the history of the topic in the group once a day and adds to the shared memory whatever the owner has published personally. Of the 222 records, 145 came in exactly this way. So the bot will not repeat a news story that a person already posted by hand before the bot did.

That program only reads; it is always the bot that publishes.

I made sure the morning post goes out even when sources fail

Weather, air, exchange rates, fuel, and gold are fetched independently of one another. If the air sensor does not respond, the air line changes to “no data.” If the exchange rates do not respond, the block disappears. Exchange rates and prices have backup sources, while fuel and gold prices have the last known value with its date.

On the morning of August 11, the weather server returned an error on the first attempt, and both pages with the gasoline price had changed their layout. The post still went out at 07:00. The reader saw no difference.

I separated lesson preparation from publishing

Lessons and guide materials are prepared in advance, in batches, and pass a structure check before they get into the queue. What is left on the schedule is a simple task: take a finished entry and send it. Publishing does not depend on whether the AI model is available right now or whether the limits have run out.

I added a check before sending

The last line of defense is the format of the finished post: whether there is a headline, whether there is a source line, whether the required hashtags are in place, whether it is too short. If it fails, the post is not published, and the next candidate article is taken.

Is your group alive only as long as you have time for it?

Message me

Silence is the worst kind of failure

Automation breaks silently. Here is how that looked in this project and what had to be done.

A program that ends with an error makes itself known. A program that ran properly and published nothing reports nothing: to the server, that is a success.

12 Sundays

The weekly guide section did not go out for three months. The next piece in line was empty; the bot saw this, wrote a warning to the internal log, and exited successfully.

26 days

The news was silent in two stretches over the summer. The AI on the server was returning an error, and only an empty line reached the internal log: the cause of the error was being written to a place nobody looked.

Zero alerts

In neither case did a single message go out. Both failures came to light when I opened the logs by hand myself.

That is why there is now a watchdog. After every successful post, a section is marked in a shared file: that is its pulse. The watchdog runs on schedule and checks two things: whether a section has been silent longer than it should be and whether there is enough content prepared for the near future. If it finds a problem, it messages me in an internal chat. Its very first run on real data caught exactly the failure it was written for.

For the owner, this is the main difference from “a bot that was written and handed over”: not “everything works” but “I’ll find out the same day if it stops.”

At the end of August, I stopped the auto-posting for three weeks and turned it back on after an audit; the feed is empty for that period.

The fourth section, which is not in the feed

The expat guide, weekly pieces about life in Vietnam, was written, built, and running: four issues went out in May. Since September 14, 2026, it has been turned off, and it is not on the schedule.

The reason is simple: none of the 39 prepared pieces has been through a fact check, and a quick look through them turned up errors, for example a statement about the documents for a domestic flight that is wrong. Until the facts are rechecked, the section is not published.

Turning a section off is cheaper than dealing with the consequences of one wrong piece of advice about documents. That is why it is turned off rather than “running, but someone has to keep an eye on it.”

What this gives the group owner

The feed stays alive on vacation and on weekends

Nobody forgot to post: the schedule lives on the server, not in someone’s head.

Content in the audience’s language

The sources are in English and Vietnamese; the output is Russian with local context.

News repeats are filtered out

One story from five aggregators in two languages is recognized as one before it is published. That includes what was posted by hand.

A failed source does not break the post

A block with no data disappears; the rest goes out on time.

It expands section by section

A new section is added without touching the ones that are running.

What costs money

The data sources are free: weather, air, exchange rates, prices, news search. You pay for the server and for the AI that rewrites the text.

The numbers were taken on September 16, 2026, from the server where the project runs: posts were counted from the sections’ internal logs and their state files, and rejected duplicates from the news bot’s log. The logs begin on March 30, 2026; there is no earlier period in the data. One discrepancy is on record and is not hidden: the logs show 210 successful news sends, while the memory holds 77 post records made by the bot itself. Part of the history was lost before mid-June and restored by reading the feed itself; the exact cause of the loss has not been established.

How it works technically

Python 3.10+, requests and beautifulsoup4, Telethon for reading the topic’s history, a Google News link decoder, AI through a CLI on the server, and cron for the schedule. No database, no queues, no Docker: state lives in JSON files next to the code, where it can be seen, edited by hand, and easily backed up. Deploying on any Linux machine takes a few minutes.

State is written atomically and only after a successful send: a crash in the middle of a run does not advance the day counter or lose course progress. A resend happens only where it is known for certain that the message did not go out: when the outcome is unknown, the bot does not resend and does not fall back to a backup option. The watchdog will catch a missed post, but a duplicate in the group cannot be taken back. Sections are protected from running in parallel by a file lock, and each section has a mode that sends to a test chat and a mode that shows the post without sending it.

The code is open: github.com/jw-git-hub/jw_danang_group_bot

Who did the work

It’s just me behind jw-dev.pro, not a studio or an agency. That means you talk directly to the person doing the work: no manager, no brief relayed through third parties, and no passing the project to another contractor partway through.

My time zone is UTC+7, the same as Bangkok and Hanoi. I build websites, Telegram bots, and automation: a task rarely ends with a page, and it usually has to be connected to what you already have running.

As time goes on, the task sounds like “build a website” less and less often. One person needs a price to be changed in one place, not on twenty pages. Another needs the channel to run without them. A third needs the whole price list to sit inside Telegram, where their customers already go every day. That’s why the list of what I do is open-ended: if your task isn’t on it, that doesn’t necessarily mean it can’t be solved.

I write case studies so that they can be checked: what was there, what was done, and how it was measured. If there is analytics data, I give the numbers and the period they cover; if it is too early to measure, I say so. You won’t find “increased sales” here: that is a promise, not a result.

Need something similar?

Whether it’s a website, a bot, or something that is now done by hand, tell me what’s going on, and I’ll tell you whether it can be solved or not.

This kind of work is the service “Auto-posting to a Telegram channel or group.”

I have your request

I’ll read it myself and reply where you told me to.

Send another one

What you need you can pick several

In your own words: what you have now and what you want to get. If you have a website or a bot, paste the link.

Your request will come to me on Telegram, and I’ll reply myself.

If it’s easier, contact me directly: on Telegram, on WhatsApp, or by email.

Not sure what’s wrong with your website? Check it for free on Telegram: @jw_site_check_bot.

Who owns everything afterward and what happens if I disappear: answers on the home page.