One type guard, one PR, one merge. From user to contributor.
I have been using OpenClaw for a while now. Every day, I collaborate with Pingu in the terminal: writing articles, managing projects, running cron jobs, organizing health data. Half of my digital life happens inside OpenClaw.
Use something long enough, and you naturally hit edge-case bugs.
Finding the Bug
This bug appeared in the Telegram integration. OpenClaw has a describeReplyTarget function responsible for parsing Telegram message reply context, meaning the content of the message being replied to.
The problem was that Telegram API’s replyLike.text is not always a string. Sometimes it is an ExternalReplyInfo object. But the original code called .trim() on it directly:
const rawText = replyLike.text ?? replyLike.caption ?? "";
return rawText.trim(); // If rawText is an object → TypeError
Objects do not have a .trim() method, so it throws a TypeError.
The Fix
The fix was simple: one type guard.
const rawText = replyLike.text ?? replyLike.caption ?? "";
const safeText = typeof rawText === "string" ? rawText.trim() : "";
In the same function, quoteText already used the exact same pattern. This change simply added the existing defensive logic to the missing spot.
I also added a regression test to make sure non-string values would not crash again:
// Pass in text: { some: "object" } → should return null, not throw
Submitting the PR
PR #50500, title:
fix(telegram): add type guard for reply context text
After submission, Greptile, the automatic code review bot, gave 5/5 confidence:
“This PR is safe to merge: the change is minimal, correct, and well-tested.”
Maintainer @obviyus merged it into main on 3/23 and left one line:
“Thanks @p3nchan.”
No back-and-forth edits, no request changes. First shot landed.
Reflection
This was my first PR to a large open-source project that got merged.
The change was tiny: one type guard, a few lines of code. But the shift from “user” to “contributor” felt much more important than the code itself.
Good open-source contributions often look like this. You find a problem in daily use, then fix it while it is still fresh. That is more practical than some grand refactor.
The tool you use every day may already contain a small bug waiting for you to fix.
Play seriously, move slowly.
Further Reading
Penchan’s Take
OpenClaw is one of my core daily tools. I use it for writing articles, managing projects, and running cron jobs. After enough use, edge-case bugs naturally surface. This Telegram reply context type issue was triggered in normal daily use. I expected my first PR to a large open-source project to involve a lot of back-and-forth, but it landed on the first try, which surprised me a little. Fixing something you actually use is a smoother path than I expected.
FAQ
Q: What is OpenClaw?
OpenClaw is an open-source AI CLI tool that lets you interact with AI in the terminal, execute code, manage files, and automate workflows.
Q: What did this PR fix?
It fixed a runtime error in Telegram reply context text. When the API returned a non-string value, the original .trim() crashed. Adding a type guard solved it.
Q: Is a first open-source contribution hard?
Not hard, but you need the right entry point. Starting from a bug you personally hit makes the fix natural, and reviewers can easily understand the motivation.
— Penchan