Skip to content

Conversation

@celskeggs
Copy link
Contributor

@celskeggs celskeggs commented Nov 26, 2025

I'm a fan of checklists. I do many things that need to be done right every time, whether that's remembering my desk keys when I go to work each morning or whether that's remembering all the steps to bake a cherry pie. I find that voice checklists are especially useful whenever I'm doing something where my hands are not free, but when I last did my research, I was unable to find any voice checklist tools of acceptable quality that work on Android.

To solve this problem, I built out a "checklist" skill back in February that I've iterated on and I'd like to contribute back to Dicio upstream. I've used this skill probably 3 or 4 times a day on average since then. I think some additional refinement and testing will be required before it's ready to merge, but I'd like to get a first pass at the review.

Interactions with the "checklist" skill work as follows:

  1. First, the user defines a series of steps in a "checklist" for doing some activity using a settings menu in the app. (No voice interface for this step.)
  2. Then, every time the user wants to engage in that activity, they ask Dicio to "start the [activity] checklist."
  3. Dicio will read out each step, one at a time, and wait for the user to confirm they completed the item, for example by saying "check." The wakeword is not needed each time, because Dicio will automatically resume listening after each step.
  4. If the user is unable to complete an item on the checklist immediately, but wants to come back to it, they can ask Dicio to skip it, for example by saying "skip." After completing or skipping all other items, Dicio will return to any skipped items.
  5. If the user needs additional time to complete an item, they can tell Dicio to wait, for example by saying "hold on." Dicio will then stop listening. When the user is ready to resume the checklist, they can use the wakeword.
  6. If the user forgets where they were on the checklist or doesn't fully hear an item, they can ask Dicio to repeat an item, for example by asking for Dicio to "say that again."
  7. If the user wants to use another feature of Dicio, they can invoke another skill instead of providing a checklist-related response, and then use the wake word again to continue interacting with the checklist.
  8. When the checklist completes, Dicio summarizes by telling the user how long it took and ends the interaction. (The microphone is not re-enabled.)
  9. While using the checklist (or after using it), the user may discover that they can improve the checklist, for example by adding, removing, or rewording a step. They can do so using the settings menu and then pick up where they left off, without needing to restart the checklist.
  10. The user can run through the checklist as many times as they like. Each time they restart, the checklist items are marked as incomplete, so the user can start from the top.
  11. Checklists can be backed up by exporting them and the re-importing them later. In addition, this feature can be used to "generate" a checklist with another tool by formatting the checklist as protobuf JSON.

It's worth noting that this is not the same thing as a "reminder" skill or a "TODO list" skill. Since there is no voice interface for changing a checklist, and since items are not deleted on completion, this skill is primarily useful for standardizable checklists, recipes, or workflows. I intentionally left out the voice interface for changing a checklist, because I didn't want it to be easy to mess up a previously working checklist if Dicio misinterpreted a sentence. For that reason, I've second-guessed whether "checklist skill" is really the right name for what this does; another option might be to call it a "workflow" skill.

Please note that I do not have any meaningful experience with Kotlin or Android development. I'm happy to make changes to improve the quality of this code, but I would need pointers in the right direction.

Comment on lines +17 to +18
fun updateText(update: (String) -> String): ChecklistSkillOutput =
ChecklistSkillOutput(update(literal), interactionPlan)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, I need to remove this function. Simple enough; I'll roll that in to the next revision.

@celskeggs
Copy link
Contributor Author

Oh, and here's an example of a checklist that you can import if you just want to try out the voice interactions:

example.pb.json

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant