Disclaimer: This repository documents the architecture and problem-solving approach behind systems independently designed and built by the author. It contains no proprietary source code, API keys, credentials, employer branding, or real user/organizational data. Screenshots are illustrative proof-of-concept only. Systems built using employer infrastructure (Jamf Pro) are documented here as a record of skill and handover-ready design, not a claim of personal ownership over the deployed instance.
A zero-training, native macOS ticket form that replaces โemail IT and hopeโ โ submitting simultaneously to a helpdesk platform and a live ops Slack channel, with built-in anti-spam cooldown.
| ๐ Fields | ๐ Destinations | โณ Resubmit Cooldown |
|---|---|---|
| 4 | 2 (Helpdesk API + Slack) | 15 min |

Users click one menu item, fill a native form (category, name, contact, issue description), and the submission lands simultaneously in a helpdesk queue (for tracking/SLA) and a live Slack channel (for ops visibility) โ with no possibility of a user accidentally double-submitting the same ticket.
User clicks "Contact IT"
โ
โผ
Cooldown check (/var/tmp/xxx_ticket_cooldown.txt)
โ exists? โ block, "please wait 15 minutes"
โผ not exists
SwiftDialog form (radio category + 3 text fields + rich text editor)
โ
โผ
Sanitize input (strip quotes, trim whitespace, sed off UI artifacts)
โ
โโโโถ Helpdesk REST API (ticket created, routed to correct group)
โโโโถ Slack Block Kit payload (formatted card, ops visibility)
โ
โผ
Drop cooldown token + detached 15-min auto-expiry timer
โ
โผ
Native confirmation dialog
Dead ends that shaped the final design:
| Problem | What broke | Fix |
|---|---|---|
| Dependency on swiftDialog being pre-installed | Fresh Macs have no binary | Script self-bootstraps: pulls the latest release asset URL from the GitHub API rather than hardcoding a versioned filename |
| swiftDialog radio buttons | Silently appends a hidden index to the label (Software 1 not Software), breaking both downstream APIs |
Caught only via exec > /tmp/log 2>&1 diagnostic logging; sanitized with sed/awk before either payload builds |
| Repeat/accidental submissions | Same ticket lands in the queue twice | Cooldown token + detached 15-min self-deleting timer (same pattern as the SwiftBar trapdoor) |
cat <<EOF > /tmp/helpdesk_payload.json
{
"description": "$ticketBody",
"subject": "Self Service Request: $issueCat",
"email": "$userContact",
"priority": 2,
"status": 2,
"type": "$issueCat",
"group_id": [GROUP_ID_PLACEHOLDER]
}
EOF
curl -s -u "${apiKey}:X" -H "Content-Type: application/json" \
-d @/tmp/helpdesk_payload.json -X POST "https://[org].example.com/api/v2/tickets"
cat <<EOF > /tmp/slack_payload.json
{
"blocks": [
{ "type": "header", "text": { "type": "plain_text", "text": "Incoming IT Support Request" } },
{ "type": "section", "fields": [
{ "type": "mrkdwn", "text": "*User:*\n$userName" },
{ "type": "mrkdwn", "text": "*Contact:*\n$userContact" } ] },
{ "type": "section", "text": { "type": "mrkdwn", "text": "*Issue:*\n> $userIssue" } }
]
}
EOF
curl -s -X POST -H 'Content-type: application/json' \
-d @/tmp/slack_payload.json "[SLACK_WEBHOOK_URL_PLACEHOLDER]"

SwiftDialog ยท bash ยท Helpdesk REST API ยท Slack Block Kit / Incoming Webhooks ยท Jamf Pro
it-contact-form/
โโโ README.md
โโโ screenshots/
โ โโโ IT_Contact_Form.png
โ โโโ Slack_Notification.png
โโโ scripts/
โโโ it_contact_form.sh