Linkline is a desktop app for solo technicians to manage client details, optimized for use via a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, Linkline can get your contact management tasks done faster than traditional GUI apps.
Ensure you have Java 17 or above installed in your Computer.
Mac users: Ensure you have the precise JDK version
prescribed here.
Download the latest .jar file from here.
Copy the file to the folder you want to use as the home folder for Linkline.
Open a command terminal, cd into the folder you put the jar file in, and use the java -jar linkline.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 the command in the command box and press Enter to execute it. e.g. typing help and pressing Enter will
open the help window.
Some example commands you can try:
list : Lists all contacts.
add --name=John Doe --phone=98765432 --email=johnd@example.com --address=John street, block 123, #01-01 : Adds a
contact named John Doe to Linkline.
copyaddr 3 : Copies the address of the 3rd contact shown in the current list to user's clipboard.
clear : Deletes all contacts.
exit : Exits the app.
Refer to the Features below for details of each command.
Notes about the command format:
Words in UPPER_CASE are the parameters to be supplied by the user.
e.g. in add --name=NAME, NAME is a parameter which can be used as add --name=John Doe.
Items in square brackets are optional.
e.g --name=NAME [--tag=TAG] can be used as --name=John Doe --tag=AC-Service or as --name=John Doe.
Items with … after them can be used multiple times including zero times.
e.g. [--tag=TAG]… can be used as (i.e. 0 times), --tag=AC-Service, --tag=AC-Service --tag=Plumbing etc.
Parameters can be in any order except for renametag.
e.g. if the command specifies --name=NAME --phone=PHONE_NUMBER, --phone=PHONE_NUMBER --name=NAME is also
acceptable.
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.
The following constraints apply to command fields:
NAME: must not be blank, up to 100 characters.PHONE_NUMBER: must contain 3 to 15 digits in total. Spaces and hyphens are allowed only between digits.EMAIL: must be in valid local-part@domain format and satisfy email length/rule checks.ADDRESS: must not be blank.TAG: must not be blank, 1 to 50 characters.NOTES: 0 to 200 characters.LOG_MESSAGE: must not be blank, 1 to 1000 characters.helpShows a message explaining how to access the help page.
Format: help
help with additional parameters (e.g., help 123) will return an error message.addAdds a client to Linkline. List is automatically sorted lexicographically by NAME, followed by PHONE_NUMBER
Format: add --name=NAME --phone=PHONE_NUMBER --email=EMAIL --address=ADDRESS [--tag=TAG]… [--notes=NOTES]
Tip: A client can have any number of tags (including 0) and 1 or 0 notes.
Examples:
add --name=John Doe --phone=9876-5432 --email=johnd@example.com --address=John street, block 123, #01-01add --name=Betsy Crowe --tag=AC service --email=betsycrowe@example.com --address=123 Clementi Rd #04-05 --phone=9123 4567 --notes=Gate code 1234, beware of large doglistShows a sorted list of all clients in Linkline.
Format: list
list with additional parameters (e.g., list 123) will return an error message.editEdits an existing client in Linkline.
Format:
edit INDEX [--name=NAME] [--phone=PHONE_NUMBER] [--email=EMAIL] [--address=ADDRESS] [--tag=TAG]… [--notes=NOTES]
INDEX.--tag= or --notes= respectively without specifying any
tags after it.Examples:
edit 1 --phone=91234567 --email=johndoe@example.com Edits the phone number and email address of the 1st client to be
91234567 and johndoe@example.com respectively.edit 2 --name=Betsy Crower --tag= Edits the name of the 2nd client to be Betsy Crower and clears all existing
tags.findFinds clients whose names / phone numbers / email address / physical address / tags are matched by the queried keywords specified per field. A sorted list of such clients is returned.
Any find operation is applied only to the currently displayed list, and multiple find / filter operations can be
chained together to shorten the list.
For example, if there are 10 clients initially on the list, and a find / filter operations shortens it to 5 clients,
any subsequent find / filter operations would only search within those 5 clients.
Format:
find [--name=SUBNAME [--name=MORE_SUBNAMES] ...] [--phone=SUBNUMBER [--phone=MORE_SUBNUMBERS] ...] [--email=SUBEMAIL [--email=MORE_SUBEMAILS] ...] [--address=SUBADDRESS [--address=MORE_SUBADDRESS] ...] [--tag=TAG [--tag=MORE_TAGS] ...]
hans will match Hans.Hans Bo will match Bo Hans.OR search). e.g. In name field, Gru Ya will match
Hans Gruber, Bo Yang.OR search) as a union with the other fields mentioned. e.g. In
tag field AC-Service will match only AC-Service.Examples:
find is not a valid command as no fields are provided.find --name=Alice --phone= --email=gmail.com is not a valid command as phone field is specified but empty.find --name=Alice Bob will have 1 keyword Alice Bob.find --name=Alice --name=Bob will have 2 name keywords Alice and Bob.find --name=jon --name=Jack can return clients with names Jonathon Lee, Jon Doe, and Jack Black.find --phone=1234 can return clients with numbers 91234567 and 94561234.find --email=.edu can return clients with email addresses e123456678@u.nus.edu and f123456678@u.ntu.edu.find --address=Street can return clients with physical addresses Woodlands Street, Admiralty Streetfind --tag=wiring can return clients with tag Wiring, but not ElectricalWiring,find --name=James --name=Jake --phone=123 --phone=4567 --email=@yahoo.com --address=Street --address=Avenue --address=Boulevard --tag=Aircon-Repair
is a valid combination of all fields.find --phone=123 --phone=4567 --name=James --name=Jake --tag=Aircon-Repair --email=@yahoo.com --address=Street --address=Avenue --address=Boulevard
will return the same results as the previous command.deleteDeletes the specified client from Linkline with confirmation.
Format: delete INDEX
INDEX.delete INDEX: shows a confirmation message only (no deletion yet).delete INDEX: completes the deletion.delete will cancel the pending deletion.Examples:
list followed by delete 2 delete 2 again confirms and deletes the 2nd client.find --name=Betsy followed by delete 1 delete 1 again deletes that client.delete 1 followed by list Tip: After the first delete 1 command, any of the following will confirm the deletion: delete 1 or delete 01.
Leading/trailing spaces and spaces between the command word and index are ignored, numbers with leading zeros (e.g., '01', '001') also confirm the deletion.
copyaddrCopies the specified client's address from Linkline.
Format: copyaddr INDEX
INDEX.copyeditCopies the edit command format for the specified client, allowing you to easily modify their details.
Format: copyedit INDEX
INDEX.viewShows the specified client's full details.
Format: view INDEX
INDEX in the right-hand panel.Examples:
find --name=John Don followed by view 1add --name=John Doe --phone=9876-5432 --email=johnd@example.com --address=John street, block 123, #01-01 followed by view 1logaddAdds a timestamped log entry to the specified client.
Format: logadd INDEX LOG_MESSAGE
INDEX.LOG_MESSAGE must be between 1 and 1000 characters.Examples:
logadd 1 Observed leakage beneath sink during site visit.logadd 2 Client requested follow-up call next Wednesday at 2pm.logdeleteDeletes a specific log entry from the specified client with confirmation.
Format: logdelete CLIENT_INDEX LOG_INDEX
LOG_INDEX for the client at CLIENT_INDEX.CLIENT_INDEX refers to the index number shown in the displayed client list.LOG_INDEX refers to the log number shown in the UI for that client.Log 5.logdelete CLIENT_INDEX LOG_INDEX: shows a confirmation message only (no deletion yet).logdelete CLIENT_INDEX LOG_INDEX: deletes the selected log.logdelete will cancel the pending log deletion.Examples:
view 2 followed by logdelete 2 1 1 of client 2 (no deletion yet).logdelete 2 1 again confirms and deletes that log.logdelete 2 1 followed by list filterFilters clients whose tags contain all the given keywords. If there is more than one client, the list returned is sorted.
Format: filter --tag=TAG_KEYWORD [--tag=MORE_KEYWORDS]…
Plumbing will match plumbingAND search).renametagRenames an existing tag to a new name across Linkline. All clients with the old tag will be updated with the new tag name.
Format: renametag --tag=OLD_TAG --tag=NEW_TAG
OLD_TAG must exist in Linkline.NEW_TAG must be a valid tag name and should not already exist in Linkline.PLUMBING and plumbing are considered the same tag.Examples:
renametag --tag=AC-Service --tag=Aircon-Repair renames all instances of AC-Service to Aircon-Repair.renametag --tag=plumbing --tag=General-Maintenance renames the plumbing tag to General-Maintenance.deletetagDeletes a specific tag and removes it from all clients currently having it.
Format: deletetag TAG_NAME
TAG_NAME must exist in Linkline.deletetag TAG_NAME: shows a confirmation message only (no deletion yet).deletetag TAG_NAME: removes that tag globally from all clients.deletetag will cancel the pending tag deletion.Examples:
deletetag plumbing plumbing (no deletion yet).deletetag plumbing again confirms and removes it from all clients.deletetag plumbing followed by list clearClears all entries in Linkline.
Format: clear
clear with additional parameters (e.g., clear 123) will return an error message.clear: shows a confirmation message only (no clearing yet).clear: clears all entries in Linkline.clear will cancel the pending action.exitExits the program.
Format: exit
exit with additional parameters (e.g., exit 123) will return an error message.LinkLine data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
LinkLine data are saved automatically as a JSON file [JAR file location]/data/linkline.json. Advanced users are
welcome to update data directly by editing that data file.
Caution:
If your changes to the data file makes its format invalid, LinkLine 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 LinkLine to behave in unexpected ways (e.g., if a value entered is outside the
acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.
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 LinkLine home folder.
preferences.json file created by the
application before running the application again.help command (or use the Help menu, or the keyboard shortcut
F1) 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.| Action | Format, Examples |
|---|---|
| Add | add --name=NAME --phone=PHONE_NUMBER --email=EMAIL --address=ADDRESS [--tag=TAG]… [--notes=NOTES] e.g., add --name=James Ho --phone=22224444 --email=jamesho@example.com --address=123, Clementi Rd, 1234665 --tag=AC-Service --tag=Plumbing --notes=Prefers morning visits |
| Clear | clear |
| Copy Address | copyaddr INDEXe.g., copyaddr 1 |
| Copy Edit Command Format | copyedit INDEXe.g., copyedit 2 |
| Delete | delete INDEXe.g., delete 3 |
| Delete Tag | deletetag TAG_NAMEe.g., deletetag plumbing |
| Edit | edit INDEX [--name=NAME] [--phone=PHONE_NUMBER] [--email=EMAIL] [--address=ADDRESS] [--tag=TAG]… [--notes=NOTES]e.g., edit 2 --name=James Lee --email=jameslee@example.com |
| Filter | filter --tag=TAG_KEYWORD [--tag=MORE_KEYWORDS]…e.g., filter --tag=Plumbing |
| Find | find [--name=SUBNAME [--name=MORE_SUBNAMES] ...] [--phone=SUBNUMBER [--phone=MORE_SUBNUMBERS] ...] [--email=SUBEMAIL [--email=MORE_SUBEMAILS] ...] [--address=SUBADDRESS [--address=MORE_SUBADDRESS] ...] [--tag=TAG [--tag=MORE_TAGS] ...]e.g., find --name=James --name=Jake --phone=123 --phone=4567 --email=@yahoo.com --address=Street --address=Avenue --address=Boulevard --tag=Aircon-Repair |
| Help | help |
| List | list |
| Log Add | logadd INDEX LOG_MESSAGEe.g., logadd 1 Observed leakage beneath sink during site visit. |
| Log Delete | logdelete CLIENT_INDEX LOG_INDEXe.g., logdelete 2 1 |
| Rename Tag | renametag --tag=OLD_TAG --tag=NEW_TAGe.g., renametag --tag=AC-Service --tag=Aircon-Repair |
| View | view INDEXe.g., view 1 |