The project would require both a frontend and backend component. The frontend only required a simple web interface to upload the file and display information about the resulting compressed file.
For the backend, I went with Python Flask because it is the Python framework I have had the most experience with.
When a user uploads a file, the backend will save the uploaded file to a specific input folder and immediately compress it into a separate output folder.
Each file would be associated with a unique id (UUIDv4 for it's randomness) to prevent filename clashes.
This application could benefit from multithreading if there was enough load and big enough files as each file can be independently processed, but that is out of scope for this project.
I chose to go with a simple Huffman Coding algorithm because it is a true and tested algorithm. The only difficult part was deciding whether to make each node 3-bytes or 1-byte, but it was much better to go with 1-byte because it only has 256 possible combinations.