Skip to main content

Overview

Your Monkeytype profile is your public presence on the platform. Customize it to showcase your typing setup, achievements, and social links. Control what information is visible to other users.

Accessing Your Profile

Profiles can be accessed via:
From backend/src/api/controllers/user.ts:912-919:
Usernames are case-insensitive and can be changed once every 30 days.

Profile Information

Public Profile Data

All profiles display:

Typing Stats

  • Tests completed
  • Tests started
  • Total time typing

Personal Bests

  • 15s, 30s, 60s, 120s (time modes)
  • 10, 25, 50, 100 (word modes)

Progression

  • Current XP
  • Current streak
  • Max streak achieved

Identity

  • Username
  • Discord avatar (if linked)
  • Selected badge
  • Premium status
From backend/src/api/controllers/user.ts:950-987:

Profile Details (Optional)

Additional customizable profile information:

Customizing Your Profile

Bio

Add a personal bio to introduce yourself:
Bios are sanitized to prevent XSS attacks. HTML and scripts are stripped automatically.
From backend/src/api/controllers/user.ts:1040-1054:

Keyboard Information

Share your typing setup:

Social Profiles

Link your social media and professional profiles:
All social profile links are sanitized. Only provide usernames or handles, not full URLs (except for website field).

Badge Selection

Selecting a Display Badge

Choose which badge appears on your profile and leaderboard entries:
From backend/src/api/controllers/user.ts:1032-1038:
Only one badge can be selected at a time. Selecting a new badge automatically deselects the previous one.

Badge Inventory

Badges are stored in your user inventory:
Your badge inventory is returned with user data:

Privacy Settings

Test Activity Visibility

Control whether your test activity appears on your public profile:
From backend/src/api/controllers/user.ts:1003-1007:
When enabled, your profile includes:
Test activity shows a heatmap of your daily test counts for the past year. This is different from the premium test activity history feature which includes all historical data.

Leaderboard Opt-Out

Completely remove yourself from all leaderboards:
From backend/src/api/controllers/user.ts:414-430:
Opting out of leaderboards:
  • Removes you from daily and weekly leaderboards
  • Hides your rank from friends leaderboards
  • Cannot be easily reversed (requires contacting support)
  • You can still earn XP and maintain streaks

Viewing Other Profiles

Public Profile View

When viewing another user’s profile, you see:

Banned User Profiles

Banned users have limited profile information:
Banned profiles show only:
  • Name
  • Banned status
  • Join date
  • Basic typing stats
  • Personal bests
No detailed information, inventory, or leaderboard ranks are displayed.

All-Time Leaderboard Ranks

Profiles display your all-time leaderboard rankings:
This shows your rank and the total number of ranked users for:
  • 15-second English
  • 60-second English
All-time leaderboard ranks are only shown for users who meet the minimum typing time requirement and haven’t opted out.

Profile URL Formats

Profiles can be accessed via multiple URL patterns:
From backend/src/api/controllers/user.ts:916-919:

Updating Your Profile

Complete Update Example

All fields are optional. Only include the fields you want to update.

Input Sanitization

All text inputs are sanitized using sanitizeString() from backend/src/utils/misc.ts to prevent:
  • XSS attacks
  • HTML injection
  • Script execution
  • SQL injection

Friends Integration

Your profile is visible to your friends via:
From backend/src/api/controllers/user.ts:1296-1310:
Friends see additional context:
  • Last activity timestamp
  • Connection metadata (when friendship was established)
  • Premium status (if enabled)

Profile Stats Calculation

Typing statistics are calculated from all your completed tests:
  • Completed Tests: Tests finished without bailing out
  • Started Tests: All test attempts (including incomplete)
  • Time Typing: Total seconds spent in tests (excluding AFK time)
These values are updated after each test:

Frequently Asked Questions

Yes, but only once every 30 days. To change your username:
Your old username is preserved in your name history (not publicly visible).
Banned profiles show limited information:
  • Basic stats remain visible
  • Detailed profile info is hidden
  • You’re removed from leaderboards
  • Friends can still see your basic profile
No, profiles are always visible. However, you can:
  • Opt out of leaderboards
  • Hide test activity
  • Leave bio and social profiles blank
  • Not select a badge
Ensure that:
  • The badge is in your inventory
  • You’ve selected it via the profile update endpoint
  • You haven’t selected a different badge since
Check your inventory: