Dictate bug reports

Say a rough note about a bug, press B, and get a structured bug report in any text field. One prompt step in config.yaml, run on a model you pick.

What you will get

You dictate a rough note into the issue form. The pill shows a Bug report chip. You press B, and the note is replaced by a report.

You say You get, after pressing B
so when I click save on the settings page nothing happens it just spins forever I’m on Safari it worked yesterday I think it started after the last deploy the report below
# Bug Report

## Summary
Clicking "Save" on the settings page causes the page to spin indefinitely.

## Steps to reproduce
1. Navigate to the settings page.
2. Click "Save".

## Expected
The settings should save successfully.

## Actual
The page spins forever after clicking "Save".

## Environment
* Browser: Safari
* Notes: The issue may have started after the last deploy.

This is real output from gemma4:e4b-mlx through Ollama, with the prompt on this page. Another model, or another run, writes it differently.

Only this step rewrites your words

A prompt: step is the only kind of step that rewrites your text with a language model. It runs only when you add one. The built-in steps never rewrite a sentence.

A new config ships one prompt step, grammar, on the G chip. It runs only when you press G. The bug report step works the same way. It runs when you press B or click its chip, and not on every dictation.

What you need

  • ParrotFlow, with its permissions. See Install and Permissions.

  • A model in the models: section of config.yaml. A config written by a recent install already has this one:

    models:
      gemma:
        api: ollama
        model: gemma4:e4b-mlx
        keep_loaded: true
        default: true

    It runs on your Mac through Ollama. If Ollama or the model is missing, see Format dictation with a local model.

  • The Input Monitoring permission, for the B key. Without it, the chip still works with a click, and the letter types instead.

Steps

  1. Open ~/.config/parrotflow/config.yaml. From the menu bar, use Settings, then Edit Config.

  2. Add this transform under the transforms: key that is already in the file:

    transforms:
      - name: Bug report
        description: turn a spoken note into a bug report
        display: Writing the bug report
        offer: true
        key: b
        model:
          use: gemma
          max_tokens: 800
        prompt: |
          Rewrite the dictated note as one bug report in Markdown.
    
          Use these headings, in this order: Summary, Steps to reproduce,
          Expected, Actual, Environment. Use only facts the note states. Where
          the note says nothing, write "Not stated". Do not offer options, do
          not add advice, do not ask questions.
    
          Return only the report.

    What each key does:

    • name is the label on the chip.
    • description is what “hey parrot, …” matches your words against. Without one, --check-config reports an error for this transform.
    • display is what the menu bar says while the model works.
    • offer: true puts a chip on the pill after each dictation. key: b is the letter on it.
    • model names an entry in models:. max_tokens gives the answer room to grow. Without it, the limit follows the length of what you said, and a long report from a short note can be cut off.
    • prompt is the instruction the model gets. Your dictation is sent with it.

    The README shows a shorter version, with only name, prompt: Turn this into a bug report., offer and key. It works, with two problems. --check-config reports the missing description as an error. And on gemma4:e4b-mlx, that one-line prompt returned several options for a report, with advice, and was cut off at the length limit. The longer prompt above asks for one report with fixed headings.

  3. Do not add this transform to the pipeline. In the pipeline it would run on every dictation.

  4. Save the file. The app reloads it at once.

Use it

  1. Click in the issue form, in GitHub, Linear or any app.
  2. Hold the hotkey and say the note. Release the key.
  3. The pill shows Vocabulary and your chips. Press B, or click Bug report.
  4. The menu bar says “Writing the bug report…”. Then the report replaces the note, with no preview.

The chips stay on the pill for a few seconds. For a note you dictated earlier, select it, tap the hotkey, and press B. A tap brings the pill back over the selection.

If the model fails or changes nothing, your note stays as it was. The menu bar says why.

Check that it worked

Ask the app what it loaded:

/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --check-config

If you installed with Homebrew, parrotflow runs the same binary.

Look for these lines:

      Bug report → gemma (ollama, gemma4:e4b-mlx, reasoning off)
  · offer             3 transform(s) on the pill, after Vocabulary
      grammar — G
      slack_mentions — S
      Bug report — B

This is a new config with the transform added at the end of transforms:. The chips follow the order of the file.

Then run the prompt on a sentence, with no microphone:

/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --prompt "Bug report" "" "so when I click save on the settings page nothing happens it just spins forever I'm on Safari it worked yesterday I think it started after the last deploy"

The empty "" is the spoken instruction, which a chip does not have. The output has the report on the out: line, then the model and the time it took:

             gemma4:e4b-mlx in 5.57s

--prompt runs on your default model and ignores the model: line of the transform. With one model, that is the same model.

Last, dictate a note into a real issue form and press B.

Change the model

The report can run on a remote model instead. Add it to models: and name it in the transform:

models:
  gemma:
    api: ollama
    model: gemma4:e4b-mlx
    default: true
  gpt:
    api: openai
    model: gpt-5.6-luna
    model:
      use: gpt
      max_tokens: 800

A remote model gets the text of every note you send to it. --check-config says so on a line that starts with · models: "gpt" sends text off this Mac. The app asks for the key and stores it in the keychain. From a terminal, run --set-key gpt.

Limits

  • A model can add facts that are not in your note. Read the report before you submit it.
  • The report is Markdown text. An app that does not render Markdown shows the # and * as typed.
  • A prompt step takes a second or more. The docs measure about 1.5 s with the model loaded and 6.7 s when Ollama must load it first. A long report takes longer.
  • The B key is taken from every app while the pill is up. If you type a word that starts with B right after a dictation, the first keystroke runs the chip.