A downloadable GMS2.3 framework

Buy Now$15.00 USD or more

Version 0.9.4 released -- February 25, 2022

Version 0.9.3 released -- April 21, 2021

Version 0.9.21 released -- January 1, 2021

Version 0.9.2 released -- December 23, 2020

Version 0.9.1 released -- November 19, 2020

Shampoo is a GameMaker Studio 2.3 (GMS 2.3) framework. It lets you build graphical user interfaces (GUIs) using a markup-like language. Shampoo supports live-coding, so you can create and debug interfaces in real-time. Shampoo was created for rapid, lightweight interface creation and user input handling. Its development began in early 2019 and went through several major pivots and rewrites since.

➡️Shampoo is currently pre-version 1.0. Expect code cleanup, optimizations, and refactors as v1.0 approaches. These patches should not break existing integrations in unmodified `ShampooMain` scripts.

📚 The Shampoo framework documentation is hosted on Github. Please note that the docs are WIP. The highly in-depth demo included with the framework should be more than enough to show you a majority of features.

⚠️ Shampoo has only been tested and verified to work on GMS 2.3 Windows export (including YoYo Compiler) and MacOSX export.


  • Live-coding development environment so you can create and debug interfaces in real-time
  • Lightweight setup: it only takes a single function call to get the framework initialized
  • File checksum verification to hinder tampering
  • A unique markup-like language to build interfaces quickly
  • Customization of colors, fonts, sprites, sizes, and more
  • Built-in easing/tween engine to give your menus juice
  • Buttons with ability to enable/disable them
  • Draggable interfaces
  • Checkboxes and toggles
  • Radio button groups
  • Text input with maxlength and numbersOnly attributes
  • Sliders with customizable min/max ranges and intervals
  • Automatic content overflow and linebreaks
  • Custom callback functions and in-line hyperlinks
  • Sound effect (and toggling) support
  • Tooltips and hover effects
  • Hex, blue-red-green, and string color support, with a built-in palette
  • onLoad, onStep, onClose, onDraw, onDrag, onResize event listeners
  • Out-of-the-box window resizing support
  • Arrow key/tab navigation


  • Framework isolated from the included demo
  • Improved HTML5 support
  • iOS, Android, and console support
  • Dropdown menus
  • More advanced textareas and input interception
  • Paginations
  • More efficient text parsing and character escaping
  • Element padding, margins
  • Scrollviews
  • Lists, expansion of indentation logic

Terms of Purchase:

  • This framework source code is sold as-is. You will receive free updates as they release on this website.
  • The price is subject to change (e.g. limited-time promotions) or may vary based on the marketplace.
  • Support, bug fix requests, and general inquiries will be handled on a case-by-case basis at earliest possible convenience of Shampoo's sole developer.
  • No parts of your purchase may be re-distributed, re-sold, or bundled with existing assets.
  • After purchasing this source code, it can be used in both commercial and non-commercial projects indefinitely. For teams larger than 3 developers, please consider purchasing additional copies. While not necessary, it's a way to support ongoing development.
  • No credit attribution is required, but appreciated (@Zack Banack).
  • Refund requests must go through this website.


Buy Now$15.00 USD or more

In order to download this GMS2.3 framework you must purchase it at or above the minimum price of $15 USD. You will get access to the following files:

shampoo_v0_9_4_release.zip 6 MB
shampoo_v0_9_3_release.zip 6 MB
shampoo_v0_9_21_release.zip 6 MB
shampoo_v0_9_2_release.zip 6 MB
shampoo_v0_9_1.zip 5 MB
shampoo_v0_9_0.zip 5 MB

Development log


Log in with itch.io to leave a comment.

is this cross-platform? is it compactable with PS/Mac/android and IOS?


Are you still developing this?

(5 edits)

Looks great! I would love to see the roadmap list ready to work! I'm looking forward to updates!

support chinese?

Would you (or anyone already well versed in this) mind making a tutorial video on how to implement and use this in GMS2? I know the documentation helps, however, a video would be much better. Thanks.

This is amazing!! How many copies do I need to buy to fund the roadmap :P

A request: A boolean secret_value attribute for textareas which would allow you to display the text value as all asterisks. Would be very useful for login systems where the password needs to be hidden. Also useful for any game where you need to enter secret information, like submitting a prompt or wager.

Are you still developing this? This looks so promising but I was waiting for iOS support before I tried it. 


Shampoo’s still in development, albeit passively. I’m sitting on a half-complete update that adds a bunch of optimizations (like significantly faster text parsing) and extended non-desktop device support. I don’t have an ETA but questions like this motivate me to continue working on it :)

Great to hear. I am looking forward to seeing more of it.

Hi there! This looks fantastic, can't wait to play with it.

When I try to run the demo project (or a new project with a local asset imported, it's the same), I get this error:

[SHAMPOO ERROR!] Could not initialize the Shampoo framework! Reason: could not locate BASEDIR, C:\Users\Your\Directory\Here\datafiles\shampoo

Any ideas? I tried checking and unchecking the file sandbox setting the error mentions. I'm not sure what exact directory is being referred to here.

I'm on Windows 10 and my gm IDE version is and my runtime is


Hey! This should be an easy fix. It looks like you need to set the project directory in the create event of object obj_shampoo. Check out the Setup section of the documentation: https://github.com/zbanack/shampoo#installation-and-setup

(2 edits)

If you get an error when running Shampoo in GMS v2.3.2.556, this one-liner should solve the problem until I push an official update.

First, go to function sh_tags_define in script ShampooAttrs.

Next, find the line (should be line 624) reading

var accepts_map = ds_map_create();

Underneath, add the following:

if (!is_array(accepts)) accepts = [];

Here’s a picture of what it should look like.

Having a lot of fun with this framework!  Do you have any tips on how I might make something that's not in a canvas visually?  For example if I have a screen already made and just need to add a few checkboxes to it, is there a way?  If I need to have a canvas, is there a way to adjust its transparency so it's invisible?  Thanks so much for your help.

Currently, the only way to make a canvas background transparent is this hacky workaround of assigning an invisible sprite to it. Hah :x Hopefully that’ll be okay for the time being

Oh that's perfect, I'll use that method.  Thanks for the quick reply!

(4 edits)

I can't seem to get hovering or clicking of buttons to work. Hovering doesn't change the colour, tool tips don't show, and clicking on buttons doesn't perform the function or open attributes. This happen with release mode on or off.

Any help is appreciated, here's my canvas for reference: https://pastebin.com/yHRfjY07

EDIT: So adding an open/close attribute to the buttons enables hover support, however, the scr attribute does not enable hover or click support. The script also won't run if the open/close attributes exist as well. Any ideas as to why this is?

EDIT2: Turns out the scr attribute can not run built-in Game Maker functions. I had to make a quit_game() function that just runs game_end() and it works fine. (I realized my initial pastebin has end_game as a typo, I tried game_end afterwards to no avail)

I can work around this. If it's not something you can implement then no worries, it's definitely not something terribly urgent :)


Hey Carson, I’ll add built-in GM function support to callbacks to my TODO list! I’m glad you were able to figure it out. I’ll also convey more clearly in the docs that a valid callback function is necessary for buttons/links in order for them to be ‘hoverable’ (it’s a failsafe to prevent crashes during live-coding by calling a non-existing function).

First, I love this framework, I've spent the last few days playing around with it. I'm really looking forward to scrollviews!

A couple of other things I'd love to see are the ability to change the mouse cursor on hover and some more control over sliders. In particular, the ability to manipulate the slider label a bit more and the ability to pad the end of the sliders so you can put a bit of a buffer between the knob and the edge. Also, I've noticed that if you click the bar when you don't have a knob then the value will jump to your click but with the knob you have to slide it. I like the visual appeal of the knob but not having to actually drag it would be great.

Finally, is the choice to have so many inputs block-style a design choice or a practicality choice? Because I would love to be able to create a checkbox field instead of having to put them in list form.

(1 edit) (+1)

Hey, I’m glad you’re enjoying the framework! I don’t have an ETA for the scrollviews update at the moment, but I’m also excited for them.

I had mouse-cursor manipulation mostly implemented prior to the framework’s release, but I scrapped it because I was getting inconsistent results on Windows and Mac. Maybe now I can look again with a fresh pair of eyes.

The knob-slider precision thing was intentional, but I’m not opposed to either reverting the decision or adding an optional attribute (like, precise) to enable/disable precision.

And block-style input started as a way to lessen the number of edge cases the framework would need to account for (element alignment, input handling, overflow to the next row, etc.). But I think enough code has been refactored from v0.9.0 to v0.9.2+ that would make non-block-style inputs practical. I’ll add investigating this to my TODO :)

(1 edit)

It appears that Sliders don't accept a `value` attribute? All values just set to 50 no matter what - even in your demo project. I'm guessing it's something to do with ShampooInput.gml:1387 where it detects that value is undefined no matter what, but I'm not sure.

I ran the debugger and it's not that function, it doesn't seem like it reads "value" from the document at all but I didn't have time to dig deeper. You could probably pin point it 10x faster than I could though.

I’ll have this fixed midday Friday EST most likely! Thanks for uncovering this, I should have caught this prior to release…

Fixed in v0.9.21, thanks for your patience!

The slider now accepts value=real, value={$var}, etc.

If you’re curious. The issue was that the slider tag accepted value-real instead of the value attribute. The value-real variant is an under-the-hood naming convention to prevent look up table conflicts. Now, value is auto-changed to value-real when detected in a slider tag.

That's cool, thanks for fixing that. I'm loving this system so far!

I've installed Shampoo into my working game and when I run it with the shampoo_obj in the first room, I get that window with the message "Hi there!" and a bunch of the tags, all in black text.  I don't see the pretty colours and things that I see in the demo project.  Do I need some third-party library or something?  Thanks!

(1 edit)

Hi, sorry to hear about the problems – haven’t heard of this issue before. A couple questions and hopefully we can get this fixed! First, can you verify the Shampoo demo works as intended on its own (outside of your existing project)?

Second, what OS and GM Runtime version are you using?


Thanks for the quick reply!  The demo project works great (after changing those things in the shampoo init function to point to the working directory, etc).  After importing the current version of Shampoo into my existing project and dragging the shampoo_obj instance into the first room, it shows all that welcome text but in black and with the tags. 

I've attached a picture so you can see it in action. 

The GM Runtime is the current one,, and I'm running off the current Mac OS 11.1

Thanks again for looking into this!  I love what you've done with this asset by the way!

Thanks for the info, that’s real odd… I’ll get to the bottom of this ASAP (I’m with some family for the holidays). I appreciate your patience

No problem, take your time! Since the demo project works, it’s probably a configuration setting in my game that’s causing this. One thing I can try would just be creating a new project and reimporting everything again to see if that works. I hope you had a great Christmas!

Hey sodabeam! Thanks again for your patience. Just now, I’ve successfully imported Shampoo into several existing projects of mine (one even converted from GMS 1.4 -> 2.3; different game settings; different directories, etc.) but can’t seem to recreate the issue. I’ll be investigating further. But until then, if you’d like a refund for your purchase, I have no problems with that :)

This  looks great! On GitHub, 'Scrollviews' is on the roadmap, by that do we mean essentially a dialogue/area with scrollbars vertically or horizontally? Me being a noob, that's plagued my GM experience :-) I'll likely buy before that's in but that will sell it.

Thanks! Yeah, that’s basically what I have in mind with scrollbars: horizontal, vertical, and panning with cursor/finger. In other words, scrollviews will (ideally) be rectangles with content inside that you can move around

Zack this looks fantastic.. A nice blend of html, markdown and bbcode :D

Is it possible to list a demo project to download and play with (just to see the popups, inputs, etc)?  Also I know you mentioned you do not have the android export, have you tried it (or own) the HTML5 export?


Hey Mickey! Getting Shampoo working smoothly with HTML5 is a big priority for me. Here’s an HTML5 demo of where it stands at the moment. The text isn’t sharp and the performance is pretty lousy when new menus are being generated https://www.banack.me/shampoo_html5_demo/.

That's amazing!

Do you have plans to support Android?

While I don’t have the Android export module or an Android device, I do have plans on mobile support. Specifically, things like bringing up the keyboard when a text field is in focus.

Hi, yes i'll probably add Android support in the future.


My team is considering using this for an upcoming project, i'll update here with our experience if we do.