Custom Overhead System - Username, Health Bar, and Display Name [Open-Sourced]

Hey everyone,
I really don’t know how to start this so, let’s get into the details without interruption…

Introducing to you that custom overhead system that I’ve made recently based on Roblox username & health overhead and also, based on currently available overhead systems with some more features!

Advantages of the system:
  • The overhead gui is easy to customize and comes with a pre-set template to be used.
  • The overhead system’s module is easy to understand, maintain and documented pretty good (I guess).
  • Tweenings are being played client-side for health bar and username gui elements and then the properties are being applied server-side (External Liberary).
  • Ability to customize the Tween range for both username and the health bar to reduce the amount of data received by far players, eg. certain players or certain tween distance.
  • Username and Health bar nearly acting the same as the Roblox’s default ones.
  • The system is coming with three pre-set arrays for ranking people with some additional features, too.
  • Pre-Implemented High Quality 7 Badges.
  • Typechecking friendly :smiley:.
  • The health bar will be bugged when viewed from a long distance while the bar is below certain size (maybe 0.1-0.3 in scale). Bugged means that the health bar indicator will be invisible.
  • Health bar size will depend on the player health (Server Side Only).
  • This system supports only one badge assigning depending on its priority.


bad quality video Ik :slightly_smiling_face:

How to implement:
  • First, you may put the “Overhead System Module Script” inside the Server Storage (Location is not restricted)
  • Put the Replicated Tweening module inside the replicated storage for the ability to client and server to access it.
  • Create a server script inside the Server Script Service to be able to require the overhead system module or require it from another script that already exist there (Doesn’t really matter) and then enable the module: Module:Enable.
  • Create a local script inside the Starter Player Scripts and require the Replicated Tweening module.
  • Place the remote event inside the Replicated Storage.
  • Ensure the locations for the scripts and the remote event (the required modules, etc…).

And that’s it!

You can get the Overhead System from the Roblox’s creator marketplace:
Intermediate Overhead System - Creator Marketplace (

External Credits:

  • I can say Devforum as whole & free resources for inspiration, too.
  • TweenService V2 by @SteadyOn (Module has been modified and improved).

Let me know your suggestions and/or criticism if there any!


Can the overhead GUI (ranks) change depending on what team your on or?

1 Like

Nope, that isn’t included. But if you want such a thing, you can use the following function and call it inside TeamChanged connection:

local function UpdateRank(Player: Player, OverheadInformation: Folder)
	local PlayerInfoLabel = OverheadInformation:FindFirstChild("Information"):FindFirstChildWhichIsA("TextLabel")
	if PlayerInfoLabel then
		if Player.Team then
			PlayerInfoLabel.Text = Player.Team.Name.."\nData: <Any>"
			PlayerInfoLabel.Text = "No Team".."\nData: <Any>"

Also, you may modify the GiveInfo function (image attached below) to get the player team name and put it into the info text label once they spawn, too

thanks! i will figure out how to use it

Hi, the system works fine on my blocky model but when I switch to my man model the system disappears completely.

Template.Parent and Head.Parent returns nil when printed
(In the overhead system module in server storage)

Update: I guess I managed to find a fix by changing the Head:Part parameter to send over the player Character first, then calling Character:FindFirstChild(“Head”).

Not sure if this is a temporary fix but its working for now

Thank you for the bug report!
I’ve discovered the issue and it was caused (mostly) because the character is not yet a descendant of the workspace. About the typechecking, it wasn’t the problem, but it should’ve been “MeshPart” Or “Part” anyways…

Fix: After the CharacterAdded event, we should wait until the character is descendant of the workspace:

	repeat task.wait() until Character:IsDescendantOf(workspace) or Character.Parent ~= nil

The asset has been updated moments ago with the fix applied and changed the head’s type: “MeshPart | Part”.

1 Like

The system has been updated (Server Storage Module):

  • Fixed that the Tweens table only overwrite one value as global (forgot to make a sub table for every player. This is a server script!)
  • Clearing the sub-player table from the “Tweens” one automatically upon player leaving
  • Some minor code changes and organizing