osu!trans

Privacy and data retention

What the osu!trans bot stores about members, why, for how long, and who can see it.

In the server, /privacy shows what it holds about you, and can export it or delete it.

1. Principles

  1. Collect what a feature needs to work, nothing for "maybe later".
  2. Nothing is kept forever by default. Every data class has a retention rule enforced by a tested job.
  3. Sensitive things (safety reports, screening answers, restricted tickets) are visible to the fewest people possible, and every view is logged.
  4. Aggregate statistics never identify a member.
  5. Members can see, export and delete what we hold about them, within the limits of keeping the server safe (moderation records about someone are kept while they matter).

UK GDPR's storage limitation principle is the yardstick: personal data is not kept longer than needed for the purpose it was collected for.

2. What we store

DataWhyRetentionWho can see it
Discord user id, display name snapshotEverything references membersWhile referencedStaff by capability
Moderation cases and private notesSafety, accountabilityWhile a member, then 2 years after leaving, then anonymisedStaff with case capabilities
AutoMod detections and context snapshotsReview and tuning30 days; context 14 daysStaff with AutoMod review
ReportsSafety1 year after closure, or as long as a linked caseReport reviewers
Staff applications (answers, age range, staff votes and notes)Choosing staffDrafts 2 days; declined 90 days and accepted 1 year after the decisionApplication reviewers
Appeals (what the member wrote, the decision and a staff-only note)FairnessAs the caseAppeal reviewers; the member sees only the outcome
Tickets and transcriptsSupport180 days (normal), 1 year (restricted) after closing, then a stub (number, category, dates, rating; nobody's id, not even the opener's); tickets that never opened, 30 daysStaff with the category capability
Onboarding answersAssigning roles, reviewing access30 days after completionScreening reviewers
IntroductionsMembers chose to share themUntil withdrawn, or 7 days after leavingPublic in #introductions once approved
Custom pronounsShown where the member choseUntil changed or the member leavesWhere the member shows them
Country (also kept when it has no role)Shown where the member choseUntil changed or the member leavesWhere the member's role or introduction shows it
Self-assigned role picksRole panelsNot stored: they are Discord roles, and picks are not written to the audit trailAnyone who can see the member's roles
Saved roles on leaveRestoring on return90 daysNobody browses these
osu! link (osu! user id, username, main mode, stable or lazer scores, whether others can look it up by mention, whether it shows on server leaderboards)osu! featuresUntil unlinkedThe member; staff for safety
osu! link history (Discord id, osu! user id, link or unlink, when; no usernames)Safety checks and the 24 hour relink cooldown1 year, also after an unlinkStaff with osu.links.view; each view is audited
osu! linking attempts (hashes only, never a usable token; after sign-in, the osu! id and username waiting for confirmation)Finishing a sign-in safely10 minutes to sign in, 10 more to confirm; deleted on confirm, cancel or unlink, otherwise a day after expiryNobody
Score tracking opt-ins (server, mode, place and pp threshold) and quiet hours (two hours and a time zone)Posting a member's new top plays, only after they opt inUntil they opt out or unlinkThe member; staff see how many are tracked
Tracked plays (the score osu! published, its map, the post's status)The tracking post, and evidence of activity for team leaders30 days; deleted at once on unlinkThe server channel staff chose, when posted
osu! team data (the server's teams, members' public usernames, last visit when shown, ranks, daily team rank)Team roles, the team panel and leader toolsMembers until they leave the team; daily records 30 daysAnyone for the panel; team leaders and staff for the leader tools
osu! user tokens (only if needed)Features that need the member's authorityNot kept today: the sign-in token is used once to read the account, then revoked. If a feature needs one: until unlinked or revoked; encryptedNobody; never displayed
osu! profile, score, beatmap and search cache (public osu! data; never previous usernames, which are dropped before anything is stored)Fewer requests to osu!, data while osu! is downRefreshed on use; cached scores and searches 30 days (and capped in size); profiles of players nobody here linked, and beatmaps that are not ranked, approved or loved, 30 days after their last fetch (ranked, approved and loved maps stay as the recommendation index: public map data, nothing about who played them); a member's cached profile and scores, and cached leaderboards and searches including them, are deleted on unlinkAnyone who looks the profile up
Linked Roles connection (the member's Discord tokens for this application, sealed with AES-256-GCM; the scopes granted; when it was set up and last updated; a hash of what was last sent)Keeping the member's Linked Roles numbers current: linked or not, global rank, pp, main mode, teamUntil they unlink osu!, delete their data, or revoke the bot in Discord; then Discord is told, the authorization revoked and the row deleted. Someone who signs in without an osu! link is told to link first and nothing is keptNobody; the tokens are never displayed or exported
Linked Roles sign-ins (hashes of the state and the browser cookie, and a keyed hash of the visitor's IP address to cap sign-ins per address; nothing that names anyone)Finishing a sign-in safely10 minutes to use; deleted a day after expiryNobody
Score snapshots and profile history (one row a day per mode: pp, ranks, accuracy, play count)Tracking, graphs, server leaderboards, recommendations1 year while linked; deleted on unlinkAnyone who runs /graph on them (as for their public osu! profile); aggregates in server leaderboards unless they turn those off
Recommendation history and feedbackPersonalisation, evaluationWhile linked; deleted on unlinkThe member; aggregates for evaluation
Member timeline events (joins and the invite used, name, avatar, role changes, gate decisions)Moderation contextWhile a member, then 1 year after leavingStaff with case access
Profile check resultsSafety review1 yearStaff with case access
Names and avatar hashes of banned membersBan evasion detectionWhile the ban stands and a ban evasion rule is on; checked against Discord's ban list dailyNobody browses these; a match shows staff the names that matched
Voice room recordsOwnership, cleanup30 days after the room closesStaff with voice override
XP totals and daily XP (never message content)Levels and leaderboardsTotals while a member, deleted on opt-out or 90 days after leaving; daily totals 13 monthsEveryone, unless the member hides from leaderboards
Giveaway entriesDrawing winners90 days after the draw; winners in the audit trail 1 yearStaff with giveaways.manage
Birthdays (month and day; time zone and birth year only if given)Celebrating the memberUntil removed, or 30 days after leaving. After removal only two things stay, neither with a date: when it was last changed, for up to 30 days, so the limit on changes holds; and which years the member was celebrated, until the end of the next year, so nobody is celebrated twice in a yearThe member; others only if the member opts in to the listing, and never the year unless they choose to show their age
Bot poll votesCounting, letting members change their vote30 days after the poll closes; totals kept. A vote is stored under a keyed hash of the voter, never their member id, with a random key per poll. While the poll is open, someone with database access and the member list could still work out who voted for what; the key is destroyed at the close, and from then on no vote can be tied to anyoneNobody sees who voted for what
Suggestions (the idea, its author, staff's decision and note) and votes (member id and for or against)Showing and deciding suggestionsWith their votes, a year after the decision, or a year after they were made if never decidedEveryone sees the idea and the counts; nobody sees who voted which way
Event answers (member id, going, maybe or can't go)The RSVP card and reminders30 days after the event ends or is cancelled; the event a yearEveryone sees the count and the first 15 going
Announcements (staff text, who wrote it, when it went out)Previews, schedulingUnsent drafts 30 days; the rest a yearStaff with announcements.post
Notification preferences (kinds turned off, quiet hours and time zone, daily DM limit)Holding back DMs and pings the member did not wantUntil the member resets themThe member
Daily DM counts (member id, day, how many)The member's daily DM limitTwo daysNobody
Structure snapshots (roles, channels, overwrites; a member id appears only where a channel has a per-member overwrite)Recovering from a nukeThe newest 30 per server, plus one a day for 14 daysStaff who can change security settings, through recovery previews
Replays sent for renderingMaking the video the member asked forThe file is not kept by us; o!rdr holds the replay and the public video under its own rules. The bot sends o!rdr the member's Discord id with it, so o!rdr can limit renders per personPublic on o!rdr
Render records (who asked, where, the map and player as a title, a checksum of the replay file, o!rdr's render id and video link or failure)Updating the render's message after a restart, posting a video again instead of rendering it twice90 days after the render endsThe channel it was asked in sees the message
Render settings (skin, resolution, dim, cursor size, three toggles)The member's next rendersUntil the member resets themThe member
Audit eventsAccountability1 yearAdmins
Dashboard accounts (Discord id, display name, avatar link; no email, no Discord tokens)Signing staff inWhile they hold a staff capability; a lost role ends access at the next requestAdmins
Dashboard sessions (with the IP address and browser that started them)Sign-in, revocation7 days, deleted on sign-outAdmins, for revoking

Message content is not stored, except: ticket transcripts (the point of a ticket), AutoMod context snapshots (short-lived), and evidence a staff member explicitly preserves on a case.

3. Member controls

  • /privacy shows what the bot holds about the caller, grouped as above, with buttons to export (a JSON file in DMs) or delete the deletable parts.
  • /osu unlink deletes everything osu!-related except bookmarks, which are the member's own list (/privacy deletes those).
  • /intro withdraw deletes the introduction.
  • Moderation records, reports about the member and closed tickets are not deletable by the member; the page says so and explains how to ask staff.

4. Analytics

The dashboard shows counts and rates. It never shows restricted ticket content, report text or screening answers in charts or overviews. Small counts that could identify someone (fewer than 5) in restricted categories are shown as "under 5".

5. Third parties

  • Discord receives what any bot sends to Discord, and, for members who set up Linked Roles, their osu! username, main mode, global rank, pp and whether they are in a server team, which Discord shows on their profile as a connection.
  • osu! receives API requests identifying osu! user ids we look up.
  • No analytics services, no error tracking service that receives message content, no AI services.