Turn your Go program(s) into an appliance running on the Raspberry Pi 3 or 4 (or on amd64 PCs!)

Build Status Go Report Card

Overview

gokrazy packs your Go application(s) into an SD card image for the Raspberry Pi 3 or 4 which — aside from the Linux kernel and proprietary Raspberry Pi bootloader — only contains Go software.

The motivation is that @stapelberg spends way more time on C software and their various issues than he would like. Hence, he is going Go-only where feasible.

Usage

Installation

Install the latest Go version if you haven’t already.

Create a directory for this gokrazy instance and initialize a Go module:

INSTANCE=gokrazy/hello
mkdir -p ~/${INSTANCE?}
cd ~/${INSTANCE?}
go mod init hello

Then, install gokr-packer:

go get github.com/gokrazy/tools/cmd/gokr-packer@latest

Overwriting an SD card for the Raspberry Pi 3 or 4

To re-partition and overwrite the SD card /dev/sdx, use:

gokr-packer -overwrite=/dev/sdx github.com/gokrazy/hello

Then, put the SD card into your Raspberry Pi 3 or 4 and power it up! Once the Raspberry Pi 3 or 4 has booted (takes about 10 seconds), you should be able to reach the gokrazy web interface at the URL which gokr-packer printed.

Under the hood, gokr-packer

  1. …packed the latest firmware and kernel binaries into the boot file system.

  2. …built the specified Go packages using go install and packed all their binaries into the /user directory of the root file system.

  3. …created a minimal gokrazy init program which supervises all binaries (i.e. restarts them when they exit).

Updating your installation

To update gokrazy, including the firmware and kernel binaries, use:

go get -u github.com/gokrazy/tools/cmd/gokr-packer
go get -u github.com/gokrazy/gokrazy
go get -u github.com/gokrazy/kernel
go get -u github.com/gokrazy/firmware
go get -u github.com/gokrazy/rpi-eeprom

To update your gokrazy installation (running on a Raspberry Pi 3 or 4), use:

GOKRAZY_UPDATE=http://gokrazy:mysecretpassword@gokrazy/ gokr-packer github.com/gokrazy/hello

SD card contents

gokrazy uses the following partition table:

num size purpose file system
1 100 MB boot (kernel+firmware) FAT16B
2 500 MB root2 (gokrazy+apps) SquashFS
3 500 MB root3 (gokrazy+apps) SquashFS
4 rest permanent data ext4

The two root partitions are used alternatingly (to avoid modifying the currently active file system) when updating.

If you’d like to store permanent data (i.e. data which will not be overwritten on the next update), you’ll need to create an ext4 file system on the last partition. If your SD card is /dev/sdx, use mkfs.ext4 /dev/sdx4. After you successfully created the new filesystem on the forth partition, gokrazy will automatically mount the filesystem under /perm during startup. Use this mount directory to store your permanent data.

Customization

Changing program behavior for gokrazy

gokr-packer sets the “gokrazy” build tag for conditional compilation.

You can find an example commit which implements a gokrazy-specific controller that triggers the main program logic every weekday at 10:00 at https://github.com/stapelberg/zkj-nas-tools/commit/6f90ace35981f78dcd66d611269f17f37ce4b4ef

Changing init behavior

Assuming the application you’d like to create on gokrazy lives in the repository github.com/stapelberg/mediaserver, this is how you can make gokrazy dump the generated init package’s source:

mkdir -p $(go env GOPATH)/src/github.com/stapelberg/mediaserver/cmd/init
gokr-packer \
  -overwrite_init=$(go env GOPATH)/src/github.com/stapelberg/mediaserver/cmd/init/init.go \
  github.com/gokrazy/hello

(Note that the package must result in a binary called “init”.)

Then, edit the github.com/stapelberg/mediaserver package to your liking. When done, pack an image with your own init package:

gokr-packer \
  -init_pkg=github.com/stapelberg/mediaserver/cmd/init \
  -overwrite=/dev/sdx \
  github.com/gokrazy/hello

Repository structure

Documentation

gokrazy.org uses hugo for creating and generating the website. You can find the hugo install instructions here: Install Hugo. With hugo you can write documentation in Markdown and generate a static website from it.

The website subdirectory is hugo’s root directory. In order to preview the documentation or to re-generate the website, switch the directory to website.

To preview the website, run the hugo webserver:

hugo serve

Generate the website:

hugo

The updated website content will be stored in the ./docs directory. Do not update anything here manually.

Comments
  • Support for the Raspberry Pi Zero 2 W

    Support for the Raspberry Pi Zero 2 W

    The Pi Zero 2 W comes with a 64-bit CPU, so we should be able to run upstream Linux and gokrazy on it!

    Possibly additional kernel patches and such are required, but subscribe to this issue to stay up to date on the progress.

    • [x] serial console
    • [x] ethernet dongle support
    • [x] unencrypted wifi support
      • [x] kernel patches: https://github.com/gokrazy/kernel/commit/b3ced18560eb6afcc51f71fe4abc412b2fc03916
      • [x] wifi tool patch: https://github.com/mdlayher/wifi/pull/37
    • [x] encrypted wifi support
      • [x] BCM43430/2 is now working, too, with the trial firmware from https://github.com/gokrazy/gokrazy/issues/96#issuecomment-1073227371
    • [x] integrated into gokrazy CI
      • [x] exempt encrypted wifi in bake
      • [x] physically mount Pi Zero 2 W (+ network adapter) and connect usb-to-serial adapter (serial FT59YCRV)
      • [x] configure new bakery in dr
    • [x] fully documented on https://gokrazy.org/platforms/

    related: https://github.com/gokrazy/kernel/issues/418

  • Bluetooth support

    Bluetooth support

    Platform

    I’m using:

    • [ ] gokrazy/rpi3b
    • [X] gokrazy/rpi3b+
    • [X] gokrazy/rpi02w
    • [ ] gokrazy/apu2c4
    • [ ] gokrazy/x86-64

    Observed behavior

    I installed github.com/joneskoo/ruuvi-prometheus which depends on Bluetooth hardware. It failed to start.

    After breaking glass, and looking at the kernel, it looks like Bluetooth is intentionally disabled.

    I could not find an option to disable serial console and enable Bluetooth instead. I know they can't be enabled at the same time on the hardware UART, possibly not at all.

    On Alpine Linux, I know I need to use bluez btattach to initialize the Bluetooth interface on serial port. Online, I saw pointers that it could be enabled without bluez using dts overlay: https://github.com/RoEdAl/alarm-bluetooth-raspberrypi

    Expected behavior

    Raspberry Pi 3B+ Bluetooth supported (as option)

  • SPI not available

    SPI not available

    Platform

    I’m using:

    • [ ] gokrazy/rpi3b
    • [x] gokrazy/rpi3b+
    • [ ] gokrazy/apu2c4
    • [ ] gokrazy/x86-64

    Observed behavior

    i've added to the config.txt in gokrazy/kernel the following lines

    dtparam=spi=on dtoverlay=spi-bcm2835

    also tried with dtoverlay=spi-bcm2708

    no spi devices are available /tmp/breakglass156884305 # ls -al /dev/sp* ls: /dev/sp*: No such file or directory

    also nothing in the kernel log /tmp/breakglass156884305 # dmesg | grep spi

    Expected behavior

    something along the lines like this in dmesg [ 4.813403] bcm2708_spi 20204000.spi: SPI Controller at 0x20204000 (irq 80)

    and the corresponding devices in /dev

  • web Interface link not working.

    web Interface link not working.

    Platform

    I’m using:

    • [ ] gokrazy/rpi3b
    • [+] gokrazy/rpi3b+
    • [ ] gokrazy/rpi4b
    • [ ] gokrazy/apu2c4
    • [ ] gokrazy/x86-64

    Observed behavior

    I succeded to build gokrazy app in sdcard, but the generated web interface link is not woking. When I open it it shows "invalid username/password"

    Expected behavior

    running web Interface link to control raspberry pi

  • running from OSX

    running from OSX

    just trying this out from OSX.

    Setcaps is not available, and it might be why the update to the SD card was refused ?

    using diskutil to make sure i hit the right disk :)

    x-MacBook-Pro:bin apple$ diskutil list
    /dev/disk0 (internal, physical):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *251.0 GB   disk0
       1:                        EFI EFI                     209.7 MB   disk0s1
       2:          Apple_CoreStorage Ohne Titel              250.1 GB   disk0s2
       3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
    
    /dev/disk1 (internal, virtual):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:                  Apple_HFS Ohne Titel             +249.8 GB   disk1
                                     Logical Volume on disk0s2
                                     3877FA65-5A90-469F-B4AD-0D12C262693B
                                     Unencrypted
    
    /dev/disk2 (internal, physical):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:     FDisk_partition_scheme                        *15.9 GB    disk2
       1:             Windows_FAT_16 RECOVERY                1.3 GB     disk2s1
       2:                      Linux                         33.6 MB    disk2s5
       3:             Windows_FAT_32 boot                    69.2 MB    disk2s6
       4:                      Linux                         14.6 GB    disk2s7
    
    x-MacBook-Pro:bin apple$ sudo setcap
    Password:
    sudo: setcap: command not found
    x-MacBook-Pro:bin apple$ sudo setcap
    sudo: setcap: command not found
    x-MacBook-Pro:bin apple$ go get github.com/gokrazy/hello
    x-MacBook-Pro:bin apple$ gokr-packer -overwrite=/dev/disk2 github.com/gokrazy/hello
    2017/05/01 17:05:17 packer.go:225: installing [github.com/gokrazy/hello]
    2017/05/01 17:05:18 gotool.go:60: getting incomplete packages [github.com/gokrazy/gokrazy/cmd/dhcp github.com/gokrazy/gokrazy/cmd/ntp]
    2017/05/01 17:05:34 packer.go:123: partitioning /dev/disk2
    2017/05/01 17:05:34 packer.go:285: open /dev/disk2: permission denied
    
    
  • command line arguments for a program

    command line arguments for a program

    Platform

    I’m using:

    • [ ] gokrazy/rpi3b
    • [X] gokrazy/rpi3b+
    • [ ] gokrazy/rpi4b
    • [ ] gokrazy/apu2c4
    • [ ] gokrazy/x86-64

    Observed behavior

    My application starts up using no command like arguments.

    Expected behavior

    I'd like a way to configure the arguments for the application.

    Maybe there's a way, and I've just not discovered it yet. I can convert to a config file, but that seems to require manual file management at this time? I'd prefer to be able to "just deploy" gokrazy and have my configuration work, without having to manually add files to the /perm filesystem.

  • go 1.8 does not work on raspbian

    go 1.8 does not work on raspbian

    I tried go 1.8.0 and 1.8.1 and it does not work with the same error message I am using raspbian on a raspberry pi 3 with Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux My second sd-card is not mounted and with no partition with 32GB. gokr-packer shows the following messages packer.go:225: installing [github.com/gokrazy/hello] packer.go:123: partitioning /dev/sda packer.go:285: invalid argument

  • authentication and transport layer security

    authentication and transport layer security

    This issue describes which authentication mechanisms and transport layer security configurations we’d like to support.

    num | TLS key source | listening IP | authentication | decision -------|-------------------|----------------|--------------------|-------- 1 | no TLS | private IPs | password | default 2 | self-signed | private+public | password | using -tls=self-signed 3 | self-signed | private+public | TLS client cert | if there’s interest 4 | user-supplied | private+public | password | using -tls=<path>[,<path>] 5 | user-supplied | private+public | TLS client cert | if there’s interest 6 | Let’s Encrypt | private+public | password | if there’s interest

    details:

    • for all password authentication scenarios, the password which is stored in ~/.config/gokrazy the first time an image is created
    • in scenario ①, we make the assumption that TLS is not necessary for wired connections (low risk of eavesdropping) or wireless connections (the wifi encryption is good enough)
    • in scenario ②, users need to add the self-signed certificate to their browser (we should have instructions) (skilled users could click away the security warning when the risk of MITM is low, but we shouldn’t encourage that behavior)
    • in scenario ④, we load combined PEM files, or keys/certs from separate files

    discarded approaches:

    • adding a self-signed certificate to the system certificate store (/etc/ssl/certificates) and/or browser-specific certificate stores (using certutil for chrome and firefox): browsers don’t pick up changes unless you cause them via their UI (see e.g. cr issue 489956#c18). Notably, on Fedora, this works better: ubuntu bug, debian bug — possibly we can revisit this approach in the future.
    • https://git.daplie.com/Daplie/localhost.daplie.me-certificates or similar (publicly available key material)
  • Raspberry Pi Zero 2 doesn't boot further than the

    Raspberry Pi Zero 2 doesn't boot further than the "rainbow screen"

    NOTE: This is very likely an issue at my end, but I didn't find a mailing list or forum to seek help.

    Platform

    I’m using the Raspberry Pi Zero 2

    Observed behavior

    Device boots to the "rainbow screen" on HDMI, but console doesn't come up

    Expected behavior

    Device boots further, and the kernel console log and/or the gokrazy hello program log is displayed on HDMI.

    Some notes:

    • Build with gokr-packer -serial_console disabled -overwrite /dev/disk4 github.com/gokrazy/hello on macOS and NixOS (/dev/sda).
    • SD-card seems to be fine; I mounted the EFI and root volumes in NixOS and listed the various directories.
    • The device boots https://seedsigner.com fine.
    • The device has had its radios (bluetooth/wifi) physically disabled.

    Also, the various documentation and tools says that only RPi 3+4 are supported, but https://github.com/gokrazy/gokrazy/issues/96 is completed. I assume Zero 2 is supported.

    Any pointers to debugging this issue is much appreciated.

  • Running gokrazy on unsupported devices / alternative kernels (32-bits arm - Raspberry Pi B for instance)

    Running gokrazy on unsupported devices / alternative kernels (32-bits arm - Raspberry Pi B for instance)

    Following #46, but as a new issue, since this is not related to camera support at all.

    This issue is not to be addressed by the maintainers of this repo, since they clearly stated, that they are not interested in supporting alternative kernels ("supporting" in the sense of having to do all the work).

    However @stapelberg indicated in https://github.com/gokrazy/gokrazy/issues/46#issuecomment-771793364

    Okay, if you want to maintain the raspberry pi foundation kernel, that’d be a good option for people I think.

    We can list your repository on https://gokrazy.org/platforms/ under a separate section.

    So the goal of this issue is to allow interested people to coordinate their efforts, to support alternative kernels inside gokrazy and document their findings, for them to be eventually officially documented (even without official support).


    @cweagans you mentioned that you were thinking about "taking this on". Were you able to find some time to start something with your raspberry pi zero?

    I would also really like to be able to use the gokrazy workflow with an old Raspberry Pi B (single go executable on top of the kernel), but will have to learn a lot about the linux kernel in the process.

  • Allow custom ports for gokrazy ui/api

    Allow custom ports for gokrazy ui/api

    Platform

    n/a

    Observed behavior

    gokrazy uses http:80 for it's own purposes. I'd like to use that for the bundled application.

    Expected behavior

    Specify custom port for created package, to be reused by updater.

    Would be happy to work on a PR.

  • Testing best practices

    Testing best practices

    I'm once more working on packaging https://evcc.io. One key challenge for me (Mac developer) ist user-testing the final application. Operating a Raspi, remote-updating etc. is too cumbersome for my taste. Are there best practices how I could practically test without a target device, maybe by running a packaged (if testing-only) gokrazy-enabled application inside Docker? I'd only be testing application logic, persistence and functionality of the bundled modules (e.g. breakglass), but obviously not Linux kernels etc.

  • Dynamic configuration with instance-centric redesign

    Dynamic configuration with instance-centric redesign

    Consider some, maybe typical, requirements for gokrazy applications:

    go install github.com/gokrazy/tools/cmd/gokr-packer@main
    
    mkdir -p flags/github.com/gokrazy/breakglass
    echo "-forward=private-network" > flags/github.com/gokrazy/breakglass/flags.txt
    
    mkdir -p flags/github.com/evcc-io/evcc
    echo "--sqlite /data/evcc.db" > flags/github.com/evcc-io/evcc/flags.txt
    
    mkdir -p buildflags/github.com/evcc-io/evcc
    echo "$(BUILD_TAGS),gokrazy" > buildflags/github.com/evcc-io/evcc/buildflags.txt
    echo "-ldflags=$(LD_FLAGS)" >> buildflags/github.com/evcc-io/evcc/buildflags.txt
    
    gokr-packer -overwrite=$(IMAGE_FILE) -target_storage_bytes=1258299392 $(IMAGE_OPTIONS)
    gzip -f $(IMAGE_FILE)
    

    Basically all config is static and would lend itself well to being part of the git repo. I'm currently creating the config dynamically for the following reasons:

    • config directory cannot be changed, i.e. tied to flags and buildflags which may not perfectly fit existing repo structure
    • with instance.centric redesign, where --instance_dir can be chosen, dynamic config (LD_FLAGS above) is the remaining problem as it would require updating the json file on each build (and hence not suitable to commit).

    Would it make sense to a allow a third option of configuration using per-package build arguments on the command line? Maybe something along the lines of

    gokr-packer/gok --build-flags "github.com/evcc-io/evcc=-ldflags=$(LD_FLAGS)" ...
    
  • “instance-centric” config re-design

    “instance-centric” config re-design

    I have been thinking a bit about how to improve the historically grown configuration surface of gokrazy.

    The result is a design document that you can find here:

    https://docs.google.com/document/d/1AUDmc8lygLR59O29Oc4ckv-Buk2R9zrvPDO9JbPOts8/edit?usp=sharing

    If you have any feedback or questions on these changes, please comment them here and I will modify the design as appropriate (if needed).

    Edit: a prototype now exists, see below. Here’s a rough list of milestones before I consider this effort done (we may merge a little earlier):

    • [x] transition interface (InternalCompatibilityFlags) to keep the gokr-packer binary working
    • [x] make package-specific configuration overrideable in config.json
    • [x] make host-specific configuration (~/.config/gokrazy/hosts/<host>) overrideable in config.json
    • [x] gok update subcommand
    • [x] gok overwrite subcommand
      • [ ] integration tests for gok overwrite, exercising the different parts of config.json
    • [x] gok new subcommand
    • [x] gok edit subcommand
    • [x] gok add subcommand
    • [ ] gok get subcommand for updates?
  • DHCP client started for non-existant eth0 on Pi Zero series

    DHCP client started for non-existant eth0 on Pi Zero series

    Platform

    I’m using:

    • [ ] gokrazy/rpi3b
    • [x] gokrazy/rpi3b+
    • [ ] gokrazy/rpi4b
    • [ ] gokrazy/apu2c4
    • [ ] gokrazy/x86-64
    • [x] gokrazy-community/rpi-zero

    Observed behavior

    The DHCP service is always set to autostart unless a dontstart.txt is explicitly provided for it. The Pi Zero series do not have a wired ethernet interface, therefor the process will constantly crash and restart.

    Expected behavior

    The DHCP service could see there is, in fact, no eth0, and exit cleanly. (Maybe wait a little bit in case the user actually plugged in a wired USB ethernet adapter)

  • shut down when pressing the power button

    shut down when pressing the power button

    Platform

    I’m using:

    • [ ] gokrazy/rpi3b
    • [ ] gokrazy/rpi3b+
    • [ ] gokrazy/rpi4b
    • [ ] gokrazy/apu2c4
    • [x] gokrazy/x86-64

    Observed behavior

    To turn off a PC running gokrazy, I need to hold the power button for 4 seconds.

    Expected behavior

    Ideally, gokrazy would shut down cleanly and quickly when I press the power button.

  • potential optimization: bandwidth-efficient updates using rsync

    potential optimization: bandwidth-efficient updates using rsync

    I don’t intend to work on this anytime soon, but I’m capturing the idea here in case others are more interested.

    Now that we have https://github.com/gokrazy/rsync, we can think of how to apply the rsync algorithm to gokrazy updates.

    gokrazy uses a SquashFS image for the root file system, and a FAT image for the boot file system.

    As we use SquashFS with file-level compression, even small differences within a file will likely mean that rsync needs to transfer the whole file. But, for updates where most files stay untouched, it is conceivable that rsync can re-use a lot of existing data.

    For devices on the local network, this optimization likely is not worth it bottom line. But if you have a remote device with slow internet connectivity, it might significantly speed up gokrazy updates. (Side note: if you are interested for quick updates for prototyping, note that the gok run command enables that workflow without updating the whole device.)

oci-ccm custom build for both arm64 and amd64

OCI Cloud Controller Manager (CCM) oci-cloud-controller-manager is a Kubernetes Cloud Controller Manager implementation (or out-of-tree cloud-provider

Jan 18, 2022
Turn a heterogeneous pile of text docs into a single web page with good search.
Turn a heterogeneous pile of text docs into a single web page with good search.

Codex Codex turns an unstructured pile of heterogeneous documents into a single interactive web document. Your input documents maybe in markdown, TeX,

Jan 2, 2022
Turn repo with markdown files into a nice looking blog

Chameleon Chameleon is web application (blog engine) that reflects content from markdown files from a git repository. Powers articles.orsinium.dev. Fe

Oct 30, 2022
quick debug program running in the k8s pod
quick debug program running in the k8s pod

quick-debug English | 中文 What Problem To Solve As the k8s becomes more and more popular, most projects are deployed in k8s, and so is the development

Apr 1, 2022
A long-running Go program that watches a Youtube playlist for new videos, and downloads them using yt-dlp or other preferred tool.

ytdlwatch A long-running Go program that watches a Youtube playlist for new videos, and downloads them using yt-dlp or other preferred tool. Ideal for

Jul 25, 2022
Running Go binary into Docker

This go file make a get into an API, that API provides a JSON with a cat information

Feb 7, 2022
Network scanner for Raspberry Pi
Network scanner for Raspberry Pi

╔═╗╦═╗╔═╗╦ ╠═╣╠╦╝╠═╝║ ╩ ╩╩╚═╩ ╩ Basic network scanner for Raspberry Pi Install Note: Prebuilt binaries (32-bit) doesn't require Go. Prereq

Jun 13, 2022
Raspberry Pi Archlinux Automated Offline Installer with Wi-Fi. Windows, Mac and more features coming.
Raspberry Pi Archlinux Automated Offline Installer with Wi-Fi. Windows, Mac and more features coming.

Raspberry Pi Archlinux Automated Installer with Wi-Fi. Windows, Mac and more features coming. Download Go to releases page and download the zip file f

Nov 22, 2022
[WIP] Cheap, portable and secure NAS based on the Raspberry Pi Zero - with encryption, backups, and more

PortaDisk - Affordable Raspberry Pi Portable & Secure NAS Project Project Status: Early work in progress. web-unlock is still not ready for production

Nov 23, 2022
Go bindings for Raspberry Pi PWM library for WS281X LEDs

go-rpi-ws281x golang binding for rpi_ws281x, userspace Raspberry Pi PWM library for WS281X LEDs. Supports any Raspberry and WS2812, SK6812RGB and SK68

Dec 30, 2022
Go binding for rpi-rgb-led-matrix an excellent C++ library to control RGB LED displays with Raspberry Pi GPIO.
Go binding for rpi-rgb-led-matrix an excellent C++ library to control RGB LED displays with Raspberry Pi GPIO.

go-rpi-rgb-led-matrix Go binding for rpi-rgb-led-matrix an excellent C++ library to control RGB LED displays with Raspberry Pi GPIO. This library incl

Dec 30, 2022
Serves images taken on a FLIR Lepton connected to a Raspberry Pi SPI port to over HTTP.

go-lepton Streams images taken on a FLIR Lepton connected to a Raspberry Pi SPI port to over via WebSockets via embedded HTTP server. It sends the raw

Oct 29, 2022
Capture the stream of Images for a Raspberry Pi Camera in GoLang

piCamera This package is a wrapper for the raspivid command on the Raspberry Pi. To make development easier on a PC, there is are different Start() me

Mar 5, 2022
k6-to-honeycomb is a program that sends k6 results into Honeycomb for visualization and analysis.
k6-to-honeycomb is a program that sends k6 results into Honeycomb for visualization and analysis.

k6-to-honeycomb k6-to-honeycomb is a program that sends k6 results into Honeycomb for visualization and analysis. Getting Started k6-to-honeycomb is a

Jul 14, 2022
A simple download file manager that sorts your files into your desired folders, This was meant to be a small project and nothing big.

GoDFM Simply go to the tags and download the .exe file (or compile it yourself by running go build). Add it to your environment paths by going to sett

Aug 9, 2022
Hexagonal architecture paradigms, such as dividing adapters into primary (driver) and secondary (driven)Hexagonal architecture paradigms, such as dividing adapters into primary (driver) and secondary (driven)

authorizer Architecture In this project, I tried to apply hexagonal architecture paradigms, such as dividing adapters into primary (driver) and second

Dec 7, 2021
Hot-swap Kubernetes clusters while keeping your microservices up and running.

Okra Okra is a Kubernetes controller and a set of CRDs which provide advanced multi-cluster appilcation rollout capabilities, such as canary deploymen

Nov 23, 2022
Cmsnr - cmsnr (pronounced "commissioner") is a lightweight framework for running OPA in a sidecar alongside your applications in Kubernetes.

cmsnr Description cmsnr (pronounced "commissioner") is a lightweight framework for running OPA in a sidecar alongside your applications in Kubernetes.

Jan 13, 2022
Output all versions of a local git repo, which could be used as test data for your ML program.

gitwalker Output all versions of a local git repo, which could be used as test data for your ML program. Notice This program is under development. Cur

Dec 27, 2021