I’ve always been a fan of the tray that’s available when CommandBox launches. On the Mac, it appears as a menu bar icon in the top menu (first icon below).
It has some very convenient built-in options:
Servername
├── Stop Server
├── Restart Server
├── Open...
│ ├── Webroot
│ ├── Server Home
│ ├── Site Home
│ └── Server Admin
├── Info
│ ├── Engine: adobe 2023.0.17+330864
│ ├── Webroot: /Path/to/website/
│ ├── URL: https://127.0.0.1:8443
│ ├── PID: 99999
│ └── Heap: Not set
I frequently need to access Mailpit and various log files as I work through the development process on a current project. This got me wondering if I could add some of my own frequently accessed items to the tray. It turns out you can add quite a few different things.
Enable the tray
First, enable the tray in the server.json file for the site.
"trayEnable": true,
Next, let’s start simple and add a single item to open Mailpit in a browser. The trayOptions setting accepts an array of objects. Each object should contain a label, an action, and one of [url, path, command]. The label is the text that appears in the tray. The action tells CommandBox what to perform (openbrowser, openfilesystem, runAsync, etc.). The [url, path, command] values provide the URL of the site, the filesystem path, or the command to execute, respectively.
Setting the tray options
"trayOptions": [
{
"label": "Mailpit Web Interface",
"action": "openbrowser",
"url": "http://localhost:8025"
}
]
Let’s dive a little deeper with some other options.
Add a “divider” of blank space between CommandBox’s built-in options and the ones we are adding.
{
"label": " ",
"disabled": true
}
Open a folder on the filesystem.
{
"label": "Open Log Folder",
"action": "openfilesystem",
"path": "${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs"
}
Tail the last 100 lines of mailsent.log (macOS only as written, but adaptable for Linux or Windows).
{
"label": "Tail mailsent.log",
"action": "runAsync",
"command": "tmpfile=$(mktemp -t tail-mailsent).command; printf '#!/bin/zsh\nprintf \"\\e]0;Tail mailsent.log\\a\"\nclear\ntail -n 100 -f \"%s\"\n' '${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs/mailsent.log' > \"$tmpfile\"; chmod +x \"$tmpfile\"; open -a Terminal \"$tmpfile\""
}
Explanation of the tail command
Add some icons using emojis.
🛠 Development Tools
📬 Mailpit Web Interface
📂 Logs
Putting it all together

"trayEnable": true,
"trayOptions": [
{
"label": " ",
"disabled": true
},
{
"label": "🛠 Development Tools",
"items": [
{
"label": "📬 Mailpit Web Interface",
"action": "openbrowser",
"url": "http://localhost:8025"
},
{
"label": "📂 Logs",
"items": [
{
"label": "Open Log Folder",
"action": "openfilesystem",
"path": "${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs"
},
{
"label": "Tail application.log",
"action": "runAsync",
"command": "tmpfile=$(mktemp -t tail-application).command; printf '#!/bin/zsh\nclear\ntail -n 100 -f \"%s\"\n' '${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs/application.log' > \"$tmpfile\"; chmod +x \"$tmpfile\"; open -a Terminal \"$tmpfile\""
},
{
"label": "Tail exception.log",
"action": "runAsync",
"command": "tmpfile=$(mktemp -t tail-exception).command; printf '#!/bin/zsh\nclear\ntail -n 100 -f \"%s\"\n' '${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs/exception.log' > \"$tmpfile\"; chmod +x \"$tmpfile\"; open -a Terminal \"$tmpfile\""
},
{
"label": "Tail mailsent.log",
"action": "runAsync",
"command": "tmpfile=$(mktemp -t tail-mailsent).command; printf '#!/bin/zsh\nprintf \"\\e]0;Tail mailsent.log\\a\"\nclear\ntail -n 100 -f \"%s\"\n' '${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs/mailsent.log' > \"$tmpfile\"; chmod +x \"$tmpfile\"; open -a Terminal \"$tmpfile\""
}
]
}
]
}
]
Explanation of the tail command
This command creates a temporary shell script, makes it executable, and opens it in Terminal. Reminder: this version is macOS only as written because it uses zsh, mktemp, and open -a Terminal.
"command": "tmpfile=$(mktemp -t tail-mailsent).command; printf '#!/bin/zsh\nprintf \"\\e]0;Tail mailsent.log\\a\"\nclear\ntail -n 100 -f \"%s\"\n' '${serverinfo.serverHomeDirectory}/WEB-INF/cfusion/logs/mailsent.log' > \"$tmpfile\"; chmod +x \"$tmpfile\"; open -a Terminal \"$tmpfile\""
What it does
mktemp -t tail-mailsent- Creates a uniquely named temporary file.
printf '#!/bin/zsh ...'- Writes a small shell script into the temporary file.
printf "\e]0;Tail mailsent.log\a"- Sets the Terminal window title.
clear- Clears the Terminal window before output begins.
tail -n 100 -f- Displays the last 100 lines of the log file and continues following new entries in real time.
chmod +x- Makes the temporary script executable.
open -a Terminal- Opens the script in the macOS Terminal application.
Next Steps
There are all kinds of other tasks that could be added to the tray such as:
- Ping a server
- Flushing DNS
- Open the hosts file to edit
- Open the site’s Git repo
Good luck!
