§  Privacy Policy

Privacy Policy

Effective October 11, 2026 · Wallpaper Calendar, a DCG app

The short version

Wallpaper Calendar is a local-first desktop app. Your events live in files on your own computer, there is no account, and the app runs no analytics or tracking of any kind. It talks to us in only a few ways: installed copies check for updates, Pro checks its license key when you activate it on a computer, it sends one word if you answer the optional question on first run, and, if you use shared calendars or invites, it sends those calendars and invites to our relay encrypted, so that we cannot read them. Each is described below, along with the feedback box on this website and the optional features that talk to other services.

Data stored on your device

Events, tasks, notes and settings are stored in plain files under your own user folder (%LOCALAPPDATA%\WallpaperCalendar on Windows, ~/Library/Application Support/WallpaperCalendar on macOS). They stay on your machine, are kept when you update or uninstall, and can be deleted by you at any time by removing that folder. If one of those files is ever found damaged, the app keeps a copy of it in a folder called damaged in the same place before putting an earlier version back, so that nothing in it is lost for good.

Google user data (optional Google Calendar sync)

If, and only if, you connect a Google account, the app syncs events two-way between your device and Google Calendar. It asks Google for two permissions: calendar.events, to read and write your events, and calendar.calendarlist.readonly, to see the list of your calendars with their names and colours so you can choose which ones to sync. It also asks Google to sign you in (openid and email), only so it can show which Google account is connected. That email address is kept on your device and nowhere else. Specifically:

  • –Google Calendar data is accessed solely to display and synchronize your events between the app on your device and your Google Calendar, to let you choose which of your calendars to include, and for the two things below that only you can start.
  • –All processing happens on your device. Your calendar data is transmitted only between your computer and Google’s own API, except in the two cases below, and never to us in a form we can read.
  • –When you share it. If you share one of your Google calendars that you can edit onto a shared calendar, or move a Google event into a shared calendar, copies of those events (title, times, notes and the rest) are encrypted on your device and sent through our relay to the people on that shared calendar. The relay stores only ciphertext it cannot read. Stopping the share takes the copies down again.
  • –When you use the AI assistant. If you turn on the Pro AI assistant with your own Anthropic API key, each command you give it goes to Anthropic, along with the title, date, time and repeat rule of the events you can edit near today (up to 500), Google-synced events included. See Other optional connections below.
  • –Sign-in tokens are stored locally on your device. The Disconnect button in the app deletes them from your device; to revoke the app’s access to your Google account as well, use myaccount.google.com/permissions.
  • –We do not sell Google user data or use it for advertising, it is transferred only in the two ways above that you start yourself, and nobody at DCG reads it.

Wallpaper Calendar’s use and transfer of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements.

How we protect your data

Sensitive data is protected with the following mechanisms:

  • –Encryption in transit. Every connection the app makes on its own, to Google’s APIs, to our relay server, to our license server, and to this website, uses HTTPS/TLS. The one exception is a calendar feed address you paste yourself: it is fetched exactly as you give it, so an address that begins with http:// is fetched without encryption. The app never sends your calendar data anywhere unencrypted.
  • –Google sign-in tokens. OAuth access and refresh tokens are stored only in a file inside your own operating-system user profile (%LOCALAPPDATA%\WallpaperCalendar on Windows, ~/Library/Application Support/WallpaperCalendar on macOS), protected by your OS user-account permissions. Tokens never leave your device, are never transmitted to us, and are deleted when you click Disconnect in the app or remove the app’s data folder. You can also revoke them at any time at myaccount.google.com/permissions.
  • –No readable server-side copy of Google data. We operate no database, log, or cache of readable Google user data. Your Google Calendar events exist only on your device and in your Google account, apart from copies you choose to share onto a shared calendar, which our relay holds only as ciphertext it cannot read. So there is no readable copy of them for us to lose, leak, or disclose.
  • –End-to-end encryption for shared calendars. If you use the optional shared-calendars feature, events, notes, lists and categories are encrypted on your device with AES-256-GCM before upload. A shared calendar gets a random key, made on its owner’s device, and an invite carries that key to each person the owner invites, sealed on the owner’s device so that only that person’s app can open it (a P-256 key exchange, then AES-256-GCM). Shared calendars set up before invites use a key derived (SHA-256) from the calendar’s own code, which is never sent to us. Either way, our relay server never holds a calendar’s key and stores only ciphertext it cannot decrypt. Google Calendar events go into a shared calendar only when you share a Google calendar onto it or move an event into it yourself.
  • –Access control. No DCG personnel can read your calendar data: local data never reaches us, and shared-calendar data is readable only by the people on that calendar (for a calendar set up before invites, anyone holding its code). There is no administrative interface, master key, or recovery mechanism that can decrypt user content.
  • –Data retention & deletion. Local data persists only on your device and is removed by deleting the app’s data folder. Shared-calendar ciphertext is deleted from the relay server when the calendar’s owner deletes the calendar in the app. A waiting invite is deleted when it is accepted or declined, and after 30 days at the latest. We keep no backups of user content ourselves; Cloudflare, which hosts the relay, keeps a short recovery history of its database, which holds the same ciphertext and nothing more.
  • –Hosting. This website, the relay server and the license server run on Cloudflare. Like any host, Cloudflare sees the network address each connection comes from in order to answer it. We do not keep those addresses, with two short exceptions: for a minute at a time, Cloudflare counts how many changes and invites each address sends to the relay and how many answers to the first-run question, so nobody can flood them; and the feedback box keeps an address for about an hour, as described below.
  • –Incident notice. In the unlikely event of a security incident affecting the relay server, we would post notice on this website; note that shared-calendar content and invites on that server are ciphertext and remain unreadable without keys that are kept only on your devices, which we do not hold.

Shared calendars (optional)

If you create or join a shared calendar, the events in that one calendar sync through our relay server so the other people on it can see them. They are encrypted on your device before upload, and the server stores ciphertext it cannot read. You can also share one of your own calendars onto a shared calendar (a Google calendar you can edit included): copies of its events are then encrypted and sent the same way, until you stop sharing it. The alert and countdown pin you give a shared event stay on your device. We can see only technical metadata: the calendar’s id, timestamps, the size of each encrypted item, and what kind of item it is (an event, the shared notes, the to-do list, a notepad, the category list, the folder list). Copies of your own calendars carry an id that stays the same on every shared calendar you share onto, so the relay could tell that those copies come from the same person, though not who that is. Events outside shared calendars never reach our relay. Leaving a shared calendar stops all syncing for it.

People join a shared calendar by invite. Your app makes a key pair on your device the first time it shows your personal invite code, and the 16-letter code is worked out from the public half. The private half never leaves your device. At that point the app files a mailbox for you on our relay, which keeps an id worked out from your code, your public key, a random secret that lets only your app open the mailbox, and the date. From then on the app looks in that mailbox when it starts and every five minutes. Your code is not a secret: all it lets anyone do is send you an invite, and nothing joins until you accept. When the owner of a shared calendar invites you, their app checks that the public key on file matches your code, then seals the invite on their device so that only your app can open it. The relay keeps it in your mailbox with a random id and the time it was sent. Inside, unreadable to us, are the calendar’s id and key, your own access secret for it, the calendar’s name, the sender’s name and a colour. An invite is deleted when you accept or decline it, and after 30 days at the latest. For each person invited, the calendar’s member list on the relay keeps a random member id, a random access secret, the first four letters of their invite code (so the owner can tell people apart), which kinds of items they may change, when they were invited, and whether the owner removed them. No names, calendar names or keys are ever stored in a form we can read.

Website download counts

When you download the app from this website, our server counts the download so we know how many there are, and keeps a short rolling list (the most recent 200 requests) of which file was fetched, the browser type, and the country, purely to tell real downloads apart from search-engine crawlers. We do not store IP addresses for this, we set no cookies, and none of this is linked to you or to anything you do inside the app.

Update checks

Installed copies of the free calendar for Windows ask this website whether a newer version is out, a few seconds after they start and every six hours after that. The request says, at most, which version of the calendar is asking, and nothing about you. We count these checks per day to know roughly how many copies are in use, and keep nothing else about them. The free Mac version never checks on its own, and neither does the portable zip run straight from the folder you unzipped it to. Installed with the zip’s install.cmd, it checks like any installed copy.

The Pro edition asks our license server, license.dcgapps.com, instead, and only once your license key is entered under Settings > Account > License: on Windows on the same schedule, and on a Mac a couple of minutes after it starts and every six hours after that. That check says only which version is asking. When a newer version is out, the download of it also sends your license key, in the request’s header and over HTTPS, so that the server can check the key before it hands over the update. Pro on Mac now does this too, the same way as on Windows. The key holds the email address you bought Pro with and Stripe’s id for that purchase.

Each Pro key includes one download, so the license server counts how many times each key has been used to download Pro, and how many times it has fetched each update. For that it keeps a scrambled form of the key and the counts, with the dates and the name of the file downloaded last, and nothing else: not the key itself, not your email address and no network addresses. The scrambled form is worked out from what your key holds (the email address and the purchase) together with the secret key we sign license keys with, so it cannot be turned back into the address, and nobody without that secret key can match it to an email address. If we switch a key off, for example one passed around in public, the server also keeps its scrambled form on a list, with the date and a short note of why, never an email address. The download page at license.dcgapps.com/get checks the key you paste there and counts the download the same way. The page for a lost key, license.dcgapps.com/lost, sends the email address and receipt number you type there to Stripe, which handled your payment, to find your purchase, and keeps neither.

Activating Pro

Each Pro key works on two computers. When you activate Pro, the app sends your key, a scrambled id of the computer, and the computer’s Windows or macOS version and its maker and model to our license server, license.dcgapps.com, over HTTPS. Once this computer is activated, the app does not ask again. Until then, for example while the server cannot be reached or the key is already on two other computers, the app tries again each time it starts. The app works that id out on your computer from the id Windows or macOS gives the machine, scrambled so that it cannot be turned back into it. The server keeps a scrambled form of each, the key’s and the computer’s, at most two computers per key. For each computer it also keeps the dates it was first and last activated, and its Windows or macOS version and its maker and model (for example “Dell XPS 15” and “Windows 11 Home”), so that your computers can be told apart, for example when you ask to have a key’s computers reset. It keeps nothing else: not the key itself, not your email address, not the computer’s own id, never the computer’s name or your name, and no network addresses. Both scrambled forms are worked out with the secret key we sign license keys with, so nobody without it can match them to you or to your computer. The server answers with a signed note for that one computer, which the app keeps with its settings, so Pro works offline from then on.

The feedback box

If you send a message from the feedback box on this website, we keep the message, the date, and your name and email address if you choose to give them, so that we can read it and reply. We also keep the network address it came from for about an hour, only to stop anyone sending more than a few messages an hour, and then delete it. Messages are read only by us and are never sold or shared. To have yours deleted, email contact@dcgapps.com.

The one question we ask

The first time the app runs it asks where you found DCG apps, with a few buttons (search, Reddit, YouTube, a friend, another DCG app, somewhere else) and a Skip option. If you tap one, your device sends us that single word and which DCG app is asking, and nothing else: no name, no account, no identifier, and no way to tie it back to you. We use it only to learn which channels bring people in. Skipping sends nothing, and the question is never asked again.

Other optional connections

Features you can turn on make direct requests from your device to: Open-Meteo (weather: the city name you type, to find it, and after that the city’s coordinates), iCal feed addresses you paste, and Anthropic (the AI assistant in Pro, only if you provide your own API key). Each command you give the assistant goes to Anthropic with your API key, along with the title, date, time and repeat rule of the events you can edit near today, up to 500 of them, so it can answer about them or change them. That includes events synced from Google and events on shared calendars. Anthropic handles them under its own terms. None of these are active until you turn the feature on.

One further request happens only when you press the Detect button next to the weather location: your device asks an IP geolocation service (ipwho.is, with get.geojs.io as a fallback) to estimate your city. Those services see your IP address, which is how the estimate is made, and they receive nothing else. We store only the resulting city name and coordinates, on your own device. Detect never runs on its own, and typing your city by hand avoids the request entirely.

Changes & contact

If this policy changes, the update will be posted here with a new effective date. Questions: contact@dcgapps.com.