<?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[Stories by Peter LoBue on Medium]]></title>
        <description><![CDATA[Stories by Peter LoBue on Medium]]></description>
        <link>https://medium.com/@pejalo?source=rss-a304ed724461------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*k6y1kHpMaaFKG9QBt6SUWw.png</url>
            <title>Stories by Peter LoBue on Medium</title>
            <link>https://medium.com/@pejalo?source=rss-a304ed724461------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 08:59:29 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@pejalo/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Firebase to the Rescue: Dynamic Routing via Hosting + Functions Integration]]></title>
            <link>https://medium.com/hackernoon/firebase-to-the-rescue-dynamic-routing-via-hosting-functions-integration-aef888ddf311?source=rss-a304ed724461------2</link>
            <guid isPermaLink="false">https://medium.com/p/aef888ddf311</guid>
            <category><![CDATA[firebase]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Peter LoBue]]></dc:creator>
            <pubDate>Fri, 30 Jun 2017 08:18:57 GMT</pubDate>
            <atom:updated>2019-05-22T08:36:30.707Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hxRH_xOH2wdGahxVJEz9Ag.jpeg" /></figure><p>This article is somewhat of a memoir where I share my experience getting dynamic routing to work with Firebase. To understand what’s going on, you should be familiar with their <a href="https://firebase.google.com/docs/hosting/">Hosting</a> and <a href="https://firebase.google.com/docs/functions/">Functions</a> products. I’ve condensed all the essential technical stuff into the <strong>mini tutorial</strong>. Feel free to skip this section if you’re willing to read the whole article.</p><h3>tl;dr Mini Tutorial</h3><p>Firebase Hosting serves static files from your custom domain. Firebase Functions are executed by calling them via ugly cloudfunctions.net URLs. As of Google IO 2017, they now play nicely together. In your firebase.json’s hosting configuration, you can rewrite any specific route on your custom domain to call a function instead of serve a static page. <a href="https://firebase.google.com/docs/hosting/functions">Check out the docs.</a></p><p>To simulate dynamic routes like example.com/posts/123, I did the following: Create a function called <a href="https://gist.github.com/pejalo/1715c896658d660e0ded0d49d9910896">post</a>. Set up firebase.json to have all requests for /posts/** call the post function. The function fetches data and returns pre-rendered <a href="https://hackernoon.com/tagged/html">HTML</a> containing all the proper social and SEO meta tags for the requested post, to make crawlers happy and support <a href="https://medium.com/slack-developer-blog/everything-you-ever-wanted-to-know-about-unfurling-but-were-afraid-to-ask-or-how-to-make-your-e64b4bb9254">unfurling</a>.</p><p>The page also includes a <a href="https://hackernoon.com/tagged/javascript">JavaScript</a> window.location redirect snippet, so a real user is redirected to example.com/?post=123. This static index page reads the query parameter, displays the correct screen with the post content, and leverages HTML5’s replaceState() to put example.com/posts/123 back into the browser’s address bar. Serverless dynamic routing for all!</p><h3>❤ Firebase</h3><p>Firebase has single-handedly reignited my relationship with web development. Instead of building a frontend and backend for every project, I now only ever have to worry about the frontend. As broad as Firebase’s offering is, it still lacks many sought after <a href="https://medium.freecodecamp.com/firebase-the-great-the-meh-and-the-ugly-a07252fbcf15">features</a> (like <a href="https://medium.com/google-cloud/firebase-search-a-bigger-boat-c85695546d02">search</a>, complex database <a href="https://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase">querying</a>, insight into <a href="https://startupsventurecapital.com/firebase-costs-increased-by-7-000-81dc0a27271d">usage</a>, etc). But I’m so invested at this point that I’d rather jump through a couple hoops to make something work with Firebase than go back to setting up a foundational backend myself as if we were still living in a pre-<a href="http://parseplatform.org/">Parse</a> era. (Yes, us developers are lazy.)</p><p>A couple weeks ago I was working on a Product Hunt clone that had a pretty simple requirement: dynamic routing. Each post needed its own URL to share around the web, like example.com/posts/123. These links had to return pre-rendered social and SEO meta tags to support <a href="https://medium.com/slack-developer-blog/everything-you-ever-wanted-to-know-about-unfurling-but-were-afraid-to-ask-or-how-to-make-your-e64b4bb9254">unfurling</a>.</p><p>Up until this point I had everything happily hosted on Firebase as a notorious <em>single page app</em>, connecting directly to the database from the client. But with this new pre-rendering requirement, which was not yet supported by Firebase, it looked as though I’d have to point our domain to a custom VPS and host the site myself.</p><p>So I spent a weekend learning about <a href="http://dokku.viewdocs.io/dokku/">Dokku</a> (a great option BTW), getting our site up and running, doing some load testing, watching the site crash, scouring the internet to try and figure out why, convincing myself the app had memory leaks, then realizing I just needed a machine with more memory, bla bla bla all the while wishing I could just get back to building features and stop dealing with this dev ops nonsense.</p><p>A couple days later, someone in the Firebase Slack group posted a <a href="https://events.google.com/io/">Google IO</a> livestream. I tuned in just for fun and right there, the exact feature was announced that I needed: <a href="https://firebase.google.com/docs/hosting/functions">Hosting + Functions!</a> With this new integration developers can run some backend code behind a custom domain before sending HTTP responses to the client. Within a couple hours I had dynamic routing working in production and could put Dokku back on the shelf.</p><h3>Hosting + Functions</h3><p>Firebase Hosting now has a new configuration option. In firebase.json, where you specify all your <a href="https://firebase.google.com/docs/hosting/url-redirects-rewrites">hosting behavior</a> like caching, rewrites, redirects, etc, you can rewrite any path to point to a function instead of a static file. Here’s an example:</p><pre>// firebase.json</pre><pre>{<br>  &quot;hosting&quot;: {<br>    &quot;public&quot;: &quot;public&quot;,<br>    &quot;rewrites&quot;: [<br>      { &quot;source&quot;: &quot;/posts/**&quot;, &quot;function&quot;: &quot;post&quot; }<br>    ]<br>  }<br>}</pre><p>With this config, any requests to example.com/posts/postidorhashorwhatever will ignore whatever static files you might have hosted there and call your post function instead. The function is called with Express <a href="https://expressjs.com/en/api.html#req">Request</a> and <a href="https://expressjs.com/en/api.html#res">Response</a> objects through which you can send an arbitrary HTTP response.</p><p>This lets us perform any logic we want before returning to the client! (As long as it runs within Firebase’s cloud function Node environment…) Great, you might think: We can return anything, but how do we return an entire page of our website showing the proper post content, when the website is built to be served as static pages?</p><p>The truth is, I don’t know. Maybe some day the Webpack gurus will create super fancy plugins that separate dynamic routes into functions with their own deployment configurations. Who knows what they’ll come up with next. Meanwhile, I’ve got a hacky solution that isn’t too complex and achieves the same result.</p><h3>Redirects</h3><p>Because our function can return anything, it’s pretty easy to have it return valid HTML with whatever content-specific social and SEO meta tags we need. This is the only part of our page that really needs to be pre-rendered to support unfurling. And if we can make it return an HTML string, we can certainly include a snippet of JavaScript in there to help get the rest of the page displayed asynchronously.</p><p>Here’s a shortened version of what my post function looks like:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/09874c833a3c3a2b969ace315a379cf8/href">https://medium.com/media/09874c833a3c3a2b969ace315a379cf8/href</a></iframe><p>As you can see, the HTML response to be sent includes &#39;&lt;script&gt;window.location=&quot;<a href="https://example.com/?post=">https://example.com/?post=</a>&#39; + post.id + &#39;&quot;;&lt;/script&gt;&#39;. A crawler just looking for your meta tags will be happy to receive them and won’t bother to execute this script. But a real user who loads this page in a browser will be immediately redirected to example.com/?post=123.</p><p>Now what exactly happens on example.com/?post=123 is out of the scope of this article, because it completely depends on the frontend framework you’re using. You just want to show the post content without redirecting the browser back to /posts/123. (My website was built with <a href="https://vuejs.org/">Vue.js</a>, so in my index page’s beforeMount() function I check this.$route.query.post. If it exists, I show the requested post within the index page, without touching the route.) The important thing to know is that you can <a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API">manipulate</a> what’s displayed in the browser’s address bar to look nice again. To replace the ugly ?post=123 with /posts/123, you can call window.history.replaceState({}, ‘Title’, ‘/posts/’ + postId);.</p><p>Voila! Unless the user paid attention compulsively to their address bar, all they know is that they clicked on a link and ended up on the proper page of our website.</p><p>Honestly, as a design freak, this double-redirection does irk me a bit. It’s not sparkling clean. But it only ever happens to users who navigate to our site via a standalone link like example.com/posts/123 from another source. The jarring experience of jumping from the referring website to our site overshadows the quick redirects happening in the background.</p><p>And you know what’s dirtier than a little redirect hack? Spinning up a new virtual machine, installing Ubuntu, adding your SSH keys, creating a new sudo user, sudo apt-get update, etc etc you get the picture…</p><p>Firebase FTW.</p><p>Made it to the end and learned something? Leave some love 💚</p><p><em>Peter LoBue is a freelance UX designer, web developer and iOS developer living between Philadelphia and San Francisco. Reach out for availability: </em><a href="https://twitter.com/pejalo"><em>@pejalo</em></a></p><figure><a href="http://bit.ly/HackernoonFB"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0hqOaABQ7XGPT-OYNgiUBg.png" /></a></figure><figure><a href="https://goo.gl/k7XYbx"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Vgw1jkA6hgnvwzTsfMlnpg.png" /></a></figure><figure><a href="https://goo.gl/4ofytp"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gKBpq1ruUi0FVK2UM_I4tQ.png" /></a></figure><blockquote><a href="http://bit.ly/Hackernoon">Hacker Noon</a> is how hackers start their afternoons. We’re a part of the <a href="http://bit.ly/atAMIatAMI">@AMI</a> family. We are now <a href="http://bit.ly/hackernoonsubmission">accepting submissions</a> and happy to <a href="/service/mailto:partners@amipublications.com">discuss advertising &amp; sponsorship</a> opportunities.</blockquote><blockquote>If you enjoyed this story, we recommend reading our <a href="http://bit.ly/hackernoonlatestt">latest tech stories</a> and <a href="https://hackernoon.com/trending">trending tech stories</a>. Until next time, don’t take the realities of the world for granted!</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*35tCjoPcvq6LbB3I6Wegqw.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2Fdde502%3Fas_embed%3Dtrue&amp;dntp=1&amp;url=https%3A%2F%2Fupscri.be%2Fhackernoon%2F&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/3c851dac986ab6dbb2d1aaa91205a8eb/href">https://medium.com/media/3c851dac986ab6dbb2d1aaa91205a8eb/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aef888ddf311" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/firebase-to-the-rescue-dynamic-routing-via-hosting-functions-integration-aef888ddf311">Firebase to the Rescue: Dynamic Routing via Hosting + Functions Integration</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Beginner Web Developers: Supercharge your Productivity with a Bundler]]></title>
            <link>https://medium.com/fusebox/beginner-web-developers-use-a-bundler-31ab0c91d2f5?source=rss-a304ed724461------2</link>
            <guid isPermaLink="false">https://medium.com/p/31ab0c91d2f5</guid>
            <category><![CDATA[fusebox]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Peter LoBue]]></dc:creator>
            <pubDate>Fri, 23 Jun 2017 08:44:59 GMT</pubDate>
            <atom:updated>2017-06-23T20:38:32.590Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oWgSQYwLP8h2-WfzEhhQxg.jpeg" /></figure><h3>Beginner’s Guide to Web Development: Supercharge your Productivity with a Bundler</h3><p>Back in the simpler days of web development, you would create an .html file in any text editor and open it in your browser to see it formatted nicely. To make changes, you’d update the file and refresh the browser. That was it. Contrast that with the following popular rant:</p><p><a href="https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f">How it feels to learn JavaScript in 2016</a></p><p>Thousands of web development helper tools are improved upon every day. If used properly, incorporating them into your development environment will make you infinitely more productive. But unfortunately, using all these tools means that proportionally more time is spent managing and configuring them than writing code.</p><h4>Enter: The Bundler.</h4><p>A <em>bundler</em> helps web developers manage a group of tools that solve related problems. You can think of it as a “meta-tool,” where each sub-tool is managed by a <em>plugin</em>. Although bundlers can be used to do all kinds of fancy stuff, we will focus on three sets of problems here that apply to any web development project:</p><ul><li>Transpiling higher-level languages into HTML, CSS and JavaScript</li><li>Serving files on an ad-hoc HTTP server with live-reloading</li><li>Preparing the application for production: minify, concatenate, uglify</li></ul><h3>Transpiling languages into HTML, CSS and JavaScript</h3><h4>The Problem</h4><p>Web browsers can natively only interpret three languages that work together to form what we know as a “web site” or “web application.”</p><ul><li><strong>HTML</strong> is primarily used to structure <strong>content</strong>.</li><li><strong>CSS</strong> defines how that content is <strong>styled</strong>.</li><li><strong>JavaScript</strong> allows us to <strong>dynamically</strong> change content and styling, based on user interactions and other events.</li></ul><p>These languages are defined by <em>standards</em> created by various non-profit technology organizations (<a href="https://www.w3.org/">W3C</a> and <a href="http://www.ecma-international.org/">ECMA</a>). Naturally, the standards themselves evolve faster than stable and secure browsers can support them. But us developers want to write code in the new standards, because they make us more productive.</p><p>Additionally, developers have invented more succinct/easier/readable languages on top of these three basic ones that are preferable to code in. Here are a couple examples with sample code snippets for comparison:</p><ul><li><strong>HTML</strong>: <a href="https://pugjs.org/">Pug</a>, <a href="http://haml.info/">Haml</a></li></ul><pre>&lt;!-- HTML --&gt;<br>&lt;div class=&quot;mycontainer&quot;&gt;<br>  ...<br>&lt;/div&gt;</pre><pre>// Pug<br>div.mycontainer<br>  ...</pre><pre>// Haml<br>%div.mycontainer<br>  ...</pre><ul><li><strong>CSS</strong>: <a href="http://sass-lang.com/">Sass</a>, <a href="http://lesscss.org/">Less</a></li></ul><pre>/* CSS */<br>div.mycontainer {<br>  background-color: gray;<br>}</pre><pre>// Sass<br>div.mycontainer<br>  background-color: gray</pre><ul><li><strong>JavaScript</strong>: ES6 aka <a href="http://www.ecma-international.org/ecma-262/6.0/">ECMAScript 2015</a>, <a href="https://www.typescriptlang.org/">TypeScript</a>, <a href="http://coffeescript.org/">CoffeeScript</a></li></ul><pre>// JavaScript<br>var addOne = function(a) {<br>  return a + 1;<br>}</pre><pre>// TypeScript<br>let addOne = (a) =&gt; a + 1;</pre><p>The examples shown here may look trivial, but each language really does offer some substantial improvements over their basic counterparts.</p><blockquote>If you are still writing plain HTML, CSS, or vanilla ES5 JavaScript, it’s time to power up your dev game!</blockquote><p>So how can we use these new languages and standards, without direct browser support?</p><h4>The Solution: Transpiling</h4><p>Our development environment needs to <em>transpile</em> the languages into the three understood by browsers: HTML, CSS and JS. This should happen quickly and unobtrusively (without any extra steps, after we get everything set up) so we can make changes to our application and see the results instantly. Bundlers can be set up to do this for us automatically, so we can code in whatever languages we please.</p><h3>Serving files on an ad-hoc HTTP server with live-reloading</h3><h4>Problems</h4><ul><li>When you create an .html file on your computer, you can simply double-click it to open it in your browser. It even loads images, .css and .js files. However, the browser reads files directly from your hard drive via the file: protocol. This has some restrictions and differences to the http: protocol, which your application will be served over once it’s hosted on the web. For example, files hosted with file: cannot perform <a href="https://developer.mozilla.org/en-US/docs/AJAX">AJAX</a> requests, and the relative file paths referenced in your .html files are handled differently.</li><li>If you’ve ever made an HTML page before, you know how annoying it is to view the changes that you make. You must save your file, switch to the browser, and reload the page. Switching back and forth between windows and pressing “reload” (or cmd + r) becomes tedious very quickly. It would be a huge help to have the browser reload itself automatically when changes are saved to our source files.</li><li>Sometimes we would like to see our changes in the browser without reloading the entire page. Consider a scenario where loading the page involves downloading and displaying data. When we are editing CSS and want to view a simple change, reloading the entire page every time is overkill. Wouldn’t it be nice if any change to our CSS (or Sass or Less) files would cause the browser to instantly <em>re-render</em> the page with the new styles instead of completely reloading it?</li><li>Consider another scenario: We have a web application that relies upon various JavaScript modules. Not every screen needs every module, so only modules needed by a screen are loaded when that screen is loaded. For example, the “settings” screen might require a “settings” JavaScript module. As we make changes to the settings module, we don’t want to reload the page every time, because that would require us to navigate to the settings screen again to see the result of our changes. Wouldn’t it be nice if, upon saving the settings module, only that specific module could be reloaded under the hood, so we could test it instantly?</li></ul><h4>The Solution: HTTP Server</h4><p>Running a simple HTTP server on our own local machine allows us to access our files via the http: protocol, mimicking the environment that the files will be hosted in when the site is published. Popular bundlers include an HTTP server plugin.</p><p>When set up properly, the bundler can <em>watch</em> your source files for changes. When you save a file in your editor, the bundler can tell your browser to either reload the entire page, re-render the page, or reload the specific JavaScript module.</p><p>When editing a file written in a higher-level language like Sass or TypeScript, the code must be transpiled into CSS or JavaScript before the browser is told to refresh. A properly configured bundler ensures that its plugins are executed in the right order.</p><h3>Preparing the Application for Production</h3><h4>The Problem</h4><p>While we are developing, even though we are writing our code in fancy languages that get transpiled into HTML/CSS/JS, we want those resulting files to look as close as possible to our original source files for debugging purposes. So when you get an error in your browser’s developer console like this one:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*8vQrAAECInuvRPm-mAAA1g.png" /></figure><p>…you can click on test.html to see what code caused the error, or easily find the relevant line of code in your text editor.</p><p>However, when publishing your code, you typically don’t care about debugging it. (It should work perfectly, right?) Instead, priorities lie in maximizing performance, minimizing bandwidth and possibly purposefully obscuring your code. These are achieved via three processes: <em>Minify</em>, <em>concatenate</em>, and <em>uglify</em>.</p><ul><li><strong>Minify — </strong>When we write code, we use lots of spaces or tabs and relatively long, comprehensive variable/function names to keep things clean and easy to understand. The extra characters needed for this nice formatting are completely unnecessary when interpreted by the browser. So to keep our file sizes down, we want to automatically remove whitespace, and replace JavaScript variable and function names with the shortest ones possible.</li><li><strong>Concatenate</strong> — Again, to help structure our code, we often split it into as many files and folders as we want. This allows us to stay sane with complicated projects. But when serving all this data in a production environment, it’s faster for the browser to download and parse a few large files than many separate smaller ones. Many developers prefer their web applications to consist of three files: one index.html, one .css file and one .js file. So we need a process that will combine lots of code from related file-types into a few files.</li><li><strong>Uglify</strong> — When writing code in <a href="https://en.wikipedia.org/wiki/Compiler"><em>compiled</em></a> programming languages like C++ and Swift, you typically publish your application in compiled <a href="https://en.wikipedia.org/wiki/Machine_code"><em>machine code</em></a> instead of source code. Machine code cannot be read by humans, and is difficult to reverse-compile back into the source. This deters competitors and hackers from misusing your application. Conversely, HTML is a markup language, CSS is a stylesheet, and JavaScript is an <a href="https://en.wikipedia.org/wiki/Interpreted_language">interpreted</a> scripting language. That means that the code you write is the same code sent to your users’/customers’ browser, which can be easily read and copied by humans. To combat this, many developers “uglify” their code before publishing it. This deforms the code to make it harder to decipher, for example by renaming variables and functions to be relatively incomprehensible.</li></ul><p>Setting up each of these processes to run in the proper order and for the right situation is no small feat.</p><h4>The Solution: Bundling!</h4><p>Again, bundlers can do all of this for us. They allow us to set up various series of tasks for different purposes, like developing, testing, and production. Each series can be configured and tweaked to your heart’s desire.</p><p>When active, whenever a change to a source file is detected, the bundler can re-process and <em>bundle</em> your app appropriately.</p><h3>Conclusion</h3><p>Bundlers can solve an infinite number of problems, but the ones mentioned here are useful for any serious web developer.</p><h4>Popular Bundlers</h4><p>The most common bundlers for web development today are <a href="https://webpack.js.org/">webpack</a> and <a href="https://gruntjs.com/">Grunt</a>. They each have their own configuration syntax that, while very powerful, come with a <a href="https://medium.com/@dtothefp/why-can-t-anyone-write-a-simple-webpack-tutorial-d0b075db35ed">steep</a> <a href="https://blog.madewithenvy.com/getting-started-with-webpack-2-ed2b86c68783">learning</a> curve. <a href="http://gulpjs.com/">Gulp</a> is another popular choice that many developers find easier to understand. And <a href="http://brunch.io/">Brunch</a> is yet another contender that strives to need even less configuration to set up.</p><h4>New kid on the block: FuseBox</h4><p><a href="http://fuse-box.org/">FuseBox</a> is an open-source bundler project started in October 2016. It attempts to solve all problems mentioned here out-of-the-box, and more, with less configuration than any existing bundler tools.</p><p>Version 2.0 was released in May 2017. The following in-depth tutorial will walk you through how to set up FuseBox to handle all the issues mentioned above. Spoiler alert: It’s pretty easy. Try it out!</p><p><a href="https://www.sitepoint.com/fusebox-faster-webpack-alternative/">Introduction to FuseBox - a Faster, Simpler Webpack Alternative - SitePoint</a></p><p>Made it to the end and learned something? Leave some love 💚</p><p><em>Peter LoBue is a freelance UX designer, web developer and iOS developer living between Philadelphia and San Francisco. Reach out for availability: </em><a href="https://twitter.com/pejalo"><em>@pejalo</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31ab0c91d2f5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/fusebox/beginner-web-developers-use-a-bundler-31ab0c91d2f5">Beginner Web Developers: Supercharge your Productivity with a Bundler</a> was originally published in <a href="https://medium.com/fusebox">fusebox</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>