← subline.page

Privacy

Last updated 25 October 2026

Subline translates Discord messages on your computer. To translate, it must send text to a translation service. This page says what leaves your computer, where it goes, what is kept, and for how long. It describes what the current version (0.2.9) does today. Version 0.2.9 translates only with AI and does not use Google Translate. Older versions are under Older versions. Where something is outside our control, or we have not confirmed it, this page says so.

The short version

  • Subline translates nothing until this computer has AI. That is a linked Discord account with AI: its 7 days of AI, a server code's 30 days, or a subscription. These keep AI for good: a plan bought before 0.2.9, a server code redeemed before 0.2.9, and AI paid for before the price change. On a computer that had its plan before 0.2.8, a bought plan or a server code keeps working until a Discord account on it links. An early-user or gifted plan does not. It needs a link, then gives the 7 days of AI. Without AI, a message is sent only when you press ⚡ on it, up to 5 a day. Otherwise no Discord message text leaves your computer.
  • Linking uses Discord's own Authorize window. It asks only for identify. The relay keeps a keyed hash of your Discord account id and the day your Discord account was made. It never keeps your Discord account id, your username or your email. See Linking your Discord account.
  • Every translation goes to Subline's relay, then to an AI service. Each request also carries usernames, message ids and up to 8 earlier messages for context. Those earlier messages can include your own.
  • The 7 days of AI start with your first translation. The relay keeps when they started, under the keyed hash of your Discord account id, with no expiry. So they happen once per Discord account. See The 7 days of AI.
  • Names and pronouns go to the relay only when you hover them, or open a profile card. Only names in a script your language does not use, and pronouns. See Names and pronouns.
  • The relay does not store the messages it translates. For ⚡ translations without AI only, it keeps a scrambled form of the text for up to 3 days, so the same message is not counted twice. It keeps your code, your account, the keyed hash from linking, scrambled ids of your computers, and purchase links. For a linked account, it also keeps five of your settings and your 🌐 choices, with channels in scrambled form. Most of these have no expiry.
  • Feedback goes only when you press Send. You see all of it first. The relay keeps it for 180 days and emails a copy to the owner. See Feedback box.
  • Payments go through Dodo Payments, and start only inside Discord. This website sells nothing. Dodo collects your name, email and payment details. Dodo's payment notices to the relay can include your name, email, address and some card details. The relay does not store or log them.
  • Subline checks in with the relay every time Discord starts, and about every 24 hours. It sends your install id. Only uninstalling stops this.
  • No ads and no cookies. No third-party analytics or tracking scripts in the app or on this website. This website sends Subline's server one ping when the home page opens, and one when you press a download button. The relay keeps only daily counts of these, and its own usage counts (see Stats and This website).
  • Your computer keeps copies. Translations, your code (in plain text), a log file and settings stay on your computer. Some of these stay after you uninstall.
  • You can turn things off. Use the globe button for one channel, or Subline → Settings for all servers and for profiles and embeds. DMs are off until you turn one on.

Messages

Every translation comes from an AI model, through Subline's relay. See ✦ AI translation. Version 0.2.9 does not use Google Translate.

When a message is sent

  • By itself, only while this computer has AI: your linked Discord account has AI, or this computer had a bought plan or a server code before 0.2.8 and no Discord account on it has linked yet. See The 7 days of AI.
  • When you press ⚡ on a single message. Without AI, ⚡ works up to 5 times a day. Nothing else is sent then.
  • Only in the channel you have open. Other channels send nothing until you open them.
  • Only in channels that are on. Server channels are on by default. DMs and group DMs are off by default.
  • When you open a channel, Subline translates up to 20 recent messages. This is the Earlier messages setting. You can set it to 0.
  • When you scroll up and Discord loads older messages, Subline translates up to that number of them again.
  • New messages and edited messages are translated as they arrive.
  • Embeds, polls and forwarded messages follow the same channel rule.
  • Messages from bots and from people you have blocked are treated like any other message. Subline does not filter them out.

What is not sent

  • Your own messages are never sent to be translated by themselves. If you press ⚡ on one of your own messages, it is sent. Your own messages can also go as context. See the next section.
  • Messages that have nothing to translate for you stay on your computer. This is text that is only emoji, mentions, links, digits or punctuation, and laughter. A word repeated many times is still sent. Subline decides this on your computer.
  • If you read English, English chat shorthand also stays on your computer, and so does a message that Subline is sure is English. For other reading languages, Subline cannot tell this on your computer. The message goes to the relay, and the AI answers that it needs no translation.
  • Language detection runs on your computer. The AI also detects the language as part of each translation. There is no separate detection request.
  • Attachment file names and voice audio are never translated or sent.

✦ AI translation

The ✦ translation comes from an AI model. Your computer does not talk to the AI service directly (versions before 0.2.9 have one rare exception, under Older versions). It sends the request to Subline's relay, a small server program on Cloudflare at relay.subline.page. The relay checks that your account has AI, then asks the AI service.

When ✦ is used

  • Automatically, on every message that the section above says is sent, while your account has AI.
  • When you press ⚡ on a single message. This works on any message, in any channel, DMs included. It sends only when you press it.
  • Without AI, ⚡ gives up to 5 AI translations a day. Press ⚡ on a single message, in any channel, DMs included. It is sent only when you press it.

What one ✦ request carries

  • Up to 25 messages. Subline waits up to 3 seconds to gather them. For each: the message text, the Discord message id, and the author's Discord username. The username is the account handle, not the display name.
  • Mentions are replaced by names before sending. A user mention becomes that person's server nickname, display name or username. Channel and role mentions become their names. Custom emoji are removed.
  • Reply information. If a message is a reply, the id of the message it replies to. If that message is not in the same request, its author's username and its first 200 characters also go.
  • Context lines. Up to 8 earlier messages from the same channel, as username and text, so the AI understands the conversation. ⚡ sends up to 6. Your computer cuts each line to 600 characters. For a ⚡ translation without AI of a message up to 4,000 characters, it does not, and the relay cuts each line to 1,000 characters before the AI service sees it. Context lines carry no ids.
  • Your reading language.
  • Who is asking. Your Subline code if this computer has one, your install id, the Subline version, the app it runs in (the Subline app's version, or the add-on and its version), a version number of the request format, and a marker that says this Subline translates only with AI. See The install id.

Context includes messages that are not translated. Subline keeps the last 64 messages of each open channel in memory. Context lines are picked from these. They can include your own messages, messages already in your language, shorthand, and messages from bots and from people you have blocked. Subline does not filter any of these out of the context.

Rare cases

  • A message over 4,000 characters is sent in parts. Each part carries the message id with a part number.
  • If putting names in for mentions makes a message longer than 4,000 characters, Subline may send Discord's raw text instead. Raw text shows mentions and custom emoji as Discord's own codes. Those codes include user, channel, role and emoji ids.

What is not in a ✦ request

  • No Discord user ids, except in the rare raw-text case above.
  • Not your Discord account id, and nothing from linking. Translation requests never carry your Discord account id.
  • No server id and no channel id.
  • No email address and no name from your purchase.

Which AI service receives it

  • The relay sends the request to OpenRouter, a service that passes requests on to AI hosts. The model is openai/gpt-oss-120b.
  • Subline asks OpenRouter to try Groq, then Cerebras, then DeepInfra, in that order.
  • Subline also allows OpenRouter to fall back to other hosts of the same model. So another host can serve a request. Subline excludes four hosts: Novita, DigitalOcean, SambaNova and Amazon Bedrock.
  • Since 19 October 2026, Subline asks OpenRouter for zero data retention and no data collection. OpenRouter then sends a request only to hosts that, under their terms with OpenRouter, do not keep prompts and do not train on them. Groq, Cerebras and DeepInfra are all on that list.
  • If OpenRouter fails, the relay sends the request to Groq directly.
  • A long request may be split into parallel pieces. Each piece carries all the context lines.
  • The relay's code can also use Google Gemini. That path is switched off today.

What the AI service receives

The relay turns your request into one text prompt. The prompt holds the context lines as "username: text", each message as "[id] username: text", a note for each reply, and the target language.

  • It does not hold your code, your install id, or your IP address. The AI service sees the relay's Cloudflare address, not yours.
  • OpenRouter receives two labels that say the request comes from Subline: the address https://subline.page/ and the name "Subline".
  • Subline sends no per-user identifier to the AI service.
  • The zero-retention rule above is OpenRouter's list. We have not checked each host ourselves. OpenRouter's own policy applies to OpenRouter. When the relay goes to Groq directly, Groq's own policy applies.

What the relay keeps from a ✦ request

  • Message text: not stored. The relay's code does not save or log message text, usernames or request bodies.
  • A daily number: how much ✦ you used today, to apply daily limits. The row holds your code and that number, and no text. During the 7 days or a server code's 30 days, it holds the keyed hash of your Discord account id instead of a code (before you link, the server code). For ⚡ without AI, it holds your Subline account id. That is not your Discord account id. The row is deleted within 3 days.
  • A per-minute count, held in memory only.
  • For ⚡ without AI only: a marker so the same message is not counted twice. It holds a 96-bit scrambled form (SHA-256, no secret) of the message id, target language and message text, under your account. A long message sent in parts gets one such marker per part. It also gets a few markers for the whole message, named with a scrambled form of its message id and target language (no text), that hold its part sizes and what was charged. All are deleted within 3 days.
  • Stats markers and an analytics row. See Stats.
  • The day your computer was last seen, on your account. See Your code and account.

Limits: every kind of AI has a daily ceiling, far above normal reading. When it is reached, translation pauses until 00:00 UTC, and Subline says so. There is also a per-minute limit. Each message counts 1. A request with long text or long context counts 1 more for each 1,000 characters above 1,000 per message. The relay refuses a request above 40 messages or 131,072 bytes. It keeps only the newest 12 context lines, cuts each to 1,000 characters, and keeps at most 6,000 characters of context in all. It does not translate a message over 4,000 characters.

The 7 days of AI

The relay decides when your Discord account has AI. A period of AI is tied to a Discord account, never to one computer.

  • 7 days. A linked Discord account that is at least 30 days old gets 7 days of AI, once ever. They start with the first ✦ translation the relay sends back to it, not at install or link. A younger account gets no 7 days, only ⚡ up to 5 times a day. The relay knows the account's age from the day it was made (see Linking your Discord account).
  • Server codes. A server code gives 30 days of AI. They start with the first ✦ translation after the code is on your account. If you redeem it during your 7 days, its 30 days start when the 7 days end. A server code redeemed before 0.2.9 keeps AI for good, with no end.
  • When a period starts, the relay keeps when it started. For the 7 days, under the keyed hash of your Discord account id. For a server code, under the code. No expiry. So reinstalling, linking again or a second computer never starts a new period. A second Discord account on the same computer has its own.
  • Starts from one network. To limit misuse, the relay counts how many different periods start from one network address each UTC day (IPv4 in full, or the first 64 bits of IPv6). It keeps a keyed hash of the address (see IP addresses), with the keyed hash of each Discord account (or a SHA-256 form of the server code) that started a period there that day. It is deleted at the end of that UTC day. After 10 starts, new periods from that address wait until the next day.
  • After a period, ⚡ gives up to 5 AI translations a day.
  • Plans bought before 0.2.9 (Automatic) include AI at no extra cost, with no end. Subscriptions are unchanged.
  • AI paid for before the price change keeps AI for good, with no end. This is true also when that subscription has ended.
  • If the relay cannot be reached, Subline keeps the last state it knew, up to 7 days. A network problem never ends a period.

Profiles, statuses, embeds and titles

While your account has AI, Subline also translates text around messages. The setting is Profiles, embeds and more in Subline → Settings. It is on by default.

  • Bios and custom statuses of other people, wherever Discord shows them: member list, profiles, the DM list and DM profiles. These have no channel or DM switch. They are translated even when DMs are off. Your own bio is never sent. Your own status is not sent from your profile, but it can be sent when it shows in a member list.
  • Embeds, polls and forwarded messages, in channels that are on.
  • Channel topics, voice channel descriptions and voice statuses, guidelines and events, in server channels that are on.
  • Server rules, and events that belong to no channel. These have no channel switch.
  • Stage topics, thread titles, forum post titles and forum tags, in server channels that are on.
  • Server onboarding questions and answers. These have no channel switch.
  • Reply quotes. Subline reuses an existing translation. It sends a new request only when the quoted message is not loaded and the channel is on. It never sends one for a blocked, ignored or suspended author.

These go to the relay and an AI service. A request for these carries the text and your reading language. It has no username, no Discord ids and no context. A text over 2,000 characters is not sent. Longer kinds, such as embed descriptions, are cut to 4,000 characters. ✦ use for these is limited to 500 units a day. Without AI, none of these is sent.

Names and pronouns

While your account has AI, Subline also translates people's names and pronouns. The setting is Names and pronouns in Subline → Settings. It is on by default. Without AI, no name is sent.

  • What. Display names, server nicknames, usernames and pronouns, where Discord shows them: message authors, mentions, profile cards and reply previews. Never in the member list, the DM list or voice channels. Never server, channel or role names.
  • When. A name is sent only when you rest the pointer on it, or when you open that person's profile card. Nothing is sent when the pointer only passes over a name.
  • Which names. Only a name written in a script your reading language does not use, such as 王小明 or Дмитрий for an English reader. A name in your own script is never sent by itself. Names in fancy fonts are read on your computer first. Emoji, symbols and digits do not count. A name in a script no reading language uses (runes, say) is never sent by itself: it goes to the relay only when you press ✦.
  • Which pronouns. People can write any text in the pronouns field, so it follows the profile text rule: pronouns with a letter are sent when you open the profile card, and nothing shows when they are already in your reading language.
  • Where. To the relay and an AI service, like profile text. A request carries the name or pronouns and your reading language. It has no username, no Discord ids and no context. It counts toward the same 500 units a day.
  • Names and pronouns have no channel or DM switch. The setting turns them all off.
  • Translations of names are kept in the profile and embed cache on your computer, with the original name. See What stays on your computer.

What stays on your computer

Inside Discord's storage

Subline runs inside Discord through Vencord. It saves data in Discord's own browser storage (IndexedDB) on your computer. Nothing here is uploaded.

WhatContentsHow long
TranslationsThe translated text, the message id and the language. The original text is not saved here.The newest 2,000. No time limit.
Profile and embed cacheThe original text of bios, statuses, embeds, topics, titles, names and pronouns, with their translations. This includes other people's bios, statuses and names.The newest 2,000, and at most 30 days.
⚡ translations without AIMessage id, the translation, the language, and a short checksum of the original.The newest 200.
Install idsThe install id each Discord account uses with Subline on this computer, found by a value made from that account's id, and which account linked the one from settings.json. These stay on your computer.No time limit.
Accounts that linked hereFor each Discord account that linked here: its Discord username and whether its plan was live when it was last signed in here. So Subline can tell another account which account on this computer has the plan. Never sent anywhere.No time limit.
Plan recordYour plan, whether this Discord account is linked, your AI state as the relay last said it (whether AI is on, when a period started and ends, how many ⚡ are left today, whether a payment is on its way), a pass from the relay (valid 7 days, holding your plan and the scrambled install id), when it was checked, and a checksum of your code and install id.Updated at each check.
Channel switchesFor each Discord account here: the ids of channels it turned on or off with the globe button, and when each one changed. For a linked account, also the salt from the relay, and up to 1,000 scrambled entries from the relay that wait until this computer can match them to a channel. See Settings and 🌐 choices on every computer.No time limit.
Settings for each accountFor each Discord account here: its own copy of five settings (your reading language, Earlier messages, All servers, Profiles, embeds and more, Names and pronouns), and when each one changed.No time limit.
Weekly noteA count of translations this week and up to 200 language codes. No text, no ids.Reset each week.
Daily countersHow many ⚡ translations without AI and ✦ profile translations you used today.Reset each day.
Small markersPatch check dates, rate-limit pauses, which notices you saw, which plan messages each Discord account here saw (the last-day notice and the ended panel, by period), whether the 0.2.9 update panel showed, and whether this computer used Subline before 0.2.0.No time limit.

Some data lives in memory only. It is gone when Discord closes. This includes the last 2,000 message texts, the last 64 messages per channel used for context, the last 10 error codes (for the feedback box), text you typed in the feedback box but did not send, and some short lookup tables.

Uninstalling Subline does not remove this storage. Subline has no button to clear it. It lives in Discord's own app data folder. Deleting that folder removes it, and also signs you out of Discord.

Vencord's settings file

  • Mac: ~/Library/Application Support/Vencord/settings/settings.json
  • Windows: %APPDATA%\Vencord\settings\settings.json

Subline's section of this file holds:

  • Your Subline code, in plain text. It is not encrypted. Anyone who can read your files can read it. Subline does not use the system keychain.
  • The codes of other Discord accounts on this computer, in plain text. When another Discord account signs in, Subline puts the code of the account that signed out aside (accountCodes), with that account's removed and rejected codes, under its short local key. So each account keeps its own code. They stay until you uninstall with "Also remove my settings and code".
  • Which Discord account the saved code belongs to (codeAccount), as that account's short local key.
  • Your install id (installId). Until a Discord account links it, every Discord account on this computer uses it.
  • Which Discord account linked that install id (installBinding), and which accounts sent a link whose answer has not arrived yet (installPendingBind). Each account is a short local key, so the link stays with that account if Discord's own data is cleared. The key is made from the account on this computer. It is not the Discord id itself, and it is never sent anywhere.
  • A code you removed by hand, so it is not saved again.
  • A code the relay rejected, and when.
  • Your reading language and your settings.
  • Hidden fields from older versions, such as personal AI keys if you once entered any.

In the browser add-on, the same fields are kept in your browser's storage for discord.com (localStorage, as VencordSettings), not in a file.

Subline's own folder

  • Mac: ~/Library/Application Support/Subline/
  • Windows: %LOCALAPPDATA%\Subline\
FileContents
mod/The Subline code that runs inside Discord.
status.jsonA health note written by Subline inside Discord: version, build, when Discord started, when Subline last loaded, translated and drew a line, which translator it last used, two counts, and the last error type and time. It also keeps one record of the launch before: when it started, loaded and was last seen, and its last error type and time. No message text, ids or codes. Written at most once every 5 seconds. Never uploaded. Not written on Linux.
app-version.jsonThe Subline app version and when it was written.
pending-setup.jsonOnly from an older Subline app (0.2.3 to 0.2.5): the reading language you chose during setup, and when. The current app does not write it or read it.
patched-installs.jsonWhere each Discord copy on your computer is installed, and its release branch.
helper-state.jsonThe background helper's notes: last run, last update check, release versions, failure counts, health, alerts, whether Discord still needs a restart to load Subline, and the last launch that did not load Subline.
alerts.json, discord-quit.jsonLocal alerts, and a note written when Discord quits.
logs/ (Windows only)The log files. See below.

In Discord's own program folder, Subline replaces app.asar with a small loader. It keeps Discord's original as _app.asar, and writes a marker file subline-patch.json.

Like other apps built on Electron, the Subline app may also keep standard browser-engine files. We have not yet confirmed where.

The log file

  • Mac: ~/Library/Logs/Subline/subline.log
  • Windows: %LOCALAPPDATA%\Subline\logs\subline.log
  • The Subline app, its background helper and its uninstaller all write here.
  • It holds versions of Subline, Discord and your system, what the app decided and why, and error causes. The helper also copies the launch times from status.json. It can hold full folder paths, which include your computer user name.
  • It never holds message text, your code or your install id. Fields named like text, message, key or token are blanked before writing.
  • Each file is rotated before 512 KiB. 3 older files are kept, so at most 4 files (about 2 MiB) exist.
  • Copy diagnostics in the Subline app puts the current log and the newest older log on your clipboard. It replaces your home folder path with ~. Nothing is uploaded. You choose whether to send it to us.

The background helper

  • Mac: a login item at ~/Library/LaunchAgents/com.subline.helper.plist. It runs at login, every 5 minutes, and when Discord's files change.
  • Windows: a scheduled task named \Subline\Helper. It runs at sign-in and every 5 minutes, as you, with the lowest rights.
  • It repairs Subline after a Discord update, puts back missing Subline files, and installs Subline updates. If it does this while Discord is open, a notification asks you to quit and reopen Discord. It never closes Discord itself. Its notifications are local. Its only network use is the update check under Background checks. Subline inside Discord can also start it (see Update checks (Subline inside Discord)).

What uninstall keeps and removes

The Subline app's uninstall screen has a box: "Also remove my settings and code". It is not ticked by default.

ItemBox not tickedBox ticked
Discord restored, helper removedYesYes
Subline's mod filesRemoved, unless another Discord copy still loads themRemoved, unless another Discord copy still loads them
Your code, language and settingsKeptRemoved
Install idKeptKept, on purpose (see The install id)
A code you removed by handKeptKept
Subline's folderKeptRemoved (Windows keeps logs/)
Log filesKeptKept
Data inside Discord's storageKeptKept

If a Discord copy on your computer still loads Subline after the uninstall (for example, a restore failed), the box has no effect. Your code, settings and Subline's folder then stay.

On Windows, uninstalling from Settings > Apps always behaves as if the box is not ticked. Your code, settings, install id and Subline's folder stay. It also deletes the scheduled task. On Mac, you move the app to the Trash yourself.

The install id

  • What it is. A random code of 32 letters and digits (16 random bytes). It names this Subline install. It contains nothing about you or your computer.
  • When it is made. The Subline app makes it when it installs Subline. If none exists, Subline makes one inside Discord. An existing one is never replaced.
  • One per Discord account. Until a Discord account links the install id in settings.json, every Discord account on this computer uses it. The account that links it keeps it. Every other Discord account on this computer then gets its own install id, made inside Discord. When you switch Discord accounts, Subline switches install ids with you.
  • Where it is kept. In Vencord's settings.json as installId, and in Discord's storage. Subline does not show it on screen.
  • Who receives it. The relay, with nearly every request from Subline inside Discord: translation, status checks, linking, settings sync, checkout, server codes, patch reports, link and price steps, and feedback. The Subline app never sends it. No AI service receives it. The log file never holds it.
  • With it. Every request from Subline to the relay also names the Subline version and the app it runs in: the Subline app's version, or the add-on and its version. The app version comes from app-version.json in Subline's folder.
  • Why. The relay joins each install id to your linked account, so your plan works on every computer and browser where you link the same Discord account. It also lets a purchase made from Subline switch on by itself.
  • Kept after uninstall. Uninstall keeps it even when you tick "Also remove my settings and code". This is on purpose. A reinstall then joins your account again by itself.

The scrambled form

The relay usually stores a scrambled form instead of the id itself. It is the first 16 characters of a SHA-256 hash of the id (with a fixed prefix). No secret is added to the hash.

  • The id is random and long. So nobody can work back from the scrambled form to the id by guessing.
  • But the scrambled form is the same everywhere. It works as a stable pseudonym for your install. The same value appears in your account, purchase links, checkout records, server code claims from older versions, patch reports and the pass the relay gives Subline. For older versions it also appears in stats markers.
  • When you buy from inside Subline, this scrambled form also goes to Dodo Payments with the checkout. See Payments.
  • A few relay rows hold the id itself, not the scrambled form. These rows exist for older versions only. See Older versions.

Linking your Discord account

Every plan belongs to one Discord account. You link that account once on each computer, and once in each browser. Then your plan works there too.

How it works

  • Subline opens Discord's own Authorize window, inside Discord. It asks only for identify. Subline has no Discord bot.
  • With identify, Discord can tell Subline your account id, username, display name, avatar, banner and a few account details, such as your Discord language. It does not give your email. Subline cannot read your messages, servers or friends through it, and cannot post anything.
  • Before you link by hand, Subline shows the Discord account the plan will belong to, and asks you to confirm. The name and picture Subline shows before a link come from Discord on your computer. They are never sent.
  • When you press Authorize, Discord gives Subline a one-time code. Subline sends it to the relay, with your install id, like other relay requests. It also sends the id of the Discord account that is signed in, so the relay can check that Discord authorized that same account. If not, nothing is linked. The relay only compares the two ids. It never stores or logs the one Subline sent.
  • The relay gives the code to Discord and gets a short-lived access token. It asks Discord who you are and takes only your account id. It never keeps the token. Subline then stays in your Discord settings under Authorized Apps, so your other computers link by themselves. You can remove it there at any time.
  • Linking by itself. When a Discord account on this computer has not linked yet, Subline asks Discord once per Discord session whether that account already authorized Subline (for example, on another computer). This request goes through Discord's own connection, signed in as you, and asks only for identify. Only if Discord answers yes, Subline sends the approval with no window, as Discord's own window does. Discord then gives a one-time code, and linking goes on as above. If Discord does not answer yes, nothing is approved and the Link bar shows. Subline does not try this when this computer has a code or a plan that is not linked yet. Then you link by hand.
  • The relay never stores or logs your Discord account id, the one-time code, the tokens, your username or your email. Its log lines about linking hold no account data. At most they hold Discord's answer status.
  • If you press Cancel, nothing is sent and nothing is stored.
  • The "Linked to" name in Subline → Settings comes from Discord on your computer. It is not sent anywhere.
  • Translation requests never carry your Discord account id.

What the relay keeps

  • A keyed hash of your Discord account id, on your account and as a lookup row that leads to your account. It is made like the keyed hashes under IP addresses, with the relay's secret key and its own label. Without the key, nobody can work back from it to your Discord account id.
  • The day your Discord account was made. The relay works it out from the account id. It is used to check that a Discord account is at least 30 days old before it can claim a server code or get the 7 days of AI.
  • Both have no expiry, like the account. They are kept per linked account, never per computer.
  • If the key is missing on the relay, linking is switched off and the relay stores nothing from it.

Many computers

  • A linked account has no computer limit. A computer not seen for 90 days drops off the account's list. It joins again by itself the next time it checks in.
  • When one linked account is used on 15 or more computers in 30 days, the relay writes a flag for the owner to look at. It holds the random account id, the number of computers and the day. Nothing is blocked. The flag has no expiry.
  • Two Discord accounts on one computer link one by one. One account's plan never applies to the other. An account without a plan is told which account on this computer has it. That name comes from this computer only.

A Discord update can move the Authorize window. Then Subline opens Discord's Authorize page in your web browser instead.

  • After you press Authorize, Discord sends your browser to the relay with the one-time code. The relay keeps the code, the scrambled install id of the computer that asked, and a keyed hash of its network address (IPv4 in full, or the first 64 bits of IPv6). It uses them to give the code only to that computer.
  • If your browser is on another network, the page shows a 6-digit code. You type it in Discord.
  • All of it is deleted at most 5 minutes after the last check. The code is used once.
  • Subline on your computer asks the relay every 2 seconds, for up to 5 minutes, whether the code has arrived. Each check carries your install id, like other relay requests.

Move my plan

  • Only the Discord account that holds the plan can move it, from Subline → Settings, under Plan. The new account must Authorize too. A plan moves at most once every 30 days.
  • To start, the relay gives a one-time ticket. It keeps the ticket for 10 minutes, with your random account id and the keyed hash of your Discord account id.
  • When the new account authorizes, the relay moves the codes and the plan to that account. If that account has its own plan, the two are joined. Linking the new account works as above.
  • On both accounts, the relay keeps when a plan last moved. On the old account, it keeps a list of the codes that moved away (the newest 50), so its computers stop using them quietly. For 30 days it keeps a marker under the keyed hash of each of the two Discord accounts, so the plan cannot move again sooner.
  • The owner page lists each move: the two random account ids and the day. The relay keeps the newest 200.

Lost Discord account

Write to support. The owner can unlink your old Discord account from your plan. The keyed hash of its id is then deleted from your account. Your codes and grants stay. Then link your new Discord account and enter your code from your receipt email.

Settings and 🌐 choices on every computer

For a linked Discord account, the relay keeps a copy of some of your choices. So every computer and browser where that account is linked shows the same ones. Without a link, these choices stay on your computer only.

What is sent

  • Five settings from Subline → Settings: your reading language, Earlier messages, All servers, Profiles, embeds and more, and Names and pronouns. Each goes with the time it last changed. No other setting is sent. Your code, your install id and the debug log setting are not sent this way.
  • 🌐 choices. For each channel you turned on or off with the globe button: on, off or back to normal, and when it changed. The channel id is never sent. Subline sends a scrambled form instead: the first 16 hex characters of a SHA-256 hash of a salt and the channel id. The salt is random. The relay makes one for each linked account.
  • Both go to relay.subline.page (/v1/prefs and /v1/channels), with your install id, like other relay requests. They carry no message text, no Discord ids and no server ids.
  • The browser add-on sends them the same way.

When

  • When a status check says this computer is linked: when Discord starts, after you link, and after you switch Discord accounts.
  • When Discord's window comes back into focus, at most once every 10 minutes.
  • Soon after you change something: 3 seconds after a setting changes, 2 seconds after a globe click.
  • After a failure: again after 30 seconds, 2 minutes and 10 minutes. Then at the next focus, change or status check.

What the relay keeps

  • The five settings and their times, under your random account id. No expiry.
  • The salt and up to 1,000 🌐 entries, under your random account id. Each entry holds the scrambled channel form, on, off or back to normal, and the time. Past 1,000, the oldest "back to normal" entries go first, then the oldest of the rest. No expiry.
  • The relay holds the salt with the list. So with a channel id in hand, someone with the relay's data could check whether that channel is on your list. Without a channel id to test, the list does not show which channels it holds.
  • To limit writes, the relay counts how often each computer sends changes: at most 60 times an hour for settings, and 60 times an hour for 🌐 choices. Each count is under the scrambled install id, and is deleted when the hour ends.
  • The relay's code does not use your IP address for these requests.

Your code and account

Codes

  • A code you buy is the license key that Dodo Payments issues. Other codes usually start with slp_: codes from a server code, for early users, or made by the owner.
  • The relay keeps a record for each code: its status, plan, daily limit, a short note, when it was made, when it expires, and Dodo's payment or subscription id.
  • Code records have no expiry. After a refund, a lost dispute or the end of a subscription, the code is marked revoked. The record stays.
  • Checking a code before you confirm it does not link it to your computer and writes nothing.
  • A code entered on a linked account joins that account. A code that belongs to another linked Discord account is refused. Write to support in that case.

Account and computers

  • When you link, or when a code is first used, the relay makes an account. The account has a random id. It links your codes and your computers.
  • The account holds your codes, the scrambled ids of your computers, the day each computer was last seen, the Subline version and the app version each computer last reported, which computers bought AI, notes such as a server code you redeemed or an early-user grant, and, once linked, the keyed hash of your Discord account id and the day that account was made.
  • A computer that had its plan before 0.2.8 keeps it until a Discord account on it links. The account notes the scrambled ids of those computers.
  • A linked account has no computer limit. See Linking your Discord account.
  • Older versions (0.2.7 and earlier) do not link. For them, a code works on up to 3 computers, and a computer not seen for 30 days can be replaced by a new one.
  • The last-seen day is written at most once a day per computer.
  • Early users: a computer that used Subline before a fixed early-user date receives Automatic at no charge. The relay keeps a marker for that computer, with no expiry, so this happens only once. In 0.2.9 this grant gives the same 7 days of AI as a new account.
  • The account and its links have no expiry.

On your computer

Your code is shown in Subline → Settings, under Your code. You can select it and copy it. It is saved in plain text in Vencord's settings.json.

Payments

Dodo Payments sells Subline as the merchant of record. You start a purchase inside Discord. You pay on Dodo's checkout page. You enter your card details there, not in Subline. This website sells nothing.

What Dodo collects

Dodo collects your name, email, billing details and payment details on its own page. Dodo emails you your code. Dodo decides what it keeps, and for how long. Dodo's privacy policy applies.

What Subline sends to Dodo

  • From inside Discord: the relay asks Dodo for a checkout. It sends the product, a quantity of 1, a return address (https://subline.page/?from=discord), and the scrambled install id. Nothing else: no name, email, code, Discord account id or IP address.
  • Before it makes a new checkout, and after a refund, the relay may ask Dodo how your recent checkouts stand. That request carries only the checkout id.
  • If the relay cannot be reached, Subline opens Dodo's checkout link directly. That link also carries the scrambled install id.
  • Subline only opens checkout links on dodopayments.com.
  • The Subline app (the installer) starts no purchase.

What Dodo sends back

  • Payment notices to the relay. When you pay, get a refund or open a dispute, Dodo sends the relay a notice. Going by Dodo's published API, these notices can include your name, email, phone number and billing address. Payment notices can also include card details: the cardholder name, the card's country and its last four digits. The relay receives them. It reads only the event type, product, payment and subscription ids, status, renewal date, whether a refund is partial, license key, scrambled install id and checkout id. It does not store or log your name, email, phone, address or card details.
  • The return address. After payment, Dodo sends your browser back to subline.page. Dodo adds your license key and your email to the address. See This website.

What the relay stores about a purchase

  • No expiry: your license key as your code, and Dodo's payment id or subscription id, linked to it.
  • 30 days: a link from your scrambled install id to your code, so Subline can switch on by itself.
  • 3 days: notes that a purchase is in progress, links from Dodo's payment or subscription id to your scrambled install id and to the checkout, the purchase result (paid, pending or failed), and changes from payment notices waiting to be matched to a code.
  • About 2 days: the checkout session, linked to your scrambled install id. Recent checkouts per computer, with their Dodo link, product, where they started and when.
  • 2 hours: how many checkouts your computer and your IP address started this hour. The limits are 6 per computer and 20 per IP address. The IP counter's name holds a keyed hash of your address, not the address (see IP addresses).

Waiting for payment

While a checkout is open, Subline asks the relay every 5 seconds for 30 minutes. Then it asks every 5 minutes, for up to 48 hours. Each check sends your install id, as every status check does.

Server codes

A server code is a short code (4 to 16 letters and digits) that a Discord server shares. In 0.2.9 it gives 30 days of AI (see The 7 days of AI). In older versions it gives Automatic. A server code redeemed before 0.2.9 keeps AI for good.

  • You need a linked Discord account that is at least 30 days old.
  • Redeeming sends the code and your install id to the relay.
  • The relay makes a new slp_ code for you, notes the server code on it, and links it to your account. These have no expiry.
  • Each server code keeps a list of the scrambled install ids that claimed it. No expiry.
  • Each Discord account can claim one server code, ever. The relay keeps a marker for that, under the keyed hash of your Discord account id. No expiry. Older versions kept this marker per install instead.
  • If you use IPv6, the relay counts claims of that server code from your network (the first 48 bits of your IPv6 address). This limits how many claims one network can make. It stores a keyed hash of the network, not the network itself (see IP addresses). A network's count is deleted 30 days after its last claim of that server code. Nothing is stored for IPv4.
  • Tries from your IP address are counted per day: at most 30 successes and 20 failures. The counter's name holds a keyed hash of your IP address (IPv4 in full, or the first 64 bits of IPv6), not the address. It holds only counts. It is deleted 2 days later.
  • When a server code hits a network limit, the relay logs the server code and a short tag made from the keyed hash.
  • When a server code is claimed quickly (half or nine tenths of its claims within an hour), the relay logs the server code and claim counts.
  • The relay counts, per server code, how many accounts that redeemed it later bought AI. This is a number only, with no expiry.

IP addresses

Every service you connect to sees your IP address. That includes the relay, GitHub, Dodo and the Vencord badge server. Subline does not hide it. AI services do not see your IP address. They see the relay's.

Here is every place where the relay's code uses your IP address:

UseFormHow long
✦ translationOnly for a period that has not started: a keyed hash of IPv4 in full or the first 64 bits of IPv6, for the start limit (see Starts of AI periods). Otherwise not used by the relay's code.Until the end of that UTC day, only for a period start. Otherwise not kept.
Starts of AI periodsKeyed hash of IPv4 in full or the first 64 bits of IPv6, in the name of a daily record of the periods that started there (see The 7 days of AI).Until the end of that UTC day
Status checksFor the daily install counts (see Stats): a keyed hash of IPv4 in full or the first 64 bits of IPv6, in the name of a daily counter. Counts only. At most 50 installs and 5 new installs are counted per address a day. Before a period has started, a check also reads the start limit for the address (see Starts of AI periods). It stores nothing for that.2 days
Website pingsA keyed hash of IPv4 in full or the first 64 bits of IPv6, in the name of a daily counter. Counts only. At most 30 page opens and 10 download presses are counted per address a day.2 days
Link and price stepsA keyed hash of IPv4 in full or the first 64 bits of IPv6, in the name of a daily counter. Counts only. At most 100 steps are counted per address a day.2 days
Checkout limitKeyed hash of IPv4 in full or the first 64 bits of IPv6, in a counter's name.2 hours
Server code triesKeyed hash of IPv4 in full or the first 64 bits of IPv6, in a counter's name. Counts only.2 days
Server code claims (IPv6 only)Keyed hash of the first 48 bits of IPv6, with a count.30 days after that network's last claim of that server code
Linking limitKeyed hash of IPv4 in full or the first 64 bits of IPv6, in the name of a per-hour counter. The counter holds only a number, and is deleted when the hour ends. Limit 30 an hour. Your install has its own limits: 10 links an hour, and 400 checks an hour while it waits for your browser. These are counted under its scrambled install id.About an hour
Linking in a web browserKeyed hash of IPv4 in full or the first 64 bits of IPv6, kept with the one-time code (see If Discord's Authorize window is missing). Also in the name of a per-hour counter of browser returns, limit 30 an hour, deleted when the hour ends.At most 5 minutes; the counter about an hour
Purchase checks from this websiteKeyed hash, in the name of a per-minute counter held in memory. Limit 120 a minute.About a minute
Patch reportsKeyed hash of IPv4 in full or the first 64 bits of IPv6.8 days
Feedback limitsKeyed hash of IPv4 in full or the first 64 bits of IPv6, mixed with the day, in a counter's name. Counts only. Not stored with your feedback.Deleted at the first daily cleanup after that UTC day
Older versions (0.1.x)Keyed hash of IPv4 in full or the first 64 bits of IPv6, in daily counter names.2 days
Cloudflare's own recordsMay include your IP address. See Server logs.Set by Cloudflare

Keyed hashes

  • A keyed hash is HMAC-SHA-256 with a secret key that only the relay holds. The relay keeps the first 32 hex characters.
  • Without the key, nobody can work back from the hash to your address, even by trying every possible address.
  • Each use mixes in its own label, so the same address gives a different hash in each place.
  • If the key is missing on the relay, it stores nothing made from your address. It then refuses patch reports and linking. Website pings, install check-ins and link and price steps are then not counted at all. Server code claims run without the network limit and without the per-address limit on tries. Feedback runs without its per-install and per-address limits. AI periods start without the per-address limit. Checkouts, purchase checks and older versions run without their per-address limits. The other limits still apply.
  • Server code network counts stored before 0.2.4 held the plain first 48 bits. The relay converts each one to the keyed form the next time that server code's record is loaded. Without the key, it deletes them.

Background checks

Some requests happen without you doing anything. None of them carries message text.

Status checks (Subline inside Discord)

Subline asks the relay what your plan is. It sends your code (or, without one, your install id), your install id, the Subline version, and the app it runs in. If this computer used Subline before 0.2.0, it adds a flag that says so. It runs:

  • every time Discord starts, even if you never bought anything;
  • again 24 hours after the last check (Subline looks at the clock every 60 seconds);
  • after your computer wakes from sleep (a gap over 5 minutes);
  • 60 seconds before the saved answer expires;
  • when Discord's window comes back online or into focus, at most once every 10 minutes;
  • when your code changes;
  • while AI is off, when ⚡ first shows on a new UTC day;
  • after AI ends, at 2 minutes, 10 minutes, 30 minutes and 2 hours;
  • after the relay refuses a ✦ request for your plan, and after you redeem a server code or try to buy something you already own;
  • after a failure, at 5, 15 and 60 seconds, then every 5 minutes until answered.

Each check shows the relay that your install is in use, when, and with which version. Cloudflare sees your IP address. If this computer or your code is on an account, the check updates this computer's last-seen day there. A status check never carries your Discord account id.

The relay also counts how many installs check in each day, and how many of them are new. See Stats.

Patch reports

Discord updates can break the parts of Discord that Subline hooks into. Subline checks for this once per Discord session: 30 seconds after messages first load, or after 10 minutes if they never load.

  • A report is sent only if something broke. A clean check sends nothing.
  • At most one report is accepted per Discord release channel, Discord build and UTC day. If the relay refuses a report's format, Subline sends it once more with only the items an older relay knows. If the relay cannot take it, Subline tries again the next time Discord starts.
  • It contains: the Subline version and build, Discord's release channel (stable, ptb, canary or other) and build number, and up to 20 broken items. Each item is the name of a Subline part, the search text Subline uses to find its place in Discord, and the kind of failure. It is at most 8,192 bytes. It contains nothing about you.
  • It goes with your install id. It runs on every plan, also before you activate.
  • The relay keeps, for 8 days: the scrambled install id, a keyed hash of your IP address (see IP addresses), Discord's channel and build, and the broken items. It does not keep the Subline version or build.
  • When 3 or more installs from 3 or more IP addresses report the same break on one UTC day, the relay emails the owner. The email holds the count of installs, the day, the broken item, and the Discord builds affected. It holds no install id, hash, IP address or anything about you. The number of these emails is capped per day.

Update checks (background helper)

  • The helper downloads a small release file from GitHub: https://github.com/subline-page/subline/releases/latest/download/subline-release.json.
  • It checks at most every 5 minutes, or sooner when Subline is broken or missing, or when Subline inside Discord asks (see below).
  • If there is a newer version, it downloads it from GitHub. It accepts only GitHub addresses. It checks the file's size and SHA-256 before use.
  • These requests carry no install id, no code and no custom headers. GitHub sees your IP address.
  • The helper never contacts the relay.

Update checks (Subline inside Discord)

  • While the Discord app is open, Subline downloads the same release file from GitHub: one minute after it starts, then every 5 minutes.
  • This request carries no install id, no code and no custom headers. GitHub sees your IP address.
  • If the file names a newer Subline that is not on your computer yet, Subline clears the helper's last check time in helper-state.json and starts the helper now. On Mac it uses launchctl, on Windows the Task Scheduler. The helper then downloads and installs the update as above.
  • Subline inside Discord downloads nothing else from GitHub.
  • The browser add-on does not do this.

Link and price steps

So the owner can see where people stop, Subline in the Discord app tells the relay when you reach some steps (/v1/event):

  • The Link bar showed. Discord's Authorize window opened. The link finished. The window closed without a link. The prices showed to a linked Discord account with no plan and no code.
  • The request holds only the step's name, from that fixed list of five. Like every relay request, it carries your code (if you have one), your install id, the Subline version and the app it runs in.
  • Each step goes at most once per Discord session. A step that fails is not sent again.
  • The browser add-on does not send these.
  • The relay counts each step once per install. For this, it keeps a marker for each step, named with a keyed hash of your install id (see IP addresses), for 400 days. The counts are numbers only, kept 400 days.
  • To limit fake counts, the relay counts at most 100 steps per IP address a day. The counter's name holds a keyed hash of your address, not the address. It is deleted after 2 days.
  • The owner's own installs are not counted. If the relay's secret key is missing, nothing is counted.

The Subline app

The Subline app (the installer) never contacts the relay. It only installs. It writes your reading language, a new install id and the relay as the translator into Vencord's settings.json. Linking and your plan happen inside Discord. The app does not update itself. It has no crash reporter and no analytics.

The browser add-on

Subline can also come as an add-on for Discord in your browser: Chrome, Edge, Brave and Opera through the Chrome Web Store, and Firefox through Firefox Add-ons. The Chrome add-on is out since 19 October 2026. The Firefox add-on is not out yet.

  • It runs the same Subline inside Discord in your browser. It sends the same kinds of requests as Subline in the Discord app, as this page describes: translations, status checks, linking, settings sync, checkout, server codes, patch reports and feedback, all to the relay. It does not send link and price steps or check for updates.
  • The add-on's own background part sends these requests, only to relay.subline.page. Version 0.2.9 of the add-on has no access to Google's translate service.
  • The add-on also has access to discord.com pages. It uses it for one thing: it removes Discord's Content-Security-Policy headers from those pages, so Subline can run inside Discord. Vencord's own browser add-on does the same. It reads nothing and sends nothing through this access.
  • You link your Discord account in the browser once, the same way. Your plan then works there.
  • It keeps its data in your browser, like the app keeps it in Discord's storage.
  • It has no background helper, no status file and no update check of its own. Your browser's add-on store updates it.
  • Removing the add-on stops everything it sends.

Vencord badge list

Subline runs on Vencord, an open-source Discord mod. Subline removes most of Vencord, but keeps its required badge feature.

  • When Discord starts, and then every 30 minutes, Discord downloads https://badges.vencord.dev/badges.json. This list names Vencord's own badges.
  • When you open a profile that has such a badge, Discord loads its picture from the address in that list.
  • These requests carry nothing from Subline. Vencord's server sees your IP address.
  • Subline has no setting to turn this off.

Feedback box

The feedback box is at the bottom of Subline → Settings. A message that shows a Subline translation also has Report translation on its right-click menu. That opens the same box, with that message attached.

What you can send

  • Your message, up to 2,000 characters. You need a message or a report.
  • Your email, if you want a reply. It is optional. Leave it empty to stay anonymous.
  • A bad-translation report, only from Report translation. It holds that one message's original text, the translation you saw, which kind of line it was (✦ in 0.2.9), and the two languages. It never holds other messages. The original is usually someone else's message. Mentions, channels, roles and custom emoji in it are replaced by words such as "@user" and "#channel", so it holds no Discord ids.
  • Recent error codes. Up to 10 from this Discord session. Each is a code from a fixed list, with its time to the minute and, if there was one, an HTTP status number. No error text and no message text.
  • App details. The Subline version and build, your system (Mac, Windows, Linux or other) and your plan.

The report, the error codes and the app details each have a tick box. They are ticked by default. Untick one, and it is not sent.

Nothing is sent by itself

  • Opening the box sends nothing. Review shows every field exactly as it will be sent. Only Send sends it.
  • It goes to the relay at relay.subline.page. Like every relay request, it carries your install id. Cloudflare sees your IP address.

What the relay keeps

  • The fields you sent, an id, the time to the minute, whether the email copy went out, and whether and when the owner marked it handled.
  • No IP address, no install id, and no scrambled form of either.
  • Each item is kept for 180 days. A daily cleanup then deletes it.
  • To apply the limits below, the relay keeps daily counters. Each counter's name is a keyed hash of your install id or of your IP address, mixed with the day (see IP addresses). They hold counts only. The first daily cleanup after that UTC day deletes them.

Limits: 5 items a day per install, 10 a day per IP address (IPv4, or the first 64 bits of IPv6), and 200 a day from everyone together. A request may be up to 49,152 bytes. Each text in a report may be up to 4,000 characters. At most 50 email copies go out a day. After that, items are stored without a copy.

The email copy

  • For each item, the relay sends one email to the owner's personal mailbox, hosted by Gmail. It goes through Cloudflare's email service (Email Routing), from alerts@subline.page.
  • The copy holds everything you sent, the item id and the time to the minute.
  • If you gave an email, it is the copy's reply-to address. So a reply from the owner goes to you. Replies currently come from the owner's personal Gmail address.
  • Copies stay in that mailbox. We have not set a deletion schedule for them.

Who can read it

  • The owner. Stored items are read through the relay with an admin key held by the owner. Email copies are read in the owner's mailbox.
  • Cloudflare stores the items. Google stores the email copies.

Stats

  • Daily totals. The relay counts per day: active paid codes, ⚡ translations without AI served, purchases per plan, 7-day starts, server code period starts, and AI purchases by Discord accounts that had a period. For older versions it also counts active installs and new first-use records. These are numbers only. They are kept 400 days.
  • Install counts. The relay counts how many installs check in each day (see status checks). It also counts how many of them are new: an install it has never seen before. For this, it keeps only scrambled markers, never your install id. Each marker is named with a keyed hash of your install id (see IP addresses). The day's marker is kept 2 days. The "seen before" marker is kept 400 days. The counts are numbers only, kept 400 days.
  • Checkout counts. The relay counts per day how many checkouts start, for Automatic and for AI. It counts new purchases the same way. These are numbers only, kept 400 days. A purchase with a 100%-off coupon is not counted as a purchase. To leave it out, the relay keeps Dodo's payment id of a payment of 0 for 3 days.
  • AI use per day. For each kind of AI (subscriptions and bought plans, periods, ⚡ without AI), the relay keeps a summary of each day: how many people used AI, how many messages, the middle and high amounts, the most, and how many reached the daily ceiling. Numbers only, with no codes or ids. Kept 60 days. It also counts the AI use of all of Subline per month, as one number.
  • Website counts. See This website.
  • Link and price steps. See Link and price steps.
  • "Seen today" markers. To count each paid AI code once a day, the relay writes a marker named with a 16-character SHA-256 fingerprint (no secret) of your code. For older versions, the fingerprint is of your install id instead. It is written on ✦ requests. It is kept 2 days.
  • An analytics row per ✦ request, in Cloudflare Workers Analytics Engine. It holds the result (for example "ok" or "daily limit reached"), an 8-character fingerprint (SHA-256, no secret) of your code, your install id, for a period the keyed hash of your Discord account id with a fixed prefix, or, for ⚡ without AI, your account id with a fixed prefix, the plan name, the number of messages, and sometimes the AI service's error code. It holds no text, no IP address and no country. Cloudflare decides how long it keeps these rows.

Server logs

  • Cloudflare's Workers Logs keep only the relay's own log lines. Request logs (each request's address, headers and network details) are switched off.
  • The relay's own log lines are warnings and errors with fixed text. They contain no message text, no usernames and no request bodies. Error text is cut to 200 characters. On the translation, spending and plan-check paths, codes, install ids and IP addresses are blanked from error text. Other error text is not blanked.
  • Some log lines do hold: a server code with a short network tag or claim counts, Dodo checkout and payment ids, a Dodo product id, up to 200 characters of an error from Dodo, broken item names from patch reports, a feedback item's id when its email copy fails, and the AI service's name and error status.
  • Cloudflare's network still carries each request. It can keep its own security and traffic records, which can include your IP address. Cloudflare decides what it keeps, and for how long.
  • Subline's setup adds no other log store.

This website

  • This website sells nothing. All buying happens inside Discord.
  • subline.page is hosted on GitHub Pages. GitHub receives each visit, with your IP address.
  • No cookies. No local storage. No third-party analytics, scripts, fonts or images.
  • Pings to Subline's server. The home page sends one ping to the relay when it opens. It sends one more when you press a download button. The privacy page sends none.
  • A ping holds the source: the page's ?ref= value, or the name of the site you came from (for example reddit.com, never the full address). A download ping also holds the computer type of the button: Mac or Windows.
  • A ping sets no cookie and holds no id. The relay keeps no IP address, no browser details and no id from it.
  • The relay keeps only daily counts: page opens, and download presses for Mac and for Windows, each also per source. It keeps up to 50 source names a day. Other sources count as "other". The counts are kept 400 days.
  • To limit fake counts, the relay counts at most 30 page opens and 10 download presses per IP address a day. The counter's name holds a keyed hash of your address, not the address (see IP addresses). It is deleted after 2 days.
  • The download section asks GitHub for the latest release. Your browser calls https://api.github.com/repos/subline-page/subline/releases/latest. The answer is kept in your browser tab (session storage) for 10 minutes. Downloads come from GitHub.
  • The page guesses your system (Mac or Windows, and the Mac chip type) inside your browser. The guess is never sent. A download ping says only which button you pressed: Mac or Windows.
  • The Chrome link goes to the Chrome Web Store. When you open it, the store sees your visit.

Returning from checkout

  • After a payment started in Discord, Dodo sends you back to subline.page. The address includes your license key, your email, the payment or subscription id, and a status.
  • Your browser sends this full address to GitHub's servers when the page loads. We do not know if GitHub logs it. Browser extensions you use may also see it.
  • The page then removes these values from the address bar and the browser history.
  • The page shows your code so you can copy it. It never reads your email. It never sends your code anywhere.
  • If the payment is still pending, the page asks the relay for the result. It sends only the payment or subscription id, every 4 seconds for up to 3 minutes. It stops after 3 failures in a row. The relay answers with the state only. It keeps that state for 3 days.

Support email

  • Mail to support@subline.page passes through Cloudflare Email Routing.
  • It is forwarded to the owner's personal mailbox, hosted by Gmail.
  • Replies currently come from that personal Gmail address.
  • Support mail is kept in that mailbox. We have not set a deletion schedule for it.

Debug log

  • Debug log in Subline → Settings is off by default.
  • When on, Subline writes details to Discord's developer console: the text of messages it skipped, translations as they are saved, and message ids for each request.
  • This stays on your computer. Subline does not upload it.
  • When it is off, the console gets only a few lines with no message text. A few of them name a message id or channel id.

Older versions

Versions 0.2.8 and earlier: Google Translate

Versions 0.2.8 and earlier also show a ≈ line from Google Translate. If you still run one:

  • Your computer sends the message text straight to Google Translate (https://translate-pa.googleapis.com/v1/translate), with the language to translate from and your reading language. Profile and embed text, names and pronouns go there too.
  • Google does not receive the author's name, message ids, server or channel ids, or earlier messages. Google sees your IP address.
  • With ✦ active, each message goes to both Google and the relay. A ✦ preview (5 a day for Automatic owners) is sent only when you press ⚡.
  • Subline does not control what Google keeps. Google's own privacy policy applies: policies.google.com/privacy.
  • Updating to 0.2.9 stops all of this.

Versions 0.1.x

Versions before 0.2.0 worked without a code. They send your install id to the relay in place of a code. If you still run one, the relay also keeps:

  • A first-use record that holds your install id itself (not scrambled), for 90 days.
  • Daily counts per install, holding the install id itself, for 2 days. Per-minute counts, for 2 minutes.
  • Daily counts per IP address, for 2 days. The counter's name holds a keyed hash of the address (IPv4 in full, or the first 64 bits of IPv6), not the address.

The relay reads first-use records to recognise early users.

Versions 0.1.8 and earlier let you enter your own AI key (for Groq, Anthropic or Google Gemini). That key stays hidden in Vencord's settings.json. If it is still there and no Subline code is saved, ✦ requests go from your computer straight to that AI service, with your key. They carry the same message text, usernames, message ids and context lines as a ✦ prompt, and that service sees your IP address. Saving a Subline code switches this off. Version 0.2.9 never does this: it sends every translation to the relay.

Turning things off

SwitchWhat it stopsWhat it does not stop
Globe button (one channel)Messages, embeds, polls, forwards, topics and titles in that channel.Bios and statuses anywhere. Server rules, onboarding questions, and events that belong to no channel. ⚡ when you press it. Status checks, patch reports, the badge list.
All servers offEvery server channel, except those you turn on with the globe button.Bios, statuses, server rules, onboarding questions, and events that belong to no channel (use the next switch). ⚡ when you press it. Status checks, patch reports, the badge list.
Profiles, embeds and more offAll bios, statuses, embeds, polls, topics, titles and other text around messages.Messages in channels that are on. Status checks, patch reports, the badge list.
Names and pronouns offEvery name and pronoun request, on hover, on profile cards and with ✦.Messages, bios, statuses and the rest under Profiles, embeds and more. Status checks, patch reports, the badge list.
DMs (off by default)Messages in DMs and group DMs, until you turn one on with the globe button.Bios and custom statuses in Home, the DM list, DMs and Friends. ⚡ in DMs when you press it.
Earlier messages set to 0Translating recent messages when you open a channel.New messages.
Your own messagesNever sent to be translated by themselves.With ✦, they can be sent as context. Pressing ⚡ on one sends it.
Uninstall, or removing the add-onEverything Subline sends, including status checks, patch reports, the badge list and update checks.Files kept on your computer (see What stays on your computer).

While Subline is installed, no setting stops status checks, patch reports, update checks or the badge list.

Third parties

WhoWhat they receivePolicy
CloudflareHosts the relay, its stored records, analytics and logs. Every relay request, with your IP address. Stores feedback and sends its email copy. Routes support mail.cloudflare.com/privacypolicy
OpenRouter✦ prompts: message text, usernames, message ids, context lines, reply text, target language. Not your IP address or code.openrouter.ai/privacy
Groq, Cerebras, DeepInfra and other OpenRouter hostsThe same ✦ prompts, when OpenRouter routes to them. Groq also receives them directly when OpenRouter fails.groq.com/privacy-policy, cerebras.ai, deepinfra.com
Groq, Anthropic or Google Gemini (your own key)Only in the rare case under Older versions: ✦ prompts straight from your computer, with your IP address.Each service's own policy
DiscordThe Authorize window is Discord's own. Discord knows that your account authorized Subline, as for any app. The relay asks Discord who you are, once per link, with the one-time code. Subline asks Discord whether your account already authorized Subline, as described under Linking your Discord account.discord.com/privacy
Dodo PaymentsYour name, email, billing and payment details (from you). The scrambled install id (from Subline, for purchases started in Subline). Checkout ids, when the relay asks how a checkout stands.dodopayments.com/privacy-policy
GitHubWebsite visits, including the checkout return address with your license key and email. Release lookups from your browser. Release file checks from the helper and from Subline inside Discord. Update downloads from the helper. Your IP address each time.GitHub privacy statement
Vencord badge serverA download of the badge list every 30 minutes, with your IP address.vencord.dev
Gmail (Google)Support mail you send, and feedback copies, stored in the owner's mailbox.policies.google.com/privacy

Apart from linking, Subline makes no requests to Discord's servers. For linking, it opens Discord's own Authorize window, or asks Discord whether your account already authorized Subline (see Linking by itself). Otherwise it reads what Discord already shows you. The relay talks to Discord only to confirm a link.

Retention at a glance

On the relay (Cloudflare)
WhatHoldsHow long
Message text sent for translationPassed to the AI service, not stored.Not kept
Code recordsCode, plan, status, limits, dates, Dodo payment or subscription id.No expiry
Payment id to codeDodo payment or subscription id.No expiry
AccountCodes, scrambled computer ids, last-seen days, notes.No expiry
Discord linkKeyed hash of your Discord account id, the day that account was made. Never the id, tokens, username or email.No expiry, until support unlinks it
MovesThe two random account ids and the day of each move; when a plan last moved, and the codes that moved away, on the accounts.The newest 200 moves; the rest no expiry
Move markerKeyed hash of each Discord account id in a move.30 days
Move lockKeyed hash of each Discord account id in a running move, and a random lock token.About a minute
Move limitCount of move starts per computer, under its scrambled install id. Limit 10 an hour, deleted when the hour ends.About an hour
Synced settingsFive settings and when each changed, under the random account id.No expiry
Synced 🌐 choicesA random salt; up to 1,000 scrambled channel entries, each with on, off or back to normal and a time. Never a channel id.No expiry
Many-computers flagRandom account id, number of computers, day.No expiry
Computer to account, code to accountScrambled install id; code.No expiry
AI period startWhen the 7 days started, under the keyed hash of your Discord account id; when a server code's 30 days started, under the code.No expiry
Early-user markerScrambled install id, date.No expiry
Server code claimsScrambled install ids, one-claim marker per Discord account (per install for older versions).No expiry
Server code AI countsNumbers only, per server code.No expiry
FeedbackWhat you chose to send, time to the minute. No IP address or install id.180 days
Purchase linkScrambled install id to code.30 days
Server code network counts (IPv6)Keyed hash of the first 48 bits, count.30 days after that network's last claim
Patch reportsScrambled install id, keyed hash of IP, Discord build, broken items.8 days
Purchase in progressIds, result, scrambled install id.3 days
Daily ✦ count, ⚡ markersYour code (the keyed hash of your Discord account id during a period; account id for ⚡ without AI); scrambled message id and text.Up to 3 days
AI period starts per addressKeyed hash of the address; keyed hashes of the Discord accounts (or a SHA-256 form of the server code) that started a period there.Until the end of that UTC day
Checkout sessionsSession, Dodo link, scrambled install id.About 2 days
Server code triesCounts, under a name with your IP.2 days
"Seen today" markersScrambled code or install id.2 days
Feedback countersCounts, under keyed hashes of install id and IP.Until the first daily cleanup after that day
Checkout limitsCounts per computer and per keyed hash of IP.2 hours
Move ticketRandom account id, keyed hash of its Discord account id.10 minutes
Browser sign-in codeDiscord's one-time code, scrambled install id, keyed hash of the address.At most 5 minutes
Linking limitsCounts per computer (links, and checks while it waits for your browser) and per keyed hash of IP, deleted when the hour ends.About an hour
Sync limitsCounts of changes sent per computer, under its scrambled install id, deleted when the hour ends.About an hour
Link and price step markersOne marker per step, named with a keyed hash of the install id.400 days
Link and price step limitsCounts, under a keyed hash of IP.2 days
Daily totalsNumbers only.400 days
AI use per dayNumbers only, per kind of AI.60 days
Analytics rowsResult, 8-character fingerprint, plan, count.Set by Cloudflare
Workers LogsRelay log lines, request details recorded by Cloudflare.Set by Cloudflare
Older versionsInstall id itself; keyed hash of IP in counters.90 days; 2 days
On your computer
WhatWhereHow long
TranslationsDiscord's storageNewest 2,000, no time limit
Profile and embed cache, with original textDiscord's storageNewest 2,000, at most 30 days
Codes (yours and other Discord accounts' on this computer), install id, settingsVencord settings.jsonUntil you delete them. The install id survives uninstall.
Settings and 🌐 choices for each Discord accountDiscord's storageNo time limit
Install ids for each Discord accountDiscord's storageNo time limit
Log filesSubline log folderUp to about 2 MiB. Never removed by uninstall.
Health note, helper notesSubline's folderUntil uninstall with the box ticked
Elsewhere
WhatWhoHow long
≈ text and your IP (0.2.8 and earlier only)GoogleSet by Google
✦ promptsOpenRouter and the host that served it, or GroqSet by each service
Purchase and customer detailsDodo PaymentsSet by Dodo
Website and download requestsGitHubSet by GitHub
Support mailCloudflare (routing), Gmail (mailbox)No deletion schedule set
Feedback email copiesCloudflare (sending), Gmail (mailbox)No deletion schedule set

Your choices

  • Turn off what you do not want translated. See Turning things off.
  • Send feedback only if you want to. Leave the email empty to stay anonymous, and untick any part you do not want to send.
  • Records on the relay are kept for the times under Retention at a glance. Records marked No expiry stay.
  • To remove the link between your Discord account and your plan, write to support@subline.page. On request, support can unlink your Discord account: the keyed hash of its id is deleted from your account. Your codes and grants stay on the plan.
  • To have your data on the relay deleted, write to support@subline.page. The owner deletes your account, its codes, its links, and its synced settings and 🌐 choices by hand. Deleting your codes and account ends your plan. Dodo keeps its own records of a purchase.

Remove what is on your computer

  1. Uninstall in the Subline app, and tick "Also remove my settings and code".
  2. Delete the logs: ~/Library/Logs/Subline on Mac, %LOCALAPPDATA%\Subline on Windows.
  3. The install ids are in two places: Vencord's settings.json and Discord's storage. If you remove both, the relay sees this computer as a new one. Linking again joins it to your account.
  4. Data inside Discord's storage stays until you delete Discord's app data folder.

Children

Subline is for people who are allowed to use Discord in their country.

Changes to this page

When what Subline sends or keeps changes, we update this page and the date at the top.

Contact

Questions: support@subline.page.

Subline is independent and not made by Discord. You install it yourself, at your own discretion.

← subline.page