<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Breaking the Bank - Medium]]></title>
        <description><![CDATA[Using technology to drive financial health - Medium]]></description>
        <link>https://medium.com/chime-engineering?source=rss----7e2e9ba70cc1---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Breaking the Bank - Medium</title>
            <link>https://medium.com/chime-engineering?source=rss----7e2e9ba70cc1---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 31 May 2026 20:31:56 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/chime-engineering" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Unifying Projects with Makefiles]]></title>
            <link>https://medium.com/chime-engineering/unifying-projects-with-makefiles-3f8db5372e6d?source=rss----7e2e9ba70cc1---4</link>
            <guid isPermaLink="false">https://medium.com/p/3f8db5372e6d</guid>
            <category><![CDATA[developer-tools]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[developer-productivity]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Alex Kleissner]]></dc:creator>
            <pubDate>Fri, 21 Dec 2018 00:36:04 GMT</pubDate>
            <atom:updated>2018-12-21T00:55:49.181Z</atom:updated>
            <content:encoded><![CDATA[<p>At work, I end up spending time in many different projects. Some of these are similar, some are quite different. The tasks I want to do in them are usually the same: set up the project, initialize data, run tests, run the service.</p><p>Most companies don’t have a single stack anymore. You might have a few projects that use Elixir, and a few that use Rails (even those might have various versions of Rails). Sometimes my changes in a Rails project require me to run an Elixir service on my machine, but I have no clue how to set that up.</p><p>Take migrations as an example. Rails has you run ./bin/rails db:migrate and in Elixir I would do mix ecto.migrate. Both commands do the same thing, but have different syntaxes.</p><p>What I like is commonalities. My process for getting any project up and running should be the same, no matter which stack it’s on. The steps for setting up a repo should also be easy to understand and easy to learn from if I care to peek under the hood.</p><p>I ended up going with setting up a Makefile in each project at Chime. In the above example, I should just be able to make migrate in either project, and presto! My project does the right thing.</p><h3>But… Why make?</h3><p>I know, I know! Make is that thing you used forever ago to coordinate how your C++ files compiled to avoid linking errors. Or at least, I think that’s what I used to use them for. We’re going to use them as a glorified command line execution system — something far more benign.</p><p>Make is available in pretty much every linux environment. It’s straight forward, and it’s easy to debug. It doesn’t have a ton of bells and whistles, but that means it will always just work.</p><p>When a developer clones a new repo at Chime, they can take a quick glance at the Makefile and know what has to happen (also, keeping README’s up to date is key). I can run make build, then make setup_db followed by a make test and it won’t matter if it’s Ruby, Elixir, or some other crazy stack.</p><p>The best part? You can actually group make commands into similar files and then include them in your main Makefile. We use this to DRY up common make commands that relate to our mysql instance, as well as other things like bringing up and down docker-compose environments. You can do that by adding this to your Makefile:</p><p>include Makefile.common</p><p>You could have things like Makefile.rails and Makefile.phoenix to dry things up even more.</p><h3>Tips &amp; Tricks</h3><p>Make it self-documenting! One of my favorite parts about this, is adding the following to my top level common Makefile:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e49c6a06b1c0c047abc5395526dead09/href">https://medium.com/media/e49c6a06b1c0c047abc5395526dead09/href</a></iframe><p>This will pull any comments that start with #: out and display them nicely for anyone who’s looking at what’s available.</p><p>You can also use environment variables to pass parameters. To see a full example, here’s one that I have set up for a <a href="https://github.com/hex337/alex-koin/blob/master/Makefile">personal project</a> of mine:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9c35f31a4f04b7eb4f328985775251d8/href">https://medium.com/media/9c35f31a4f04b7eb4f328985775251d8/href</a></iframe><p>The end result of running make help looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/810/1*OiN7ua2WIN-yKkdiHtfbYg.png" /><figcaption>Documentation is good.</figcaption></figure><p>Do you have some tips or tricks you can share? I’d love to hear them!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f8db5372e6d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/chime-engineering/unifying-projects-with-makefiles-3f8db5372e6d">Unifying Projects with Makefiles</a> was originally published in <a href="https://medium.com/chime-engineering">Breaking the Bank</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Making Fetch Happen:]]></title>
            <link>https://medium.com/chime-engineering/making-fetch-happen-576f5eda6149?source=rss----7e2e9ba70cc1---4</link>
            <guid isPermaLink="false">https://medium.com/p/576f5eda6149</guid>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[fetch]]></category>
            <category><![CDATA[redux]]></category>
            <dc:creator><![CDATA[Dave Corson-Knowles]]></dc:creator>
            <pubDate>Thu, 04 Oct 2018 16:43:24 GMT</pubDate>
            <atom:updated>2018-10-30T17:38:29.743Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*XaNR3SAJ8q1ParmY12W8vA.gif" /></figure><h3><strong>Switching to Fetch in a React with Redux Application</strong></h3><p>This tutorial demos switching to Fetch while working with React and <br>Redux.</p><p>Here at <a href="https://member.chimebank.com/join/davidcorsonknowles">Chime</a> we use <a href="https://github.com/shakacode/react_on_rails">ReactOnRails</a> and have found a transition to using Fetch to be a big win. I’d been working with Ajax previously. I’ll show you how we did it.</p><p>Let’s create an Errors Reducer that propagates helpful error messages from your backend up to your React components. Then errors can be rendered to the user. We can use this to improve our form handling and CRUD operations.</p><p>Our example Actions look like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/893f0800f29c5e5eeb8d2f5dd97b3322/href">https://medium.com/media/893f0800f29c5e5eeb8d2f5dd97b3322/href</a></iframe><p>And our matching Errors Reducer looks like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b24ece5e8ba8def326c6f618b46a711c/href">https://medium.com/media/b24ece5e8ba8def326c6f618b46a711c/href</a></iframe><p>This errors reducer pattern can be used with Fetch, Ajax, Axios, raw <a href="https://en.wikipedia.org/wiki/XMLHttpRequest">XMLHttpRequest</a> or any number of other data retrieval tools.</p><p>We want to use this reducer with Fetch, so we’ll need to install and save the ‘fetch’ npm package. From your command line:</p><pre>npm install fetch --save</pre><p>Honestly, any of those tools will work fine, so why Fetch?</p><ol><li>Fetch has great <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch">MDN documentation</a>.</li><li>If you are switching off of jQuery and want a substitute for Ajax, Fetch is a good standard to adopt.</li><li>GitHub has open-sourced a nice <a href="https://github.com/github/fetch">polyfill for Fetch</a> that supports older browsers.</li><li>If you work with modern JavaScript promises all the time, Fetch will feel comfortable and familiar.</li><li>If you don’t, then Fetch will make you familiar with <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises">modern promise handling</a>!</li></ol><h4>Get your Linter ready</h4><p>We will be working with JSON rendered by your backend and transforming it for use in your frontend. This means the variable names received by Fetch may trigger linter warnings since they won’t necessarily be formatted to follow JavaScript’s camelcase convention.</p><p>If you are using <a href="https://eslint.org/">ESLint</a> (and you really should be), you’ll want to include this line at the top of each of your Redux Action Creator files:</p><pre>/* eslint-disable no-undef, camelcase */</pre><p>If your backend is written in Node or is already serving up data that is CamelCased, you won’t need this line. (In our example, we technically don’t need this either since the one word variable,item, looks the same in both CamelCase and snake_case. I doubt you’ll be restricted to one word variables in practice though, so this is going to be helpful as you build more Redux Action Creators.)</p><h4>Use the Action Creators in a Fetch Promise Chain</h4><p>We set up our reducer, now let’s use it!</p><p>In our demo, we will include a few lines of configuration for ReactOnRails. You can substitute this with the corresponding requirements from any back-end server you are using in your app.</p><p>We import ReactOnRails at the top of the file to handle CSRF security in our requests to the server:</p><pre>import ReactOnRails from ‘react-on-rails’;</pre><p>Then we import our error action creators that we made above. This assumes they are in the same local folder as our new file:</p><pre>import { receiveErrors, clearErrors } from ‘./errorActionCreators’;</pre><p>As a best practice, always prefer constants over strings in Action Creators. This mitigates against silently failing actions in your Reducers. Mistyped strings are ignored by the Reducer, whereas an undefined constant will raise an appropriate error. This is a major win for trouble-shooting.</p><pre>export const GET_ITEM = &#39;GET_ITEM&#39;;<br>export const DELETE_ITEM = &#39;DELETE_ITEM&#39;;<br>export const RECEIVE_ITEMS = &#39;RECEIVE_ITEMS&#39;;</pre><p>You will use these constants when creating your synchronous actions:</p><pre>export const getAdminUser = text =&gt; ({<br>  type: GET_ITEM,<br>  text,<br>});</pre><pre>export const deleteAdminUser = text =&gt; ({<br>  type: DELETE_ITEM,<br>  text,<br>});</pre><pre>export const receiveAdmins = payload =&gt; ({<br>  type: RECEIVE_ITEMS,<br>  payload,<br>});</pre><p>You can use the following two functions to handle all of your promises.</p><p>1) If you are familiar with AJAX but not Fetch or general promise handling, this is the biggest change!</p><pre>export const status = response =&gt; {<br> if (response.status &gt;= 200 &amp;&amp; response.status &lt; 300) {<br> return Promise.resolve(response);<br> } else {<br> return Promise.reject(response);<br> }<br>};</pre><p>2) Meanwhile, this one-liner is pretty handy, you will do this a lot:</p><pre>export const unwrap = response =&gt; response.json();</pre><p>These will be used in all of your Promise Chaining to DRY out your Action Creators. Here’s what it looks like in action:</p><pre>export const updateItem = (item) =&gt; {<br> const url = `/api/items/${item.id}`;<br> const body = JSON.stringify({ item });<br> return (dispatch) =&gt; {<br>   fetch(url, {<br>     credentials: ‘same-origin’,<br>     method: ‘PATCH’,<br>     body,<br>     headers,<br>   })<br>   .then(status)<br>   .then(unwrap)<br>   .then(responseJSON =&gt; dispatch(receiveItem(responseJSON)))<br>   .catch(unwrap)<br>   .then(responseJSON =&gt; dispatch(receiveErrors(responseJSON)));<br> };<br>};</pre><p>Similarly, here’s the action creator for your show route (to get all items):</p><pre>export const showItems = () =&gt; {<br>  const url = &#39;/api/items/&#39;;<br>  return (dispatch) =&gt; {<br>    fetch(url, { <br>      credentials: &#39;same-origin&#39;, <br>      method: &#39;GET&#39;, <br>      headers <br>    })<br>    .then(status)<br>    .then(unwrap)<br>    .then(responseJSON =&gt; dispatch(receiveItems(responseJSON)))<br>    .catch(unwrap)<br>    .then(errors =&gt; dispatch(receiveErrors(errors)));<br>  };<br>};</pre><p>We’re using a lot of ES6 implicit object de-structuring there. One of the variables you will have to fill out for it to work properly is headers.</p><p>If you are using ReactOnRails, you can configure your headers as follows. Otherwise, you will want to set up headers in the expected format for your backend. You can put this in a utilities folder and make it accessible to all of your different Action Creators.</p><pre>export const headers = {<br> ‘X-Requested-With’: ‘XMLHttpRequest’,<br> ‘X-CSRF-Token’: ReactOnRails.authenticityToken(),<br> ‘Content-Type’: ‘application/json’,<br> Accept: ‘application/json’,<br>};</pre><p>You’ll want to set your Fetch headers properly for security reasons, especially for <a href="https://en.wikipedia.org/wiki/Cross-site_request_forgery">CSRF protection</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*m6B1xlvp_vvmsAQan3CTEQ.png" /></figure><h3>Now we’ve made Fetch happen</h3><p>Did you find this useful? Need help with something else? Have a better way to do it? Please tell me all about it in the comments.</p><p>If making code reusable like this gives you a thrill of satisfaction, check out <a href="https://www.chimebank.com/job-openings/">career opportunities at Chime.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bN-HdRugco-Bil7cG-8rEw.jpeg" /><figcaption>Wednesday, October 3rd @ Chime</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=576f5eda6149" width="1" height="1" alt=""><hr><p><a href="https://medium.com/chime-engineering/making-fetch-happen-576f5eda6149">Making Fetch Happen:</a> was originally published in <a href="https://medium.com/chime-engineering">Breaking the Bank</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Planning an Internal Elixir Hackathon]]></title>
            <link>https://medium.com/chime-engineering/planning-an-internal-elixir-hackathon-2d0a6683bde8?source=rss----7e2e9ba70cc1---4</link>
            <guid isPermaLink="false">https://medium.com/p/2d0a6683bde8</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[learning-to-code]]></category>
            <category><![CDATA[elixir]]></category>
            <dc:creator><![CDATA[Alex Kleissner]]></dc:creator>
            <pubDate>Tue, 02 Oct 2018 19:01:03 GMT</pubDate>
            <atom:updated>2018-10-02T22:53:57.119Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1suRrl8bDbHhTEa63dN38g.jpeg" /><figcaption>A world of possibilities when playing with a new programming language. Photo by Alex Kleissner</figcaption></figure><p>I’ll cover the following topics, feel free to jump around to the bits that speak to you:</p><ol><li><strong>Background</strong></li><li><strong>Initial Proposal</strong></li><li><strong>Prep Work</strong></li><li><strong>Day-of</strong></li><li><strong>What I Learned</strong></li></ol><p>In late 2017, I found myself in a position to look for a new job, which meant asking myself what I wanted. Did I want to keep pushing down the Python route? Maybe go back to Ruby? I had been playing around with React and thought it was pretty amazing, but I’ve always been more of a back end kind of person.</p><p>I ended up focusing on Ruby because I felt I had a strong grasp on it and generally liked working in it. About two weeks into the job search, I had a ping from a recruiter asking if I would be interested in a job that was using Elixir. At first I thought, “No way, I’m wanting to get back into Ruby and don’t need to get side tracked. Besides, I tried Go, and it was ok, but not my jam.”</p><p>Fast-forward about two more weeks and I’m trying to do some of my interview take-home questions in Elixir in an attempt to force myself to learn it. Functional programming? Heck yes. Immutable data? Be still my beating heart. Parallel processing and async I/O? It was like falling in love all over again. There was just one tiny hiccup: I accepted a job at <a href="https://www.chimebank.com">Chime</a> where the back end is all Ruby on Rails.</p><p>Luckily I had already talked about Elixir in my interview, and the overall engineering vibe at Chime is one of “if it makes sense and we can present a business case for it, let’s try it!” Before I could really push any kind of Elixir-based project, I needed to get people excited and interested in learning a new language and framework.</p><h3>Making the Initial Proposal</h3><p>At past jobs, I’ve participated in learning groups when a adopting a new technology or framework. These can work well, but one <strong>large problem is that the “extra” work of learning usually gets offloaded to non-work hours</strong>. If Chime was going to be serious about trying out this new tech, I wanted us to put valuable work hours toward learning Elixir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gCMtmkReqJFPOEqy" /><figcaption>“people sitting down near table with assorted laptop computers” by <a href="https://unsplash.com/@marvelous?utm_source=medium&amp;utm_medium=referral">Marvin Meyer</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>I wrote up a quick one-page document to lay out the goals and budget requirements to set up a one-day off-site Elixir focused hackathon. I noted that the off-site part, while not necessary, was high priority for me. Pulling engineers out of the day-to-day would allow for a more focused space for learning and building. I can also now admit that getting the CTO to OK some budget for a breather room was also a bit of a litmus test on how seriously we were considering Elixir. I made sure to find a range of options for the breather to fit different budgets. If you will have more than 6 people, I would definitely suggest finding a space that has at least two physical rooms so that groups can collaborate without interfering with each other.</p><p>For the hackathon to be successful, I wanted other engineers to see where functional programming could be powerful. They should walk away from the day with a sense of accomplishment for having pushed out production-capable code. This meant that picking projects that would benefit from the underlying differences of Elixir was crucial to the hackathon’s success.</p><p>It took all of about 10 minutes for the CTO and VP of Eng to say “very yes” to the hackathon idea. I was pretty stoked, but now I also had to deliver on my ambitious plan.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*8JWfHe2OhnLyDUH1hjcs7g.gif" /><figcaption>Image via giphy.com</figcaption></figure><h3>Hackathon Prep Work</h3><p>I really wanted to focus on getting as much learning done as possible. I identified the following as the enablers of that:</p><ol><li>Focus only on Elixir and Phoenix work.</li><li>Remove as many setup issues as possible.</li><li>Pick the right projects.</li></ol><p>I encouraged people to do as much prep work as they could in the weeks leading up to the event. This included everything from “here’s some good learning resources to pick up the syntax”, to “here’s a dockerized project that you can start playing with”. The goal was to remove as much of the language basics learning time as possible.</p><p>For the hackathon itself, I took each of the potential projects and set up repos a week ahead of time with all the necessary set up to hit the ground running. Each project had a working <a href="https://medium.com/@hex337/setting-up-a-phoenix-1-3-4-project-with-docker-72f019c5954f">docker-compose</a> environment and a README with instructions on how to get the project running locally. Having this ready <strong>early</strong> also helped reduce setup time during the hackathon.</p><p>Picking the right projects was the hardest task. The scope had to be small enough that people could work on it and make progress in one day, and it had to be something that would leverage the power of Elixir. There’s no secret recipe here. I had never run something like this before, and I am far from an expert in Elixir and Phoenix. For our next hackathon, I’ll have a better idea of what our team can accomplish in one day, and which internal projects would benefit from the tech.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qqpSd5w9bOoTwvMh6pjiow.jpeg" /><figcaption>A clean workspace creates clean code. Photo by Alex Kleissner</figcaption></figure><p>The three projects I ended up going with:</p><ul><li>a <a href="https://graphql.org">GraphQL</a> server</li><li>a background script processor job</li><li>common logging and stats tracking for Phoenix projects</li></ul><p>Why GraphQL? Outside of wanting to experiment with it for our apps, we also see it as more of an aggregation framework for our transition to <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">SOA</a>. Since GraphQL allows us to define reducers, we can farm out pieces of a query to multiple back end services and aggregate the results without forcing the front end app to hit multiple services. We can leverage the async I/O strengths of Elixir - in this case for any of the downstream services that take a while to respond (a common experience when dealing with moving money).</p><p>The last piece of the puzzle was matching people with shared project interest and Elixir skill levels. We’d work in pairs, each pair having one developer with more Elixir experience. This would help facilitate more knowledge sharing and learning.</p><h3>Day of Learnings</h3><p>With the Hackathon day upon us, we settled into the Breather we rented near the office. I gave a quick overview of the projects along with the first few steps that I thought people should tackle (I put these into GitHub issues, but we ended up not really using them since... GitHub issues).</p><p>The rest of the day was split into three, two-hour focused working sessions:</p><ul><li>First kick off the projects</li><li>Lunch break</li><li>Second focus sesssion</li><li>Show and Tell</li><li>Final session to wrap things up</li></ul><p>The two hour cadence seemed about right. More can get taxing when you’re learning something new, and less can prevent you from finishing anything.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ji6Avu-h6HXQQBh_PehJ0w.jpeg" /><figcaption>Morning working session, powered by coffee. Also # laptops &gt; # people? Photo by Alex Kleissner</figcaption></figure><p>One of my initial goals was to produce a production-ready piece of software in Elixir that we could deploy, or at least get to a deployable state with minimal follow-up effort. Turns out that was a lot more ambitious than I thought, and that ended up being my biggest frustration with the entire event. While we made some great progress on the projects, we did not have enough dev ops infrastructure in place to run any Elixir projects in any of our environments. We also didn’t get to a good deployable state for any of the three projects. Between initial language learning, and overall project context, everything I picked was far too ambitious to finish in one day.</p><p>In spite of those results, the day went well. The GraphQL service pulled a separate service in, validating that it could work as a proxy. Our background script jumped over the initial hurdles and had the inklings of some impressive performance improvements. We even have a <a href="https://hexdocs.pm/phoenix/plug.html">Plug</a> that we can use to do stats tracking for request durations in Phoenix projects.</p><h3>Post-Event Learnings</h3><p>I set up a quick type form feedback survey for people to fill out after the event to see what went well or didn’t go well. The interesting learnings:</p><ol><li>Having a space with two rooms was great, but the lack of monitors and more collaborative work stations wasn’t great.</li><li>Being explicit about ensuring all participants get work time to prep would help reduce frustrations (mostly around me feeling like the time wasn’t used to its maximum potential).</li><li>Taking time away from the normal office was a big win.</li><li>Sharing what people accomplished and learned half way through was really helpful for everyone.</li><li>Finding the right project(s) is hard and you might not nail it.</li></ol><p>I wanted to spark interest in Elixir and highlight what we could do with it. I think I definitely sparked interest, but fell short on really highlighting where Elixir and Ruby differ. Luckily, there’s enough interest that we’re continuing to have mini-hackathons to build on the work we started. We even have a few key services slated for development on our one year road map that will use Elixir, a direct result of the learnings from the off-site.</p><p>Do you want to run a hackathon for your company? Do you have other ideas around how to help a company transition to a new technology or framework? I’d love to hear what’s worked for you or your team.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2d0a6683bde8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/chime-engineering/planning-an-internal-elixir-hackathon-2d0a6683bde8">Planning an Internal Elixir Hackathon</a> was originally published in <a href="https://medium.com/chime-engineering">Breaking the Bank</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>