Privacy Policy
The short version¶
We store your Discord user ID and your display preferences — timezone, visibility toggles, region, and colour settings. That's essentially it.
We cannot read your messages. The Bot doesn't have Discord's Message Content permission, so message text is technically inaccessible to us, not merely unused.
Your data is stored in Canada. No advertising, no analytics, no tracking, no cookies, no profiling, and nothing is sold or shared for marketing.
You can have everything deleted by emailing harkirat117@gmail.com — see §9.
This summary is for convenience. The sections below are the actual policy.
Who is responsible for your data¶
The data controller is:
Harkirat Mangat, also known as "dior", an individual based in Ontario, Canada. 📧 harkirat117@gmail.com
This is a hobby project run by one person. There is no company, no data protection officer (none is required — we do not carry out large-scale or systematic monitoring), and no privacy team. Email reaches a real person.
EU representative¶
We have not appointed an EU representative under GDPR Article 27. We rely on the exemption in Article 27(2)(a): our processing is occasional, does not include special-category or criminal-conviction data on any scale, involves only a user ID and display preferences, and is unlikely to result in a risk to the rights and freedoms of individuals.
If that assessment ever stops being accurate, we will appoint a representative and update this policy. EU and UK users can reach us directly at the address above, and we answer.
What we collect¶
Information stored about you¶
Everything below lives in a single UserPreference record keyed to your Discord user ID. A record is only created once you actually use the Bot.
| Data | What it is | Why we have it |
|---|---|---|
| Discord user ID | Your permanent numeric Discord ID | The key linking your preferences to you. Required. |
| Timezone | An IANA timezone you set (e.g. America/Toronto) | So /timestamp and countdowns show correct local times |
| Timestamp style | Your preferred timestamp format | Remembers your /timestamp choice |
| Visibility settings | Public or private replies, per feature group | Remembers whether you want replies others can see |
| Region preference | Your CP pricing region, and whether it's pinned | Shows the right prices without re-selecting |
| Calendar filter | Active-events-only vs all events | Remembers your /calendar toggle |
| Accent colour style | Which colour source you've chosen | Controls how your messages are coloured |
| Cached colour values | Hex codes and 6-swatch palettes derived from your Discord profile images | Avoids re-analysing your avatar on every command |
| Colour source hashes | The Discord asset hash a cached colour was computed from | Detects when you change your avatar so the cache refreshes |
Is a Discord user ID personal data? Yes — we treat it as such. It's a persistent unique identifier that can be linked back to you, which brings it within GDPR Art. 4(1) and PIPEDA's definition of personal information. We say so rather than arguing otherwise.
About the colour data specifically¶
If you use the accent-colour or "View Colors" features, the Bot downloads your Discord avatar, banner, avatar decoration, or nameplate image and analyses it to extract dominant colours.
- The images themselves are never stored. Fetched, analysed in memory, discarded.
- Only the resulting colour values are saved — hex codes and palettes.
- Display Name colours are the two colours you picked in Discord's Nitro settings, stored as-is rather than extracted from an image.
- The stored "source" value is Discord's own asset hash, used purely to notice when you've changed your image.
Temporary data held in memory¶
Exists only in the server's memory while it runs, and is lost on every restart or deploy (typically hours to days):
- Anti-spam cooldown timestamps (your user ID → time of your last interaction)
- A short-lived cache of your Discord profile data
- A per-message colour choice, so a message keeps its colour when you click buttons
Operational logs and alerts¶
The Bot keeps an alert log of technical events — crashes, database problems, gateway disconnects, daily health checks — recording the alert level, a description, timestamps, process memory use, and uptime. Alerts are also posted to a private Discord channel that only the administrator can see, via a Discord webhook.
These concern the bot's health, not you. However, an error captured in a crash report could incidentally contain a Discord user ID if the failure happened while processing that person's command. This isn't deliberate, and these logs are never used to analyse users.
Alert logs are automatically deleted after 30 days.
Server logs (Google Cloud Logging)¶
The server the Bot runs on ships its console output to Google Cloud Logging, where it is retained for 30 days and then automatically deleted. These are operational logs — startup and shutdown events, command routing, errors and stack traces, database connection state, and the running version and commit.
As with alert logs, an error or stack trace could incidentally contain a Discord user ID if the failure occurred while processing that person's command. We verified that no log statement in the Bot deliberately writes a user ID, but an error object can carry one. These logs are not indexed by user, are never used to analyse or profile users, and are readable only by the administrator.
If you use GitHub¶
Filing an issue or pull request on our GitHub repository means GitHub processes your data under GitHub's Privacy Statement. That's GitHub's processing, not ours, and it is entirely separate from using the Bot.
The repository's visibility may change at any time, without notice. It may be public or private at any given moment, at the maintainer's discretion. If it is public, anything you post there is visible to anyone. This policy, the Terms of Service, and the Bot's behaviour do not depend on that setting — they apply identically either way, and these documents remain published at their permanent public URLs regardless.
What we do NOT collect¶
| ❌ We do not have | Why |
|---|---|
| Your messages | The Bot runs with only the Guilds gateway intent. It does not have the Message Content intent, so Discord never sends us message text. A technical impossibility, not just a policy promise. |
| Your DMs | Same reason. |
| Your email address | Never requested, never received from Discord. |
| Your real name | Never requested. |
| Your Discord username or display name | Used momentarily to render a response, never written to the database. |
| Your IP address | Discord handles the connection; we never see it. |
| Payment information | The Bot is free and has no payment feature. |
| A list of your servers | Not collected or stored. |
| Analytics or tracking data | No analytics SDK, no telemetry, no tracking pixel, no ad network, no fingerprinting. |
| Cookies | There is no website. The Bot runs entirely inside Discord and sets no cookies or similar storage on your device. |
| Voice data, location, contacts, or biometrics | Not applicable, not collected. |
We do no profiling, no behavioural advertising, and no automated decision-making producing legal or similarly significant effects (GDPR Art. 22).
Why we process it, and our legal basis¶
| Purpose | Legal basis (GDPR Art. 6) |
|---|---|
| Remembering your preferences | Consent — you chose to set them (Art. 6(1)(a)) |
| Making the Bot work when you invoke a command | Contract — the Terms of Service (Art. 6(1)(b)) |
| Keeping the Bot secure and stable (cooldowns, crash logs) | Legitimate interests — running a functioning, non-abused service (Art. 6(1)(f)) |
| Complying with legal obligations | Legal obligation (Art. 6(1)(c)) |
No special category data (Art. 9) is processed — no health, biometric, racial or ethnic origin, political, religious, or sexual-orientation data.
Under PIPEDA, our basis is your implied consent: you install the Bot and set a preference, and we store it for the obvious purpose of honouring it. You can withdraw consent at any time (§9).
A note on PIPEDA's scope. PIPEDA applies to organisations collecting personal information "in the course of commercial activity." This Bot is free and non-commercial, so PIPEDA arguably doesn't bind us at all. We comply with it regardless, and don't rely on that argument to hold anything back.
Who your data is shared with¶
We do not sell your data. We do not share it for advertising or cross-context behavioural advertising. We do not disclose it to data brokers. We have never done so, and we have no plans to.
| Provider | What it handles | Where |
|---|---|---|
| Discord Inc. | The platform itself — your ID, your interactions | Per Discord's Privacy Policy |
| MongoDB Atlas (MongoDB, Inc.) | Stores your preference record | 🇨🇦 Azure Canada Central (Toronto) |
| Google Cloud Platform (Google LLC) | Hosts the server the Bot runs on | 🇺🇸 us-east1 (South Carolina) |
| Google Cloud Logging (Google LLC) | Server logs, 30-day retention | 🇺🇸 United States |
| Google Cloud Vertex AI (Google LLC) | Admin-only image extraction — no end-user data | 🇺🇸 United States |
| Cloudinary Ltd. | Hosts cached game images only | 🇺🇸 United States |
| Cloudflare, Inc. | Serves these legal documents as a public web page | Global edge network |
About Cloudflare: it hosts this policy and the Terms of Service so they are publicly readable, as Discord requires. It has no role in the Bot itself and never sees your Discord data. Like any web host, it processes standard request data — including your IP address — when you load these pages, under Cloudflare's privacy policy. Reading this page is the only thing that involves them.
Three clarifications worth making¶
Your stored personal data stays in Canada. The UserPreference records — the only place your preferences live — are in an Atlas cluster hosted in Azure Canada Central, Toronto. Verified 2026-07-28 21:36 EDT by resolving the cluster's DNS records.
Cloudinary holds no personal data. The images there are game screenshots and weapon artwork supplied by the administrator. Your avatar is never uploaded.
No AI system processes your data. The /autobuild command sends screenshots to a Gemini model for text extraction, but it is restricted to the administrator's own Discord account. No end-user data, image, or message is ever sent to any AI service.
Two details that matter here:
- We call Google Cloud Vertex AI (
aiplatform.googleapis.com, project-scoped, service-account authenticated) — not the consumer Gemini API (generativelanguage.googleapis.com). The distinction is important: under the Google Cloud terms that govern Vertex AI, Google does not use customer data submitted to Vertex AI to train its models. The consumer Gemini API's free tier has materially weaker terms in this respect. We use the enterprise path. - Separately, AI tools were used to help write this project's code and documentation — see NOTICE §6. That is development-time assistance, not runtime processing of your data.
If a provider mishandles your data¶
We choose our providers carefully and rely on their published privacy terms and data processing agreements. But we are one person, and we have no ability to audit, inspect, or control what Discord, Google, MongoDB, or Cloudinary actually do inside their own systems.
So, plainly:
- Discord is an independent controller of its own data, not our processor. What Discord collects about you through using Discord — far more than we ever see — is governed by Discord's Privacy Policy and is Discord's responsibility, not ours.
- Our other providers act as processors on our instructions, under their own data processing agreements. We do not authorise any of them to use your data for their own purposes, and we have not agreed to any such use.
- If a provider acts outside those terms, that is their breach. To the fullest extent the law allows, we are not liable to you for it. Our liability to you in any event is limited by §15 of the Terms of Service.
- What we will do: if we learn a provider has mishandled your data, we will investigate, tell you where §8.1 requires it, notify the relevant regulator where required, and change provider where that's the right answer.
Being honest about a limit of this section. If data protection law applies to us, we are the controller, and a controller carries responsibility for choosing and overseeing its processors that it cannot simply disclaim in a privacy notice. This section allocates contractual risk between you and us and tells you the truth about what we can and can't control. It does not, and cannot, override any obligation the law places on us, and we don't pretend otherwise.
Other disclosure¶
We may disclose information where legally required — a valid court order, subpoena, or law-enforcement request under Canadian law — or where necessary to investigate a security incident or protect someone's rights or safety. Given what we hold, such a request would yield very little. Where we are lawfully permitted to tell you about such a request, we will.
If the Bot were ever transferred to another operator, your data could transfer with it. We would give notice first, and you could delete your data beforehand.
International transfers¶
Your stored preferences do not leave Canada. They sit in Azure Canada Central.
Some processing happens elsewhere: the server that runs the Bot is in the United States (Google Cloud us-east1), so your data is handled in memory there while a command runs. Discord operates globally and handles your data under its own policy.
If you are in the EEA, the UK, or Switzerland: Canada holds a partial adequacy decision from the European Commission for organisations subject to PIPEDA, which means transfers to Canada are recognised as offering adequate protection. For the US-based processing, we rely on Google's transfer mechanisms — Standard Contractual Clauses and the EU–US Data Privacy Framework — as set out in the Google Cloud data processing terms.
Given the data involved is a user ID and colour preferences, the practical risk of these transfers is low.
How long we keep it¶
| Data | Retention |
|---|---|
| Your preference record | Kept until you ask us to delete it — see §9 |
| Alert logs | 30 days, then automatically deleted |
| Server logs (Google Cloud Logging) | 30 days, then automatically deleted |
| In-memory caches | Until the next restart or deploy — hours to days |
| Cloudinary game images | Until the underlying content rolls out of the Bot's history |
An honest disclosure about deletion¶
There is currently no automated deletion and no self-service delete command.
Removing the Bot from your Discord account stops all future interaction, but does not by itself erase your stored preferences — they simply sit unused.
Deletion is currently handled manually, on request, by email. That is a legitimate and compliant route — the law requires that you be able to exercise the right, not that a button exist — but we consider the absence of self-service a shortcoming rather than a design choice. A /settings delete option and an automatic clean-up of long-dormant records are planned, and this policy will be updated when they ship.
/settings currently lets you change stored values, which overwrites them. It has no reset or delete.
Security¶
What actually protects your data:
- Credentials live in environment variables, never committed to the repository; the secrets file is permanently excluded from version control.
- Database access is restricted and authenticated.
- All connections to Discord, MongoDB, Cloudinary, and Google Cloud use TLS.
- Administrative commands are locked to a single hard-coded Discord ID — no one else can reach the management, alerting, or automation features.
- Rate limiting and cooldowns guard against abuse.
- Only one bot instance may run at a time, enforced by a database lock.
The limits, stated plainly: this is a personal project on a single small server. There is no formal information-security programme, no penetration testing, no SOC 2 audit, and no 24/7 monitoring. No system is perfectly secure, and we cannot guarantee absolute security.
The mitigating factor is that there is very little to lose — a public Discord ID and some colour preferences. No passwords, no emails, no payment details, no message content.
If there's a breach¶
If a breach creates a real risk of significant harm, we will:
- Report it to the Office of the Privacy Commissioner of Canada as PIPEDA requires, and keep a record of it.
- Notify affected users through the Bot or the project's public channels, without undue delay.
- For EEA/UK users, notify the relevant supervisory authority within 72 hours where GDPR requires it, and notify you directly where the risk is high.
Your rights and how to use them¶
Whoever and wherever you are, you can ask us to do all of the following. We apply the strongest standard to everyone rather than sorting users by jurisdiction.
| Right | What it means |
|---|---|
| 🔍 Access | Get a copy of everything stored about you |
| ✏️ Correction | Fix anything inaccurate |
| 🗑️ Deletion | Have your record erased entirely |
| 📦 Portability | Receive your data in a machine-readable format (JSON) |
| ⛔ Object / restrict | Object to legitimate-interests processing, or ask us to pause it |
| ↩️ Withdraw consent | At any time, without affecting past lawful processing |
| 🚫 Non-discrimination | We will not degrade the Bot for you for exercising a right |
How to make a request¶
Email harkirat117@gmail.com with the subject line "Privacy Request", and include:
- Your Discord user ID — the numeric one. In Discord: Settings → Advanced → enable Developer Mode, then right-click your own name and "Copy User ID".
- What you want — access, correction, deletion, a copy of your data, or withdrawal of consent.
That's the whole process. There is no form, no account, and no fee.
Verifying it's really you¶
Because a Discord user ID is public, we need to know the request actually comes from the account holder before we act on it — otherwise anyone could delete someone else's settings.
We will ask you to confirm the request from the Discord account in question, normally by sending a direct message to the administrator (dior) from that account referencing your email. If we can't reasonably verify you, we may decline to act, and we'll tell you why (GDPR Art. 12(6)).
This step exists to protect you, not to obstruct you.
Timing¶
- We respond within 30 days.
- Complex requests may be extended by up to a further 60 days, and we'll tell you within the first 30 if that happens (GDPR Art. 12(3)).
- Requests are free. We may charge a reasonable fee for, or refuse, requests that are manifestly unfounded or excessive — particularly repetitive ones (GDPR Art. 12(5)). We'll explain if we ever do.
What deletion actually does¶
We delete your UserPreference record entirely. Your preferences revert to defaults, and the Bot behaves as though you'd never used it. Nothing is retained in a shadow copy.
Two honest caveats:
- Alert logs and server logs may briefly contain an incidental user ID (§2.4, §2.4a). Both purge automatically within 30 days and neither is indexed by user, so we do not routinely search them. Ask and we will.
- Database backups maintained by MongoDB Atlas may retain a copy until they age out on Atlas's own schedule. We cannot selectively edit a backup, which is a normal and accepted limitation.
Complaints¶
If you're unhappy with how we've handled your data, please tell us first — but you have every right to go straight to a regulator:
- Canada: Office of the Privacy Commissioner of Canada — 1-800-282-1376
- EEA: your national data protection authority (list)
- UK: Information Commissioner's Office — 0303 123 1113
- Quebec: Commission d'accès à l'information
- California: California Privacy Protection Agency
A note on California¶
The CCPA/CPRA applies to "businesses" meeting thresholds — over $25M in annual revenue, personal information on 100,000+ consumers, or 50%+ of revenue from selling personal information. We meet none of them, so the CCPA does not apply to us as a matter of law.
We honour the equivalent rights anyway. For the record, in CCPA terms: the only category of personal information we collect is identifiers (a Discord user ID) plus user-set preferences; we collect it directly from your use of the Bot; we use it solely to operate the Bot; we do not and have never sold or shared personal information; and we do not collect sensitive personal information.
Children's privacy¶
The Bot is not directed at children. You must meet Discord's minimum age for your country — 13 in most places, and 14, 15, or 16 in parts of the EU and elsewhere. See §3 of the Terms of Service.
We do not knowingly collect data from anyone below that age, and we have no mechanism to verify age beyond Discord's own — we rely on Discord's enforcement of its minimum age.
If you believe a child's data is stored, email harkirat117@gmail.com and we will delete it promptly and without requiring the verification steps in §9.2.
Because we never collect names, emails, photographs, or message content, the data we hold about any user — including a young one — is limited to a Discord ID and display preferences.
Third-party links and content¶
The Bot displays images and information sourced from third parties and may link elsewhere. We are not responsible for the privacy practices of any third-party site or service. Discord's own handling of your data is governed by Discord's Privacy Policy, which is worth reading — it covers far more data than we ever see.
Changes to this policy¶
We may update this policy. When we do:
- The effective date and version at the top change.
- The full change history is kept in the repository's git log.
- For material changes — new data collected, a new recipient, a new purpose — we will make reasonable efforts to give notice before they take effect, and will seek fresh consent where the law requires it.
Continued use after a change takes effect means you accept the updated policy. We will not apply a materially different use of already-collected data retroactively without your consent.
Contact¶
Harkirat Mangat ("dior") — Data Controller Ontario, Canada 📧 harkirat117@gmail.com
Email is the canonical contact and always reaches us. We deliberately don't list a repository link here, because the repository's visibility can change (§2.5) and a contact point in a privacy policy must not be able to go dead.
For privacy requests, use the subject line "Privacy Request" and include your Discord user ID.
Appendix A — Complete data inventory¶
Every field stored about a user. This mirrors the UserPreference schema, which you can read yourself at models/UserPreference.js.
Identity
discordId— your Discord user ID
Preferences
timezone,timestampStyleloadoutVisibility,seasonalVisibility,timestampVisibility,settingsVisibilitydefaultRegion,defaultRegionModecalendarEventFilteraccentColorStyle
Cached colour values (derived, not raw images)
avatarColorHex/avatarColorSourcebannerColorHex/bannerColorSourcedisplayNameColorHex/displayNameColorSourcedecorationColorSource,nameplateColorSourceavatarPalette,bannerPalette,decorationPalette,nameplatePalette(+ source hashes)
That's the whole list. It mirrors the schema in the source code rather than paraphrasing it, so it can be checked line-by-line against the software itself. If you have access to the repository you can verify it directly; if you don't, ask and we will show you the relevant file.
Appendix B — Change history¶
| Version | Date | Change |
|---|---|---|
| 1.0 | 28 July 2026 | Initial policy. |
Future revisions will be listed here. The complete drafting history is kept in the repository's git log.
Appendix C — How each claim was verified¶
A privacy policy is a set of enforceable representations. Saying more than is true is worse than saying nothing. Every factual claim in this policy was checked against the running software rather than asserted, and this table records how.
| Claim | How it was verified |
|---|---|
| We cannot read your messages | The Discord client is constructed with GatewayIntentBits.Guilds only — no Message Content intent. Verified in index.js. |
| No analytics, telemetry, or tracking | Searched the codebase for analytics and error-reporting SDKs (Sentry, PostHog, Mixpanel, Google Analytics). None present. |
| The exact fields we store | Read directly from the UserPreference Mongoose schema. Appendix A is a transcription of it, not a summary. |
| Alert logs deleted after 30 days | RETENTION_DAYS = 30 in utils/alertStore.js, with a matching deleteMany on createdAt. |
| Server logs deleted after 30 days | Google Cloud Logging default retention, as relied on by scripts/vmstatus.sh. |
| Your data is stored in Canada | Resolved the Atlas cluster's DNS records to mtm-azure-**canatral**-… — Azure Canada Central, Toronto. |
| Cloudinary stores in the US | Cloudinary's published documentation: standard accounts default to US storage; EU residency is an Enterprise option. |
| We use Vertex AI, not the consumer Gemini API | The request endpoint in utils/visionExtract.js is aiplatform.googleapis.com, project- and location-scoped — not generativelanguage.googleapis.com. |
| No AI receives end-user data | /autobuild is the only AI call site and is gated on the administrator's Discord ID. |
| Admin commands are locked to one account | ALLOWED_ADMIN_ID guards in commands/manage.js, commands/autobuild.js, and the central interaction router. |
| There is no automated deletion | Searched for every deleteOne / deleteMany / findOneAndDelete in the codebase. None operates on UserPreference. This is why §7.1 discloses a shortcoming instead of claiming a capability. |
/settings has no reset or delete | Searched commands/settings.js for reset/restore-default handling. None exists — it only overwrites individual values. |
| No cookies | The Bot has no web surface. Cloudflare serves these documents; that is the only web interaction. |
Where we could not verify something, we said so rather than guessing — see the backup-retention caveat in §9.4 and the honest limits stated in §5.2, §7.1, and §8.
You are welcome to check any of this yourself, or to ask us to show you the relevant code.
Dior's Builds is an unofficial fan project and is not affiliated with Activision Publishing, Inc. or Discord Inc.