Warrior-class bash script scheduler — friendly time formats, live dashboard, zero cron syntax.
Project description
bashron
Warrior-class bash script scheduler for your terminal — friendly time formats, live dashboard, zero cron syntax.
$ bashron add backup ~/scripts/backup.sh --at 9am
$ bashron
Source: github.com/shadowmornachAsia/Bashron
Install
Pick whichever Python tool you already use — all three install the same package from PyPI:
# uv (recommended — fastest, zero-setup)
uv tool install bashron
# pipx (isolated, great for CLI tools)
pipx install bashron
# plain pip
pip install bashron
Install straight from the git repo (latest main):
uv tool install git+https://github.com/shadowmornachAsia/Bashron
# or
pipx install git+https://github.com/shadowmornachAsia/Bashron
Verify it worked:
bashron --version
bashron doctor
Quickstart — verify it works
After installing, run this to confirm everything is working:
# 1. Check your system is ready
bashron doctor
# 2. Scaffold a hello-world script in one command
bashron new hello --at 9am
# 3. Run it right now (ignores the schedule)
bashron run hello
# 4. Check the output
bashron logs hello
You should see:
Hello from bashron!
bashron is installed and working.
Script ran at: <current date/time>
Clean up when done:
bashron remove hello
Test all features
If you want to exercise every command after installing:
# Interactive wizard — guided job setup
bashron init
# Scaffold a new script and schedule it in one step
bashron new my-task --dir ~/scripts --at 09:00
# Live dashboard — next run, last run, exit code
bashron status
# Export your jobs to share or back up
bashron export ~/my-jobs.json
# Import jobs on another machine (merges by default)
bashron import ~/my-jobs.json
# Import and replace everything
bashron import ~/my-jobs.json --overwrite
# Get notified on failure (macOS desktop notification)
bashron add my-task ~/scripts/my-task.sh --notify
# Post to Slack/Discord on failure
bashron add my-task ~/scripts/my-task.sh --webhook https://hooks.slack.com/...
# Run as a persistent background service (survives reboots)
bashron service install # registers with launchd (macOS) or systemd (Linux)
bashron service status
bashron service uninstall
Commands
| Command | Description |
|---|---|
bashron init |
Interactive wizard to add your first job |
bashron new <name> |
Scaffold a bash script and schedule it immediately |
bashron add <name> <script.sh> |
Schedule a local script (daily at 08:00 by default) |
bashron add <name> <https://...> |
Download a script from a URL and schedule it |
bashron add ... --every hourly |
Run every hour |
bashron add ... --every daily --at HH:MM |
Run daily at a specific time |
bashron add ... --every weekly --on monday --at HH:MM |
Run every week on a given day |
bashron add ... --every monthly --on 1 --at HH:MM |
Run on a specific day of every month (1–28) |
bashron add ... --notify |
Enable macOS desktop notification on failure |
bashron add ... --webhook <url> |
POST to Slack/Discord on failure |
bashron list |
List all scheduled jobs |
bashron list --json |
List all scheduled jobs as JSON |
bashron status |
Live dashboard: next run, last run, exit code |
bashron status --watch |
Auto-refreshing dashboard (Ctrl+C to stop) |
bashron ls / rm / ps |
Aliases for list, remove, status |
bashron run <name> |
Run a job immediately |
bashron run --all |
Run every job immediately |
bashron logs <name> |
View job logs |
bashron logs <name> --follow |
Follow a job log in real time |
bashron remove <name> |
Remove a scheduled job |
bashron export [file] |
Export jobs to JSON (stdout if no file given) |
bashron import <file> |
Import jobs from JSON (merges by default) |
bashron start |
Start the daemon (keeps running) |
bashron service install |
Install as a background service (launchd/systemd) |
bashron service status |
Show background service status |
bashron service uninstall |
Remove the background service |
bashron doctor |
Check system is ready to run bashron |
bashron overview |
Show a visual architecture map for contributors |
bashron demo |
Show a colored sample workflow for onboarding or recordings |
Examples
# Friendly time formats — no more 24h cron math
bashron add morning ~/scripts/morning.sh --at 9am
bashron add teatime ~/scripts/tea.sh --at 3:30pm
# Preview a schedule in plain English before saving it
bashron add backup ~/scripts/backup.sh --every weekly --on friday --at 9am --explain
# Run every hour
bashron add sync ~/scripts/sync.sh --every hourly
# Run daily at a specific time
bashron add backup ~/scripts/backup.sh --every daily --at 03:00
# Download a script from the internet and run it weekly on Friday
bashron add report https://example.com/report.sh --every weekly --on friday --at 09:00
# Run on the 1st of every month
bashron add billing ~/scripts/billing.sh --every monthly --on 1 --at 08:00
# Run it once right now to test
bashron run backup
# Check the log
bashron logs backup
# Live dashboard showing schedule, last run, and exit code
bashron status
# Start the scheduler daemon
bashron start
| Path | What's stored there |
|---|---|
~/.bashron/logs/<name>.log |
Output logs for each job |
~/.bashron/scripts/<name>.sh |
Scripts downloaded from URLs |
~/.bashron/scripts.json |
Job database |
New Contributor Start Here
Run the built-in overview first:
bashron overview
bashron demo
Then read the code in this order:
src/bashron/cli.pysrc/bashron/store.pysrc/bashron/runner.pysrc/bashron/config.pysrc/bashron/cleaner.pysrc/bashron/cron.py
There is also a Mermaid version in docs/ARCHITECTURE.md.
Architecture
User CLI
|
v
cli.py
|
+--> store.py ---------> scripts.json / ~/.bashron/logs
|
+--> runner.py --------> bash subprocess + log output
|
+--> config.py --------> config.json
| |
| +--> cleaner.py
|
+--> cron.py ----------> crontab preview/install/uninstall
|
+--> platform_utils.py -> OS/bash/python detection
Publishing a new release (maintainers)
bashron ships to PyPI. uv tool install, pipx install, and pip install all
pull from the same artifact, so one release reaches everyone.
One-time setup
-
Create accounts at pypi.org and test.pypi.org. They're separate.
-
On each site, generate a scoped API token under Account settings → API tokens. Save them somewhere safe — PyPI shows each token exactly once.
-
Store the tokens in your shell so
uv publishcan read them:export UV_PUBLISH_TOKEN_TESTPYPI="pypi-..." # test.pypi.org token export UV_PUBLISH_TOKEN="pypi-..." # real pypi.org token
Every release
# 1. Bump the version in pyproject.toml (e.g. 0.1.0 → 0.2.0)
# PyPI versions are IMMUTABLE — you can never reuse or overwrite one.
# 2. Run the full test suite — the coverage gate must stay at 100%.
PYTHONPATH=src python -m pytest -q
# 3. Clean old artifacts and build fresh ones.
rm -rf dist/
uv build
# → dist/bashron-<ver>-py3-none-any.whl
# → dist/bashron-<ver>.tar.gz
# 4. Dry run against TestPyPI first (safe, throwaway).
uv publish --publish-url https://test.pypi.org/legacy/ \
--token "$UV_PUBLISH_TOKEN_TESTPYPI"
# 5. Install from TestPyPI in a fresh venv and smoke-test it.
uv tool install --index-url https://test.pypi.org/simple/ \
--extra-index-url https://pypi.org/simple/ \
bashron
bashron --version
bashron doctor
# 6. Publish for real.
uv publish --token "$UV_PUBLISH_TOKEN"
# 7. Tag the release so the git history matches PyPI.
git tag v<ver> && git push origin v<ver>
If you prefer the classic toolchain, python -m build + twine upload dist/*
works identically.
PR And Commit Counting
This repository currently has no Git metadata in the local workspace, so contributor and PR metrics cannot be generated from inside the repo alone.
If the project is in a git checkout, you can now run:
bashron repo-stats
bashron repo-stats --base develop
If you want PR commit counts on GitHub, the simplest command is:
gh pr view <number> --json commits
Or with plain git for a branch comparison:
git rev-list --count origin/main..HEAD
Project details
Release history Release notifications | RSS feed
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 bashron-0.1.1.tar.gz.
File metadata
- Download URL: bashron-0.1.1.tar.gz
- Upload date:
- Size: 76.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b56e77656fee9e50fe5227e72a7aae1059415471cd30a7117cfb82ae4e7f19ee
|
|
| MD5 |
a3360effc05025832cebe815a2326deb
|
|
| BLAKE2b-256 |
eb9488be5c432fdbb291ede17ddc3c09ded9d05f48fe69bf611d02c897942ca6
|
Provenance
The following attestation bundles were made for bashron-0.1.1.tar.gz:
Publisher:
release.yml on shadowmornachAsia/Bashron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bashron-0.1.1.tar.gz -
Subject digest:
b56e77656fee9e50fe5227e72a7aae1059415471cd30a7117cfb82ae4e7f19ee - Sigstore transparency entry: 1272984611
- Sigstore integration time:
-
Permalink:
shadowmornachAsia/Bashron@d48c45e67c46ec15c760754f79a8ba6e12dc217d -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/shadowmornachAsia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d48c45e67c46ec15c760754f79a8ba6e12dc217d -
Trigger Event:
push
-
Statement type:
File details
Details for the file bashron-0.1.1-py3-none-any.whl.
File metadata
- Download URL: bashron-0.1.1-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76dbb64242180f8da08841b174b9bf627bdc0d8cb25f441a1fc4f16257e7de55
|
|
| MD5 |
0a5878d22d5372b79c8a33c219bcd601
|
|
| BLAKE2b-256 |
11348b7722bdbe1f0416151d89e8b4b22c8e11de056ffa1665f1a4464d47a48f
|
Provenance
The following attestation bundles were made for bashron-0.1.1-py3-none-any.whl:
Publisher:
release.yml on shadowmornachAsia/Bashron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bashron-0.1.1-py3-none-any.whl -
Subject digest:
76dbb64242180f8da08841b174b9bf627bdc0d8cb25f441a1fc4f16257e7de55 - Sigstore transparency entry: 1272984695
- Sigstore integration time:
-
Permalink:
shadowmornachAsia/Bashron@d48c45e67c46ec15c760754f79a8ba6e12dc217d -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/shadowmornachAsia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d48c45e67c46ec15c760754f79a8ba6e12dc217d -
Trigger Event:
push
-
Statement type: