EasyProfile - A Simple Way to Store Player Data



Get it on Wally View it on our Documentation Join our Discord server! Get it on Roblox Get it on GitHub

About :sparkles:

EasyProfile is a profile manager that uses ProfileService under the hood. It is meant to give you an easier experience while setting up your data framework, but also gives all the tools which are necessary to customize how your data will work and be stored. What it’s doing is running all of the boilerplate code behind a function; this shortens your code but also makes it the exact same, while maintaining the same feature set that ProfileService has and even more. Some examples of this include a function which creates a leaderstats folder under the player based on the corresponding data given. It also boasts simplified global updates (later referred to as global keys). Global keys are just like global updates, but way easier to understand and use in a casual manner.

Available features :tada:

  • Verbose :books:
    The library has a wide variety of different APIs, including many for utilities

  • Reliable :bullettrain_side:
    EasyProfile gives you and players a consistent and reliable experience

  • Familiar :revolving_hearts:
    Quite similar to the ProfileService API

  • Easy :sunglasses:
    Completely cleans up after itself, ensuring there are no memory leaks.

… and much more!

Is it better than ProfileService by itself? :thinking:

Yes, of course! The API is meant to be nicely written with it and much easier than creating your own. Since it can be styled as much as you’d like, there really is no limit on how much you can make it differ from the default UI. Along with customizable tweening, and animation types it would greatly beat out any custom systems.

Installation + Usage :open_book:

To install, you can get the model from the marketplace/github or install it via Wally. From there, you can go to the next article in tutorials to learn more about how EasyProfile works. If you need any additional help, feel free to reply to this post or shoot me a message on Discord.

Issues :bug:

Came across an issue in our code? Simply create a new issue on the GitHub repository tagged with the package name or create a new bug report in our discord server.

Conclusion :wave:

Please share all of your feedback below! We are always looking for ways to improve our packages for all.

— Made with :heart: by Canary Softworks

Will you use this package?
  • Sure!
  • No thanks!
  • Maybe later!

0 voters



  • Support for MetaTags

  • Better type checking, ScriptSignals now have their respective types for what arguments there are

  • Cleaned up code and removed useless parts

  • Add DataStoreObject:RemoveGlobalKeyAsync()

  • Minor bug fixes

Documentation coming soon.

Should I still freeze the returned GlobalKey dictionary?
  • Yes
  • No

0 voters

What is the GlobalKey dictionary?

Well, GlobalKeys are basically keys that get sent to other players cross-server/inactive players.

The GlobalKey dictionary is returned through PlayerDataObject:GetGlobalKeys() which returns a dictionary of keys that were sent to the player while they were inactive. To listen for cross-server keys, use PlayerDataObject.GlobalKeyAdded. A global key object is: {Key: string, Value: any, KeyId: number} if I freeze the table returned, you can’t edit the object.

And what can Devs use them for? Sorry I did not understand too good, but what my question now is, what if the advantage that they give to Devs?

They eliminate the use for MessagingService, and you can also send these keys to inactive players which messaging service cannot do.

Thanks for the explanation, I think you shouldn’t freeze them, they can be useful

1 Like



  • Add PlayerDataObject:UpdateKey(key: string, callback: (oldValue: any) -> (any))
  • Add PlayerDataObject:GetDataUsage(): number
  • Add PlayerDataObject.KeyUpdated(key: string, oldValue: any, newValue: any)
  • Minor bug fixes




Fixed a fatal bug that was affecting PlayerDataObject:UnclaimSessionLock(). This issue should be fixed as of now, please let me now if you run into any other issues.

1 Like


Fixed a few bugs and improved code by adding safety checks.

1 Like


Add PlayerDataObject:GetKeys(): {[string]: any}?
Add PlayerDataObject:RemoveUserIds(userIds: {number})
Add PlayerDataObject:GetUserIds(): {number}?
Remove Console

If I have the correct, most recent module, then I’d like to report an issue. On line 211, you should probably check for nil explicitly since keys with false as a value raise the error.

1 Like

Thanks for the report, I am probably gonna rewrite this to be more performant in the future.

Yeah i see the issue. If they key was false it would throw an error.

The GitHub page apparently got deleted? Is that gonna be fixed?

1 Like

Working on an updated version, sorry about that

When will the documentation/github be fixed?

Thanks for reminding me, probably right now

1 Like

Do you know when it’ll be updated?

Yeah soon just making a few code changes. I will notify you upon finish.

1 Like


Updated github/docs