Fast and secure initramfs generator

Booster - fast and secure initramfs generator

Booster initramfs generator

Initramfs is a specially crafted small root filesystem that mounted at the early stages of Linux OS boot process. This initramfs among other things is responsible for unlocking encrypted partitions and mounting it as a root filesystem.

Booster is a tool to create such early boot images. Booster is made with speed and full disk encryption use-case in mind.

Booster advantages:

  • Fast image build time and fast boot time.
  • Out-of-box support for full disk encryption setup.
  • Clevis style data binding. The encrypted filesystem can be bound to TPM2 chip or to a network service. This helps to unlock the drive automatically but only if the TPM2/network service presents.
  • Easy to configure.
  • Automatic host configuration discovery. This helps to create minimalistic images specific for the current host.

There are other initramfs generators similar to booster: mkinitcpio and dracut.

Install

Arch Linux

Install booster-git package from AUR.

At the installation time this package will create a number of booster images in your /boot/ directory:

$ ls -lh /boot/booster-*.img
-rwxr-xr-x 1 root root 3.9M Dec 10 20:51 /boot/booster-linux.img

Or optionally the image can be generated manually as booster -o mybooster.img. Note that by default booster generates host specific images with minimum binaries needed for the current host. Providing -universal flag to booster tool will add more modules and tools and the result image will be bigger.

Once the image is generated it is time to configure the bootloader.

systemd-boot

Here is a sample entry for systemd-boot UEFI bootloader:

$ cat /boot/loader/entries/booster.conf
title Linux with Booster
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /booster-linux.img
options rd.luks.uuid=e122d09e-87a9-4b35-83f7-2592ef40cefa root=UUID=08684949-bcbb-47bb-1c17-089aaa59e17e rw

where e122d09e-87a9-4b35-83f7-2592ef40cefa is a UUID for the LUKS partition and 08684949-bcbb-47bb-1c17-089aaa59e17e is a UUID for the encrypted filesystem (e.g. ext4). Please refer for your bootloader documentation for more info about its configuration.

Configure

Booster generator has a number of configurable options.

Config file

First there is a configuration file located at /etc/booster.yaml. It has following fields:

network:
  dhcp: on
  ip: 10.0.2.15/24
  gateway: 10.0.2.255
  dns_servers: 192.168.1.1,8.8.8.8
universal: false
modules: nvidia,kernel/sound/usb/
compression: zstd
mount_timeout: 5m6s
extra_files: vim,/usr/share/vim/vim82/

network node, if presents, initializes network at the boot time. It is needed if mounting a root fs requires access to the network (e.g. in case of Tang binding). The network can be either configured dynamically with DHCPv4 or statically within this config. In the former case dhcp is set to on. In the latter case the config allows to specify ip - the machine IP address and its network mask, gateway - default gateway, dns_servers - comma-separated list of DNS servers.

universal is a boolean flag that tells booster to generate a universal image. By default booster generates a host-specific image that includes kernel modules used at the current host. For example if the host does not have a TPM2 chip then tpm modules are ignored. Universal image includes many kernel modules and tools that might be needed at a broad range of hardware configurations.

modules is a comma-separates list of extra modules to add to the generated image. One can use a module name or a path relative to the modules dir (/usr/lib/modules/$KERNEL_VERSION). If the path ends with slash symbol (/) then it considered a directory and all modules from this directory needs to be added recursively. booster also takes modules dependencies into account, all dependencies of the specified modules will be added to the image as well.

compression is a flag that specifies compression for the output initramfs file. Currently supported algorithms are "zstd", "gzip", "none". If no option specified then "zstd" is used as a default compression.

mount_timeout timeout for waiting for root filesystem to appear. The field format is a decimal number and then unit number. Valid units are "s", "m", "h". If no value specified then default timeout (3 minutes) is used. To disable the timeout completely specify "0s".

extra_files is a comma-separated list of extra files to add to the image. If an item starts with slash ("/") then it considered an absolute path. Otherwise it is a path relative to /usr/bin. If the item is a directory then its content is added recursively. A special case is busybox, adding it to the image enables emergency shell in case of a panic during the boot process.

Command-line arguments

booster accepts a list of arguments:

  • -universal generate a universal image
  • -kernelVersion use modules for the given kernel version. If the flag is not specified then the current kernel is used (as reported by uname -r).
  • -output output file, by default booster.img used
  • -compression output file compression. Currently supported compression algorithms are "zstd" (default) and "gzip".
  • -force overwrite output file if it exists

Kernel boot parameter

Some parts of booster boot functionality can be modified with kernel boot parameters. These parameters are usually set through bootloader config. Booster boot uses following kernel parameters:

  • root=($PATH|UUID=$UUID|LABEL=$LABEL) root device. It can be specified as a path to the block device (e.g. root=/dev/sda) or with filesystem UUID (e.g. root=UUID=fd59d06d-ffa8-473b-94f0-6584cb2b6665, pay atenntion that it does not contain any quotes) or with filesystem label (e.g. root=LABEL=rootlabel, pay attention that label does not contain any quotes or whitespaces).
  • rootfstype=$TYPE (e.g. rootfstype=ext4). By default booster tries to detect the root filesystem type. But if the autodetection does not work then this kernel parameter is useful. Also please file a ticket so we can improve the code that detects filetypes.
  • rootflags=$OPTIONS mount options for the root filesystem, e.g. rootflags=user_xattr,nobarrier.
  • rd.luks.uuid=$UUID UUID of the LUKS partition where the root partition is enclosed. booster will try to unlock this LUKS device.
  • rd.luks.name=$UUID=$NAME similar to rd.luks.uuid parameter but also specifies the name used for the LUKS device opening.
  • rd.luks.options=opt1,opt2 a comma-separated lists of LUKS flags. Supported options are discard, same-cpu-crypt, submit-from-crypt-cpus, no-read-workqueue, no-write-workqueue. Note that booster also supports LUKS v2 persistent flags stored with the partition metadata. Any command-line options are added on top of the persistent flags.
  • booster.debug=1 enable booster debug output. It is printed to console at the boot time. This feature might be useful to debug booster issues.

Build

The project consists of 3 components:

  • init binary that runs as a part of your machine boot process. It is going to be the very first user process run at your machine.
  • generator tool that creates ramfs image with all components needed to boot the computer
  • integration_tests tests that involve all components and use QEMU to boot from a generated image

These components use standard Golang tooling. To build any part do go build, to run tests do go test.

Run tests

cd {init,generator,integration_tests}
go test -v

Debugging

If you have a problem with booster boot tool you can enable debug mode to get more information about what is going on. Just add booster.debug=1 kernel parameter and booster provide additional logs.

Credits

Work on this project has been started as a part of Twitter's hack week. Huge thanks to my employer for its support of open-source development. Special thanks to Ian Brown.

Booster architecture has been inspired by Michael Stapelberg's project called distri. Initial version of booster borrowed a lot of ideas from the distri's initramfs generator.

Licence

See license

Owner
Comments
  • init exits with an exitcode 0x00000200

    init exits with an exitcode 0x00000200

    My first attempts to use Booster have ended with the following: https://forum.manjaro.org/uploads/default/original/3X/2/9/298163cc84c62c56803c0800295656180475e444.jpeg

    Init exits with an exitcode 0x00000200

    $ cat grub.cfg (clipped)
    
    menuentry "Manjaro Booster Test" {
              echo "Manjaro Booster Test booting..."
              insmod part_gpt
              insmod btrfs
              linux (hd0,gpt3)/@/boot/kernel8.img root=UUID=da0a03c1-016b-4782-824e-fe85ac1642c7 rw rootflags=defaults,ssd,compress-force=zstd,subvol=@ rootwait snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=0 console=serial0,115200 console=tty1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 kgdboc=serial0,115200 audit=0
              initrd (hd0,gpt3)/@/boot/booster.img
              boot
    }
    
    $ cat /etc/booster.yaml 
    network:
       interfaces: eth0
       dhcpd: on
    universal: false
    modules: -*,hid_apple,kernel/fs/btrfs/btrfs.ko,kernel/drivers/block/zram/zram.ko
    compression: zstd
    strip: false
    extra_files: mount,fsck,fsck.btrfs,btrfsck,btrfs,zramctl
    vconsole: true
    

    RPi4 + UEFI + grub + kernel 5.12.6-1-MANJARO-ARM aarch64

  • Kernel panic when trying to boot BTRFS+LUKS system (Arch Linux)

    Kernel panic when trying to boot BTRFS+LUKS system (Arch Linux)

    Hi, I was preparing a new machine and decided to give booster a try, since I wanted the system to be as minimal and as snappy as possible.. I've set it up as usual with the btrfs layout + luks and systemd as my bootloader choice.

    First issue when trying to boot after pacstrapping and preparing the system - kernel panic attempting to kill init - Initially I thought that maybe this is an issue with the setup or some weird hardware issue so decided to play around with the config, to maybe add some modules manually (btrfs for example) and try building host specific and universal images.. In all cases no matter the config I ended up with kernel panic..

    Running short on time I decided to try mkinitcpio and of course it booted as it always did no problems here.. This got me thinking that maybe this was due to some modules not being added and I needed a fully booted kernel to build a proper init image, this was unfortunately not the case.. Even when building images from a fully working workstation with every possible kernel and/or booster option did not yield a single proper boot.. So far for the last two or maybe even three days I did the following:

    • Tried creating image from arch-chroot when staging the machine - kernel panic
    • Tried creating image from fully working system booted with mkinitcpio (same configs, same or slightly modified boot profile for booster) - kernel panic
    • Tried playing around with all possible booster options, building host specific and universal image - kernel panic every time
    • Tried building the init image for different kernels available for Arch - Linux, Linux-lts, Linux-zen, Linux-TKG (custom build for my needs) - kernel panic every time

    So no matter what I try it always ends up the same way - kernel panic right after it tries to unlock my luks partition. I wonder if this might be related to the setup of luks, since I don't run with the "defaults" and have custom options for most of the parameters and unlocking the drive takes approx 30-35 seconds - maybe there's some race condition going on here (I will try to do some test by redoing the parameters, seeing if this solves the issue)? I am attaching a video I took when attempting to boot, apologies for crap quality..

    If there's anything else I can provide or test, please let me know as I'm very interested in not only trying to fix this, but run booster since I want (need) yubikey unlock for my luks drives.

    Cheers!

    https://imgur.com/a/2tTgjqo IMG_20220926_102229

  • Support for systemd-cryptenroll style pins (FIDO2, TPM)

    Support for systemd-cryptenroll style pins (FIDO2, TPM)

    The kernel parameter rd.luks.options=fido2-device=auto used for unlocking a disk through a keyslot enrolled in by systemd-cryptenroll with its FIDO2 functionality does not seem to be supported, but I have confirmed that it works with mkinitcpio and the sd-encrypt hook.

  • Predictable Network Interface Names lost in 0.8-1

    Predictable Network Interface Names lost in 0.8-1

    I have a server which after upgrading to booster 0.8-1 no longer provides Predictable Network Interface Names.

    When I downgrade to booster 0.7-3, the predictable network interface names are restored after reboot.

    With booster 0.8-1 the following confirms the legacy names are used even for /sys/class/net:

    $ ls -l /sys/class/net/
    total 0
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 eth0 -> ../../devices/pci0000:00/0000:00:14.0/net/eth0
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 eth1 -> ../../devices/pci0000:00/0000:00:03.0/0000:04:00.0/net/eth1
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 eth2 -> ../../devices/pci0000:00/0000:00:14.1/net/eth2
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 eth3 -> ../../devices/pci0000:00/0000:00:14.2/net/eth3
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 eth4 -> ../../devices/pci0000:00/0000:00:03.0/0000:04:00.1/net/eth4
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 eth5 -> ../../devices/pci0000:00/0000:00:14.3/net/eth5
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 lo -> ../../devices/virtual/net/lo
    lrwxrwxrwx 1 root root 0 Jun  1 13:35 wg0 -> ../../devices/virtual/net/wg0
    

    If we review say eth0:

    $ udevadm test-builtin net_id /sys/class/net/eth0
    Trying to open "/etc/systemd/hwdb/hwdb.bin"...
    Trying to open "/etc/udev/hwdb.bin"...
    Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
    Trying to open "/usr/lib/udev/hwdb.bin"...
    === trie on-disk ===
    tool version:          251
    file size:        11536726 bytes
    header size             80 bytes
    strings            2439094 bytes
    nodes              9097552 bytes
    Load module index
    Failed to read $container of PID 1, ignoring: Permission denied
    Found cgroup2 on /sys/fs/cgroup/, full unified hierarchy
    Found container virtualization none.
    Using default interface naming scheme 'v251'.
    Parsed configuration file "/usr/lib/systemd/network/99-default.link"
    Created link configuration context.
    ID_NET_NAMING_SCHEME=v251
    ID_NET_NAME_MAC=enx0cc47a3124d8
    eth0: MAC address identifier: hw_addr=0c:c4:7a:31:24:d8 โ†’ x0cc47a3124d8
    ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
    sd-device: Failed to chase symlinks in "/sys/devices/pci0000:00/0000:00:14.0/physfn".
    eth0: Parsing slot information from PCI device sysname "0000:00:14.0": success
    eth0: dev_port=0
    eth0: PCI path identifier: domain=0 bus=0 slot=20 func=0 phys_port= dev_port=0 โ†’ p0s20f0
    ID_NET_NAME_PATH=enp0s20f0
    Unload module index
    Unloaded link configuration context.
    
  • `booster: mount(efivarfs): no such device` when UEFI booting on Alpine Linux via QEMU

    `booster: mount(efivarfs): no such device` when UEFI booting on Alpine Linux via QEMU

    @anatol I am excited to have come across Booster, and pretty keen to use it for generating my initramfs; thanks for creating it! I hope it gains wide adoption in the various Linux distros.

    I initially tried getting it working on Arch Linux with a ZFS root file system. After beating my head against the wall for a few days I found #33, and realised it was never going to work ๐Ÿ˜„. So I switched over to XFS and was able to get the system to boot.

    I'm now trying to reproduce this in Alpine Linux. I've spent a fair amount of time over the last several days trying to get it working, but just can't seem to get it to work no matter what I do--even though it seems others have?

    If it helps I created a repo containing a (simplified) Packer template to build the QEMU images I'm using for testing with: https://github.com/111A5AB1/packer-alpine-booster

    It builds from Alpine Linux v3.15.4 "Extended" and "Virt" ISOs using edge repos; and installs the Booster package from Testing. Two additional Grub entries are also added to boot from Booster for the standard (lts/virt) and "edge" kernels.

    Summary:

    • Alpine Linux mkinitfs made initramfs boots fine (first two Grub entries).
    • Booster made initramfs with lts (extended)/virt (virt) kernels just hang after "Loading ramdisk ..." (no output even with Booster debug enabled)
      • Extended: 5.15.37-0-lts
      • Virt: 5.15.37-0-virt
    • Booster made initramfs with edge kernel appears to try and start booting, but fails very quickly with booster: mount(efivarfs): no such device.
      • Edge: 5.17.5.-0-edge (x86_64)

    In addition to the setup in the repo I've also tried combinations of making a Universal initramfs, adding modules and additional files, as well as using Booster built direct from main (master). I originally* tried to boot directly via EFI without a boot loader; I saw the same results of the "Booting intramfs" hang and "efivars" issue. I made one of the initramfs images with busybox+ls and confirmed an ls /sys/firmware/efi/efivars is empty--it seems Booster is maybe not mounting it for some reason ๐Ÿ˜ž?

    *Booting directly from EFI is my desired end goal; I dropped back to GRUB for testing since its the default/traditional Alpine installation via setup-alpine.

    Thanks very much in advance for pointing me in the right direction of how to get Alpine booting with Booster created initramfs images. Let me know if you need any more information or if there is anything you want me to try.

    Cheers!

  • Handle multiple rd.luks.name parameters

    Handle multiple rd.luks.name parameters

    my systemd-boot file.

    title Arch Linux linux /vmlinuz-linux-lts initrd /intel-ucode.img initrd /booster-lts.img options rd.luks.name=ab6d7d78-b816-4495-928d-766d6607035e=root rd.luks.name=7843d77f-cdd6-4289-a4de-a708c4aacede=swap rd.luks.name=7f28c723-fd6b-4640-bc94-9366edd8880d=cache root=UUID=e8e81fc3-8f81-4a3a-ac3d-aab36aa0c45f video=efifb:on add_efi_memmap zswap.enabled=1 zswap.max_pool_percent=100 zswap.zpool=z3fold resume=/dev/mapper/swap acpi=copy_dsdt rd.luks.options=tpm2-device=auto

    I get unknown value in rd.luks.options=tpm2-device=auto.

  • Initramfs with root partition using lvm and luks encryption fails to boot as its looking for a nonexistent kernel module

    Initramfs with root partition using lvm and luks encryption fails to boot as its looking for a nonexistent kernel module

    I'm trying to install arch linux using luks with lvm and booster for the initramfs. On boot I get the following error /usr/lib/modules/5.11.4-arch1-1/luks.ko I've had similar errors with both the lts and zen kernels as well.

    Any idea why I get these errors and how to fix them?

  • Unable to unlock LUKS: Unknown af hash algorithm: sha3-512

    Unable to unlock LUKS: Unknown af hash algorithm: sha3-512

    When trying to unlock my bootloader I get the error Unkown af hash algorithm: sha3-512.

    Here's my /etc/booster.yaml

    universal: true
    modules: amdgpu
    compression: zstd
    

    Here's my menuentry from /boot/EFI/refind/refind.conf

    menuentry "Arch Linux" {
        icon     /EFI/refind/themes/refind-dreary/icons/os_arch.png
        volume   Arch
        loader   /vmlinuz-linux
        initrd   /booster-linux.img
        options  "rd.luks.name=e4dca43a-21bd-4598-88fc-371dd20695a4=crypt root=/dev/mapper/crypt rootflags=subvol=@ rw quiet nmi_watchdog=0 kernel.unprivileged_userns_clone=0 net.core.bpf_jit_harden=2 apparmor=1 lsm=lockdown,yama,apparmor systemd.unified_cgroup_hierarchy=1 add_efi_memmap initrd=\amd-ucode.img"
        submenuentry "Boot - terminal" {
            add_options "systemd.unit=multi-user.target"
        }
    }
    

    When creating the initial LUKS encrypted partition I ran

    cryptsetup luksFormat --perf-no_read_workqueue --perf-no_write_workqueue --type luks2 --cipher aes-xts-plain64 --key-size 512 --iter-time 2000 --pbkdf argon2id --hash sha3-512 /dev/nvme0n1p2
    cryptsetup --allow-discards --perf-no_read_workqueue --perf-no_write_workqueue --persistent open /dev/nvme0n1p2 crypt
    
  • cannot load initram for linux5.15 on void linux

    cannot load initram for linux5.15 on void linux

    Now that I'm able to build it again, I tested 0.7 and it still stops at loading initram. Could you take a look at diffconfig at https://github.com/void-linux/void-packages/pull/33857 and see if you notice anything? I enabled booster.log=debug,console in the command line, and reconfigured grub and linux5.15, but it is still the same.

  • Unrecoverable failure in required component org.gnome.Shell.desktop

    Unrecoverable failure in required component org.gnome.Shell.desktop

    Trying booster in Arch with zen kernel - no config files. The boot process hangs when trying to enter gnome shell. I get

    gnome-session-binary[527]: Unrecoverable failure in required component org.gnome.Shell.desktop
    

    in the journal. It does not happen when I use images from mkinitcpio. I can provide further info upon request.

    EDIT: I realised that this is caused by not loading the amdgpu module. Same happens with mkinitcpio. However, if I include amdgpu to booster, it just does not boot.

  • runit warning: unable to open /dev/console: file does not exist

    runit warning: unable to open /dev/console: file does not exist

    After it prompts for LUKS password, just before entering stage 1, I see runit: warning: unable to open /dev/console: file does not exist

    If I add vconsole: true, then it says open /etc/vconsole.conf: no such file or directory, and the warning is still there, even though I have

    $ cat /etc/locale.conf
    LANG=en_US.UTF-8
    

    This is not blocking, but I'd like to understand the problem. Also, on an unrelated matter, could you comment on Void linux booster package PR? Thanks.

  • Fail to unlock LUKS by password

    Fail to unlock LUKS by password

    I'm booting Arch with a booster UKI bundled with sbctl (maybe this is causing the issue?) and have LVM on LUKS for root partition. Booster is asking for the passphrase but no matter what it always fails. imatge

    My password does not have any special character but I enabled vconsole anyway to see if it was a problem with the keymap, but the same. I've also tried to add a very simple password entry but it also fails. The LUKS partition is ok because I'm currently able to boot through a dracut image. I don't know if booster works on my machine bundling the image with a bootloader because I have an encrypted boot and it's a bit more complicated to configure anything that is not an UKI.

    This is the current config:

    enable_lvm: true
    strip: false
    universal: true
    mount_timeout: 1m
    vconsole: true
    extra_files: busybox,fsck,fsck.ext4
    

    EDIT: commands to generate the image:

    sudo booster build -f /boot/booster-linux.img
    sudo sbctl bundle -a /boot/amd-ucode.img -f /boot/booster-linux.img /efi/Linux/archlinux.efi
    

    and the content of /etc/kernel/cmdline which is sourced by sbctl:

    rd.luks.name=UUID=cryptolvm rd.luks.options=discard root=/dev/mapper/root rootfstype=ext4 rootflags=rw,relatime,data=ordered
    
  • Build error - key ** maps to multiple values

    Build error - key ** maps to multiple values

    Hello.

    I'm using Booster on Arch (kernel 6.1).

    I kept getting this error on build -

    2022/12/20 14:14:26 key wl maps to multiple values (kernel/drivers/net/wireless/wl.ko.zst,updates/dkms/wl.ko.zst)
    

    I kind of resolved this by deleting the DKMS kernel module.

    Now I'm getting this error, and I'm not sure why, since the two files mentioned in the error message point to the same file!

    2022/12/20 15:12:37 key regmap_i2c maps to multiple values (kernel/drivers/base/regmap/regmap-i2c.ko.zst,kernel/drivers/base/regmap/regmap-i2c.ko)
    

    To be clear, regmap-i2c.ko.zst exists, while there's no such file as regmap-i2c.ko at the location indicated.

    Any suggestions?

    Thanks!

  • Handle TPM2 + passphrase

    Handle TPM2 + passphrase

    A while ago systemd got support for TPM2 + passphrase setup: https://github.com/systemd/systemd/pull/22563

    It would be nice if booster supported unlocking such volumes as well

  • support for hooks

    support for hooks

    Is there any room to support hooks, as e.g. in mkinitcpio? The example I'm looking at is Asahi Linux, which recently introduced this mkinitcpio hook https://github.com/AsahiLinux/asahi-scripts/blob/main/initcpio/hooks/asahi It runs an update-vendor-firmware script during initramfs loading on Apple Silicon. I wonder if functions like run_earlyhook and run_latehook can be used with booster.

    Thanks.

  • SSH remote ZFS unlocking?

    SSH remote ZFS unlocking?

    Hello, this is not an issue but a question/request.

    Is there a way to enable SSH to remotely unlock an encrypted ZFS root at boot? I could not find any related documentation.

    Something like this dracut module but for booster: https://github.com/gsauthof/dracut-sshd

    Thanks

  • Generating images for custom built kernels

    Generating images for custom built kernels

    Hey there, I'm trying to use booster to use initramfs images for a custom built kernel that I built, and I wasn't successful...

    Does booster support that in the first place? If it does, how can I point it to the custom built kernel and its modules directory?

    Thanks!

A distributed unique ID generator of using Sonyflake and encoded by Base58

Indigo About A distributed unique ID generator of using Sonyflake and encoded by Base58. ID max length is 11 characters by unsigned int64 max value. A

Nov 24, 2022
:guardsman: A teeny tiny and somewhat opinionated generator for your next golang project

A Yeoman Golang Generator We are very sorry Gophers, but other names for the generator where taken, so we choose go-lang. But we have gocreate as an a

Sep 27, 2022
XSD (XML Schema Definition) parser and Go/C/Java/Rust/TypeScript code generator

xgen Introduction xgen is a library written in pure Go providing a set of functions that allow you to parse XSD (XML schema definition) files. This li

Jan 1, 2023
Go-sudoku - Sudoku generator and solver implementation in GoLang

go-sudoku An implementation of Sudoku generators and solvers in GoLang. Usage He

Nov 7, 2022
Random fake data generator written in go
Random fake data generator written in go

Gofakeit Random data generator written in go Features 160+ Functions!!! Concurrent Global Rand Struct Generator Custom Functions Http Server Command L

Jan 1, 2023
Unit tests generator for Go programming language
Unit tests generator for Go programming language

GoUnit GoUnit is a commandline tool that generates tests stubs based on source function or method signature. There are plugins for Vim Emacs Atom Subl

Jan 1, 2023
GObject-introspection based bindings generator

WARNING! This project is no longer maintained. Probably doesn't even compile. GObject-introspection based bindings generator for Go. Work in progress

Jan 5, 2022
Typo/error resilient, human-readable token generator

toktok A human-friendly token generator Creates tokens which avoid characters that can be easily misinterpreted, like '1' and 'I' or '8' and 'B', as w

Sep 16, 2022
Jennifer is a code generator for Go

Jennifer Jennifer is a code generator for Go. package main import ( "fmt" . "github.com/dave/jennifer/jen" ) func main() { f := NewFile("m

Dec 25, 2022
General Golang Code Generator

gg gg is a General Golang Code Generator: A Good Game to play with Golang. package main import ( "fmt" . "github.com/Xuanwo/gg" ) func main() {

Jan 7, 2023
Default godoc generator - make your first steps towards better code documentation

godoc-generate Overview godoc-generate is a simple command line tool that generates default godoc comments on all exported types, functions, consts an

Sep 14, 2022
accessor methods generator for Go programming language

accessory accessory is an accessor generator for Go programming language. What is accessory? Accessory is a tool that generates accessor methods from

Nov 15, 2022
RinkWorks fantasy name generator in golang

RinkWorks fantasy name generator in golang

Dec 25, 2022
Go Param Generator for golang

Go Param Generator Overview Generates struct's for you. No need to write it by hands Adds Getters and Setters Adds Constructor Easy to use Usage gopar

Dec 13, 2021
Model Generator for Firestore

volcago Automatically generate code used by Cloud Firestore. ๆ—ฅๆœฌ่ชžใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ Installation Recommend that you drop the binary from the release and use it. Al

Dec 6, 2022
Epub generator backend for mdBook

gomdbook2epub An EPUB generator backend for mdBook. Getting Started Install bina

Dec 17, 2021
Mongo-backed Static Site Generator for fun

MDBSSG MongoBacked SSG next: set up casbin middleware after: factor out common or large patterns in existing handlers after: refactor UserModel.CheckS

Feb 27, 2022
Giraffe - An opinionated static site generator written in Go

Giraffe: An opinionated static site generator I want to start 2022 by writing a

Nov 18, 2022
A static blog generator for telling tall tales

Gleeman Gleeman is a toy static blog generator that aims to be a simple way to tell tales. The term "gleeman" is taken from Robert Jordan's epic fanta

Jan 14, 2022