Evyx
Local automation, as simple as a YAML file.
Routines you type over and over, packaged as small YAML actions you can install, inspect, and run from anywhere.
Small & tested - 52 tests · Python 3.11+ · one runtime dependency (PyYAML)
Table of Contents
- Why Evyx?
- Shell routines vs Evyx
- Installation
- Quick Start
- Key Features
- Action Reference
- When NOT to use Evyx
- Changelog
- Contributing
- License
Why Evyx?
I wrote Evyx because I kept running the same routines by hand: start the dev environment, check Docker, print system info. Aliases help, but they never follow you to a fresh machine, and Makefiles belong to projects, not to your day to day.
I wanted a handful of commands that behave the same everywhere I work: install a routine from a file, inspect it, run it. No framework, no daemon, no configuration file to edit. Just a YAML file and a CLI.
That's the idea behind Evyx: your routines, versioned like code, runnable like scripts.
Shell routines vs Evyx
A routine as shell one-liners (3 lines):
echo "Welcome $(whoami)!"
date "+%A %d %B %Y, %H:%M"
df -h / | tail -1
Same routine as an Evyx action (day-start.yml):
name: day-start
description: Morning startup routine
author: nytrox
steps:
- shell: echo "Welcome $(whoami)!"
- shell: date "+%A %d %B %Y, %H:%M"
- shell: df -h / | tail -1
evyx add day-start.yml
evyx day-start
One file, one command, and the same routine on any machine you install it on.
What you get out of the box:
- Installable routines:
evyx add <file>copies an action to~/.evyx/actions - Interactive variables:
{{name}}placeholders answered at run time - Action introspection:
evyx info <action>shows questions, steps, and plugins - Silent by default: logs only with
-d/--debug, errors always shown - Internationalized: English by default, French available via
EVYX_LANG=fr
Installation
# From source (before the PyPI release)
uv tool install --editable .
# or
pip install .
Requirements: Python 3.11+, PyYAML.
Quick Start
Create an action:
# hello.yml
name: hello
description: Demo action
author: nytrox
steps:
- shell: echo "Hello from Evyx"
Install and run it:
evyx add hello.yml
evyx hello
# and when you forget what you installed
evyx list
evyx info hello
evyx remove hello
Key Features
name: rust-dev
description: Prepare a Rust project (without creating anything)
author: nytrox
questions:
- name: project
question: Project name?
default: mon-crate
- name: type
question: Binary or library?
options: [binary, library]
steps:
- shell: echo "cargo new {{project}} --{{type}}"
- shell: echo "crate {{project}} ready"
$ evyx rust-dev
? Project name? [mon-crate] :
? Binary or library? [binary/library] :
- Questions & variables:
{{name}}placeholders in step commands, answered interactively before the action runs. Empty input falls back todefault, or to the firstoption. Invalid options are re-asked. - Validation at load time: an action referencing a variable with no matching question fails on
evyx add, not at run time. - Action details:
evyx info <action>shows the name, description, author, plugins, steps, and every question with its default and options. - Explicit run:
evyx run <action>andevyx <action>are equivalent; logs appear with-d/--debug. - Internationalization: messages come from bundled catalogs. The locale is detected via
EVYX_LANG, thenLC_ALL,LC_MESSAGES,LANG(git-like), and falls back to English. TryEVYX_LANG=fr evyx list.
Action Reference
| Key | Required | Description |
|---|---|---|
name |
yes | Identifier, [a-z0-9][a-z0-9._-]* |
description |
no | Shown in list and info |
author |
no | Shown in info |
steps |
yes | Non-empty list of step mappings |
questions |
no | List of questions, asked before the action runs |
Step keys:
| Key | Description |
|---|---|
shell |
The command to run. The only supported plugin today |
A plugin field is planned so steps can target other executors than shell.
Question keys:
| Key | Description |
|---|---|
name |
Variable name, [a-z][a-z0-9_]* |
question |
The text shown to the user |
default |
Fallback on empty input (string or number) |
options |
Non-empty list of allowed answers |
Variables: {{name}} in step commands is replaced by the answer to the question of the same name. Any reference
without a matching question is an error at load time.
When NOT to use Evyx
Evyx runs shell commands on your machine, on demand. It is not a scheduler.
- Scheduling: use cron, systemd timers, or launchd
- Remote orchestration: use Ansible, Fabric, or your deployment tooling
- CI/CD pipelines: GitHub Actions and friends run on servers, Evyx runs where you are
- Anything stateful: actions are plain shell steps; keep them idempotent and dependency-free
Everything else? Evyx has you covered.
Changelog
See CHANGELOG.md for a per-release history of changes.
Contributing
Contributions are welcome. Please read CONTRIBUTING.md before submitting a pull request.
- Bug reports : Open an issue
- Feature requests : Suggest an idea
- Pull requests : Follow the contribution guide
All contributors are expected to follow the Code of Conduct. Security issues should be reported privately, see SECURITY.md.
License
MIT License : see LICENSE for details.
AI
Evyx is human-led, AI-assisted. See AI.md for how AI tools are used in this project.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file evyx-0.1.0.tar.gz.
File metadata
- Download URL: evyx-0.1.0.tar.gz
- Upload date:
- Size: 49.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4498fe04588191733e12dfcc2330ae3b06517bfa79d899195f5302b68a26664
|
|
| MD5 |
065c7e42e7093f0bc79653b319d2f5aa
|
|
| BLAKE2b-256 |
7be0fb7800a91a0a8498e08abdcc1e30b6094eae2134d974deeba206d2185949
|
Provenance
The following attestation bundles were made for evyx-0.1.0.tar.gz:
Publisher:
publish.yml on NytroxDev/Evyx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evyx-0.1.0.tar.gz -
Subject digest:
e4498fe04588191733e12dfcc2330ae3b06517bfa79d899195f5302b68a26664 - Sigstore transparency entry: 2360170517
- Sigstore integration time:
-
Permalink:
NytroxDev/Evyx@786728a56a36b173bd52e6c82b44b1cd14cd789f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/NytroxDev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@786728a56a36b173bd52e6c82b44b1cd14cd789f -
Trigger Event:
release
-
Statement type:
File details
Details for the file evyx-0.1.0-py3-none-any.whl.
File metadata
- Download URL: evyx-0.1.0-py3-none-any.whl
- Upload date:
- Size: 16.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0af1d16d0713213d4db89756a772c924bf306573b44dd98cb6b4b19f6d33c85e
|
|
| MD5 |
c129b8fdfb3f669ab2c6817289b37efd
|
|
| BLAKE2b-256 |
23406f94e152ffa30d9fd91f2afcf4fb344e595607042494fb93a2bfd37ec9ef
|
Provenance
The following attestation bundles were made for evyx-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on NytroxDev/Evyx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evyx-0.1.0-py3-none-any.whl -
Subject digest:
0af1d16d0713213d4db89756a772c924bf306573b44dd98cb6b4b19f6d33c85e - Sigstore transparency entry: 2360170548
- Sigstore integration time:
-
Permalink:
NytroxDev/Evyx@786728a56a36b173bd52e6c82b44b1cd14cd789f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/NytroxDev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@786728a56a36b173bd52e6c82b44b1cd14cd789f -
Trigger Event:
release
-
Statement type: