User Guide
Clientele+ seamlessly combines client contacts, payment tracking and more in one efficient package, tailored specifically for freelance software developers.
- Quick start
-
Features
- Accepted values by field
- General Commands
-
Client Management
- Add Client Details:
add - Update Client Details:
edit - Finding Clients:
find - Delete Client Details:
delete - Blacklist a Client:
blacklist - Whitelist a Client:
whitelist - Sort Client list:
sort - Archive a Client:
archive - Unarchive a Client:
unarchive - Listing all archived clients:
archive-list - Deadline Reminder
- Add Client Details:
- Data Management
- FAQ
- Known issues
- Command summary
Quick start
If you are an experienced user, and know how to set up jar files, you may wish to skip to the command summary and get started.
-
Ensure you have Java
17or above installed in your Computer. -
Download the latest
ClientelePlus.jarfile from here. -
Copy the file to the folder you want to use as the home folder for Clientele+.
-
Open a command terminal,
cdinto the folder you put the jar file in, and use thejava -jar ClientelePlus.jarcommand to run the application.
A GUI similar to the below should appear in a few seconds
-
Type the command in the command box and press
Enterto execute it. e.g. typinghelpand pressingEnterwill open the help window.
Some example commands you can try:-
list: Lists all clients’ contacts. -
add n/John Dimon p/98765432 e/johnd@gmail.com a/Maxwell Street, #05-01 t/JP Morgan py/pending cs/active d/09-09-2024: Adds a client contact namedJohn Dimonwith pending payment to Clientele+. -
delete id/3: Deletes the 3rd client contact shown in the current list. -
blacklist 1: Blacklists the 1st client contact shown in the current list. -
archive 2: Archives the 2nd client contact shown in the current list. -
edit n/James Thompson d/11-05-2025: Set a client’s deadline, and automatically update reminder manager -
find n/Jeremy: Finds all clients whose name matches Jeremy -
edit n/Joseph Wharton py/late: Update client’s payment status (will display as red $ on GUI)
-
-
Refer to the Features below for details of each command.
Features
Notes about the command format:
-
Words in
UPPER_CASEare the parameters to be supplied by the user.
e.g. inadd n/NAME,NAMEis a parameter which can be used asadd n/John Doe. -
Items in square brackets are optional.
e.gn/NAME [t/TAG]can be used asn/John Doe t/friendor asn/John Doe. -
Items with
… after them can be used multiple times including zero times.
e.g.[t/TAG]…can be used as(i.e. 0 times),t/friend,t/friend t/familyetc. -
Parameters can be in any order.
e.g. if the command specifiesn/NAME p/PHONE_NUMBER,p/PHONE_NUMBER n/NAMEis also acceptable. -
Extraneous parameters for some commands that do not take in parameters (such as
help,list,exit,archive-listandclear) will be ignored.
e.g. if the user entershelp 123, it will be interpreted ashelp. -
If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
Accepted values by field
| Field | Accepted input values | Examples | Exceptions |
|---|---|---|---|
NAME |
Any valid English name. Alphanumeric characters, spaces and dashes are allowed to account for scenarios where clients may prefer to use a username or pseudonym instead of their real name. |
Josh1248, Jean Mary-Jane, Jackie Chan
|
None |
PHONE_NUMBER |
Must consist of digits (0 to 9). Spaces and dashes are allowed between digits, and a plus sign (+) at the start of the phone number is allowed (to indicate country code). |
9143 9032, 872-233-8554, 987223414, +91 23883 90022
|
None |
EMAIL |
Must be in a valid email format (no underscores): somestring@domain.topleveldomain
|
jemma22@github.com, rahulSingh@rocket.net, cassie@finance.morganstanley.com
|
None |
ADDRESS |
Any non-empty string |
Singapore, 42 Wallaby Way, Sydney
|
None |
DEADLINE |
Any valid date in the format dd-mm-yyyy Day and Month must be a valid combination (so no 31st of February for example) Year can be either 1-digit, 2-digit or 4-digit (i.e. a number between 0-99, or a number >= 1000) 3-digit years (numbers between 100-999) are considered invalid Dashes (-), Slashes (/), underscores (_) and vertical bars (|) can be used as delimiters |
1-1-25 (represents “January 1, 2025”), 10/8/2040 (represents “August 10, 2040”), 29|2|8 (represents “February 29, 2008”) |
None |
TAG |
Any non-empty alphanumeric string (spaces allowed) |
friends, CEO of IMB, Born 2017
|
None |
CLIENT_STATUS |
Must be old, potential, unresponsive or active. |
old, potential, unresponsive, active
|
blacklisted is also a valid client status but can only be set using the blacklist command (see here). |
PROJECT_STATUS |
Must be in progress or completed (note the past tense) |
in progress, completed
|
None |
PAYMENT_STATUS |
Must be pending, partial, paid or late
|
pending, partial, paid, late
|
None |
General Commands
Viewing help: help
Shows a message explaining how to access the help page.

Format: help
Listing all Clients: list
Show a list of all clients contacts in Clientele+.
Format: list
You can use this command to return to the main client list.
Clearing All Entries: clear
Clears all entries from Clientele+.
Format: clear
This command permanently deletes all clients from the main client list. This action cannot be undone. Please ensure you fully understand the consequences before proceeding. This command does not affect clients in the archived list.
Exiting the Program: exit
Automatically saves all of the user’s client data and exits the program.
Format: exit
You can also exit the program by clicking the “x” at the top left corner of the window. The program will automatically save your data before closing.
Client Management
Add Client Details: add
Add a client to Clientele+, including details such as client name, contact information, project deadline, project status, payment status and client status. Accepted values are as specified in the accepted values table above.
Format: add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS d/DEADLINE [t/TAG]… [ps/PROJECT_STATUS] [py/PAYMENT_STATUS] [cs/CLIENT_STATUS]
- Clients with the same
NAME,EMAILandPHONE NUMBERare considered duplicates and will not be added. - A person can have 0 or more tags.
-
NAMEis case-insensitive.John DoeandjoHN dOEare considered the same name, but name is stored in the same case as the input (soJohn Doeis stored asJohn DoeandJOHN Doeis stored asJOHN Doe). - If
PAYMENT_STATUSis not specified, default payment status ofpendingis used. - If
CLIENT_STATUSis not specified, default client status ofactiveis used. - If
PROJECT_STATUSis not specified, default project status ofin progressis used.
Examples:
add n/John Dimon p/98765432 e/johnd@gmail.com a/Maxwell Street, #05-01 t/JP Morgan t/CTO ps/in progress py/pending cs/active d/09-09-2024add n/Betsy Crowe t/SoftEng Inc e/betsycrowe@gmail.com a/Wallich Street p/1234567 t/Founder d/11-04-2024
1. The deadline could be the date you need to submit the project to the client.
2. The deadline could instead be the date by which you need to follow up with a potential client.
3. Payment status values are displayed as an icon with the colours orange, yellow, green and red for the values pending, partial, paid and late respectively.
4. You may hover over the Payment Status Icon to view the payment status as text.
Update Client Details: edit
Allows updating of various statuses of an existing client. Accepted values are as specified in the accepted values table above.
Format: edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [d/DEADLINE]
[t/TAG]… [ps/PROJECT_STATUS] [py/PAYMENT_STATUS] [cs/CLIENT_STATUS]
- Edits the person at the specified
INDEX. The index refers to the index number shown in the displayed person list. The index must be a positive integer 1, 2, 3, … - At least one of the optional fields must be provided.
- Existing values will be updated to the input values.
- When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.
- You can remove all the person’s tags by typing
t/without specifying any tags after it. - Any fields not specified will remain unchanged.
Examples:
-
edit 1 p/91234567 e/johndoe@example.comUpdates the first person’s phone number to91234567and email address tojohndoe@example.com -
edit 2 n/Betsy Crower t/Updates the name of the 2nd person to beBetsy Crowerand clears all existing tags. -
edit 1 ps/completed py/paid cs/oldUpdates the project status, payment status and client status of the 1st person to becompleted,paidandoldrespectively.
If a client’s project deadline has passed and the client’s project status is
in progress, the GUI labels the client card as OVERDUE. So if the client has paid, and your business with them is finished, you can set their project status to completed so the deadline field doesn’t show OVERDUE.
Finding Clients: find
Finds persons in main client list who match parameters specified. Accepted values are as specified in the accepted values table above.
Format: find [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [d/DEADLINE] [t/TAG]… [ps/PROJECT_STATUS] [py/PAYMENT_STATUS] [cs/CLIENT_STATUS]
- All values matched for any parameter are case-insensitive.
- The order of the name keywords does not matter. e.g.
n/Hans Bowill matchBo Hans. - Persons matching at least one name keyword will be returned (i.e.
ORsearch). e.g.find n/Han Bowill returnHans Gruber,Bo Yang. - Names only need to match the start of a word. e.g.
find n/HanORfind n/BmatchesHans Bo. - Phone number, email, address, project status, tags, payment status, client status and deadline must match the exact string.
e.g.
ps/in progresswill not matchps/in prog. - All fields need to be matched for a person to be found
e.g.
find n/Rah py/paid ps/in progressmatches those clients whose name segment (first name, middle name, last name etc) starts with “Rah”, payment status ispaidand project status isin progress. - When searching by tags, if multiple tags are specified then only one of the tags need to be matched.
Examples:
-
find n/JohnreturnsjohnandJohn Doe. -
find n/John ps/completedreturns all clients whose names start with “John” and project status is set tocompleted. -
find n/John t/homeowner t/ceoreturns all clients whose names start with “John” and have either a “ceo” tag or a “homeowner” tag. -
find n/alex davidreturnsAlex Yeoh,David Li:
After applying the find command, making changes to the displayed client list will bring you back to the main client list where the changes are applied.
Shortcuts: Finding blacklisted/whitelisted clients
To find all clients that are blacklisted (with no other fields specified), the command
blacklist can be entered.
Similarly, the whitelist command can be entered to find all clients who are whitelisted.
Note: Both of these commands need to be entered without any parameters otherwise the app responds with an error message. Similar to the find command, making changes to the displayed client list will bring you back to the main client list where the changes are applied.
Delete Client Details: delete
Deletes the specified person from Clientele+.
Format: delete [n/NAME] [id/INDEX]
- Deletes clients identified by the specified
INDEXorNAME. -
NAMEAcceptable values are same as above; the command looks for an exact, case-insensitive match in the name.- E.g.:
delete n/Johnwill matchjohn,JOHNandJohn, but notJohn Doe.
- E.g.:
-
INDEXrefers to the index number shown in the displayed person list, and must be a positive integer 1, 2, 3, …
Examples:
-
delete n/Johndeletes the client with the nameJohn. -
listfollowed bydelete id/2deletes the 2nd person in the list. -
find n/Betsyfollowed bydelete id/1deletes the 1st person in the result of thefindcommand.
If you try to delete by name but there are 2 or more clients in the list with that same name, you will be shown a list of those clients and prompted to delete by index instead.
Blacklist a Client: blacklist
Marks a client as “blacklisted”.
Format: blacklist INDEX
- Marks the client specified by the index
INDEXas “blacklisted”. -
INDEXrefers to the index number shown in the displayed person list and must be a positive integer 1, 2, 3, …
Examples:
-
blacklist 2marks the second person in the list as blacklisted

Entering
blacklist on its own without any other parameters will display all clients who have been blacklisted.
Whitelist a Client: whitelist
Whitelists a previously-blacklisted client.
Note: A client is considered to be on the whitelist if their client status is not “blacklisted”.
Format: whitelist INDEX cs/NEW_CLIENT_STATUS
- Changes the status of the client specified by the index
INDEXfrom “blacklisted” toNEW_CLIENT_STATUS. -
INDEXrefers to the index number shown in the displayed person list. -
INDEXmust be a positive integer 1, 2, 3, … -
NEW_CLIENT_STATUSrefers to the new status of the client. Acceptable values arepotential,unresponsive,oldandactive.
Examples:
-
whitelist 2 cs/activewhitelists the second person in the list and marks them as anactiveclient. -
whitelist 1 cs/oldwhitelists the first person in the list and marks them as anoldclient.
Entering
whitelist on its own without any other parameters will display all clients who have been whitelisted.
Sort Client list: sort
Sorts the client list in ascending order by the specified field.
Format: sort FIELD ORDER
-
FIELDcan be eitherdeadlineorname(case-insensitive) -
ORDERcan be eitherascendingordescending(case-insensitive)
Examples:
-
sort name ascendingsorts the client list alphabetically by name in ascending order. -
sort deadline descendingsorts the client list by project deadline (later dates first).
Clientele+ saves you the hassle of sorting the list every time you open the app. Every time you sort, it will save the list in the specified sort order.
Archive a Client: archive
Archives a client present in the main client list.
Format: archive INDEX
-
INDEXrefers to the index number shown in the displayed person list and must be a positive integer 1, 2, 3, …
Examples:
-
archive 1archives the first person in the main client list, removing it and storing it in an archived list
Unarchive a Client: unarchive
Unarchives a client and adds the client back to the main client list.
Format: unarchive INDEX
-
INDEXrefers to the index number shown in the displayed person list and must be a positive integer 1, 2, 3, …
Examples:
-
unarchive 1removes the first person from the archived list, adding it back to the main client list
Listing all archived clients: archive-list
Shows a list of all archived clients’ contacts in Clientele+.
Format: archive-list
The archive list is a purely read-only list. You can only use 5 commands while viewing it:
1.
unarchive (to unarchive a client)2.
list (to navigate back to the main client list)3.
exit (to exit the application)4.
help (to view the help window)5.
archive-list (redundant)All other commands will require you to navigate back to the main client list first using the
list command.
Deadline Reminder
The Deadline Reminder feature automatically tracks the latest upcoming and overdue deadlines for active clients and displays them in the footer. This feature runs without any command input from the user.

- Reminders are only shown for clients with an
activeclient status andin progressproject status. - The feature does not track
completedprojects orold/unresponsive/blacklisted/potentialclients. - If there are
overduedeadlines, only overdue projects are shown; upcoming deadlines will not be displayed
Examples:
Single Client Due Today:
-
John has deadline due today.This shows that John, an active client, has a deadline due today.
More Than Three Clients Due Today:
-
John, Alice, Charlie and 1 more have deadlines due today.This shows that John, Alice, Charlie, and one additional active client have deadlines due today.
No Active Clients With Upcoming Or Overdue Deadlines:
-
No upcoming or overdue reminders.This indicates there are no active clients with upcoming or overdue deadlines.
Reminders shown are only for clients in the main client list, not for those in the archive list.
Data Management
Saving the Data
Clientele+ data is saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
Editing the data file
Clientele+ data is saved automatically as a JSON file [JAR file location]/data/addressbook.json. Advanced users are welcome to update data directly by editing that data file.
Data of archived clients is saved automatically as a separate JSON file [JAR file location]/data/archivedAddressBook.json.
If your changes to the data file makes its format invalid, Clientele+ will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.
Furthermore, certain edits can cause the Clientele+ to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.
Undo Command [coming in v2.0]
Details coming soon …
Add Notes for a Client [coming in v2.0]
Details coming soon …
FAQ
Q: How do I transfer my data to another Computer?
A: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.
Known issues
-
When using multiple screens, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the
preferences.jsonfile created by the application before running the application again. -
If you minimize the Help Window and then run the
helpcommand (or use theHelpmenu, or the keyboard shortcutF1) again, the original Help Window will remain minimized, and no new Help Window will appear. The remedy is to manually restore the minimized Help Window. - Sorting for clients with same Name/Deadline: When a sort is applied, if multiple people share the same name or deadline, modifying other fields (e.g. project status) may shuffle their order, though sorting among different names or deadlines remains correct. This bug is due to a JavaFX SortedList issue and will be fixed in an upcoming update. More details in the Developer’s Guide.
Command summary
| Action | Format, Examples |
|---|---|
| Add |
add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS d/DEADLINE [t/TAG]… [ps/PROJECT_STATUS] [py/PAYMENT_STATUS] [cs/CLIENT_STATUS] e.g., add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 d/10-11-2024 t/friends ps/in progress py/pending cs/active
|
| Clear | clear |
| Delete |
delete [n/NAME] [id/ID]e.g., delete n/John Doe or delete id/4
|
| Edit |
edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]… [ps/PROJECT_STATUS] [py/PAYMENT_STATUS] [cs/CLIENT_STATUS] [d/DEADLINE]e.g., edit 2 n/James Lee e/jameslee@example.com
|
| Find |
find [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]… [ps/PROJECT_STATUS] [py/PAYMENT_STATUS] [cs/CLIENT_STATUS] [d/DEADLINE]e.g., find n/James Jake ps/completed py/paid
|
| Blacklist | blacklist INDEX |
| Whitelist | whitelist INDEX cs/NEW_CLIENT_STATUS |
| Blacklist list | blacklist |
| Whitelist list | whitelist |
| Sort |
sort FIELD ORDER e.g., sort name ascending or sort deadline descending
|
| Archive | archive INDEX |
| Unarchive | unarchive INDEX |
| Archive-list | archive-list |
| List | list |
| Help | help |
| Exit | exit |