logo

Contributing to OSS with reproducible bug reports

I recently participated in a Twitter Space about contributing to open source projects. During this event, I talked about how contributing to open source has helped me as a developer and to learn from a community.
I also discussed that contributing to open source doesn’t have to be coding a new feature. You can also help with documentation and submit helpful bug reports for maintainers.
If you’d like to contribute to open source but aren’t sure where to start, here’s a story of how we helped debug an issue with the open source project Excalidraw using Replay.

The problem

Excalidraw is a whiteboarding app that we use here at Replay. This GitHub issue initially reported the bug. When an element is resized down to a height or width of zero, the element locks up and can no longer be resized.
Image without caption
There wasn’t a lot of activity on the issue since first being reported, and there was not a reproducible example. I encountered this issue myself, and decided to record it with Replay to dig in.

The replay

Replay lets you record an issue and share it with the team so that anyone can debug it after the fact with familiar browser developer tools built in. Recording a bug with replay and creating a GitHub issue can be a helpful way to contribute to a project. Bugs are difficult — nearly impossible — to resolve if they can’t be reproduced.
In the replay here, I recorded myself creating an element, resizing it down to zero, and captured the behavior where it locks up.
Image without caption
Replay of the bug
If you encounter a bug with an open source project, you can create a recording with replay and attach it to your GitHub issue. This provides a valuable reproducible example for the maintainer.

The debugging process

Providing a replay alone is helpful, but I decided to dive deeper and see if I could find out more about what was causing the issue.
Here is a video of my debugging process:
I was able to use a combination of React DevToolsSource Explorer, and Print Statements to find the source of the error.
Here is the process I followed:
1. I inspected components in React DevTools tab to find app state. Here I noticed properties like isResizing and resizingElement, which let me know that there is specific functionality related to resizing an element.
2. I searched resize in Function Search, which had a few results. I tried resizeSingleElement and saw it had 95 hits, which means it was executed 95 times.
Image without caption
Function Search
Image without caption
This line executed 95 times — bingo!
3. I read through the function and found eleNewWidth , which I logged to the console using Replay’s print statements. Print statements lets you output values to the console like you would with console.log(), but right from the replay. It outputs the value from each time the function executed during the recorded. Here, I could see the eleNewWidth reduce each time until its value becomes NaN.
Image without caption
Print statements to the console with Replay
4. We’re getting closer! I assume that we always want the new width to be a number, so this is likely the source of the bug. Let’s go a little further and see why this is happening. First, I fast-forwarded to the console message where eleNewWidth is NaN to focus in on this point in time.
5. I found in the function where eleNewWidth is calculated based on element.width and scaleX. I logged scaleX to the console and see it that after 0 it becomes -Infinity. So close now!
Image without caption
Logging the value of scaleX shows it eventually becomes -Infinity
💡 In the print statement, I’m only logging scaleX when the element.width is less than 4. Replay allows for this conditional logging which helps keep the console neat and only shows the information I need to debug.
6. On line 451 the code is dividing by boundsCurrentWidth to calculate scaleX. In Replay, I can hover over the variable in my code to see the current value, 0. Because dividing by 0 is impossible, it evaluates to -Infinity and breaks the application.
Image without caption
Dividing by zero, a classic math problem.
7. With Replay, I can add a comment directly to the line of code and the moment in time where the error occurs. This makes it easy for the maintainer to see what is causing the bug and approach how to fix it.

What’s next

As you can see, adding value as a contributor to an open-source project doesn’t require writing a single line of code. You can:
  • Submit reproducible bug reports
  • Investigate bugs and provide context for maintainers
  • Document the codebase
Replay can help with all three. If you record or solve a bug with Replay, let us know! We’d love to add your contribution to our Replay Examples page.
💡 Do you have an open-source project? Replay provides free plans to OSS projects so you can resolve user issues faster, record automated tests, and upload source maps. Contact us at support@replay.io or in Discord to get started!
Related posts
post image
The best way to setup an octokit instance so that it can interact with the API on your behalf.
post image
How to set up a GitHub App that can listen for pull requests and create checks.
Powered by Notaku