Import your audio notes from Otter directly into Roam!


You could use the Copy Extension button below to individually install this extension. To install, just paste anywhere in your Roam graph and click "Yes, I Know What I'm Doing".

Manual Installation

If the extension doesn't work after using the copy extension button above, try installing manually using the instructions below.

First create a block with the text {{[[roam/js]]}} on any page in your Roam DB. Then, create a single child of this block and type three backticks. A code block should appear. Copy this code and paste it into the child code block in your graph:

var existing = document.getElementById("roamjs-otter-main");
if (!existing) {
  var extension = document.createElement("script");
  extension.src = ""; = "roamjs-otter-main";
  extension.async = true;
  extension.type = "text/javascript";

Finally, click "Yes, I Know What I'm Doing".

Table of Contents


Otter extension imports your Otter voice transcription into Roam complete with time stamps.

Otter helps you capture, find, and share important moments from your meetings, interviews, and everyday conversations.Using AI, Otter listens to your voice conversations and generates “smart notes” – accurate, machine-generated text that is synchronized with audio and enriched with speakers tags and summary keywords.


👀Quick Preview

How to Use



The installation script will create a roam/js/otter page. Navigate to that page, then enter your email and password associated with your Otter account. If you signed up on Otter using a Google account, you will need to generate a password and use that email/password pair.

Warning: The extension will need to send your credentials to RoamJS' backend in order to import your notes. We do not store your credentials anywhere. If you are uncomfortable sharing your credentials with RoamJS' backend, do not use this extension.

This is necessary because Otter does not currently support a public-facing API.


Hit CMD+p (CTRL+p on Windows) to open the Roam command palette. Click the new Import Otter command. The command will open a dialog displaying the ten most recent recordings tied to your account.

Hit CMD+p (CTRL+p on Windows) to open the Roam command palette. Click the new Import Otter command. The command will open a dialog displaying the ten most recent recordings tied to your account. Click the one you'd like to import and hit the import button to enter the notes into Roam!


You can customize the format of the transcript into Roam by adjusting the label and/or the template.


The label is the first block that gets created when you import an Otter Note. All the transcripts will be nested under this block. You can configure what the label says on the roam/js/otter page. The label supports the following placeholders:

  • {title} - The title of the note, using Untitled if there is none.

  • {summary} - The summary given by Otter as a list of keywords.

  • {created-date} - The date the note was created.

    • You could also pass in a custom format after a colon within the placeholder. For example, {created-date:[[MMMM do, yyyy]]} will output the created date as a Roam page.

  • {link} - The link to the note on Otter

By default, the label has a value of {title} - {summary} ({created-date})


The template is the format used for every transcript in the note, each nested under the label. You could configure what the template looks like on the roam/js/otter page. The template supports the following placeholders:

  • {start} - The start time of the transcript

  • {end} - The end time of the transcript

  • {text} - The Otter recorded text of the transcript

  • {speaker} - The speaker linked to the text of the transcript. To use speaker initials instead, add an initials argument at the end like {speaker:initials}.

By default, the transcript has a value of {start} - {end} - {text}.

Sample of default label and template:

Auto Import

Enabling this flag will import any new conversations into Roam into the daily notes page. Be careful - the first time you enable this, it will import your latest 20 conversations since none of them have been marked as imported before.

Extra Features

This extension is integrated with SmartBlocks! It registers a <%OTTER%> command for importing your latest unimported conversations.


There is an active community at channels #roam42 and #roam-js. Stop by if you need help or want to share your ideas.


This extension is brought to you by RoamJS! If you are facing any issues reach out to or click on the chat button on the bottom right.

If you get value from using this extension, consider sponsoring RoamJS by clicking on the button below!

A special thanks to those who's contributions also helped make this extension possible:

Jordan B Burton
Jordan B Burton

Other Extensions