{"id":19643510,"url":"https://github.com/planktoscope/forklift","last_synced_at":"2025-08-08T01:16:44.386Z","repository":{"id":155574669,"uuid":"628439586","full_name":"PlanktoScope/forklift","owner":"PlanktoScope","description":"A configurable bill-of-materials (CBOM) system for declaratively composing and upgrading/downgrading your hardware-specific embedded Linux operating systems","archived":false,"fork":false,"pushed_at":"2025-08-04T22:27:47.000Z","size":2816,"stargazers_count":9,"open_issues_count":29,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-06T21:51:37.721Z","etag":null,"topics":["cli","continuous-delivery","declarative","docker","docker-compose","forklift","gitops","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PlanktoScope.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE-Apache","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-16T00:18:16.000Z","updated_at":"2025-07-30T15:09:55.000Z","dependencies_parsed_at":"2023-09-24T10:18:20.370Z","dependency_job_id":"28942c06-7892-446c-83fc-097b74e1b6a5","html_url":"https://github.com/PlanktoScope/forklift","commit_stats":null,"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/PlanktoScope/forklift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PlanktoScope%2Fforklift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PlanktoScope%2Fforklift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PlanktoScope%2Fforklift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PlanktoScope%2Fforklift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PlanktoScope","download_url":"https://codeload.github.com/PlanktoScope/forklift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PlanktoScope%2Fforklift/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269350642,"owners_count":24402428,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-07T02:00:09.698Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","continuous-delivery","declarative","docker","docker-compose","forklift","gitops","raspberry-pi"],"created_at":"2024-11-11T14:22:13.648Z","updated_at":"2025-08-08T01:16:44.352Z","avatar_url":"https://github.com/PlanktoScope.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cpicture\u003e\n  \u003csource\n    media=\"(prefers-color-scheme: dark)\"\n    srcset=\"https://github.com/PlanktoScope/forklift/assets/180370/a4317864-a75e-4717-99e5-402d07e109fb\"\n  \u003e\n  \u003csource\n    media=\"(prefers-color-scheme: light)\"\n    srcset=\"https://github.com/PlanktoScope/forklift/assets/180370/c915ca65-aabf-4721-894e-81f002100004\"\n  \u003e\n  \u003cimg\n    src=\"https://github.com/PlanktoScope/forklift/assets/180370/c915ca65-aabf-4721-894e-81f002100004\"\n    alt=\"Forklift logo\"\n    height=\"60\"\n  \u003e\n\u003c/picture\u003e\n\n\u003chr\u003e\n\nA configurable bill-of-materials (CBOM) system for declaratively composing and upgrading/downgrading\nyour hardware-specific embedded Linux operating systems.\n\nNote: this is still an experimental prototype in the sense that Forklift's architectural design and\ncommand-line interface may undergo significant backwards-incompatible simplifications. While\nForklift is already used in production as a lower-level implementation detail of the\n[PlanktoScope OS](https://docs.planktoscope.community/reference/software/architecture/os/)\nand is exposed to advanced users with a command-line interface for customization of PlanktoScope OS,\nany other use of Forklift is not yet officially documented or supported.\n\n## Introduction\n\nForklift is a software deployment and configuration system providing a simpler, easier, and safer\nmechanism for provisioning, updating, reconfiguring, recomposing, and extending browser apps,\nnetwork services, and system files on single-computer systems (such as a Raspberry Pi or a laptop).\nThe design of Forklift makes tradeoffs specific to the ways in which many open-source scientific\ninstruments need to be deployed and operated (e.g. intermittent internet access, independent\nadministration by individual people, decentralized management \u0026 customization). For a quick\nthree-minute overview of the motivation for Forklift and how it can be used, please refer to\nthis demo video: \u003chttps://www.youtube.com/watch?v=4lHh_NDlFKA\u003e\n\nFor open-hardware project developers, Forklift enables Linux-based devices and\n[appliances](https://en.wikipedia.org/wiki/Computer_appliance) (especially those based on the\nRaspberry Pi) to have the \"interesting\" parts of their software programs and configurations to be\nspecified, composed, deployed, and reversibly upgraded/downgraded as version-controlled changes to a\n[configurable bill-of-materials (CBOM)](https://en.wikipedia.org/wiki/Bill_of_materials#CBOM) of\nsoftware modules. The [PlanktoScope](https://www.planktoscope.org/), an open-source microscope for\nquantitative imaging of plankton, uses Forklift as low-level infrastructure for software\nreleases, deployment, and extensibility in the\n[PlanktoScope OS](https://docs.planktoscope.community/reference/software/architecture/os/), a\nhardware-specific operating system based on the Raspberry Pi OS; and Forklift was designed\nspecifically to solve the OS/software maintenance, customization, and operations challenges\nexperienced in the PlanktoScope project.\n\nFor end-users operating open-source instruments with application services (e.g. network APIs or\nbrowser-based interfaces) and/or system services (for e.g. data backups/transfer, hardware support,\ncomputer networking, monitoring, etc.), Forklift aims to provide an experience for installing,\nupdating, and uninstalling software and OS customizations similar what is achieved by app stores for\nmobile phones - but with more user control. Forklift also simplifies the process of keeping software\nup-to-date and the process of rolling software back to older versions if needed; this reduces the\nneed to (for example) re-flash a Raspberry Pi's SD card with a new OS image just to update the\napplication software running on the instrument while ensuring the validity of the resulting state of\nthe system.\n\nFor indie software developers and sysadmins familiar with DevOps and cloud-native patterns, Forklift\nis just a GitOps-inspired no-orchestrator system which is small and simple enough to work beyond the\ncloud - using Docker Compose to avoid the unnecessary architectural complexity and overhead of even\nminimal Kubernetes distributions like k0s for systems where a container workload orchestrator is\nunnecessary; and bundling app deployment with the deployment of system files, executables, and\nsystemd units from configuration files version-controlled in Git repositories. Thus, Forklift allows\nhassle-free management of software configurations on one or more machines with only occasional\ninternet access (or, in the future, no internet access at all!) and no specialized ops or platform\nteam.\n\nFor people who are Very Into Linux, Forklift is a way to bring a partial subset of the architectural\nbenefits of atomic/\"immutable\" OSes (such as\n[ChromeOS](https://www.chromium.org/chromium-os/chromiumos-design-docs/filesystem-autoupdate/),\n[Fedora Atomic Desktops](https://fedoraproject.org/atomic-desktops/),\n[Universal Blue](https://universal-blue.org/),\n[Fedora CoreOS](https://fedoraproject.org/coreos/)/[IoT](https://universal-blue.org/),\n[NixOS](https://nixos.org/), [Flatcar Container Linux](https://www.flatcar.org/),\n[GNOME OS](https://os.gnome.org/),\n[etc.](https://github.com/castrojo/awesome-immutable?tab=readme-ov-file#distributions)) into\nmore traditional non-atomic Linux distros (such as Raspberry Pi OS, Debian, etc.), by enabling\natomic, composable, and reprovisionable changes for a sufficiently-interesting subset of the OS. The\nspecific scope of what Forklift manages depends on how Forklift gets integrated with the OS, but\nForklift is intended to enable sysadmins to incrementally reduce reliance on system packages, and to\nincrementally reduce any responsibilities of the base OS beyond acting as a container host with\nhardware drivers (e.g. for Wi-Fi).\n\nTo learn more about the design of Forklift, please refer to\n[Forklift's design document](./docs/design.md).\n\n\n### Project Governance\n\nCurrently, design and development of Forklift prioritizes the needs of the PlanktoScope community\nand the PlanktoScope project's [values for its infrastructural software](./docs/design.md#values).\nThus, for now decisions will be made by the PlanktoScope software's lead maintainer (currently\n[@ethanjli](https://github.com/ethanjli)) as a \"benevolent dictator\"/\"mad scientist\" in consultation\nwith the PlanktoScope community in online meetings and discussion channels open to the entire\ncommunity. This will remain the governance model of Forklift while it's still an experimental tool\nand still only used for the standard/default version of the PlanktoScope's operating system, in\norder to ensure that Forklift develops in a cohesive way consistent with the values mentioned above\nand with intended use of Forklift for the PlanktoScope community. Once Forklift starts being used\nfor delivering/maintaining variants of the PlanktoScope's operating system, for integration of\nthird-party apps from the PlanktoScope community, or for software configuration by ordinary users,\nthen governance of the [github.com/PlanktoScope/forklift](https://github.com/PlanktoScope/forklift)\nrepository will transition from benevolent dictatorship into the PlanktoScope project's\n[consensus-based proposals process](https://github.com/PlanktoScope/proposals). In the meantime, we\nencourage anyone who is interested in using/adapting Forklift to fork this repository for\nexperimentation and/or to\n[create new discussion posts in this repository](https://github.com/PlanktoScope/forklift/discussions/new/choose),\nthough we can't make any guarantees about the stability of any APIs or about our capacity to address\nany external code contributions or feature requests.\n\nIf other projects beyond the PlanktoScope community decide to use Forklift as part of their software\ndelivery/deployment infrastructure, we can talk about expanding governance of Forklift beyond the\nPlanktoScope community - feel free to start a discussion in this repository's GitHub Discussions\nforum.\n\n## Usage\n\nFor a more guided demo showing off Forklift's capabilities, you can try out Forklift on a Raspberry\nPi or in a VM:\n\n- Raspberry Pi:\n  [github.com/ethanjli/rpi-forklift-demo](https://github.com/ethanjli/rpi-forklift-demo) provides an\n  SD card image of the Raspberry Pi OS with Forklift already integrated into it, so that Forklift\n  can be used to provision/update/deprovision Docker Compose apps as well as system config files,\n  scripts, and binaries in the `/etc` and `/usr` directories.\n- VM:\n  [github.com/ethanjli/ublue-forklift-sysext-demo](https://github.com/ethanjli/ublue-forklift-sysext-demo)\n  provides an ISO installer of [Bluefin](https://projectbluefin.io/) (i.e. a custom image of\n  [Fedora Silverblue](https://fedoraproject.org/atomic-desktops/silverblue/)) with Forklift already\n  integrated into it, so that Forklift can be used to provision/update/deprovision Docker Compose\n  apps as well as\n  [systemd system/configuration extensions](https://www.freedesktop.org/software/systemd/man/latest/systemd-sysext.html).\n\nIf you don't want to try out Forklift in either of the above ways, the below instructions will help\nyou to set up Forklift on your own system to Docker Compose apps on your system:\n\n### Download/install `forklift`\n\nFirst, you will need to download the `forklift` tool, which is available as a single self-contained\nexecutable file. You should visit this repository's\n[releases page](https://github.com/PlanktoScope/forklift/releases/latest) and download an archive\nfile for your platform and CPU architecture; for example, on a Raspberry Pi 4, you should probably\ndownload the archive named `forklift_{version number}_linux_arm64.tar.gz` (where the version number\nshould be substituted). You can extract the `forklift` binary from the archive using a command like:\n```\ntar -xzf forklift_{version number}_{os}_{cpu architecture}.tar.gz forklift\n```\n\nThen you may need to move the `forklift` binary into a directory in your system path, or you can\njust run the `forklift` binary in your current directory (in which case you should replace\n`forklift` with `./forklift` in the example commands listed below), or you can just run the\n`forklift` binary by its absolute/relative path (in which case you should replace `forklift` with\nthe absolute/relative path of the binary in the example commands listed below).\n\n### Deploy a published pallet\n\nTo deploy a particular version of a published pallet to your computer, you will need to clone a\npallet and stage it to be applied, and then you will need to apply the staged pallet. Pallets are\nidentified by the path of their Git repository and a version query (which can be a Git branch name,\na Git tag name, or an abbreviated or full Git commit hash). For example, the most recent commit on\nthe `main` branch of the\n[`github.com/forklift-run/pallet-example-minimal`](https://github.com/forklift-run/pallet-example-minimal)\ncan be identified as `github.com/forklift-run/pallet-example-minimal@main` - this is what we use in\nthe example commands in this section.\n\nIf you are running Docker in [rootless mode](https://docs.docker.com/engine/security/rootless/) or\nyour user is in\n[the `docker` group](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user):\n\n- If you want to apply the pallet immediately, you can run `forklift pallet switch --apply` with\nyour specified pallet. For example:\n\n  ```\n  forklift pallet switch --apply github.com/forklift-run/pallet-example-minimal@main\n  ```\n\n- If you want to apply the pallet later, you can first stage the pallet, and then later apply the\nstaged pallet using a separate `forklift stage apply` command. For example:\n\n  ```\n  # Run now:\n  forklift pallet switch github.com/forklift-run/pallet-example-minimal@main\n  # Run when you want to apply the pallet:\n  forklift stage apply\n  ```\n\nIf you aren't running Docker in rootless mode and your user isn't in a `docker` group, we recommend\na slightly different set of commands:\n\n- If you want to apply the pallet immediately, you can run\n`forklift pallet switch --cache-img=false` as a regular user, and then run `forklift stage apply` as\nroot; the `--cache-img=false` flag prevents `forklift pallet switch` from attempting to make Docker\npre-download all container images required by the pallet, as doing so would require root permissions\nfor Forklift to talk to Docker.\nFor example:\n\n  ```\n  forklift pallet switch --cache-img=false github.com/forklift-run/pallet-example-minimal@main\n  sudo -E forklift stage apply\n  ```\n\n- If you want to apply the pallet later, you can first stage the pallet and pre-download all\ncontainer images required by the pallet, and then later apply the staged pallet using a separate\n`forklift stage apply` command (which you can then run even when you don't have internet access).\nFor example:\n\n  ```\n  # Run now:\n  forklift pallet switch --cache-img=false github.com/forklift-run/pallet-example-minimal@main\n  sudo -E forklift stage cache-img\n  # Run when you want to apply the pallet:\n  sudo -E forklift stage apply\n  ```\n\nNote: in the above commands, you can replace `forklift pallet` with `forklift plt` if you want to\ntype fewer characters when running those commands.\n\n### Work on a development pallet\n\nFirst, you will need to make/download a pallet somewhere on your local file system. For example, you\ncan use `git` to clone the latest unstable version (on the `main` branch) of the\n[`github.com/forklift-run/pallet-example-minimal`](https://github.com/forklift-run/pallet-example-minimal) pallet using the command:\n\n```\ngit clone https://github.com/forklift-run/pallet-example-minimal\n```\n\nThen you will need to download/install the `forklift` tool (see instructions in the\n[\"Download/install forklift\"](#downloadinstall-forklift) section above). Once you have `forklift`,\nyou can run commands using the `dev plt` subcommand; if `forklift` is in your system path, you can\nsimply run commands within the directory containing your development pallet, or any subdirectory of\nit. For example, if your development pallet is at `/home/pi/dev/pallet-example-minimal`, you can run\nthe following commands to see some information about your development pallet:\n\n```\ncd /home/pi/dev/pallet-example-minimal\nforklift dev plt show\n```\n\nYou can also run the command from anywhere else on your filesystem by specifying the path of your\ndevelopment pallet. For example, if your forklift binary is in `/home/pi`, you can run any the\nfollowing sets of commands to see the same information about your development pallet:\n\n```\ncd /home/pi/\n./forklift dev --cwd ./dev/pallet-example-minimal plt show\n```\n\n```\ncd /etc/\n/home/pi/forklift dev --cwd /home/pi/dev/pallet-example-minimal plt show\n```\n\nYou can also use the `forklift dev plt require-repo` command to require additional Forklift\nrepositories for use in your development pallet, and/or to change the versions of Forklift\nrepositories already required by your development pallet.\n\nYou can also run commands like `forklift dev plt cache-all` and\n`forklift dev plt stage --cache-img=false` (with appropriate values in the `--cwd` flag if\nnecessary) to download the Forklift repositories specified by your development pallet into your\nlocal cache and stage your development pallet to be applied with `sudo -E forklift stage apply`.\nThis is useful if, for example, you want to make some experimental changes to your development\npallet and test them on your local machine before committing and pushing those changes onto GitHub.\n\nFinally, you can run the `forklift dev plt check` command to check the pallet for any problems, such\nas violations of resource constraints between package deployments.\n\nYou can also override cached repos with repos from your filesystem by specifying one or more\ndirectories containing one or more repos; then the repos in those directories will be used instead\nof the respective repos from the cache, regardless of repo version. For example:\n\n```\ncd /home/pi/\n/home/pi/forklift dev --cwd /home/pi/dev/pallet-example-minimal plt --repos /home/pi/forklift/dev/device-pkgs check\n```\n\n## Similar-ish projects\n\nThe following projects solve related problems with containers for application software, though they\nmake different trade-offs compared to Forklift:\n\n- [poco](https://github.com/shiwaforce/poco) enables Git-based management of Docker Compose projects\n  and collections (*catalogs*) of projects and repositories and provides some similar\n  functionalities to forklift.\n- [Terraform](https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs) (an early\n  inspiration for this project) has a Docker Provider which enables declarative management of Docker\n  hosts and Docker Swarms from a Terraform configuration.\n- [swarm-pack](https://github.com/swarm-pack/swarm-pack) (an early inspiration for this project)\n  uses collections of packages from user-specified Git repositories and enables templated\n  configuration of Docker Compose files, with imperative deployments of packages to a Docker Swarm.\n- [SwarmManagement](https://github.com/hansehe/SwarmManagement) uses a single YAML file for\n  declarative configuration of an entire Docker Swarm.\n- Podman [Quadlets](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) enable\n  management of containers, volumes, and networks using declarative systemd units\n- [FetchIt](https://github.com/containers/fetchit) enables Git-based management of containers in\n  Podman.\n- Projects developing [GitOps](https://www.gitops.tech/) tools such as ArgoCD, Flux, etc., store\n  container environment configurations as Git repositories but are generally designed for\n  Kubernetes.\n\nThe following projects solve related problems in composing and updating the base OS, though they\nmake different trade-offs compared to Forklift (especially because of the PlanktoScope project's\nlegacy software):\n\n- [Rugix](https://github.com/silitics/rugix) is a suite of low-level tools for building and updating\n  OS images, including support for the Raspberry Pi's official A/B-style `tryboot` mechanism for\n  OS updates.\n- [systemd-sysext and systemd-confext](https://www.freedesktop.org/software/systemd/man/latest/systemd-sysext.html)\n  provide a more structured/opinionated way (compared to Forklift) to atomically overlay system\n  files onto the base OS, but they not opinionated about (i.e. don't specify a way for)\n  distributing/provisioning published sysext/confext images, and they are not available on Raspberry\n  Pi OS 11 (bullseye), which until recently was a legacy-systems burden for the PlanktoScope OS.\n  Forklift can be used together with systemd-sysext/confext, as a way to download sysext/confext\n  images, constrain which images can be deployed together/separately, and manage which extension\n  images are available to systemd - see\n  [this demo](https://github.com/ethanjli/ublue-forklift-sysext-demo?tab=readme-ov-file#explanation).\n- systemd's [Portable Services](https://systemd.io/PORTABLE_SERVICES/) pattern and `portablectl`\n  tool provide a more structured/constrained/sandboxed way (compared to Forklift) to atomically add\n  system services, but they are only designed for self-contained system services. Forklift can\n  probably used together with systemd Portable Services, as a way to deploy published images onto an\n  OS.\n- [NixOS](https://nixos.org/) enables declarative specification of the entire configuration of the\n  system with atomic updates, but it requires learning a bespoke functional programming language and\n  is [rather complex](https://blog.wesleyac.com/posts/the-curse-of-nixos). Forklift is inspired by\n  some of NixOS's design decisions, and it attempts to provide a few of NixOS's benefits but in a\n  much more approachable, simple, and backwards-compatible system design by aggressively sacrificing\n  almost all of NixOS's theoretical rigor in favor of practical considerations.\n- The [bootc](https://containers.github.io/bootc/) project enables the entire operating system to be\n  delivered as a bootable OCI container image, but currently it relies on bootupd, which\n  [currently only works on RPM-based distros](https://github.com/coreos/bootupd/issues/468).\n  Forklift can be used together with bootc-based systems, as a way to manage Docker Compose apps\n  (and/or systemd sysexts/confexts) on the system.\n- [gokrazy](https://gokrazy.org/) enables atomic deployment of Go programs (and also of software\n  containers!), but it has a very different architecture compared to traditional Linux distros.\n\nThe following projects solve related problems in updating (but not in composing) the base OS, making\ndifferent trade-offs (especially in their need for OS maintainers or device operators to pay for or\nself-host a centralized management server - which is a non-starter for the PlanktoScope project)\ncompared to Forklift:\n\n- [OSTree](https://ostreedev.github.io/ostree/) enables atomic updates of the base OS, but\n  [it is not supported by Raspberry Pi OS](https://github.com/ostreedev/ostree/issues/2223), and\n  delivery of the OS requires operating a server to host OSTree repositories. Forklift can be used\n  together with OSTree-based systems, as a way to provision/replace/deprovision a layer of `/etc`\n  config files over (and independently of, or as a bypass for) OSTree's\n  [3-way merge mechanism for `/etc`](https://ostreedev.github.io/ostree/atomic-upgrades/#assembling-a-new-deployment-directory),\n  and as a way to manage Docker Compose apps running on the system.\n- [systemd-sysupdate](https://www.freedesktop.org/software/systemd/man/latest/systemd-sysupdate.html)\n  provides an image-based mechanism for updating the base OS, container images, and systemd-sysext\n  and systemd-confext images hosted at HTTP/HTTPS URLs. It solves many of the same problems that\n  Forklift attempts to solve, but with different priorities and thus different opinions.\n- [swupdate](https://github.com/sbabic/swupdate) and [RAUC](https://github.com/rauc/rauc) both\n  facilitate local A/B-style OS image updates as well as over-the-air (OTA) updates (when combined\n  with [hawkbit](https://eclipse.dev/hawkbit/) as a centralized management server, which then must\n  be hosted and operated somewhere).\n- [Mender](https://github.com/mendersoftware/mender) facilitates A/B-style OTA OS image updates for\n  fleets of embedded Linux devices and can be retrofitted onto non-atomic OSes (such as Debian), but\n  it requires a centralized management server (either as a paid service or self-hosted) for\n  distributing updates.\n\nOther related OS-level composition+update projects can be found at\n[github.com/castrojo/awesome-immutable](https://github.com/castrojo/awesome-immutable); other\nrelated embedded OS update projects can be found at\n\u003chttps://mkrak.org/wp-content/uploads/2018/04/FOSS-NORTH_2018_Software_Updates.pdf\u003e.\n\n## Licensing\n\nWe have chosen the following licenses in order to give away our work for free, so that you can\nfreely use it for whatever purposes you have, with minimal restrictions, while still protecting our\ndisclaimer that this work is provided without any warranties at all. If you're using this project,\nor if you have questions about the licenses, we'd love to hear from you - please start a new\ndiscussion thread in the \"Discussions\" tab of this repository on Github or email us at\n\u003clietk12@gmail.com\u003e .\n\n### Software\n\nExcept where otherwise indicated, source code provided here is covered by the following information:\n\n**Copyright Ethan Li and Forklift project contributors**\n\nSPDX-License-Identifier: `Apache-2.0 OR BlueOak-1.0.0`\n\nSoftware files in this repository are released under the\n[Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) and the\n[Blue Oak Model License 1.0.0](https://blueoakcouncil.org/license/1.0.0);\nyou can use the source code provided here either under the Apache License or under the\nBlue Oak Model License, and you get to decide which license you will agree to.\nWe are making the software available under the Apache license because it's\n[OSI-approved](https://writing.kemitchell.com/2019/05/05/Rely-on-OSI.html),\nbut we like the Blue Oak Model License more because it's easier to read and understand.\nPlease read and understand the licenses for the specific language governing permissions and\nlimitations.\n\n### Everything else\n\nExcept where otherwise indicated in this repository, any other files (such as images, media, data,\nand textual documentation) provided here not already covered by the software license (described\nabove) are instead covered by the following information:\n\n**Copyright Ethan Li and Forklift project contributors**\n\nSPDX-License-Identifier: `CC-BY-4.0`\n\nFiles in this project are released under the\n[Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).\nPlease read and understand the license for the specific language governing permissions and\nlimitations.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplanktoscope%2Fforklift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplanktoscope%2Fforklift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplanktoscope%2Fforklift/lists"}