If you’re setting up your own Configurator, it’s likely that the reason for this is to test out your own keyboard firmware. The instructions below will explain how to do that.
It took me a lot of experimenting before I was able to get everything working. I wanted to avoid modifying any of the submodule files but found that some were unavoidable for various reasons.
The configurator pulls both the list of keyboard and the individual keyboard info/readme files from
There were two ways I could think of to get around this: point these URLs to pull from static files or create a custom API that returns this data. Since I was needing the flexibility to make frequent changes I chose the latter. Files are probably easier, though. In either case, the JSON served up to the configurator needs to mimic the structures that are returned by the real keyboards.qmk.fm
Code: Select all
{
"last_updated":"2022-09-07 23:57:46 GMT",
"keyboards":{
"converter/ibmpc_usb/teensy":{
"keyboard_name":"converter/ibmpc_usb/teensy",
"keyboard_folder":"converter/ibmpc_usb/teensy",
"layouts":{
"LAYOUT_fullkey":{
"layout":[
{"x":2.0,"y":0.0,"w":1.0,"label":"F13"},
{"x":3.0,"y":0.0,"w":1.0,"label":"F14"},
{"x":4.0,"y":0.0,"w":1.0,"label":"F15"},
{"x":5.0,"y":0.0,"w":1.0,"label":"F16"},
{"x":6.5,"y":0.0,"w":1.0,"label":"F17"},
{"x":7.5,"y":0.0,"w":1.0,"label":"F18"},
{"x":8.5,"y":0.0,"w":1.0,"label":"F19"},
{"x":9.5,"y":0.0,"w":1.0,"label":"F20"},
{"x":11.0,"y":0.0,"w":1.0,"label":"F21"},
{"x":12.0,"y":0.0,"w":1.0,"label":"F22"},
{"x":13.0,"y":0.0,"w":1.0,"label":"F23"},
{"x":14.0,"y":0.0,"w":1.0,"label":"F24"},
{"x":0.0,"y":1.0,"w":1.0,"label":"ESC"},
{"x":2.0,"y":1.0,"w":1.0,"label":"F1"},
{"x":3.0,"y":1.0,"w":1.0,"label":"F2"},
{"x":4.0,"y":1.0,"w":1.0,"label":"F3"},
{"x":5.0,"y":1.0,"w":1.0,"label":"F4"},
{"x":6.5,"y":1.0,"w":1.0,"label":"F5"},
{"x":7.5,"y":1.0,"w":1.0,"label":"F6"},
{"x":8.5,"y":1.0,"w":1.0,"label":"F7"},
{"x":9.5,"y":1.0,"w":1.0,"label":"F8"},
{"x":11.0,"y":1.0,"w":1.0,"label":"F9"},
{"x":12.0,"y":1.0,"w":1.0,"label":"F10"},
{"x":13.0,"y":1.0,"w":1.0,"label":"F11"},
{"x":14.0,"y":1.0,"w":1.0,"label":"F12"},
{"x":15.5,"y":1.0,"w":1.0,"label":"PSCR"},
{"x":16.5,"y":1.0,"w":1.0,"label":"SLCK"},
{"x":17.5,"y":1.0,"w":1.0,"label":"PAUS"},
{"x":20.0,"y":1.0,"w":1.0,"label":"VOLD"},
{"x":21.0,"y":1.0,"w":1.0,"label":"VOLU"},
{"x":22.0,"y":1.0,"w":1.0,"label":"MUTE"},
{"x":0.0,"y":2.5,"w":1.0,"label":"GRV"},
{"x":1.0,"y":2.5,"w":1.0,"label":"1"},
{"x":2.0,"y":2.5,"w":1.0,"label":"2"},
{"x":3.0,"y":2.5,"w":1.0,"label":"3"},
{"x":4.0,"y":2.5,"w":1.0,"label":"4"},
{"x":5.0,"y":2.5,"w":1.0,"label":"5"},
{"x":6.0,"y":2.5,"w":1.0,"label":"6"},
{"x":7.0,"y":2.5,"w":1.0,"label":"7"},
{"x":8.0,"y":2.5,"w":1.0,"label":"8"},
{"x":9.0,"y":2.5,"w":1.0,"label":"9"},
{"x":10.0,"y":2.5,"w":1.0,"label":"0"},
{"x":11.0,"y":2.5,"w":1.0,"label":"MINS"},
{"x":12.0,"y":2.5,"w":1.0,"label":"EQL"},
{"x":13.0,"y":2.5,"w":1.0,"label":"INT3"},
{"x":14.0,"y":2.5,"w":1.0,"label":"BSPC"},
{"x":15.5,"y":2.5,"w":1.0,"label":"INS"},
{"x":16.5,"y":2.5,"w":1.0,"label":"HOME"},
{"x":17.5,"y":2.5,"w":1.0,"label":"PGUP"},
{"x":19.0,"y":2.5,"w":1.0,"label":"NLCK"},
{"x":20.0,"y":2.5,"w":1.0,"label":"PSLS"},
{"x":21.0,"y":2.5,"w":1.0,"label":"PAST"},
{"x":22.0,"y":2.5,"w":1.0,"label":"PMNS"},
{"x":0.0,"y":3.5,"w":1.5,"label":"TAB"},
{"x":1.5,"y":3.5,"w":1.0,"label":"Q"},
{"x":2.5,"y":3.5,"w":1.0,"label":"W"},
{"x":3.5,"y":3.5,"w":1.0,"label":"E"},
{"x":4.5,"y":3.5,"w":1.0,"label":"R"},
{"x":5.5,"y":3.5,"w":1.0,"label":"T"},
{"x":6.5,"y":3.5,"w":1.0,"label":"Y"},
{"x":7.5,"y":3.5,"w":1.0,"label":"U"},
{"x":8.5,"y":3.5,"w":1.0,"label":"I"},
{"x":9.5,"y":3.5,"w":1.0,"label":"O"},
{"x":10.5,"y":3.5,"w":1.0,"label":"P"},
{"x":11.5,"y":3.5,"w":1.0,"label":"LBRC"},
{"x":12.5,"y":3.5,"w":1.0,"label":"RBRC"},
{"x":13.5,"y":3.5,"w":1.5,"label":"BSLS"},
{"x":15.5,"y":3.5,"w":1.0,"label":"DEL"},
{"x":16.5,"y":3.5,"w":1.0,"label":"END"},
{"x":17.5,"y":3.5,"w":1.0,"label":"PGDN"},
{"x":19.0,"y":3.5,"w":1.0,"label":"P7"},
{"x":20.0,"y":3.5,"w":1.0,"label":"P8"},
{"x":21.0,"y":3.5,"w":1.0,"label":"P9"},
{"x":22.0,"y":3.5,"w":1.0,"label":"PPLS"},
{"x":0.0,"y":4.5,"w":1.75,"label":"CAPS"},
{"x":1.75,"y":4.5,"w":1.0,"label":"A"},
{"x":2.75,"y":4.5,"w":1.0,"label":"S"},
{"x":3.75,"y":4.5,"w":1.0,"label":"D"},
{"x":4.75,"y":4.5,"w":1.0,"label":"F"},
{"x":5.75,"y":4.5,"w":1.0,"label":"G"},
{"x":6.75,"y":4.5,"w":1.0,"label":"H"},
{"x":7.75,"y":4.5,"w":1.0,"label":"J"},
{"x":8.75,"y":4.5,"w":1.0,"label":"K"},
{"x":9.75,"y":4.5,"w":1.0,"label":"L"},
{"x":10.75,"y":4.5,"w":1.0,"label":"SCLN"},
{"x":11.75,"y":4.5,"w":1.0,"label":"QUOT"},
{"x":12.75,"y":4.5,"w":1.0,"label":"NUHS"},
{"x":13.75,"y":4.5,"w":1.25,"label":"ENT"},
{"x":19.0,"y":4.5,"w":1.0,"label":"P4"},
{"x":20.0,"y":4.5,"w":1.0,"label":"P5"},
{"x":21.0,"y":4.5,"w":1.0,"label":"P6"},
{"x":22.0,"y":4.5,"w":1.0,"label":"PCMM"},
{"x":0.0,"y":5.5,"w":1.25,"label":"LSFT"},
{"x":1.25,"y":5.5,"w":1.0,"label":"NUBS"},
{"x":2.25,"y":5.5,"w":1.0,"label":"Z"},
{"x":3.25,"y":5.5,"w":1.0,"label":"X"},
{"x":4.25,"y":5.5,"w":1.0,"label":"C"},
{"x":5.25,"y":5.5,"w":1.0,"label":"V"},
{"x":6.25,"y":5.5,"w":1.0,"label":"B"},
{"x":7.25,"y":5.5,"w":1.0,"label":"N"},
{"x":8.25,"y":5.5,"w":1.0,"label":"M"},
{"x":9.25,"y":5.5,"w":1.0,"label":"COMM"},
{"x":10.25,"y":5.5,"w":1.0,"label":"DOT"},
{"x":11.25,"y":5.5,"w":1.0,"label":"SLSH"},
{"x":12.25,"y":5.5,"w":1.0,"label":"INT1"},
{"x":13.25,"y":5.5,"w":1.75,"label":"RSFT"},
{"x":16.5,"y":5.5,"w":1.0,"label":"UP"},
{"x":19.0,"y":5.5,"w":1.0,"label":"P1"},
{"x":20.0,"y":5.5,"w":1.0,"label":"P2"},
{"x":21.0,"y":5.5,"w":1.0,"label":"P3"},
{"x":22.0,"y":5.5,"w":1.0,"label":"PENT"},
{"x":0.0,"y":6.5,"w":1.25,"label":"LCTL"},
{"x":1.25,"y":6.5,"w":1.25,"label":"LGUI"},
{"x":2.5,"y":6.5,"w":1.25,"label":"LALT"},
{"x":3.75,"y":6.5,"w":1.25,"label":"INT5"},
{"x":5.0,"y":6.5,"w":2.75,"label":"SPC"},
{"x":7.75,"y":6.5,"w":1.25,"label":"INT4"},
{"x":9.0,"y":6.5,"w":1.25,"label":"INT2"},
{"x":10.25,"y":6.5,"w":1.25,"label":"RALT"},
{"x":11.5,"y":6.5,"w":1.25,"label":"RGUI"},
{"x":12.75,"y":6.5,"w":1.0,"label":"APP"},
{"x":13.75,"y":6.5,"w":1.25,"label":"LCTL"},
{"x":15.5,"y":6.5,"w":1.0,"label":"LEFT"},
{"x":16.5,"y":6.5,"w":1.0,"label":"DOWN"},
{"x":17.5,"y":6.5,"w":1.0,"label":"RGHT"},
{"x":19.0,"y":6.5,"w":2.0,"label":"P0"},
{"x":21.0,"y":6.5,"w":1.0,"label":"PDOT"},
{"x":22.0,"y":6.5,"w":1.0,"label":"PEQL"}
],
"filename":"keyboards/converter/ibmpc_usb/ibmpc_usb.h",
"c_macro":true
},
},
"maintainer":"qmk",
"manufacturer":"snacksthecat",
"url":"",
"usb":{
"vid":"0xFEED",
"pid":"0x6536",
"device_version":"1.0.0",
"device_ver":"0x0101"
},
"processor":"atmega32u4",
"processor_type":"avr",
"platform":"unknown",
"protocol":"LUFA",
"bootloader":"atmel-dfu",
"mouse_key":{
"enabled":true
},
"config_h_features":{
"bootmagic":false,
"mousekey":true,
"extrakey":true,
"console":true,
"command":true,
"nkro":true
},
"features":{
"bootmagic":false,
"mousekey":true,
"extrakey":true,
"console":true,
"command":true,
"nkro":true
},
"debounce":0,
"indicators":{
"caps_lock":"b6"
},
"tapping":{
"term":175
},
"matrix_size":{
"cols":16,
"rows":8
},
"split":{
"transport":{
"protocol":"i2c"
}
}
}
}
}
Your JSON files or APIs will need to be accessible following the URL patterns above. So If I wanted to serve up this JSON data from
Once I had my APIs setup, I added the necessary environment variable to the qmk_configurator Dockerfile so that it gets picked up by the constants declaration file