I love to contribute to Open Source projects. Besides being a maintainer of a top 1000 Python library, my contributions have mostly been little bits here and there, fixing bugs as I find them in projects I use. You can find my contributions on the following platforms:

Specific Projects


Foam is a personal knowledge management and sharing system inspired by Roam Research, built on Visual Studio Code and GitHub.

I took on the project of designing and implementing a unified user experience for creating notes from templates (“Templates v2”).

This involved:

  • Designing a new user experience for note templates:
    • Allowing for templates to be able to be used by all the note creation mechanisms, unifying their differing needs into a cohesive and simple mental model that users could reason about.
    • Extending the syntax of templates, in order to support useful metadata
  • Drafting the proposed changes as a proposal document; communicating clearly and asynchronously with all of the relevant stakeholders
  • Actually implementing the changes. More than a dozen PRs and counting…

This has been a solo passion project, and I’m very pleased with the results so far.

Libraries Written


ciso8601 is the world’s fastest Python library for parsing ISO 8601 timestamps. I completely rewrote the existing ciso8601 library, creating version 2.0.0.

As part of the rewrite I:

  • Fixed the interface to have consistent error handling (the most asked for issue)
  • Improved test coverage by automatically generating test cases for all valid formats.
  • Made it >65% faster

It is now the fastest way to parse ISO 8601 in Python, by far!


backports.datetime_fromisoformat is a simple backport of Python 3.7’s datetime.fromisoformat methods to earlier versions of Python 3.


progress_tracker is a simple (yet flexible) way to add processing progress logging to your Python scripts.

>>> from progress_tracker import track_progress
>>> for _ in track_progress(list(range(1000)), every_n_records=100):
...     continue
100/1000 (10.0%) in 0:00:00.000114 (Time left: 0:00:00.001026)
200/1000 (20.0%) in 0:00:00.000274 (Time left: 0:00:00.001096)
300/1000 (30.0%) in 0:00:00.000374 (Time left: 0:00:00.000873)
400/1000 (40.0%) in 0:00:00.000473 (Time left: 0:00:00.000710)
500/1000 (50.0%) in 0:00:00.000572 (Time left: 0:00:00.000572)
600/1000 (60.0%) in 0:00:00.000671 (Time left: 0:00:00.000447)
700/1000 (70.0%) in 0:00:00.000770 (Time left: 0:00:00.000330)
800/1000 (80.0%) in 0:00:00.000868 (Time left: 0:00:00.000217)
900/1000 (90.0%) in 0:00:00.000979 (Time left: 0:00:00.000109)
1000 in 0:00:00.001086

Bug Patches

Bugs Reported