<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>RunKit Blog</title>
    <description></description>
    <link>http://blog.runkit.com/</link>
    <atom:link href="http://blog.runkit.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Tue, 06 Feb 2018 07:59:12 -0700</pubDate>
    <lastBuildDate>Tue, 06 Feb 2018 07:59:12 -0700</lastBuildDate>

<item>
        <title>RunKit is Joining TC39 to Focus on Interactive Programming</title>
        <description>&lt;p&gt;The RunKit team is incredibly excited to be representing Stripe at &lt;a href=\"https://www.ecma-international.org/memento/TC39.htm\"&gt;TC39&lt;/a&gt;!<br>We hope to do our best to help JavaScript become an even better interactive<br>programming experience.&lt;/p&gt;
        
&lt;p&gt;At its core, RunKit is guided by the principle that the interactive programming<br>models pioneered by environments like &lt;a href=\"https://en.wikipedia.org/wiki/Smalltalk\"&gt;Smalltalk&lt;/a&gt;,<br>&lt;a href=\"https://www.wolfram.com/mathematica/\"&gt;Mathematica&lt;/a&gt;, and &lt;a href=\"http://jupyter.org\"&gt;Jupyter&lt;/a&gt; offer an important path to<br>making development truly accessible. Although this model has already proven<br>itself in the data-science and prototyping spaces, we think it has tremendous<br>potential for every-day programming as well. The REPL's that ship with most<br>modern languages today give us a glimpse of this already, but we think they are<br>just barely scratching the surface of what's possible.&lt;/p&gt;

&lt;p&gt;When we started RunKit we made the deliberate decision to bet on &lt;strong&gt;JavaScript&lt;/strong&gt;.<br>Instead of focusing on running &lt;em&gt;any container&lt;/em&gt;, or even &lt;em&gt;any language&lt;/em&gt;, we<br>wanted to really dive deep into &lt;em&gt;one coherent experience&lt;/em&gt; — whether<br>that be by turning the entire &lt;a href=\"https://npm.runkit.com\"&gt;npm registry&lt;/a&gt; into an immediately<br>accessible standard library or<br>&lt;a href=\"http://blog.runkit.com/2017/02/01/stop-filing-bugs-file-a-container.html\"&gt;making errors actually understandable&lt;/a&gt;. We chose<br>JavaScript because we think it is already a spiritual successor to these<br>interactive programming models — when I first started programming, the<br>browser was the ultimate interactive playground, and it was free!&lt;/p&gt;

&lt;p&gt;Today we're excited to take the next step beyond simply working on tooling to<br>make this vision a reality and actually participate in the future of what the<br>language could look like. We're excited to approach the language from a<br>&lt;strong&gt;REPL-and-Playground-first perspective&lt;/strong&gt;. The last decade has seen JavaScript<br>mature into a language far more capable of architecting ever larger<br>applications, but we think there's still a lot that can be done to make the day<br>to day experience more interactive and explorable. Can we learn from Elm to make<br>&lt;a href=\"http://elm-lang.org/blog/compiler-errors-for-humans\"&gt;errors clearer&lt;/a&gt;? Can we learn from Ruby and Pry to make the<br>&lt;a href=\"http://pryrepl.org/\"&gt;REPL more discoverable&lt;/a&gt;? Can we eliminate the gap between the REPL and<br>the file altogether?&lt;/p&gt;

&lt;p&gt;The future of JavaScript is bright and we are honored to be able to take a small<br>part in it!&lt;/p&gt;
</description>
        <pubDate>Tue, 06 Feb 2018 00:00:00 -0700</pubDate>
        <link>http://blog.runkit.com/2018/02/06/runkit-is-joining-tc39/</link>
        <guid isPermaLink="true">http://blog.runkit.com2018/02/06/runkit-is-joining-tc39/</guid>
        
        
      </item>
    
      <item>
        <title>Bringing Documentation to Life on Expressjs.com</title>
        <description>&lt;p&gt;We’re incredibly excited to have recently integrated RunKit directly into expressjs.com’s &lt;a href=&quot;https://expressjs.com/en/starter/hello-world.html&quot;&gt;Hello World tutorial&lt;/a&gt;. The sample code in the tutorial itself is completely unchanged, but it has one major enhancement: the code is now &lt;strong&gt;live&lt;/strong&gt;! When we say live, we mean that every time you load the page we’re actually spinning up a real Linux server that is running that sample code, and instantly updating in response to your edits:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://expressjs.com/en/starter/hello-world.html&quot;&gt;
&lt;img src=&quot;/assets/article_images/2017-07-17-bringing-documentation-to-life-on-expressjs.com/express.gif&quot; width=&quot;100%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As requests are made, we’re also showing you the server logs right underneath, making the connection between the code and what it does more immediate and direct. You can make the code as complex as you want: thanks to the fact that RunKit preinstalls every package from npm, you can really do just about anything here. In other words, people new to express will feel absolutely no friction in trying it out: no need for installing the right packages, no need for setting up the right JavaScript environment, no need to even install node.&lt;/p&gt;

&lt;p&gt;This is part of a larger goal here at RunKit to bring &lt;em&gt;all documentation&lt;/em&gt; to life. When we visit documentation online, we have to remember that we’re not reading a piece of paper but a computer, and we should be using its strengths. Our dream is to completely illiminate the gap between learning about something and actually trying it. &lt;a href=&quot;&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#115;&amp;#117;&amp;#112;&amp;#112;&amp;#111;&amp;#114;&amp;#116;&amp;#064;&amp;#114;&amp;#117;&amp;#110;&amp;#107;&amp;#105;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&quot;&gt;Let us know&lt;/a&gt; if you want help integrating RunKit into your own site, and &lt;a href=&quot;https://runkit.com/docs/embed&quot;&gt;check out the embed docs to get started&lt;/a&gt;!&lt;/p&gt;

</description>
        <pubDate>Tue, 18 Jul 2017 00:00:00 -0700</pubDate>
        <link>http://blog.runkit.com/2017/07/18/bringing-documentation-to-life-on-expressjs.com.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2017/07/18/bringing-documentation-to-life-on-expressjs.com.html</guid>
        
        
      </item>
    
      <item>
        <title>Bring your npm packages to life with RunKit</title>
        <description>&lt;p&gt;We built RunKit notebooks so developers can quickly and safely prototype code, and use all the building blocks from the npm community. Ever since we partnered with npm to try any package live with RunKit, the Node.js ecosystem has continued its rapid growth to almost half a million published packages. Today, we’re introducing new landing pages for all npm packages to make them even easier to discover and explore. For package owners and maintainers, it’s the best way to show off the features of your packages with a fully interactive Node environment, right in the browser.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.tonicdev.net/assets/images/npm-page.png&quot; alt=&quot;RunKit Package Pages&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here’s a quick overview of the new features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Code explorer&lt;/strong&gt;: RunKit npm pages include a code browser, which shows you the installed package code, rather than what the code looks like on GitHub, so you can follow the code execution as you browse the very code that runs.
&lt;img src=&quot;../assets/article_images/2017-03-02-Bring-your-npm-packages-to-life-with-RunKit/code.gif&quot; alt=&quot;Code Explorer&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Linkified JavaScript&lt;/strong&gt;: When you’re in the code browser, all the file’s &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt;s are links. RunKit uses Node’s own path resolution, so you won’t jump to the latest globally available version of a required package, but the very one that satisfies the &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;’s constraints as though you just installed it yourself.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Markdown rendering&lt;/strong&gt;: Read the documentation as you’re prototyping—it’s included side-by-side with a RunKit notebook. &lt;img src=&quot;../assets/article_images/2017-03-02-Bring-your-npm-packages-to-life-with-RunKit/readme.png&quot; alt=&quot;README&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Customization for package maintainers&lt;/strong&gt;: By default a package’s RunKit npm page &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt;s the package, so when you run it you’ll see the package’s exports. But, we’ve made it easy for package maintainers to do deeper integrations. If you add a sample source string in your package.json with the key &lt;code class=&quot;highlighter-rouge&quot;&gt;runkitExample&lt;/code&gt;, or for more complex examples you can provide your own file under the key &lt;code class=&quot;highlighter-rouge&quot;&gt;runkitExampleFilename&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;../assets/article_images/2017-03-02-Bring-your-npm-packages-to-life-with-RunKit/resources.png&quot; alt=&quot;Resources for Package Maintainers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Many package authors including &lt;a href=&quot;https://github.com/d3/d3-shape&quot;&gt;D3.js&lt;/a&gt; and &lt;a href=&quot;https://lodash.com/docs&quot;&gt;Lodash&lt;/a&gt; already use RunKit to show off features of their packages. We’ve created a page for package maintainers to better leverage all of RunKit’s offerings including adding a button to your package’s README to make it easier for your users to try your package in a browser:&lt;/p&gt;

&lt;iframe src=&quot;https://runkit.com/resources-embed?packageName=canvas&quot; style=&quot;width: 100%; border: none; height: 150pt;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Tue, 07 Mar 2017 00:00:00 -0800</pubDate>
        <link>http://blog.runkit.com/2017/03/07/Bring-your-npm-packages-to-life-with-RunKit.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2017/03/07/Bring-your-npm-packages-to-life-with-RunKit.html</guid>
        
        
      </item>
    
      <item>
        <title>Stop Filing Bugs, File a Container!</title>
        <description>&lt;p&gt;RunKit notebooks are a great way to file bugs on GitHub. Since RunKit automatically packages your code with its entire environment in a Docker container, anyone can clone your bug and start investigating it live in seconds, without any
setup or installation. Best of all, the bug will be completely reproducible and avoid the dreaded “works on my machine”.
Today we’re excited to be improving this experience even further with a completely revamped UI for filing and analyzing issues on Node.js:&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot;&gt;
    &lt;img style=&quot;max-width:100%; width:auto; height:auto; margin-bottom:35px;&quot; src=&quot;/assets/article_images/2017-02-01-stop-filing-bugs-file-a-container/hero.png&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Our initial focus was to make stack traces in Node.js significantly easier to interpret and understand. RunKit interacts
directly with the V8 data to provide a much more detailed view than any other implementation we’ve seen. One example is how
RunKit dramatically streamlines the experience of navigating the stack trace by inlining the offending code right in the frame, as well as providing documentation for many of Node’s built-in functions:&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot;&gt;
    &lt;img style=&quot;max-width:100%; width:auto; height:auto; margin-bottom:35px;&quot; src=&quot;/assets/article_images/2017-02-01-stop-filing-bugs-file-a-container/docs_code_viewer.gif&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;But we also focused on a lot of little details, like swapping in canonical names for functions whenever we can in order to avoid the more confusing inferred V8 names that sometimes show up. Another thing you’ll notice is that we now show you
the version of the package you’re using immediately as you require it. This makes it so that all the dependency
information in your notebook is immediately digestable with a glance. It’s a lot of fun when coding, but even more useful when looking at someone’s else’s code.&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot;&gt;
    &lt;img style=&quot;max-width:100%; width:auto; height:auto; margin-bottom:35px;&quot; src=&quot;/assets/article_images/2017-02-01-stop-filing-bugs-file-a-container/require_versions.gif&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Together, all these features result in a bug report that surfaces all the pertinent background for a bug with no extra work
for the user. Instead of relying on templates to remind people to include all this, RunKit just knows it by default. That’s
because with RunKit you’re not just filing a bug, you’re filing an &lt;em&gt;entire container&lt;/em&gt;, enabling the coolest feature of all:
the ability to &lt;strong&gt;run it&lt;/strong&gt;.&lt;/p&gt;

&lt;h1 id=&quot;how-to-get-started&quot;&gt;How To Get Started&lt;/h1&gt;

&lt;p&gt;The easiest way to get started using RunKit to file bugs is to &lt;a href=&quot;https://runkit.com/register&quot;&gt;Sign Up&lt;/a&gt; and then head on over to a package’s corresponding RunKit page (such as &lt;a href=&quot;https://runkit.com/npm/lodash&quot;&gt;https://runkit.com/npm/lodash&lt;/a&gt;). You can then paste the generated link on the package’s bug tracker. If you’re a package maintainer and want a more customized experience, you can use our API to
&lt;a href=&quot;https://runkit.com/embed&quot;&gt;embed RunKit right on your page&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot;&gt;
    &lt;a style=&quot;-webkit-background-clip: border-box;-webkit-background-origin: padding-box;-webkit-background-size: auto;-webkit-font-smoothing: antialiased;-webkit-transition-delay: 0s;-webkit-transition-duration: 0.1s;-webkit-transition-property: all;-webkit-transition-timing-function: ease;background-attachment: scroll;background-clip: border-box;background-color: rgb(40, 175, 250);background-image: none;background-origin: padding-box;background-size: auto;border-bottom-color: rgb(40, 175, 250);border-bottom-left-radius: 4px;border-bottom-right-radius: 4px;border-bottom-style: solid;border-bottom-width: 1px;border-image-outset: 0px;border-image-repeat: stretch;border-image-slice: 100%;border-image-source: none;border-image-width: 1;border-left-color: rgb(40, 175, 250);border-left-style: solid;border-left-width: 1px;border-right-color: rgb(40, 175, 250);border-right-style: solid;border-right-width: 1px;border-top-color: rgb(40, 175, 250);border-top-left-radius: 4px;border-top-right-radius: 4px;border-top-style: solid;border-top-width: 1px;box-sizing: border-box;color: rgb(255, 255, 255);cursor: pointer;display: inline-block;font-family: Roboto, &#39;Helvetica Neue&#39;, Helvetica, Arial, sans-serif;font-size: 14px;font-style: normal;font-variant: normal;font-variant-alternates: normal;font-variant-caps: normal;font-variant-east-asian: normal;font-variant-ligatures: normal;font-variant-numeric: normal;font-variant-position: normal;font-weight: 600;height: 34px;line-height: 14px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;margin-top: 0px;min-width: 140px;outline-color: rgb(255, 255, 255);outline-style: none;outline-width: 0px;padding-bottom: 10px;padding-left: 16px;padding-right: 16px;padding-top: 10px;position: relative;text-align: center;text-decoration: none;text-rendering: optimizelegibility;transition-delay: 0s;transition-duration: 0.1s;transition-property: all;transition-timing-function: ease;vertical-align: baseline;width: 151.28125px;&quot; class=&quot;the-button&quot; href=&quot;https://runkit.com/tolmasky/my-bug/1.0.0/clone&quot;&gt;Try It Out&lt;/a&gt;
&lt;/div&gt;

&lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot; /&gt;

&lt;meta name=&quot;twitter:site&quot; content=&quot;@runkitdev&quot; /&gt;

&lt;meta name=&quot;twitter:title&quot; content=&quot;Stop Filing Bugs, File a Container!&quot; /&gt;

&lt;meta name=&quot;twitter:description&quot; content=&quot;RunKit allows you to file fully reproducible bugs.&quot; /&gt;

&lt;meta name=&quot;twitter:image&quot; content=&quot;http://blog.runkit.com/assets/article_images/2017-02-01-stop-filing-bugs-file-a-container/twitter-card-stacks.png&quot; /&gt;

</description>
        <pubDate>Wed, 01 Feb 2017 00:00:00 -0800</pubDate>
        <link>http://blog.runkit.com/2017/02/01/stop-filing-bugs-file-a-container.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2017/02/01/stop-filing-bugs-file-a-container.html</guid>
        
        
      </item>
    
      <item>
        <title>Introducing DemoKit: Scriptable Product Demos</title>
        <description>&lt;p&gt;Today we’re open sourcing and releasing &lt;a href=&quot;https://github.com/runkitdev/demokit&quot;&gt;DemoKit&lt;/a&gt;, our new Electron 
app for scripting product demos. Using the web technologies you’re
already familiar with, you can now record demos, tutorials, or any
other videos that show off your products. Since the demos 
are scripted, you can check them into GitHub, incorporate feedback
and changes, and even simply re-record them when your products visually
change so they’re never out of date. In order to help get you started,
we’re also open sourcing &lt;a href=&quot;https://github.com/runkitdev/runkit-demo&quot;&gt;RunKit’s demo&lt;/a&gt; that appears on our &lt;a href=&quot;https://runkit.com/home&quot;&gt;homepage&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;text-align:center;margin-bottom:35px&quot;&gt;
    &lt;video class=&quot;data-visualizing&quot; src=&quot;/assets/article_images/2016-10-18-introducing-demokit/demo.mp4&quot; webkit-playsinline=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot; style=&quot;width:100%; max-width:512px;&quot;&gt;&lt;/video&gt;
&lt;/div&gt;

&lt;h1 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h1&gt;
&lt;p&gt;DemoKit uses JSX &lt;a href=&quot;http://tolmasky.com/2016/03/24/generalizing-jsx/&quot;&gt;(but not React)&lt;/a&gt;
along with HTML, JavaScript, and CSS to let you define a “movie script” for your demos. For 
example, the following snippet types and execute a query in Duck Duck Go:&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot;&gt;
    &lt;img style=&quot;max-width:100%; width:auto; height:auto; margin-bottom:35px;&quot; src=&quot;/assets/article_images/2016-10-18-introducing-demokit/code-sample.png&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;DemoKit includes a bunch of prebuilt “props” for your movie too:
browser windows (that host your live webpage to interact with),
terminal windows, and code editors. One of the cool experimental
features we’ve added recently is the ability to &lt;em&gt;embed buttons&lt;/em&gt;
in your videos as well. Basically, DemoKit will track where all
the buttons are in your video and generate a script to make 
those areas clickable on your web page as well.&lt;/p&gt;

&lt;h1 id=&quot;why-demokit&quot;&gt;Why DemoKit?&lt;/h1&gt;
&lt;p&gt;One of the things we wanted to do for the RunKit rename was create 
a demo video of our product for our new homepage. But the idea of
doing this filled me with a fair amount of dread since creating demos
is such a laborious process for me. I’m always making mistakes when
I type, and its rarely a collaborative or iterative process since it
never feels worth it to go re-record large portions of a video.&lt;/p&gt;

&lt;p&gt;We originally wondered whether we could abuse Selenium and QuickTime
screen capture to be able to &lt;em&gt;program&lt;/em&gt; a demo the way we programmed
our tests, and this actually got us quite far. Unfortunately, Selenium
really isn’t designed for this task and has some issues running
simultaneous animations and commands. At this point we decided to go
all-in and build a dedicated tool using many of these ideas.&lt;/p&gt;

&lt;p&gt;The result is something we’re really proud of: any member of our team
can now tweak the demo and keep it up to date and fresh. More importantly,
we can now invest in video tutorials which is something I’ve wanted to 
do for quite some time. We’d love to hear your thoughts on it too, you can
install it with npm by typing &lt;code class=&quot;highlighter-rouge&quot;&gt;npm install demokit -g&lt;/code&gt;, or &lt;a href=&quot;https://github.com/runkitdev/demokit&quot;&gt;check out the 
source&lt;/a&gt; as well.&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Oct 2016 00:00:00 -0700</pubDate>
        <link>http://blog.runkit.com/2016/10/18/introducing-demokit.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/10/18/introducing-demokit.html</guid>
        
        
      </item>
    
      <item>
        <title>Tonic is now RunKit, a part of Stripe</title>
        <description>&lt;p&gt;For the past year we’ve been taking a radical approach to development
tools here at Tonic. Instead of treating IDEs, frameworks, and even
languages as the fundamental building blocks for development, we
decided to explore what it would mean to attack these problems
at the system level. Could we make progress on some long standing
development headaches by essentially beginning to build a &lt;em&gt;developer OS&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;We started by buidling &lt;code class=&quot;highlighter-rouge&quot;&gt;module-fs&lt;/code&gt;, a virtual filesystem capable of
representing the entire state of npm at any particular microsecond. With
module-fs we could make every version of the over 300,000 packages
on npm available instantly. With truly immediate and frictionless
access to any package, you could begin to think of npm as the
&lt;em&gt;global standard library&lt;/em&gt;, as essential to development tomorrow
as built-in libraries are today.&lt;/p&gt;

&lt;p&gt;Similarly, we attacked the problem of &lt;code class=&quot;highlighter-rouge&quot;&gt;time traveling&lt;/code&gt; debugging not
at the application level, but directly on the OS by using
the bleeding edge virtualization tools of CRIU on top of Docker.
We knew that for a feature like this to truly be usable outside of simple
demos, it would have to match real-world use by allowing developers to rewind
any mistake, including forking a process or modifying the filesystem.&lt;/p&gt;

&lt;p&gt;We’ve exposed these core features in a number of experimental products.
Notebooks are our take on how a REPL can work in such an environment:
quickly and safely prototype and share code with truly zero configuration.
Endpoints re-imagined deployment by doing away with it completely: the
code is simply always live, no longer requiring time-consuming
installation thanks to module-fs. And finally, embed proposed that all
online documentation and examples could be live by allowing
any webpage to leverage these technologies:&lt;/p&gt;

&lt;video style=&quot;width:100%; margin:20px 0; border:1px solid rgb(229,233,239); border-radius:5px;&quot; controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://s3-us-west-2.amazonaws.com/runkit-blog-assets/videos/announcement-v4.mp4&quot; type=&quot;video/mp4&quot; /&gt;
  Your browser does not support HTML5 video.
&lt;/video&gt;

&lt;p&gt;A few months ago, we started talking to Patrick Collison, Stripe’s CEO,
about our vision of building the future of development tools. I
was already aware that Stripe had a history of investing in
development, but Patrick made clear that lowering the bar
to development is fundamentally aligned with Stripe’s interest
in increasing the leverage of developers around the world.&lt;/p&gt;

&lt;p&gt;From these discussions, it became increasingly obvious that
it made sense for us to work together. Stripe decided to
take a bet on our vision and our team, and I’m excited to
announce that we are now officially part of the Stripe family.
We will continue to operate independently, working from our
office in the Haight in San Francisco, and we will also be changing our name
to something that better encapsulates our vision: &lt;strong&gt;RunKit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;RunKit represents what we are truly building: a unique new platform to
enable tomorrow’s development tools. In the coming weeks we’ll be
releasing a number exciting updates that leverage our technologies,
as well as better explanations of what’s going on under the hood.
We are really looking forward to the things we can build by working
with Stripe, and can’t wait to show you what we’re up to. Try it out yourself:&lt;/p&gt;

&lt;script src=&quot;https://embed.runkit.com&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;embed&quot;&gt;
const React = require(&quot;react&quot;);
const { renderToString } = require(&quot;react-dom/server&quot;);
const OneMoreThing = require(&quot;one-more-thing&quot;);

renderToString(&amp;lt;OneMoreThing/&amp;gt;);
&lt;/div&gt;
&lt;script&gt;
var samples = document.querySelectorAll(&quot;#embed&quot;);
var index = 0;
var count = samples.length;

function load(aSample)
{
    var source = Tonic.sourceFromElement(aSample);

    aSample.innerHTML = &quot;&quot;;

    Tonic.createNotebook(
    {
        // the parent element for the new notebook
        element: aSample,

        // specify the source of the notebook
        source: source,
        nodeVersion: &quot;4.x.x&quot;,
        onLoad:function (aNotebook)
        {
            aNotebook.evaluate();
        }
    });
}

function loadAll(samples, index)
{
    while (index &lt; count &amp;&amp; samples[index].tagName !== &quot;DIV&quot;)
        ++index;

    if (!(index &lt; count))
        return;

    load(samples[index]);

    setTimeout(loadAll, 1000, samples, index + 1);
}

loadAll(samples, 0);
&lt;/script&gt;

&lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot; /&gt;

&lt;meta name=&quot;twitter:site&quot; content=&quot;@runkitdev&quot; /&gt;

&lt;meta name=&quot;twitter:title&quot; content=&quot;Tonic is now RunKit - A Part of Stripe!&quot; /&gt;

&lt;meta name=&quot;twitter:description&quot; content=&quot;RunKit is joining Stripe to reimagine developer tooling.&quot; /&gt;

&lt;meta name=&quot;twitter:image&quot; content=&quot;http://blog.runkit.com/assets/article_images/2016-09-13-tonic-is-now-runkit-a-part-of-stripe/twitter-card.png&quot; /&gt;

</description>
        <pubDate>Tue, 13 Sep 2016 00:00:00 -0700</pubDate>
        <link>http://blog.runkit.com/2016/09/13/tonic-is-now-runkit-a-part-of-stripe.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/09/13/tonic-is-now-runkit-a-part-of-stripe.html</guid>
        
        
      </item>
    
      <item>
        <title>Two-Millionth Version</title>
        <description>&lt;p&gt;While querying our database to get exact numbers for &lt;a href=&quot;http://blog.tonicdev.com/2016/08/17/scoped-package-support.html&quot;&gt;Tonic’s announcement of scoped package support&lt;/a&gt;, we realized npm recently passed an important milestone. So here’s our belated card to celebrate the occasion.&lt;/p&gt;

&lt;p&gt;Packages have multiple versions. npm currently has ~330,000 packages. Packages have, on average, 6.74 versions. Do the math, and that’s over two million versions of packages.&lt;/p&gt;

&lt;p&gt;Yes, npm recently passed two million versions. Congratulations to the Node.js community, npm Inc, and everyone who’s contributed to the most massive code library in human history. Together we’re building something amazing.&lt;/p&gt;

&lt;p&gt;We thought it would be fun to go back and figure out which specific packages and versions won the round-number lottery. So we listed every package and version in chronological order and picked out a few winners:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Milestone&lt;/th&gt;
      &lt;th&gt;Package&lt;/th&gt;
      &lt;th&gt;Date&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1st package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/sprintf&quot;&gt;sprintf&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Nov 11 2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/uuid-pure&quot;&gt;uuid-pure&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Dec 19 2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;100th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/useragent&quot;&gt;useragent&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Dec 29 2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1,000th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/worker-pool&quot;&gt;worker-pool&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Mar 30 2011&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10,000th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/PSNjs&quot;&gt;PSNjs&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jun 13 2012&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;100,000th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/js-atom&quot;&gt;js-atom&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Oct 20 2014&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;200,000th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/dodo-core-features&quot;&gt;dodo-core-features&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Nov 3 2015&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;300,000th package&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/servercreation&quot;&gt;servercreation&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jun 21 2016&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/recon&quot;&gt;recon@0.0.1&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Dec 18 2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;100th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/jade&quot;&gt;jade@0.2.3&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Dec 19 2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1,000th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/searchparser&quot;&gt;searchparser@0.1.0&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jan 10 2011&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10,000th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/restify&quot;&gt;restify@0.3.12&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jul 7 2011&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;100,000th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/ep_post_message&quot;&gt;ep_post_message@0.0.1&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jan 22 2013&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1,000,000th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/ngtestharness&quot;&gt;ngtestharness@1.0.2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jul 27 2015&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2,000,000th version&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/ddvgity&quot;&gt;ddv@1.0.16&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Jul 19 2016&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;div&gt;&amp;nbsp;&lt;/div&gt;

&lt;h2 id=&quot;explore&quot;&gt;Explore&lt;/h2&gt;

&lt;p&gt;We loaded up versions-published-per-day since npm beginning, and it’s a fun chart to explore:&lt;/p&gt;

&lt;iframe width=&quot;600&quot; height=&quot;371&quot; seamless=&quot;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;https://docs.google.com/spreadsheets/d/1s8zs0Ho1XvBGXspVh2mEOfiE06g-4J2BFip8rOdLVho/pubchart?oid=390769411&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Of course the growth is amazing. It’s also fun and interesting how you can pick out lulls in new versions on the weekends, especially in the 2016 era (hint: switch to the 1 month (“1m”) zoom level and scroll around). You can also make out end-of-the-year Holidaze lull.&lt;/p&gt;

&lt;p&gt;Node is definitely people’s Day Job nowadays.&lt;/p&gt;

&lt;h2 id=&quot;predictions&quot;&gt;Predictions&lt;/h2&gt;

&lt;p&gt;So, where is npm heading? We analyzed npm’s growth rate, tried to smooth it out and extrapolate when the next big milestones will be hit.&lt;/p&gt;

&lt;p&gt;Here’s what we came up with:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Milestone&lt;/th&gt;
      &lt;th&gt;Extrapolated Date&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;3,000,000 Versions&lt;/td&gt;
      &lt;td&gt;Feb 2017&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;500,000 Packages&lt;/td&gt;
      &lt;td&gt;Jun 2017&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1,000,000 Packages&lt;/td&gt;
      &lt;td&gt;Jul 2018&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;div&gt;&amp;nbsp;&lt;/div&gt;

&lt;p&gt;With these dates in mind, hopefully we won’t be caught surprised coming upon the upcoming npm milestones. No more belated cards, instead we can start planning 2018’s epic &lt;em&gt;1 Million npm Packages Gala&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Be there.&lt;/p&gt;

</description>
        <pubDate>Tue, 23 Aug 2016 00:00:00 -0700</pubDate>
        <link>http://blog.runkit.com/2016/08/23/two-millionth-version.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/08/23/two-millionth-version.html</guid>
        
        
      </item>
    
      <item>
        <title>Scoped Package Support</title>
        <description>&lt;p&gt;We’ve just deployed support for scoped packages on Tonic! Practically, this means we’ve added
around &lt;em&gt;75,000 versions&lt;/em&gt; of &lt;em&gt;11,800 packages&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you’re not familiar with &lt;a href=&quot;https://docs.npmjs.com/misc/scope&quot;&gt;scoped packages&lt;/a&gt;, they’re just
like normal packages except their name includes a namespace: &lt;code class=&quot;highlighter-rouge&quot;&gt;require(&quot;@namespace/package-name&quot;)&lt;/code&gt;.
This allows you to avoid collisions with existing packages. Although you may have never directly
used one yourself, many are included as dependencies in other packages. Try it out right here:&lt;/p&gt;

&lt;script src=&quot;https://embed.tonicdev.com&quot; data-element-id=&quot;tonic-example&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;tonic-example&quot;&gt;require(&quot;@slack/client&quot;)&lt;/div&gt;

&lt;p&gt;We are always looking to improve our package support on Tonic and aim to work out of the box
with everything on npm, so if you run into any issues, &lt;a href=&quot;&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#115;&amp;#117;&amp;#112;&amp;#112;&amp;#111;&amp;#114;&amp;#116;&amp;#064;&amp;#116;&amp;#111;&amp;#110;&amp;#105;&amp;#099;&amp;#100;&amp;#101;&amp;#118;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&quot;&gt;let us know&lt;/a&gt;!&lt;/p&gt;
</description>
        <pubDate>Wed, 17 Aug 2016 00:00:00 -0700</pubDate>
        <link>http://blog.runkit.com/2016/08/17/scoped-package-support.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/08/17/scoped-package-support.html</guid>
        
        
      </item>
    
      <item>
        <title>Building &quot;Interesting&quot; Previews on Demand with Tonic Endpoint</title>
        <description>&lt;p&gt;When people share content on Facebook, they expect that the content will show up a certain way
in the news feed: with their own title, description, and most importantly a relevant picture.
Of course, Tonic is largely about text, whether in the form of source code or the properties in
an object viewer, so we had to find a way to generate pictures that made sense. Building a
prototype to do that with Tonic turned out to be so simple that we wanted to share the process.&lt;/p&gt;

&lt;h2 id=&quot;what-are-we-doing&quot;&gt;What are we doing?&lt;/h2&gt;

&lt;p&gt;The first thing to figure out was what should be in the picture? We could generate an image that
contained the source code easily enough, but in many instances the results are more interesting
than the code itself. And sometimes the opposite is true: an interesting chunk of code might just
output something &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;, which is hardly worth turning into a picture.&lt;/p&gt;

&lt;p&gt;We settled pretty quickly on the idea of turning the entire document into an image, and then
taking it from there. There are a number of tools out there for turning HTML into an image, and
after checking out a few, we decided to try moving forward with &lt;a href=&quot;http://wkhtmltopdf.org/&quot;&gt;wkthmltoimage&lt;/a&gt;.
It has the nice feature of being a self-contained binary, making it simple to run and deploy. And it can
take HTML as a string, or a URL to a webpage that it will render directly.&lt;/p&gt;

&lt;h2 id=&quot;getting-the-image&quot;&gt;Getting the image&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;wkhtmltoimage&lt;/em&gt; is cross platform, making it pretty easy to download to an OS X machine and
see what an image of one of our notebooks would look like. Things worked &lt;em&gt;ok&lt;/em&gt; out of the gate,
but there was room for improvement. In order to actually make improvements, though, and to
eventually deploy this as a production tool, we needed a way to generate these images
programatically. We needed an API. What a great excuse to play around with
&lt;a href=&quot;blog.tonicdev.com/2016/01/26/endpoint.html&quot;&gt;Endpoint&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Creating an API with Endpoint is incredibly simple: &lt;a href=&quot;https://tonicdev.com/docs/endpoint&quot;&gt;implement one function&lt;/a&gt;
in your notebook. The only thing our API had to do was take in a URL and then return an image of that URL.
Part one was a straightforward “hello world” type Node.js problem, but part two required creating an interface
to the tool running in another process. Fortunately, someone has already done that work
&lt;a href=&quot;https://tonicdev.com/npm/wkhtmltoimage&quot;&gt;on npm&lt;/a&gt;. Unfortunately, the library expected
&lt;em&gt;wkhtmltoimage&lt;/em&gt; to already be installed on the machine.&lt;/p&gt;

&lt;p&gt;Endpoint requests, and Tonic notebooks generally, are running in generic linux sandboxes somewhere
“in the cloud,” so it isn’t super simple to just install a new binary. You can always script the
install process as a series of &lt;code class=&quot;highlighter-rouge&quot;&gt;exec&lt;/code&gt; calls, but that’s slow and cumbersome. But if you recall
that &lt;em&gt;wkhtmltoimage&lt;/em&gt; is a self contained binary, you might reach a much easier conclusion: ship
a version of the library that vendors in the binary directly.
So that’s &lt;a href=&quot;https://tonicdev.com/npm/wkhtmltoimage-linux&quot;&gt;what we did&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Forking the library on Github, downloading the dependency, and publishing a new package to npm
took a few minutes. And less than a minute after that, the new package was available for use in Tonic.
After that, writing the code to respond to incoming requests with an image was just a few lines.&lt;/p&gt;

&lt;script src=&quot;https://embed.tonicdev.com/&quot; data-element-id=&quot;embed1&quot; data-mode=&quot;endpoint&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;embed1&quot;&gt;
var ToImage = require(&quot;wkhtmltoimage-linux&quot;);
var URL = require(&quot;url&quot;);

exports.tonicEndpoint = function(request, response)
{
    var query = URL.parse(request.url, true).query;
    response.writeHead(200, {&#39;Content-Type&#39;: &#39;image/png&#39;});
    ToImage.generate(query.url, { format: &quot;png&quot; }).pipe(response);
}
&lt;/div&gt;

&lt;p&gt;And since we specified a custom example for our package, you can play around with your own copy
of this server by just visiting the &lt;a href=&quot;https://tonicdev.com/npm/wkhtmltoimage-linux&quot;&gt;package page&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;interestingness&quot;&gt;“Interestingness”&lt;/h2&gt;

&lt;p&gt;Facebook wants a specific aspect ratio for the images it displays, but notebooks will be many
different sizes, so the next task was to figure out how to choose the right section of the page
to show in a preview. Again we ended up turning to an existing solution, with an existing
package already up on npm: [SmartCrop.js].&lt;/p&gt;

&lt;p&gt;Just as before, we wanted our image to be generated with an API, and so again we created a new
Endpoint. With the same basic skeleton, this API was only a bit more complicated. First, we
actually get the screenshot as an image from our existing endpoint. Then we load it into [node-canvas],
and pass the image to SmartCrop. Finally, we stream the resulting image to the response.&lt;/p&gt;

&lt;script src=&quot;https://embed.tonicdev.com/&quot; data-element-id=&quot;embed2&quot; data-mode=&quot;endpoint&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;embed2&quot;&gt;
var Canvas = require(&#39;canvas&#39;);
var SmartCrop = require(&#39;smartcrop&#39;);
var URL = require(&quot;url&quot;);
var got = require(&quot;got&quot;);
var BaseURL = &quot;https://tonicdev.io/boucher/screenshot-page/1.0.0&quot;
var defaultWidth=640;
var defaultHeight=480;

exports.tonicEndpoint = async function(request, response)
{
    var query = URL.parse(request.url, true).query;
    var width = parseInt(query.w, 10) || defaultWidth;
    var height = parseInt(query.h, 10) || defaultHeight;
    var opts = {width, height, canvasFactory: (w, h) =&amp;gt; new Canvas(w, h)};

    var img = new Canvas.Image();
    var imageURL = `${BaseURL}?url=${encodeURIComponent(query.url)}`

    var imageData = await got(imageURL, { encoding: null });
    img.src = imageData.body

    SmartCrop.crop(img, opts, function(result) {
        var canvas = new Canvas(opts.width, opts.height);
        var ctx = canvas.getContext(&#39;2d&#39;);
        var crop = result.topCrop;

        ctx.patternQuality = &#39;best&#39;;
        ctx.filter = &#39;best&#39;;
        ctx.drawImage(img, crop.x, crop.y, crop.width, crop.height,
                           0, 0, canvas.width, canvas.height);

        response.writeHead(200, {&#39;Content-Type&#39;: &#39;image/png&#39;});
        canvas.pngStream().pipe(response);
    });
}
&lt;/div&gt;

&lt;p&gt;There are a lot of parameters you can tune for your own use (adding those to your API is left as
an exercise for the reader).&lt;/p&gt;

&lt;h2 id=&quot;deploying-to-production&quot;&gt;Deploying to production&lt;/h2&gt;

&lt;p&gt;In just a few hours, we had a working API for generating “interesting” previews for our Notebooks.
There were a few more steps though. First, we spent some time optimizing the visual display of
our notebook previews. For example, there was no need to show navigational elements. We created
a simpler, cleaner page, and eliminated the need to load any javascript at all to make things faster.&lt;/p&gt;

&lt;p&gt;Next was generating &lt;a href=&quot;http://ogp.me/&quot;&gt;open graph meta tags&lt;/a&gt; in order to have Facebook see our previews. There’s
plenty of documentation on how to generate these in Facebook’s
&lt;a href=&quot;https://developers.facebook.com/docs/sharing/best-practices#tags&quot;&gt;developer center&lt;/a&gt;. One thing you may
want to pay attention to if you’re doing this yourself is that Facebook won’t refetch an image it has
already fetched, so if your image may change over time (as ours does), you’ll need some kind of query
paramter to force the image to update.&lt;/p&gt;

&lt;p&gt;Facebook also expects images to load in just a couple of seconds. Unfortunately, this doesn’t always
work for us when generating a preview of a larger notebook. We ended up building a caching layer
for our previews, generating them upfront and storing them for a period of time in s3.&lt;/p&gt;

&lt;p&gt;The last step we did was move our code off Endpoint and into our own deployment environment. There are
a few reasons this made sense for us, and probably will for you too if you’re moving beyond a prototype.
The most obvious is that Endpoints have limits. They only allow a fixed number of requests per day, and
have a memory use cap as well. Deploying to our own infrastructure lets us put our own restrictions
in place, like keeping our traffic with our own private network. And making the transition was as simple
as downloading the code from our Notebook and adding it to our git repo (with a few modifications).&lt;/p&gt;

&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;This is just a small sampling of the ways we’re using Tonic ourselves to continue building Tonic.
It’s become an invaluable tool for us when experimenting with new features and ideas, or when just
trying to simplify a problem down to its smallest reproducible example.&lt;/p&gt;

&lt;p&gt;As always, we love to hear what our users are doing with Tonic, and what they’d like to see us work
on next, so please &lt;a href=&quot;&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#115;&amp;#117;&amp;#112;&amp;#112;&amp;#111;&amp;#114;&amp;#116;&amp;#064;&amp;#116;&amp;#111;&amp;#110;&amp;#105;&amp;#099;&amp;#100;&amp;#101;&amp;#118;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&quot;&gt;get in touch&lt;/a&gt;!&lt;/p&gt;

</description>
        <pubDate>Wed, 09 Mar 2016 00:00:00 -0800</pubDate>
        <link>http://blog.runkit.com/2016/03/09/snapshots.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/03/09/snapshots.html</guid>
        
        
      </item>
    
      <item>
        <title>Class Support</title>
        <description>&lt;p&gt;We’ve just added class support to Tonic! JavaScript classes are shorthand that make it easier
to work with JavaScript’s existing protoypal inheritance. As usual, Tonic is smart about the
way it supports this feature, using Babel in earlier versions (like 0.12), but giving you full access to native classes in Node 4 and 5,
even when not in strict mode. Give it a try:&lt;/p&gt;

&lt;script src=&quot;https://embed.tonicdev.com/&quot; data-element-id=&quot;embed1&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;embed1&quot;&gt;
class AbstractMockSingletonFactoryFactory
{
    injectDependency()
    {
        console.log(&quot;Subclasser Responsibility&quot;);
    }
}
&lt;/div&gt;

&lt;p&gt;This brings Tonic’s ES6 support to near completion, making it one of the best places to try the latest
JavaScript features in every version of Node!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-classes&quot;&gt;Classes&lt;/a&gt; (native support 4+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-symbols&quot;&gt;Symbols&lt;/a&gt; (native support 0.12+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-iterators-and-generators&quot;&gt;Generators&lt;/a&gt; (native support 0.12+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-template-strings&quot;&gt;Template Strings&lt;/a&gt; (native support 4+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-default-rest-and-spread&quot;&gt;Spread and Rest parameters&lt;/a&gt; (native support 5+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-arrow-functions&quot;&gt;Arrow Functions&lt;/a&gt; (native support 4+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-destructuring&quot;&gt;Destructuring&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-enhanced-object-literals&quot;&gt;Enhanced object literals&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-default-rest-and-spread&quot;&gt;Default parameters in functions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-maps-weakmaps-sets-and-weaksets&quot;&gt;Map + Set + WeakMap + WeakSet&lt;/a&gt; (0.12+)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es7-async-functions&quot;&gt;Promises&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es6-binary-and-octal-literals&quot;&gt;Binary and octal literals&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/es7-async-functions&quot;&gt;Async functions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tonicdev.com/tonic/jsx-in-tonic&quot;&gt;JSX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don’t forget, we’re holding &lt;a href=&quot;http://www.meetup.com/JS-Office-Hours/events/229055526/&quot;&gt;office hours&lt;/a&gt; on Thursday if you want to stop by and discuss this or
any other JavaScript features.&lt;/p&gt;
</description>
        <pubDate>Wed, 24 Feb 2016 00:00:00 -0800</pubDate>
        <link>http://blog.runkit.com/2016/02/24/class-support.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/02/24/class-support.html</guid>
        
        
      </item>
    
      <item>
        <title>Introducing JavaScript Office Hours</title>
        <description>&lt;p&gt;Have JavaScript questions? Want to discuss ES6, React, or Promises?
Then why not bring your laptop over to the Haight to share a beer and some
snacks. The Tonic team will be hosting a weekly JavaScript Office Hours,
with the first one kicking off this &lt;strong&gt;Thursday&lt;/strong&gt; from &lt;strong&gt;4PM&lt;/strong&gt; to &lt;strong&gt;8PM&lt;/strong&gt;. You can get
up to date information each week on the &lt;a href=&quot;http://www.jsofficehours.com&quot;&gt;website&lt;/a&gt;.&lt;/p&gt;

&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.async=true;js.src=&quot;https://a248.e.akamai.net/secure.meetupstatic.com/s/script/2012676015776998360572/api/mu.btns.js?id=iqus4jgv426h80sssksot3ibqv&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;mu-bootjs&quot;);&lt;/script&gt;

&lt;p&gt;&lt;a href=&quot;http://www.meetup.com/JS-Office-Hours/events/229055526/&quot;&gt;Thursday, Feb 25, 2016&lt;br /&gt;
622 Shrader St.&lt;br /&gt;
San Francisco, CA 94117&lt;/a&gt; &lt;a href=&quot;http://www.meetup.com/JS-Office-Hours/events/229055526/&quot; data-event=&quot;229055526&quot; class=&quot;mu-rsvp-btn&quot;&gt;RSVP&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Feb 2016 00:31:25 -0800</pubDate>
        <link>http://blog.runkit.com/2016/02/23/js-office-hours.html</link>
        <guid isPermaLink="true">http://blog.runkit.com/2016/02/23/js-office-hours.html</guid>
        
        
      </item>
    
  </channel>
</rss>
