diff --git a/docs/keyboard_identifiers.md b/docs/keyboard_identifiers.md
new file mode 100644
index 0000000000..b10cb0b3f1
--- /dev/null
+++ b/docs/keyboard_identifiers.md
@@ -0,0 +1,61 @@
+# Keyboard Identifiers
+
+|Keyboard|Vendor ID|Product ID|Device Ver|
+|alps64|0xFEED|0x6464|0x0001|
+|amj40|0xFEED|0x6072|0x0002|
+|amj60|0xFEED|0x6066|0x0001|
+|amjpad|0xFEED|0x6060|0x0003|
+|atomic|0xFEED|0x6060|0x0001|
+|atreus|0xFEED|0x6060|0x0001|
+|atreus62|0xFEED|0x6062|0x0001|
+|bananasplit|0xFEAE|0x8870|0x0001|
+|bantam44|0xFEED|0x6060|0x0001|
+|chibios_test|0xFEED|0x6464|0x0001|
+|clueboard|0xC1ED|rev1: 0x2301
rev2: 0x2320
|rev1: 0x0003
rev2: 0x0001
|
+|cluecard|0xC1ED|0x2330|0x0001|
+|cluepad|0xC1ED|0x2312|0x0001|
+|deltasplit75|v2: 0xFEED
|v2: 0x3060
|v2: 0x0001
|
+|dk60|0xFEED|0x6060|0x0001|
+|eco|0x1337|0x6006|rev1: 0x0001
rev2: 0x0002
|
+|ergodox|ez: 0xFEED
infinity: 0xFEED
|ez: 0x1307
infinity: 0x6464
|ez: 0x0001
infinity: 0x0001
|
+|frosty_flake|0xFEED|0x6060|0x0001|
+|gh60|0xFEED|0x6060|0x0001|
+|gherkin|0xFEED|0x6060|0x0001|
+|gonnerd|0xFEED|0x6060|0x0001|
+|hadron|0xFEED|0x6060|ver0: 0x0001
ver2: 0x0002
|
+|hhkb|0xFEED|0xCAFE|0x0104|
+|infinity60|0xFEED|0x6464|0x0001|
+|jd40|0xFEED|0x6060|0x0001|
+|jd45|0xFEED|0x6060|0x0001|
+|kbd75|0xFEED|0x6060|0x0001|
+|kc60|0xFEED|0x6060|0x0001|
+|kinesis|0xFEED|alvicstep: 0x6060
stapelberg: 0x6060
|alvicstep: 0x0001
stapelberg: 0x0002
|
+|kitten_paw|0xFEED|0x6050|0x0104|
+|kmac|0xFEED|0x6050|0x0104|
+|lets_split|rev1: 0xFEED
rev2: 0xFEED
|rev1: 0x3060
rev2: 0x3060
|rev1: 0x0001
rev2: 0x0001
|
+|m10a|0xFEED|0x0007|0x0001|
+|maxipad|0xFEED|0x6060|0x0001|
+|mechmini|0x20A0|0x422D||
+|minidox|0xFEED|0x3060|rev1: 0x0001
|
+|mitosis|0xFEED|0x6060|0x0001|
+|miuni32|0xFEED|0x6060|0x0001|
+|nyquist|rev1: 0xCEEB
|rev1: 0x1156
|rev1: 0x0100
|
+|orthodox|rev1: 0xFEED
|rev1: 0x3060
|rev1: 0x0001
|
+|pegasushoof|0xFEED|0x6050|0x0104|
+|phantom|0xFEED|0x6060|0x0003|
+|planck|0xFEED|0x6060|rev3: 0x0003
rev4: 0x0004
|
+|preonic|0xFEED|0x6061|0x0001|
+|ps2avrGB|0x20A0|0x422D||
+|roadkit|0xFEAE|0x8846|0x0001|
+|s60_x|0xFEED|0x6060|0x0001|
+|s65_x|0xFEED|0x6060|0x0001|
+|satan|0xFEED|0x6060|0x0003|
+|sixkeyboard|0xFEED|0x6062|0x0001|
+|tada68|0xFEED|0x6060|0x0003|
+|tiger_lily|0xFEED|0x6060|0x0001|
+|tv44|0xFEAE|0x8844|0x0002|
+|uk78|0x554B|0x004E|0x0002|
+|vision_division||||
+|whitefox|0xFEED|0x0F0F|0x0001|
+|xd60|0xFEED|0x6060|0x0001|
+|xd75|0xCDCD|0x7575|0x0001|
diff --git a/util/keyboard_identifier_generator.sh b/util/keyboard_identifier_generator.sh
new file mode 100644
index 0000000000..5b326ebbf0
--- /dev/null
+++ b/util/keyboard_identifier_generator.sh
@@ -0,0 +1,48 @@
+#/bin/bash
+echo "# Keyboard Identifiers
+
+|Keyboard|Vendor ID|Product ID|Device Ver|" > docs/keyboard_identifiers.md
+for project in $(find . -regex '\./keyboards/[a-z0-9_\-]+/config.h')
+do
+ keyboard_name=$(printf $project | sed -r "s/\.\/keyboards\/([a-zA-Z0-9_\-]+).*/\1/g")
+ vendor_id=$(grep 'VENDOR_ID' $project | \
+ tr -d '\n' | \
+ sed -r "s/.*(0x[a-fA-F0-9]+).*/\1/g")
+ if [ -z $vendor_id ]; then
+ for subproject in $(find . -regex "\./keyboards/$keyboard_name/[a-z0-9_\-]+/config.h")
+ do
+ subproject_name=$(printf $subproject | sed -r "s/\.\/keyboards\/${keyboard_name}\/([a-zA-Z0-9_\-]+).*/\1/g")
+ subproject_vendor_id=$(grep 'VENDOR_ID' $subproject | \
+ tr -d '\n' | \
+ sed -r "s/.*(0x[a-fA-F0-9]+).*/\1/g")
+ vendor_id+=$(printf "%s: %s
" $subproject_name $subproject_vendor_id)
+ done
+ fi
+ product_id=$(grep 'PRODUCT_ID' $project | \
+ tr -d '\n' | \
+ sed -r "s/.*(0x[a-fA-F0-9]+).*/\1/g")
+ if [ -z $product_id ]; then
+ for subproject in $(find . -regex "\./keyboards/$keyboard_name/[a-z0-9_\-]+/config.h")
+ do
+ subproject_name=$(printf $subproject | sed -r "s/\.\/keyboards\/${keyboard_name}\/([a-zA-Z0-9_\-]+).*/\1/g")
+ subproject_product_id=$(grep 'PRODUCT_ID' $subproject | \
+ tr -d '\n' | \
+ sed -r "s/.*(0x[a-fA-F0-9]+).*/\1/g")
+ product_id+=$(printf "%s: %s
" $subproject_name $subproject_product_id)
+ done
+ fi
+ device_ver=$(grep 'DEVICE_VER' $project | \
+ tr -d '\n' | \
+ sed -r "s/.*(0x[a-fA-F0-9]+).*/\1/g")
+ if [ -z $device_ver ]; then
+ for subproject in $(find . -regex "\./keyboards/$keyboard_name/[a-z0-9_\-]+/config.h")
+ do
+ subproject_name=$(printf $subproject | sed -r "s/\.\/keyboards\/${keyboard_name}\/([a-zA-Z0-9_\-]+).*/\1/g")
+ subproject_device_ver=$(grep 'DEVICE_VER' $subproject | \
+ tr -d '\n' | \
+ sed -r "s/.*(0x[a-fA-F0-9]+).*/\1/g")
+ device_ver+=$(printf "%s: %s
" $subproject_name $subproject_device_ver)
+ done
+ fi
+ printf "|%s|%s|%s|%s|\n" "$keyboard_name" "$vendor_id" "$product_id" "$device_ver" >> docs/keyboard_identifiers.md
+done
\ No newline at end of file