Multiple USB File Flasher

Overview

Popsicle

Popsicle is a Linux utility for flashing multiple USB devices in parallel, written in Rust.

Build Dependencies

If building the GTK front end, you will be required to install the development dependencies for GTK, usually named libgtk-3-dev. No other dependencies are required to build the CLI or GTK front ends, besides Rust's cargo utility.

For those who need to vendor Cargo's crate dependencies which are fetched from Crates.io, you will need to install cargo-vendor, and then run make vendor.

Installation Instructions

A makefile is included for simply building and installing all required files into the system. You may either build both the CLI and GTK workspace, just the CLI workspace, or just the GTK workspace.

  • make cli && sudo make install-cli will build and install just the CLI workspace
  • make gtk && sudo make install-gtk will build and install just the GTK workspace
  • make && sudo make install will build and install both the CLI and GTK workspaces

Screenshots

Image Selection

Image Selection

Device Selection

Device Selection

The list will also dynamically refresh as devices are added and removed

GIF Demo

Device Flashing

Flashing Devices Flashing Devices

Summary

Summary

Comments
  • GTK Reflashing & Write Cancellation

    GTK Reflashing & Write Cancellation

    • libpopsicle was modified to enable early killing of the device flashing process
    • state is reset when switching back to the main view in popsicle-gtk
    • popsicle-gtk will revert back to the main view when:
      • Cancel is selected on the device flashing view
      • Back is selected on the summary view
    • popsicle-gtk GTK widgets are now Rc'd together

    Closes #51

    opened by mmstick 12
  • Build and distribute AppImage of Popsicle

    Build and distribute AppImage of Popsicle

    Providing an AppImage would have, among others, these advantages:

    • Applications packaged as an AppImage can run on many distributions (including Ubuntu, Fedora, openSUSE, CentOS, elementaryOS, Linux Mint, and others)
    • One app = one file = super simple for users: just download one AppImage file, make it executable, and run
    • No unpacking or installation necessary
    • No root needed
    • No system libraries changed
    • Works out of the box, no installation of runtimes needed
    • Optional desktop integration
    • Optional binary delta updates, e.g., for continuous builds (only download the binary diff) using AppImageUpdate
    • Can optionally sign your AppImages (inside the file) using gpg2
    • Works on Live ISOs
    • Can use the same AppImages when dual-booting multiple distributions
    • Can be listed in the AppImageHub central directory of available AppImages
    • Can double as a self-extracting compressed archive with the --appimage-extract parameter

    Here is an overview of projects that are already distributing upstream-provided, official AppImages.

    I've got a PR in preparation to build AppImages with appimagecraft. As a preparation for that PR, another PR is on the way, fixing the desktop entry you already have in this repository.

    opened by TheAssassin 7
  • Popsicle freezes when clicking next with image selected

    Popsicle freezes when clicking next with image selected

    Distribution (run cat /etc/os-release):

    aaronhoneycutt@pop-os:~/Downloads$ cat /etc/os-release NAME="Pop!_OS" VERSION="18.04 LTS" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Pop!_OS 18.04 LTS" VERSION_ID="18.04" HOME_URL="https://system76.com/pop" SUPPORT_URL="http://support.system76.com" BUG_REPORT_URL="https://github.com/pop-os/pop/issues" PRIVACY_POLICY_URL="https://system76.com/privacy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic

    Related Application and/or Package Version (run apt policy $PACKAGE NAME):

    aaronhoneycutt@pop-os:~/Downloads$ apt policy popsicle-gtk popsicle-gtk: Installed: 0.1.5~1530889767~18.04~2ba9db3 Candidate: 0.1.5~1530889767~18.04~2ba9db3 Version table: *** 0.1.5~1530889767~18.04~2ba9db3 1001 1001 http://ppa.launchpad.net/system76/pop/ubuntu bionic/main amd64 Packages 100 /var/lib/dpkg/status

    Issue/Bug Description:

    The application freezes after an image is selected and then clicking Next

    Steps to reproduce (if you know):

    Expected behavior:

    Other Notes:

    log.txt

    opened by ahoneybun 7
  • Cut new release

    Cut new release

    It looks like there's been a decent amount of development including fixes and translations since the 1.3.0 release: https://github.com/pop-os/popsicle/compare/1.3.0...master

    It'd be nice to have a new release with that for Flathub users. :smile: I can open a release PR shortly, assuming master builds as expected.

    opened by cassidyjames 6
  • Fix desktop entry

    Fix desktop entry

    The current desktop file contains one error (Categories is supposed to be a list, and all entries must be terminated by a semicolon), and one annoyance (the path in Exec doesn't have to be absolute). This PR fixes both issues.

    opened by TheAssassin 6
  • Writing image bigger than USB

    Writing image bigger than USB

    Distribution (run cat /etc/os-release): NAME="Pop!_OS" VERSION="18.04 LTS" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Pop!_OS 18.04 LTS" VERSION_ID="18.04" HOME_URL="https://system76.com/pop" SUPPORT_URL="http://support.system76.com" BUG_REPORT_URL="https://github.com/pop-os/pop/issues" PRIVACY_POLICY_URL="https://system76.com/privacy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic

    Related Application and/or Package Version (run apt policy $PACKAGE NAME): popsicle: Installed: 0.1.5~1526005323~18.04~9254724 Candidate: 0.1.5~1526005323~18.04~9254724 Version table: *** 0.1.5~1526005323~18.04~9254724 1001 1001 http://ppa.launchpad.net/system76/pop/ubuntu bionic/main amd64 Packages 100 /var/lib/dpkg/status

    Issue/Bug Description: Popsicle allows writing a bigger image than the capacity of the USB without warning the user.

    Expected behavior: A prompt should appear saying that this operation cannot be done since the size of the image is bigger than the USB.

    opened by BobyMCbobs 6
  • Wayland Support

    Wayland Support

    • Background threads will be created which will run authenticated tasks.
    • The main thread will use Linux syscalls to downgrade permissions.
    • A channel will be used to request information from the authenticated threads.

    This may fix the issue of launching Popsicle on a Wayland session. The main thread will initially spawn as root via pkexec or sudo, and will spawn background threads that will remain as root to perform authenticated tasks in the background. After spawning the background threads, permissions are downgraded back to a normal user before initializing GTK, and the UI will run entirely as a normal user.

    Fixes #16

    opened by mmstick 6
  • GTK App Fixes

    GTK App Fixes

    This PR will work to address all open issues regarding the GTK front end, and then some, with additional abstraction work to minimize the GTK work.

    • [x] Closes #18
    • [x] Closes #19
    • [x] Closes #20
    • [x] Closes #21
    • [x] Closes #23
    • [x] Closes #24
    • [x] Closes #25
    • [x] Closes #26
    opened by mmstick 6
  • Internal drive recognized as USB device

    Internal drive recognized as USB device

    Internal hard drive is being recognized as a usb device making the -a flag not work properly.

    Error message:

    unmounting '/dev/disk/by-path/pci-0000:00:14.0-usb-0:12:1.0-scsi-0:0:0:0': "/dev/sdc1" is mounted at "/media/[redacted]/Pop_OS 17.10 amd64"
    muff: error opening disk '/dev/disk/by-path/pci-0000:00:14.0-usb-0:14:1.0-scsi-0:0:0:0': No medium found (os error 123)
    

    Disks info of drive: disks

    Any idea why this is going on?

    opened by ahoneybun 6
  • popcicle start on it's own when using android platform tools.

    popcicle start on it's own when using android platform tools.

    It is a little bit annoying that popcicle start on it's own when using fastboot. especially when i just want to boot from a file and not flashing it. Could you make popcicle staying out of the way when using android platform tools. Plus I never installed it myself it must have come along with an update, ( I'm using popos ), I wasn't even aware of it untill it shows by itself. Sorry, I don't mean bad words, just annoyed.

    opened by abs0023 5
  • Flatpak version does not have a desktop file

    Flatpak version does not have a desktop file

    Distribution (run cat /etc/os-release):

    VERSION="20.10 (Groovy Gorilla)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 20.10"
    VERSION_ID="20.10"
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    VERSION_CODENAME=groovy
    UBUNTU_CODENAME=groovy
    

    Related Application and/or Package Version (run flatpak info com.system76.Popsicle):

    Popsicle - Flash multiple USB devices in parallel
    
              ID: com.system76.Popsicle
             Ref: app/com.system76.Popsicle/x86_64/stable
            Arch: x86_64
          Branch: stable
         Version: 1.2.0
         License: MIT
          Origin: flathub
      Collection: org.flathub.Stable
    Installation: system
       Installed: 2.7 MB
         Runtime: org.freedesktop.Platform/x86_64/19.08
             Sdk: org.freedesktop.Sdk/x86_64/19.08
    
          Commit: c0b17a95c21ef3c2a0f6adc76286ba85c6bb812e477ca2ce40550201ef8acf4a
          Parent: b15dc13a1eb4981a4e4bf197497e015407256607ee9f28e42e62c22ed232e2ca
         Subject: Set <icon> tag of appdata (a26e606e)
            Date: 2020-10-28 23:04:00 +0000
    

    Issue/Bug Description: Flatpak version of Popsicle does not have a desktop file. Therefore, it cannot be found in the application menu/grid and can only be run using flatpak run com.system76.Popsicle or by launching it from something like GNOME Software.

    Steps to reproduce (if you know):

    1. Install the Popsicle Flatpak
    2. Navigate to application menu/grid
    3. Try to find "USB Flasher" or "Popsicle"
    4. It does not exist

    Expected behavior: There should be a desktop file that shows up in the application menu/grid.

    Other Notes: I have restarted the system already but that did not do anything.

    bug confirmed 
    opened by TechnologyMan101 5
  • Auto-verify or auto-fill hash if a .sha256 file is in the same directory

    Auto-verify or auto-fill hash if a .sha256 file is in the same directory

    I'm not entirely sure if this is feasible, especially in the Flatpak sandbox, but a common way I use Popsicle is to flash an image from a download when I have a matching .sha256 file alongside the image. It would be handy if Popsicle could detect if that file exists and either automatically try to verify the image, or at least auto-fill the hash to be checked from the shasum file.

    opened by cassidyjames 2
  • GitHub Actions: Add Flatpak action

    GitHub Actions: Add Flatpak action

    This adds a GitHub Actions workflow to test the Flatpak build; this can ensure future changes don't break the Flatpak build. Requires a Flatpak manifest, e.g. from #187

    opened by cassidyjames 6
  • Generic

    Generic "USB Flasher" name shown in application launcher instead of "Popsicle"

    It's strange to me that Popsicle is branded "Popsicle" on GitHub and Flathub, but the resulting app that's installed is called "USB Flasher," making it non-obvious to find the app after installation. I presume this was done so the app installed on Pop!_OS would be more obvious, but it means people who have sought it out on Flathub have a worse experience. I would recommend:

    • Renaming consistently to "Popsicle USB Flasher" on Flathub and the .desktop file for consistency, or
    • Carrying a patched .desktop on Pop!_OS to show the generic name instead so people who install from Flathub get the expected app name
    opened by cassidyjames 4
  • Duplicator mode

    Duplicator mode

    We're using Popsicle at the Endless OS Foundation to make copies of drives used to install Flatpak'd learning apps in offline or limited connectivity deployments. Currently, our process looks like:

    1. Use flatpak create-usb to prepare one USB drive, which takes a lot of time due to downloading all the apps and dependencies, compressing them, and writing them to the drive.
    2. Create an .img of that drive
    3. Use Popsicle to copy that .img to several additional drives

    It could be handy to use Popsicle more like a disk duplicator, where it could read the contents of one drive and copy them bit-for-bit to additional drives, cutting out that middle step.

    feature request 
    opened by cassidyjames 4
  • Windows 10 Install

    Windows 10 Install

    Pop_OS! 22.04 the popsicle application does not install Windows 10. Popsicle leads to the galp3 getting a "press any key to boot from DVD.." followed by a return. Restoring image with gnome disks does not work, when Windows 10 installation starts it says can not locate media drivers. I suspect it is the file system.

    The installation ISO is over 4 gigabytes now, meaning that one has to be able to format it to the exFAT file system. Trying to do this without lollipop I tried sudo add-apt-repository universe sudo apt-install exfat-fuse Open the Gnome Disks application, format your USB to exFAT.

    I read online that I could copy and paste the ISO into the USB now but that does not work for me. I also tried Ventoy2Disk which I found interesting with it's Web interface but it does not format.

    opened by thomas992 0
Releases(1.3.1)
  • 1.3.1(Dec 5, 2022)

    What's Changed

    • fix: Embed icons in gresource to work with non-Pop icon theme by @ids1024 in https://github.com/pop-os/popsicle/pull/115
    • fix(cli): Fix checking by @ids1024 in https://github.com/pop-os/popsicle/pull/117
    • Add i18n support w/ Polish language support by @mmstick in https://github.com/pop-os/popsicle/pull/123
    • Add french translation by @Booteille in https://github.com/pop-os/popsicle/pull/124
    • i18n(nl): Add Dutch language support by @Vistaus in https://github.com/pop-os/popsicle/pull/125
    • i18n(ru): Add Russian translation by @Carmina16 in https://github.com/pop-os/popsicle/pull/126
    • i18n(es): Add Spanish translation by @fitojb in https://github.com/pop-os/popsicle/pull/127
    • i18n(pt_BR): Add Brazilian Portuguese translation by @zbed in https://github.com/pop-os/popsicle/pull/128
    • i18n(pt_BR): Add Brazilian Portuguese .desktop translations by @zbed in https://github.com/pop-os/popsicle/pull/129
    • i18n(pt-BR): Add Brazilian Portuguese CLI translation (+ fix dir name) by @zbed in https://github.com/pop-os/popsicle/pull/132
    • Add french translation to .desktop file by @Booteille in https://github.com/pop-os/popsicle/pull/130
    • Added translation for Done button by @francarotti in https://github.com/pop-os/popsicle/pull/140
    • i18n(bn): Translation Bangla by @Oymate in https://github.com/pop-os/popsicle/pull/133
    • Add support for AppImageUpdate by @TheAssassin in https://github.com/pop-os/popsicle/pull/141
    • i18n(hu): Add Hungarian translation by @girgunta in https://github.com/pop-os/popsicle/pull/142
    • i18n(sr): Add Serbian (Latin) translation by @AAnzel in https://github.com/pop-os/popsicle/pull/143
    • i18n(de): Add German translation by @raphipod in https://github.com/pop-os/popsicle/pull/144
    • A few UI tweaks by @ids1024 in https://github.com/pop-os/popsicle/pull/145
    • i18n(pt-BR): Add "flashing-completed-with-errors" translation by @francarotti in https://github.com/pop-os/popsicle/pull/146
    • i18n(hu): Typo and grammar fixes to Hungarian language support by @xTibor in https://github.com/pop-os/popsicle/pull/147
    • i18n(tr): Add Turkish translation by @alpkaanaksu in https://github.com/pop-os/popsicle/pull/148
    • improv(readme): Fix bad translation links. Add new translations. by @AAnzel in https://github.com/pop-os/popsicle/pull/151
    • i18n(kr): Add Korean translation. Needs additional overviews by @PolyPaul in https://github.com/pop-os/popsicle/pull/150
    • i18n(ca): Add Catalan translation by @Toomoch in https://github.com/pop-os/popsicle/pull/152
    • i18n(it): Add Italian language support by @ludovicobesana in https://github.com/pop-os/popsicle/pull/154
    • Updated parts of Turkish translation by @tunix in https://github.com/pop-os/popsicle/pull/153
    • i18n(it): Improvements to Italian language support by @ludovicobesana in https://github.com/pop-os/popsicle/pull/155
    • i18n(sl): Add Slovenian translation by @LinuxHeki in https://github.com/pop-os/popsicle/pull/158
    • i18n(it): Improvements to Italian language support by @ludovicobesana in https://github.com/pop-os/popsicle/pull/156
    • Add arm64 builds by @jackpot51 in https://github.com/pop-os/popsicle/pull/162
    • i18n(fi): Add Finnish translation by @pHamala in https://github.com/pop-os/popsicle/pull/163
    • [TRANSLATION] Swedish Translation by @hallonmunken in https://github.com/pop-os/popsicle/pull/164
    • Add support for sha1 by @LuckyTurtleDev in https://github.com/pop-os/popsicle/pull/168
    • Update gtk-rs to 0.15 by @ids1024 in https://github.com/pop-os/popsicle/pull/170
    • i18n(ja): Add Japanese translation by @pineapplehunter in https://github.com/pop-os/popsicle/pull/172
    • Add D-Bus dependency by @PTrottier in https://github.com/pop-os/popsicle/pull/173
    • i18n(sv): Added Swedish as an supported language in README. by @hallonmunken in https://github.com/pop-os/popsicle/pull/176
    • i18n(zh-CN): Add Chinese (Simplified) Translation by @hedw1gP in https://github.com/pop-os/popsicle/pull/178
    • i18n(cs): Add Czech translation by @YoriMirus in https://github.com/pop-os/popsicle/pull/185
    • Updating listed Supported Languages by @n3m0-22 in https://github.com/pop-os/popsicle/pull/186

    New Contributors

    • @Booteille made their first contribution in https://github.com/pop-os/popsicle/pull/124
    • @Vistaus made their first contribution in https://github.com/pop-os/popsicle/pull/125
    • @Carmina16 made their first contribution in https://github.com/pop-os/popsicle/pull/126
    • @fitojb made their first contribution in https://github.com/pop-os/popsicle/pull/127
    • @zbed made their first contribution in https://github.com/pop-os/popsicle/pull/128
    • @francarotti made their first contribution in https://github.com/pop-os/popsicle/pull/140
    • @Oymate made their first contribution in https://github.com/pop-os/popsicle/pull/133
    • @girgunta made their first contribution in https://github.com/pop-os/popsicle/pull/142
    • @AAnzel made their first contribution in https://github.com/pop-os/popsicle/pull/143
    • @raphipod made their first contribution in https://github.com/pop-os/popsicle/pull/144
    • @xTibor made their first contribution in https://github.com/pop-os/popsicle/pull/147
    • @alpkaanaksu made their first contribution in https://github.com/pop-os/popsicle/pull/148
    • @PolyPaul made their first contribution in https://github.com/pop-os/popsicle/pull/150
    • @Toomoch made their first contribution in https://github.com/pop-os/popsicle/pull/152
    • @ludovicobesana made their first contribution in https://github.com/pop-os/popsicle/pull/154
    • @tunix made their first contribution in https://github.com/pop-os/popsicle/pull/153
    • @LinuxHeki made their first contribution in https://github.com/pop-os/popsicle/pull/158
    • @pHamala made their first contribution in https://github.com/pop-os/popsicle/pull/163
    • @hallonmunken made their first contribution in https://github.com/pop-os/popsicle/pull/164
    • @LuckyTurtleDev made their first contribution in https://github.com/pop-os/popsicle/pull/168
    • @pineapplehunter made their first contribution in https://github.com/pop-os/popsicle/pull/172
    • @PTrottier made their first contribution in https://github.com/pop-os/popsicle/pull/173
    • @hedw1gP made their first contribution in https://github.com/pop-os/popsicle/pull/178
    • @YoriMirus made their first contribution in https://github.com/pop-os/popsicle/pull/185
    • @n3m0-22 made their first contribution in https://github.com/pop-os/popsicle/pull/186

    Full Changelog: https://github.com/pop-os/popsicle/compare/1.3.0...1.3.1

    Source code(tar.gz)
    Source code(zip)
    Popsicle_USB_Flasher-1.3.1-x86_64.AppImage(33.16 MB)
  • 1.3.0(Nov 6, 2020)

  • 1.2.0(Oct 28, 2020)

  • 1.1.0(Aug 3, 2020)

Owner
Pop!_OS
An Operating System by System76
Pop!_OS
Executes commands in response to file modifications

watchexec Software development often involves running the same commands over and over. Boring! watchexec is a simple, standalone tool that watches a p

null 3.6k Jan 1, 2023
A tool for quickly switching between different file configurations, using symbolic links.

config-loader A tool for quickly switching between different file configurations, using symbolic links. Usage To use it, download the latest release f

Zacchary Dempsey-Plante 3 Aug 22, 2022
Expose standard or fully custom USB peripherals (gadgets) through a USB device controller (UDC) on Linux using Rust.

usb-gadget This library allows implementation of USB peripherals, so called USB gadgets, on Linux devices that have a USB device controller (UDC). Bot

Sebastian Urban 21 Oct 30, 2023
Shows how to implement USB device on RP2040 in Rust, in a single file, with no hidden parts.

Rust RP2040 USB Device Example This is a worked example of implementing a USB device on the RP2040 microcontroller, in Rust. It is designed to be easy

Cliff L. Biffle 9 Dec 7, 2022
Cross-platform Rust wrappers for the USB ID Repository

usb-ids Cross-platform Rust wrappers for the USB ID Repository. This library bundles the USB ID database, allowing platforms other than Linux to query

William Woodruff 18 Dec 14, 2022
shavee is a Program to automatically decrypt and mount ZFS datasets using Yubikey HMAC as 2FA or any USB drive with support for PAM to auto mount home directories.

shavee is a simple program to decrypt and mount encrypted ZFS user home directories at login using Yubikey HMAC or a Simple USB drive as 2FA written in rust.

Ashutosh Verma 38 Dec 24, 2022
ESP32 implementation of RustZX Spectrum emulator for ESP32-USB-OTG

RustZX for ESP32 - experimental version Goal of the project: Run ZX Spectrum on ESP32 HW: ESP32 OTG USB with ST7789 display References Rust code for E

Juraj Michálek 22 Nov 9, 2022
Code for connecting an RP2040 to a Bosch BNO055 IMU and having the realtime orientation data be sent to the host machine via serial USB

Code for connecting an RP2040 (via Raspberry Pi Pico) to a Bosch BNO055 IMU (via an Adafruit breakout board) and having the realtime orientation data be sent to the host machine via serial USB.

Gerald Nash 3 Nov 4, 2022
A cross-platform serial port library in Rust. Provides a blocking I/O interface and port enumeration including USB device information.

Note: This is a fork of the original serialport-rs project on GitLab. Please note there have been some changes to both the supported targets and which

Serialport 128 Jan 4, 2023
Rust usb-device support for ATmega chips

atmega-usbd usb_device support for ATmega microcontrollers. NOTE: This is an experimental library, and certainly not production-ready. Expect bugs, an

Adam Gausmann 20 Jan 8, 2023
Rust client-side implementation of the rock usb protocol

Utility crates to interact with Rockchip devices Rockchip SoCs implement a custom USB protocol when starting in a special recovery mode (sometimes cal

Collabora 12 Mar 14, 2023
Tool and framework for securely reading untrusted USB mass storage devices.

usbsas is a free and open source (GPLv3) tool and framework for securely reading untrusted USB mass storage devices. Description Following the concept

CEA IT Security 250 Aug 16, 2023
A new pure-Rust library for cross-platform low-level access to USB devices.

nusb A new pure-Rust library for cross-platform low-level access to USB devices. Documentation Compared to rusb and libusb Pure Rust, no dependency on

Kevin Mehall 23 Oct 30, 2023
Download a file using multiple threads in parallel for faster download speeds.

multidl Download a file using multiple threads in parallel for faster download speeds. Uses 0 external dependencies. Usage Usage: multidl [--help] ADD

Divyanshu Agrawal 2 Sep 12, 2021
A Rust binary for file encryption to multiple participants.

Kaspa-miner A Rust binary for file encryption to multiple participants. Installation From Sources With Rust's package manager cargo, you can install k

Elichai Turkel 31 Dec 30, 2022
A command line tool for easily generating multiple versions of a configuration file from a single template

MultiConf A command line tool for easily generating multiple versions of a configuration file from a single template. Why? I'm a big fan of the i3 win

Ian Clarke 4 Dec 10, 2022
Set Shell Environment Variables across multiple shells with a single configuration file.

Xshe – Cross-Shell Environment Vars xshe allows for setting Shell Environment Variables across multiple shells with a single TOML configuration file.

Ethan Kinnear 9 Dec 16, 2022
Add image watermark for multiple file (jpeg, jpg, png, tiff, bmp,etc)

Rust image watermark Add image watermark CLI program for multiple image format (jpeg, jpg, png, tiff, bmp, etc.) manipulation, browser WASM build supp

Johnathan 5 Jan 20, 2023
This app reads a csv file and sends an email with a formatted Handlebars file.

Bulkmail This app reads a csv file and sends an email with a formatted Handlebars file. This can be run on Linux for AMD64 and ARMv7. Upstream Links D

Giovanni Bassi 17 Nov 3, 2022
A simple command-line utility (and Rust crate!) for converting from a conventional image file (e.g. a PNG file) into a pixel-art version constructed with emoji

EmojiPix This is a simple command-line utility (and Rust crate!) for converting from a conventional image file (e.g. a PNG file) into a pixel-art vers

Michael Milton 22 Dec 6, 2022