Quickstart¶
From "nothing installed" to "first digest in my inbox" in about five minutes. We'll use Jira as the source (the canonical Preesta tracker — real status field, real priority, relative-time JQL) and email as the only delivery channel; Telegram and Slack are described on their own pages, other trackers on theirs.
Prerequisites¶
- Docker
- Jira API token — get one at https://id.atlassian.com/manage-profile/security/api-tokens
- SMTP account — Gmail with an app password is the simplest
1. Set up a config directory¶
Create a folder anywhere — two files live in it.
secrets/appsettings.secrets.yaml — tokens (gitignore this)¶
Smtp:
Host: smtp.gmail.com
From: you@example.com
User: you@example.com
Password: "your-app-password" # not your account password — see Gmail link above
Jira:
rootUri: "https://your-company.atlassian.net/"
userName: "you@example.com"
password: "ATATT3xFfGF0xxxxxxxxxxxxxxxxxxxx" # the Jira API token
rules.yaml — what to digest, to whom¶
One rule, one notification: every owner of a blocker that's been sitting more than 30 minutes without moving to In Progress gets pinged about their blockers.
rules:
- tracker: jira
tags: blocker-watch
filter: 'priority = Blocker AND status = "Open" AND assignee is not EMPTY AND updated < -30m'
notify:
subject: "Your blocker hasn't been picked up (30+ min)"
mailTo: assignee
Look at what's not in the rule: no identity. The JQL says which issues (blocker priority, still in Open status, assigned to someone, last touched more than 30 minutes ago), and mailTo: assignee is a marker that resolves per matched issue. Preesta groups matches by assignee email and sends each distinct owner their own slice. Add a teammate to the project and they start receiving their digest the moment they get assigned a stalled blocker — without you touching rules.yaml.
filter: is raw JQL — the same expression you type into Jira's advanced search bar. Use whatever query catches a real "this needs eyes today" condition. The marker mechanics (assignee / reporter / creator, mixing literals with markers, email→Telegram/Slack ID maps) are in Routing model.
Unassigned blockers don't match
mailTo: assigneeand silently drop. Closing that gap — auto-assigning the unowned ones to a triager so the queue can't grow — is a two-rule loop in the cookbook: Auto-triage blockers.
2. Run¶
A log block prints the matches, then one SMTP send per distinct assignee. Within seconds an email lands in your inbox listing only the blockers actually assigned to you and stalled for 30+ minutes — each linked to its Jira page, plus an "Open in Jira →" header pointing at the same JQL. Teammates with a visible Jira email get their own slice in parallel.
Sanity check the image first if you like:
3. Schedule it¶
The bundled container CMD runs supercronic against /app/preesta-cron — drop a crontab in there and docker run -d without overriding the CMD:
Or use any external scheduler — host cron, systemd timer, Kubernetes CronJob, GitHub Actions on a schedule. Each tick is one docker run, optionally passing tags as arguments to limit which rules fire (preesta blocker-watch runs every rule tagged blocker-watch; preesta with no arguments runs every rule in the file).
Next steps¶
- Browse the Concepts section — three short pages cover the rest of the surface area.
- Add another tracker: Linear, GitHub, GitLab, Shortcut. All four are equal sources — pick the ones you actually use.
- Wire up Telegram or Slack — same digest, different channel.
- Copy a realistic rule from the Cookbook.
Self-contained binary alternative¶
Tagged releases (vX.Y.Z) ship binaries for linux-x64/arm64, osx-x64/arm64, win-x64 on the Releases page. Unpack, drop your secrets/ and rules.yaml next to it, run ./preesta (or ./preesta <tag> to filter). No Docker — the runtime is bundled.