diff --git a/pd/nw/dialog_prefs.html b/pd/nw/dialog_prefs.html
index c1f5c934c2dd76c8333a8c5b3923cd38d3bf4f5a..e4abcae8da07a04db321bc1eb1ee69b56990bc64 100644
--- a/pd/nw/dialog_prefs.html
+++ b/pd/nw/dialog_prefs.html
@@ -1036,9 +1036,29 @@ function autopatch_yoffset_toggle(checked) {
 
 function gui_prefs_callback(name, show_grid, save_zoom, browser_doc, browser_path,
     browser_init, autopatch_yoffset) {
-    var s = document.getElementById("gui_preset"),
-        i;
-    for (i = 0; i < s.options.length; i++) {
+    var s = document.getElementById("gui_preset");
+
+    // ag: scan the css subdir for user-defined styles
+    var predefined = // built-in styles
+        [ "c64.css", "default.css", "dejavu.css", "extended.css",
+          "footgun.css", "inverted.css", "solarized.css",
+          "solarized_inverted.css", "strongbad.css", "subdued.css",
+          "vanilla.css", "vanilla_inverted.css"];
+    var fs = require('fs');
+    var base = process.platform === "darwin" ? pdgui.get_lib_dir() : ".";
+    var files = fs.readdirSync(base + "/css/");
+    files.forEach(file => {
+        var pos = file.lastIndexOf('.');
+        var ext = file.substr(pos);
+        if (ext === ".css" && predefined.indexOf(file) === -1) {
+            var base = file.substr(0, pos);
+            var option = document.createElement("option");
+            option.text = base;
+            s.add(option);
+        }
+    });
+
+    for (var i = 0; i < s.options.length; i++) {
         if (s.options[i].value.toLowerCase() === name.toLowerCase()) {
             s.selectedIndex = i;
             break;
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index ffcc1f52684b948813611fd20fc5fe0b02d15dc9..3e176ce5e7d4285a3740b33115727568a95cfe9e 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -5973,7 +5973,12 @@ var skin = exports.skin = (function () {
             return dir + preset + ".css";
         },
         set: function (name) {
-            preset = name;
+            // ag: if the preset doesn't exist (e.g., user preset that
+            // has disappeared), just stick to the default
+            var base = process.platform === "darwin" ? (lib_dir + "/") : "";
+            if (fs.existsSync(base + dir + name + ".css")) {
+                preset = name;
+            }
             for (id in patchwin) {
                 if (patchwin.hasOwnProperty(id) && patchwin[id]) {
                     set_css(patchwin[id].window);