diff --git a/content/policies/privacy.md b/content/policies/privacy.md index f75a82e..d2470ea 100644 --- a/content/policies/privacy.md +++ b/content/policies/privacy.md @@ -3,16 +3,18 @@ title: TaskNotes privacy overview description: How the TaskNotes app and Obsidian plugin store data and when optional services are involved. route: /privacy/ product: shared -last_updated: 2026-08-06 +last_updated: 2026-11-07 --- # TaskNotes privacy overview -Last updated: August 6, 2026 +Last updated: November 7, 2026 TaskNotes products are built around portable Markdown records. The storage and network boundaries depend on the client and collection you choose. +TaskNotes is run by Callum Alpass, in Melbourne, Australia. + ## TaskNotes app - The TaskNotes app opens every collection through mdbase and requires a @@ -36,9 +38,60 @@ for enabled features that require it, including release checks, calendar providers, ICS subscriptions, webhooks, and remotely loaded API documentation assets. +## TaskNotes Calendar (hosted service) + +TaskNotes Calendar is an optional service that shows your Google Calendar +events in the TaskNotes web and mobile apps and lets you create, edit and +delete them there. It is only used if you sign in to it. + +**What we receive from Google.** When you sign in, we receive your Google +account identifier, email address and name. When you connect calendars, we +receive access to the list of calendars you subscribe to and to the events on +them. + +**What we store.** + +- Your Google account identifier, email address and name, until you delete + your account. +- Google access credentials, encrypted, until you disconnect, reconnect or + delete your account. +- The details of your calendars, such as their names, until you disconnect or + delete your account. +- Digests of your device sessions, which expire after 30 days without use and + after 90 days at most. + +**What we do not store.** Your calendar events pass through the service when +you view or change them. They are not saved on our servers. + +**Logs.** Our logs record the route, method, status, duration and any error +code of each request. They do not include your identity, IP address, calendar +data or event content. Logs are kept for up to 7 days. + +**Who processes this data.** The service runs on Cloudflare, which hosts it +and its database. Calendar data is exchanged with Google. We do not sell your +data, use it for advertising, or share it with anyone else, except where the +law requires it. + +**Your choices.** You can disconnect your calendars or delete your account in +the app's settings at any time. Either one deletes our stored Google +credential and asks Google to revoke our access. Deleting your account removes +the data listed above, apart from a keyed digest of your identity, kept for +about an hour so that sign-ins already in progress cannot recreate the +account. Deleted data can remain in database backups for up to 30 days. You +can also remove access from your Google Account's linked apps page. Deleting +your account does not change your Google events or your tasks. + +**Google API Services.** TaskNotes' use and transfer to any other app of +information received from Google APIs will adhere to the [Google API Services +User Data Policy](https://developers.google.com/terms/api-services-user-data- +policy), including the Limited Use requirements. + +See the [TaskNotes Calendar terms](/terms/). + ## Analytics -TaskNotes does not include a product telemetry or analytics pipeline. Services +TaskNotes does not include a product telemetry or analytics pipeline. TaskNotes +Calendar keeps the operational logs described above. Services you choose to connect may keep their own operational, account, security, or billing records under their respective policies. diff --git a/content/policies/terms.md b/content/policies/terms.md new file mode 100644 index 0000000..ae06f62 --- /dev/null +++ b/content/policies/terms.md @@ -0,0 +1,36 @@ +--- +title: TaskNotes Calendar terms +description: Terms for the optional hosted TaskNotes Calendar service. +route: /terms/ +product: shared +last_updated: 2026-11-07 +--- + +# TaskNotes Calendar terms + +Last updated: November 7, 2026 + +These terms cover the optional hosted TaskNotes Calendar service, run by Callum +Alpass in Melbourne, Australia. By signing in, you agree to them. + +**The service.** It connects TaskNotes to your Google Calendar. It may change, +be interrupted or be withdrawn. We will try to give notice before withdrawing +it. + +**Your account.** You need a Google account, and you are responsible for the +changes you make to your calendars through TaskNotes. + +**Acceptable use.** Do not attack, overload, reverse-engineer for abuse, or use +the service to break the law or Google's terms. + +**No warranty.** The service is provided as is. To the extent the law allows, we +are not liable for lost or incorrect calendar data or for indirect losses. + +**Ending use.** You can delete your account at any time in the app. We may +suspend accounts that break these terms. + +**Changes and law.** We will publish changes on this page with a new date. These +terms are governed by the law of Victoria, Australia. + +**Contact.** [Open an issue](https://github.com/callumalpass/tasknotes/issues). +See also the [privacy overview](/privacy/). diff --git a/navigation.yml b/navigation.yml index 2ce5f96..7887745 100644 --- a/navigation.yml +++ b/navigation.yml @@ -73,3 +73,5 @@ navigation: items: - title: Privacy route: /privacy/ + - title: TaskNotes Calendar terms + route: /terms/ diff --git a/scripts/generate-content.mjs b/scripts/generate-content.mjs index 8c9a1b9..f2adee4 100644 --- a/scripts/generate-content.mjs +++ b/scripts/generate-content.mjs @@ -355,6 +355,8 @@ const generatedModule = path.join( "src", "generated-pages.js", ); +// The plugin bundles Lingui macros, which look for their config in the working directory. +process.env.LINGUI_CONFIG = path.join(pluginRoot, "lingui.config.mjs"); const { buildGeneratedPages } = await import(pathToFileURL(generatedModule).href); const generatedReferences = await buildGeneratedPages(pluginManifest); for (const [relativePath, raw] of generatedReferences) {