Taskelo

Last updated: August 1, 2026

Privacy Policy

TL;DR

Taskelo requires a free account. Your workspace — todos, canvas notes, goals, weekly-routine text, and chat history — is stored in a small cloud database (Cloudflare D1) tied to that account so you can use it on any device; your browser keeps a local copy as an offline cache. You can export everything as JSON and delete your account — and all its data — in one click. If you connect Google Calendar, Taskelo reads your events to render the schedule grid, to give Elo context when you chat, and to write your daily brief — we never store those events on our servers. If you turn on the daily brief (hosted plan only), we store your delivery preferences and, for push, a per-device subscription, and send the brief by email through Resend and/or push. Payments, sign-in, and a daily usage counter for hosted chat are handled by the usual processors (Stripe, Clerk, Anthropic).

Where your data lives

In our cloud database. Your todos, canvas notes, goals (titles, notes, milestones), weekly-routine description, and chat messages are persisted to our cloud database (Cloudflare D1), keyed to your account, so they follow you across browsers and devices. The browser keeps a local copy as an offline-first cache so the app works without a network. Signing out leaves both the local copy and the cloud copy alone — only "Delete account" wipes the cloud side.

On your device only. Device preferences — chat panel collapsed state, panel width, active workspace tab, active schedule sub-tab, goals list expanded state, onboarding progress — stay in your browser's localStorage and are never uploaded. Clearing your browser data resets them (and drops the offline cache; the cloud copy is untouched).

Google Calendar events are an exception: they are never written to our cloud database. When you press Sync, events are fetched from Google and cached in your browser's localStorage so the grid can render. Our server also reads a window of your events directly from Google — in memory, for the length of one request — when you send a chat message or when your daily brief is generated; see "Google Calendar (schedule tab)" below. The only schedule-related things we store cloud-side are a gcal sync cursor (an opaque string from Google so we can fetch only the deltas next time) and a last-synced timestamp.

What we do collect (and why)

  • Your email address, handled by Clerk. Used so we can send you a magic-link to sign in. We don't store passwords; we don't ask for one.
  • Your synced app data — todos, canvas notes, goals (titles, notes, milestone checklists), your free-form weekly-routine text, hosted-mode chat messages, and a couple of app settings (your preferred chat mode, the active canvas tab, the weekly routine itself). These are stored in Cloudflare D1 in our account, keyed to your Clerk user id, and used only to render the app for you on your devices and to provide context to Claude when you choose to chat.
  • Google Calendar connection state, if you connect it — we store an opaque sync cursor and a last-synced timestamp on your account row so manual sync can fetch only the deltas next time. Clerk holds your Google OAuth token on our behalf (we don't see the token itself); we exchange it for a short-lived access token each time we call Google's Calendar API. Your actual events are not stored in our database. See "Google Calendar (schedule tab)" below for exactly when we read them and where they go.
  • Daily brief preferences, if you turn it on — whether it's enabled, your chosen delivery time and timezone, which channels (email and/or push), and any free-text instructions you add. Stored in user_settings, keyed to your account, so a background job can send the brief without your browser needing to be open.
  • Push subscription data, if you enable push delivery — one row per device (endpoint URL plus the client public key and auth secret your browser generates for that subscription), used only to deliver the daily brief and other notifications you've opted into. Deleted when you disable push on that device or delete your account.
  • A Stripe customer id and subscription status, if you subscribe to hosted mode. Payment-card data goes directly to Stripe; we never see card numbers, CVCs, or billing addresses. We keep the Stripe ids so we know whether your subscription is active.
  • A daily token counter attached to your account in Clerk's private metadata, of the form { date, tokens }. This is how we enforce the daily cap on hosted chat. It is a number and a date — nothing about what you asked or what Claude answered.
  • Basic web analytics via Google Analytics (page views, session counts, referrer, approximate location from IP, browser/OS). This helps us see whether anyone uses the site. See Google's privacy policy. You can opt out by using a browser/extension that blocks GA, or by enabling "Do Not Track" + a privacy-respecting browser.

Hosted chat: what happens to your messages

When you send a message in hosted mode, your browser posts it to our Cloudflare worker, which checks that you're signed in and entitled, increments the daily token counter, and forwards the request to Anthropic. The worker streams Claude's response back to your browser. The worker itself does not log request bodies — the only thing it writes about that request is the token count.

However, because chat history is part of cloud sync, your messages and Claude's replies are persisted to your row in Cloudflare D1 so the conversation reappears on your other devices and after you reload the page. They are scoped to your account and deleted (along with everything else in your row) when you delete the account.

Anthropic processes these messages as our service provider, under its commercial terms: inputs and outputs sent through the API are not used to train Anthropic's models, and are retained only briefly (generally up to 30 days) for trust-and-safety purposes before deletion. The same applies to anything included in the system prompt, such as your todos, notes, goals, and any calendar events. See Anthropic's privacy policy.

Google Calendar (schedule tab)

Connecting Google Calendar is optional and goes through Google's standard OAuth consent screen, brokered by Clerk. Taskelo requests two scopes: calendar.events.readonly, the narrowest scope that lets us list events, and calendar.app.created, which allows an app to create secondary calendars and manage events only on calendars it created itself. Taskelo uses the second to make a calendar called "Taskelo" and publish your planned time blocks there. It cannot create, modify, or delete events on your own calendars — Google enforces that, not just our code — and we do not receive your calendar list, calendar metadata, or account settings. Google's consent screen lets you grant one scope and decline the other. Deleting your Taskelo account also deletes that calendar from your Google account.

Every read is the same call: events.list against your primary calendar, using a short-lived access token we obtain from Clerk for that request. There are exactly three moments we make it:

  • When you press Sync on the schedule tab. We fetch roughly one week back through ten weeks ahead and return the events to your browser, which caches them in localStorage so the week grid renders without another round-trip.
  • When you send a chat message. Our server reads your events for the next 14 days and includes their titles, descriptions, times, and locations in the system prompt sent to Anthropic, alongside your todos, notes, and goals. This read goes to Google directly and does not depend on your browser's cache or on your having pressed Sync.
  • When your daily brief is generated, if you've turned it on. A scheduled job runs without your browser open, reads your events the same way, and passes today's and tomorrow's into the prompt that writes the brief. This is the one calendar read that happens on a schedule rather than in response to something you clicked; it stops the moment you turn the brief off or disconnect Google.

In all three cases the events exist only in memory for the duration of that one request. We do not store the events themselves in our database, and we do not poll your calendar in the background for any other purpose. The only schedule data persisted on our servers is the per-user gcal sync cursor and the last-synced timestamp.

One consequence worth stating plainly: because Elo writes your brief from your calendar, the delivered brief may mention an event by name. That text goes out over the channels you chose — by email through Resend, and/or as a push notification. Push payloads are encrypted to your device's own key, so the push service that relays them cannot read the contents.

Taskelo's use of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements. We do not use Google user data for advertising; we do not share it with third parties beyond what's needed to deliver the app to you (Anthropic during chat, Cloudflare as transit / hosting); we do not let humans read it except where required to debug a problem you've reported, complete a security investigation, or comply with the law; and we do not use it to develop, improve, or train any generalised ML/AI model.

You can revoke access from inside the app ("Disconnect" on the schedule tab) or from Google's third-party access page. Disconnecting from the app also clears the events cached in your browser. For the cache on other devices, sign in there and press disconnect, or clear that browser's site data.

Daily brief (hosted only)

The daily brief is a short, Claude-written summary of your day — top priorities, calendar conflicts, and a nudge on one goal — available only on the hosted plan (generating it costs model tokens, so it shares the same entitlement gate as hosted chat). It's built from the same context sent to chat: your todos, canvas notes, goals, weekly routine, and — if you've connected Google Calendar — your events for today and tomorrow, which the job reads from Google at generation time rather than from any stored copy.

You choose how it's delivered: by email (sent through Resend), by push notification (sent to any device where you've enabled push), or both. Delivery preferences — enabled, time, timezone, channels, and any custom instructions — are stored on your account row so a background job (running every 15 minutes) can check whether it's your delivery time and send it, without your browser needing to be open. The generated brief is delivered and then discarded — we don't keep a copy of its text; the only record is the date we last sent one, so we don't send twice in a day. Push delivery requires storing one row per device (endpoint plus the browser-generated keys for that subscription). You can change your delivery time, switch channels, or turn the brief off entirely from inside the app at any time; doing so updates or removes these rows immediately.

Who we share data with

We share only what each service needs to do its job, and only with these processors:

  • Clerk — authentication, your email, and (if you connect Google Calendar) the brokered Google OAuth credential.
  • Stripe — payments, your card and billing details (which we never touch).
  • Anthropic — your hosted chat messages, at the moment you send them. The system prompt that goes alongside includes your todos, canvas, goals, weekly routine, and any synced calendar events. The same context is used to generate your daily brief, if enabled.
  • Google — only if you connect Google Calendar. Our worker calls Google's Calendar API with your authorised token to read your events: on manual sync, when you send a chat message, and when your daily brief is generated. Governed by Google's privacy policy.
  • Resend — only if you enable email delivery for the daily brief (or we need to send you a transactional email, like a magic link fallback). Resend processes the message content and your email address to deliver it — and because the brief is written from your workspace, that content can reference your tasks, goals, or calendar events. Governed by Resend's privacy policy.
  • Cloudflare — hosts our web app, our worker, and the D1 database that holds your synced workspace data. Can see request metadata (IP, user agent, timestamps).
  • Google Analytics — basic site analytics.

We don't sell your data, ever, and we don't share it with anyone else except when we're legally required to (e.g. a valid subpoena) or to defend Taskelo from abuse.

Cookies and tracking

We use cookies and similar storage only for: keeping you signed in (Clerk), remembering your preferences (localStorage), and Google Analytics. We don't use cookies to build advertising profiles.

Your rights

You can delete your account from inside the app — this removes your Clerk profile, wipes your cloud-synced todos / canvas notes / goals / weekly routine / chat history / settings / gcal sync cursor / daily brief preferences / push subscriptions from our database, cancels any active Stripe subscription, and (via Clerk) drops the stored Google OAuth credential. You can wipe the local copy on your current device, including any cached calendar events, by clearing your browser's site data for taskelo.com.

If you're in the EU, UK, or California, you have additional rights under GDPR/UK GDPR/CCPA — including access, correction, deletion, and the right to complain to your local supervisory authority. Email hello@taskelo.com and we'll honor those requests, usually within 30 days.

Data retention

We keep your Clerk account (email, Stripe customer id, daily token counter) and your synced data (todos, canvas notes, goals, weekly routine, chat history, app settings, gcal sync cursor, daily brief preferences, and any push subscriptions) for as long as your account exists. When you delete your account, all of that is removed — your Clerk profile is deleted and the corresponding row in our database cascades away with it in the same operation, including any push subscription rows. Google Calendar events are not retained on our servers at all — server-side reads are held in memory for a single request and discarded. The only lasting copy is the one your browser caches, which persists until you disconnect or clear site data. Stripe retains transaction records as long as it's legally required to (typically 7 years for tax/accounting purposes), which we can't override. Google Analytics aggregates data according to its own retention settings.

International transfers

Taskelo runs on Cloudflare's global edge network. Your data may be processed in any country where our processors operate (e.g. the United States for Clerk, Stripe, Anthropic, Google, and Google Analytics). By using Taskelo, you consent to those transfers.

Children

Taskelo is not directed to children under 13. If we learn we have collected data from a child under 13 without verified parental consent, we'll delete it.

Changes

We'll update this page if our practices change, and bump the "Last updated" date at the top. Material changes get an email to hosted users when reasonable.

Contact

Questions or privacy requests: hello@taskelo.com.