Automated installation and configuration system for Linux and Windows operating systems.
Genesis installs and configures software on new machines from a single package catalog shared by Linux and Windows:
- Packages: one JSON file per program, describing how to install it on each platform.
- Profiles: lists of packages for each kind of machine (
server,desktop,work,personal…), organised by levels. - Setups (Linux only): desktop environment and dotfiles configuration.
- Linux: Arch Linux, CachyOS, Debian, Ubuntu, Raspberry Pi OS
- Windows: PowerShell with Chocolatey
./linux/linux.sh install <distro> <profile>
./linux/linux.sh update
./linux/linux.sh setup <distro> <setup_type>
./linux/linux.sh add-distro <new_distro> "<base_command>"
./linux/linux.sh helppowershell -ExecutionPolicy Bypass -File .\windows\windows.ps1 install -Profile <profile>
powershell -ExecutionPolicy Bypass -File .\windows\windows.ps1 update
powershell -ExecutionPolicy Bypass -File .\windows\windows.ps1 helpBoth entrypoints show the selected options and ask for confirmation before running, print a summary at the end and save a log (see each guide).
Genesis/
├── packages/ # Package catalog shared by Linux and Windows (JSON)
├── profiles/ # Installation profiles
│ ├── linux/
│ └── windows/
├── schema/ # JSON Schema for package definitions
├── linux/ # Linux entrypoint, source code, statics and logs
│ ├── linux.sh
│ ├── src/
│ ├── statics/
│ └── logs/
├── windows/ # Windows entrypoint, source code and logs
│ ├── windows.ps1
│ ├── src/
│ └── logs/
└── docs/ # Detailed documentation
One JSON file per logical package in packages/, shared by Linux and Windows. The file name (without .json) is the name used in profiles and setup bundles.
The format is defined in package.schema.json. Editors that support JSON Schema validate each file through its $schema key.
{
"$schema": "../schema/package.schema.json",
"description": "Password manager (KeePassXC on Linux, KeePass on Windows)",
"install": {
"arch": { "pacman": "keepassxc" },
"cachyos": { "pacman": "keepassxc" },
"debian": { "flatpak": "org.keepassxc.KeePassXC" },
"ubuntu": { "flatpak": "org.keepassxc.KeePassXC" },
"raspberrypi": { "flatpak": "org.keepassxc.KeePassXC" },
"windows": { "choco": "keepass.install" }
}
}installhas one key per platform: the Linux distros in available_distros.txt andwindows.- Every platform is written explicitly, even when its entry is identical to another one.
- A platform that is not listed means the package is not available there: it is skipped and reported in the installation summary.
- Each platform entry has exactly one installation method.
| Method | Platforms | Runs |
|---|---|---|
pacman |
Linux | sudo pacman -Syu --noconfirm <pkgs> |
yay |
Linux | yay -Syu --noconfirm <pkgs> |
apt |
Linux | sudo apt install -y <pkgs> |
flatpak |
Linux | sudo flatpak install -y flathub <ids> |
choco |
Windows | choco install -y <pkgs> --ignore-checksums |
commands |
All | The listed commands in order (bash on Linux, PowerShell on Windows) |
manual |
All | Nothing: the URL is listed in the summary as a manual install |
Typed methods accept a single package ("pacman": "git") or several ("pacman": ["docker", "docker-compose"]), installed in one call.
Use commands when the installation needs more than one step:
"debian": {
"commands": [
"wget --content-disposition https://discord.com/api/download?platform=linux&format=deb",
"sudo apt install -y ./*.deb",
"rm ./*.deb"
]
}Use one logical name per tool, even when each platform installs a different product (keepass, docker, openvpn, gog). Keep separate packages only when they are different tools that can coexist or conflict (vscode and codeoss).
- Create
packages/<name>.jsonwith an entry for each platform where it can be installed. - Add
<name>to the profiles (docs/Profiles.md) or Linux setup bundles that need it.
- Profiles - Profile levels and
@includesyntax - Linux - Linux commands, setups and development guide
- Arch - Arch Linux and Hyprland notes
- Windows - Windows commands and manual configuration
See LICENSE file