Skip to content

[Reminder] Add reminder skill with Tasks.org integration#391

Closed
keithvassallomt wants to merge 2 commits intoStypox:masterfrom
keithvassallomt:reminder-skill
Closed

[Reminder] Add reminder skill with Tasks.org integration#391
keithvassallomt wants to merge 2 commits intoStypox:masterfrom
keithvassallomt:reminder-skill

Conversation

@keithvassallomt
Copy link

Summary

Adds a new reminder skill that creates tasks in Tasks.org via voice commands. The skill uses the twofortyfouram Locale plugin broadcast protocol to communicate with Tasks.org.

  • Voice-activated task creation: "Remind me to buy milk", "Add groceries to my task list", etc.
  • Multi-language support: Sentence patterns for all 13 supported languages (cs, de, el, en, es, fr, it, nl, pl, ru, sl, sv, uk)
  • Configurable settings: Task priority (1–4) and option to save raw voice input
  • Full UI translations: Skill name, description, and settings strings for all 13 locales

Details

New files

  • ReminderSkill.kt — Core skill logic using StandardRecognizerSkill, broadcasts task to Tasks.org
  • ReminderOutput.kt — Compose UI output confirming task creation
  • ReminderInfo.kt — Skill registration with settings (priority, voice input saving)
  • SkillSettingsReminderSerializer.kt — Proto DataStore serializer for settings
  • skill_settings_reminder.proto — Protobuf schema for reminder settings
  • 13 reminder.yml sentence pattern files (one per language)
  • 13 strings.xml updates with 15 translated strings each

Modified files

  • SkillHandler.kt — Registered ReminderInfo in the skill list
  • skill_definitions.yml — Added reminder skill definition
  • README.md — Added reminder to the skills list
  • full_description.txt — Added reminder to the F-Droid/Play Store description

Test plan

  • ./gradlew assembleDebug builds successfully
  • Skill appears in the skill list in English
  • Voice/text command "Remind me to buy milk" creates a task in Tasks.org
  • Skill settings (priority, voice input) work correctly
  • Skill appears correctly when switching device language
  • Native speaker review of non-English sentence patterns recommended

Note

The non-English sentence patterns were drafted following existing Dicio skill patterns and linguistic conventions, but native speaker review is recommended before merging to ensure natural phrasing in all languages.

Resolve conflicts by keeping both reminder skill and upstream's
notify/flashlight additions in SkillHandler and full_description.
@keithvassallomt
Copy link
Author

Just bumping this :) If any further changes are required I'm more than happy to accommodate!

Copy link
Owner

@Stypox Stypox left a comment

Choose a reason for hiding this comment

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

Hello and thank you for the pull request. If I understand correctly, most of the code is generated by AI, including the PR body. I don't feel too happy with merging code I didn't write, but for which I still need to take full responsibility because no other human wrote/reviewed it properly. I still gave a very quick review though.

I did not read the PR body as that is most likely AI generated too, and as such is mostly useless. Please go through the changes in this PR, review them using your own knowledge, and if needed make changes to make the code better, e.g. use/put helper functions in util files that already exist. Finally, write a pull request body on your own without using an LLM.

I am sorry if I am coming off as harsh here, but you have to understand that the maintainer duties and responsibilities have remained the same as before AI existed. But now the creation of pull requests that are seemingly legitimate has become orders of magnitude easier, and maintainers still have to put in the same technical and emotional efforts into each of them.

One last thing: this skill's sentences are probably going to conflict with #381 so we will have to figure something out.

// Play Store not available, try browser
val webIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=org.tasks")
Copy link
Owner

Choose a reason for hiding this comment

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

Headline(text = getSpeechOutput(ctx))
Spacer(modifier = Modifier.height(8.dp))
TextButton(onClick = {
val intent = Intent(
Copy link
Owner

Choose a reason for hiding this comment

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

Use ShareUtils instead

@@ -246,4 +246,19 @@
<string name="skill_name_translation">Překlad</string>
Copy link
Owner

Choose a reason for hiding this comment

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

Delete all of the strings translations except those in english, which is the source language. Translations are made through Weblate.

@@ -0,0 +1,5 @@
create:
Copy link
Owner

Choose a reason for hiding this comment

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

Delete all of the sentence files except for languages you know. LLMs are very bad at writing these files.

}

companion object {
private const val TASKS_ORG_PACKAGE = "org.tasks"
Copy link
Owner

Choose a reason for hiding this comment

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

Mmmh, isn't there a built in Android API to achieve something like this? Could you do some research (you, not AI)?

rememberVectorPainter(Icons.Default.Notifications)

override fun isAvailable(ctx: SkillContext): Boolean {
return Sentences.Reminder[ctx.sentencesLanguage] != null
Copy link
Owner

Choose a reason for hiding this comment

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

Also make this unavailable if the Tasks.org app is not installed. Move the check over from the other file.

var taskTitle = rawTask
var dateTime: LocalDateTime? = null

if (parserFormatter != null) {
Copy link
Owner

Choose a reason for hiding this comment

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

Make use of the new date time matching introduced in d701d86

}

if (rawTask.isBlank()) {
return ReminderOutput.Created(title = "", dateTime = null)
Copy link
Owner

Choose a reason for hiding this comment

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

Create another class specifically for this

@keithvassallomt
Copy link
Author

Thank you for your response and for the time you've taken to review this PR. Of course, all of the points you've raised are 100% correct, except one - I really did write the PR body myself - guess I just sound a lot like AI 😅

I could make all the changes you have requested, but honestly I don't want to waste any more of your time. Your opinion (which is, once again, entirely valid) is that a PR with AI-generated code is only "seemingly legitimate", in other words it is illegitimate. Your position is entirely understandable from a maintainer's standpoint.

I've decided not to move forward with this and another PR I was working on. I apologise for the noise.

@keithvassallomt keithvassallomt deleted the reminder-skill branch March 8, 2026 18:11
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.

2 participants