🐈 nanobot v0.1.4.post4 is here — 58 PRs merged, 29 new contributors, and a lot of real-world polish from the community.
This release is a big one: safer defaults, better multi-instance support, stronger MCP/tool reliability, and major improvements across Telegram, Feishu, QQ, DingTalk, Discord, WhatsApp, Matrix, and more. A ton of sharp edge cases got cleaned up in this cycle — the kind of fixes that make nanobot feel much more solid day to day.
Highlights
-
Safer by default — Access control is tighter now. This release includes a real authorization-bypass fix and stronger default handling around
allowFrom, making deployments much safer out of the box. (#1403, #1677) -
Multi-instance support is finally real —
--configsupport landed, runtime path handling got cleaned up, and the CLI agent now supports--workspace/--configtoo. Running separate bots, tenants, or environments is much easier now. (#1581, #1635) -
MCP got tougher — SSE transport support is in, auto-detection is smarter, and MCP tool calls are much less likely to take down the process when cancellations or weird failures happen. (#1488, #1728)
-
Tooling got more forgiving — Auto-casting tool params, safer validation, graceful datetime handling, and
read_filesize limits all help nanobot fail less badly when tools or inputs get weird. (#1610, #1507, #1508, #1511) -
Provider support keeps growing — Azure OpenAI support is here, Alibaba Cloud Coding Plan API support landed, prompt-caching affinity headers were added, and GitHub Copilot / Codex compatibility keeps improving. (#1618, #1563, #1428, #1555, #1637, #1525)
-
Cron got much sturdier — External
jobs.jsonchanges are respected, job context handling is better, and cron jobs are no longer allowed to recursively schedule more cron jobs forever. (#1371, #1375, #1399, #1458) -
Context got cleaner — Consecutive user messages are merged to avoid provider-side errors, internal reasoning is hidden from user-facing progress updates, image MIME detection is more reliable, and prompt/platform guidance is more polished. (#1456, #1655, #1573, #1579)
-
Telegram got a lot of love — Proxy handling was fixed, group topics are supported,
/stopworks better, streaming messages landed, and generic documents now keep the right file extensions. (#1535, #1476, #1482, #1660, #1522, #436) -
Feishu keeps getting better — Rich text parsing, table/card splitting, smarter format selection, Groq Whisper transcription, audio/video compatibility fixes, and cleaner event handling all landed in this release. (#1361, #1384, #1648, #1605, #1531, #1594, #332, #1568)
-
More channels, more polish — DingTalk group chat support, QQ group handling and markdown sending, Discord group policy + attachments, WhatsApp media support, Slack fallback fixes, and Matrix media normalization all made it in. (#1467, #532, #1727, #553, #1613, #1638, #673, #1406)
-
Cross-platform stability improved — Better Windows signal handling, fewer missing imports/dependencies, cleaner tests, and overall more confidence that nanobot behaves well across different environments. (#1598, #1485, #1533, #1546, #1339, #1521)
Community
A huge welcome to our 29 new contributors in this release — thank you all for jumping in and improving nanobot across channels, providers, tooling, docs, and infrastructure. This project keeps getting better because of contributions like these.
What's Changed
- fix(cron): auto-reload jobs.json when modified externally by @Re-bin in #1371
- style: unify code formatting and import order by @JackLuguibin in #1339
- fix(feishu): parse post wrapper payload for rich text messages by @cyzlmh in #1361
- feat(cron): improve cron job context handling by @VITOHJL in #1375
- feat(tool): add web search proxy by @chengyongru in #1370
- security: deny by default in is_allowed for all channels by @chengyongru in #1403
- fix(matrix): normalize media metadata and keyword-call attachment upload by @wenjielei1990 in #1406
- cron: honor external jobs.json updates during timer ticks by @cyzlmh in #1399
- fix: merge consecutive user messages to prevent API errors by @nikolasdehor in #1456
- fix: prevent cron job from scheduling new jobs (feedback loop) by @nikolasdehor in #1458
- fix: add missed
openaidependency by @cocolato in #1485 - fix(codex): pass reasoning_effort to Codex API by @danielemden in #1525
- test: fix test failures from refactored cron and context builder by @chengyongru in #1521
- fix: handle invalid ISO datetime in CronTool gracefully by @kiplangatkorir in #1508
- fix: guard validate_params against non-dict input by @kiplangatkorir in #1507
- fix(feishu): convert audio type to file for API compatibility by @bendusy in #1531
- fix: add size limit to ReadFileTool to prevent OOM by @kiplangatkorir in #1511
- fix(tests): resolve failing tests by @SergioSV96 in #1533
- fix(qq): add msg_seq to prevent message deduplication error by @Liwx1014 in #1499
- fix(feishu): isolate lark ws Client event loop from main asyncio loop by @coldxiangyu163 in #1568
- feat(custom-provider): add x-session-affinity header for prompt caching by @dmarkey in #1428
- feat(discord): add group policy to control group respond behaviour by @joel611 in #553
- feat(mcp): add SSE transport support with auto-detection by @Qinnnnnn in #1488
- feat(gateway): support multiple instances by @chengyongru in #1435
- fix: add SIGTERM, SIGHUP handling and ignore SIGPIPE by @chengyongru in #1400
- feat(telegram): add streaming messages by @SergioSV96 in #1522
- fix(feishu): split card messages when content has multiple tables by @zerone0x in #1384
- fix(feishu): use msg_type "media" for mp4 video files by @pikaqqqqqq in #1594
- fix(cli): add Windows compatibility for signal handlers (PR #1400) by @Wangshixiong in #1598
- fix(memory): handle list type tool call arguments for Bailian Qwen by @Wangshixiong in #1603
- fix(feishu): smart message format selection (fixes #1548) by @pikaqqqqqq in #1605
- fix(context): detect image MIME type from magic bytes instead of file extension by @coldxiangyu163 in #1573
- refactor(channels): extract split_message utility to reduce code dupl… by @suger-m in #1567
- feat: Add Alibaba Cloud Coding Plan API support by @Mrart in #1563
- fix(github copilot tool calls): GitHub Copilot tool_calls not working (multi-choice response) by @gongpx20069 in #1555
- fix: not imported when LiteLLMProvider is not used by @hcanyz in #1546
- feat(whatsapp): Media support, incl. image, docs, video by @fat-operator in #1638
- Fix tool_call_id length error for GitHub Copilot provider by @04cb in #1637
- feat(provider): support azure openai provider by @kunalk16 in #1618
- feat: enhance message sending to include file attachments in Discord API by @lzmjlrt in #1613
- feat(tools): auto-cast parameter types to match tool schema by @wb213 in #1610
- fix(telegram): added "stop" command handler, fixed stop command by @hlibr in #1660
- feat(feishu): add audio transcription support using Groq Whisper by @chengyongru in #1648
- fix: hide reasoning_content from user progress updates by @VITOHJL in #1655
- fix(feishu): Prevent error logs from unhandled reaction and read events by @huhu-tiger in #332
- Fix: Telegram channel crash when proxy is configured by @dsxyy in #1535
- feat(telegram): add Telegram group topic support by @WufeiHalf in #1482
- fix problem with proxy for Telegram by @noki1928 in #1476
- fix(telegram): preserve file extension for generic documents by @ZXGERIC in #436
- feat(dingtalk): add support for group chat messages by @shawnWXN in #1467
- feat: enable QQ group message handling and dynamic reply dispatch by @zhenghan3852 in #532
- fix(auth): prevent allowlist bypass via sender_id token splitting by @Re-bin in #1677
- Update Slack message text fallback response by @alekwo in #673
- feat: multi-instance support with --config parameter by @shenchengtsi in #1581
- feat(cli): add workspace/config flags to agent by @maciejwojcik86 in #1635
- feat(qq): send messages using markdown payload by @TheAutomatic in #1727
- fix: handle CancelledError in MCP tool calls to prevent process crash by @pixan-ai in #1728
- chore: refine platform policy and memory SKILL docs by @VITOHJL in #1579
New Contributors
- @JackLuguibin made their first contribution in #1339
- @wenjielei1990 made their first contribution in #1406
- @cocolato made their first contribution in #1485
- @danielemden made their first contribution in #1525
- @bendusy made their first contribution in #1531
- @Liwx1014 made their first contribution in #1499
- @dmarkey made their first contribution in #1428
- @joel611 made their first contribution in #553
- @pikaqqqqqq made their first contribution in #1594
- @Wangshixiong made their first contribution in #1598
- @suger-m made their first contribution in #1567
- @gongpx20069 made their first contribution in #1555
- @hcanyz made their first contribution in #1546
- @fat-operator made their first contribution in #1638
- @04cb made their first contribution in #1637
- @kunalk16 made their first contribution in #1618
- @lzmjlrt made their first contribution in #1613
- @wb213 made their first contribution in #1610
- @hlibr made their first contribution in #1660
- @dsxyy made their first contribution in #1535
- @WufeiHalf made their first contribution in #1482
- @noki1928 made their first contribution in #1476
- @ZXGERIC made their first contribution in #436
- @shawnWXN made their first contribution in #1467
- @zhenghan3852 made their first contribution in #532
- @shenchengtsi made their first contribution in #1581
- @maciejwojcik86 made their first contribution in #1635
- @TheAutomatic made their first contribution in #1727
- @pixan-ai made their first contribution in #1728
Full Changelog: v0.1.4.post3...v0.1.4.post4