Lee Nathan

Multipotentialite Extraordinaire

Who am I?

That's a philosophical question for the ages and I have no way to answer that, except to say "I don't know."

Where is my life going?

On a roadtrip!

No, seriously, my biggest goal right now is to become a digital nomad.
(Update: Done! Next I'll ...)



What is multipotentialitity?

An educational and psychological term referring to a pattern found among intellectually gifted individuals. [Multipotentialites] generally have diverse interests across numerous domains and may be capable of success in many endeavors or professions, they are confronted with unique decisions as a result of these choices.

How do I think?

I'm a conceptual thinker.

There are 4 types of thinkers.


  • architects
  • wedding planners
  • project managers


  • mathmeticians
  • structural engineers
  • data scientists


  • therapists
  • marketers
  • UI / UX engineers


  • lawyers
  • electricians
  • programmers

Why do I get out of bed in the morning?

I am all about pursuing my dreams.

Within ethical bounds:
I will go to any length.
I will expand my limits.
I will become better.
I will learn anything.
I will follow every path.
I will open every door.
I will look in every corner.
I will climb every mountain.
I will cross every ocean.
I will do whatever it takes to reach my dreams.

In my years of knowing and collaborating with Lee, I have been impressed by his willpower and curiosity. He is always seeking out new skills and pushing the boundaries of his capabilities. He possesses sage-like teaching ability, a designer's eye for color and shape, and most of all, a well-honed sense of humor.
Quincy Larson ~ founder, freecodecamp.com
Personal Summary:

I am a generalist in a world of specialists. I am a conceptual thinker and a very fast learner. I am a dreamer who has never lost his child-like love for exploration, and sense of curiosity. I thrive on novelty and deteriorate when things stagnate. I am direct, accountable, pragmatic, and honest.

I am an eclectic individual with a broad range of skills and abilities. I’m seeking an opportunity that can utilize as large a subset of my abilities as possible while providing the ability to develop new ones. The greatest work challenge I’ve faced has been finding challenging work.

Work History:


  • Mobile and web development using front end technologies like Ionic and Angular.
  • Furniture assembly technician building all patio furniture and grills for OSH.

  • Primarily focused on howtopals.com, a webcomic entirely of own creation.
  • Furniture assembly for Staples and merchandising work for Crossmark.

  • Full stack web developer for Netsperity, a CRM solution for IT professionals. Performed all web development with Rails, Angular, and Mongo. Created a flexible interface that could adapt to data from any other CRM.
  • Full stack developer with Quincy Larson on Course Forward, a predecessor to FreeCodeCamp. Built a dual-purpose algorithm that created a curriculum based on skills and scheduled it based on availability.

  • Learned web development with Ruby on Rails and worked on personal projects including a beta testing community site and other small projects.

  • Five years retail experience, seven years administrative assistant, 8 years customer service experience with overlaps.

programming, web development, road trips, photography, practical electronics, writing, writing poetry, philosophy, furniture assembly, off-grid living, graphic design, making, life hacking, life coaching, merchandising, tent camping, beer, entrepreneurship, technology, graphic design, art, marketing, personal development, computer games, budgeting, organizing, hiking, dogs, mobile development, game development, making people laugh

This is a collection of my qualifiable passions in descending order of interest.
These are primarily from the last five years and represent about half of the passions I've dabbled in.


  • Ruby

    This is my solution to Project Euler's 21st problem - "Amicable Numbers".

    factors = Hash[(1..10000).map { |x| [x, (1..x-1).select { |n| (x % n).zero? }.reduce(:+)] }]
                        .select{ |k,v| v != nil && v != 1 && v != k }
                        p factors.select { |k,v| factors[v] == k }.keys.reduce(:+)
  • Javascript

    Rangular is a tool I created to allow one page Rails apps to be built without having to write any JS.

    It uses Angular's directives to create AJAXified sections of HTML that automatically communicate with a Rails app.

    Full Source
    Demo App

    factors = Hash[(1..10000).map { |x| [x, (1..x-1).select { |n| (x % n).zero? }.reduce(:+)] }]
                        var railsRoutesSet, rangular;
                        rangular = angular.module('rangular', ["ngResource"]);
                        railsRoutesSet = {
                          index: {
                            method: "GET",
                            isArray: true
                          show: {
                            method: "GET"
                          "new": {
                            method: "GET",
                            params: {
                              verb: "new"
                          create: {
                            method: "POST"
                          edit: {
                            method: "GET",
                            params: {
                              verb: "edit"
                          update: {
                            method: "PUT"
                          destroy: {
                            method: "DELETE"
                          info: {
                            method: "GET",
                            params: {
                              verb: "info"
                          "$httpProvider", function($httpProvider) {
                            $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
                            $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
                        rangular.factory("railsResource", [
                          "$resource", function($resource) {
                            return $resource("/:controller/:id/:verb", {
                              id: '@id'
                            }, railsRoutesSet);
                        rangular.directive('raController', [
                          "railsResource", function(railsResource) {
                            return function(scope, element, attrs) {
                              var callShowAndEdit, rctrl;
                              rctrl = attrs.raController;
                              scope[rctrl] = {};
                              scope[rctrl].query = attrs.raQuery === void 0 ? {} : eval('(' + attrs.raQuery + ')');
                              scope[rctrl].query.controller = rctrl;
                              // [query], [success, [failure]]
                              processArgs = function() {
                                rargs = ({query:null, success:null, failure:null});
                                args = arguments[0]
                                if (args[0]  !== undefined) {
                                  if (Object.prototype.toString.call(args[0]) == "[object Function]") {
                                    rargs.success = args[0];
                                  } else {
                                    rargs.query = args[0];
                                  if (args[1]  !== undefined) {
                                    if (Object.prototype.toString.call(args[1]) == "[object Function]") {
                                      if (!!rargs.success) {
                                        rargs.failure = args[1];
                                      } else {
                                        rargs.success = args[1];
                                    if (args[2]  !== undefined) {
                                      if (Object.prototype.toString.call(args[2]) == "[object Function]") {
                                        if (!!!rargs.failure) {
                                          rargs.failure = args[2];
                                return rargs;
                              scope[rctrl].callIndex = function() {
                                scope.indexRargs = processArgs(arguments);
                                scope[rctrl].indexLoading = true;
                                if (scope.indexRargs.query == null) {
                                  scope.indexRargs.query = scope[rctrl].query;
                                scope.indexRargs.query.id = null;
                                scope[rctrl].index = railsResource.index(scope.indexRargs.query, function() {
                                  scope.$broadcast(rctrl + '.index ready');
                                  if(scope.indexRargs.success) {
                                  scope.indexRargs = null;
                                  scope[rctrl].indexLoading = false;
                                }, function() {
                                  scope.$broadcast(rctrl + '.index error');
                                  if(scope.indexRargs.failure) {
                                  scope.indexRargs = null;
                                  scope[rctrl].indexLoading = false;
                              callShowAndEdit = function() {
                                rargs = processArgs(arguments);
                                if (rargs.query == null) {
                                  rargs.query = scope[rctrl].query;
                              scope[rctrl].callShow = function() {
                                scope.showRargs = processArgs(arguments);
                                if (scope.showRargs.query == null) {
                                  scope.showRargs.query = scope[rctrl].query;
                                if (!!scope[rctrl].id) {
                                  scope.showRargs.query.id = scope[rctrl].id;
                                  scope[rctrl].show = railsResource.show(scope.showRargs.query, function() {
                                    scope[rctrl].showLoading = false;
                                    scope.$broadcast(rctrl + '.show ready');
                                  }, function() {
                                    scope[rctrl].showLoading = false;
                                  scope.showRargs = null;
                                  scope[rctrl].showLoading = true;
                                } else {
                                  scope[rctrl].show = null;
                                  scope.$broadcast(rctrl + '.show error');
                                  scope.showRargs = null;
                                  scope[rctrl].showLoading = false;
                              scope[rctrl].callNew = function() {
                                scope.newRargs = processArgs(arguments);
                                scope[rctrl].newLoading = true;
                                if (scope.newRargs.query == null) {
                                  scope.newRargs.query = scope[rctrl].query;
                                if (!!!scope.newRargs.query.controller) {
                                  scope.newRargs.query.controller = rctrl;
                                scope[rctrl]["new"] = railsResource["new"](scope.newRargs.query, function() {
                                  scope[rctrl].createError = null;
                                  scope.$broadcast(rctrl + '.new ready');
                                  scope.newRargs = null;
                                  scope[rctrl].newLoading = false;
                                }, function() {
                                  scope.$broadcast(rctrl + '.new error');
                                  scope.newRargs = null;
                                  scope[rctrl].newLoading = false;
                              scope[rctrl].callEdit = function() {
                                scope.editRargs = processArgs(arguments);
                                if (scope.editRargs.query == null) {
                                  scope.editRargs.query = scope[rctrl].query;
                                if (!!!scope.editRargs.query.controller) {
                                  scope.editRargs.query.controller = rctrl;
                                if (!!scope[rctrl].id) {
                                  scope[rctrl].editLoading = true;
                                  scope.editRargs.query.id = scope[rctrl].id;
                                  scope[rctrl].edit = railsResource.edit(scope.editRargs.query, function() {
                                    scope[rctrl].updateError = null;
                                    scope[rctrl].editLoading = false;
                                    scope.$broadcast(rctrl + '.edit ready');
                                  }, function() {
                                    scope.$broadcast(rctrl + '.edit error');
                                  scope.editRargs = null;
                                } else {
                                  scope[rctrl].editLoading = false;
                                  scope[rctrl].edit = null;
                                  scope.editRargs = null;
                              scope[rctrl].callCreate = function() {
                                scope.createRargs = processArgs(arguments);
                                scope[rctrl].createLoading = true;
                                if (scope.createRargs.query == null) {
                                  scope.createRargs.query = scope[rctrl].query;
                                scope[rctrl]["new"].$create(scope.createRargs.query, function() {
                                  scope[rctrl].createError = null;
                                  scope.$broadcast(rctrl + '.create success');
                                  scope.createRargs = null;
                                  scope[rctrl].createLoading = false;
                                }, function(object) {
                                  if (object.data) {
                                    scope[rctrl].createError = object.data;
                                  scope.$broadcast(rctrl + '.create failure');
                                  scope.createRargs = null;
                                  scope[rctrl].createLoading = false;
                              scope[rctrl].callUpdate = function() {
                                scope.updateRargs = processArgs(arguments);
                                scope[rctrl].updateLoading = true;
                                if (scope.updateRargs.query == null) {
                                  scope.updateRargs.query = scope[rctrl].query;
                                scope[rctrl]["edit"].$update(scope.updateRargs.query, function() {
                                  scope[rctrl].updateError = null;
                                  scope.$broadcast(rctrl + '.update success');
                                  scope.updateRargs = null;
                                  scope[rctrl].updateLoading = false;
                                }, function(object) {
                                  if (object.data) {
                                    scope[rctrl].updateError = object.data;
                                  scope.$broadcast(rctrl + '.update failure');
                                  scope.updateRargs = null;
                                  scope[rctrl].updateLoading = false;
                              scope[rctrl].callDelete = function(id, query) {
                                scope[rctrl].deleteLoading = true;
                                if (query == null) {
                                  query = scope[rctrl].query;
                                if (!query.id) {
                                  query.id = id;
                                railsResource["delete"](query, function() {
                                  scope.$broadcast(rctrl + '.delete success');
                                  scope.updateRargs = null;
                                  scope[rctrl].deleteLoading = false;
                                }, function() {
                                  scope.$broadcast(rctrl + '.delete failure');
                                  scope[rctrl].deleteLoading = false;
                              scope[rctrl].clearId = function() {
                                scope[rctrl].id = null;
                              scope[rctrl].setId = function(id) {
                                if (id == null) {
                                  id = attrs.raShow;
                                scope[rctrl].id = id;
                              if (!!!attrs.raShow) {
                              } else {

    Full Source
    Demo App

App Development

  • Rails

    This is a Model from the Netsperity project. Netsperity was designed to be able to use data from any CRM. It stored fixed, standard data in Postgres and flexible, imported data in Mongo. This Model used CSV data to allow the app to dynamically generate tabs based on on data. The import system allowed the app to change its entire look, and functionality based on imported data.

                        class DTab < ActiveRecord::Base
                          attr_accessible :description, :name, :position, :business, :business_id, :original_name
                          has_many :d_fields
                          belongs_to :business
                          has_many   :notes,         as: :notable
                          has_many   :attachments,   as: :attachable
                          has_many   :contact_tags,  as: :contactable
                          has_many   :contacts, through: :contact_tags
                          def self.import(file, business)
                            f           = file.tempfile
                            file_name   = File.basename(file.original_filename, '.csv')
                            dt          = DTab.create(name:           file_name.titleize,
                                                      original_name:  file_name,
                                                      business:       business)
                            head        = CSV.read(f.path).first
                            head.each_with_index do |field,i|
                              DField.create(d_tab: dt, original_name: field, name: field.titleize, visible: true, position: i)
                            data        = SmarterCSV.process(f.path, {:key_mapping => {:unwanted_row => nil, :old_row_name => :new_name}}) do |array|
                              DDatum.create(array.first.merge(d_tab_id: dt.id))

    Bettatest was a gamified beta testing community app I created in whole. User's were only allowed to interact with each community based on their status in the community (developer, tester, admin, subscriber, etc.). Then there were limitations based on whether the beta test was open or closed. Finally there were limitations based on the user's game score in the community. This schema represents all the auth logic.

                        class Ability
                          include CanCan::Ability
                          def initialize(user, test)
                            #official_test = BetaTest.where(:name => "bettatest.com - developer's test")
                            if user && test
                              stats = test.stat_sheet_for(user)
                              stats = nil
                            user ||= User.new # guest user (not logged in)
                            visitor = true
                            nobody = true
                            if user.roles != [] then visitor = false end
                            if !visitor && !user.has_role?(:unconfirmed) && !user.has_role?(:naughty) then nobody = false end
                        #:visitor, :unconfirmed, :naughty
                        #:user, :tester, :developer, :subscriber, :admin
                            can :read, BetaTest, :active => true
                            if !nobody
                              can :create, BetaTest, :active => false, :user_id => user.id
                            if test && user == test.user
                              can [:read, :update, :destroy], BetaTest, :user_id => user.id
                            if user.has_role?(:admin)
                              can :manage, BetaTest
                            if test
                              if test.active
                                can :read, Blog, :draft => false, :beta_test_id => test.id
                              if user.has_role?(:developer, test) || user.has_role?(:admin)
                                can :manage, Blog, :beta_test_id => test.id
                            if test
                              if test.open
                                can :read, ForumCategory, :beta_test_id => test.id
                              if stats && user.has_role?(:tester, test) && user.has_role?(:activated, test)
                                can :read, ForumCategory, :beta_test_id => test.id, :access_level => 1..stats.level
                              if can? :update, BetaTest, :id => test.id
                                can :manage, ForumCategory, :beta_test_id => test.id
                            if test
                              if test.open
                                can :read, ForumTopic, :forum_category => { :beta_test_id => test.id }
                              if stats && user.has_role?(:tester, test) && user.has_role?(:activated, test)
                                can :read, ForumTopic, :forum_category => { :beta_test_id => test.id, :access_level => 1..stats.level }
                                can :create, ForumTopic
                              if can? :update, BetaTest, :id => test.id
                                can :manage, ForumTopic, :forum_category => { :beta_test_id => test.id }
                            if test
                              if test.open
                                can :read, ForumPost, :forum_topic => { :forum_category => { :beta_test_id => test.id } }
                              if stats && user.has_role?(:tester, test) && user.has_role?(:activated, test)
                                can :read, ForumPost, :forum_topic => { :forum_category => { :beta_test_id => test.id, :access_level => 1..stats.level } }
                                can :create, ForumPost
                                can :update, ForumPost, :user_id => user.id
                                if !test.open
                                  can :rate_up, ForumPost
                                  can :rate_down, ForumPost
                              if can? :update, BetaTest, :id => test.id
                                can :manage, ForumPost, :forum_topic => { :forum_category => { :beta_test_id => test.id } }
                                cannot :rate_up, ForumPost
                                cannot :rate_down, ForumPost
                            if !nobody && !user.has_role?(:subscriber)
                              can :create, Subscription, :user_id => user.id
                            if user.has_role?(:subscriber)
                              can [:read, :update, :destroy], Subscription, :user_id => user.id
                            if user.has_role?(:admin)
                              can :manage, Subscription
                            if test
                              if !nobody && !user.has_role?(:tester, test) && !user.has_role?(:developer, test) && !user.has_role?(:admin) && !test.open
                                can :create, TesterStatSheet, :user_id => user.id, :beta_test_id => test.id
                              if ((user.has_role?(:tester, test) && user.has_role?(:activated, test)) || user.has_role?(:developer, test) || user.has_role?(:admin)) && !test.open
                                can :read, TesterStatSheet, :beta_test_id => test.id
                            can :read, User
                            if nobody || user.has_role?(:admin)
                              can :confirm
                            if visitor
                              can :create, User
                            if !visitor && !user.has_role?(:naughty)
                              can :update, User, :id => user.id
                            if user.has_role?(:admin)
                              can :manage, User
                            if !user.email_confirmed
                              can :confirm, user
                        # a visitor has no roles
                        # unconfirmed and naughty users have the same permissions as visitors
                        # a user who has not created or joined a bt has the role user
                        # a user who is a tester
                        #   has the user role removed
                        #   has the tester role added
                        # a user who is a developer
                        #   has the user role removed
                        #   has the developer role added
                        #   can also be a tester
                        # a user who is a subscriber
                        #   has the user role removed
                        #   has the developer role removed
                        #   has the developer role added
                        #   can also be a tester
                        # a user who is an admin
                        #   is omnipotetent
                        #   is nominally competent
                        #   should not have any other roles
                        #   should not have any restrictions
  • Mobile

    Bodyweight by One Tap is my first completed and released mobile app. Bodyweight was approved by the Apple store on my first attempt. Bodyweight was built with front end web tech using Ionic and Angular. One Tap Software is a mobile software company I'm working on geared towards ultra simple design.

    Get it on Google Play


  • Old Stuff





  • New Stuff

    Negative Space

    Flora and Fauna


  • Model


    This is Ashley. She is seen here, modeling one of my howtopals t-shirts.


  • Poetry


    she has a face that subtly shifts
    sepia toned her locks surround
    through life she freely gently drifts
    gifting her light to all around

    no face like hers I've ever seen
    alluring like exotic place
    a foreign shore I've never been
    so captivated by her face

    to run my fingers through those curls
    each one tactile epiphany
    the many hued delicious whirls
    and draw her head into kiss me

    free spirited adventurous
    and like a mote of dust so fleet
    she floats around, a carefree wisp
    she dances on her barefoot feet

    the frozen land from whence I come
    to whom scarce light has yet been shown
    from her I see the light of sun
    my ice may crack, my green shoots grown
  • Fiction

    Stuart Blankenship gazed at the output screen of the quantum microscope as he calibrated it to view subatomic structure. He had come up with a quantum recursion algorithm to allow the microscope to essentially replicate its optical inputs from a smaller scale at intervals. In theory it would work like a series of relay towers. The quantum computer would view the image at its greatest magnification and then recreate the viewpoint at that level. Then it would view that image at its new greatest magnification, and so on.

    For this experiment, he was examining a sheet of graphene. After his calibrations he was able to view the sheet closely enough to make out the individual carbon atoms. He tapped a key at the computer and after a few minutes, the first relay was created, and he could only see a few atoms. It seemed to be working. Wait, it was actually working. “Holy crap! It really works!” he shouted, jumping out of his chair, a giant grin on his face. “How the fuck is that even possible? I thought I was just making shit up.”

    He rubbed his eyes and when he opened them again, he could only see a single atom. His jaw dropped open and he fumbled for the chair, unable to take his eyes off the screen. He sat down and continued to gaze at the amazingly crisp picture on the screen. Another relay and he could see the light-show that was the electrons orbiting around the nucleus cluster.

    Another eternity passed and the screen was mostly filled with the nucleus but an occasional electron would light up the screen as it went whizzing by. He sat there for an hour until the protons and neutrons filled the screen like being inside a field of suspended opaque glass baubles. In the center of the screen was just light. After another half hour the light filled the screen completely and he could see nothing else.

    He checked his recording software and everything was working properly so he leaned back arms crossed wondering what he would see next. He was hoping for quarks, but after some quick math he realized it would be a couple hours before he would see them. He stood up from his chair, stretched, yawned, and looked at the clock. It was 4 AM and all the lights were off in the lab except for a few over and around his station. He was completely exhausted.

    He pulled out a cot, blanket, and pillow from a nearby cupboard and left the lab, turning the lights off behind him. He set up the cot in the break room and walked over to the vending machine. He bought a pack of cheese crackers and sat down on the cot pulling the blanket up to his waist.

    The automatic lights in the break room came on and he muzzily said “what you here so late?” Allen said “Good morning cheesy face. Have you taken up Astrology? I have to admit it sounds much more relaxing than actual science ‘cuz you can just make things up as you go along.”

    Stuart reached up to rub his face and accidentally wound up grinding salty cheese crackers into his eyes. He yelped and sat bolt upright as Allen doubled over laughing. He remembered opening the bag of crackers, eating a couple, and wondering what time he should set his alarm for, but that was it. Stuart stood up and stumbled toward the sink, pushing tables out of the way and knocking over chairs. He tripped over a chair and fell gut first into the edge of the sink, knocking the wind out of himself. Stuart grabbed the edge of the sink as he started to slide down and pulled himself up.

    As he leaned over the sink Molly walked in and saw the clutter and cheese crackers scattered around the room and asked “What the hell just happened in here?” “Classic Stuart, that’s what” said Allen, wiping the tears from his eyes. “Well, make sure he cleans up, we wouldn’t want ants” she said and left the room.

  • Blogging

    This is part of a guest post I wrote for beeminder.com.

    Traditionally, we never had to worry about things like retirement and cancer. We were lucky if we lived to be 40. But now, modern medicine and a shift to a very technical society means we need to think about our futures and how to get there. You can think of yourself as actually two selves. Your primitive monkey self wants what it needs to survive and it wants it right now. It doesn’t care about tomorrow because there may not be one. Your other self is your future self. The concept of our future selves is a very abstract concept to our primitive monkey brains. This future self sits back and reflects on all the things that have happened in your life. Often it looks back with regret because your monkey self didn’t toe the line and ensure the happiness of your future self. Your monkey self may be overweight, out of shape, and not accomplishing anything. Your future self is healthy, fit, and successful. At least that’s how your current self sees it. But often your current self is unable to do the things necessary to create that future self. It’s simply not how your still-primitive monkey brain is wired. If you find the thought of your primitive mind insulting, think about life just 200 years ago. It wasn’t much different than 2000 years ago, with the exception of agriculture. People still had to do physical work to stay alive. People didn’t have modern conveniences like Starbucks and McDonald’s. If you wanted food, you worked for it. If your clothing fell into disrepair, you fixed it. If you needed to go somewhere, you walked or rode a horse. We haven’t evolved much since the times of our great great grandparents. But we are living much longer and have to be much more thoughtful.

  • Philosophy

    All Is Digital

    nothing can be fixed
    nothing can be cured
    you can’t cure an infection
    you can only kill bacteria
    you can’t fix a broken leg
    only set it and let it mend
    you can’t cure cancer
    only beat it into remission

    nothing can be broken
    only changed

    there is no binary
    no opposites
    no digital
    no math
    these are constructs of the human mind

    giving something a name separates it from the infinite possibility of things it could be and condenses it into one

    it’s fascinating that the mind would construct something it’s so poorly equipped to handle as math
    math doesn’t exist
    these are constructs of the human imagination
    a computer holds and operates on digital information
    but it is not exact
    it only floats on a mesh of precision

    so why are we drawn to digits?
    numbers don’t exist

    you have 3 rocks
    no you don’t
    each rock is a different size, shape, color, mineral composition, mass, age, piece of another rock, weight, texture
    what about the rock’s history?
    its origin story
    what if it’s a quantum rock and exists simultaneously in several locations?
    calling a rock a rock is so limiting
    how can you count something of such infinite complexity?
    yet, there are 3 rocks
    anyone can tell you that

    we are drawn to numbers, to binary, to opposites, but why? if they can’t exist
    you can’t see 3
    I’m not talking about the pictographic representation of 3
    but the actual number
    it only exists in our minds

    we created math to understand patterns


    everything on the outside of almost any living being appears symmetrical
    not so internally


    why when so much of nature is chaotic and random are things of the animal persuasion symmetrical
    are all living animals alien to this non symmetrical world?

    the binary of yin and yang brings a state of peace to our minds
    what force drives us to this division?
    to wanting to see everything as symmetrical?

    yin and yang - black and white
    black doesn’t exist
    white doesn’t exist
    not truly
    not in their most primitive core essential forms
    there are only shades of reduced color that some would call gray
    only dark blues or light yellows

    true zen can only exist in our minds
    it is the truth of our minds
    yet, it is the ultimate state for our minds for it lets us be one with the infinite
    is it then a key?
    to unlock the door to our true potential?
    do religions offer other keys?

    imagine a race based on trinary symmetry

    architecture, engineering, mechanical flight, computers
    marvels of the modern age wouldn’t exist if our minds weren’t tuned into the binary
    even manufactured goods have slight variations and flaws
    air pockets, micro fissures
    errors that couldn’t be seen by inspectors
    there are no absolutes
    only varying degrees of perceived precision

    computers are machines of the human mind and imagination
    science and technology birth our non-existent thoughts into a perceptive reality
    every human construct is a product of the human mind and only exists in our imaginations
    they are our thoughts made real

    if another race created us as the product of their imagination, what would we create?
    our minds work a certain way
    we would construct a mind based off of our functional capacity and understanding
    it would probably be very advanced and computer-like in nature but it may construct thoughts in a completely different way
    so what kind of race would our computer like species evolve into?
    would their thoughts evolve to be more analog in nature than ours?
    would they in turn create a more organic life form?
    would they create us?
    did they create us?

2D Design

  • Webcomic
    Hurrah Hurrah
  • Web Design
    This mobile-friendly site was designed by me, using Zurb's Foundation.
    I prefer Foundation over Bootstrap due to greater flexibility and less verbose tags.

Coaching and Education

  • Presentations

    This is a presentation I created to educate some friends on web technology and why I thought an Ionic app would best suit the needs of their startup. Unfortunately, embedding it crashes the sight.

    the history of the internet universe

3D Design

  • Webcomic

    Despite the 2D look, this was modeled and rendered Using Blender in an Isographic perspective.

    I'm also quite fond of SketchUp.



  • Cooking


    polenta bites (vegan)

    salted butterscotch blondies

    cornbread pie

  • Shirts


    These are a few testimonial shots from the t-shirt business that accompanied my webcomic.

    my first customer from Singapore

    yours truly

    Quincy Larson from freecodecamp.com

  • Offgrid

    This was my home in the Mojave desert for 2 years.
    I had solar panels, composted my waste, and hauled in water and propane.

Playbies helps parents and caregivers create a bond with babies through developmental play. Playbies is a collection of videos of games to play with infants, babies, and toddlers. These games help teach babies skills like pattern recognition, motor coordination, and trust building.

Although this is a very simple app, there were a few challenges involved like push notifications and playing videos. Adding a reliable video player in a hybrid mobile application is no simple task. This app uses my super streamlined mobile authentication process with only one page for signup and signin. It also manages validation, and forgotten password recovery with only one button. Here's a demo video:

In 2017 I worked on a Tinder clone for Greek people called Meet Greek. It was complete with swiping, matchmaking and a chat room. The app used Facebook authentication, Google Maps API for location information, CouchDB for user data and matchmaking, and Firebase for the chat room. It involved a completely custom design that looked very little like a generic Ionic app. The app used several native only capabilities, such as photo upload, push notifications, geolocation, etc. Firebase was not only used for chat data, but also for "FCM Push Notifications" automatically sent with "Firebase Functions" when a match was made. I had to stop working on the app when my client could no longer afford my services and moved development responsibilities to her brother.

The app is nearly complete, but has a few rough edges I never got to polish. Updates only occur once every 2 minutes. This was a band-aid I added to compensate for CouchDB's inability to handle update conflicts. Besides the update issues, CouchDB proved to be a great choice. The demo app is able to very quickly find matches in a collection of over 100,000 fake test users. The demo doesn't match by location due to the Google API's security restrictions in the browser. This does work in production though. Well, enough excuses, here's the demo:

More info on multipotentiality:

"Rockstar innovators: What polymaths can do for you and how to bring them on board"