Scheduler for unattended Codex tasks with Telegram notifications
Project description
Yotei
Yotei is a small scheduler for unattended Codex tasks.
Install
uv tool install -U yotei-runner
Yotei expects the codex CLI to already be installed and authenticated on the
machine where scheduled runs execute. The scheduler invokes the configured Codex
binary directly and does not manage Codex login state for you.
The published package name is yotei-runner. The installed command remains
yotei.
Quick Start
Initialize a user-level config file:
yotei config init
Schedule a task in the current directory:
yotei schedule \
--task repo-review \
--when "weekdays 09:30" \
--prompt "Review the latest repository changes."
Run one scheduler pass:
yotei run --once
Inspect current tasks:
yotei status
Start one task immediately without changing its normal schedule:
yotei kickstart --task repo-review
Config Discovery And Paths
Config discovery order is:
--config <path>YOTEI_CONFIGSCHEDULED_AGENT_RUNNER_CONFIG.automation/yotei/config.tomlin the current directory or a parent.automation/scheduled-agent-runner/config.tomlin the current directory or a parent${XDG_CONFIG_HOME:-~/.config}/yotei/config.toml
By default, yotei config init writes:
- config:
${XDG_CONFIG_HOME:-~/.config}/yotei/config.toml - state DB:
${XDG_STATE_HOME:-~/.local/state}/yotei/state.sqlite3 - logs:
${XDG_STATE_HOME:-~/.local/state}/yotei/logs/
Yotei uses the same XDG-style defaults on Linux and macOS when the XDG variables are unset. That keeps installs portable and predictable across machines.
Workspace Semantics
Each task stores its own absolute workspace_root.
yotei scheduledefaults--workspaceto the current directoryyotei schedule --workspace <path>stores an explicit workspaceyotei edit --workspace <path>repairs or changes a task workspace lateryotei statusshows each task's stored workspaceyotei runexecutes Codex with that persisted workspace ascwd
If a stored workspace no longer exists on a machine, Yotei fails that run
cleanly and tells you to repair it with yotei edit --workspace.
Codex Permissions
Each task stores a Codex sandbox mode and forwards it to codex exec.
--read-onlystoresread-only--workspace-writestoresworkspace-write--yolostoresdanger-full-access--sandbox <mode>accepts any Codex sandbox mode directly
Set codex.default_sandbox_mode in config to choose the default for new tasks:
[codex]
default_sandbox_mode = "workspace-write"
Use these flags with yotei schedule or yotei edit to override the default
for a task. If the config omits default_sandbox_mode, new tasks default to
read-only, matching Codex's default. For example:
yotei schedule \
--task repo-fix \
--when "every 30m" \
--prompt "Fix the next failing test." \
--workspace /path/to/repo \
--yolo
Advanced Codex execution options can be stored as raw codex exec arguments
after --. Yotei still owns the prompt, session mode, model, workspace, and
JSONL output parsing, so passthrough arguments must start with an option:
yotei schedule \
--task structured-review \
--when "every 2h" \
--prompt "Review the repository and return structured findings." \
--workspace /path/to/repo \
-- \
--profile prod \
--config 'model_reasoning_effort="high"' \
--ephemeral \
--output-schema /path/to/schema.json
Use yotei edit --task <id> -- <codex exec args...> to replace stored
passthrough arguments, or yotei edit --task <id> --clear-codex-exec-args to
remove them.
Scheduler Ownership
Yotei's first portable release expects one active scheduler process per state
database. Do not run multiple long-lived yotei run processes against the same
state.sqlite3; the current baseline documents this ownership contract instead
of using cross-platform lock files or database leases.
Use yotei run for the normal long-running scheduler. It polls for due tasks,
runs them from each task's persisted workspace, writes run logs, and keeps
polling until interrupted.
Use yotei run --once for tests, smoke checks, service hooks, or manual
maintenance. It performs one scheduler pass, including due tasks and at most one
queued run, then exits. The same single-runner policy applies while that pass is
running.
Use yotei kickstart --task <id> when you want one stored task to run right
now. Kickstart uses the task's existing prompt, model, session mode, chat id, and
workspace, starts the immediate run in a detached worker, and returns control to
your shell without waiting for Codex to finish. It does not recalculate
next_run_at or change whether the task is paused. If that task already has an
active run, Yotei queues one immediate run.
Telegram
Telegram notifications are optional. Set telegram.bot_token and
telegram.chat_id, then keep notifications.send_on_start, send_on_success,
and send_on_failure enabled only for the events you want.
Use a literal token or an environment reference such as:
[telegram]
bot_token = "env:TG_BOT_TOKEN"
chat_id = "env:TG_CHAT_ID"
yotei schedule --chat-id <id> overrides telegram.chat_id for one task.
Notification delivery failures do not fail Codex runs. Yotei records concise notification errors in run metadata and scheduler logs without writing the bot token back into summaries or logs.
Schedule Grammar
yotei schedule --when and yotei edit --when accept these forms:
in <int>m,in <int>h,once in <int>m,once in <int>hevery <int>m,every <int>hdaily H:MM,weekdays H:MM<day-list> H:MM, where days aremon,tue,wed,thu,fri,sat,suncron "<minute> <hour> <day-of-month> <month> <day-of-week>"
Clock times must use 24-hour H:MM or HH:MM form. Cron expressions use five
numeric fields. Supported cron field syntax is *, comma lists, ranges, and
slash steps. Names, ?, L, W, #, wraparound ranges, and advanced cron
semantics are not supported. Day-of-month and day-of-week both have to match.
Backup And Restore
Back up these paths together:
${XDG_CONFIG_HOME:-~/.config}/yotei/config.toml${XDG_STATE_HOME:-~/.local/state}/yotei/state.sqlite3${XDG_STATE_HOME:-~/.local/state}/yotei/logs/
To restore on another machine:
- Install
yotei-runnerand make sure the target machine has a workingcodexCLI. - Restore the config file, state DB, and logs into the same XDG locations or
pass
--configexplicitly. - Run
yotei statusand repair any task whose stored workspace path is no longer valid on the new machine withyotei edit --workspace. - Start the scheduler with
yotei runor test one pass withyotei run --once.
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 yotei_runner-0.1.9.tar.gz.
File metadata
- Download URL: yotei_runner-0.1.9.tar.gz
- Upload date:
- Size: 39.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f82d0cfde05497062ceb794e9a0532252a64bb2b9ffa24a557e82ba3cb6b9b66
|
|
| MD5 |
92cdbc0b70cc6e1385221bae95ce3391
|
|
| BLAKE2b-256 |
887a67642834c4cc9e3f2ed9b04cfc8c36af66c5af85fb9be02e0a32c79ae169
|
Provenance
The following attestation bundles were made for yotei_runner-0.1.9.tar.gz:
Publisher:
publish.yml on massun-onibakuchi/yotei
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yotei_runner-0.1.9.tar.gz -
Subject digest:
f82d0cfde05497062ceb794e9a0532252a64bb2b9ffa24a557e82ba3cb6b9b66 - Sigstore transparency entry: 1620834722
- Sigstore integration time:
-
Permalink:
massun-onibakuchi/yotei@743464ef5823696ed431e8e790a7eed2f1d403bb -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/massun-onibakuchi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@743464ef5823696ed431e8e790a7eed2f1d403bb -
Trigger Event:
release
-
Statement type:
File details
Details for the file yotei_runner-0.1.9-py3-none-any.whl.
File metadata
- Download URL: yotei_runner-0.1.9-py3-none-any.whl
- Upload date:
- Size: 24.3 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 |
18ab24e2b2765603f9058bce4777d91b5285df9735d92cc1dea13e0c7555f97a
|
|
| MD5 |
17b5d3914e21ae0f7cc403de52d45d6c
|
|
| BLAKE2b-256 |
e371a9a52e0b5e38ac5f8c9ad983dfedb09d16784c639e78b3845c4669cadeb0
|
Provenance
The following attestation bundles were made for yotei_runner-0.1.9-py3-none-any.whl:
Publisher:
publish.yml on massun-onibakuchi/yotei
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yotei_runner-0.1.9-py3-none-any.whl -
Subject digest:
18ab24e2b2765603f9058bce4777d91b5285df9735d92cc1dea13e0c7555f97a - Sigstore transparency entry: 1620834889
- Sigstore integration time:
-
Permalink:
massun-onibakuchi/yotei@743464ef5823696ed431e8e790a7eed2f1d403bb -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/massun-onibakuchi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@743464ef5823696ed431e8e790a7eed2f1d403bb -
Trigger Event:
release
-
Statement type: