├── .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 | [](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 |
--------------------------------------------------------------------------------