Control a June oven from the terminal, plus a durable local cook history and repeatable named cooks that June's live-only cloud never keeps.
Direct pair/preheat/watch/cancel control with no HomeKit and no June app, plus local history (record, log, curve, preheat-stats), workflow primitives (ready, eta), and named repeatable cooks (repeat). All agent-native JSON.
Authentication
Auth is direct pairing: run juneoven-pp-cli pair once and type an 8-digit code on the oven. A signing key and access token are stored at ~/.config/juneoven-pp-cli/identity.json (0600).
Quick Start
# confirm the oven is paired and online
juneoven-pp-cli status --json
# start a bake
juneoven-pp-cli preheat --temp 350
# watch live telemetry and camera frames
juneoven-pp-cli watch --seconds 60
# review recent cook history
juneoven-pp-cli log --since 7d
Recipes
Preheat and record
juneoven-pp-cli preheat --temp 450 && juneoven-pp-cli record --label pizza
Start a cook and capture its session to local history.
Weekly cook by name
juneoven-pp-cli repeat sunday-roast
Replay a saved mode+temp+timer preset in one command.
Export a cook's curve
juneoven-pp-cli curve 3 --format csv --agent --select ts,cavity_f
Pull one session's temperature series as CSV for plotting.
Usage
Run juneoven-pp-cli --help for the full command reference and flag list.
Paths & environment variables
This CLI separates local files into four path kinds:
| Kind | Contents |
|---|
config | User-editable settings such as config.toml and saved profiles |
data | Durable local data: credentials.toml, data.db, cookies, browser-session proof files, and other auth sidecars |
state | Runtime state such as persisted queries, jobs, and teach.log |
cache | Regenerable HTTP/cache files |
Each kind resolves independently. The ladder is:
- Per-kind env var:
JUNEOVEN_CONFIG_DIR, JUNEOVEN_DATA_DIR, JUNEOVEN_STATE_DIR, or JUNEOVEN_CACHE_DIR
--home <dir> for this invocation
JUNEOVEN_HOME for a flat relocated root
- XDG env vars:
XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_STATE_HOME, XDG_CACHE_HOME
- Platform defaults matching existing installs
For containers and agent sandboxes, prefer a single relocated root:
export JUNEOVEN_HOME=/srv/juneoven
juneoven-pp-cli doctor
Under JUNEOVEN_HOME=/srv/juneoven, the four dirs resolve to /srv/juneoven/config, /srv/juneoven/data, /srv/juneoven/state, and /srv/juneoven/cache.
MCP servers do not receive CLI flags from the host. Put relocation in the host env block:
{
"mcpServers": {
"juneoven": {
"command": "juneoven-pp-mcp",
"env": {
"JUNEOVEN_HOME": "/srv/juneoven"
}
}
}
}
Precedence matters in fleets: an ambient per-kind variable such as JUNEOVEN_DATA_DIR overrides an explicit --home for that kind. Use JUNEOVEN_HOME or the per-kind variables for durable fleet relocation; treat --home as the weaker per-invocation lever.
Relocation is one-way. Unsetting JUNEOVEN_HOME does not move files back to platform defaults, and doctor cannot find credentials left under a former root. Move the files manually before unsetting relocation variables.
Existing installs keep working because the platform-default rung matches the legacy layout. On the first auth write, stored secrets leave config.toml and are consolidated into credentials.toml under the data directory. Run juneoven-pp-cli doctor --fail-on warn to check path and credential-location warnings in automation.
Commands
Temperatures are °F by default; add --celsius where a temperature is taken. Command results report the oven's own ack as {"action","acked","status"} where status is success or not-allowed.
juneoven-pp-cli pair - Pair directly with the oven via an 8-digit code (run once).
juneoven-pp-cli status - Connection state, idle/active, current target temperature.
juneoven-pp-cli preheat --temp 350 - Start a cook (--mode bake or roast).
juneoven-pp-cli temp --temp 375 - Change the active cook's target.
juneoven-pp-cli timer --minutes 10 - Set a cook timer.
juneoven-pp-cli cancel - Stop the active cook.
juneoven-pp-cli watch --seconds 120 - Stream telemetry and camera-frame events as JSON lines.
juneoven-pp-cli cam --timeout 15 - Print the next interior camera frame's signed URL.
The generated devices command (register, associated) exposes the raw June REST endpoints and is used internally by pair; you normally won't call it directly.
Unique Features
These capabilities aren't available in any other tool for this API.
Cook workflow primitives
-
ready — Wait for the oven to reach its target temperature, then exit 0 (non-zero on timeout).
Lets an agent synchronously gate the next cook step on preheat completion instead of busy-waiting.
juneoven-pp-cli ready --timeout 20 --agent
-
eta — Non-blocking estimate of time until the oven reaches target, from the live climb rate.
An agent can sequence the next action off a returned ETA without blocking.
juneoven-pp-cli eta --agent
-
repeat — Save a named mode+temp(+timer) preset in local SQLite and replay it with one word.
Collapses a repeated weekly cook into a single memorable command.
juneoven-pp-cli repeat <name>
Local history the cloud never keeps
-
record — Capture the current cook (session + telemetry/camera activity) into local SQLite.
Turns ephemeral live cooks into a queryable local dataset the cloud never stores.
juneoven-pp-cli record --label sourdough --agent
-
log — List past cooks (mode, target, duration, outcome) from local history.
Answers historical questions about the oven that are impossible through June's API.
juneoven-pp-cli log --since 7d --agent
-
curve — Export one recorded cook's temperature/progress samples as JSON or CSV.
Gives a plottable series for one cook, for analysis or piping.
juneoven-pp-cli curve 3 --format csv
-
preheat-stats — Median/fastest/slowest time-to-target per cook over recorded cooks.
Shows how your specific oven performs over time and whether it is degrading.
juneoven-pp-cli preheat-stats --cook bake --agent
Output Formats
# Human-readable table (default in terminal, JSON when piped)
juneoven-pp-cli devices associated mock-value
# JSON for scripting and agents
juneoven-pp-cli devices associated mock-value --json
# Filter to specific fields
juneoven-pp-cli devices associated mock-value --json --select id,name,status
# Dry run — show the request without sending
juneoven-pp-cli devices associated mock-value --dry-run
# Agent mode — JSON + compact + no prompts in one flag
juneoven-pp-cli devices associated mock-value --agent
Agent Usage
This CLI is designed for AI agent consumption:
- Non-interactive - never prompts, every input is a flag
- Pipeable -
--json output to stdout, errors to stderr
- Filterable -
--select id,name returns only fields you need
- Previewable -
--dry-run shows the request without sending
- Explicit retries - add
--idempotent to create retries when a no-op success is acceptable
- Confirmable -
--yes for explicit confirmation of destructive actions
- Piped input - write commands can accept structured input when their help lists
--stdin
- Offline-friendly - sync/search commands can use the local SQLite store when available
- Agent-safe by default - no colors or formatting unless
--human-friendly is set
Exit codes: 0 success, 2 usage error, 3 not found, 4 auth error, 5 API error, 7 rate limited, 10 config error.
Health Check
juneoven-pp-cli doctor
Verifies configuration, credentials, and connectivity to the API.
Configuration
Run juneoven-pp-cli doctor to see the resolved config, data, state, and cache directories. The platform-default config path is ~/.config/juneoven-pp-cli/config.toml; --home, JUNEOVEN_HOME, and per-kind env vars can relocate it.
Static request headers can be configured under headers; per-command header overrides take precedence.
Environment variables:
| Name | Kind | Required | Description |
|---|
JUNE_ACCESS_TOKEN | per_call | Yes | Set to your API credential. |
agentcookie (optional)
If you use agentcookie to sync secrets across machines, this CLI auto-adopts agentcookie-managed credentials with no extra setup. When the daemon writes to this CLI's config, juneoven-pp-cli doctor reports agentcookie: detected and auth-status labels the source as agentcookie. Skip this section if you don't use agentcookie - the CLI works the same as any other.
Troubleshooting
Authentication errors (exit code 4)
- Run
juneoven-pp-cli doctor to check credentials
- Verify the environment variable is set:
echo $JUNE_ACCESS_TOKEN
Not found errors (exit code 3)
- Check the resource ID is correct
- Run the
list command to see available items
Generated by CLI Printing Press
API-specific
- commands say 'no paired oven found' — run
juneoven-pp-cli pair and enter the code on the oven
- ready/eta report no cavity temperature — some June firmware streams only camera frames; use
watch or the oven screen for the preheat signal