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

Overview

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/[email protected]

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:[email protected]/ 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.

Issues
  • 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

    enhancement 
    opened by stapelberg 45
  • 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)

    enhancement help wanted 
    opened by joneskoo 32
  • 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

    opened by schubter 28
  • 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

    opened by jasserouni 17
  • 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
    
    
    opened by ghost 13
  • 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.

    enhancement 
    opened by adamcstephens 11
  • 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

    opened by Hollywood64 11
  • 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)
    opened by stapelberg 10
  • 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.

    enhancement help wanted 
    opened by oliverpool 9
  • 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.

    enhancement 
    opened by andig 8
  • Wifi setup fails due to `

    Wifi setup fails due to `"no interfaces found"`

    Platform

    I’m using:

    • [x] gokrazy/rpi3b (Raspberry Pi 3 Model B Rev 1.2)
    • [ ] gokrazy/rpi3b+
    • [x] gokrazy/rpi4b
    • [ ] gokrazy/apu2c4
    • [ ] gokrazy/x86-64

    On the software side everything should be up to date, i can also provide version numbers, just let me know which ones matter.

    Observed behavior

    When setting up the newly implemented Wifi setup the program gives the following output:

    1970/01/01 01:00:14 gokrazy: exit status 1
    1970/01/01 01:00:15 gokrazy: attempt 2, starting ["/user/wifi"]
    1970/01/01 01:00:15 no interfaces found
    1970/01/01 01:00:15 gokrazy: exit status 1
    1970/01/01 01:00:16 gokrazy: attempt 3, starting ["/user/wifi"]
    1970/01/01 01:00:16 no interfaces found
    1970/01/01 01:00:16 gokrazy: exit status 1
    2022/03/03 17:56:30 gokrazy: attempt 4, starting ["/user/wifi"]
    2022/03/03 17:56:30 no interfaces found
    2022/03/03 17:56:30 gokrazy: exit status 1
    2022/03/03 17:56:31 gokrazy: attempt 5, starting ["/user/wifi"]
    2022/03/03 17:56:31 no interfaces found
    2022/03/03 17:56:31 gokrazy: exit status 1
    2022/03/03 17:56:32 gokrazy: attempt 6, starting ["/user/wifi"]
    2022/03/03 17:56:32 no interfaces found
    2022/03/03 17:56:32 gokrazy: exit status 1
    2022/03/03 17:56:33 gokrazy: attempt 7, starting ["/user/wifi"]
    2022/03/03 17:56:33 no interfaces found
    2022/03/03 17:56:33 gokrazy: exit status 1
    [...]
    

    This issue was already described during the dev phase of the feature in Issue #13, but should have been fixed by a firmware update.

    Expected behavior

    The Wifi interface is found and correctly initialized with the given credentials/SSID.

    opened by christian-heusel 7
  • Require TLS when we know it's configured

    Require TLS when we know it's configured

    From gokrazy/breakglass#13.

    If we know from self signed keypair TLS is used, require TLS when connecting to prevent downgrade attacks.

    Secondly, if there's ways to use TLS without holding a keypair in host config, also start storing a state file to prevent downgrade.

    opened by joneskoo 1
  • 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.)

    enhancement 
    opened by stapelberg 0
  • Support for Odroid HC2

    Support for Odroid HC2

    I have Gokrazy operating on an Odroid HC2 and have been using it for 2-3 months now. I have a partially functional bootery setup going to continuously validate that the hardware works as expected and verify kernel upgrades (needs some change to how cmdline.txt gets updated for testboot - will bring that up once this issue is resolved).

    There are a couple of issues that needed to be solved:

    1. Support MBR-only partition table. This hardware has a weird booting scheme, loading bootloader blobs from fixed locations on disk (sectors 1-2048). That clobbers most of the GPT (everything after the primary header is overwritten) and I'm forced to switch back to MBR.
    2. Support for writing/updating bootloader blobs at arbitrary positions on the bootable block device.
    3. Add more entries to kernelGlobs list.

    The solutions I've come up with so far is:

    1. Allow kernel package to optionally emit a YAML manifest that describes any requirements for this kernel/device (like MBR-only partition table, custom kernel globs and listing extra blobs). See example.
    2. Support MBR-only partition table and parse that information from kernel manifest.
    3. Write bootloader binaries - changes to tools, gokrazy and updater. This change is not complete (only works for updates, not for initial image creation). Essentially, there's a new update endpoint (/update/blockdev) that will allow arbitrary writes to the block device. This is potentially dangerous and can seriously mess things up if there's a bug somewhere. An alternative would be to register a fixed set of named offsets and max lengths (like, bl1.bin being at offset 512 and of max length 15K, updatable via /update/bl1.bin).

    Let me know if folks have thoughts or suggestions or objections to anything above.

    To be clear, I'm not looking for someone to actually support gokrazy on this device (happy to do that myself) - I just want to avoid forks and go.mod replace directives in a bunch of places :)

    enhancement 
    opened by anupcshan 11
  • Add flag to gokr-packer to initialize perm partition

    Add flag to gokr-packer to initialize perm partition

    When I want to create the perm partition in a filesystem image I have to mount the loopback image and format it, this is a bit time consuming and requires me to sudo etc.

    As the offset and size is already known to gokr-packer it would be nice to suggest the mkfs.ext4 command to format it, or even run it under a flag.

    mkfs.ext4 has an -E offset= command specifically for preparing disk images.

    enhancement good-for-stream 
    opened by darkskiez 3
  • cmd/randomd: feed entropy pool

    cmd/randomd: feed entropy pool

    When randomd can't read from random.seed, it should instead loop 256 times in writing to the entropy pool. Linux counts all interrupts as increasing entropy in my experience.

    I'm also not sure about this, but the entropy struct according to the Linux specification uses c ints, which I assume is 32 bits in Linux.

    You might be passing a struct with 0 bits of entropy as read by the kernel.

    I personally use a bash script that runs

    nice cat /bin/* > /dev/random/

    opened by trafalmuffti 2
  • Support test-booting into updated root partition with fallback

    Support test-booting into updated root partition with fallback

    Observed behavior

    As part of https://github.com/gokrazy/gokrazy/issues/25 I've played with writing updates from custom update client. Using the sequence of:

    if err := target.StreamTo("root", rootReader); err != nil {
    	log.Fatalf("updating root file system: %v", err)
    }
    
    if err := target.Switch(); err != nil {
    	log.Fatalf("switching to non-active partition: %v", err)
    }
    
    if err := target.Reboot(); err != nil {
    	log.Fatalf("reboot: %v", err)
    }
    

    with an intentionally broken root fs (i.e. just the first 5MB), the device entered an endless reboot loop.

    Expected behaviour

    Invalid root caught and device switched back to other A/B partition to make device accessible again.

    enhancement good-for-stream 
    opened by andig 8
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

Manasseh Zhou 0 Jan 18, 2022
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,

Amir Kadivar 4 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

Life4 41 Apr 20, 2022
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

Alan Wang 13 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

Raine Virta 8 May 14, 2022
Network scanner for Raspberry Pi

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

PierreKieffer 40 Jun 13, 2022
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

Mansour Behabadi 10 May 29, 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

null 0 Dec 2, 2021
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

Máximo Cuadros 33 Mar 16, 2022
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

Máximo Cuadros 65 Jun 6, 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

M-A 23 Nov 26, 2021
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

Technomancers 28 Mar 5, 2022
Running Go binary into Docker

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

David Casado Masllorens 0 Feb 7, 2022
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

Travis Cline 2 Nov 19, 2021
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

null 2 Mar 1, 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

Renato Benatti 0 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

Yusuke Kuoka 43 Jun 13, 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.

John Hooks 4 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

zhuaiballl 0 Dec 27, 2021