🏃♂️➡️📕 rundot
What is rundot?
rundot executes the code blocks in your markdown file, turning them into runbooks.
A runbook is just a normal markdown file that a person can read and write, but if you annotate a code block run, then rundot can execute the code blocks for you, helping you to automate tedious multi-step tasks.
Example runbook
Save this as hello.md:
---
title: Say hello
inputs:
- name: NAME
description: Who to say hello to
---
# Say hello
A runbook is just markdown. rundot runs the blocks marked `run`, shows the
`docstring` ones, and leaves everything else alone, like this paragraph.
## Greet
```docstring
Saying hello to <NAME>.
```
```sh run
echo "Hello, <NAME>!"
```
## Count the letters
```python run
import os
name = os.environ["NAME"]
print(f"{name} has {len(name)} letters")
```
Check it, then run it:
rundot check hello.md
rundot hello.md
The command check will validate the formatting of your Markdown file to make sure it will work with Rundot.
When running a runbook, rundot asks for the inputs, shows the plan, and runs each step in order.
You can run through each step one at a time with --step and even show the code that will run with each step with --show-code.
Your runbook library
Keep runbooks you use across projects in ~/runbooks, and run them by name from anywhere:
$ rundot library
library: /home/you/runbooks
rebuild-frontend Rebuild the frontend
update-project-deps Update a project's dependencies
$ cd ~/Projects/website
$ rundot rebuild-frontend
A book runs in the folder you're in, so one book works for every project. See Your runbook library.
Why use rundot?
Release steps get forgotten. Writing them down helps; making the written-down version run itself fixes it.
- It's just markdown - A runbook reads like documentation, renders on GitHub, and works fine without rundot.
- Check before you run -
rundot checkfinds broken frontmatter, undeclared placeholders and syntax errors. - See what would happen -
rundot --dry RELEASING.mdshows every command with its inputs filled in, and runs nothing. - Inputs and secrets - Ask for values once, check them against a pattern, and keep secrets off the screen and out of the log.
- Manual steps too -
confirmblocks pause for the things only a person can do. - A record of every run - An optional transcript keeps every command, its output and how it finished.
- More than shell - Shell and Python blocks are built in, and other languages can be added as backends.
Install
rundot is a command-line tool, so install it on its own rather than into a project:
uv tool install rundot
Or with pip:
pip install rundot
rundot needs Python 3.12 or later and bash, and runs on macOS and Linux. Windows isn't supported. It's for runbooks you run yourself, at a terminal; there's no CI mode.
Getting started
👉 Read the full documentation for the runbook format, every command, and writing your own backend.
See examples/ for more runbooks, including a real release, and PUBLISHING.md for the runbook rundot releases itself with.
Want to help? See CONTRIBUTING.md.
Metadata
Release files for rundot 0.6.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 | Provenance | Actions |
|---|---|---|---|---|
| rundot-0.6.0.tar.gz | 461.8 kB | Without provenance | Details for rundot-0.6.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| rundot-0.6.0-py3-none-any.whl | Python 3 | none | any | Details for rundot-0.6.0-py3-none-any.whl |
Total release size: 495.7 kB
Release files / rundot-0.6.0.tar.gz
| Download URL | rundot-0.6.0.tar.gz |
|---|---|
| Size | 461.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
373e4e0b9f9dd4f9242866dda2b31416cd2f1c4eb3c42fb58eeaac0facb787bf
|
|
BLAKE2b-256 checksum How to use checksums |
1c70db5240179aece5ff2a77a56494cc87ecefac7593cc30d6ca6e499f3c73eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / rundot-0.6.0-py3-none-any.whl
| Download URL | rundot-0.6.0-py3-none-any.whl |
|---|---|
| Size | 33.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b8d5f105ba8a023e5003c0641285fd452f919c9c3e75e6bcfa1b8eca0ce969ae
|
|
BLAKE2b-256 checksum How to use checksums |
61df801fb681ea624bbd83a9b3578f33c4f1244cb10f9c4d88785d203f758a08
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for rundot 0.6.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.