Projects


Web Applications

AuthorityMetrics

authoritymetrics.com
  • Meteor 1.2.1
  • MongoDB
  • Git
  • IronWorker
  • Stripe
  • SEMRush API
Visit Site

Background

AuthorityMetrics is a SaaS keyword research tool that not only helps you to brainstorm keywords and retrieve their search volume, cost per click, and Adwords saturation, it also performs detailed competition analysis on every single keyword result instantaneously. This helps save massive amounts of time and effort usually spent on analyzing the feasibility of ranking for specific terms, so that you only target the keywords that you know you can successfully compete for.

In addition, AuthorityMetrics goes beyond Google Adwords Keyword Tool's suggestions and allows you to come up with lesser known and more profitable keywords by entering specific web pages to give recommendations for keywords that match the content on that page. This allows you to spy on your competition and find their keywords so you can increase your traffic.

Technology

Meteor was chosen as the framework for AuthorityMetrics because of the realtime nature of the application. It allows us to update the UI on the fly as soon as background workers finish analyzing keywords, so that users get access to data immediately.

Massively distributed workers are used to parallelize the computationally intensive competition analysis of the search engine result listings for each keyword retrieved and avoid rate limiting.

Keyword results are cached for performance optimization and to conserve computational resources.

Basic natural language processing is implemented by the competition analysis workers to determine relevance and also compute various metrics shown to users.

Payment processing is handled through Stripe with multiple plan tiers supported. SSL is set up to secure credit card information.

We integrate tightly with the SEMRush API to obtain keyword data.

Ranktracker.io

ranktracker.io
  • Ruby on Rails 4.1.4
  • Postgres 9.2
  • Redis (as custom RRD)
  • Devise
  • FriendlyId
  • Git
  • IronWorker + IronMQ
  • Stripe
  • RocketPants API
Planned
  • ApiAxle
  • CanCan
Visit Site

Background

Ranktracker.io is a SaaS platform that automatically checks your site's ranking in the search engine results daily. Since a site's position in the rankings strongly correlates with the amount of traffic it will receive, keeping track of the rank is an important step to making sure that any SEO performed is making a (hopefully positive) impact.

There is a versioned API for third party applications to request and retrieve data through, complete with autogenerated API documentation.

Technology

Redis Lists are used to store the ranking data, and additional backend logic has been added to modify it to function as a round robin time series database similar to WhisperDB used in Graphite. This ensures that each keyword / URL pair will at most only use a certain amount of space while allowing for further customization in the future.

Massively distributed workers are used to parallelize rank checks and avoid rate limiting, and message queues are used to communicate and coordinate amongst all of the workers.

Payment processing is handled through Stripe; there are multiple plan tiers supported. SSL is set up to secure credit card information.

ApiAxle (through Node.js) is planned to be integrated to help with API keys / HMAC authentication, enforcing rate limits, and caching results.

DomainJawa

domainjawa.com
  • Ruby on Rails 4.0.3
  • Postgres 9.2
  • Heroku
  • Git
  • Devise
  • ActiveAdmin
  • Stripe
Visit Site

Background
DomainJawa was created from scratch in 48 hours as a fun challenge.

It is a marketplace for people to purchase high metric expired domains, which have previously acquired backlinks that are still valuable for SEO (search engine optimization) purposes. These domains were found through a separate web crawler project that I wrote.

Stripe is used for payment processing.

Technology

Daily updates are sent when new inventory is added so that customers can be alerted.

Heroku hosts the site and SSL was set up to securely process credit card information.

OneRyng

oneryng.com
  • Ruby on Rails 3.2.12
  • Postgres 9.2
  • Heroku
  • Git
  • Nginx
  • SSL
  • Stripe for payment processing
  • Mandrill for email
  • PPTP VPN
  • L2TP/IPSec VPN
  • Sensu for monitoring
Visit Site

Background
OneRyng is a VPN service that allows users to surf the web quickly and privately. It takes advantage of particular architectural decisions that make it more difficult to block in countries with internet censorship.

OneRyng currently provides both PPTP and L2TP/IPSec protocols for users with support for OpenVPN coming soon. It is integrated with Stripe for payment processing.

Technology
OneRyng's dashboard runs on Heroku via Unicorn to improve concurrency and uses an nginx reverse proxy to handle the SSL endpoint issue as well as serve static content.

Stripe callbacks are used to determine when to perform particular events such as sending out welcome emails, setting up new username/password combinations, provisioning new VPN servers, etc.

Currently shell scripts are used to automate new user creation as well as VPN server provisioning but will migrate to Chef or Puppet in the future for server provisioning.

VPN servers are monitored using Sensu since it allows dynamic discovery of new nodes. Nagios requires that a static environment to perform monitoring, which is not feasible for my production setup because a new VPN server may be provisioned automatically at any time.

Domain Crawler

(private url)

Background
The Domain Crawler is the commercialization of the Koba project (see below). It crawls the web and determines if outbound links from seed urls contain domains that are able to be registered directly from a registrar without having to go through aftermarket auctions or sales. These domains are valuable because they already have inbound links and therefore when set up again, most of them have some PageRank and a better chance to rank.

Technology
Refactoring the original Koba code was necessary to bring this product to market; Anemone as a crawler wasn't stable enough to use in production, so I switched to Scrapy which boasted significant speedup and stability over its Ruby counterpart. After Scrapy retrieves all outbound URLs from seed domains, those domains are stored in Redis. Sidekiq workers are then used to retrieve the domains from Redis and queue domain availability checking. Duplicate jobs are filtered to prevent redundant work and there is a nice control panel to monitor status. Since worker tasks can be run in parallel, the system is extremely fast and scalable.

The customer facing frontend is a Rails app that uses Devise for authentication and authorization. Regular users can just browse the list of domains available for registration, and can sort by different metrics to determine a domain's value and whether or not it is worthwhile for registration. Admin users can run the crawler, clean up the domain list by removing spam, and administrate users. Data is cached via memcached to improve performance by reducing the need to retrieve information from disk.

Koba

(private url)
  • Sinatra
  • Ruby 1.9.3
  • PostgreSQL 9.1
  • Redis
  • WebSockets
  • Anemone
  • Webdis
  • Git (with submodules)
  • SEOMoz API
  • Whois

Background
Koba is the codename for an internal tool I developed in Ruby and Python for crawling the web in order to find valuable domains that have already expired. It connects with a variety of APIs, including SEOMoz, AHrefs.com, and various WHOIS services to obtain the data required for automating calculation of estimated domain value.

Technology
The system is designed as a state machine, and each candidate domain moves between various states: when they are identified by the web crawler, data is being pulled, value is being calculated, spam is being filtered, etc.

Each state is represented by a key in Redis, with the value being a set of the domain names currently in that state.

Both AOF and RDB persistence methods are used in Redis to ensure that data is not completely lost on reboot, but I do realize that some data may be lost because of the nature of the snapshots.

I also wrote a quick Sinatra control panel so I could see in real-time the cardinality and contents of each set of domains in each state, as well as a separate page with the discovered valuable domains to be manually evaluated and purchased. Webdis provides direct JavaScript access to Redis data which is retrieved via long-polling AJAX or WebSockets.

The entire system was optimized so that it could run on a 1024 MB Linode VPS - this includes the web crawler.

HelloHero cofounder

hellohero.co
  • Ruby on Rails 3.2.12
  • Postgres 9.2
  • Heroku
  • Git
  • Devise
  • ActiveAdmin
  • Apache
  • Twitter API
Visit Site

Background
HelloHero was created from scratch in 72 hours during the 2013 Launch Hackathon in San Francisco.

We allow people to bid for an hour-long meeting with their favorite celebrity and donate the proceeds to a charity of the celebrity's choice.

The team consisted of 3.5 members since one person dropped out during the hackathon. We also wrote, practiced, and delivered a 2 minute pitch to a panel of VC / angel judges.

Technology
We take advantage of the Twitter API to grab verified users as the seed data set. Twitter's typeahead.js library handles the search bar autocompletion.

Heroku hosts the site and an Apache transparent reverse proxy allows for a free custom domain.

BitXF cofounder

Background
BitXF is a Bitcoin marketplace created to serve the Chinese demographic. It accepts deposits and withdrawals from Taobao and Alipay, the eBay and Paypal of China.

Security is a huge concern for BitXF, which is why the vast majority of Bitcoins are held in cold storage (offline).

Technology
Although I don't believe in security through obscurity, my cofounder and I would still prefer to keep the implementation details of BitXF private to add an extra layer of protection.

Please ask in-person for more details.

Private Blog Network

(private url)
  • Ruby on Rails 3.2.12
  • PostgreSQL 9.2
  • Heroku
  • Devise
  • ActiveAdmin
  • Git
  • SEOMoz API
  • WordPress XMLRPC API

Background
I created a private blog network to administer a collection of WordPress blogs for a select group of trusted members.

I developed a credit system that maintains fairness in the network by rewarding users with credits for posting content and performing manual review while requiring credits to post content.

Technology
The PBN uses the WordPress XMLRPC API to post articles to specified blogs after strict manual review by multiple network members. It also uses the SEOMoz API to retrieve domain information to automatically calculate the value of sites entered into the network for further manual review.

Devise provides the user authentication functionality and ActiveAdmin provides a convenient interface for administering the sites and performing manual reviews.

Plethura

plethura.com
  • Django 1.3
  • SQLite
  • Git
Visit Site

Background
Plethura is a collection of technological tools for making writers' lives easier. Its first product is an ebook format converter which takes a manuscript and generates all the popular ebook file formats used in portable reading devices today including the Kindle, iPhone, iPad, and Android.

Planned future functionality includes a novel (pun intended) method for distributing ebooks that allows readers to try before buying while INCREASING conversion rates.

To be honest, I also just wanted to try Django.

Technology
Plethura is built using the Django web application development framework because of its modularity and loosely coupled design. While in the early stages, I'm using SQLite to simplify data storage but will move to PostgreSQL.

ModelMaker

modelmaker.pillarofeden.com
  • PHP
  • CodeIgniter 2
  • i18n and l10n
  • File Uploading
  • Image Processing (GD)
  • MySQL
  • Selenium
  • Git
Visit Site

Background
ModelMaker is a joint venture between myself and Zai, a former model turned model recruiter who was introduced to me by my cousin. She wanted a web application to allow aspiring Chinese models to apply directly for her model recruiting agency, since she had a lot of gigs but not enough supply to meet the demand.

Unfortunately my business partner has been going through a difficult time with some personal issues, including domestic violence and alcoholism so development has been postponed indefinitely while she deals with these issues. As a result the site is unfinished as you can see, and still only running on a staging server. The project has been abandoned and is now open sourced on GitHub:
http://github.com/hanchang/ModelMaker

Technology
CodeIgniter was the PHP MVC framework chosen for this application because of my previous familiarity (see below). Internationalization was required due to the multilingual nature of the site. Selenium tests were underway for quality assurance, and a continuous integration process was in development.

Fuel For Hire cofounder

fuelforhire.com
  • PHP
  • CodeIgniter
  • MySQL
  • Subversion
  • Distributed Team
Visit Site

Background
Fuel For Hire was created when two of my college buddies were looking for jobs during senior year. I was still a junior at that time but kept hearing them talk about how difficult it was to tell which companies were good to work for. We decided to make a website where people could share their interview and employment experiences so that applicants could get a better idea of who they would be working for.

Technology
The site was made in CodeIgniter , a rapid development PHP MVC framework. All the HTML/CSS was done by hand; no templating system was used. MySQL was the database used via CodeIgniter's ActiveRecord class. We had a Subversion repository from the start to help with collaboration.

Methodology
We were a very democratic group; all decisions made had to be unanimous, but unfortunately we found out that this meant that decisions took a long time to come to a conclusion. After they graduated, my cofounders and I continued work on the site remotely with weekly status meetings. Approximately half of the site was created in this fashion. We decided to call it quits about a year later after it was clear that our venture capital backed competitor Glassdoor had dominated the market.

Sudoku for Rainforests & Play for Clean Water

Background
Both of these sites were created back in college when I was deeply inspired by freerice.com. I thought it was so cool that they combined learning with philanthropy and wanted to do something similar. At the time, sudoku was the hot new thing and so I decided to combine the two together.
At first I had difficulty selecting charitable causes but after some research on Charity Navigator I decided to pick the Rainforest Alliance and Charity: Water.

Tokogae

tokogae.com

  • PHP
  • Ajax
  • Google
  • Philanthropy

Background
Tokogae stands for the "Tree of Knowledge of Good and Evil" and is a search engine that donates its proceeds to a charity of the user's choice. It basically just leverages the Google private search and I also created this back in college.

It uses an Ajax interface to allow the user to select the charity they want proceeds to go towards and stores their selection in a cookie.


Open Source Contributions

Ruby Ecosystem

redis-store
The redis-store gem (one of the cache implementations for ActiveSupport) was lacking the ability to set an TTL expiration for values entered. I implemented it along with tests and my pull request was merged into the project: redis-store PR 184
koudoku
The koudoku gem, a Rails engine for easily integrating Stripe subscriptions, was lacking the functionality to disable prorated refunds, so I implemented it and submitted a pull request: koudoku PR 74

Friar Framework

The Friar Framework is an Android framework for creating mobile application versions of ebooks.

I wanted to publish ebook mobile app versions of my programminginterview.com website content on both iOS and Android but only found a framework for iOS. As a result, I ported the Baker Framework over to Android and called it Friar Framework (it's a pun, get it?).

Friar Framework Website

Mozilla Firefox

I am a Mozilla contributor who believes in open source and enjoys donating my occasional spare time to fix bugs in Firefox. I'm also super interested in FirefoxOS.

To see a list of all the bugs I've contributed to so far, check out: http://www.szuhanchang.com/mozilla

Find me on Mozilla's #introduction IRC channel, I'm frequently there!

Horde Framework

During the summer between my freshman and sophomore years of college, I applied and was accepted into the first ever Google Summer of Code program to work on the Sedule Project, a module in the Horde Framework to help managers schedule employee shifts based on their availability.

Horde is a very popular open source framework best known for providing a modular, customizable webmail interface.

My successful completion of the project earned me a $7500 grant from Google and a $2500 grant to Horde.

wiki.horde.org/project/sedule


Content Sites

LocalizedAcademy

Background
I have experience in local business marketing and packaged it up as an online video course. The recording process was difficult at first but a great learning experience to get comfortable in front of a camera and also develop some video editing skills.

Technology
Instead of building something from scratch, I leveraged an existing SaaS solution that was quite effective for getting to market quickly and also provided excellent design and administrative functionality for hosting online courses.

Worldly Travelers Guide

Background
My girlfriend and I are avid travelers; she's compiled a website with detailed itinerary information about our travel destinations for other people to help plan their vacations. There is an English version as well as a Chinese version.

Technology
Since the WordPress shared host server is in Texas, I use nginx on a VPS located in California as a transparent reverse proxy to serve the Chinese site in order to help reduce latency and page load time. This has resulted in dramatic loading time improvements, from a pathetic 28s load time to just under 10s through a Chinese internet connection for a 180% speedup.

Snowboards for Women

snowboardsforwomen.com
  • PHP
  • CodeIgniter
  • MySQL
  • Beautiful Soup
  • Shell Scripting
  • Cron
  • Regular Expressions
  • SEO
Visit Site

Background
Snowboards for Women was created because I love snowboarding and wanted my to help my then girlfriend choose a snowboard so she could come with me on trips. It was difficult to find a women's snowboard so I used Beautiful Soup, a Python HTML parser, to scrape the outdoor retailer websites for women's boards. I later found out that each merchant had datafeeds with affiliate links so I switched to that, created a website, and after learning and implementing SEO the site makes me a healthy amount of passive income every winter.

Technology
Originally the site was just a list of women's snowboards and their links scraped using Beautiful Soup and some regular expressions for personal use. I've since grown it to be a CodeIgniter web application with bash scripts that fetch datafeeds and parse them automatically to keep prices current via cron jobs.

There is also email marketing integration through, Mailchimp with a custom written snowboard recommendation engine that evaluates a user's snowboarding preferences and automatically sends a delayed email containing recommendations suitable for their style and body shape.

Trekking Poles Pro

trekkingpolespro.com
  • PHP
  • CodeIgniter
  • MySQL
  • Data Feed Parsing
  • Shell Scripting
  • Cron
  • Regular Expressions
  • SEO
  • Responsive Layout
  • Mercurial
Visit Site

Background
Since the Snowboards for Women business model was so successful, I wanted to duplicate it in other markets as well. As a result, I completely rewrote the framework to build Trekking Poles Guide, which does not have the seasonal problem that Snowboards For Women suffers from. This framework is modular enough to be used for virtually any price comparison / review aggregation site, and I plan on using this framework to build a new outdoor gear review site every month.

Technology
Everything has been refactored to be clean and reusable, with necessary abstractions to make it easy to generate a new product site using the framework without excessive premature optimization. The code is stored in a private Mercurial repository on Bitbucket.

All of the tedious tasks such as downloading and parsing data feeds to obtain up to date prices have been automated using shell scripts run via cronjobs, so after building a site the technology portion will be pretty much hands off so I can focus on customer service and marketing.

Programming Interview

programminginterview.com
  • PHP
  • Drupal
  • MySQL
  • SEO
Visit Site

Background
The Ultimate Guide to Programming Interviews was created when I began my job hunt after college. In preparation for the technical interviews commonly given for software developer positions, I collected many of the practice questions that I came across while reviewing. I also included my own coded answers and detailed written explanations for the solutions. Friends asked for the document which I originally kept in a Word file, but it got old emailing them updated versions so I decided to just put all the content on a website.

According to Google Analytics, the Ultimate Guide to Programming Interviews consistently gets over 6000+ unique visitors per month. Every single visitor is acquired organically - I do no advertising of any sort, including word of mouth. The site is ranked #1 or #2 for the keywords "programming interview" and "programming interviews" and has a Google PageRank of 5.

Technology
The site was developed using Drupal. All interview answers, both code and explanations, were written by myself with the exception of errata credits given on the Contribute page.

szuhanchang.com

szuhanchang.com
  • Sinatra
  • Ruby 1.9.3
  • Haml
  • Responsive Layout
  • nginx reverse proxy
Visit Site

Background
This is the site you're looking at right now! I needed a nice professional portfolio to show off my cool projects and work experience, so here we are. (Yes, my favicon is a unicorn.)

Technology
The site was created using Sinatra and Haml and deployed on Heroku. However, I had some issues with the fact that the single Heroku dyno would idle and take a long time to boot when someone requested the site for the first time.

As a result, I experimented with using nginx as a transparent reverse proxy to cache the site contents and serve them directly as static pages from nginx. This worked well until I realized I had a ton of coursework that was only hosted on my shared host and my VPS didn't have enough disk space to handle it so I wrote a script to wget mirror the Heroku site onto my shared host as a deployment script. Now the site sits on nginx on my shared host served directly as HTML files.


Algorithmic Trading

Algorithmic Trading Backtesting Framework and Strategy Development cofounder

  • Java JDK 1.6
  • JUnit
  • JDIC
  • Eclipse
  • Subversion
  • Jenkins
  • Interactive Brokers API
  • DokuWiki
  • RedMine bug tracking
  • Distributed Team

Background
Since I used to work at Lime Brokerage, a high volume, high throughput brokerage whose clients were all professional black box algorithmic traders, I really got into automated trading myself. Unfortunately, company policy prevented employees from doing any automated trading but I used my time there to learn a lot about the financial markets.

After leaving Lime, I found some likeminded people including previous coworkers who had also left the company and we started a project to develop and backtest trading strategies. Originally we were going to use off-the-shelf software like Amibroker or WealthLab but quickly determined that these solutions were insufficient to do any serious, minimal latency, high volume day trading, so we decided to write our own backtesting framework.

Technology
The backtesting trading framework is written in Java. JDIC (Java Desktop Integration Components) and Swing provide a GUI for visual analysis of historic strategy performance. JUnit serves as the unit testing framework. Subversion is our source control and it is coupled with Jenkins (previously Hudson) for continuous integration. A post commit hook was created so we get email alerts whenever a build is broken or fixed. Forward testing of strategies is done through a PaperTrading account at Interactive Brokers through their Trader Workstation (TWS) Java API using custom wrapper classes. Bug tracking is done via RedMine.

Methodology
Our team of six is geographically distributed throughout Boston, San Francisco, and Shanghai. We collaborate mostly through email because it is asynchronous but hold Skype conferences to brainstorm and make important group decisions. Otherwise, work is done remotely on our own time schedules, since different people may have different busy periods. Every team member has various specialties (mine are system administration, strategy development, and Interactive Brokers API integration) but anyone can work on any part of the system.

We share information about infrastructure, including logins and such using DokuWiki. Decisions are made by prototyping instead of debating; whoever has the best prototype moves forward with their design, and consensus is always reached quickly as a result of the quality of the prototype. We are agile and loosely coupled, so nobody needs to wait on another's progress to continue forward. There are legal structures in place to prevent any IP problems, but as a result I am unable to share further details regarding this project, especially code.