NUS Event Mailer Pro (NUS EMP) is a desktop app for event organizers at NUS to manage hundreds of events and contacts quickly and easily. It's designed for speed and simplicity, as most actions can be done by typing commands directly, allowing you to work quickly without relying on menus or complex navigation.
We assume that you can type fast but still want a well-designed interface, in which case NUS EMP is perfect for you! No programming knowledge will be needed, but some basic computer skills like using terminals, downloading files, will be required for you to run the app.
Check if you have Java 17 or newer on your computer. If you're unsure, check our FAQ section for help.
Note: for Mac users, you'll have to get the specific Java version described here
Download the app from our releases page
Save the file in any folder you like - this will be your app's home
Start the app: Open a terminal, go to that folder using the cd command, and type:
java -jar nus-emp-v1.6.jar
If you're unsure of how to use the cd command, check out the FAQ section for help.
Finish installation: You'll see the app window appear with some sample contacts and events!
Pro Tip: Start by typing help or pressing the help button to see this guide anytime you need help!
Commands are simple instructions you type to tell the app what to do. Here's everything you need to know:
Words in UPPER_CASE are parameters you need to replace
e.g. in contact add --name NAME, replace NAME with John Doe
Items in [square brackets] are optional
e.g --name NAME [--tag TAG] can be used as --name John Doe --tag friend or just --name John Doe
Items with … can be used multiple times (including zero times)
e.g. [--tag TAG]… can be used as --tag friend --tag family or no tag at all
Parameters can be in any order
e.g. --name NAME --email EMAIL works the same as --email EMAIL --name NAME
Extra parameters are ignored for simple commands like help and exit
e.g. help 123 is treated as just help
Save time with these short forms:
| Long Form | Short Form |
|---|---|
--name | -n |
--email | -e |
--phone | -p |
--address | -a |
--tag | -t |
--date | -d |
--contact | -c |
--event | -e |
--status | -s |
Note
The parameters --events and --email are not used in the same command, so it is okay for both to use -e as the short form.
Long form:
contact add --name John Doe --email john@email.com --phone 91234567 --tag friend
Short form:
contact add -n John Doe -e john@email.com -p 91234567 -t friend
If you're using a PDF version of this guide, be careful when copying and pasting commands that span multiple lines - space characters around line-breaks might be lost when copied to the app.
Each field in NUS EMP has specific requirements to ensure data quality. Here are the constraints for each field:
| Field | Constraints | Examples |
|---|---|---|
| Name (Contact) | Cannot be blank. Can contain any character. | John Doe, Mary-Jane O'Brien, 李明 |
| Name (Event) | Cannot be blank. Can contain any character. Must be unique - no two events can have the same name. | Team Meeting, Orientation 25/26, Annual Dinner 2025 |
Must follow format: local-part@domain- Local part: alphanumeric and + _ . - only, cannot start/end with special characters- Domain: must end with at least 2 characters, labels separated by periods - Case-insensitive for uniqueness (e.g., John@Email.com = john@email.com) | john@email.com, mary.jane@company.co.uk, user+tag@domain.org | |
| Phone | Cannot be blank if provided. Can only contain standard characters, i.e. characters you can type on a standard US keyboard. | 91234567, +65 9123 4567, 123-456-7890 |
| Address | Cannot be blank if provided. Can only contain standard characters. | 123 Main Street, Blk 123 #01-01, Apt. 5B |
| Tag | Cannot be blank. Can only contain standard characters. Case-insensitive. If duplicate tags are entered, only the tag defined first will be saved. | friend, high-priority, VIP++, follow up |
| Date | Format: DD-MM-YYYY HH:MM (24-hour time) | 25-12-2025 14:30, 01-01-2026 09:00 |
| Event Status | Must be one of: PENDING, ONGOING, DONE (case-insensitive) | pending, ONGOING, Done |
| RSVP Status | Must be one of: available, unavailable, unknown (case-insensitive) | available, UNAVAILABLE, Unknown |
| Index | Positive integer within the displayed list range | 1, 2, 50 |
Common Mistakes to Avoid:
DD-MM-YYYY HH:MM)local-part@domain structure)The NUS Event Mailer Pro interface is designed to be intuitive and efficient for managing your events and contacts.
| # | Description |
|---|---|
| 1 | Contact view button |
| 2 | Event view button |
| 3 | Help button, opens the user guide in your browser. |
| 4 | Button to toggle light and dark mode. |
| 5 | Button to toggle command terminal (Alternatively, open with CTRL-T). |
| 6 | Contact tags |
| 7 | Contact's linked events (Available) |
| 8 | Contact's linked events (Unavailable) |
| 9 | Contact's linked events (Unknown) |
| 10 | Event's status (Pending/Ongoing/Done) |
| 11 | Event's linked contacts (Available) |
| 12 | Event's linked contacts (Unavailable) |
| 13 | Event's linked contacts (Unknown) |
| 14 | Quick export button (Exports emails of all available contacts) |
Navigation Tips:
contact addSave someone's information so you can invite them to events later.
What you need:
contact add --name John Doe --email john@email.com
Add more details if you want:
contact add --name Jane Smith --email jane@company.com --phone 91234567 --address 123 Main Street --tag friend --tag colleague
Helpful Tips:
--tagFormat:
contact add --name NAME --email EMAIL [--phone PHONE] [--address ADDRESS] [--tag TAG]…
Screenshot Example:
contact listSee everyone you've saved:
contact list
What You'll See:
Screenshot Example:
contact editUpdate someone's details when their information changes.
How to do it:
contact edit 1 --phone 98765432 --email newemail@gmail.com
This changes contact #1's phone and email.
Important: You can find the index of the contact in the displayed contact list. The index should be a positive number.
Important to Know:
contact edit 1 --phonecontact edit 1 --tagFormat:
contact edit INDEX [--name NAME] [--email EMAIL] [--phone PHONE] [--address ADDRESS] [--tag TAG]…
Screenshot Example:
contact findLooking for someone specific? You can search in different ways:
Simple name search:
contact find John
Search by specific information:
contact find --email gmail
contact find --phone 9123
contact find --address serangoon
contact find --tag friend
Combine searches:
contact find --name alice bob --email nus.edu ntu.edu
gmail finds @gmail.com)Understanding Search Logic:
OR Logic (within one field): Finds contacts matching ANY of the words
contact find --name alice bob
Finds contacts named alice OR bob
AND Logic (between fields): Finds contacts matching ALL the conditions
contact find --name alice --email gmail
Finds contacts named alice AND have gmail in their email
Simple Example:
contact find --name alice bob --email gmail
Finds: People named alice OR bob AND who have gmail in their email
Note: After using contact find, same contacts will likely have different index numbers when compared to using contact list. Remember to use these displayed index numbers instead when running commands on the found contacts.
Format:
contact find KEYWORD [MORE_KEYWORDS]… or contact find [--FIELD KEYWORD [MORE_KEYWORDS]…]…
Screenshot Example:
In the example screenshot, contact find --name lim was executed.
contact deleteDelete someone from your contacts:
contact delete 3
This removes contact #3.
Important: You can find the index of the contact in the currently displayed contact list. The index should be a positive number.
Be Careful!
Format:
contact delete INDEX
Screenshot Example:
In the example screenshot, contact find --name john was executed, and to delete the contact at index 2 (highlighted under A), contact delete 2 was executed.
contact showCheck what events someone is invited to:
contact show 2
Shows all events for contact #2.
Important: You can find the index of the contact in the currently displayed contact list. The index should be a positive number.
When This is Useful:
Format:
contact show INDEX
Screenshot Example:
In the example screenshot, we want to show all events for the contact at index 3 (highlighted under A), so we execute contact show 2, bringing us to the events page.
event addPlans a new event and save all the details.
Basic event:
event add --name Team Meeting --date 25-12-2025 14:30
You can add a location and tags too:
event add --name Company Party --date 31-12-2025 19:00 --address Office Lounge --tag Work
Note that events are added with a default status of PENDING, you can change them later using event edit.
Event Tips:
Format:
event add --name NAME --date DATE [--address ADDRESS] [--tag TAG]…
Screenshot Example:
event listSee all your planned events.
event list
👀 What You'll See:
Screenshot Example:
event editUpdate event information when plans change.
How to do it:
event edit 1 --name New Meeting Name --date 26-12-2025 15:00
This changes event #1's name and time.
Important: You can find the index of the event in the currently displayed event list. The index should be a positive integer.
What You Can Change:
Format:
event edit INDEX [--name NAME] [--date DATE] [--address ADDRESS] [--status STATUS] [--tag TAG]…
Screenshot Example:
event findLooking for a specific event? You can search in different ways:
Simple name search:
event find Meeting
Search by specific information:
event find --name Conference
event find --status pending
event find --date 25-12-2025 12:00
event find --address serangoon
event find --tag work
Combine searches:
event find --name meeting conference --tag work important
Event find works the same way as contact find (see How Search Works for details).
25-12-2025 12:00 finds only that date and time)pending, ongoing, doneNote: Similar to contact find, after using event find, same events will likely have different index numbers when compared to using event list. Remember to use these displayed index numbers instead when running commands on the found events.
Format:
event find KEYWORD [MORE_KEYWORDS]… or event find [--FIELD KEYWORD [MORE_KEYWORDS]…]…
Screenshot Example:
event deleteRemove an event completely:
event delete 2
This deletes event #2 and removes all contact connections.
Important: You can find the index of the event in the displayed event list. The index should be a positive number.
Think Before You Delete!
event unlink to remove specific people if you want to keep the eventFormat:
event delete INDEX
Screenshot Example:
event linkAdd contacts to your event guest list:
event link --event 1 --contact 2
This adds contact #2 to event #1.
You can also quickly invite everyone in your currently displayed contact list to an event:
event link --event 1 --contact listed
This adds all contacts from your currently displayed contact list to event #1.
Important:
listed for CONTACT_INDEX--contact listed will link every contact displayed in the contact list to the specified eventInviting Tips:
contact find or event show to change the currently displayed contact list, and combine it with using --contact listed for powerful bulk invites!Format:
event link --event EVENT_INDEX --contact CONTACT_INDEX
Screenshot Example:
In the example screenshot, we want to link the contact at index 3 (highlighted under A) to the event at index 2, so we execute event link --event 2 --contact 3.
event unlinkTake someone off an event when they can't make it:
event unlink --event 1 --contact 2
Removes contact #2 from event #1.
You can also quickly clear your guest list for an event:
event unlink --event 1 --contact listed
This removes all contacts from your currently displayed contact list — perfect for resetting or rebuilding your guest list.
Important:
listed for CONTACT_INDEX--contact listed will unlink every contact displayed in the contact list from the specified eventWhen to Use This:
Format:
event unlink --event EVENT_INDEX --contact CONTACT_INDEX
Screenshot Example:
In the example screenshot, we want to unlink the contact at index 3 (highlighted under A) to the event at index 2, so we execute event unlink --event 2 --contact 3.
event rsvpKeep track of RSVP responses as people reply:
event rsvp --event 1 --contact 2 --status available
Marks contact #2 as available for event #1.
Important:
event link before you can update their RSVP statusPossible responses:
available - They can make it!unavailable - They can't comeunknown - Haven't decided yetRSVP Management Tips:
Format:
event rsvp --event EVENT_INDEX --contact CONTACT_INDEX --status STATUS
Screenshot Example:
event showCheck your guest list for any event:
event show 1
Shows everyone invited to event #1.
Important: You can find the index of the event in the currently displayed event list. The index should be a positive number.
Note: Similar to contact find, the contact indexes will likely change. Remember to use these displayed index numbers instead when running commands on the found contacts.
Why This is Helpful:
Format:
event show INDEX
Screenshot Example:
event exportQuickly copy all contacts that has status AVAILABLE from an event to your clipboard.
event export 1
This copies all contacts who are available from event #1.
You can also copy contacts with a different status:
event export 2 --status unavailable
This copies all contacts who are unavailable from event #2.
Important: You can find the index of the event in the currently displayed event list. The index should be a positive number.
Perfect For:
Format:
event export INDEX [--status STATUS]
Screenshot Example:
Good news! The app saves everything automatically after each command. No need to save manually - you can just focus on planning your events!
Your information is saved in a file called appdata.json in the data folder. You can edit this file directly if you're comfortable with it.
Warning for Advanced Users:
appdata.json.corrupt.<timestamp> in the data folderQ: How do I check my Java version?
A: To verify your Java version:
Open a terminal and enter java -version
You should see an output similar to this format:
xxxx version "17.0.x"
xxxx SE Runtime Environment (build 17.0.x+xx)
xxxx 64-Bit Server VM (build 17.0.x+xx, mixed mode, sharing)
Note that what's displayed in the xxxx can be different depending on your Java distribution, but as long as the version number is 17, you're good to go!
If the command is not recognised or the version is less than 17: Follow this guide for installation.
After installation, type java -version to verify the correct version.
Q: How do I navigate to a folder using cd?
A: After opening the terminal, type cd followed by the path to the folder where you saved the app. You can get the folder path in different ways depending on your OS:
cd in the terminal.cd in the terminal.Q: How do I move my data to another computer?
A: Install the app on the new computer and copy your old data file over the new empty one.
Q: The app window disappeared! What do I do?
A: If you use multiple screens, try closing and reopening the app. If that doesn't work, delete the preferences.json file.
Q: Can I edit the data file directly?
A: Yes, but be very careful! Always make a backup first. See the warning above.
preferences.json to fix this.In our development roadmap, we plan to implement:
Look forward to it!
| Action | Format |
|---|---|
| Get Help | help |
| Exit App | exit |
| Action | Format, Examples |
|---|---|
| Add Contact | contact add --name NAME --email EMAIL [--phone PHONE] [--address ADDRESS] [--tag TAG]…e.g. contact add --name James --email james@e.com --phone 91234567 --address 123 Main Street --tag friend --tag colleague |
| Delete Contact | contact delete INDEXe.g. contact delete 3 |
| Edit Contact | contact edit INDEX [--name NAME] [--email EMAIL] [--phone PHONE] [--address ADDRESS] [--tag TAG]…e.g. contact edit 2 --name James --email jameslee@e.com |
| Find Contacts | contact find KEYWORD [MORE_KEYWORDS]… or contact find [--FIELD KEYWORD [MORE_KEYWORDS]…]…e.g. contact find --email gmaile.g. contact find --phone 9123 |
| List Contacts | contact list |
| Show Contact's Events | contact show INDEXe.g. contact show 1 |
| Action | Format, Examples |
|---|---|
| Add Event | event add --name NAME --date DATE [--address ADDRESS] [--tag TAG]…e.g. event add --name Meeting --date 25-12-2025 14:30 --address Room 4 --tag Work |
| Delete Event | event delete INDEXe.g. event delete 2 |
| Edit Event | event edit INDEX [--name NAME] [--date DATE] [--address ADDRESS] [--status STATUS] [--tag TAG]…e.g. event edit 1 --name New Meeting |
| Find Event | event find KEYWORD [MORE_KEYWORDS]… or e.g. event find --name Conference event find --status pending |
| List Events | event list |
| Link Contact to Event | event link --event EVENT_INDEX --contact CONTACT_INDEXe.g. event link --event 1 --contact 2 |
| Link Listed Contacts to Event | event link --event EVENT_INDEX --contact listede.g. event link --event 1 --contact listed |
| Unlink Contact from Event | event unlink --event EVENT_INDEX --contact CONTACT_INDEXe.g. event unlink --event 1 --contact 2 |
| Unlink Listed Contacts from Event | event unlink --event EVENT_INDEX --contact listede.g. event unlink --event 1 --contact listed |
| RSVP to Event | event rsvp --event EVENT_INDEX --contact CONTACT_INDEX --status STATUSe.g. event rsvp --event 1 --contact 2 --status available |
| Show Event's Contacts | event show INDEXe.g. event show 1 |
| Export Event Contacts | event export INDEX [--status STATUS]e.g. event export 1event export 1 --status available |
Congratulations! You now know everything about using NUS Event Mailer Pro.
Remember:
help anytime you need a reminderHappy event planning!