A while back, somebody was trying to run the game on a mac, and was doing so using the Renpy SDK. They were receiving an error, involving the variables.json file being "read only." I don't know why I didn't think of it then, but here is what is most likely happening. When you run the game(s) normally, using the .exe, the variables.json file is located/updated/read from out of the same folder as your game .exe. However, a quirk about the Renpy sdk, and running the game from there, is that it saves the variables.json file within the Renpy SDK folder structure. Don't ask me why, but it does. Since I run on windows, it gets stored in a different sub-folder than yours would on a mac. For instance, "renpy-7.3.5-sdk\lib\windows-i686." My guess is that the mac security for the SDK folder that Renpy is storing the file in, forces the file to be "read only." This is a problem, because the game regularly updates this file. I can't help you with how to alleviate that, because I don't know how macs function in that respect. However, it might be as simple as just resetting the security on the variables.json file to make it read/write. If that isn't possible, the purpose of the file is to store a few game settings. Renpy doesn't reliably maintain in-game variables for use outside of an ongoing game, and I needed a way to store the name settings and some other things across games. However, since you are in the Renpy SDK anyway, what you could do, as a more extreme "solution," is to just change your name settings and such, directly in characters.rpy, and variables.rpy, and then go to utilities.rpy, and just modify the save_variables python method to just return, and not actually write the file. In other words, just hard code your choices. You would also need to modify the load_variables python method to force varsFileExists to False, and then it will load instead from your hard coded settings. Your saves will include the variable settings at the time you saved them. Also, the names I use in the .json file, should match the actual variable names used within the game code.
Here is a sample variables.json file:
{"values": [{"name": "introplayed", "value": "True"}, {"name": "dawnstagenameoffset", "value": "0.297"}, {"name": "dee_bi_curious", "value": "False"}, {"name": "dee_loves_dogs", "value": "True"}, {"name": "dawnname", "value": "Dawn"}, {"name": "dawnstagename", "value": "Dee"}, {"name": "dawnage", "value": "18"}, {"name": "dawnoccupation", "value": "1"}, {"name": "cassiename", "value": "Cassie"}, {"name": "cassiestagename", "value": "Sabrina"}, {"name": "cassieage", "value": "19"}, {"name": "dananame", "value": "Dana"}, {"name": "danastagename", "value": "Lacey"}, {"name": "danaage", "value": "18"}, {"name": "denisename", "value": "Denise"}, {"name": "denisestagename", "value": "Frankie"}, {"name": "deniseage", "value": "26"}]}