June 11, 2026 — Matteo Merola

Four Workflows, One Agent: Use Case Walkthroughs

Real configuration snippets and conversation flows for four common humux setups.

The best way to understand what humux does is to see it configured for a real workflow. This article walks through four setups — the config that powers them and the conversations they produce.

1. The Solo Developer

You want an agent that can read your code, find bugs, and fix them — all through Telegram. The coding harness gives the agent four base tools (read_file, write_file, edit_file, run_command) confined to a workspace directory. Add the GitHub webhook and the agent can react to PRs and issues automatically.

config.yml
agents:
  - slug: forge
    name: Forge
    character: characters/forge.md
    telegram_token: ${vault:FORGE_BOT_TOKEN}
    skills: [coding, github, browser]
    tools: [read_file, write_file, edit_file, run_command]
    github_repos: [myorg/api, myorg/frontend]
    workspace: /app/data/workspace

With this config, a typical review session looks like this:

Telegram — Forge
You: review the diff in workspace/pr-204

Forge: Reading the diff... 3 files changed.

  routes/auth.py — the token expiry check uses `<` instead
  of `<=`. Tokens valid for exactly 0 remaining seconds get
  rejected. Off-by-one.

  routes/users.py — looks fine, pagination logic is correct.

  tests/test_auth.py — no test covers the boundary case.

You: fix the auth bug and add the test

Forge: ✔ Applied fix in routes/auth.py:47
  - if token.expires_at < now():
  + if token.expires_at <= now():

✔ Added test_token_expiry_boundary in tests/test_auth.py
✔ Committed as a1b2c3d

The agent reads files via read_file, applies the fix with edit_file, and runs git commit through run_command. Every write operation goes through the permission system — if permissions are set to ASK, you approve each file change via inline Telegram buttons before it lands.

2. The Privacy Advocate

You want everything local. No cloud TTS, no third-party search API, no credentials in plaintext config files. humux's two-tier vault seals infrastructure keys with a machine key at boot and agent secrets with your admin password. The model never sees the decrypted values — it references them as ${vault:NAME} placeholders that resolve at the protocol layer.

config.yml
llm:
  provider: anthropic
  api_key: ${vault:ANTHROPIC_KEY}

voice:
  tts_engine: kokoro      # fully offline, ~350MB model
  stt_engine: whisper      # on-device via faster-whisper

search:
  provider: searxng
  base_url: http://searxng:8080   # self-hosted, no API key

agents:
  - slug: sentinel
    name: Sentinel
    telegram_token: ${vault:SENTINEL_BOT_TOKEN}
    skills: [memory, voice, weather, browser]
Telegram — Sentinel
You: search for recent mass transit strikes in Switzerland

Sentinel: Searching via SearXNG (local instance)...

Found 4 results:
1. SBB workers announce 48h strike starting July 15
   — swissinfo.ch, 2 days ago
2. Zurich tram union rejects latest offer
   — tagesanzeiger.ch, 5 days ago
...

All queries routed through your SearXNG instance.
No data sent to external search APIs.

Voice works the same way. Send a voice message in Telegram: faster-whisper transcribes it on-device, the agent processes the text, and Kokoro 82M synthesizes the reply — no audio leaves your server. The bundled docker-compose.yml includes a SearXNG service, so the entire stack comes up with one command.

3. The Power User

You want your agent to handle email, calendar, and daily briefings. The key piece is the scheduler — a cron-based job system that runs agent tasks on a schedule. A daily briefing job triggers the agent to check email, calendar, and weather, then sends a summary to your Telegram chat.

config.yml
agents:
  - slug: atlas
    name: Atlas
    telegram_token: ${vault:ATLAS_BOT_TOKEN}
    skills: [email, calendar, contacts, scheduling, weather]
    email_accounts:
      - address: [email protected]
        access: read-write
    calendar_accounts:
      - name: personal
        url: https://caldav.fastmail.com/dav/calendars/...
        access: read-write

scheduler:
  jobs:
    - name: morning-briefing
      agent: atlas
      cron: "0 7 * * *"
      task: >
        Check my unread emails, today's calendar events,
        and the weather in Zurich. Send a summary to my
        Telegram chat.

Every morning at 7:00, the scheduler fires the job. The agent calls search_email, list_events, and the weather skill, then composes a message:

Telegram — Atlas (07:00)
Atlas: Good morning. Here's your Thursday briefing:

Weather: Zurich, 19°C, partly cloudy, rain after 4pm.

Calendar (3 events):
  10:00  Standup — Google Meet
  14:00  Dentist — Bahnhofstrasse 42
  16:30  1:1 with Sara — Zoom

Email (8 unread):
  ⚡ Invoice from Hetzner — EUR 28.40, due July 15
  ⚡ PR review request from Alex on api/#312
  ... 6 newsletters (skipped)

Reminder: you asked me to follow up with the
landlord about the lease renewal this week.

The briefing pulls from three sources in one turn. The reminder at the end comes from the memory system — the agent stored it when you mentioned the lease last Tuesday and surfaced it because the deadline is approaching.

4. The Team Assistant

You want multiple agents in one Telegram group, each handling a different domain. The trick: each agent runs its own Telegram bot, so they appear as separate participants. The addressing protocol is simple — mention the bot's name and it responds; no mention, no response. A reply decision gate (a cheap classifier) prevents bot-to-bot loops.

config.yml
agents:
  - slug: ops
    name: OpsBot
    character: characters/ops.md
    telegram_token: ${vault:OPS_BOT_TOKEN}
    skills: [github, coding, scheduling]
    tools: [run_command, read_file]
    github_repos: [myorg/infra]

  - slug: research
    name: ResearchBot
    character: characters/research.md
    telegram_token: ${vault:RESEARCH_BOT_TOKEN}
    skills: [browser, memory, voice]
    tools: [search_web, remember, recall]
Telegram — Team Chat
Alice: @OpsBot what's the status of deploy #847?

OpsBot: Deploy #847 completed at 14:32 UTC.
  All health checks pass. 3 pods running.

Bob: @ResearchBot find recent articles on OAuth 2.1
  migration patterns

ResearchBot: Searching... found 4 relevant articles:
  1. "OAuth 2.1 Simplified" — aaron-parecki.com
  2. "Migrating from OAuth 2.0" — auth0.com/blog
  ...
  Want me to summarize the key changes?

Alice: @OpsBot can you also check if PR #312 is merged?

OpsBot: PR #312 merged 2 hours ago by Alex.
  CI passed. Deployed in #847.

Both bots are in the same group. OpsBot handles infrastructure questions using the GitHub skill and run_command. ResearchBot handles knowledge questions using web search and memory. They never interfere with each other — the addressing protocol ensures only the mentioned bot responds. If Alice accidentally triggers both by mentioning two bots in one message, only the first-mentioned one acts.

The pattern

All four setups share the same structure: a config.yml entry that defines the agent's identity, skills, and tool scope, plus a character.md file that sets its personality. The config is the skeleton; the character is the voice. Swap either one and the same infrastructure produces a completely different agent.

The point isn't that these four personas are the only options — they're starting points. The actual configuration is a YAML file and a markdown file. Change a few lines, add a skill, adjust a permission rule, and you have something tailored to your exact workflow.

All four workflows run out of the box with humux. One container, your config, your rules. Get started →