Projects I'm proud of
Lectica builds open-ended formative standardized assessment systems designed a) to honor the rich diversity of students' perspectives, and b) to trigger iterative cycles of learning & feedback in students, teachers, administrators, and developmental researchers.
DiscoTest.org was their first "mostly-fledged" interface for creating, refining, administering, coding, and analyzing data from Lectical assessments for K-12 students. DiscoTest was the most inspiring, technically interesting, and conceptually challenging project I've worked on to date.
The fun parts:
- Designing and querying an extremely complex relational data schema
- Interfaces to give the admin full control over managing, editing, and using the coding rubrics
- Auto-generated multi-page reports for individual students as well as filterable reports that allows teachers, administrators, and researchers to analyze aggregate results, generate custom charts, etc.
Springpoint Partners is a team of leadership development coaches who envision a streamlined online system that supports clients in envisioning, reflecting on, and striving for personal transformation, and supports coaches' role in facilitating this work. The app revolves around the concepts of a) articulating a personal goal, and b) regular reflection on one's progress towards that goal.
I'll add a link once the prototype is available to the public.
This beta NDIC service lets you snapshot your Wordpress websites (or any other CMS) before & after major upgrades so you can quickly spot any breakage or other visual changes.
The idea is that lots of Wordpress site admins have to tediously click through most of each website each time they upgrade WP core or plugins etc., to ensure nothing blew up (hence the "boom"); this subscription service would let you add your site, crawl it for you, use PhantomJS to take a snapshot of each page, then compare the output .jpg to a previous snapshot using ResembleJS, and highlight any visual changes for the user both with % changed metrics and with a visual before:after interface, saving the user the work of manually clicking through and looking for visual problems.
The fun parts:
- Stripe subscriptions integration and associated sentry permission system
- Cascading Sidekiq jobs handle a) crawling a site, then b) using Redis to render each page on a distributed pool of NodeJS "slave" servers
- Image rendering and diff generation using NodeJS, GhostTown, PhantomJS, and ResembleJS
- Plan for lots of PhantomJS reliability issues on projects like this
I wasn't happy with the invoicing & time tracking tools I found, so I built my own. It turns out it's really hard to build a good time tracking interface!
Currently it supports:
- managing nested Projects, each with different billing rate and active/inactive settings
- quickly starting and stopping timers
- adding intentions, invoice notes, and admin notes to each time entry
- creating and printing invoices for single-rate or multiple-rate projects, tracking their sent and paid status, and marking which time entries you've invoiced for
Lux gathers research on startups, builds reports and metrics about their viability, potential market size, etc. then gives access to these reports to subscribers.
I was tasked to implement a chart interface to allow customers to explore their companies database in a visual and dynamic way, with customizable X and Y axes, filters to constrain results along a number of dimensions, controls to save and load chart settings, and export to PNG or CSV. The chart is refreshed via AJAX each time a setting is changed.
Gray Owl manages a library of finance, banking, and insurance related resources available for subscriber access. As part of the team planning and building the application, I mostly worked on integrating machine learning & automation tools into the app interface and data flow.
The fun parts:
- Storing certain file attachments in dynamically named S3 buckets (1 per user for legal reasons)
- Machine learning integration (training, prediction, and evaluating accuracy) using a Prediction.io server, queried from our main Rails app
- Spin off short-lived EC2 instances from an AMI, to each crawl a single domain, write newly found links to a central database, then terminate; logging & interface to provide transparency into what each crawler instance is doing
- Audit records of all changes are stored in a secondary database and can be reviewed by authorized users
This pro bono / hobby project aims to build a social networking & collaboration hub that supports deeper discourse and more reflective engagement with the people around you. It's an antithesis to the shallow infosharing and "ADD culture" often cultivated by Facebook, Twitter, and similar.
We're still in the early planning stages, but you can try it out by signing up for a free account on our working prototype.
This isn't a project per se, but I started learning Elixir and Phoenix recently, and I've decided to bet the farm on it. Where possible, all my new projects will be written on Phoenix rather than Rails. Here's why:
- Strong norm of "explicit is better than implicit": the app boot process, middleware, assets, and other components of the request lifecycle are declared using a transparent and uniform "Plugs" metaphor, leaving me with a more confident understanding of how it all fits together, whereas the prevalence of "invisible defaults" in the Rails world can feel opaque and overly magical -- this has been a pet peeve of mine for years.
- Phoenix comes with some neat caching tricks that reportedly deliver requests several times faster than Rails with no manual effort by the app developer. For example, route matching and template rendering are precompiled down to efficient pattern-match functions and string concatenation.
- Elixir's functional paradigm provides some constraints that make it harder to end up with the "ball-of-mud architecture" that I often see Ruby & Rails projects grow into. For example, it's easy to store most of your logic in input=>output functions that have no side effects, and it's easier to spot side effects when they do appear. This in turn makes it easier to understand, maintain, and refactor going forward.
- Phoenix (plus its Elixir dependencies such as the Ecto ORM) copies many of Rails' best features, and has built-in support for conveniences such as live reloading, background jobs, and websockets integration; it feels like it was all designed to make the transition from Rails as easy as possible.
- I love it and always will, but Rails is starting to show its age. I believe "convention over configuration" (compounded with the heavy use of OO class inheritance) has too often encouraged implicit and invisible "magic code" that impedes true understanding of the system and complicates troubleshooting & maintenance. Even ignoring questions of performance and real-time connection support, Elixir & Phoenix just feel like sturdier and more future-proof foundations to build web applications on.