ClientGrid is an address book targeted for English-speaking real estate agents handling residential properties within Singapore. It is used to efficiently manage client contacts, properties and meeting schedule by providing a streamlined way to organize these data while maintaining core address book functionality. It is a desktop app optimized for fast user interactions through a Command Line Interface (CLI), while maintaining the user-friendly visual elements of a Graphical User Interface (GUI).
ClientGrid Context TL;DR:
Ensure you have Java 17 or above installed in your Computer. View this tutorial for Java 17 installation.
Download the latest .jar file from here.
Copy the file to an empty folder that you want to use as the home folder for ClientGrid.
Open a command terminal.
In the command terminal, navigate into the folder you placed the jar file in using cd. View this tutorial for using the cd command in your command terminal.
Type the java -jar clientGrid.jar command to run the application.
A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.

Type a command in the command box and press Enter to execute it. For example, typing help and pressing Enter will open the help window. Refer to the Features below for details of each command and the Command Summary for a quick overview of all the commands.
Notes about the command format:
All the commands in ClientGrid (e.g. list, addbuyer, addproperty, addmeeting, etc.) are case-sensitive and must be entered in lower case.
Words in UPPER_CASE are the parameters to be supplied by the user.
e.g. In addbuyer n/BUYER_NAME p/BUYER_PHONE_NUMBER e/BUYER_EMAIL, BUYER_NAME, BUYER_PHONE_NUMBER and BUYER_EMAIL are parameters which can be used as addbuyer n/John p/81234567 e/john@gmail.com.
Parameters in square brackets are optional.
e.g. t/TYPE [lte/MATCHING_PRICE] can be used as t/HDB lte/300 or t/HDB.
Parameters can be in any order.
e.g. If the command specifies n/BUYER_NAME e/BUYER_EMAIL p/BUYER_PHONE_NUMBER, e/BUYER_EMAIL p/BUYER_PHONE_NUMBER n/BUYER_NAME is also acceptable.
Extraneous parameters for commands that do not take in parameters (such as help and exit) will be ignored.
e.g. If the command specifies help 123, it will be interpreted as help.
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.
helpShows a message explaning how to access the help page.
Format: help
listShows a list of all existing buyers, sellers, clients (i.e. buyers and sellers), properties, or meetings in ClientGrid.
Format: list k/KEY
The list command displays records based on the specified KEY.
The KEY must be one of the following: buyers, sellers, clients, properties, or meetings.
buyers: Lists all buyers in the client book.sellers: Lists all sellers in the client book.clients: Lists all clients (i.e. buyers and sellers combined) in the client book.properties: Lists all properties in the property book.meetings: Lists all meetings in the meeting book.If an invalid KEY is provided, an error message will be displayed.
The KEY is case-insensitive and ignores leading and trailing spaces.
Examples:
addbuyerAdds a specified buyer into the client book of ClientGrid.
Format: addbuyer n/BUYER_NAME p/BUYER_PHONE_NUMBER e/BUYER_EMAIL
BUYER_NAME, BUYER_PHONE_NUMBER, and BUYER_EMAIL.BUYER_NAME must not be empty. Each word is separated by a single space or apostrophe and has a character limit of 747 (longest name in the world is 747 characters).BUYER_PHONE_NUMBER should only contain 8 digits in the range [0-9] and can only start with '3', '6', '8' or '9' (as per the format for Singapore phone numbers). Spaces are not allowed between the 8 digits.BUYER_EMAIL should be of the format local-part@domain and adhere to the following constraints:
local-part should only contain alphanumeric characters and these special characters: +, _, ., -.
local-part may not start or end with any special characters and must not contain consecutive special characters.@ and then a domain.domain must:
example@gmail.com, example@u.nus.edu.Duplicate Buyers And Emails
Special Scenario: It's possible to have a buyer and seller with the same phone number but different names/emails. This flexibility provided by ClientGrid allows users to record the same client under different names/emails in buying and selling roles, which may be useful for clients operating under separate business identities (e.g. personal vs. professional roles).
Examples:
addbuyer n/John p/83456789 e/john@gmail.com adds a buyer whose name is John, phone number is 83456789 and email is john@gmail.com.
addsellerAdds a specified seller into the client book of ClientGrid.
Format: addseller n/SELLER_NAME p/SELLER_PHONE_NUMBER e/SELLER_EMAIL
SELLER_NAME, SELLER_PHONE_NUMBER, and SELLER_EMAIL.SELLER_NAME, SELLER_PHONE_NUMBER and SELLER_EMAIL are identical to the restrictions for the BUYER_NAME, BUYER_PHONE_NUMBER and BUYER_EMAIL respectively as specified in the addbuyer command.Duplicate Sellers And Emails: For seller-specific restrictions, please refer to the addbuyer command. The same rules apply, including:
addbuyer command:
The Special Scenario also applies here: you can have a buyer and seller with the same phone number but different names/emails, allowing flexibility for clients who operate under different names/emails in buying and selling roles.
Examples:
addseller n/Mary p/83456789 e/mary@gmail.com adds a seller whose name is Mary, phone number is 83456789 and email is mary@gmail.com.
filterclientFilters the clients that starts with the prefix (case-insensitive) provided.
Format: filterclient n/NAME
NAME.NAME is identical to the restrictions for the BUYER_NAME specified in the addbuyer command.Examples:
deletebuyerDeletes the specified existing buyer from the client book of ClientGrid.
Format: deletebuyer p/BUYER_PHONE_NUMBER
BUYER_PHONE_NUMBER.BUYER_PHONE_NUMBER is identical to the restrictions for the BUYER_PHONE_NUMBER specified in the addbuyer command.Examples:
deletesellerDeletes the specified existing seller from the client book of ClientGrid.
Format: deleteseller p/SELLER_PHONE_NUMBER
SELLER_PHONE_NUMBER.SELLER_PHONE_NUMBER is identical to the restrictions for the BUYER_PHONE_NUMBER specified in the addbuyer command.Examples:
addpropertyAdds a specified property into the property book of ClientGrid.
Format: addproperty c/POSTAL_CODE u/UNIT_NUMBER t/TYPE a/ASK b/BID
TYPE with the specified POSTAL_CODE and UNIT_NUMBER with seller's estimated ASK price (in thousands) and buyer's estimated BID price (in thousands).POSTAL_CODE must be a non-negative integer and contain exactly 6 numeric characters.UNIT_NUMBER must contain numbers delimited by a dash, and numbers on either side of the dash must be at least 2 characters long with no excess padding. The range of numbers on the left hand side of the dash is [00-148] and the right hand side is [00-111110].TYPE must be one of the following values (case-insensitive): HDB, CONDO, or LANDED.ASK must be a non-negative integer smaller than 1,000,000 (thousand) with only numeric characters.BID must be a non-negative integer smaller than 1,000,000 (thousand) with only numeric characters.Duplicate Properties: No duplicate properties are allowed. Duplicate properties are checked based on:
LANDED, then the comparison is done based on postal code.CONDO and one property is a HDB, then the comparison is done based on postal code.CONDO or are both HDB, then the comparison is done based on postal code and unit.Unit Defaults:
The UNIT_NUMBER parameter for LANDED properties will default to 00-00 regardless of the value placed. This is because a landed property is not segmented into multiple apartments and therefore, deemed to be a unit in itself.
Padding In Unit:
ClientGrid follows Singapore’s convention of padding unit numbers with 0. Single-digit numbers require a leading 0 (e.g. 08-12 instead of 8-12).
For numbers with two or more non-zero digits, avoid extra padding with 0 (e.g. 18-12 instead of 018-12).
Ask And Bid Prices:
Since property prices in Singapore typically start in the thousands, Ask and Bid prices will be calculated in increments of $1 (thousand) to provide agents with a quick estimated value without focusing on smaller denominations. Therefore, prices less than $1 (thousand) will round down to $0 (thousand) as any smaller denominations are considered negligible.
Examples:
addproperty c/124894 u/15-20 t/HDB a/600 b/500 adds a property with postal code 124894 and unit number #15-20 whose type is a HDB with an ask price of $600 (thousand) and bid price of $500 (thousand).
filterpropertyFilters existing properties based on any combination of type, lower bound for matching price and upper bound for matching price.
Format: filterproperty [t/TYPE] [gte/MATCHING_PRICE] [lte/MATCHING_PRICE]
TYPE, lower bounded MATCHING_PRICE and upper bounded MATCHING_PRICE.TYPE is case-insensitive: HDB, CONDO or LANDED.MATCHING_PRICE must be a non-negative integer smaller than 1,000,000 (thousand) with only numeric characters.Defining Parameter Abbreviations
gte/: Means greater than or equal. Sets the lower bound, filtering values greater than and including the specified number.
lte/: Means lesser than or equal. Sets the upper bound, filtering values less than and including the specified number.
Important
gte/ and lte/ parameters are checked based on the 'AND' condition. For example, filterproperty gte/500 lte/60000 filters for properties greater than or equal to $500 (thousand) and less than or equal to $60,000 (thousand).filterproperty gte/600 lte/500 will simply not return any results.Examples:
filterproperty t/HDB gte/400 lte/700 filters and lists properties which is type HDB and matching price is greater than or equal to $400 (thousand) and less than or equal to $700 (thousand).
deletepropertyDeletes a specified existing property from the property book of ClientGrid.
Format: deleteproperty c/POSTAL_CODE u/UNIT_NUMBER
POSTAL_CODE and UNIT_NUMBER.POSTAL_CODE and UNIT_NUMBER are identical to the restrictions for the POSTAL_CODE and UNIT_NUMBER specified in the addproperty command.Examples:
addmeetingAdds a specified meeting to the meeting book of ClientGrid.
Format: addmeeting mt/MEETING_TITLE d/MEETING_DATE bp/BUYER_PHONE sp/SELLER_PHONE t/TYPE c/POSTAL_CODE
MEETING_TITLE and MEETING_DATE, including the provided BUYER_PHONE, SELLER_PHONE, as well as the POSTAL_CODE and TYPE of the property involved.MEETING_TITLE should only contain alphanumeric characters and spaces. It should not be blank (or contain only whitespaces) and it should not exceed 100 characters (excluding starting and ending whitespaces).MEETING_DATE should be in the format dd-MM-yyyy and must be a valid date that is today or in the future.BUYER_PHONE and SELLER_PHONE are identical to the restrictions for the BUYER_PHONE_NUMBER specified in the addbuyer command.POSTAL_CODE and TYPE are identical to the restrictions for the POSTAL_CODE and TYPE specified in the addproperty command.Duplicate Meetings:
MEETING_TITLE and MEETING_DATE.MEETING_TITLE is case-sensitive, so titles like meeting 1 and MEETING 1 are treated as distinct.Note:
BUYER_PHONE refers to a buyer's phone number. There must be an existing buyer in the client book that has a phone number that is equal to the BUYER_PHONE.SELLER_PHONE refers to a seller's phone number. Likewise, there must be an existing seller in the client book with a phone number equal to SELLER_PHONE.POSTAL_CODE refers to a postal code. The postal code must belong to some existing property in the property book of the specified TYPE.Examples:
addmeeting mt/Meeting 1 d/01-01-2025 bp/95352563 sp/87652533 t/HDB c/123456 adds a meeting with meeting title Meeting 1, meeting date 01-01-2025, buyer's phone number 95352563, seller's phone number 87652533, property type HDB and postal code 321456.
deletemeetingDeletes a specified existing meeting from the meeting book of ClientGrid.
Format: deletemeeting mt/MEETING_TITLE d/MEETING_DATE
MEETING_TITLE and MEETING_DATE.MEETING_TITLE and MEETING_DATE are identical to the restrictions for the MEETING_TITLE and MEETING_DATE specified in the addmeeting command.MEETING_TITLE is case-sensitive, so to delete a meeting, the title must be specified with the exact same casing as the original entry.
Examples:
deletemeeting mt/Meeting 1 d/01-01-2025 deletes a meeting with meeting title Meeting 1 and meeting date 01-01-2025.
exitExits the program.
Format: exit
ClientGrid data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
Client, meeting, and property data are automatically saved as separate JSON files in [JAR file location]/data/:
clientbook.json for client (i.e. buyers and sellers) entriesmeetingbook.json for meeting entriespropertybook.json for property entries📁 [JAR file location]
└── 📁 data
├── clientbook.json
├── meetingbook.json
└── propertybook.json
Advanced users are welcome to directly update data by editing these individual files in the data directory.
Caution:
If your changes to the data files make its format invalid, ClientGrid 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 ClientGrid to behave in unexpected ways (e.g. if a value entered is a restriction as defined in the commands above). Therefore, users are cautioned to only edit the data files if they are confident that you can update it correctly.
Q: Can buyers and sellers have the same phone number?
A: Yes. A single client can be both a buyer and a seller of properties and can use the same phone number in both roles. However, two different buyers or two different sellers cannot share the same phone number.
preferences.json file created by the application before running the application again.A-Z, a-z) or numbers (0-9).@ symbol.gmail and com in gmail.com).@ symbol.ASK price and highest BID price.com, org, or edu. It generally indicates the type or location of the organization.| Action | Format |
|---|---|
| Help | help |
| List | list k/KEY |
| Add Buyer | addbuyer n/BUYER_NAME p/BUYER_PHONE_NUMBER e/BUYER_EMAIL |
| Add Seller | addseller n/SELLER_NAME p/SELLER_PHONE_NUMBER e/SELLER_EMAIL |
| Filter Clients | filterclient n/NAME |
| Delete Buyer | deletebuyer p/BUYER_PHONE_NUMBER |
| Delete Seller | deleteseller p/SELLER_PHONE_NUMBER |
| Add Property | addproperty c/POSTAL_CODE u/UNIT_NUMBER t/TYPE a/ASK b/BID |
| Filter Properties | filterproperty [t/TYPE] [gte/MATCHING_PRICE] [lte/MATCHING_PRICE] |
| Delete Property | deleteproperty c/POSTAL_CODE u/UNIT_NUMBER |
| Add Meeting | addmeeting mt/MEETING_TITLE d/MEETING_DATE bp/BUYER_PHONE sp/SELLER_PHONE t/TYPE c/POSTAL_CODE |
| Delete Meeting | deletemeeting mt/MEETING_TITLE d/MEETING_DATE |
| Exit | exit |