Send feedback

Getting Started

Welcome to the Serenade docs! Here, you'll find an overview of everything Serenade can do, along with examples. First, let's get Serenade installed on your device.

Download

First, download and install Serenade. Serenade supports macOS, Windows, and Linux—platform-specific installation instructions can be found on the download page.

Setup

After installing Serenade, you'll be prompted to activate the app via an email link. If that link doesn't work, you can use the code provided on the activation page to activate manually.

The Serenade application will help you install the extension from the Chrome Web Store.

You can use Serenade with your laptop microphone, though we recommend using a headset for the best accuracy. You can verify that a headset is being used by clicking , and then Settings.

Environment

Serenade floats above all your other windows, so you can keep it side-by-side with your editor. You can toggle Serenade by clicking the Listening switch or pressing Alt+Space. Then, as you speak, you'll see a list of transcripts in the Serenade window.

Sometimes, Serenade isn't sure what you said, so you'll see a few different options. The first one will be used automatically, but to use a different option (and undo the first one), just say the number you want to use instead. For instance, to use the second option, just say two. If none of the options are right, you can just say undo.

Concepts

Throughout the documentation, you'll see blocks that look like this:

Syntax

add [<type>] (function | method) <identifier>

Examples

voice
add method fly
before
class Bird:
    pass
after
class Bird:
    def fly(self):
        pass

Each block shows the syntax for the voice command followed by several examples. To change the programming language used in the examples, use the language switcher in the navigation bar.

  • Text in <angle brackets> is free-form text, like the name of a function or variable.
  • Text separated by pipes, like (foo | bar), represents a list of choices (i.e., an or).
  • Text in [square brackets] is optional.

Tab Management

You can use Serenade to manage your browser tabs.

Create a new tab

new tab

Close the current tab

close tab

Switch to the next or previous tab

(next | previous) tab

Switch to a specific tab

tab (one | two | three ...)

Switch to a specific tab

(first | second | ...) tab

Adding Text

After focusing an input, you can use the commands described in this section to add text to it.

Raw Text

The type command inserts text at the current cursor position, and it's the simplest way to add text. The type command is useful when you just want to insert plain text. For instance, you could use a type command to append text to the end of an existing line of code.

Syntax

type [above | below] <text>

Examples

voice
type hello
result
hello
type in quotes hello comma world
"hello, world"
type camel case hello world
helloWorld
type a plus b greater than three or not c
a + b > 3 || !c
voice
type above hello
before
world
after
hello
world
type below world
hello
hello
world

The dictate command inserts text, but doesn't convert coding symbols to their equivalents. This can be useful for writing comments or docs, rather than code.

Syntax

dictate <text>

Examples

voice
dictate a plus b greater than not c
result
a plus b greater than not c

Finally, system command inserts text wherever your cursor has focus. For instance, if you're using VS Code and open a "Find" dialog, system will type into that find dialog rather than the main text editor.

Syntax

system <text>

Examples

voice
system hello world
result
hello world

Editing Text

You can also edit the contents of inputs using the commands described in this section.

Deleting

You can delete code with the delete command.

For a complete list of selectors, check out the selectors reference.

Syntax

delete <selector>

Examples

voice
delete line six
before
class Bird:
  def chirp(self):
    print("chirp")

  def fly(self):
    # TODO
    pass
after
class Bird:
  def fly(self):
    pass
delete method
class Bird:
  def chirp(self):
    print("chirp")

  def fly(self):
    # TODO
    pass
class Bird:
  def fly(self):
    # TODO
    pass
delete lines five to seven
class Bird:
  def chirp(self):
    print("chirp")

  def fly(self):
    # TODO
    pass
class Bird:
  def chirp(self):
    print("chirp")
delete to end of word
class Bird:
  def chirp(self):
    print("chirp")

  def fly(self):
    # TODO
    pass
class B:
  def fly(self):
    # TODO
    pass
delete next two methods
class Bird:
  def chirp(self):
    print("chirp")

  def fly(self):
    # TODO
    pass
class Bird:
  pass

Changing

The change command selects the nearest match to the cursor and replaces it with some text.

For a complete list of selectors, check out the selectors reference.

Syntax

change <selector> to <text>

Examples

voice
change fly to jump
before
def fly():
    pass
after
def jump():
    pass
change parameter to height
def fly(elevation):
    pass
def fly(height):
    pass

You can also say 'rename' to change the name of a function, variable, class, or other named selector

Syntax

rename <selector> to <text>

Examples

rename function fly to jump
def fly():
    pass
def jump():
    pass
rename parameter to height
def fly(elevation):
    pass
def fly(height):
    pass

Selecting

You can use commands likecopy, cut, select,paste and duplicate to manipulate text.

For a complete list of selectors, check out the selectors reference.

Syntax

(copy | cut | select) <selector>

Examples

copy first function
copy lines fifty to sixty
cut next class
cut next two words
select to end of block
select words one to three

Syntax

paste [above | below | inline]

Examples

paste
paste below

Duplicate copies your selection and pastes it above or below your cursor.

Syntax

duplicate <selector> [above | below]

Examples

duplicate line below
duplicate function foo above

Tips and Tricks

  • Instead of worrying about spacing while writing code, use style file once your code is in a reasonable state, and Serenade will automatically format the entire file.
  • Long type or add commands can be less accurate than shorter commands. If you're seeing low accuracy, try breaking up longer commands into smaller, separate commands.
  • The type and add commands are similar, but have distinct use cases—add works best for writing new lines of code, including larger constructs like functions or classes, while type works best for inserting or appending text to an existing line.
  • Use copy/cut, paste, and go to liberally in order to more quickly move code around.
  • Make sure your system's microphone volume is set to the right level. We've found that around 80%, to make sure the input isn't too loud or too quiet, works best, but try moving it around if Serenade's results aren't accurate.
  • When using Serenade, try to speak conversationally, as though you were pair programming with someone seated next to you. Over-enunciating words can actually make Serenade less accurate!
  • If Serenade doesn't know a word, like numpy, you can spell it in a command, as with add import n u m p y.

FAQ