├── .github ├── actions │ ├── Dockerfile │ └── entrypoint.sh └── workflows │ ├── release-fw.yml │ └── build-fw.yml ├── .gitignore ├── LICENSE └── README.md /.github/actions/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM qmkfm/qmk_cli 2 | 3 | COPY entrypoint.sh /entrypoint.sh 4 | ENTRYPOINT ["/entrypoint.sh"] 5 | 6 | # NOTE: When building locally (from this directory): 7 | # docker pull docker.io/qmkfm/qmk_cli 8 | # docker build -t "nullbitsco/firmware:latest" . && docker run nullbitsco/firmware 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | .DS_Store 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 nullbits co. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Latest precompiled firmware files for nullbits keyboards 2 | [![Nightly firmware build](https://github.com/nullbitsco/firmware/actions/workflows/build-fw.yml/badge.svg)](https://github.com/nullbitsco/firmware/actions/workflows/build-fw.yml) 3 | 4 | For use with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases). Follow the flashing guide [here](https://github.com/nullbitsco/docs/blob/main/firmware/firmware_flashing.md). 5 | # [Download link](https://github.com/nullbitsco/firmware/releases/tag/latest) or [RP2040/Bit-C PRO](https://github.com/nullbitsco/firmware/releases/tag/latest-rp2040) 6 | 7 | ### Looking for the source code instead? 8 | For those who want to compile along at home. 9 | [SNAP](https://github.com/qmk/qmk_firmware/tree/master/keyboards/nullbitsco/snap) [+RP2040](https://github.com/jaygreco/qmk_firmware/tree/rp2040_clean/keyboards/nullbitsco/snap) 10 | [NIBBLE](https://github.com/qmk/qmk_firmware/tree/master/keyboards/nullbitsco/nibble) [+RP2040](https://github.com/jaygreco/qmk_firmware/tree/rp2040_clean/keyboards/nullbitsco/nibble) 11 | [TIDBIT](https://github.com/qmk/qmk_firmware/tree/master/keyboards/nullbitsco/tidbit) [+Extras](https://github.com/nullbitsco/tidbit) [+RP2040](https://github.com/jaygreco/qmk_firmware/tree/rp2040_clean/keyboards/nullbitsco/tidbit) 12 | [SCRAMBLE](https://github.com/qmk/qmk_firmware/tree/master/keyboards/nullbitsco/scramble/v1) [+RP2040](https://github.com/qmk/qmk_firmware/tree/master/keyboards/nullbitsco/scramble/v2) 13 | -------------------------------------------------------------------------------- /.github/workflows/release-fw.yml: -------------------------------------------------------------------------------- 1 | name: "Build and release firmware" 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | releaseBody: 7 | description: 'Additional release text' 8 | default: "" 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | name: Build firmware 14 | steps: 15 | - name: Check out repository 16 | uses: actions/checkout@v4 17 | - name: Build in docker container 18 | id: docker_build 19 | uses: ./.github/actions/ 20 | - name: Archive artifacts 21 | uses: actions/upload-artifact@v4 22 | with: 23 | name: precompiled-firmware-files 24 | path: | 25 | qmk_firmware/nullbitsco_*.hex 26 | qmk_firmware/nullbitsco_*.uf2 27 | - name: Get current date 28 | id: date 29 | run: echo "date=$(date +'%m/%d/%Y')" >> $GITHUB_OUTPUT 30 | - name: Generate release text 31 | id: release_text 32 | run: > 33 | echo "release_text=$(echo 'Precompiled firmware files for nullbits keyboards

34 | Download a firmware file by expanding "Assets", right clicking, and choosing "Save File As" or "Save Link As". 35 |
${{ github.event.inputs.releaseBody }} 36 |
Released on ${{ steps.date.outputs.date }}. 37 |

${{ steps.docker_build.outputs.commits }}')" >> $GITHUB_OUTPUT 38 | - name: Create release (AVR) 39 | uses: ncipollo/release-action@v1 40 | with: 41 | artifacts: "qmk_firmware/nullbitsco_*.hex" 42 | allowUpdates: true 43 | artifactErrorsFailBuild: true 44 | body: ${{ steps.release_text.outputs.release_text }} 45 | tag: "latest" 46 | name: "Precompiled Firmware Files (AVR)" 47 | token: ${{ secrets.GITHUB_TOKEN }} 48 | removeArtifacts: true 49 | makeLatest: true 50 | - name: Create release (RP2040) 51 | uses: ncipollo/release-action@v1 52 | with: 53 | artifacts: "qmk_firmware/nullbitsco_*.uf2" 54 | allowUpdates: true 55 | artifactErrorsFailBuild: true 56 | body: ${{ steps.release_text.outputs.release_text }} 57 | tag: "latest-rp2040" 58 | name: "Precompiled Firmware Files (RP2040)" 59 | token: ${{ secrets.GITHUB_TOKEN }} 60 | removeArtifacts: true 61 | -------------------------------------------------------------------------------- /.github/actions/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -le 2 | 3 | GITHASH_STR="Commits used to build this release:
" 4 | 5 | append_githash_info () { 6 | GITHASH=$(git rev-parse HEAD) 7 | GITHASH_SHORT=$(echo "$GITHASH" | cut -c 1-7) 8 | GITNAME=$(basename "$(git rev-parse --show-toplevel)") 9 | [ -z "$1" ] || GITNAME=$1 10 | GITURL=$(git config --get remote.origin.url) 11 | GITHASH_STR="$GITHASH_STR $GITNAME: [$GITHASH_SHORT]($GITURL/commit/$GITHASH)
" 12 | } 13 | 14 | git clone --no-checkout https://github.com/qmk/qmk_firmware --depth 1 15 | 16 | cd qmk_firmware || exit 1 17 | git config core.sparsecheckout true 18 | echo '/*\n!/keyboards\n/keyboards/nullbitsco/*\n' > .git/info/sparse-checkout 19 | git checkout -- 20 | 21 | append_githash_info 22 | 23 | # Add tidbit extras repo 24 | cd keyboards/nullbitsco || exit 1 25 | git submodule add https://github.com/nullbitsco/tidbit tidbit_extras 26 | ln -s "$(realpath .)/tidbit_extras/keymaps/*" tidbit/keymaps 27 | 28 | cd tidbit_extras || exit 1 29 | append_githash_info 30 | cd ../ 31 | 32 | # Add holly repo 33 | git submodule add https://github.com/nullbitsco/holly holly 34 | 35 | cd holly || exit 1 36 | append_githash_info 37 | cd ../ 38 | 39 | # Set up QMK 40 | qmk setup -y 41 | 42 | # Add VIA userspace (must be done after QMK setup) 43 | cd / || exit 1 44 | git clone https://github.com/the-via/qmk_userspace_via 45 | qmk config user.overlay_dir="$(realpath qmk_userspace_via)" 46 | cd - 47 | 48 | # Compile upstream boards first 49 | qmk mass-compile -j "$(nproc)" \ 50 | nullbitsco/nibble:all nullbitsco/tidbit:all \ 51 | nullbitsco/scramble/v1:all nullbitsco/scramble/v2:all \ 52 | nullbitsco/snap:all nullbitsco/holly:via 53 | 54 | # Checkout nullbits rp2040 repo 55 | git config advice.detachedHead false 56 | git remote add nullbits https://github.com/jaygreco/qmk_firmware.git 57 | git fetch nullbits --depth=1 2> /dev/null 58 | git stash 59 | git checkout nullbits/rp2040_clean 60 | 61 | append_githash_info "qmk_firmware rp2040" 62 | 63 | # Update submodules after repo switch, but before checking out rp2040 SNAP 64 | cd ../../ 65 | make git-submodule 66 | 67 | # Compile for RP2040 68 | for t in nibble/rp2040 tidbit/rp2040 snap/rp2040; 69 | do echo "Building QMK for $t"; 70 | qmk compile -j "$(nproc)" -kb nullbitsco/$t -km all 71 | done 72 | 73 | echo "commits=$GITHASH_STR" >> "$GITHUB_OUTPUT" || true 74 | 75 | # If we made it this far without any hex or uf2 files, there's a problem 76 | ls *.hex 77 | ls *.uf2 78 | -------------------------------------------------------------------------------- /.github/workflows/build-fw.yml: -------------------------------------------------------------------------------- 1 | name: "Nightly firmware build" 2 | 3 | on: 4 | schedule: 5 | # * is a special character in YAML so you have to quote this string 6 | - cron: '11 6 * * *' 7 | workflow_dispatch: 8 | inputs: 9 | releaseBody: 10 | description: 'Additional release text' 11 | default: "" 12 | 13 | jobs: 14 | nightly_build: 15 | runs-on: ubuntu-latest 16 | name: Build firmware 17 | steps: 18 | - name: Check out repository 19 | uses: actions/checkout@v4 20 | - name: Build in docker container 21 | id: docker_build 22 | uses: ./.github/actions/ 23 | - name: Archive artifacts 24 | uses: actions/upload-artifact@v4 25 | with: 26 | name: precompiled-firmware-files 27 | path: | 28 | qmk_firmware/nullbitsco_*.hex 29 | qmk_firmware/nullbitsco_*.uf2 30 | - name: Get current date 31 | id: date 32 | run: echo "date=$(date +'%m/%d/%Y')" >> $GITHUB_OUTPUT 33 | - name: Generate release text 34 | id: release_text 35 | run: > 36 | echo "release_text=$(echo 'Nightly build outputs for nullbits keyboards. 37 | These files are always the most up-to-date but may contain unfixed bugs or other unreported issues! 38 | **It is highly recommended that you flash one of the [official releases](https://github.com/nullbitsco/firmware/releases/tag/latest) instead.** 39 |

${{ steps.docker_build.outputs.commits }}')" >> $GITHUB_OUTPUT 40 | - name: Create release (AVR) 41 | uses: ncipollo/release-action@v1 42 | with: 43 | artifacts: "qmk_firmware/nullbitsco_*.hex" 44 | allowUpdates: true 45 | artifactErrorsFailBuild: true 46 | body: ${{ steps.release_text.outputs.release_text }} 47 | tag: "nightly-avr" 48 | name: "Nightly AVR Build ${{ steps.date.outputs.date }}" 49 | token: ${{ secrets.GITHUB_TOKEN }} 50 | removeArtifacts: true 51 | - name: Create release (RP2040) 52 | uses: ncipollo/release-action@v1 53 | with: 54 | artifacts: "qmk_firmware/nullbitsco_*.uf2" 55 | allowUpdates: true 56 | artifactErrorsFailBuild: true 57 | body: ${{ steps.release_text.outputs.release_text }} 58 | tag: "nightly-rp2040" 59 | name: "Nightly RP2040 Build ${{ steps.date.outputs.date }}" 60 | token: ${{ secrets.GITHUB_TOKEN }} 61 | removeArtifacts: true 62 | --------------------------------------------------------------------------------