JobTracker was implemented as a webapp. The frontend was written in HTML5, JQuery, Javascript, and CSS. The backend was implemented with Ruby CGI scripts and a SQLite database.
We chose to use CGI scripts because of the steep learning curve involved with learning a web framework such as Ruby on Rails. We also considered writing different pages using different languages for the backend scripts, and figured CGI scripts would be the most straightforward way to allow this. We also chose to use a SQLite database so we'd have a minimal learning curve on the backend, allowing us to focus on the user interface.
The CGI scripts shared no common state besides the SQLite database, and so had to pass around arguments to communicate with each other. For our purposes, this was okay, but it could lead to unfortunate security and UI problems if the user decides to alter the URL.
We used quite a few jQuery widgets to implement our interface including the accordion widget and the datepicker widget to give familiar and useful functionality to the user without having to write large amounts of code. Using pre-made widgets allowed us to make our interface more learnable through familiarity, but it also inhibited the level of customization we could do.
The webapp implementation has some disadvantages that adversely affect the user interface. It depends heavily on jQuery and Javascript, which can run slowly depending on the user's browser and computer power. In addition, cross platform functionality is a problem in a webapp. Our system works fine in Firefox and Chrome, but doesn't work very well in Internet Explorer.
However, for an app that was as rapidly updated as Jobtracker, webapps do allow the ability to push instant updates, without requiring the end user to download anything, allowing us to deliver upgraded functionality with minimal effort on the user's part. Also, part of the purpose of JobTracker is to allow people to access their information from anywhere, which is most easily accomplished on a web based platform.
One major problem in our implementation was that given our unfamiliarity with Javascript, we found it much easier to come up with useful features than actually implement them. For example, it took a long time to accomplish basic things, such as dynamically updating selection boxes on the page when one added a new company to the homepage or implement the basic CRUD framework for tasks and companies. We would have liked to do more things, like dynamically re-sort the tasks and companies upon making additions, but simply ran out of time to finish everything.