diff --git a/keyboards/bastardkb/skeletyl/keymaps/quotengrote/config.h b/keyboards/bastardkb/skeletyl/keymaps/quotengrote/config.h
index 43190a044d..2a93aea25d 100644
--- a/keyboards/bastardkb/skeletyl/keymaps/quotengrote/config.h
+++ b/keyboards/bastardkb/skeletyl/keymaps/quotengrote/config.h
@@ -15,3 +15,6 @@
 #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255
 #define SPLIT_LAYER_STATE_ENABLE // for layer indicators
 #define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
+// rgb timeout; https://gist.github.com/aashreys/01cb34605a290a7cfb94a856bdabc94c
+#define RGBLIGHT_SLEEP  // allows us to use rgblight_suspend() and rgblight_wakeup() in keymap.c
+#define RGBLIGHT_TIMEOUT 10000  // 10 seconds
diff --git a/keyboards/bastardkb/skeletyl/keymaps/quotengrote/keymap.c b/keyboards/bastardkb/skeletyl/keymaps/quotengrote/keymap.c
index cf1aeb1798..b9faaf21b3 100644
--- a/keyboards/bastardkb/skeletyl/keymaps/quotengrote/keymap.c
+++ b/keyboards/bastardkb/skeletyl/keymaps/quotengrote/keymap.c
@@ -112,6 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   )
 
 };
+
 // https://github.com/qmk/qmk_firmware/blob/master/docs/mod_tap.md#changing-hold-function
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
   switch (keycode) {
@@ -161,3 +162,47 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
   }
   return true;
 }
+
+// rgb timeout; https://gist.github.com/aashreys/01cb34605a290a7cfb94a856bdabc94c
+static uint16_t key_timer; // timer to track the last keyboard activity
+static void refresh_rgb(void); // refreshes the activity timer and RGB, invoke whenever activity happens
+static void check_rgb_timeout(void); // checks if enough time has passed for RGB to timeout
+bool is_rgb_timeout = false; // store if RGB has timed out or not in a boolean
+
+void refresh_rgb() {
+  key_timer = timer_read(); // store time of last refresh
+  if (is_rgb_timeout) { // only do something if rgb has timed out
+    print("Activity detected, removing timeout\n");
+    is_rgb_timeout = false;
+    rgblight_wakeup();
+  }
+}
+
+void check_rgb_timeout() {
+  if (!is_rgb_timeout && timer_elapsed(key_timer) > RGBLIGHT_TIMEOUT) {
+    rgblight_suspend();
+    is_rgb_timeout = true;
+  }
+}
+/* Then, call the above functions from QMK's built in post processing functions like so */
+/* Runs at the end of each scan loop, check if RGB timeout has occured */
+void housekeeping_task_user(void) {
+  #ifdef RGBLIGHT_TIMEOUT
+  check_rgb_timeout();
+  #endif
+  /* rest of the function code here */
+}
+/* Runs after each key press, check if activity occurred */
+void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
+  #ifdef RGBLIGHT_TIMEOUT
+  if (record->event.pressed) refresh_rgb();
+  #endif
+  /* rest of the function code here */
+}
+/* Runs after each encoder tick, check if activity occurred */
+void post_encoder_update_user(uint8_t index, bool clockwise) {
+  #ifdef RGBLIGHT_TIMEOUT
+  refresh_rgb();
+  #endif
+  /* rest of the function code here */
+}