jpriddle

/work / Will Dikker

Will Dikker

Will Dikker, LLC

Lead Backend Developer

Jan 2009 ·
Ruby Rails MySQL Authorize.net SMS jQuery Capistrano

Will Dikker was a local startup providing a classifieds marketplace for vehicles and equipment — automobiles, motorcycles, boats, RVs, and utility trailers. The core concept combined a web listing platform with physical marketing: sellers received free “Will Dikker Stikkers” bearing a unique alphanumeric code and an SMS short code (78501). Potential buyers could text the code to get listing details on their phone, bridging offline discovery with the online marketplace.

I handled all backend development on the Rails 2.2.2 application, including the multi-step listing wizard, SMS gateway integration, payment processing, full-text search, geolocation features, email systems, and the admin panel. Tony Montemorano of Allusis Design, LLC handled all design work. I was also responsible for server setup, deployment configuration, and DevOps.

Architecture

The application was a monolithic Rails 2.2.2 app backed by MySQL. It followed the plugin-heavy architecture typical of the Rails 2 era, with 15 vendor plugins providing core functionality including authentication, state management, file uploads, payment processing, and full-text search.

The data model centered on a Listing entity with polymorphic category-specific detail models for each vehicle type (automobiles, motorcycles, boats, RVs, utility trailers). Listings were managed by an AASM state machine tracking the full lifecycle from creation through activation, expiration, sale, and deletion.

Multi-Step Listing Wizard

Listing creation used a session-based multi-step wizard in the SellController that walked sellers through: package selection, category selection, listing details entry, photo uploads, review, and checkout. SSL was enforced on the checkout and payment steps.

Authentication

User authentication was built on the restful_authentication plugin with email-based accounts, SHA1 password hashing with a site key and 10 rounds of digest stretching, activation via email codes, remember-me cookie tokens, and an AASM state machine (passive, pending, active). Admin access was gated by an is_super flag on the user record.

SMS Integration

The standout feature was SMS text-in via Air2Web. Each listing was assigned a unique alphanumeric code generated from a consonant-heavy character set (BCDFGHJKLNPQRSTVXYZ) to avoid ambiguous characters. Buyers texted these codes to short code 78501, which hit an Air2Web webhook routed to an API controller. The app looked up the listing and replied with vehicle details via the Air2Web XML API (http://mrr.air2web.com/a2w_preRouter/xmlApiRouter). An SmsMessage model logged all inbound and outbound messages, and an SmsBlacklist model handled opt-outs.

Payment Processing

Billing was handled through ActiveMerchant with Authorize.net as the payment gateway. The Order model tracked purchases with shipping addresses (for physical sticker delivery), amounts, and package references. OrderTransaction logged each gateway interaction (purchase, authorize, capture) with success status, reference codes, and response messages. Promotional codes supported tiered discounts with flags for free listings, free shipping, and never-expires options.

Search and Geolocation

Full-text search was powered by Acts as Ferret, indexing listings across title, description, category, ZIP code, asking price, and category-specific fields (make, model, year, etc.). A dedicated Ferret server ran alongside the application.

Geokit provided distance-based search, geocoding listing ZIP codes to latitude/longitude and enabling “within X miles” queries.

Email System

ActionMailer handled 17 transactional email templates covering the full user and listing lifecycle: account creation, activation, and password reset; listing creation, activation, sticker shipment, and inquiry notifications; order success and failure confirmations; and admin alerts for new listings and orders.

The app also supported inbound email via Gmail IMAP polling — replies to listing inquiry emails were parsed by subject line to route responses back to the correct listing conversation.

An email campaign system supported marketing outreach with tiered delivery, batch sending (50 per run), and success tracking.

File Uploads

Listing photos used the attachment_fu plugin with filesystem storage under /public/system/listings/. Images were capped at 1 MB and auto-resized to 640x480, with three thumbnail sizes generated on upload: 230x230 (avatar), 100x100 (medium), and 70x70 (thumb).

Admin Panel

A staff admin area at /admin/ provided management interfaces for users, listings (moderation), orders, packages (Basic/Enhanced/Ultimate tiers with configurable SMS credits, photo limits, sticker counts, and durations), package add-ons, email campaigns, site settings, and cell provider lookups.

Frontend

The frontend used Blueprint CSS for the grid layout, jQuery via the jRails plugin, jQuery UI for datepickers and tabs, and FancyBox for image lightboxes. Category-specific JavaScript handled dynamic form fields for each vehicle type.

Deployment

Capistrano managed deployments to the production server running Phusion Passenger (mod_rails). The deploy process disabled the site with a maintenance page, updated code via git remote cache, symlinked shared config files (database.yml, mailer.yml, billing.yml), ran migrations, built a combined CSS file, and restarted Passenger via tmp/restart.txt. The deploy recipe also included iptables firewall configuration for server hardening.

Error tracking was handled by Hoptoad (now Airbrake), and reCAPTCHA protected public-facing forms.

View archive of the site →