__
/\ \__ 👎
\ \ ,_\ ____
\ \ \/ /',__\
\ \ \_/\__, `\
\ \__\/\____/
\/__/\/___/... The Struggle
A command-line tool that helps you track your job applications.
Written in Rust. Tested with Rust 1.54.0.
This program is also available in Python, located on the Python branch.
- Introduction
- Installation
- Stored Attributes
- Read This Before You Run the Program
- Walkthrough
- Releases
- Why Rust?
The-Struggle
performs CRUD operations on a local spreadsheet (which is automatically generated for you) and simplifies the process of tracking your applications. It is very fast because:
- It is written in Rust - it is so fast it feels as if the output was hardcoded.
- Doing these operations from the terminal is much faster than opening up a spreadsheet and manually editing it.
Its features include:
- Add, update, or delete job applications from the spreadsheet
- Display/search for tracked job applications, using ANSI Terminal and PrettyTable to color-code and neatly display applications in a table within your terminal.
- Display insights for tracked applications, such as:
- The total number of tracked applications
- The total number and percentage of applications:
- That are pending a response
- That are currently in progress
- Where you have received an offer
- Where you have been rejected from
- Where you have been hired at
I graduated from college in June 2020 and have been applying to tons of companies in attempt to kick off my developer career. It has been very difficult for me to break into the industry because I am a self-taught developer (no CS degree) and I graduated in the midst of the COVID-19 pandemic.
The number of applications that I have sent out is so high, it has become hard to keep track of every company as well as where my application stands in the interview process (if I even pass the resume stage). I decided to make a command-line tool in attempt to help me keep track of my applications and the status of each one. I thought the tool was pretty useful so I put it on here.
Thank you for trying this program and I hope it will help you keep track of your applications as well. It is tough out there, man.
NOTE: This program initializes and reads from files in your current working directory. Run
The-Struggle
in a directory in which you would like all your records to be stored.The complimentary spreadsheet
job_applications.csv
will be created in whichever directory you move thets
binary to.
First, you will need a Rust installation in order to compile The Struggle.
Then run these commands to build The Struggle:
$ git clone https://www.github.com/JosephLai241/The-Struggle
$ cd The-Struggle
$ cargo build --release
To check if The Struggle built correctly:
$ ./target/release/ts -V
You can then move the ts
binary to another directory so you do not have to type that path to run The Struggle. Check if the binary was moved correctly:
$ mv target/release/ts /some/directory/
$ cd /some/directory
$ ./ts -V
If you do not want to compile The-Struggle
, you can also download a binary attached to a release in the Releases section.
Each application will store the following information:
DATE ADDED
COMPANY
JOB TITLE
STATUS
NOTES
DATE ADDED
is automatically calculated based on Rust's chrono.
COMPANY
, JOB TITLE
, and NOTES
are all based on user input.
STATUS
has a few options you can choose from. Each status is mapped to a color and will colorize your job listing within the terminal:
Application Status | Color |
---|---|
PENDING | Blue |
IN PROGRESS | Yellow |
OFFER RECEIVED | Magenta |
HIRED | Green |
REJECTED | Red |
You have to add a job on the initial run of this program. Adding a job on the initial run will create a CSV spreadsheet titled job_applications.csv
within your current working directory. All other functionality of the program will not work prior to adding the first job because there is no valid spreadsheet to read from.
DO NOT create job_applications.csv
manually. The program will create the file for you. Creating an empty job_applications.csv
before running the -a
flag will cause issues for you later on.
Use -h
or --help
if you forget the arguments or do not want to read this walkthrough.
As stated before, this has to be the first command you run. Doing so will create job_applications.csv
in your current working directory.
$ ./ts -a COMPANY_NAME
NOTE: Use quotes around the company name if it is more than one word or contains special terminal characters. For example,
&
is used to run a command asynchronously (running in the background) in a Bash terminal. Running$ ./ts -a H&M
will cause problems for you if you do not wrapH&M
in quotes.
You will then enter the job title at the company, select the status of the job listing, then enter any notes on the job listing. You can just enter through the notes prompt to leave it blank.
The job listing will be written to job_applications.csv
after you confirm.
TIP: You do not have to type the exact company name when updating or deleting a job. The program uses regex to search for existing job listings. You can just type a letter or pattern of letters present in the company name. This will return all job listings with company names that include that letter or pattern.
For example, if you have stored job applications from Uber, Hulu, and YouTube and search for just the letter
u
, the program will list all three of those companies. You can then choose which company you would like to update or delete from that list.
Updating an existing job
$ ./ts -u COMPANY_NAME
Use the NUMBER
in the far left column to pick the job you want to delete:
Choose the section you want to update. You can modify the job's company name, job title, application status, or notes.
The job listing will be updated in job_applications.csv
after you confirm.
Deleting an existing job
$ ./ts -d COMPANY_NAME
Identical to updating, you can just enter a letter or pattern in the company name and use the NUMBER
in the far left column to choose the job you want to delete.
The job listing will then be deleted from job_applications.csv
after you confirm.
$ ./ts -s COMPANY_NAME
Use this command to quickly search for an existing job. Matches are displayed in a PrettyTable. Like the update and delete commands, you can simply search for letters that are present in the company name to return a match.
$ ./ts -l
Job applications are sorted by date (descending) and are colorized based on the application status. See the application status and color table in the Stored Attributes section for details.
$ ./ts -i
You can display some insights about the jobs that are stored in the spreadsheet. The program will print how many jobs are listed under each job status as well as its percentage within the spreadsheet.
Each cell is also colorized based on the table described in the Stored Attributes section.
-
May 18, 2020: v1.0.0 (Python Edition). Features include:
- Add a new job
- Update an existing job
- Delete an existing job
- List all stored jobs
- Print job application insights
-
July 4, 2020: v2.0.0 (Rust Edition).
- Unfortunately had to remove the optional list sorting method since Rust's PrettyTable currently does not have some kind of
sort()
method. - Insights will now only display all job status insights rather than including options to only display a specific status. I figure most people would not bother using any of the other options anyways.
- Deploying with Travis CI.
- Scary fast.
- Unfortunately had to remove the optional list sorting method since Rust's PrettyTable currently does not have some kind of
-
August 4, 2021: v2.0.1.
- Previously, prompts would end with a newline character, so user-entered data would appear on a new line underneath the prompt. They are now inline with user-entered data.
- Added a new flag,
-s
/--search
, to search for an existing job. - Formatting and refactoring throughout the source code.
I chose Rust because one of my best friends Luke Schenk told me Rust is amazing and encouraged me to try it. Also, I have finished too many projects in Python and wanted to add some variety to my portfolio. Rust and Python are two very different languages, so Rust is just the perfect choice for me since I am looking to get better at programming in a language besides Python.