Let's be honest applying for internships can be a nightmare. Between grinding LeetCode questions, projects and actually attending classes, tracking internship applications can itself become a full-time job.
Hence, OfferFlow was built by CS students by CS students as we understand the struggle. OfferFlow is a desktop app that helps you:
If you can type fast, OfferFlow will manage your internship pipeline faster than any GUI-focused application!
Ensure you have Java 17 or above installed in your Computer.<br> 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 your OfferFlow.
Open a command terminal, cd into the folder you put the jar file in, and use the java -jar OfferFlow.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.<br>
Some example commands you can try:
list : Lists all internship applications.add n/Google p/96789012 e/google@gmail.com a/70 Pasir Panjang Rd, #03-71 d/2024-06-18 r/Backend Developer s/interviewed t/java : Adds your internship application to Offerflow.delete 3 : Deletes the 3rd contact shown in the current list.clear : Deletes all applications.exit : Exits the app.Refer to the Features below for details of each command.
Notes about the command format:<br>
UPPER_CASE are the parameters to be supplied by the user.<br>
e.g. in add n/NAME, NAME is a parameter which can be used as add n/Google.<br>
e.g n/NAME [t/TAG] can be used as n/Google t/java or as n/Google.β¦ after them can be used multiple times including zero times.<br>
e.g. [t/TAG]β¦ can be used as Β (i.e. 0 times), t/java, t/java t/React etc.<br>
e.g. if the command specifies n/NAME p/PHONE_NUMBER, p/PHONE_NUMBER n/NAME is also acceptable.help, list, exit and clear) will be ignored.<br>
e.g. if the command specifies help 123, it will be interpreted as help.</box>helpShows you a message explaining how to access the help page.
Format: help
addAdds the internship application you have applied for, to help you keep track of all your applications.
Caution: OfferFlow by default does not allow duplicate application with same name and role. Hence, if you choose to add application with duplicate name and role, you can choose whether or not to overwrite it (ie: replace the pre-existing application with the new application)
Format: add n/NAME p/PHONE e/EMAIL a/ADDRESS d/DATE r/ROLE s/STATUS [t/TAG]...
Tip: An application can have any number of tags (including 0)
n/NAME β Name of the companyp/PHONE β company telephone numbere/EMAIL β company emaila/ADDRESS β company locationd/DATE β date when you appliedr/ROLE β job position applied fors/STATUS β application progresst/TAGS β optional fieldsNotes:
@ symbolYYYY-MM-DDadd n/Google p/96789012 e/google@gmail.com a/70 Pasir Panjang Rd, #03-71 d/2024-06-18 r/Backend Developer s/interviewed t/javaadd n/Google p/12345678 e/careers@google.com a/123 qSilicon Valley d/2025-06-01 r/Software Engineer s/pendingoverwriteCaution: OfferFlow by default does not allow duplicate application with same name and role. Hence, if you choose to add application with duplicate name and role, you can choose whether or not to overwrite it (ie: replace the pre-existing application with the new application)
Overwrites pre-existing application in OfferFlow that has the same name and role, with the new application when you try to add an application with the same name and role as another already existing application
Format: overwrite
If you choose to overwrite, type overwrite. If not, continue using the app as per normal and the new duplication application you were trying to add will be automatically discarded
listShows a list of all the internship applications you have added on OfferFlow.
Format: list
editmodeFormat:
editmode INDEX or editmode n/NAME r/ROLE to enter edit mode to edit that particular applicationexitedit to finish editing and exit the editing modeNotes:
INDEX or with the specified NAME and ROLE. The index refers to the index number shown in the displayed person list. The index must be a positive integer 1, 2, 3, β¦t/ without
specifying any tags after it.n/NAME β Name of the companyp/PHONE β company telephone numbere/EMAIL β company emaila/ADDRESS β company locationd/DATE β date when you appliedr/ROLE β job position applied fors/STATUS β application progresst/TAGS β optional fieldseditmode 1 or editmode n/Google r/Software Engineera/Mapletree Business City II, Pasir Panjang area t/High PriorityexiteditReminderUse editmode command to modify or create new Reminders.
Format: u/DESCRIPTION ud/DATE
Example: u/upcoming interview ud/2026-12-12
Use rmr command outside of editmode to remove Reminder of specified Applciation.
Format: rmr <INDEX> or rmr n/<Company_Name> r/<Role>
Example: rmr 1 or rmr n/Google r/software engineer
INDEX: Application index reflected on list.<Company_Name> <Role>: Application that represents an Application to <Company> for <Role>.statusUpdates the status of an existing application.
Format: status n/COMPANY_NAME r/JOB_ROLE s/STATUS
Tip: Status is case-insensitive (e.g. applied, Applied, APPLIED all work)
n/COMPANY_NAME β Name of the companyr/JOB_ROLE β Role applied for (must match exactly)s/STATUS β New status| Status | When to use |
|---|---|
| Interested | Found the role, planning to apply |
| Applied | Submitted your application |
| Interviewing | Interviews scheduled (congrats, halfway there!) |
| Rejected | Didn't get it (we've all been there) |
| Offered | π You got the offer! |
status n/Tiktok r/Data Analyst s/Appliedstatus n/Google r/Software Engineer s/Interviewingstatus n/Meta r/ML Engineer s/RejectedCaution:
findHelps you finds applications whose company names contain any of the given keywords.
Format: find KEYWORD [MORE_KEYWORDS]
KEYWORD β Name of the company[MORE_KEYWORD} β Name of the companygoogle will match GoogleGoogle Meta will match Meta GoogleGoog will not match GoogleOR search).
e.g. Google Meta will return Google, Metafind Meta returns all applications applied to Metafind Meta Google returns all applications applied to Meta and GoogleupcomingHelps you finds applications with upcoming reminders. Also sets OfferFlow to automatically filter for applications with reminders due within the specified number of days on start-up.
Format: upcoming [DAYS]
[DAYS] β An integer X from 0 to 7 inclusive, such that applications with reminders due within X days from today are returned.upcoming 0 returns all applications with reminders due within 0 days of today, ergo by today.upcoming 7 returns all applications with reminders due within 7 days of today, ergo within a week.filterFilters applications by company, applied date, status, or tag.
Format:
filter /n /KEYWORDfilter /d /YYYY-MM-DDfilter /s /STATUSfilter /t /TAGKEYWORD β Name of the companyYYYY-MM-DD β dateSTATUS β application progressTAG β tags in the applicationNotes:
YYYY-MM-DD.Examples:
filter /n /Googlefilter /d /2025-11-11filter /s /Appliedfilter /t /javadeleteYou can delete a specified application from OfferFlow via index or reference via Company name and Role.
Format: delete INDEX
INDEX.INDEX β the index number shown in the displayed application listCaution:
delete 2 deletes the application displayed at index 2Format: delete n/NAME r/ROLE
NAME β company nameROLE β job positiondelete n/google r/Backend Developer deletes the application for Google as Backend Developer.folderCreates a new empty address book saved under data/FOLDER_NAME.json and switches to it.
Format: folder FOLDER_NAME
FOLDER_NAME β Name for the new address book (letters, numbers, underscores, and hyphens only)Caution:
@, .)toggle FOLDER_NAME to switch to it instead.folder Y1S2 creates and switches to a new address book at data/Y1S2.jsonfolder internships-2025 creates and switches to data/internships-2025.json./data/Y1S2.json).toggleSwitches to an existing address book saved under data/FOLDER_NAME.json.
Format: toggle FOLDER_NAME
FOLDER_NAME β Name of the existing address book to switch toCaution:
data/FOLDER_NAME.jsontoggle Y1S2 switches to the address book at data/Y1S2.jsontoggle internships-2025 switches to data/internships-2025.json./data/Y1S2.json).foldersLists all existing address books saved in the data directory.
Format: folders
Folders available:
internships-2025
Y1S2
Y2S1
clearβ οΈ Removes ALL applications. Use with caution.
You can delete all applications on OfferFlow with just 1 command hassle-free!
Format: clear
exitCloses OfferFlow.
Format: exit
OfferFlow data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
OfferFlow data are 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.
Caution:
If your changes to the data file makes its format invalid, OfferFlow 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 OfferFlow 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.
[coming in v2.0]Export past applications into different folder to declutter your active list.
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 OfferFlow 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 | Example |
|---|---|---|
| Add | add n/NAME p/PHONE e/EMAIL a/ADDRESS d/DATE r/ROLE s/STATUS [t/TAG]... | add n/Google p/96789012 e/google@gmail.com a/70 Pasir Panjang Rd, #03-71 d/2024-06-18 r/Backend Developer s/interviewed t/java |
| Overwrite | overwrite | overwrite |
| Clear | clear | clear |
| Delete | delete INDEX or delete n/NAME r/ROLE | delete 3 or delete n/Google r/Backend Developer |
| Edit | editmode INDEX or editmode n/NAME r/ROLE | editmode 1 then a/Mapletree Business City II, Pasir Panjang area then exitedit |
| Status | status n/COMPANY r/ROLE s/STATUS | status n/Tiktok r/Data Analyst s/Rejected |
| Find | find KEYWORD [MORE_KEYWORDS] | find James Jake |
| Filter | filter /n /KEYWORD or filter /d /YYYY-MM-DD or filter /s /STATUS or filter /t /TAG | filter /n /Tiktok or filter /d /2024-06-18 or filter /s /Rejected or filter /t /java |
| Folder | folder FOLDER_NAME | folder Y1S2 |
| Toggle | toggle FOLDER_NAME | toggle Y1S2 |
| List Folders | folders | folders |
| List | list | list |
| Help | help | help |