glasscanvas logo


Full-Stack Developer

Digital – Langley, British Columbia
Department Digital
Employment Type Full-Time
Minimum Experience Mid-level

You write reusable code and solve complex problems with simple solutions.

You keep the end user in mind and build functional and intuitive interface components for them. You are a proactive self-starter, who can stay productive with minimal guidance, letting the team know when problems arise while already having started down the path to a solution.

Sound like you? Read on.

How We Work

We strive to solve serious and tough problems with simple, elegant, well-tested solutions as a team.

That said, we don't take the not-so-tough problems (the bulk of software development) lightly, but instead, try to:

  • Keep code clean and DRY
  • Name files, functions, and variables well (we have more fun writing code than ensuring comments stay relevant)
  • Create and follow patterns to create consistency and familiarity
  • Have fun with editor macros and scripts to challenge ourselves to be more efficient, even on the mundane tasks

We also try to:

  • Maximize flexibility and reusability without compromising simplicity
  • Always leave code in a better place than when we found it, relentlessly refactor
  • Optimize for code readability and development efficiency first, tackle performance second
  • Accept that requirements change over time so let’s find out as soon as possible and be agile instead of delaying change and then fighting it
  • Allow the best idea to win, not the loudest or the idea from the most senior person

Some projects you’ll be jumping into:

We’ve successfully launched a beta version of a multi-tenant platform using all of our existing tools (redirect manager, form builder, content engine) to house two separate products (news platform & parish platform), each with multiple tenants, hosted on a fully redundant system (AWS and digital ocean). In order to accomplish this, we built cross model data segregation, domain & site configuration, parish registration and donations, a theming system for styles and custom features.

Auto Curate Algorithm 
Based on the content a user has consumed and what interactions they’ve had, we present them (via a “recommended” list or a personalized newsletter) with content that is most likely to be the most interesting and engaging to them with the goal of building them up. Think of the Facebook algorithm but for Christian content with the goal of walking people forward on their journey with God. We have a basic version of this and are expanding and improving upon it.

Our Patterns and Standards

  • Shared extension engines

A gem that can be reused between our different projects that includes models, views, controllers, js and other assets structured in the same way as a rails app. All these assets are then easily included in the project in a standard way with configuration and the ability to customize pieces of it. Examples include authorization and authentication, pages, redirects, forms, events, content collections and taxonomies, caching, search

  • React and redux

We use jquery for most of our javascript needs because that is simple and just works, but we bring in react redux and redux-saga when it makes sense to. We’ve integrated babel in a way that our engines can provide an npm package for webpack to consume in the project. We know javascript land is a crazy and ever changing landscape but with webpacker and this toolset we’ve been pretty happy.

  • Live editor & CMS shortcuts

No more text input box for “the 3rd guiding principle paragraph on the about page”, we just allow clients to edit it in place like this:

  • Presenters

We’ve been working on some nifty little things in our presenters recently. For example, to present a piece of content in a few different spots (“default”, “featured” and “tall”) on a site we init the presenter like: img_aspect_ratio: {default: "ar-3-2", featured: "ar-2-1", tall: "ar-1-2"} and then just call <div class="<%= presenter.img_aspect_ratio %>"> in the partial. Then we call the partial in either the “featured” or “tall” option. It is a simple little tool that really helps to clean up our views.

  • Content_for customization hooks

Our steps to add a custom attribute to an engine (e.g. add “super_featured” to our event model) for a specific project (without modifying the engine at all):

  • New migration to “add_column :events_table, :super_featured, :boolean”
  • Call “Events.additional_parameters(:super_featured)” to tell the admin controller to let this parm through it’s strong params check
  • Register the “_event_admin_form_cusomizations.html” partial in order to include a “This event is super featured” checkbox for the admin user when creating or editing an event.
  • Add a model decorator with a “super_featured” scope, then query them with “Event.get_all.super_featured.limit(3)” to render them in the view

And that’s it! No forking of the events codebase, no “super_featured” config option added to the events engine (over time, that would result in so many config options for all the custom attributes). Just a clean customization of an extension.

  • Content engine w/ taxonomies & delegate items

Allows us to very easily create a collection or content type (e.g. a “story”) with categories, tags, authors, autosave, edit lock and other features.

We’ve built it in a way to allow a custom model outside of the content engine (e.g. a small group sign-up system) to easily integrate with the content engine to gain any of its functionality. We just need to add the association, the appropriate model & controller concerns and render the form field partials to fill out the admin UI with these features.

  • Formbuilder

We’ve built a react drag-and-drop formbuilder with stripe integration for payment and donation forms. Following the theme of our development, it also has a nice clean and simple way for developers to add custom fields (e.g. a “your parish” dropdown or a “choose a timeslot” widget) for full developer flexibility without forking the formbuilder codebase. Here is the settings modal for a multiple choice form part:

  • Configuration hooks

We find .env and config files flexible and efficient to cover many of our needs. We’ve built hooks so config can be overridden within the controller context where we have access to the database and the HTTP request.  For example, most sites simply configure `config.site_name = "Focus on the Family"` but when we run our CMS in multi-site mode we create a hook that returns `` or something from the database instead.

  • Js content-ready event

We have a js pattern so any js can subscribe to receive and initialize any html the moment it is added to the DOM. This allows us to make big changes to do with lazy loading, dynamic updating of parts of the page or user workflows that avoid page loads without breaking the js initialization

  • Dynamic content & caching

We integrate with cloudflare and have a system to ajax-in below the fold content that can be cached with a shorter TTL so we can more often cache the initial page load.

  • Clean automated tests

We are actively upping our game in continuous integration/

  • Scope hooks

Yet another extensibility pattern we’ve developed to allow an app (e.g. a multi-site app) hook into the index process to filter all content. We just `self.register_scope_method(:filter_by_org)` then return `things.in_org(` within that “filter_by_org” scope hook callback.

  • Docker

We run our apps in docker containers to easily scale, test and manage deploys and we have Notch8, our dev ops team, who handle this all for us.

You’ll be working with:

  • Javascript frameworks like React, Ember, Backbone, etc.
  • CSS preprocessors like SASS
  • Bootstrap 4 (responsive framework)
  • Rails 5.2
  • RESTful APIs (we’re considering getting into GraphQL)
  • jQuery & React
  • Git
  • Bootstrap 4
  • SASS
  • Our custom CMS

If you have experience with these, great. If not, we trust that you’ll be able to learn them quickly.

We promise to:

  • Do work that matters. We help churches, charities, and nonprofits inspire the world by building great brands and digital experiences. We’re changing the culture for good.
  • Speak the unspoken. We’re honest and kind, saying and doing whatever it takes to help us become better humans and do better work.
  • Invite you to potlucks. We work and play as a team because we genuinely like building our community.

We have:

  • The tools you need to do your job. We’re an Apple crew and offer a laptop and phone (including unlimited data plan) for use while you’re here.
  • A medical benefits package for you and your family. There’s even a dentist down the hall.
  • An office in Fort Langley. There’s also the ability to work remotely full-time, as long as you’re willing to travel to our office to connect with the rest of the team sometimes!
  • Family-focused values. We love having spouses and kids drop by the office and are extra flexible when new babies are born.
  • Personal coffee-making tutorials. Espresso runs through our veins.
  • Fun gear to borrow after hours. Things like our RED camera are available for personal projects and who doesn’t like a movie played on a projector?
  • Daily team check-in and prayer time. Just like we work and play, we also work and pray.
  • A running club. And a non-running club.

Sound like the perfect fit?

Thank You
Your application was submitted successfully.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Apply for this Job
  • Location
    Langley, British Columbia
  • Department
  • Employment Type
  • Minimum Experience
  • Powered by