+## The new way: `SEND_STRING()` & `process_record_user`
+
+Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string for you. All ascii that is easily translated to a keycode is supported (eg `\n\t`).
+
+For example:
+
+```c
+enum custom_keycodes {
+ PRINT_TRUTH = SAFE_RANGE
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch(keycode) {
+ case PRINT_TRUTH:
+ SEND_STRING("QMK is the best thing ever!");
+ return false; break;
+ }
+ }
+ return true;
+};
+```
+
+### Tap/down/up
+
+You can send arbitary keycodes by wrapping them in:
+
+* `SS_TAP()`
+* `SS_DOWN()`
+* `SS_UP()`
+
+For example:
+
+ SEND_STRING(SS_TAP(X_HOME));
+
+Would tap `KC_HOME` - note how the prefix is now `X_`, and not `KC_`. You can also combine this with other strings, like this:
+
+ SEND_STRING("VE"SS_TAP(X_HOME)"LO");
+
+Which would send "VE" followed by a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline).
+
+There's also a couple of mod shortcuts you can use:
+
+* `SS_LCTRL(string)`
+* `SS_LGUI(string)`
+* `SS_LALT(string)`
+
+That can be used like this:
+
+ SEND_STRING(SS_LCTRL("a"));
+
+Which would send LCTRL+a (LTRL down, a, LTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes.
+
+### Alternative keymaps
+
+By default, it assumes a US keymap with a QWERTY layout; if you want to change that (e.g. if your OS uses software Colemak), include this somewhere in your keymap:
+
+ #include <sendstring_colemak.h>
+
+### Strings in memory
+
+If for some reason you're manipulating strings and need to print out something you just generated (instead of being a literal, constant string), you can use `send_string()`, like this:
+
+```c
+char my_str[4] = "ok.";
+send_string(my_str);
+```
+
+The shortcuts defined above won't work with `send_string()`, but you can separate things out to different lines if needed:
+
+```c
+char my_str[4] = "ok.";
+SEND_STRING("I said: ");
+send_string(my_str);
+SEND_STRING(".."SS_TAP(X_END));
+```
+
+## The old way: `MACRO()` & `action_get_macro`
+
+{% hint style='info' %}
+This is inherited from TMK, and hasn't been updated - it's recommend that you use `SEND_STRING` and `process_record_user` instead.
+{% endhint %}