Published: October 2026 | Category: AI Engineering
Most "AI agent" demos are a single task wrapped in a chat window. ForChi is the opposite: one Telegram bot that runs three independent production workflows in parallel, unattended, on free infrastructure. It publishes to two social networks, produces and uploads YouTube videos, and hunts for jobs — all from the same process.
Recorded build session — extending the job-application engine and its Lever/Ashby submission path.
| Workflow | What it does | Cadence |
|---|---|---|
| Social | Writes and publishes posts to Facebook and LinkedIn | 5× per day |
| Video | Scripts, voices and assembles YouTube uploads | up to 2 per day |
| Jobs | Scans boards, scores each role against my profile, applies through Lever and Ashby | every 30 minutes |
Together those three loops used to eat most of a working day. Running them as one agent cut the manual time I spent on them by roughly 99.9%.
The failure mode of an always-on agent is not that it is dumb — it is that it is eager. If a casual "hey, how's the job hunt going?" can trigger an application run, the agent is dangerous, and you will spend more time supervising it than doing the work yourself.
So ForChi has a deterministic trigger layer in front of the model:
The rule I apply everywhere now: deterministic code owns the whether, and the model owns the what.
# The shape of the rule, not the actual implementation
if not COMMAND_PATTERN.match(text): # regex gate
return reply("I only act on explicit commands.")
params = JobRequest.safe_parse(extract(text)) # Zod-equivalent validation
if not params.success:
return reply(f"Invalid request: {params.error}")
run_job_workflow(params.data) # only now does the LLM get involved
Judgement calls — matching a posting to my actual experience, writing copy in my voice, picking a video angle — run on Gemini. Gemini's free tier is generous but not guaranteed, so the stack degrades instead of dying: a Qwen2.5-7B model I host on Hugging Face takes over as fallback.
That split matters operationally. The workflows are not allowed to depend on a single provider being up, and the fallback is a model I control, not another company's quota.
Hugging Face carries more than the fallback model. ForChi also uses an image Space for post visuals and two voice Spaces (F5-TTS and Higgs TTS 3) to generate the narration for the video pipeline, so the whole content stack can be rebuilt from components I control.
ForChi runs on Render and Hugging Face free tiers, which means it has to survive cold starts, sleeping dynos and credential expiry without me noticing. Two decisions carried most of that weight:
/ returns a cheap status document and /status reports workflow state, so an external keep-alive ping is enough to know the process is alive and to wake it when it is not.
GET https://forchi.onrender.com/
{"status": "healthy", "bot": "ForChi", "mode": "long-polling"}
Each workflow has its own interval and its own failure blast radius. A YouTube render that takes forty minutes must not block the job scan that runs every thirty, and a failed social post must not take down the scheduler.
Author: Agu Chiedozie | Cloud & AI Systems Engineer