# Elpe, the universal package installer
Elpe is a package installer using ideas from immutable Linux
distributions ([Nix](https://nixos.org),
[Silverblue](https://silverblue.fedoraproject.org)) and also from
conventional distributions (such as [Debian](https://debian.org) and
[Ubuntu](https://ubuntu.com)) to create:
- Ephemeral shells in which packages from conventional distributions
are temporarily installed.
- Isolated build environments, with the aim of being reproducible.
- In the future, a different installer for Debian, Ubuntu and other
Linux distributions.
We chose different sides of the trade-offs faced by NixOS, Silverblue
or Docker:
- Bootstrapping: Elpe does not aim at bootstrapping an entire system,
and explicitly prefer packages from existing Linux distributions,
possibly mixing-and-matching multiple versions and even multiple
distributions. While bootstrapping (which NixOS does very well) is
fun and elegant, it also requires massive resources to guarantee
proper security and maintenance, especially on the lower-level parts
of the system.
- Description language: Elpe aims at describing an entire build
process or system configuration using deterministic, reproducible
code. The way Elpe achieves this is somewhere between Nix and
Docker, since base distribution packages (packages from Ubuntu and
Debian) are compiled using mostly unmodified upstream build systems,
saving a lot of effort to make them strictly reproducible. However,
your code is compiled in strict isolation, with only those packages
in scope.
## Security
This project is currently experimental and should not be used in
production. However, improved security is one of our main focuses of
this project. While day-to-day security is always a cat-and-mouse
game, we believe a few improvements in the overall processes can help:
- Defining builds as code running in isolation in a container gives an
explicit picture of a full process. Elpe shares this property with
Nix and Docker.
- Reproducibility is an important part of security, even though it is
far from the entire story. In particular, Elpe packages form a
Merkle tree of their dependencies, making it easy and fast to check
not only that a build recipe hasn't changed (like Nix), but also
that an output (the binary package) hasn't changed (like Ubuntu).
- Looking after the security of an entire package repository is
extremely hard. By outsourcing this task to conventional
distributions, we aim at making it possible to rely on an external
auditing providers. Elpe shares this property with Docker, but
unlike Docker, Elpe doesn't sacrifice the high reproducibility given
by Nix.
- Separation between your code and your distribution's code: the Elpe
language provides a function to download Ubuntu packages. However,
that function is designed to make it hard to modify anything from
the distribution. This allows to structure security audits in a
clearer way, since your code and build process (the part that only
*you* can audit) is hygienically separated from the distribution's
code and build process.
## Language design
Which software engineer doesn't dream of inventing the perfect
language? In Elpe, we acknowledge that doing that right is hard. We've
picked the only language we know that:
- Has an existing user base, industrial users, documentation and a
sound static type system. We've tried early prototypes in Haskell,
OCaml, Rust, Scala, TypeScript and Luau. Go was considered but the
type system is less of a safety net, making it less "playful" than
we wanted for a build system.
- Makes brain teasers unappealing. This is a fun feature of Nix, but
makes scaling harder and tends to please the wrong egos (this is
just a build system, after all). Haskell or TypeScript would have
been a lot of fun for different reasons. While learning Haskell is a
great way to improve your programming, this isn't the purpose of a
build system. Also, TypeScript's type checker can [run
Doom](https://www.youtube.com/watch?v=0mCsluv5FXA), which makes it
too easy to express types that are too complicated for a build
system.
- Extremely fast compilation, which rules out Rust, Haskell and
Scala.
- Bytecode compilation or an existing virtual machine embedding. Both
OCaml and Luau could work at this point.
- However, while both are capable of structural types (not all build
recipes have the exact same type) and late bindings (which we
absolutely want for "quick hacks", which Nix calls "overrides), only
OCaml also has nominal types, which are going to be extremely
helpful to implement strict typing of configuration options.
## Ready for scientific publications
Most scientific publications that involve code, in particular from
machine learning, tend to give instructions in terms of Ubuntu
packages. Elpe makes it easy to run them without having to translate
instructions.
## Contributing
Following the Debian manifesto as well as the goals of the Rust
project, we intend the Elpe community to be inclusive and open. To
that effect, we will enforce the [Citizen Code of
Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md).
If you are interested in helping, here is the current areas that need help:
- Fetchers. How do we import a package from a tarball given by a URL?
From Git?
- Interfaces with language package managers, in particular those
requiring network access: of particular interest are Rust and
OCaml, since they would allow us to bootstrap Elpe.
- Creating a better documentation tool. While there isn't much more
than a basic build system at the moment, creating documentation
processes that can scale to a larger system is a key area. If you
think you can build something at least as good as the ArchLinux Wiki
(really high bar), please send patches.
- Error handling. Currently, the system is made of a frontend (in
OCaml) and a backend (in Rust) exchanging over gRPC. While this
gives good modularity and a network-ready protocol with an explicit
specification, it also means that errors have lots of edge cases and
do not always translate well between languages.
- Using Elpe to create a reproducible bootable ISO from Ubuntu
packages. This is the first step towards building a full installer.
- A [Debconf](https://wiki.debian.org/debconf) interface. If you
already know Debconf, or are interested in learning it, please reach
out!
## What about the project's name?
Elpe is the English back-transliteration of the Franglaise
pronunciation of the English word «Help» (Franglaises quotes
intended), chosen as a symbol of transcental solidarity and a tribute
to our universal duty of always elping each other out.