English | Deutsch | Français | 日本語 | 한국어 | Nederlands | ไทย | Tiếng Việt | 简体中文 | 繁體中文(香港) | 繁體中文(台灣)
Lichtgewicht, multi-bot, multi-sessie, multitasking, 24/7 AI Coding Agent
Bedien je lokale AI Coding Agent vanaf elke plek via Telegram.
→ Installeren met één regel:
curl -fsSL https://raw.githubusercontent.com/daocha/coding-agent-telegram/main/install.sh | bash
|
Voordat je de server start, zorg dat je hebt:
|
Openclaw biedt zeer uitgebreide mogelijkheden en heeft al een geïntegreerde agent-loop genaamd Pi-Agent. Het is behoorlijk compleet en bedoeld voor bredere use cases. Ik ben zelf ook fan van Openclaw en heb er eerder mee gecodeerd. Voor coding is het echter niet altijd de beste keuze, door de ingebouwde grote system prompt en extra context. Claude Code / Codex / Copilot zijn voor coding vaak efficiënter, nauwkeuriger, minder afleidend en directer. Dit project blijft bewust eenvoudig en integreert alleen Codex / Copilot CLI. Je delegeert het werk dus rechtstreeks aan Codex / Copilot.
curl -fsSL https://raw.githubusercontent.com/daocha/coding-agent-telegram/main/install.sh | bashpip install coding-agent-telegram
coding-agent-telegramgit clone https://github.com/daocha/coding-agent-telegram
cd coding-agent-telegram
./startup.sh# als je optie A of optie B volgt, voer dan uit
coding-agent-telegram
# als je optie C volgt, voer dit dan opnieuw uit
./startup.shHiermee schakel je optionele lokale Whisper-gebaseerde spraak-naar-tekst in voor Telegram-spraaknotities. Audiobestanden zijn beperkt tot maximaal 20 MB.
# als je via pip hebt geïnstalleerd
coding-agent-telegram-stt-install
# als je vanuit een gekloonde repository werkt
./install-stt.shAanbevolen env-instellingen:
ENABLE_OPENAI_WHISPER_SPEECH_TO_TEXT=true
OPENAI_WHISPER_MODEL=base
OPENAI_WHISPER_TIMEOUT_SECONDS=120
Opmerkingen:
- Whisper downloadt het gekozen model automatisch bij het eerste gebruik naar
~/.cache/whisper. - Als je
OPENAI_WHISPER_MODEL=turbokiest, is de kans groter dat de eerste spraaktranscriptie de time-out raakt terwijllarge-v3-turbo.ptnog wordt gedownload. - Nadat een spraakbericht is getranscribeerd, stuurt de bot eerst het herkende transcript terug naar Telegram en daarna pas naar de agent. Dat helpt om herkenningsfouten te controleren.
- Open Telegram en start een chat met
@BotFather. - Stuur
/newbot. - Volg de stappen om te kiezen:
- een weergavenaam
- een bot-gebruikersnaam die eindigt op
bot
- BotFather geeft een HTTP API token terug.
- Zet dat token in
TELEGRAM_BOT_TOKENSin~/.coding-agent-telegram/.env_coding_agent_telegram.
De betrouwbaarste manier is de Telegram getUpdates API gebruiken met je eigen bot token.
- Start een chat met je bot en stuur bijvoorbeeld
/start. - Open deze URL in je browser en vervang
<BOT_TOKEN>:
https://api.telegram.org/bot<BOT_TOKEN>/getUpdates
- Zoek het object
chatin de JSON-respons. - Kopieer de numerieke waarde van het veld
id. - Zet die waarde in
ALLOWED_CHAT_IDSin~/.coding-agent-telegram/.env_coding_agent_telegram.
Opmerkingen:
- Voor privéchats is de chat ID meestal een positief geheel getal.
- Als
getUpdateseen lege respons geeft, stuur de bot nog een bericht en probeer opnieuw.
De bot accepteert momenteel:
- tekstberichten
- foto’s
- spraakberichten en audiobestanden wanneer
ENABLE_OPENAI_WHISPER_SPEECH_TO_TEXT=trueis ingesteld en de lokale Whisper-vereisten zijn geïnstalleerd - Codex en Copilot ondersteunen momenteel alleen tekst en afbeeldingen, geen video
/provider |
Kies de aanbieder voor nieuwe sessies. Die keuze wordt per bot en chat bewaard totdat je die wijzigt. |
/project <project_folder> |
Stel de huidige projectmap in. Bestaat de map niet, dan maakt de app die aan en markeert hem trusted. Bestaat hij al maar is hij nog untrusted, dan vraagt de app expliciet om trust. |
/branch <new_branch> |
Bereid een branch voor of wissel ernaar voor het huidige project. Als de branch al bestaat, behandelt de bot die als source candidate. Anders gebruikt hij de standaard-branch van de repository als source candidate. |
/branch <origin_branch> <new_branch> |
Bereid een branch voor of wissel ernaar met <origin_branch> als source candidate. Voor beide vormen biedt de bot daarna alleen de source choices aan die echt bestaan: local/<branch> en origin/<branch>. Als er maar één bestaat, zie je alleen die. Als geen van beide bestaat, meldt de bot dat de branch-source ontbreekt. |
/current |
Toon de actieve sessie voor de huidige bot en chat. |
/new [session_name] |
Maak een nieuwe sessie voor het huidige project. Als je geen naam opgeeft, gebruikt de bot de echte sessie-ID. Als aanbieder, project of branch ontbreekt, begeleidt de bot je door de ontbrekende stap. |
/switch |
Toon de nieuwste sessies, nieuwste eerst. De lijst bevat zowel bot-managed sessies als lokale Codex/Copilot CLI-sessies voor het huidige project. |
/switch page <number> |
Toon een andere pagina met opgeslagen sessies. |
/switch <session_id> |
Schakel naar een specifieke sessie via ID. Kies je een lokale CLI-sessie, dan importeert de bot die en gaat daar verder. |
/compact |
Maak vanuit de actieve sessie een nieuwe compacte sessie en schakel daarheen over. |
/commit <git commands> |
Voer gevalideerde git commit-gerelateerde commando’s uit binnen het project van de actieve sessie. Alleen beschikbaar als ENABLE_COMMIT_COMMAND=true. Muterende Git-commando’s vereisen een trusted project. |
/diff |
Toon gewijzigde bestandsnamen voor het project van de actieve sessie, gescheiden in gevolgde en niet-gevolgde bestanden. Gevolgde bestanden krijgen inline-knoppen om de diff per bestand te openen. |
/pull |
Voer na bevestiging een pull uit vanaf origin voor de branch van de actieve sessie. De bot ververst ook de standaardbranch wanneer dat van toepassing is. |
/push |
Push origin <branch> voor de huidige actieve sessie. De bot vraagt om bevestiging voordat hij pusht. |
/abort |
Breek de huidige agent-run voor het huidige project af. Als er vragen in de wachtrij staan, vraagt de bot of die verder verwerkt moeten worden. |
CODING_AGENT_TELEGRAM_ENV_FILE |
Gebruik dit als de app naar een specifiek env-bestand moet wijzen. |
~/.coding-agent-telegram/.env_coding_agent_telegram |
Standaardlocatie van het env-bestand. |
./.env_coding_agent_telegram |
Alleen gebruikt als dit lokale bestand al bestaat. |
WORKSPACE_ROOT |
Bovenliggende map die je projectmappen bevat. |
TELEGRAM_BOT_TOKENS |
Door komma's gescheiden Telegram bot tokens. |
ALLOWED_CHAT_IDS |
Door komma's gescheiden Telegram chat-ID's van privéchats die de bot mogen gebruiken. |
APP_LOCALE |
UI-locale voor gedeelde botmeldingen en commandobeschrijvingen. Ondersteunde waarden: en, de, fr, ja, ko, nl, th, vi, zh-CN, zh-HK, zh-TW. |
CODEX_BIN |
Commando om Codex CLI te starten. Standaard: codex. |
COPILOT_BIN |
Commando om Copilot CLI te starten. Standaard: copilot. |
CODEX_MODEL |
Optionele Codex-modeloverride. Laat leeg om het standaardmodel van Codex CLI te gebruiken. Voorbeeld: gpt-5.4 OpenAI Codex/OpenAI-modellen |
COPILOT_MODEL |
Optionele Copilot-modeloverride. Laat leeg om het standaardmodel van Copilot CLI te gebruiken. Voorbeelden: gpt-5.4, claude-sonnet-4.6 Ondersteunde GitHub Copilot-modellen |
CODEX_APPROVAL_POLICY |
Goedkeuringsmodus die aan Codex wordt doorgegeven. Standaard: never. |
CODEX_SANDBOX_MODE |
Sandboxmodus die aan Codex wordt doorgegeven. Standaard: workspace-write. |
CODEX_SKIP_GIT_REPO_CHECK |
Als dit is ingeschakeld, worden trusted-repo-checks van Codex altijd overgeslagen. |
ENABLE_COMMIT_COMMAND |
Schakelt het Telegram-commando /commit in. Standaard: false. |
AGENT_HARD_TIMEOUT_SECONDS |
Harde timeout voor één agent-run. Standaard: 0 (uitgeschakeld). |
SNAPSHOT_TEXT_FILE_MAX_BYTES |
Maximale bestandsgrootte die de bot als tekst leest voor de voor/na-momentopname voor per-run diffs. Standaard: 200000. |
MAX_TELEGRAM_MESSAGE_LENGTH |
Maximale berichtgrootte voordat de app antwoorden splitst. Standaard: 3000. |
ENABLE_SENSITIVE_DIFF_FILTER |
Verberg diffs voor gevoelige bestanden. Standaard: true. |
ENABLE_SECRET_SCRUB_FILTER |
Maskeer tokens, sleutels, .env-waarden, certificaten en vergelijkbare geheime uitvoer voordat die naar Telegram wordt gestuurd. Standaard: true (sterk aanbevolen). |
SNAPSHOT_INCLUDE_PATH_GLOBS |
Forceer dat overeenkomende paden in diffs worden opgenomen. Voorbeeld: .github/*,.profile.test,.profile.prod |
SNAPSHOT_EXCLUDE_PATH_GLOBS |
Voeg extra diff-exclusies toe boven op de pakketstandaard. Voorbeeld: .*,personal/*,sensitive*.txt Opmerking: .* matcht verborgen paden, inclusief bestanden in verborgen mappen. |
ENABLE_OPENAI_WHISPER_SPEECH_TO_TEXT |
Standaard: false. Als dit op true staat, worden spraakberichten en audiobestanden herkend. Het systeem controleert de vereiste binaries of bibliotheken en vraagt de gebruiker om ze te installeren als ze ontbreken. |
OPENAI_WHISPER_MODEL |
Model voor Whisper STT. Standaard: baseBeschikbare modellen: tiny ongeveer 72 MB, base ongeveer 139 MB, large-v3-turbo ongeveer 1.5 GBModellen worden automatisch gedownload bij je eerste spraakbericht. Aanbevolen: base voor algemeen gebruik. Als je betere nauwkeurigheid en kwaliteit wilt, kun je turbo proberen. |
OPENAI_WHISPER_TIMEOUT_SECONDS |
Standaard: 120. Time-out voor het STT-proces. Meestal is de verwerking snel genoeg. Maar als je turbo kiest, kan het eerste spraakbericht door het downloaden van het model de time-out overschrijden, afhankelijk van je internetsnelheid. |
~/.coding-agent-telegram/state.json |
Hoofdbestand voor de sessiestatus. |
~/.coding-agent-telegram/state.json.bak |
Back-upbestand voor de status. |
~/.coding-agent-telegram/logs |
Logmap. |
Voorbeeld:
APP_LOCALE=en
WORKSPACE_ROOT=~/git
TELEGRAM_BOT_TOKENS=bot_token_one
ALLOWED_CHAT_IDS=123456789
DEFAULT_AGENT_PROVIDER=codex
CODEX_BIN=codex
COPILOT_BIN=copilot
CODEX_APPROVAL_POLICY=never
CODEX_SANDBOX_MODE=workspace-write
ENABLE_SENSITIVE_DIFF_FILTER=true
ENABLE_SECRET_SCRUB_FILTER=trueSessies zijn gescoped per:
- Telegram-bot
- Telegram-chat
Daardoor kan hetzelfde Telegram-account meerdere bots gebruiken zonder sessies te vermengen.
Voorbeeld:
- Bot A + jouw chat -> backendwerk
- Bot B + jouw chat -> frontendwerk
- Bot C + jouw chat -> infrawerk
De actieve sessie is ook gekoppeld aan:
- projectmap
- aanbieder
- branch-naam wanneer beschikbaar
Per sessie wordt opgeslagen:
- sessienaam
- projectmap
- branch-naam
- aanbieder
- tijdstempels
- actieve sessiekeuze voor die bot/chat-scope
Er kan maar één agent-run tegelijk actief zijn per projectmap, ongeacht welke chat of welke Telegram-bot die heeft gestart.
- project is bezig: er draait al een agent-run in die workspace
- agent is bezig: die ene run verwerkt de huidige aanvraag nog
De bot dwingt dit af zodat twee agents niet tegelijk naar dezelfde workspace schrijven. Dat verkleint de kans op conflicterende wijzigingen en datacorruptie.
Komt er een bericht binnen terwijl er al een agent draait op hetzelfde project, dan antwoordt de bot direct:
⏳ Er draait al een agent op dit project. Wacht tot die klaar is.
De lock wordt in het geheugen gehouden, niet op schijf. Daardoor wordt hij automatisch vrijgegeven wanneer de agent klaar is, faalt of de server herstart.
Als er al een agent-run actief is op het huidige project, worden latere tekstberichten niet geweigerd maar in een wachtrij geplaatst.
- de nieuwe vraag wordt toegevoegd aan een queued-questions-bestand op schijf
- de huidige agent blijft werken aan de eerdere aanvraag
- wanneer die run normaal eindigt, start de bot automatisch met de verwerking van de vragen in de wachtrij
Wordt de huidige run afgebroken terwijl er nog vragen wachten, dan gaat de bot niet automatisch verder. Hij vraagt dan of de resterende vragen verder moeten worden verwerkt, gegroepeerd of één voor één.
Tijdens elke agent-run maakt de bot ook een lichte voor/na-momentopname van het project, zodat gewijzigde bestanden kunnen worden samengevat en diffs naar Telegram kunnen worden gestuurd. Deze momentopname wordt door de bot-app zelf gemaakt, niet door Codex of Copilot.
Snapshot-opmerkingen:
- de app loopt de projectmap door vóór en na de run
- voor normale tekstbestanden heeft de per-run momentopnameverschil voorrang op een git-head-diff
- gebruikelijke afhankelijkheids-, cache- en runtime-mappen worden ook overgeslagen
- binaire bestanden en bestanden groter dan
SNAPSHOT_TEXT_FILE_MAX_BYTESworden niet als tekst geladen - bij erg grote projecten kan deze extra scan merkbare I/O- en geheugenbelasting toevoegen
- als de momentopname een bestand niet als tekst kan weergeven, valt de app waar mogelijk terug op
git diff - voor grote of niet-tekstbestanden kan de diff alsnog worden weggelaten en vervangen door een kort bericht
De momentopname-uitsluitingsregels staan in pakketresources:
src/coding_agent_telegram/resources/momentopname_excluded_dir_names.txtsrc/coding_agent_telegram/resources/momentopname_excluded_dir_globs.txtsrc/coding_agent_telegram/resources/momentopname_excluded_file_globs.txt
Je kunt deze standaardwaarden in het env-bestand overschrijven zonder het geïnstalleerde package te wijzigen:
-
SNAPSHOT_INCLUDE_PATH_GLOBSForceer opname van overeenkomende paden in diffs. Voorbeeld:.github/*,.profile.test,.profile.prod -
SNAPSHOT_EXCLUDE_PATH_GLOBSVoeg extra diff-uitsluitingen toe boven op de package-standaarden. Voorbeeld:.*,personal/*,sensitive*.txtOpmerking:.*matcht verborgen paden, inclusief bestanden in verborgen mappen.
Als include en exclude allebei matchen, wint include.
De bot behandelt project en branch als één geheel.
- het kiezen van een project kiest niet stilzwijgend een ongerelateerde branch
- als branch-invoer nodig is, vraagt de bot je die te kiezen
- wanneer branch-informatie in sessieberichten wordt getoond, worden project en branch samen weergegeven
Wanneer je een branch maakt of wisselt, begeleidt de bot je expliciet bij de bron:
local/<branch>betekent de lokale branch als bron gebruikenorigin/<branch>betekent eerst vanaf de remote branch verversen en daarna wisselen
Als de bot ziet dat de in de sessie opgeslagen branch niet overeenkomt met de huidige repository-branch, gaat hij niet blind verder. Hij vraagt welke branch gebruikt moet worden:
- de opgeslagen sessie-branch behouden
- de huidige repository-branch behouden
Als je voorkeursbron-branch ontbreekt, biedt de bot fallback-bronnen aan op basis van de standaard-branch en de huidige branch in plaats van je achter te laten met een kale Git-fout.
- bestaande mappen volgen
CODEX_SKIP_GIT_REPO_CHECK - mappen die via
/project <name>worden aangemaakt, worden door deze app als trusted gemarkeerd - bestaande mappen die via
/project <name>worden gekozen, blijven untrusted tot je trust bevestigt in Telegram - nieuw aangemaakte projectmappen kunnen dus direct worden gebruikt
/commitkan volledig worden uitgeschakeld metENABLE_COMMIT_COMMAND- muterende
/commit-bewerkingen zijn alleen toegestaan voor trusted projecten
Logs worden zowel naar stdout als naar een roterend logbestand geschreven onder:
~/.coding-agent-telegram/logs(rotatie bij 10 MB, 3 back-ups)
Opmerking: als je tegelijk naar de terminal kijkt en het logbestand tailt, verschijnt elk bericht twee keer. Dat is verwacht gedrag. Bekijk het één of het ander, niet beide tegelijk.
Typisch gelogde gebeurtenissen
- bot-start en polling-start
- projectselectie
- sessiecreatie
- sessiewissel
- rapportage van de actieve sessie
- normale run-uitvoering (inclusief een auditlogregel met een ingekorte prompt)
- sessievervanging na mislukte resume
- waarschuwingen en runtime-fouten
-
src/coding_agent_telegram/hoofdcode van de applicatie -
tests/testsuite -
startup.shlokaal bootstrap- en start-entrypoint -
src/coding_agent_telegram/resources/.env.examplecanonieke omgevingssjabloon gebruikt door zowel repo-start als package-installaties -
pyproject.tomlverpakkings- en dependencyconfiguratie
Pakketversies worden afgeleid van Git-tags.
- TestPyPI/testen:
v2026.3.26.dev1 - PyPI-prerelease:
v2026.3.26rc1 - PyPI-stable:
v2026.3.26
- Dit project is bedoeld voor gebruikers die agents lokaal op hun eigen machine uitvoeren.
- De Telegram-bot is een bedieningslaag, niet de uitvoeringsomgeving zelf.
- Als je meerdere bots draait, kunnen die allemaal door één serverproces worden beheerd.
