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.
Metadata
Release files for evyx 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| evyx-0.1.0.tar.gz | 49.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| evyx-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 66.1 kB
Release files / evyx-0.1.0.tar.gz
| Download URL | evyx-0.1.0.tar.gz |
|---|---|
| Size | 49.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e4498fe04588191733e12dfcc2330ae3b06517bfa79d899195f5302b68a26664
|
|
BLAKE2b-256 checksum How to use checksums |
7be0fb7800a91a0a8498e08abdcc1e30b6094eae2134d974deeba206d2185949
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 6, 2026.
Transparency logRelease files / evyx-0.1.0-py3-none-any.whl
| Download URL | evyx-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0af1d16d0713213d4db89756a772c924bf306573b44dd98cb6b4b19f6d33c85e
|
|
BLAKE2b-256 checksum How to use checksums |
23406f94e152ffa30d9fd91f2afcf4fb344e595607042494fb93a2bfd37ec9ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 6, 2026.
Transparency log