boopshare development notes

I quickly jotted down these technical notes to show the effort that went into the development of BoopShare. BoopShare is entirely a one-man job; I am currently the sole developer for the entire project. The BoopShare app is designed to run on multiple platforms, but at the time of writing, only the Windows build is publicly available.

(For a description and screenshots of how BoopShare works from an end user perspective, see the user guide at boopshare.com.)

Design

From the beginning, BoopShare was designed to be as user-friendly as possible without being limited or pedantic. The various user interfaces and features, both in the desktop app and on the website, were tweaked and iterated on many times to arrive at the current design.

A great amount of effort went into making the technology work for the user instead of the other way around. It is my belief that almost any computing task can be made completely intuitive with the right design and use of metaphors.

Application core

Written in cross-platform C++. The BoopShare website connects to the sharing user's computer and displays the information in the share page. Download links are HTTP downloads that come directly from the user's BoopShare app via a custom, lightweight, and reasonably compliant HTTP/1.1 server.

BoopShare attempts to use UPnP to configure the user's network; if all else fails, a proxy server is used to mitigate NAT problems.

BoopShare also includes optimized code for dynamically reformatting user data on demand so that file previews can be quickly and easily displayed in the web browser.

Application GUI

Each platform has its own GUI code-base built on top of the cross-platform core. This allows for integration with platform GUI features, reduces the chance of inconsistent/buggy behavior on certain platforms, and won't run the risk of feeling clunky to the user. Not relying on a complex cross-platform GUI library also makes BoopShare more lightweight.

Web software

Consists of a modest amount of PHP and somewhat more JavaScript.

Some features rely on modern browser capabilities, but for the essential functionality, fallbacks to legacy techniques were used in the case of very old or non-compliant browsers. The website was designed from the start to work well on both desktop and mobile web browsers.

Much work also went into presenting on the website, as concisely as possible, how BoopShare works and what its advantages and limitations are, and creating a clean and appealing graphic design.

Proxy

The Proxy is used when the BoopShare app realizes it isn't reachable due to NAT in spite of trying to open a port using UPnP. The Proxy accepts incoming browser requests and fowards them to BoopShare instances via a pre-established connection.

It uses the Linux/POSIX C API (including Linux functions such as epoll() and splice()) for maximum performance. It also confirms with the database that only users running BoopShare have access.

Infrastructure

Unit tests are used to detect regressions and ensure consistent and standards-compliant behaviour in the application core. I use the Catch library.

The more complex automation is done with Python scripts (for example, a Python script prepares new versions of the software on the testing or live servers). Some shell scripts are used, and tools such as SSH and rsync.

I can put out a new build of BoopShare or push updates to the live website with just a few keystrokes.