Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 56 additions & 3 deletions content/policies/privacy.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.

Expand Down
36 changes: 36 additions & 0 deletions content/policies/terms.md
Original file line number Diff line number Diff line change
@@ -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/).
2 changes: 2 additions & 0 deletions navigation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,5 @@ navigation:
items:
- title: Privacy
route: /privacy/
- title: TaskNotes Calendar terms
route: /terms/
2 changes: 2 additions & 0 deletions scripts/generate-content.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Loading