13 Commits
Author SHA1 Message Date
Jean-Luc Makiolaandmakiolaj 633ec5b5d3 Move the privacy policy into the repo (#12)
Release — F-Droid repo + Gitea/Codeberg release / detect (push) Successful in 8s
Release — F-Droid repo + Gitea/Codeberg release / release (push) Skipped
The policy had no copy in this repository — it existed only inside the Astro page on jeanlucmakiola.de. This file becomes the single copy: the website build checks this repo out beside itself and renders `docs/PRIVACY.md` through a content collection, so the published page and the app's own documentation cannot drift. Same arrangement as calendula#293.

Shaped as the content entry the site expects: `title` / `description` / `updated` frontmatter, an HTML maintainer note that cannot render, and a body starting below the `h1` the page supplies.

The text is the published page carried over in full — controller and postal address, the two storage modes, CalDAV sync (what is stored, what is transmitted, RFC 6764 discovery, Nextcloud Login Flow v2, the user-CA trade-off), reminders and export, backups, crash reports, external links, permissions, distribution channels, deletion paths and GDPR rights.

Two things differ from the older short version that lived on `feat/caldav-sync`:

- Contact is `business@jeanlucmakiola.de`, matching the site and Calendula's policy, rather than `mail@`.
- Cleartext HTTP is described as refused outright. `CalDavDiscovery.allowCleartext` is `false` with nothing wiring it true, and `network_security_config.xml` sets `cleartextTrafficPermitted="false"`, so the previous "unless you explicitly opt in for a specific account" described a feature that does not exist. It goes back if a per-account opt-in ships.

Split out of `feat/caldav-sync` so the website change is not waiting on the whole sync branch. No issue to close — there is no open privacy/policy issue to reference.

Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de>
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/12
2026-09-09 16:52:17 +02:00
Jean-Luc Makiola d7131087cb Merge pull request 'release: cut 0.4.0 — ship German and Brazilian Portuguese' (#9) from release/v0.4.0 into main
Release — F-Droid repo + Gitea/Codeberg release / detect (push) Successful in 5s
Release — F-Droid repo + Gitea/Codeberg release / release (push) Successful in 12m30s
Renovate / renovate (push) Failing after 40s
2026-08-31 19:02:24 +02:00
makiolajandClaude Opus 5 dfb0a694de release: cut 0.4.0 — the first translated release
Ships the first community translations: German (98%) and Brazilian
Portuguese (100%), both from Weblate, plus the translation infrastructure
and the Codeberg forge move that had accumulated under Unreleased.

A minor bump rather than a patch: two new user-facing languages is a
feature, the way 0.3.0 was cut for Reminders.

versionCode is the derived 400 (MAJOR*10000 + MINOR*100 + PATCH), and
scripts/sync_changelog_to_fastlane.sh generated changelogs/400.txt so the
official F-Droid listing shows this version's "What's New". At 908 chars
it exceeds the script's 500-char advisory and may be truncated in-client
— consistent with past feature releases (0.2.0 ran 1811, 0.3.0 692).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146mhMLZ5AqJSZkADDc92Jz
2026-08-31 18:27:25 +02:00
makiolajandClaude Opus 5 79970b5c65 l10n: make German and Brazilian Portuguese selectable
The Weblate merge (#8) landed values-de and values-pt-rBR, but
locales_config.xml still listed only `en`. That file is the single source
of truth for which languages the app ships: AppLanguage parses it for the
in-app picker (Settings -> App language) and android:localeConfig points
the system per-app language settings at it. So both translations were
compiled into the APK and reachable by nothing — you could not pick either
one, and only a device already set to de/pt-BR would ever have seen them.

Adds the two BCP-47 tags. Note the tags are `de` and `pt-BR` while the
resource folders are values-de and values-pt-rBR; the `r` is an Android
resource-qualifier artefact and must not appear here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146mhMLZ5AqJSZkADDc92Jz
2026-08-31 18:27:14 +02:00
Jean-Luc Makiola 5b31067e43 Translations update from Weblate (#8)
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/8
2026-08-31 18:19:53 +02:00
Bernardo Krzysczak c69ff049a0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (182 of 182 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/pt_BR/
2026-08-21 07:41:09 +00:00
Bernardo Krzysczak 81220d53d1 Added translation using Weblate (Portuguese (Brazil)) 2026-08-20 13:18:29 +00:00
makiolaj b3091a5aa3 Translated using Weblate (German)
Currently translated at 98.9% (180 of 182 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-18 01:04:09 +00:00
Weblate b1bde2fab5 Translated using Weblate (German)
Currently translated at 98.9% (180 of 182 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-18 01:04:09 +00:00
makiolaj abc381ca24 Translated using Weblate (German)
Currently translated at 98.8% (177 of 179 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-14 13:22:24 +00:00
Weblate 1fbd91fe82 Translated using Weblate (German)
Currently translated at 98.8% (177 of 179 strings)

Translation: Agendula/agendula
Translate-URL: https://weblate.dev.jeanlucmakiola.de/projects/agendula/agendula/de/
2026-08-14 13:22:24 +00:00
makiolaj c2087de639 Added translation using Weblate (German) 2026-08-14 13:22:24 +00:00
Jean-Luc Makiola c47653c9cb Merge pull request 'Use floret-kit's shared snack chip' (#6) from feat/shared-snack-chip into main
Renovate / renovate (push) Failing after 43s
Release — F-Droid repo + Gitea/Codeberg release / detect (push) Successful in 7s
Release — F-Droid repo + Gitea/Codeberg release / release (push) Has been skipped
2026-08-02 20:46:11 +02:00
7 changed files with 660 additions and 2 deletions
+7
View File
@@ -7,7 +7,14 @@ All notable changes to this project are documented here. The format follows
## [Unreleased]
## [0.4.0] - 2026-08-31
### Added
- Agendula now speaks **German** and **Brazilian Portuguese**, the first
community translations. Pick one under **Settings → App language**, or in
Android's own per-app language settings; leave it on *System default* and
Agendula follows your phone. Anything not yet translated falls back to
English.
- Agendula can now be translated. Pick or request a language on Weblate and
translate in the browser — the link sits at the top of the language picker in
**Settings → App language**. Partial translations are fine; anything
+2 -2
View File
@@ -29,8 +29,8 @@ android {
// release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 +
// PATCH from versionName, e.g. 0.2.0 -> 200). The Gitea release is marked
// as a pre-release while MAJOR is 0. See docs/RELEASING.md.
versionCode = 302
versionName = "0.3.2"
versionCode = 400
versionName = "0.4.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
+190
View File
@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="back">Zurück</string>
<string name="save">Speichern</string>
<string name="delete">Löschen</string>
<string name="edit">Bearbeiten</string>
<string name="field_description">Beschreibung</string>
<string name="task_deleted">Gelöscht</string>
<string name="app_name">Agendula</string>
<string name="task_untitled">Unbenannte Aufgabe</string>
<string name="tasks_title">Aufgaben</string>
<string name="task_list_empty">Keine Aufgaben bisher.</string>
<string name="task_list_failure">Aufgaben konnten nicht geladen werden.</string>
<string name="smart_no_date">Kein Datum</string>
<string name="smart_completed">Abgeschlossen</string>
<string name="task_detail_title">Aufgabe</string>
<string name="task_detail_not_found">Diese Aufgabe ist nicht mehr verfügbar.</string>
<string name="edit_task_title">Aufgabe bearbeiten</string>
<string name="new_task_title">Neue Aufgabe</string>
<string name="field_title">Titel</string>
<string name="edit_save_failed">Konnte nicht gespeichert werden. Versuche es erneut.</string>
<string name="add_task_hint">Aufgabe hinzufügen</string>
<string name="add_subtask_hint">Unteraufgabe hinzufügen</string>
<string name="cd_add_task">Aufgabe hinzufügen</string>
<string name="cd_complete">Abgeschlossen</string>
<string name="cd_reopen">Erneut öffnen</string>
<string name="undo">Rückgängig</string>
<string name="section_today">Heute</string>
<string name="cd_expand_subtasks">Unteraufgaben anzeigen</string>
<string name="cd_collapse_subtasks">Unteraufgaben ausblenden</string>
<string name="section_overdue">Überfällig</string>
<string name="section_upcoming">Anstehend</string>
<string name="section_no_date">Kein Datum</string>
<string name="section_completed">Abgeschlossen</string>
<string name="priority_none">Keine</string>
<string name="priority_low">Niedrig</string>
<string name="priority_medium">Mittel</string>
<string name="priority_high">Hoch</string>
<string name="detail_mark_complete">Als abgeschlossen markieren</string>
<string name="detail_mark_incomplete">Als nicht abgeschlossen markieren</string>
<string name="detail_list">Liste</string>
<string name="detail_due">Fällig</string>
<string name="detail_start">Beginn</string>
<string name="detail_priority">Priorität</string>
<string name="detail_progress">Fortschritt</string>
<string name="detail_subtasks">Unteraufgaben</string>
<string name="detail_parent">Hauptaufgabe</string>
<string name="detail_part_of">Teil von</string>
<string name="edit_list_label">Liste</string>
<string name="edit_start_label">Beginn</string>
<string name="edit_due_label">Fällig</string>
<string name="edit_all_day">Ganzer Tag</string>
<string name="edit_priority_label">Priorität</string>
<string name="edit_progress_label">Fortschritt</string>
<string name="edit_parent_label">Hauptaufgabe</string>
<string name="edit_parent_none">Keine (Hauptebene)</string>
<string name="edit_parent_search">Aufgaben suchen</string>
<string name="edit_parent_empty">Keine passenden Aufgaben in der Liste gefunden.</string>
<string name="edit_reminder_label">Erinnerungen</string>
<string name="edit_set">Übernehmen</string>
<string name="edit_clear">Leeren</string>
<string name="edit_title_hint">Aufgaben-Titel</string>
<string name="edit_when">Wann</string>
<string name="edit_more_fields">Weitere Felder</string>
<string name="close">Schließen</string>
<string name="dialog_cancel">Abbrechen</string>
<string name="edit_conflict_title">Termin wurde extern geändert</string>
<string name="edit_conflict_body">Die Aufgabe wurde seit der Öffnung wo anders geändert (über Sync oder einer anderen App). Möchtest die Änderungen überschreiben?</string>
<string name="edit_conflict_overwrite">Überschreiben</string>
<string name="reminder_none">Keine</string>
<string name="reminder_at_due">Zum Start der Aufgabe</string>
<string name="reminder_5_min">5 Minuten vorher</string>
<string name="reminder_10_min">10 Minuten vorher</string>
<string name="reminder_30_min">30 Minuten vorher</string>
<string name="reminder_1_hour">1 Stunde vorher</string>
<string name="reminder_1_day">1 Tag vorher</string>
<string name="reminder_custom">Benutzerdefiniert</string>
<string name="reminder_custom_with_value">Benutzerdefiniert (%1$s)</string>
<string name="reminder_custom_set">Übernehmen</string>
<string name="reminder_custom_amount">Anzahl eingeben</string>
<string name="reminder_use_default">Standard verwenden</string>
<string name="reminder_unit_minutes">Minuten</string>
<string name="reminder_unit_hours">Stunden</string>
<string name="reminder_unit_days">Tage</string>
<string name="reminder_unit_weeks">Woche</string>
<string name="settings_list_reminders_title">Erinnerungen (Pro Liste)</string>
<string name="settings_list_reminders_hint">Überschreibe die Standard-Erinnerungen für individuelle Listen</string>
<string name="settings_list_reminder_inherits">Standard (%1$s)</string>
<string name="error_blank_title">Gebe einen Titel ein.</string>
<string name="error_no_list">Wähle eine Liste.</string>
<string name="error_due_before_start">Fälligkeit darf nicht vor dem Start liegen.</string>
<string name="error_reminder_without_due">Setze ein Fälligkeits-Datum für Erinnerungen.</string>
<string name="lists_header">Listen</string>
<string name="new_task">Neue Aufgabe</string>
<string name="lists_failure">Deine Aufgaben konnten nicht gelesen werden.</string>
<string name="lists_empty">Keine Aufgaben-Listen bisher. Füge eine in deiner Aufgaben-App hinzu oder mit der + Schaltfläche.</string>
<string name="smart_today">Heute</string>
<string name="smart_overdue">Überfällig</string>
<string name="smart_upcoming">Anstehend</string>
<string name="smart_all">Alle</string>
<string name="open_count">%1$d offen</string>
<string name="home_today_progress">%1$d von %2$d erledigt</string>
<string name="home_today_remaining">%1$d übrig</string>
<string name="home_today_all_done">Alles erledigt 🎉</string>
<string name="home_today_empty">Heute keine Fälligkeiten 🎉</string>
<string name="home_upcoming_view_all">Alle anzeigen</string>
<string name="home_due_today">Heute</string>
<string name="home_due_tomorrow">Morgen</string>
<string name="home_search_hint">Aufgaben suchen</string>
<string name="home_search_clear">Suche zurücksetzen</string>
<string name="home_search_close">Suche schließen</string>
<string name="home_search_empty">Keine Aufgaben passen zu „%1$s“</string>
<string name="reminder_due_at">Fälligkeiten %1$s</string>
<string name="reminder_channel_name">Aufgaben Erinnerungen</string>
<string name="reminder_channel_desc">Benachrichtigungen für fällige Aufgaben.</string>
<string name="onboarding_no_provider_title">Eine Task-App wird benötigt</string>
<string name="onboarding_no_provider_body">Agendula zeigt und bearbeitet die Aufgaben, die in OpenTasks oder tasks.org gespeichert sind und per DAVx5 synchronisiert werden. Installiere eine davon, um zu starten.</string>
<string name="onboarding_permission_title">Erlaube Zugriff auf deine Aufgaben</string>
<string name="onboarding_permission_body">Agendula benötigt die Berechtigung, deine Aufgaben zu lesen und zu schreiben. Das ist die einzige Berechtigung, die es jemals anfragt.</string>
<string name="onboarding_permission_button">Zugriff gewähren</string>
<string name="onboarding_install_opentasks">Installiere OpenTasks</string>
<string name="onboarding_install_tasksorg">Installiere tasks.org</string>
<string name="reminder_onboarding_title">Verpasse nichts, was fällig ist</string>
<string name="reminder_onboarding_body">Aufgaben-Apps senden selbst keine Erinnerungen, daher liefert Agendula sie für dich. Schalte sie ein, um eine Benachrichtigung zu erhalten, wenn eine Aufgabe fällig ist.</string>
<string name="reminder_onboarding_enable_button">Erinnerungen aktivieren</string>
<string name="reminder_onboarding_skip_button">Nicht jetzt</string>
<string name="reminder_benefit_delivery_title">Agendula erinnert dich</string>
<string name="reminder_benefit_delivery_body">Es plant eine Benachrichtigung für jede Aufgabe mit einem Fälligkeitsdatum.</string>
<string name="reminder_benefit_timing_title">Auf deinem Zeitplan</string>
<string name="reminder_benefit_timing_body">Wähle in den Einstellungen, wie weit im Voraus du erinnert werden möchtest.</string>
<string name="reminder_benefit_reversible_title">Jederzeit änderbar</string>
<string name="reminder_benefit_reversible_body">Schalte Erinnerungen aus, wann immer du willst — es ist nur ein Schalter.</string>
<string name="settings_title">Einstellungen</string>
<string name="settings_section_appearance">Darstellung</string>
<string name="settings_appearance_subtitle">Theme und Farbe</string>
<string name="settings_section_task_form">Aufgaben-Formular</string>
<string name="settings_task_form_subtitle">Standard Felder, Liste und Unter-Aufgaben</string>
<string name="settings_reminders_subtitle">Benachrichtigungen für fällige Aufgaben</string>
<string name="settings_form_fields_hint">Standardmäßig angezeigte Felder — alles Weitere liegt hinter „Weitere Felder“.</string>
<string name="settings_dynamic_color_unavailable">Verfügbar für Android 12 und höher</string>
<string name="settings_about_author">von Jean-Luc Makiola</string>
<string name="settings_about_source">Quellcode</string>
<string name="settings_license">Lizenz</string>
<string name="settings_about_support">Entwicklung unterstützen</string>
<string name="settings_about_version">Version %1$s</string>
<string name="settings_about_logo_desc">Calendula-App-Symbol</string>
<string name="settings_language">App-Sprache</string>
<string name="settings_language_auto">Systemstandard</string>
<string name="settings_report_problem">Problem melden</string>
<string name="settings_report_problem_hint">Öffne den Issue-Tracker</string>
<string name="crash_report_issue_title">Absturzbericht</string>
<string name="settings_theme">Design</string>
<string name="settings_theme_system">System folgen</string>
<string name="settings_theme_light">Hell</string>
<string name="settings_theme_dark">Dunkel</string>
<string name="settings_dynamic_color">Dynamische Farben</string>
<string name="settings_dynamic_color_hint">Verwende Farben aus dem Hintergrundbild</string>
<string name="settings_section_reminders">Erinnerungen</string>
<string name="settings_reminders">Fälligkeits-Erinnerungen</string>
<string name="settings_reminders_hint">Benachrichtige mich wenn eine Aufgabe fällig ist</string>
<string name="settings_default_reminder">Wann erinnern</string>
<string name="settings_exact_alarms">Exakter Zeitpunkt</string>
<string name="settings_exact_alarms_allowed">Die Erinnerungen erfolgen zum exakten Zeitpunkt</string>
<string name="settings_exact_alarms_blocked">Blockiert tippe, um exakte Erinnerungen zu erlauben</string>
<string name="settings_section_tasks">Aufgaben</string>
<string name="settings_default_list">Standard-Liste</string>
<string name="settings_default_list_first">Erste verfügbare Felder</string>
<string name="settings_add_subtask_row">Zeile \"Unteraufgaben hinzufügen\" anzeigen</string>
<string name="settings_add_subtask_row_hint">Ein Eingabefeld am Ende der Unteraufgaben einer aufgeklappten Aufgabe</string>
<string name="settings_bottom_add_bar">Untere Schnellhinzufüge-Leiste</string>
<string name="settings_bottom_add_bar_hint">Füge Aufgaben hinzu, über eine Leiste, die unten an einer Liste angepinnt ist, statt über die schwebende Schaltfläche</string>
<plurals name="reminder_minutes">
<item quantity="one">%1$d Minute vorher</item>
<item quantity="other">%1$d Minuten vorher</item>
</plurals>
<plurals name="reminder_hours">
<item quantity="one">%1$d Stunde vorher</item>
<item quantity="other">%1$d Stunden vorher</item>
</plurals>
<plurals name="reminder_days">
<item quantity="one">%1$d Tag vorher</item>
<item quantity="other">%1$d Tage vorher</item>
</plurals>
<plurals name="reminder_weeks">
<item quantity="one">%1$d Woche vorher</item>
<item quantity="other">%1$d Wochen vorher</item>
</plurals>
<string name="settings_translate">Hilf beim Übersetzen</string>
<string name="settings_translate_hint">Füge eine Sprache auf Weblate hinzu oder verbessere sie</string>
</resources>
+196
View File
@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Agendula</string>
<string name="app_tagline">Um app de tarefas em Material 3 Expressive. \nFlorescendo.</string>
<string name="task_untitled">Tarefa sem título</string>
<string name="back">Voltar</string>
<string name="save">Salvar</string>
<string name="delete">Deletar</string>
<string name="tasks_title">Tarefas</string>
<string name="task_list_empty">Nenhuma tarefa aqui ainda.</string>
<string name="task_list_failure">Não foi possível carregar estas tarefas.</string>
<string name="smart_no_date">Sem data</string>
<string name="smart_completed">Completo</string>
<string name="task_detail_title">Tarefa</string>
<string name="task_detail_not_found">Esta tarefa não existe mais.</string>
<string name="edit">Editar</string>
<string name="edit_task_title">Editar tarefa</string>
<string name="new_task_title">Nova tarefa</string>
<string name="field_title">Título</string>
<string name="field_description">Descrição</string>
<string name="edit_save_failed">Não foi possível salvar. Tente novamente.</string>
<string name="add_task_hint">Adicionar tarefa</string>
<string name="add_subtask_hint">Adicionar subtarefa</string>
<string name="cd_add_task">Adicionar tarefa</string>
<string name="cd_complete">Concluído</string>
<string name="cd_reopen">Reabrir</string>
<string name="task_deleted">Deletado</string>
<string name="undo">Desfazer</string>
<string name="cd_expand_subtasks">Mostrar subtarefas</string>
<string name="cd_collapse_subtasks">Esconder subtarefas</string>
<string name="section_overdue">Prazo expirado</string>
<string name="section_today">Hoje</string>
<string name="section_upcoming">A seguir</string>
<string name="section_no_date">Sem data</string>
<string name="section_completed">Concluído</string>
<string name="priority_none">Nenhuma</string>
<string name="priority_low">Baixa</string>
<string name="priority_medium">Média</string>
<string name="priority_high">Alta</string>
<string name="detail_mark_complete">Marcar como concluído</string>
<string name="detail_mark_incomplete">Marcar como não concluído</string>
<string name="detail_list">Lista</string>
<string name="detail_due">Prazo</string>
<string name="detail_start">Inicia</string>
<string name="detail_priority">Prioridade</string>
<string name="detail_progress">Progresso</string>
<string name="detail_subtasks">Subtarefas</string>
<string name="detail_parent">Tarefa pai</string>
<string name="detail_part_of">Parte de</string>
<string name="percent_complete">%1$d%%</string>
<string name="edit_list_label">Lista</string>
<string name="edit_start_label">Inicia</string>
<string name="edit_due_label">Prazo</string>
<string name="edit_all_day">O dia todo</string>
<string name="edit_priority_label">Prioridade</string>
<string name="edit_progress_label">Progresso</string>
<string name="edit_parent_label">Tarefa pai</string>
<string name="edit_parent_none">Nenhum (primeiro nível)</string>
<string name="edit_parent_search">Buscar tarefas</string>
<string name="edit_parent_empty">Nenhuma tarefa correspondente nesta lista.</string>
<string name="edit_reminder_label">Lembrete</string>
<string name="edit_set">Ajustar</string>
<string name="edit_clear">Limpar</string>
<string name="edit_title_hint">Título da tarefa</string>
<string name="edit_when">Quando</string>
<string name="edit_more_fields">Mais campos</string>
<string name="close">Fechar</string>
<string name="dialog_cancel">Cancelar</string>
<string name="edit_conflict_title">A tarefa foi alterada em outro lugar</string>
<string name="edit_conflict_body">Esta tarefa foi atualizada em outro local (uma sincronização ou outro app) desde que você a abriu. Sobrescrever estas mudanças com suas edições?</string>
<string name="edit_conflict_overwrite">Sobrescrever</string>
<string name="reminder_none">Nenhum</string>
<string name="reminder_at_due">Na hora da tarefa</string>
<string name="reminder_5_min">5 minutos antes</string>
<string name="reminder_10_min">10 minutos antes</string>
<string name="reminder_30_min">30 minutos antes</string>
<string name="reminder_1_hour">1 hora antes</string>
<string name="reminder_1_day">1 dia antes</string>
<string name="reminder_custom">Personalizado</string>
<string name="reminder_custom_with_value">Personalizado (%1$s)</string>
<string name="reminder_custom_set">Ajustar</string>
<string name="reminder_custom_amount">Insira uma quantidade</string>
<string name="reminder_use_default">Usar padrão</string>
<string name="reminder_unit_minutes">Minutos</string>
<string name="reminder_unit_hours">Horas</string>
<string name="reminder_unit_days">Dias</string>
<string name="reminder_unit_weeks">Semanas</string>
<string name="settings_list_reminders_title">Lembretes por lista</string>
<string name="settings_list_reminders_hint">Alterar o lembrete padrão para listas individuais</string>
<string name="settings_list_reminder_inherits">Padrão (%1$s)</string>
<string name="error_blank_title">Insira um título.</string>
<string name="error_no_list">Escolha uma lista.</string>
<string name="error_due_before_start">Prazo não pode ser antes do início.</string>
<string name="error_reminder_without_due">Ajuste um prazo para usar um lembrete.</string>
<string name="lists_header">Listas</string>
<string name="new_task">Nova tarefa</string>
<string name="lists_failure">Não foi possível ler suas tarefas.</string>
<string name="lists_empty">Nenhuma lista de tarefas ainda. Adicione uma no seu app de tarefas ou com o botão +.</string>
<string name="smart_today">Hoje</string>
<string name="smart_overdue">Prazo expirado</string>
<string name="smart_upcoming">A seguir</string>
<string name="smart_all">Tudo</string>
<string name="open_count">%1$d abertos</string>
<string name="home_today_progress">%1$d de %2$d concluídos</string>
<string name="home_today_remaining">%1$d restantes</string>
<string name="home_today_all_done">Tudo pronto 🎉</string>
<string name="home_today_empty">Nada terminando hoje 🎉</string>
<string name="home_upcoming_view_all">Ver tudo</string>
<string name="home_due_today">Hoje</string>
<string name="home_due_tomorrow">Amanhã</string>
<string name="home_search_hint">Buscar tarefas</string>
<string name="home_search_clear">Limpar buscas</string>
<string name="home_search_close">Fechar busca</string>
<string name="home_search_empty">Nenhuma tarefa corresponde a \"%1$s\"</string>
<string name="reminder_due_at">Termina em %1$s</string>
<string name="reminder_channel_name">Lembretes de tarefas</string>
<string name="reminder_channel_desc">Notificações para tarefas com prazo.</string>
<string name="onboarding_no_provider_title">Um app de tarefas é necessário</string>
<string name="onboarding_no_provider_body">O Agendula mostra e edita as tarefas armazenadas no OpenTasks ou tasks.org, sincronizadas pelo DAVx5. Instale um para começar.</string>
<string name="onboarding_permission_title">Permitir acesso às suas tarefas</string>
<string name="onboarding_permission_body">O Agendula precisa de permissão para ler e salvar suas tarefas. É tudo o que ele pede.</string>
<string name="onboarding_permission_button">Conceder acesso às tarefas</string>
<string name="onboarding_install_opentasks">Instalar OpenTasks</string>
<string name="onboarding_install_tasksorg">Instalar tasks.org</string>
<string name="reminder_onboarding_title">Nunca perca seus prazos</string>
<string name="reminder_onboarding_body">Apps de tarefas não enviam lembretes sozinhos, então o Agendula os entrega para você. Ative para receber uma notificação de quando uma tarefa estiver no prazo.</string>
<string name="reminder_onboarding_enable_button">Ativar lembretes</string>
<string name="reminder_onboarding_skip_button">Agora não</string>
<string name="reminder_benefit_delivery_title">O Agendula lembra você</string>
<string name="reminder_benefit_delivery_body">Ele agenda uma notificação para cada tarefa com prazo.</string>
<string name="reminder_benefit_timing_title">Na sua rotina</string>
<string name="reminder_benefit_timing_body">Escolha o quão à frente quer ser lembrado em Ajustes.</string>
<string name="reminder_benefit_reversible_title">Altere a qualquer momento</string>
<string name="reminder_benefit_reversible_body">Desative os lembretes quando quiser — é só um botão.</string>
<string name="settings_title">Ajustes</string>
<string name="settings_section_appearance">Aparência</string>
<string name="settings_appearance_subtitle">Tema e cor</string>
<string name="settings_section_task_form">Formulário de tarefa</string>
<string name="settings_task_form_subtitle">Campos, listas e subtarefas padrão</string>
<string name="settings_reminders_subtitle">Notificações para tarefas com prazo acabando</string>
<string name="settings_form_fields_hint">Campos mostrados por padrão em uma nova tarefa. O resto está atrás de \"Mais campos\".</string>
<string name="settings_dynamic_color_unavailable">Disponível no Android 12 e mais recente</string>
<string name="settings_about_author">por Jean-Luc Makiola</string>
<string name="settings_about_source">Código-fonte</string>
<string name="settings_license">Licença</string>
<string name="settings_about_support">Apoie o desenvolvimento</string>
<string name="settings_about_version">Versão %1$s</string>
<string name="settings_about_logo_desc">Ícone de app do Agendula</string>
<string name="settings_language">Idioma do app</string>
<string name="settings_language_auto">Padrão do sistema</string>
<string name="settings_translate">Ajude a traduzir</string>
<string name="settings_translate_hint">Adicione ou melhore um idioma no Weblate</string>
<string name="settings_report_problem">Relate um problema</string>
<string name="settings_report_problem_hint">Abrir o rastreador de problemas</string>
<string name="crash_report_issue_title">Relatório de quebra</string>
<string name="settings_theme">Tema</string>
<string name="settings_theme_system">Seguir o sistema</string>
<string name="settings_theme_light">Claro</string>
<string name="settings_theme_dark">Escuro</string>
<string name="settings_dynamic_color">Cor dinâmica</string>
<string name="settings_dynamic_color_hint">Usar cores do papel de parede</string>
<string name="settings_section_reminders">Lembretes</string>
<string name="settings_reminders">Lembretes no prazo</string>
<string name="settings_reminders_hint">Me notifique quando uma tarefa estiver no prazo</string>
<string name="settings_default_reminder">Quando lembrar</string>
<string name="settings_exact_alarms">Na hora</string>
<string name="settings_exact_alarms_allowed">Lembretes disparam na mesma hora</string>
<string name="settings_exact_alarms_blocked">Bloqueado — toque para permitir lembretes na hora</string>
<string name="settings_section_tasks">Tarefas</string>
<string name="settings_default_list">Lista padrão</string>
<string name="settings_default_list_first">Primeira lista disponível</string>
<string name="settings_add_subtask_row">Mostrar uma linha \"adicionar subtarefa\"</string>
<string name="settings_add_subtask_row_hint">Um campo Adicionar no fim das subtarefas de uma tarefa expandida</string>
<string name="settings_bottom_add_bar">Barra adicionar-rápido abaixo</string>
<string name="settings_bottom_add_bar_hint">Adicione tarefas de uma barra presa abaixo de uma lista, em vez do botão flutuante</string>
<plurals name="reminder_minutes">
<item quantity="one">%1$d minuto antes</item>
<item quantity="many">%1$d minutos antes</item>
<item quantity="other">%1$d minutos antes</item>
</plurals>
<plurals name="reminder_hours">
<item quantity="one">%1$d hora antes</item>
<item quantity="many">%1$d horas antes</item>
<item quantity="other">%1$d horas antes</item>
</plurals>
<plurals name="reminder_days">
<item quantity="one">%1$d dia antes</item>
<item quantity="many">%1$d dias antes</item>
<item quantity="other">%1$d dias antes</item>
</plurals>
<plurals name="reminder_weeks">
<item quantity="one">%1$d semana antes</item>
<item quantity="many">%1$d semanas antes</item>
<item quantity="other">%1$d semanas antes</item>
</plurals>
</resources>
+2
View File
@@ -8,4 +8,6 @@
-->
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en" />
<locale android:name="de" />
<locale android:name="pt-BR" />
</locale-config>
+246
View File
@@ -0,0 +1,246 @@
---
title: Privacy Policy — Agendula
description: What Agendula does with your data. No servers, no account, no analytics — your tasks stay on your device unless you add a CalDAV server yourself.
updated: 2026-09-09
---
<!--
THIS FILE IS THE POLICY. Edit it here, in a PR, reviewed like any other
change — it is the source of truth.
It is published at https://jeanlucmakiola.de/agendula/privacy, which is what
the app's Settings → About → Privacy policy row opens and what the Play
Console field must hold. That page holds no copy of the prose: the website
build checks this repository out beside itself and renders this file through
an Astro content collection, so there is exactly one copy of the policy
anywhere and the two cannot drift. An edit here reaches the live page on the
site's next build.
The page supplies its own <h1> from the `title` above, so this body starts at
the first section — do not add one. This comment is HTML so that it cannot
render on the published page.
-->
**Last updated:** 9 September 2026
Applies to the Android app **Agendula** (package `de.jeanlucmakiola.agendula`),
all versions and all distribution channels.
## In short
Agendula has no servers, no user accounts and no analytics. Your tasks live on
your device. They leave it in exactly one case: if you set up a CalDAV account
yourself, they are synchronised with **the server you entered** — and with
nothing and no one else. Nothing is ever sent to the developer.
## 1. Controller
IT-Dienstleister | Jean-Luc Makiola
Mahlerstraße 10
14772 Brandenburg an der Havel
Email: [business@jeanlucmakiola.de](mailto:business@jeanlucmakiola.de)
## 2. No data collection by the developer
Agendula contains **no analytics, no tracking, no advertising, no
crash-reporting SDK and no third-party service that reports anything
anywhere**. No user profile is created, no advertising or device identifier is
generated, and no data is shared with or sold to anyone. There is no Agendula
account, and the developer operates no server that the app talks to.
All of this is verifiable in the
[source code](https://codeberg.org/jlmakiola/agendula), which is public.
## 3. Where your tasks live — your choice
- **On your device (the default)** — your task lists, tasks and reminders are
kept in Agendula's own database inside the app's private storage. Nothing is
published to other apps, and uninstalling the app removes it.
- **In a tasks provider you already use** — OpenTasks or tasks.org. Agendula
then reads and writes that app's task database through Android's provider
mechanism, after you grant its read/write permission. Whatever already
synchronises that provider (DAVx5, SmoothSync, DecSync CC, …) keeps doing so,
unchanged; that synchronisation is performed by those apps, not by Agendula,
and their privacy policies apply to it.
## 4. CalDAV sync — the only case where your tasks leave the device
Sync is optional and off until you add an account. If you add one, everything
below happens between your device and **the server you nominated**, and nowhere
else.
### What is stored on your device
The server address, your username, and your password or app password. The
password is encrypted with a key held in the Android Keystore, which cannot be
exported from the device.
### What is transmitted, and to whom
- The tasks in the synchronised lists, as standard iCalendar (`VTODO`) data,
and the credentials needed to authenticate.
- Requests carry the user agent `Agendula (Android)` — a fixed string, so that
you can recognise and revoke the session on your server. No device identifier
is sent.
- Connections are HTTPS. Cleartext HTTP is refused, so credentials are never
sent over an unencrypted connection.
Nothing is sent anywhere else. In particular, nothing is sent to the developer.
Under Google Play's Data Safety definitions this counts as **collected** — Play
defines collection as transmitting data off the device, regardless of who
receives it — and **not shared**, because the only recipient is the server you
nominated. Data is encrypted in transit.
### Finding your server
When you type a server address or an email domain, Agendula follows the
standard discovery procedure (RFC 6764): a DNS lookup for the `_caldavs._tcp`
service record of that domain, then `/.well-known/caldav` on the host. The DNS
query goes to whichever resolver your device or network uses, and the requests
go to the domain you typed — no directory of servers is consulted and no lookup
is sent to the developer.
### Signing in to a Nextcloud
If the server is a Nextcloud, Agendula uses Nextcloud's Login Flow v2: your
browser opens *your own server's* login page, you authorise there, and the
server hands the app a dedicated app password. Agendula never sees your actual
account password. The app password appears in your server's "Devices &
sessions" list as `Agendula (Android)`, and you can revoke it there at any
time. Removing the account in Agendula revokes it too, where the server
supports that.
### Your server's own policy
Your CalDAV provider has its own privacy policy, and your data on their server
is governed by it. Agendula has no relationship with them.
A note on certificates: Agendula trusts private certificate authorities that
you have installed in your device's user store, because self-hosted servers
routinely use them. That is a deliberate trade-off in favour of self-hosters —
any CA installed on your device (for example by an employer's management
profile) can, in principle, intercept traffic from the app, as it can from
other apps that make the same choice.
## 5. Other data Agendula handles on your device
### Reminders and notifications
Due-date reminders are scheduled by the app itself and displayed as local
notifications. Nothing is sent to a push service — there is no push service.
### Export files
You can export your tasks as standard iCalendar `.ics` files. Agendula writes
exactly the file you select through Android's system file picker, and has no
access to other files.
### App settings
Your preferences (theme, language, list and reminder defaults and similar) are
stored locally on your device and are removed when you uninstall the app.
## 6. Backups
If Android Auto Backup is enabled on your device, your tasks and settings may
be backed up to your own Google account, under Google's terms — the developer
has no access to it. Two things are deliberately excluded from that backup:
your stored CalDAV password, and Agendula's per-device sync bookkeeping. After
restoring onto a new device you therefore sign in to your server again.
## 7. Crash reports
If Agendula crashes, it offers to report the problem. Nothing is sent
automatically, even though the app has network access. The report is copied to
your clipboard and your browser is opened with the project's issue tracker, the
text pre-filled. **You see the full content, you decide whether to submit it,
and you can edit or discard it.**
Such a report contains:
- app version,
- Android version,
- device manufacturer and model,
- your device language,
- the timestamp,
- and the technical stack trace.
It is built from that fixed list and nothing else: **no** task data, **no**
server address or credentials, **no** account names, **no** log files and
**no** personal identifiers.
If you choose to submit it, the report becomes a public issue on the project's
issue tracker at Codeberg, operated by Codeberg e. V. Their privacy policy then
applies to that submission.
## 8. External links
The app links to the source code, the licence, the issue tracker, the
translation platform (Weblate) and a voluntary donation page (Ko-fi). Following
one of these links opens your browser and leaves the app; the privacy policy of
the respective website then applies. Agendula transmits no data of yours in the
process — it only opens the address.
## 9. Permissions and why they exist
- `INTERNET`, `ACCESS_NETWORK_STATE` — CalDAV sync with the server you
configure, and checking whether a connection exists before trying. Without a
CalDAV account, no connection is made.
- `READ_SYNC_SETTINGS`, `WRITE_SYNC_SETTINGS` — register the sync account with
Android's sync framework so it can be scheduled.
- `POST_NOTIFICATIONS` — show reminders.
- `USE_EXACT_ALARM`, `SCHEDULE_EXACT_ALARM` — deliver reminders at the exact
due time.
- `RECEIVE_BOOT_COMPLETED` — re-register pending reminders after a restart.
- `org.dmfs.permission.READ_TASKS` / `WRITE_TASKS` and
`org.tasks.permission.READ_TASKS` / `WRITE_TASKS` — optional, requested only
if you choose the external-provider storage mode, and only for the provider
you selected (OpenTasks or tasks.org).
- `WAKE_LOCK`, `FOREGROUND_SERVICE` — required by the Android system component
used for scheduled background work (WorkManager); on older Android versions
it needs them to run an expedited sync.
Agendula publishes no content provider of its own and declares no permissions
that other apps could request.
## 10. Distribution channels
Agendula is distributed through the project's releases on Codeberg, a
self-hosted F-Droid repository, Obtainium, and — where applicable — F-Droid and
the Google Play Store. When you download or update the app, the operator of
that channel processes data (such as your IP address) under their own privacy
policy. This is outside the developer's control and unrelated to the app's own
behaviour.
## 11. Children
Agendula is not directed at children and collects nothing about anyone.
## 12. Deleting your data
- **Remove a CalDAV account** from Settings → Accounts. This deletes the stored
credential and, where the server supports it, revokes the app password. Task
lists become device-only lists rather than being destroyed.
- **Remove an account and delete its local data** removes the lists and tasks
as well.
- **Uninstalling the app** removes everything Agendula stored on the device.
Deleting data from your CalDAV server is done on that server; data in an
external tasks provider is deleted in that app.
## 13. Your rights
The developer stores no personal data of yours — the only data transfer the app
performs is between your device and a server you operate or chose. There is
therefore no data held by the developer to which rights of access,
rectification, erasure, restriction, data portability or objection (Art. 1521
GDPR) could apply. Your tasks are exportable as standard `.ics` files from
within the app at any time. You may contact the address above with any
question, and you have the right to lodge a complaint with a supervisory
authority.
## 14. Changes to this policy
Should the app's functionality change in a way that affects data processing,
this policy will be updated and the date at the top adjusted. The history of
this file is public in the repository.
@@ -0,0 +1,17 @@
### Added
- Agendula now speaks **German** and **Brazilian Portuguese**, the first
community translations. Pick one under **Settings → App language**, or in
Android's own per-app language settings; leave it on *System default* and
Agendula follows your phone. Anything not yet translated falls back to
English.
- Agendula can now be translated. Pick or request a language on Weblate and
translate in the browser — the link sits at the top of the language picker in
**Settings → App language**. Partial translations are fine; anything
untranslated falls back to English.
### Changed
- Agendula's home is now **Codeberg** (`jlmakiola/agendula`) — that's where the
source, issues, pull requests and releases live. The Source and License links
in Settings, the issue-reporting link and the F-Droid metadata all point there
now. The self-hosted Gitea instance stays as build infrastructure.