We set out from day one for XMTP to be a fully distributed, time-zone agnostic company. Because that’s one of our founding principles, we are therefore an asynchronous-by-default company. But that doesn’t mean that there isn’t good reason to go synchronous from time to time, when the discussion calls for a higher information throughput.

Establishing our best practices for communication means matching the channel with an intended purpose. Here is how we have it set up at XMTP:


Channel Time Purpose
Discourse Async Complete thoughts, unstructured, and public-by-default. Also home to our Handbook.
Voodle Async Sharing async video updates, primarily for standups and new ideas while on-the-go.
Loom Async Async screen sharing, complete thoughts, and high fidelity. To be shared in Discourse and Slack.
Slack Sync Synchronous for whoever might be logged in (and bots), unstructured, ephemeral
Jams Sync Ad-hoc, unstructured time to collaborate on ideas.
Meetings Sync Higher fidelity, to be used when above methods aren’t enough to collaborate.
Email Sync Should be used sparingly as it does not easily allow for long-term institutional knowledge like Discourse.

More on Channels

  • Our Handbook changes less frequently than other communication. It’s set up in Discourse so that it’s easy to navigate and answer questions quickly.
  • Discourse is where most communication should happen and is our primary asynchronous channel. We also try to communicate primarily in the public, so that our community can also participate. But we do have internal channels that are exclusive for team members.
  • Slack is for notifications, bots, and unstructured communication that should be treated as ephemeral. We can also make use of the /discourse command to post transcripts of discussions for long-term retention in Discourse.
  • We may use standing Meetings for high bandwidth check-ins, and also ad-hoc meetings when the above methods are not sufficient. Check out Meeting Guidelines for some best practices.