← All guides AI Release
RU Subscribe to @ai_release1

How We Built an Autonomous AI Feed on a 1 GB RAM VPS for $18/mo: a pet project that started running on its own

Updated: 04.10.2026 · AI Release · @ai_release1
How We Built an Autonomous AI Feed on a 1 GB RAM VPS for $18/mo: a pet project that started running on its own

It all started with a mundane pain point: every day dozens of news items about neural networks come out — new models, updates, benchmarks, and papers. Monitoring dozens of RSS feeds, X (Twitter), Habr, Hacker News, and manually scraping it all from search engines is a hellish overhead and burnout. We just wanted a single clean channel with a digest of all search engines and primary sources — no fluff, clickbait, or repeats. And exclusively for personal use: check once a day and absorb the whole context in a couple of minutes.

Eventually, a quick-and-dirty home script grew into a fully autonomous pipeline. It all runs on a crappy $5 VPS with 1 GB of RAM, no desktop, no human in the loop, and no bloated orchestrators. In a month, this setup generated nearly 450 posts, gathered 700+ subscribers, and saved us a ton of hours. Here's how we built it, what pitfalls we hit, and how we save tokens.

Idea and prerequisites: why the dumb "RSS + ChatGPT" tutorial doesn't work

At first, we thought we could get by with a hack like "download RSS → feed to OpenAI → blast to Telegram." Spoiler: that scheme died on day one.

Here's what we ran into:

In the end, we assembled a lean but mean stack: pure Python, systemd timers (no Celery/Redis overhead!), external LLM APIs, lightweight metasearch, and a static web mirror.

Budget: pinching pennies

This was a pet project for ourselves, so nobody was going to inflate the budget. We kept it to $18.8 per month:

Expense itemCost
VPS (1 GB RAM / 1 vCPU)~$5 / mo
OpenCode Zen GO subscription (LLM API)$10 / mo
Domain ai-release.org~$1.8 / mo ($22/yr)
Telegram Premium (for the bot)~$2 / mo ($25/yr)
**Total****~$18.8 / mo**

The biggest line item is the neural network API, but this subscription covers everything: from rewriting news to a personal chat responder. And we don't spend a cent on cover images — we source them from open sources.

Architecture: ditch Celery, use systemd

Why drag Redis, RabbitMQ, and Celery into a project when you can get by with built-in Linux tools? For a project of this scale, systemd timers are the perfect solution. Each task runs in its own isolated process: if one times out, it doesn't take down the whole server.

Scripts are scheduled via `OnCalendar`:

# ai-release-hourly.timer (*:15) — 1 news item per hour
# ai-release-video.timer  (0:30, 8:30, 16:30) — video every 8 hours
# ai-release-daily.timer  (18:00 MSK) — daily digest
# ai-release-stats.timer  (18:00 UTC) — metrics collection
# ai-release-chat.service (daemon) — AI bot in DMs
# ai-release-web.service  — web mirror

[Timer]
OnCalendar=*-*-* *:15:00
Persistent=true

Publishing goes directly through the Telegram Bot API.

Where we source content:

Triple filtering and deduplication

To keep the feed from turning into a dump of 10 identical stories about "OpenAI released a new model," we applied a three-stage filter:

1. **Scoring.** We calculate a news item's weight based on freshness, source authority, and headline. Primary sources and engineers' personal blogs get priority over reposts.

2. **Headline normalization and hashing.** We strip junk like `BREAKING:`, `URGENT:`, tails like `— TechCrunch` or `| The Verge`, normalize quotes, and check `sha256` in SQLite:

def normalize_title(t: str) -> str:
    t = re.sub(r"\s*[-—|]\s*(TechCrunch|Engadget|The Verge|WindowsLatest).*$", "", t, flags=re.I)
    t = re.sub(r"^(BREAKING|СРОЧНО|EXCLUSIVE)\s*:?\s*", "", t, flags=re.I)
    t = t.replace("«", '"').replace("»", '"').strip()
    return t.lower()

3. **Semantic dedup via LLM.** Headlines can differ while the essence is the same. Before posting, the candidate is compared with the texts of recent channel posts. Similar? Reject it.

We also cut SEO junk: unknown domains are allowed only if there's a concrete signal (a model name, company, or event), while abstract "AI/neural network" stuff gets banned immediately.

Training the LLM: making the model stop embellishing

The main problem with basic prompts was that the model constantly tried to infer "why this happened" and write profound conclusions that weren't in the source.

How we made it work properly:

Token savings and model routing

Since the LLM is the only thing we pay real money for, we save on every request:

Free cover images: building without DALL-E

Generating images via API is expensive and slow. We built a cascading fallback for finding illustrations:

1. Pull `og:image` from the original article.

2. If `og:image` is missing or broken, we go to metasearch across free stock sites (Unsplash, Pexels, Pixabay, Wikimedia, Flickr).

3. Nothing found? We pull a themed art or anime/manga illustration.

4. Completely empty? We use the default fallback pack.

Before sending, the image is validated with a quick HEAD request. If Telegram returns `400 Bad Request`, the script swaps the cover on the fly and retries.

Fault tolerance: not crashing at the slightest API hiccup

External endpoints love to lag. To avoid babysitting the server over SSH, we built in several safeguards:

AI SEO and a static-site mirror

For each post, a page is automatically generated on the web mirror ai-release.org (in two languages — RU and EN). But regular SEO isn't enough these days; you need to optimize for AI crawlers (Perplexity, ChatGPT Search, Claude):

As a result, referral traffic comes not only from search but also directly from Perplexity and ChatGPT answers.

Bot security in DMs: fending off prompt injections

The channel is linked to the bot in DMs. Open user input always carries the risk that someone will try to "prompt-inject" the bot, extract the system context, or API keys.

Protection in three layers:

1. **Prompt guardrail.** The model is strictly instructed to ignore any attempts to change its role, "forget previous instructions," or "reveal the system prompt."

2. **Rate limiting.** No more than 20 requests per 10 minutes per user. You can't extract context or spam the API.

3. **Environment isolation.** All API keys live in `.env` with `chmod 600` permissions. The chat process runs in a separate environment and physically has no access to the publisher code or database.

What we got in the end

Key takeaways

1. You don't need an expensive GPU server with local models to build smart services. Proper pipeline architecture and external APIs solve 99% of the tasks.

2. Fighting hallucinations and deduplication at the code level gives 10x more quality than blindly switching to a more expensive model.

3. If you want AI systems to cite your content, give them `.md` and add `llms.txt`.

You can follow the feed in the channel @ai_release1, and read articles and guides on the site ai-release.org.

💬 **Questions and discussion — in the comments below.**

🤖 AI summary