<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Josh Dzielak 🔆</title>
    <description>The latest articles on Forem by Josh Dzielak 🔆 (@joshed).</description>
    <link>https://forem.com/joshed</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F49012%2F2e9bb623-2238-46e2-ad1a-f27eb1cad442.jpg</url>
      <title>Forem: Josh Dzielak 🔆</title>
      <link>https://forem.com/joshed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joshed"/>
    <language>en</language>
    <item>
      <title>Introducing Postman Code - Making Agents Better At Integrating APIs</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Tue, 27 Jan 2026 17:00:00 +0000</pubDate>
      <link>https://forem.com/joshed/introducing-postman-code-making-agents-better-at-integrating-apis-4efo</link>
      <guid>https://forem.com/joshed/introducing-postman-code-making-agents-better-at-integrating-apis-4efo</guid>
      <description>&lt;p&gt;Hi, I'm Josh. I'm a staff engineer at Postman, and this is my first post on DEV about a project I've been working on called &lt;strong&gt;&lt;a href="https://www.postman.com/explore/code" rel="noopener noreferrer"&gt;Postman Code&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Postman Code is a set of MCP tools that let your agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search for APIs&lt;/strong&gt; — both public APIs on the Postman API Network and your team's internal workspaces and collections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetch all API context&lt;/strong&gt; — bring authentication patterns, request shapes, response examples, variables, and error cases directly into context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate integration code&lt;/strong&gt; — produce complete, maintainable client code that follows your project's conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why does this matter? Two reasons.&lt;/p&gt;

&lt;p&gt;First, your agent works from accurate API definitions—&lt;a href="https://learning.postman.com/docs/collections/collections-overview/" rel="noopener noreferrer"&gt;Postman collections&lt;/a&gt; that contain authentication patterns, request formats, response shapes, and error cases. These aren't scraped docs or training data; they're the same definitions teams and companies use to test and document their APIs.&lt;/p&gt;

&lt;p&gt;Second, your agent follows structured instructions that guide &lt;em&gt;how&lt;/em&gt; code gets generated: preparing request bodies, generating types, handling errors, matching your project's conventions. And because the generated code stays linked to its source collection, your agent can detect when the API changes and regenerate the client to match.&lt;/p&gt;

&lt;h2&gt;
  
  
  When API Vibe Coding Goes Wrong
&lt;/h2&gt;

&lt;p&gt;To see why accurate API definitions matter, consider what happens when agents don't have them. They fall back on training data or web search—and the result is code that looks correct but isn't. These failures tend to fall into a few predictable categories, for example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong response shape.&lt;/strong&gt; The agent assumes a structure that doesn't match reality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Agent generated this (wrong path)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Actual response nests it differently&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wrong authentication flow.&lt;/strong&gt; The agent remembers an older auth pattern, or guesses based on what's common:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Agent generated this (wrong — uses Bearer token)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.example.com/v2/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// API actually requires Basic auth&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.example.com/v2/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Basic &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;btoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Missing required fields.&lt;/strong&gt; A new required field was added after the agent's training cutoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Agent generated this (missing required field)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;acmepay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// API now requires 'payment_method' to be specified&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;acmepay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;payment_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent isn't doing anything wrong—it just doesn't have access to the real API definition. You only find out when you hit a 401, a 400, or a subtle data bug at runtime.&lt;/p&gt;

&lt;p&gt;This is the problem that Postman Code solves. It gives your agent access to &lt;a href="https://www.postman.com/product/collections/" rel="noopener noreferrer"&gt;Postman collections&lt;/a&gt; and environments that contain all the context the agent needs to give correct answers and generate correct code the first try. In practice, this context includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collection documentation&lt;/strong&gt; — overview, auth patterns, base URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Folder structure and docs&lt;/strong&gt; — how endpoints are organized and grouped&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request definitions&lt;/strong&gt; — method, URL, headers, body schema with required and optional fields&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saved response examples&lt;/strong&gt; — actual response shapes for success and error cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment and collection variables&lt;/strong&gt; — base URLs, API versions, configuration, placeholders for secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started in 2 Minutes
&lt;/h2&gt;

&lt;p&gt;Postman Code is part of the &lt;a href="https://github.com/postmanlabs/postman-mcp-server" rel="noopener noreferrer"&gt;Postman MCP server&lt;/a&gt;, which has several toolsets for different use cases. For API exploration and code generation, you'll connect to the &lt;code&gt;code&lt;/code&gt; toolset—here's how.&lt;/p&gt;

&lt;p&gt;You'll need a &lt;a href="https://learning.postman.com/docs/developer/postman-api/authentication/" rel="noopener noreferrer"&gt;Postman API key&lt;/a&gt; (a free Postman account is enough).&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Add this to &lt;code&gt;.cursor/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postman"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.postman.com/code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;POSTMAN_API_KEY&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http postman https://mcp.postman.com/code &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &amp;lt;POSTMAN_API_KEY&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VS Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postman"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.postman.com/code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${input:postman-api-key}"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postman-api-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"promptString"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enter your Postman API key"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prompts and Use Cases
&lt;/h2&gt;

&lt;p&gt;Once connected, Postman Code fits into the natural workflow of working with an API. You can explore an API before committing to it, generate integration code when you're ready to build, and keep that code in sync as the API evolves over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exploring APIs
&lt;/h3&gt;

&lt;p&gt;Before writing any code, you might need to find the right API for your use case, compare options, or understand how a specific API's authentication and endpoints work.&lt;/p&gt;

&lt;h4&gt;
  
  
  Public APIs
&lt;/h4&gt;

&lt;p&gt;Your agent can search the Postman API Network and explore any public collection. Thousands of companies like &lt;a href="https://www.postman.com/discord-api" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://www.postman.com/datadog" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;, and &lt;a href="https://www.postman.com/hubspot" rel="noopener noreferrer"&gt;HubSpot&lt;/a&gt; publish their official API collections there—and your agent can explore them directly: what endpoints exist, how authentication works, which requests are commonly used together, and what the response shapes look like.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Explore the Slack API and explain the main ways to post messages. Use Postman."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note: Adding "Use Postman" ensures the agent will use the provided Postman tools. You can also add this as a rule in your IDE so it applies automatically—for example: &lt;em&gt;"Any request involving an API must use Postman tools."&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Show me how authentication works for the Twilio API and which endpoints are typically used together."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is especially useful for large or unfamiliar APIs where reading raw docs is overwhelming.&lt;/p&gt;

&lt;h4&gt;
  
  
  Internal APIs
&lt;/h4&gt;

&lt;p&gt;For private or internal APIs, your agent can access collections from your Postman workspace. If your team documents APIs in Postman, those same definitions are now available to your agent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Explore our internal payments service API and show me how to initiate a refund."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"What endpoints are available in our User Service postman collection?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Integrating APIs
&lt;/h3&gt;

&lt;p&gt;When you're ready to generate code, you can work at whatever level makes sense.&lt;/p&gt;

&lt;p&gt;Sometimes you have a high-level goal and want the agent to figure out which API requests to use:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Build a Slack bot that posts a welcome message when someone joins a channel."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Create a script that sends an SMS notification when a background job fails."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other times you already know exactly which requests you need:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Generate a typed client for the Notion Search endpoint."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Create a function that calls our internal payments API's refund endpoint."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Either way, the agent fetches the real request definitions from Postman and generates code that matches your language, style, and conventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Syncing API Changes
&lt;/h3&gt;

&lt;p&gt;APIs change over time. Endpoints get deprecated, required fields get added, authentication flows evolve. Just like you'd keep your dependencies up to date, you need to keep your API integrations current.&lt;/p&gt;

&lt;p&gt;Postman Code‑generated files include metadata that links them back to the exact collection and request they came from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Generated by Postman Code
 *
 * Collection: Notion API
 * Collection UID: 15568543-d990f9b7-98d3-47d3-9131-4866ab9c6df2
 *
 * Request: Search &amp;gt; Search
 * Request UID: 15568543-816435ec-1d78-4c55-a85e-a1a4a8a24564
 * Request modified at: 2022-02-24T23:01:58.000Z
 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because that linkage is explicit, you can ask the agent to reason about changes over time.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Check whether the Notion API search request has changed since this client was generated, and update the code if needed."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Compare our generated Slack client with the latest collection and show me what would change."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The diff is visible, reviewable, and easy for teammates to understand — just like any other code change.&lt;/p&gt;

&lt;p&gt;If you want to see working examples, check out the &lt;a href="https://github.com/postmanlabs/postman-code-examples" rel="noopener noreferrer"&gt;example projects on GitHub&lt;/a&gt; — including a Notion CLI and a Stripe payments demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Postman Code came out of a pattern we kept seeing: agents are excellent at writing application logic, but they struggle at the API boundary.&lt;/p&gt;

&lt;p&gt;The goal is to close that gap in a way that fits naturally into existing development workflows. API integrations stay explicit, reviewable, and grounded in the same source of truth teams already use.&lt;/p&gt;

&lt;p&gt;How are you integrating with APIs today? What challenges do you run into, and how are you solving them? I'd love to hear in the comments.&lt;/p&gt;

&lt;p&gt;And if you try Postman Code, let me know how it goes—we're always looking for feedback. Thanks for reading!&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn More
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postman Code&lt;/strong&gt; — &lt;a href="https://www.postman.com/explore/code" rel="noopener noreferrer"&gt;https://www.postman.com/explore/code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Documentation &amp;amp; Examples&lt;/strong&gt; — &lt;a href="https://github.com/postmanlabs/postman-code-examples" rel="noopener noreferrer"&gt;https://github.com/postmanlabs/postman-code-examples&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman MCP Server&lt;/strong&gt; — &lt;a href="https://github.com/postmanlabs/postman-mcp-server" rel="noopener noreferrer"&gt;https://github.com/postmanlabs/postman-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>api</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Observatory #1: High Gravity</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Fri, 21 Feb 2020 15:25:12 +0000</pubDate>
      <link>https://forem.com/orbit/the-observatory-1-high-gravity-4kp2</link>
      <guid>https://forem.com/orbit/the-observatory-1-high-gravity-4kp2</guid>
      <description>&lt;p&gt;&lt;em&gt;The Observatory&lt;/em&gt; is a newsletter about building high gravity developer communities. Some communities are better than others at attracting and retaining new members into their orbits. What's their secret? 🤫 That's what we're going to travel the galaxy to figure out, together! 👨‍🚀🚀&lt;/p&gt;

&lt;p&gt;I'm Josh, a developer advocate and the co-founder &amp;amp; CTO of &lt;a href="https://orbit.love/" rel="noopener noreferrer"&gt;Orbit&lt;/a&gt;. I will be your curator for this week's edition and hopefully others if this one goes okay.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Observatory&lt;/em&gt; is published right here on DEV under the &lt;a href="https://dev.to/orbit"&gt;Orbit organization&lt;/a&gt; and on the &lt;a href="https://dev.to/t/devrel"&gt;#devrel&lt;/a&gt; and &lt;a href="https://dev.to/t/community"&gt;#community&lt;/a&gt; tags. The people and the conversations on DEV are the best. That's why we're here. Please liberally add your questions, feedback, and experiences below.&lt;/p&gt;

&lt;p&gt;Are we ready? Then please let me welcome you to the first issue 🎉 1️⃣&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvt3t8noekxlmg2kh7s04.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvt3t8noekxlmg2kh7s04.gif" alt="Alt Text" width="480" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Spotlight: The Hero's Journey
&lt;/h3&gt;

&lt;p&gt;I met GitLab evangelist &lt;a href="https://twitter.com/john_cogs" rel="noopener noreferrer"&gt;John Coghlan&lt;/a&gt; in January and had the pleasure of learning about the &lt;a href="https://about.gitlab.com/community/heroes/" rel="noopener noreferrer"&gt;GitLab Heroes&lt;/a&gt; program. Unfortunately I don't qualify in any way, but at least I know I don't: the requirements AND the rewards are clearly spelled out on their website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknegl5vy5bmhu28iyx64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknegl5vy5bmhu28iyx64.png" alt="Alt Text" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is awesome because it tells community members exactly what is expected and what is rewarded, offering a progression that lets more people participate earlier. The message is clear and transparent, building trust with members that contribution is a good use of their time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Showing the love on Valentine's Day
&lt;/h3&gt;

&lt;p&gt;On February 14 &lt;a href="https://launchdarkly.com/" rel="noopener noreferrer"&gt;LaunchDarkly&lt;/a&gt; launched a &lt;a href="https://launchdarkly.com/blog/launched-modern-documentation/" rel="noopener noreferrer"&gt;new product &amp;amp; SDK documentation site&lt;/a&gt;. Why did a docs update make the cut for a newsletter about building community? Because the content is open source and PRs are encouraged, creating an low-friction pathway for members to make a contribution and community managers to show them some love.&lt;/p&gt;

&lt;p&gt;While we're talking about LaunchDarkly, we have to say congrats to &lt;a href="https://twitter.com/jessicaewest" rel="noopener noreferrer"&gt;Jessica West&lt;/a&gt; for joining to head up their DevRel team! 🍾🥂🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  Send more swag in less time
&lt;/h3&gt;

&lt;p&gt;This article shows you how to set up an automated swag info collecting process with Slack and Airtable. It all starts with starring a Slack message from a helpful developer ⭐&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1230160817359917057-426" src="https://platform.twitter.com/embed/Tweet.html?id=1230160817359917057"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1230160817359917057-426');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1230160817359917057&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7u9a6owgyoc9cje4g3wa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7u9a6owgyoc9cje4g3wa.gif" alt="Alt Text" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Got your builder hat on? 👷‍♂️ Here's another workflow post about how to get a notification when someone &lt;a href="https://orbit.love/blog/how-to-get-a-slack-notification-when-someone-stars-your-github-repository" rel="noopener noreferrer"&gt;stars your GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q&amp;amp;A
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: What is a high gravity community?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: One with a strong attractive force due to the substantial love and reach of its members. Check out the &lt;a href="https://github.com/orbit-love/orbit-model" rel="noopener noreferrer"&gt;Orbit Model GitHub repository&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Josh, does my high gravity community need a theme song?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Yes, it does. An excellent choice would be &lt;em&gt;Reach for the Stars&lt;/em&gt; by legendary English pop group &lt;a href="https://en.wikipedia.org/wiki/S_Club_7" rel="noopener noreferrer"&gt;S Club 7&lt;/a&gt;. There are many interpretations of this rather extraordinary music video, though you'll have to choose your own.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/222102528" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  Don't miss the next edition of The Observatory 🔭
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://orbit.love/subscribe" rel="noopener noreferrer"&gt;Subscribe here&lt;/a&gt; to get an email for each new edition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/orbit"&gt;Follow Orbit&lt;/a&gt; on DEV to see all of our posts.&lt;/p&gt;




&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;What was your favorite part of today's newsletter? What should we write about in the future?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd9cvnsr0gvnyln21r2op.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fd9cvnsr0gvnyln21r2op.gif" alt="Alt Text" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>community</category>
    </item>
    <item>
      <title>My first week with the new 16" MacBook pro</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Mon, 06 Jan 2020 16:50:34 +0000</pubDate>
      <link>https://forem.com/joshed/my-first-week-with-the-new-16-macbook-pro-4h5e</link>
      <guid>https://forem.com/joshed/my-first-week-with-the-new-16-macbook-pro-4h5e</guid>
      <description>&lt;p&gt;Happy New Year! 🎉👨‍💻 I know already that 2020 is going to be a big coding year for me. As the Co-Founder &amp;amp; CTO of &lt;a href="https://orbit.love/" rel="noopener noreferrer"&gt;Orbit&lt;/a&gt; I am building our first product, mostly in JavaScript and Ruby. Both of these languages can benefit from a speed boost in the development environment, so I'm really excited to head into the new year with a new laptop.&lt;/p&gt;

&lt;p&gt;My previous machine was an early 13" 2015 MacBook Pro with only 8GB of RAM. It was struggling to keep up, but I didn't want to upgrade until Apple fixed a few issues with their recent laptops, namely the keyboard. &lt;/p&gt;

&lt;p&gt;I'm happy to say the 16" model has exceeded expectations. In this post I'll share more about my configuration and experience after one week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Display
&lt;/h2&gt;

&lt;p&gt;The 16" retina display is razor sharp and has an enormous amount of pixels. Using the &lt;a href="https://apps.apple.com/us/app/display-menu/id549083868?mt=12" rel="noopener noreferrer"&gt;Display Menu&lt;/a&gt; app, I can go all the way up to 3584x2240 resolution. Of course, I would go blind if I kept it there because the text is so small. So far I have been using the default 1792x1120 resolution for normal use and switching to 2048x1280 when I need a little more space for programming.&lt;/p&gt;

&lt;p&gt;The bezel of the display is really thin, making the laptop's overall form factor not much larger than 15" predecessors. It also looks great aesthetically.&lt;/p&gt;

&lt;p&gt;Compared to a 13" I feel like I'm working in more spacious environment, and I'm not reaching for an external monitor as fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyboard
&lt;/h2&gt;

&lt;p&gt;I'd been waiting since 2016 for Apple to release a laptop without a &lt;a href="https://www.macrumors.com/guide/butterfly-keyboard-issues/" rel="noopener noreferrer"&gt;clacky &amp;amp; stiff butterfly switch keyboard&lt;/a&gt;, and finally they have. The keyboard on the 2019 16" MacBook Pro closely resembles the external Magic Keyboards, and in my opinion is even more buttery. The physical escape key is back too.&lt;/p&gt;

&lt;p&gt;Be aware that the 2019 13" MacBook models &lt;strong&gt;do not&lt;/strong&gt; have the new Magic Keyboard. They have a new (3rd) generation of the old butterfly keyboard. If you don't like that keyboard but still want a 13" laptop, you might be better off to wait.&lt;/p&gt;

&lt;p&gt;I'm finding the 16" model to be more comfortable to type on for one more reason - I can rest my palms and wrists fully on the chassis next to the trackpad without my wrists are digging into the edge of the laptop when I type.&lt;/p&gt;

&lt;h2&gt;
  
  
  CPU and RAM
&lt;/h2&gt;

&lt;p&gt;I added a few upgrades including the 2.4GHz 8‑core 9th‑generation Intel Core i9 processor and 32GB of RAM. That's a lot of power, but I wanted some future-proofing for a laptop I expect to have for many years.&lt;/p&gt;

&lt;p&gt;One advantage of the 16" MacBook Pro over the 13" is that the specs can go a lot higher. Here's a comparison from &lt;a href="https://9to5mac.com/2019/11/17/13-inch-vs-16-inch-macbook-pro-comparison/" rel="noopener noreferrer"&gt;9to5mac.com&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Top of the line 13-inch MacBook Pro, $3,099&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2.8GHz quad‑core 8th‑generation Intel Core i7 processor&lt;/li&gt;
&lt;li&gt;Turbo Boost up to 4.7GHz&lt;/li&gt;
&lt;li&gt;Intel Iris Plus Graphics 655&lt;/li&gt;
&lt;li&gt;16GB 2133MHz LPDDR3 memory&lt;/li&gt;
&lt;li&gt;2TB SSD storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Top of the line 16-inch MacBook Pro, $6,099&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2.4GHz 8‑core 9th‑generation Intel Core i9 processor&lt;/li&gt;
&lt;li&gt;Turbo Boost up to 5.0GHz&lt;/li&gt;
&lt;li&gt;AMD Radeon Pro 5500M with 8GB of GDDR6 memory&lt;/li&gt;
&lt;li&gt;64GB 2666MHz DDR4 memory&lt;/li&gt;
&lt;li&gt;8TB SSD storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: I paid $3,099 with just the CPU and RAM upgrades I mention above. Upgrading the SSD is where the cost really starts to go up, but I felt like the default 512GB was enough for me.&lt;/p&gt;

&lt;p&gt;&amp;lt;rationalize&amp;gt;$3k is a lot for a laptop, but if you have it for two years, it's only $29/week! 💸&amp;lt;/rationalize&amp;gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trackpad
&lt;/h2&gt;

&lt;p&gt;The trackpad on the 16" is very large, stretching from "S" all the way to ";" on the keyboard. In theory I am able to do more moving and dragging in one swipe vs. having to pick up and recenter my hands on the trackpad. In practice, I'm not sure how much effect this has, but I haven't found any downsides to the big trackpad either.&lt;/p&gt;

&lt;h2&gt;
  
  
  Color
&lt;/h2&gt;

&lt;p&gt;My previous laptop was silver and the new one is space grey. It's not new for most people but I like it so much better! My eyes are sensitive to light and the lower amount of light reflected from the case actually makes a big difference in the comfort.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speakers
&lt;/h2&gt;

&lt;p&gt;The biggest surprise has been how great the speakers are. Apple has really invested here. There are 6 speakers and an array of 3 microphones. The imaging and surround sound effect is impressive. Thanks to &lt;a href="https://www.idownloadblog.com/2019/11/13/16-inch-macbook-pro-dolby-atmos/" rel="noopener noreferrer"&gt;force-cancelling woofers&lt;/a&gt;, there's even some real bass. I can listen to music and watch Netflix without feeling like I need my headphones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drawbacks
&lt;/h2&gt;

&lt;p&gt;One obvious drawback of the 16" MacBook vs. the 13" is the cost. It depends on the options, but it's likely to come out about $1,000 more.&lt;/p&gt;

&lt;p&gt;Size and weight-wise, here's the comparison from &lt;a href="https://9to5mac.com/2019/11/17/13-inch-vs-16-inch-macbook-pro-comparison/" rel="noopener noreferrer"&gt;9to5mac.com&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp22vuoy141otoxki8yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp22vuoy141otoxki8yb.png" alt="Alt Text" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The extra size and weight has been fine for me so far, but I don't have heavy travel requirements. If you're on an airplane all the time, the 16" might not be ideal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overall, I'm super happy and feel like the extra money was worth it. The 2019 13" models don't have the new Magic Keyboard and only go up to 16GB of RAM, but thankfully the 16" has what I was looking for.&lt;/p&gt;

&lt;p&gt;Happy DEV year! 🎉&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>Meet these open source alternatives to Meetup.com 🤦‍♀️🙅‍♀️</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Wed, 16 Oct 2019 13:42:15 +0000</pubDate>
      <link>https://forem.com/joshed/meet-these-open-source-alternatives-to-meetup-com-53d</link>
      <guid>https://forem.com/joshed/meet-these-open-source-alternatives-to-meetup-com-53d</guid>
      <description>&lt;p&gt;Meetup just announced they'll start &lt;a href="https://www.meetup.com/lp/paymentchanges" rel="noopener noreferrer"&gt;charging group members&lt;/a&gt; $2 per RSVP. Lol yeah that's not going to fly. Organizations who host free events for their communities, which includes a huge number of developer meetups, are not just going to start charging members money out of nowhere.&lt;/p&gt;

&lt;p&gt;If you want the full story, Quincy Larson from &lt;a href="https://twitter.com/FreeCodeCamp" rel="noopener noreferrer"&gt;FreeCodeCamp&lt;/a&gt; does a great job of telling it here: &lt;a href="https://www.freecodecamp.org/news/the-wework-meetup-debacle-and-a-new-chapter/" rel="noopener noreferrer"&gt;WeWork is Desperately Squeezing Cash Out of Meetup.com by Taxing 225,000 Communities&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But there is more to gain than lose here. Meetup organizers represent an awesome community in their own right. Organizers have been stepping up in a big way, announcing plans to build replacements or shedding light on viable alternatives. Here's a few I've come across so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter
&lt;/h2&gt;

&lt;p&gt;FreeCodeCamp is going to build &lt;a href="https://github.com/freecodecamp/chapter" rel="noopener noreferrer"&gt;Chapter&lt;/a&gt;, which is a way to "let every organization host their own Meetup.com in a box." Chapter is open source and already has over 600 stars on GitHub despite being a day old. ⭐📈&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/freeCodeCamp" rel="noopener noreferrer"&gt;
        freeCodeCamp
      &lt;/a&gt; / &lt;a href="https://github.com/freeCodeCamp/chapter" rel="noopener noreferrer"&gt;
        chapter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A self-hosted event management tool for nonprofits
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Welcome to Chapter&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/freeCodeCamp/chapter#contributors-" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/14d304d045a1464e517a9431e9e3823df8d91b96798937d89a8ef2faed0d3a9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616c6c2d636f6e7472696275746f72732f66726565436f646543616d702f636861707465723f636f6c6f723d6f72616e6765267374796c653d666c61742d737175617265" alt="All Contributors"&gt;&lt;/a&gt;
&lt;a href="https://gitpod.io/#https://github.com/freeCodeCamp/chapter" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fa445e63ae38a91a2c8f8bc1cd6842f48216c4a57a114b07484225f3bdc7528c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73657475702d6175746f6d617465642d626c75653f6c6f676f3d676974706f64" alt="Setup Automated"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After several years of being dissatisfied with existing group event tools (Meetup, Facebook events) we decided to build our own.&lt;/p&gt;
&lt;p&gt;This will be a self-hosted Docker container deployed to the cloud with a one-click and then configured by the &lt;em&gt;owner&lt;/em&gt;. No coding required.&lt;/p&gt;
&lt;p&gt;Your &lt;em&gt;organization&lt;/em&gt; can host an &lt;em&gt;instance&lt;/em&gt; of &lt;em&gt;Chapter&lt;/em&gt; under a sub-domain of your website, such as &lt;code&gt;chapter.sierraclub.org&lt;/code&gt; or &lt;code&gt;chapter.womenwhocode.org&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;All of an &lt;em&gt;organization&lt;/em&gt;'s user data will remain under their control.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="https://github.com/freeCodeCamp/chapter/wiki/Vision" rel="noopener noreferrer"&gt;Vision statement&lt;/a&gt; provides more details on the reasons for &lt;strong&gt;&lt;em&gt;Chapter&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Terminology&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;To better communicate and more easily build an API and UI, the current contributors have decided on a collection of terminology to clarify discussions surrounding the &lt;strong&gt;&lt;em&gt;Chapter&lt;/em&gt;&lt;/strong&gt; project:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;instance&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;a web server deployment of the &lt;a href="https://github.com/freeCodeCamp/chapter/" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Chapter&lt;/em&gt;&lt;/strong&gt; application&lt;/a&gt;, managed by an &lt;em&gt;organization&lt;/em&gt;.&lt;/td&gt;
&lt;td&gt;a Docker container running on a web host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;organization&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;a non-profit with&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/freeCodeCamp/chapter" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Chapter even has a data model already! 🤓&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ujoyqf88rhnfym0fq9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ujoyqf88rhnfym0fq9s.png" alt="Alt Text" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  meetingplace.io
&lt;/h2&gt;

&lt;p&gt;Egghead.io instructor &lt;a href="https://twitter.com/chrisachard" rel="noopener noreferrer"&gt;Chris Achard&lt;/a&gt; is building a Meetup.com replacement called &lt;a href="//meetingplace.io"&gt;meetingplace.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1184120199898976259-103" src="https://platform.twitter.com/embed/Tweet.html?id=1184120199898976259"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1184120199898976259-103');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1184120199898976259&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Chris seems very open to input about how this should look, so if you've spent sleepless nights dreaming of what a great event-hosting experience should look like (I know I have!) then this is your chance to make those dreams a reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Active projects
&lt;/h2&gt;

&lt;p&gt;This GitHub repo by &lt;a href="https://github.com/coderbyheart" rel="noopener noreferrer"&gt;coderbyheart&lt;/a&gt; contains a solid table of open source meetup alternatives, including a field for maturity.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/coderbyheart" rel="noopener noreferrer"&gt;
        coderbyheart
      &lt;/a&gt; / &lt;a href="https://github.com/coderbyheart/open-source-meetup-alternatives" rel="noopener noreferrer"&gt;
        open-source-meetup-alternatives
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open-Source Alternatives to Meetup
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Open-Source Alternatives to Meetup&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;ℹ️ Pull-requests are welcome!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Maturity¹&lt;/th&gt;
&lt;th&gt;Tech²&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;th&gt;ActivityPub³&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://agorakit.org/" rel="nofollow noopener noreferrer"&gt;Agorakit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/agorakit/agorakit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;GPLv3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.attendize.com/" rel="nofollow noopener noreferrer"&gt;attendize&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Attendize/Attendize" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;Attribution Assurance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calendar.social&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitea.polonkai.eu/gergely/calendar-social" rel="nofollow noopener noreferrer"&gt;gitea&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter by freeCodeCamp&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/freeCodeCamp/chapter" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;BSD 3-Clause&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.communecter.org/" rel="nofollow noopener noreferrer"&gt;Communecter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/pixelhumain/communecter" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://createthirdplaces.com" rel="nofollow noopener noreferrer"&gt;Create Third Places&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/orgs/createthirdplaces/repositories" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;GPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epicyon&lt;/td&gt;
&lt;td&gt;&lt;a href="https://gitlab.com/bashrc2/epicyon" rel="nofollow noopener noreferrer"&gt;GitLab&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://eventol.github.io/eventoL/" rel="nofollow noopener noreferrer"&gt;eventoL&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/eventoL/eventoL" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;GPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.e-dynamics.be/wordpress/" rel="nofollow noopener noreferrer"&gt;Events Made Easy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/liedekef/events-made-easy/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;GPLv2.0&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://friendi.ca/" rel="nofollow noopener noreferrer"&gt;Friendica&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/friendica/friendica" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gancio.org/" rel="nofollow noopener noreferrer"&gt;Gancio&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://framagit.org/les/gancio" rel="nofollow noopener noreferrer"&gt;Framagit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gath.io/" rel="nofollow noopener noreferrer"&gt;Gathio&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/lowercasename/gathio" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;GPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GetTogether&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/GetTogetherComm/GetTogether" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;BSD 2-Clause&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gospeak&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/loicknuchel/gospeak" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;Scala&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://hi.events/" rel="nofollow noopener noreferrer"&gt;Hi.Events&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/HiEventsDev/hi.events" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://zotlabs.org/page/hubzilla/hubzilla-project" rel="nofollow noopener noreferrer"&gt;Hubzilla&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://framagit.org/hubzilla/core" rel="nofollow noopener noreferrer"&gt;Framagit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://human-connection.social/" rel="nofollow noopener noreferrer"&gt;Human Connection&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Human-Connection/Human-Connection" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://joind.in/" rel="nofollow noopener noreferrer"&gt;joind.in&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/joindin/joindin-web2" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;BSD 3-Clause&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://lauti.org/" rel="nofollow noopener noreferrer"&gt;Lauti&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://codeberg.org/Klasse-Methode/lauti" rel="nofollow noopener noreferrer"&gt;Codeberg&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;Golang&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://meetdown.org/" rel="nofollow noopener noreferrer"&gt;Meetdown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/structr/meetdown" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;Structr&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meetup Alternative&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Thinkmill/meetup-alternative" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;inactive&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;unlicensed&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://mobilizon.org/" rel="nofollow noopener noreferrer"&gt;Mobilizon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://framagit.org/kaihuri/mobilizon" rel="nofollow noopener noreferrer"&gt;Framagit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;Elixir&lt;/td&gt;
&lt;td&gt;AGPLv3&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.onruby.eu/" rel="nofollow noopener noreferrer"&gt;on_ruby&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/phoet/on_ruby" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;mature&lt;/td&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;(extended) Beer-ware&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/coderbyheart/open-source-meetup-alternatives" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Some notables on the list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobilizon &lt;a href="https://joinmobilizon.org/en/" rel="noopener noreferrer"&gt;crowdfunded €58k&lt;/a&gt; and has released a beta written in Elixir&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/phoet/on_ruby" rel="noopener noreferrer"&gt;on_ruby&lt;/a&gt; is fairly mature and powers usergroups like the &lt;a href="https://www.rug-b.de/" rel="noopener noreferrer"&gt;Ruby User Group Berlin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://agorakit.org/" rel="noopener noreferrer"&gt;Agorakit&lt;/a&gt; is written in PHP and supports multiple groups, calendars, notifications, and shared files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more options, including some that are SaaS, check out this &lt;a href="https://phacks.dev/meetup-com-alternatives" rel="noopener noreferrer"&gt;great article by Nicolas Goutay&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Last resorts
&lt;/h2&gt;

&lt;p&gt;You could always use &lt;a href="https://eventbrite.com/" rel="noopener noreferrer"&gt;Eventbrite&lt;/a&gt;. Their &lt;a href="https://finance.yahoo.com/news/eventbrite-nyse-eb-share-price-123200981.html" rel="noopener noreferrer"&gt;share priced dropped 39% yesterday&lt;/a&gt; but it could easily recover if they would just replace this impossible-to-use 90's-era rich text editor with something better 😛&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t32znbqk79f66p1zs4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t32znbqk79f66p1zs4f.png" alt="Alt Text" width="500" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Update: community suggestions 👯‍♀️
&lt;/h2&gt;

&lt;p&gt;Here on dev and &lt;a href="https://twitter.com/dzello/status/1184466755877511170" rel="noopener noreferrer"&gt;on twitter&lt;/a&gt; I got some additional suggestions of alternatives to include. Here they are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gettogether.community/" rel="noopener noreferrer"&gt;gettogether.community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kommunity.com/" rel="noopener noreferrer"&gt;Kommunity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ti.to/" rel="noopener noreferrer"&gt;Tito&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://colloq.io/" rel="noopener noreferrer"&gt;Colloq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://timepad.ru/" rel="noopener noreferrer"&gt;Timepad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community-z.com/" rel="noopener noreferrer"&gt;Community-Z&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final word to the wise
&lt;/h2&gt;

&lt;p&gt;Don't make unpredictable and unreasonable pricing changes if a non-trivial portion of your users are developers, designers, and product builders. They might just get motivated enough to build you out of their stack. 😘&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1184019082313641985-380" src="https://platform.twitter.com/embed/Tweet.html?id=1184019082313641985"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1184019082313641985-380');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1184019082313641985&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>events</category>
    </item>
    <item>
      <title>What conventions &amp; widely-accepted libraries exist for building complex backend Node.js apps?</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Wed, 09 Oct 2019 07:24:35 +0000</pubDate>
      <link>https://forem.com/joshed/what-conventions-widely-accepted-libraries-exist-for-building-complex-backend-node-js-apps-13f7</link>
      <guid>https://forem.com/joshed/what-conventions-widely-accepted-libraries-exist-for-building-complex-backend-node-js-apps-13f7</guid>
      <description>&lt;p&gt;I'm starting to build a new app this month. It will be highly relational with many models like organizations, contacts, conversations. The codebase will grow quickly and in a year it will have more than a hundred models and controllers.&lt;/p&gt;

&lt;p&gt;The frontend web and backend API components will be logically separate from the outset as there will be multiple front-ends, a public API, and a complex React app that will need to fetch and update a lot of data.&lt;/p&gt;

&lt;p&gt;For the initial frontend, we're planning to use Next.js. The server-side rendering will be important to serving dynamic data quickly to users. I don't want to show someone a loading spinner just because they refreshed the page.&lt;/p&gt;

&lt;p&gt;Next has some nice conventions: pages go in &lt;code&gt;/pages&lt;/code&gt; and API routes go in &lt;code&gt;/pages/api&lt;/code&gt;. In our case, the Next.js app will just call our API to get data and it won't have to contain all our models, business logic, and data access code. It doesn't have opinions about that stuff anyway.&lt;/p&gt;

&lt;p&gt;Which brings me back to my main question - how is today's backend Node.js world building complex apps with models, business logic, and data access?&lt;/p&gt;

&lt;p&gt;I've mostly built apps like this in Ruby and Rails before. This is the sweet spot for Rails and I've never felt more productive building and testing apps than with Ruby &amp;amp; Rails.&lt;/p&gt;

&lt;p&gt;But I at least want to consider alternatives and see what the Node world's answer is to these questions in 2019.&lt;/p&gt;

&lt;p&gt;Here are a few things I'm curious about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where do you put your code? How is the codebase organized?&lt;/li&gt;
&lt;li&gt;On average, how many lines of code do your models have? Controllers?&lt;/li&gt;
&lt;li&gt;Do you have different types of objects than models and controllers? What are they and how much code lives in there?&lt;/li&gt;
&lt;li&gt;How "custom" is your setup? Does it look similar to codebases at other companies? How long does it take to get new engineers up-to-speed?&lt;/li&gt;
&lt;li&gt;How good is your test coverage? How easy or painful is writing tests? Do you see engineers cutting corners? Do engineers TDD or is testing an afterthought?&lt;/li&gt;
&lt;li&gt;How do your debugging tools work? Are you just doing console.log or do you use a real debugger?&lt;/li&gt;
&lt;li&gt;What are the most helpful dependencies you are using? For things like authentication, i18n, data access / ORM, testing, test mocks and fixtures, model validations, sending email, receiving email, rendering views, building JSON, logging, backend jobs, pubsub&lt;/li&gt;
&lt;li&gt;How mature are the dependencies you're using? How many times have you had to throw one out and build your own?&lt;/li&gt;
&lt;li&gt;Does your ORM or data access layer work on the console? If you want to read or manipulate data outside your server process, how do you do it?&lt;/li&gt;
&lt;li&gt;Are you using REST, GraphQL, or both?&lt;/li&gt;
&lt;li&gt;Are you using TypeScript?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a huge list of questions so I'll stop there. Sharing your perspective on just on or two of them would be really helpful.&lt;/p&gt;

</description>
      <category>node</category>
    </item>
    <item>
      <title>How to use DEV for DEVeloper relations</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Mon, 30 Sep 2019 15:12:48 +0000</pubDate>
      <link>https://forem.com/orbit/how-to-use-dev-for-developer-relations-1ph9</link>
      <guid>https://forem.com/orbit/how-to-use-dev-for-developer-relations-1ph9</guid>
      <description>&lt;p&gt;If you work in developer relations or are working to get adoption for an open source project, API, or developer platform, then being a member of the DEV community can help you reach your goals! 📈🏆🎉&lt;/p&gt;

&lt;p&gt;This guide will walk you through the benefits of being on DEV, how to get started, and how to make the post of your presence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who am I?
&lt;/h2&gt;

&lt;p&gt;Hi, I'm Josh. I'm @dzello here on DEV. I'm a developer advocate and love helping developers learn new technologies and build awesome projects.&lt;/p&gt;

&lt;p&gt;I've been a member of the DEV community since December 2017, both personally and as a developer advocate for Algolia. I'm now the co-founder and CTO at &lt;a href="https://orbit.love/" rel="noopener noreferrer"&gt;Orbit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At Algolia we published content on DEV and also responded to questions about our API, search, and any other topics we thought we could be helpful about. We were also one of the first sponsors of DEV, which was a great experience 👯‍♀️&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use DEV for DevRel?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevRels must go where the Devs are so that they can Rel with them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The DEV community is BIG and it's growing like crazy. The team behind DEV is very transparent, and creator and cofounder &lt;a class="mentioned-user" href="https://dev.to/ben"&gt;@ben&lt;/a&gt; regularly shares metrics about the growth of their platform.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1175513038587170816-522" src="https://platform.twitter.com/embed/Tweet.html?id=1175513038587170816"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1175513038587170816-522');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1175513038587170816&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;growth&lt;/strong&gt; is only one part of the story. What matters even more is &lt;strong&gt;culture&lt;/strong&gt;. The members of the DEV community are generally curious and helpful. Asking questions about something you don't know is safe here. You'll find many developers sharing their learnings as they go, i.e. &lt;a href="https://www.swyx.io/writing/learn-in-public/" rel="noopener noreferrer"&gt;learning in public&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not only does this make DEV an enjoyable place to hang out, it also makes it easier to do advocacy. DEV members are interested in learning about new tools and technologies. They raise their hands and ask for help when they get stuck. If DEV members are using your product, you stand to learn a lot from the experiences—positive and negative—they're posting about.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Use &lt;a href="https://dev.to/tags"&gt;tags&lt;/a&gt; and &lt;a href="https://dev.to/search"&gt;search&lt;/a&gt; to find people discussing the products, projects, trends you're interested in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Who's on DEV?
&lt;/h1&gt;

&lt;p&gt;Lots of organizations are already using DEV for DevRel. Here are some notable ones.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__512"&gt;
  &lt;a href="/azure" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F512%2F64ce0b82-730d-4ca0-8359-2c21513a0063.jpg" alt="azure image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/azure" class="ltag__user__link"&gt;Microsoft Azure&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/azure" class="ltag__user__link"&gt;
        Learn how to build and manage powerful applications using Microsoft Azure cloud services. Explore the documentation and samples, skill yourself up with tutorials and training. Any language. Any platform. 
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag__user ltag__user__id__312"&gt;
  &lt;a href="/twilio" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F312%2F0bfb1ba6-a192-44af-8231-4f6b07e582a8.png" alt="twilio image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/twilio" class="ltag__user__link"&gt;Twilio&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/twilio" class="ltag__user__link"&gt;
        We ❤️ developers. Unlock the magic of communications to improve human experience. Twilio has democratized channels like voice, text, chat, and video through APIs.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag__user ltag__user__id__123"&gt;
  &lt;a href="/heroku" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F123%2F38b10714-65da-4f1d-88ae-e9b28c1d7a5e.png" alt="heroku image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/heroku" class="ltag__user__link"&gt;Heroku&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/heroku" class="ltag__user__link"&gt;
        Heroku is a container-based cloud Platform as a Service (PaaS). Developers use Heroku to deploy, manage, and scale modern apps. Our platform is elegant, flexible, and easy to use, offering developers the simplest path to getting their apps to market.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;There are lots more! Just look for the a tag with an organization name above post titles to spot them. Here are a few others:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/transposit"&gt;Transposit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/nexmo"&gt;Nexmo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ibmdeveloper"&gt;IBM Developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/solacedevs"&gt;Solace Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Are you using DEV for DevRel? Send me a message and I'd be happy to add you to this list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  What to do on DEV
&lt;/h1&gt;

&lt;p&gt;Here are some different ways that developer advocates and their teams contribute on DEV.&lt;/p&gt;

&lt;p&gt;But first: if you're not too familiar with DEV yet, I suggest reading this extensive guide by &lt;a class="mentioned-user" href="https://dev.to/aspittel"&gt;@aspittel&lt;/a&gt; first to get up to speed.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/aspittel" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F38627%2F77a2a5e7-603e-41b4-afcc-f7aff468ae2f.jpg" alt="aspittel"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/aspittel/a-beginners-guide-to-devto-n4a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;A Beginner's Guide to Dev.to&lt;/h2&gt;
      &lt;h3&gt;Ali Spittel ・ Oct 29 '18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#meta&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#community&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#howtodevto&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Create an organization
&lt;/h2&gt;

&lt;p&gt;An organization is the way to group all of your team's content. The concept is similar to GitHub. You'll want to set this up first.&lt;/p&gt;

&lt;p&gt;A badge with your organization's name and custom color will appear next to your content, making it easy for users to identify. Your organization will also get its own landing page, like this one for &lt;a href="https://dev.to/angular"&gt;Angular&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These are the steps to create a new organization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click your avatar in the header&lt;/li&gt;
&lt;li&gt;Click the @-handle to go to your profile page&lt;/li&gt;
&lt;li&gt;Click the "Edit Profile" button&lt;/li&gt;
&lt;li&gt;Click "Organization" in the sidebar&lt;/li&gt;
&lt;li&gt;Click "New Organization" in the header&lt;/li&gt;
&lt;li&gt;Fill out the form and submit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tj305u9bn45bcoro4af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tj305u9bn45bcoro4af.png" alt="Alt Text" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the organization is created, you can invite your teammates. Their avatars will automatically show up on the organization's profile page. In their dashboard, they will see the organization and can view the analytics for the organization's content.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: Visit DEV's &lt;a href="https://dev.to/organization-info"&gt;Organization Info&lt;/a&gt; page to learn more about organizations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Create content
&lt;/h2&gt;

&lt;p&gt;Content on DEV is written in Markdown with front matter and various liquid tags for common tasks. Check out the &lt;a href="https://dev.to/p/editor_guide"&gt;editor guide&lt;/a&gt; for a full rundown.&lt;/p&gt;

&lt;p&gt;Content that you post on DEV ends up in user feeds, helping your content be seen. Users can heart, &lt;a href="https://dev.to/mishaor/the-unicorn-reaction-2na"&gt;unicorn&lt;/a&gt;, and bookmark posts. These reactions boost the post's signal and makes it more likely to appear in users feeds.&lt;/p&gt;

&lt;p&gt;If your post is really popular or spurs a lot of comments, it might be &lt;br&gt;
included in roundup-style posts shared by the DEV team, like this one:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" alt="The DEV Team" width="800" height="800"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" alt="" width="400" height="400"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devteam/the-7-most-popular-dev-posts-from-the-past-week-4i4f" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The 7 Most Popular DEV Posts from the Past Week&lt;/h2&gt;
      &lt;h3&gt;Jess Lee for The DEV Team ・ Sep 23 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#top7&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;These roundups are also emailed to users in a weekly newsletter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Twitter
&lt;/h3&gt;

&lt;p&gt;Posts are sometimes tweeted out to the large and loyal &lt;a href="https://twitter.com/ThePracticalDev" rel="noopener noreferrer"&gt;@ThePracticalDev&lt;/a&gt; twitter following, which has 165k followers as of September 2019. This can create a lot of engagement and help developers discover your twitter handle. ✨&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1176557913822892032-895" src="https://platform.twitter.com/embed/Tweet.html?id=1176557913822892032"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1176557913822892032-895');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1176557913822892032&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: Make sure you set your twitter handle in your DEV profile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are other twitter handles that tweet out posts from specific tags on DEV, like &lt;a href="https://twitter.com/the_ruby_dev" rel="noopener noreferrer"&gt;@the_ruby_dev&lt;/a&gt; does for &lt;a href="https://dev.to/t/ruby"&gt;#ruby&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1177998155369111552-836" src="https://platform.twitter.com/embed/Tweet.html?id=1177998155369111552"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1177998155369111552-836');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1177998155369111552&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;Your DEV dashboard will tell you how well your content is performing. It has one tab for your personal account and one for each of your organizations.&lt;/p&gt;

&lt;p&gt;Here's an example. I can see my total number of post reactions and views, shown here for my DeveloperMode organization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9ylfrikg5mqnue4389l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9ylfrikg5mqnue4389l.png" alt="Alt Text" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can also see my stats at the individual post level.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tbjwq02aijz307e2a3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tbjwq02aijz307e2a3p.png" alt="Alt Text" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-posting
&lt;/h3&gt;

&lt;p&gt;DEV welcomes cross-posted content and lets you specify a post's &lt;code&gt;canonical_url&lt;/code&gt; in the post front matter. That way Google will send visitors directly to your site when the post appears in their search results and the post will accrue to your site's SEO.&lt;/p&gt;

&lt;p&gt;This is a very attractive option for organizations who are also investing a lot in their own blogs.&lt;/p&gt;

&lt;p&gt;If your blog doesn't have a commenting system or doesn't get many comments, cross-posting to DEV is likely to get you more conversations and feedback than you would otherwise. Make sure to keep an eye out for replies after you post and actively reply to the thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask and answer questions
&lt;/h2&gt;

&lt;p&gt;Just like your team might monitor StackOverflow or Twitter for questions about your technology, you can also do that on DEV.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/tags"&gt;tags&lt;/a&gt; and &lt;a href="https://dev.to/search"&gt;search&lt;/a&gt; features will help you find posts about the topics you are interested in and could help out on.&lt;/p&gt;

&lt;p&gt;You can ask questions too, which is great for getting opinions and feedback. Content on DEV doesn't have to be long to get good engagement. I recommend making the question succinct and using it as the post's title. Add any additional details in the body and publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsor
&lt;/h2&gt;

&lt;p&gt;If you'd like to kick your DEV partcipation up a notch, the team behind DEV does offer sponsorships. Check out the &lt;a href="https://dev.to/sponsorship-info"&gt;Sponsorship Information&lt;/a&gt; page to learn more.&lt;/p&gt;

&lt;p&gt;The DEV team does a great job of highlighting their sponsors around the platform. Here's an example:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" alt="The DEV Team" width="800" height="800"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1%2Ff451a206-11c8-4e3d-8936-143d0a7e65bb.png" alt="" width="797" height="797"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devteam/introducing-our-september-2019-sponsors-31me" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Introducing our September 2019 sponsors&lt;/h2&gt;
      &lt;h3&gt;Ben Halpern for The DEV Team ・ Sep 3 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#meta&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  The #devrel tag
&lt;/h1&gt;

&lt;p&gt;Last but not least, developer relations teams should be aware of the &lt;a href="https://dev.to/t/devrel"&gt;#devrel&lt;/a&gt; tag right here on DEV. This is a great place to post content and talk shop about developer relations.&lt;/p&gt;

&lt;p&gt;If you have any questions, send me a message or drop them in below. Thanks for reading! 🙏&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>meta</category>
    </item>
    <item>
      <title>What conferences are you most excited about this fall?</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Fri, 26 Jul 2019 15:14:29 +0000</pubDate>
      <link>https://forem.com/joshed/what-conferences-are-you-most-excited-about-this-fall-3271</link>
      <guid>https://forem.com/joshed/what-conferences-are-you-most-excited-about-this-fall-3271</guid>
      <description>&lt;p&gt;I'm currently planning my calendar and I'd love to get some suggestions from the community. If you're running an event and looking to catch the eye of some potential attendees, feel free to share it here too.&lt;/p&gt;

&lt;p&gt;I'm excited about &lt;a href="https://jamstackconf.com/sf/" rel="noopener noreferrer"&gt;JAMstack Conf San Francisco&lt;/a&gt; on October 16-18. I just went to the London edition and loved it ❤️ Amazing speakers, several live product announcements from the likes of &lt;a href="https://netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt; and &lt;a href="https://stackbit.com/" rel="noopener noreferrer"&gt;Stackbit&lt;/a&gt;. Overall there was a really friendly and inclusive environment, and for me a lot of developer advocates, and evangelists, and founders of dev companies to connect with. The SF edition will be even bigger, with an additional day of conference in addition to a workshop day.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo: &lt;a href="https://twitter.com/sarah_edo" rel="noopener noreferrer"&gt;Sarah Drasner&lt;/a&gt; speaking at JAMstack Conf London 2019&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Props for props: how I made a royally unusual talk for JAMstack Conf London</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Tue, 23 Jul 2019 14:11:38 +0000</pubDate>
      <link>https://forem.com/joshed/props-for-props-how-i-made-a-royally-unusual-talk-for-jamstack-conf-london-59ah</link>
      <guid>https://forem.com/joshed/props-for-props-how-i-made-a-royally-unusual-talk-for-jamstack-conf-london-59ah</guid>
      <description>&lt;p&gt;There were 4 lightning talks at the reception of this year's &lt;a href="https://jamstackconf.com/london/" rel="noopener noreferrer"&gt;JAMstack Conf London&lt;/a&gt;. This is the story of how I found myself giving one of them wearing gold sunglasses with an attached crown, and directing the slides with a sceptre.&lt;/p&gt;

&lt;p&gt;It all began when the call for the talks said they'd take place in a pub in the evening. So, I thought I'd propose something fun; technical but not too hard for the audience to follow, like a story. This is the proposal I sent over:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Once upon a time there was a widowed king named King Markdown. Old King Markdown and his subjects preferred their content to be static, linear and mostly text. One day the king met Princess JavaScript of the Most Serene Kingdom of XML. The Princess and her people preferred their content to be colorful, dynamic, and interactive. King Markdown and Lady JavaScript fell deeply in love despite their differences. But how could the content creators of their respective kingdoms ever build JAMstack sites together? For this, a hero would be needed. More than a hero—a Prince."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can imagine my surprise when I received this email from conference MC &lt;a href="https://www.hawksworx.com/" rel="noopener noreferrer"&gt;Phil Hawksworth&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_500%2Fv1563699451%2Fblog%2Femail-jamstack-conf-talk-accepted" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_500%2Fv1563699451%2Fblog%2Femail-jamstack-conf-talk-accepted" width="500" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LOL. Really? They took it seriously. Cool! Ok so...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This is great&lt;/li&gt;
&lt;li&gt;I actually have to write this talk now&lt;/li&gt;
&lt;li&gt;These are the &lt;a href="https://jamstackconf.com/london/#speakers" rel="noopener noreferrer"&gt;conference day speakers&lt;/a&gt; 😮&lt;/li&gt;
&lt;li&gt;I have 11 days&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you'd like to see how the talk turned out,  &lt;strong&gt;&lt;a href="https://mdx-fairy-tale.developermode.com/" rel="noopener noreferrer"&gt;check out the slides&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;a href="https://github.com/developermode/mdx-fairy-tale" rel="noopener noreferrer"&gt;view the code&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Keep reading to see how I designed and built the talk in the days hence, along with some lessons learned about putting together talks on short notice as a highly fallible human being.&lt;/p&gt;

&lt;h1&gt;
  
  
  The 4 P's
&lt;/h1&gt;

&lt;p&gt;I have a framework for writing and delivering highly-organized and well-rehearsed talks without any stress. It's called The 4 P's.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;anic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;rocrastinate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;erspire&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;erform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I just follow the 4 P's, everything will be fine.&lt;/p&gt;

&lt;p&gt;🤮🤮🤮🤮&lt;/p&gt;

&lt;h1&gt;
  
  
  Panic
&lt;/h1&gt;

&lt;p&gt;If panic sounds like a bad thing, that's because it is. But panic is also one place creative ideas come from. Once I start to panic about giving a talk, my brain is forced to come up with crazy ways to make it happen, without caring (yet) if they will actually work.&lt;/p&gt;

&lt;p&gt;Often, that creative energy takes me to interesting places, both mentally and physically. For instance, there is a costume store called Circus in between my yoga studio and my office, which I walked by the day after I got Phil's email. As soon as I walked in, lo and behold I saw these matching sunglasses and sceptre.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_400%2Fv1563724029%2Fblog%2Fking-sunglasses-royal-sceptre" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_400%2Fv1563724029%2Fblog%2Fking-sunglasses-royal-sceptre" width="400" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;YES. YES! I'll dress up like a king for the talk. &lt;em&gt;I&lt;/em&gt; WILL BE KING MARKDOWN.&lt;/p&gt;

&lt;p&gt;I had zero content at this point yet possessed an unshakeable confidence that the talk would require me to spend 30€ at a place called Circus. So I did.&lt;/p&gt;

&lt;p&gt;Back at my office, I didn't start writing the talk so much as I went panic-shopping again. I bought a &lt;a href="https://www.logitech.com/en-us/product/spotlight-presentation-remote" rel="noopener noreferrer"&gt;Logitech Spotlight&lt;/a&gt; on Amazon for 90€ because I had seen &lt;a href="https://twitter.com/swyx/status/1127598707321524224" rel="noopener noreferrer"&gt;swyx tweet about it&lt;/a&gt; and it looked cool. &lt;em&gt;Justifiable&lt;/em&gt; procrastination, amirite?&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1127598707321524224-55" src="https://platform.twitter.com/embed/Tweet.html?id=1127598707321524224"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1127598707321524224-55');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1127598707321524224&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;If the audience hates the talk, at least I can distract them with this fancy pointer, like they're cats!&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.logitech.com/en-us/product/spotlight-presentation-remote" rel="noopener noreferrer"&gt;Logitech Spotlight&lt;/a&gt; is pretty cool though. It lets you highlight and magnify parts of the presentation just by pointing at the screen and dragging around a circle. It has a built-in accelerometer and requires no external sensor. The Spotlight also has next and previous buttons that can be configured to send custom keystrokes when you double-click them.&lt;/p&gt;

&lt;p&gt;I still had no plan and no content, but I had &lt;em&gt;stuff&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Procrastinate
&lt;/h1&gt;

&lt;p&gt;I did nothing for a week except get a haircut.&lt;/p&gt;

&lt;h1&gt;
  
  
  Perspire
&lt;/h1&gt;

&lt;p&gt;In the 55-hour period from July 7 @ 12pm to July 9 @ 7pm I spent about 30 hours building and rehearsing the talk.&lt;/p&gt;

&lt;p&gt;But why did it take that long to build a 10-minute lightning talk?&lt;/p&gt;

&lt;p&gt;Yes, why indeed?&lt;/p&gt;

&lt;h2&gt;
  
  
  MDX Deck
&lt;/h2&gt;

&lt;p&gt;Since I was giving a talk about MDX, I knew I couldn't just build my slides in Keynote or Google Slides like some sort of traveling hypocrite. I had to build them in MDX. That single decision opted me into building an entire single-purpose React application, including a half-dozen new React components and all the custom CSS to go along with them.&lt;/p&gt;

&lt;p&gt;Thankfully, there's this great tool that exists called &lt;a href="https://github.com/jxnblk/mdx-deck" rel="noopener noreferrer"&gt;MDX Deck&lt;/a&gt;. MDX Deck lets you write slides in markdown and embed React components using JSX syntax (this is what MDX is). I'd just used it to write a &lt;a href="https://developermode.com/blog/mdx-authors-jamstack/" rel="noopener noreferrer"&gt;talk for JAMstack Paris&lt;/a&gt;. It has a presentation mode with support for speaker notes too.&lt;/p&gt;

&lt;p&gt;I highly recommend MDX Deck BUT remember you are still &lt;strong&gt;coding your slides&lt;/strong&gt;. There is no drag-and-drop positioning or text-resizing. No flashy transitions. There are some themes and layouts out-of-the-box, but you need to build on top of that with React, styled-components, and all that implies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;--parseable&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
993
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;This talk brought to you by 993 NPM packages!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are some of the components I extended or created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Horizontal&lt;/code&gt;: a layout that takes a customizeable width&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Appear&lt;/code&gt;: to make children appear incrementally without taking up space before they're visible and making the first child visible on initial render&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Character&lt;/code&gt;: the base component for the king and the princess that renders an image and wires up hover and click handlers &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Code&lt;/code&gt;: to show code with syntax highlighting&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Provider&lt;/code&gt; and &lt;code&gt;Footer&lt;/code&gt;: to put a footer with twitter handles and the slide number at the bottom of every slide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why the footer? It's important to have your twitter handle and the conference twitter handle or hashtag showing at all times if you want to make it easy for folks to tweet your talk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fblog%2Fmdx-fairy-tale-title-slide-with-footer" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fblog%2Fmdx-fairy-tale-title-slide-with-footer" width="760" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On GitHub you can check out the &lt;a href="https://github.com/developermode/mdx-fairy-talk/tree/master/components" rel="noopener noreferrer"&gt;code for all these components&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creative direction
&lt;/h2&gt;

&lt;p&gt;The week of procrastination wasn't entirely unproductive, it turns out. A background process running in my brain stitched together a rough idea of how the talk would work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Story&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tension in the fairy tale's plot would be a dispute between the King and the Princess around what kind of content the kingdom should produce - text-heavy or interactive.&lt;/li&gt;
&lt;li&gt;The kingdom's content team would be called &lt;em&gt;The Royal Academy of Content&lt;/em&gt; and the engineers on that team would save the day.&lt;/li&gt;
&lt;li&gt;A neighboring sovereignty called the JAMstack Kingdom would hold the secret to combining Markdown and JavaScript components 😉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Technology&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;King Markdown and Princess JavaScript will be React components.&lt;/li&gt;
&lt;li&gt;When hovered over, some animation will happen.&lt;/li&gt;
&lt;li&gt;When clicked on, the code for its React component will appear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Props&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Logitech Spotlight will be fastened to the base of the &lt;em&gt;Royal Sceptre&lt;/em&gt; and hidden so the sceptre itself appears to be driving the presentation.&lt;/li&gt;
&lt;li&gt;The Spotlight will trigger the hover and click events on the characters.&lt;/li&gt;
&lt;li&gt;The Spotlight will magnify sections of the code as I explain them.&lt;/li&gt;
&lt;li&gt;The Spotlight will change the props of a React component on the fly, literally "props for changing props".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what the screen looked like with the Royal Sceptre moving the highlight bubble away from King Markdown and toward the code that produced him.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_400%2Fblog%2Fking-markdown-spotlight" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_400%2Fblog%2Fking-markdown-spotlight" width="400" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This effect worked to focus the audience's attention, even in a noisy pub.&lt;/p&gt;
&lt;h2&gt;
  
  
  Live coding
&lt;/h2&gt;

&lt;p&gt;For whatever reason, the challenge of telling a fairy tale with bespoke React components AND animating it with the world's most expensive clicker didn't feel like enough for a 10-minute talk at a bar.&lt;/p&gt;

&lt;p&gt;Surely there had to be some live coding too.&lt;/p&gt;

&lt;p&gt;The live coding ended up on &lt;a href="https://mdx-fairy-tale.developermode.com/16" rel="noopener noreferrer"&gt;Slide 16&lt;/a&gt;. The rendered HTML output and code of an instance of Princess JavaScript is shown side-by-side. Thanks to &lt;a href="https://github.com/FormidableLabs/react-live" rel="noopener noreferrer"&gt;react-live&lt;/a&gt;, changing the code in the editor causes the component to re-render instantly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fvideo%2Fupload%2Fe_loop%2Fv1563708541%2Fblog%2Fprincess-javascript-live-coding-animated.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fvideo%2Fupload%2Fe_loop%2Fv1563708541%2Fblog%2Fprincess-javascript-live-coding-animated.gif" width="720" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn't have time to wire up the Royal Sceptre to type actual characters (it is possible!) so I just used my laptop keyboard to change the values instead.&lt;/p&gt;
&lt;h2&gt;
  
  
  Live drawing?
&lt;/h2&gt;

&lt;p&gt;At one point I was rehearsing with the Royal Sceptre and I thought "wouldn't it be cool if I could draw on the slides just by pointing at them?"&lt;/p&gt;

&lt;p&gt;I had recently come across an elegant implementation of in-browser drawing on the DEV community's offline page and read Ali Spittel's post about how she built it. Thanks Ali!&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/aspittel" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F38627%2F77a2a5e7-603e-41b4-afcc-f7aff468ae2f.jpg" alt="aspittel"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/aspittel/how-to-create-the-drawing-interaction-on-dev-s-offline-page-1mbe" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How to Create the Drawing Interaction on DEV's Offline Page&lt;/h2&gt;
      &lt;h3&gt;Ali Spittel ・ Jul 3 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#art&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;I borrowed the code from &lt;a href="https://codepen.io/aspittel/pen/JaZWvE" rel="noopener noreferrer"&gt;her Codepen&lt;/a&gt;, shoehorned it into a React component, made a few tweaks so that it'd work with the Spotlight pointer*, and boom, it worked!&lt;/p&gt;

&lt;p&gt;I made the whole surface area of the final slide drawable by using this React component as the slide's &lt;a href="https://github.com/jxnblk/mdx-deck/blob/master/docs/layouts.md" rel="noopener noreferrer"&gt;MDX layout&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Drawable&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#ce4999"&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

# Thank you!

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;24px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Click and hold to draw on the page.
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Drawable&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the end of the talk, I pointed the &lt;del&gt;Logitech Spotlight&lt;/del&gt; Royal Sceptre at the screen and underlined the words "Thank you".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fvideo%2Fupload%2Fe_loop%2Fv1563727350%2Fblog%2Fjamstack-london-mdx-drawing-slide.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fvideo%2Fupload%2Fe_loop%2Fv1563727350%2Fblog%2Fjamstack-london-mdx-drawing-slide.gif" width="560" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*In the &lt;a href="https://mdx-fairy-tale.developermode.com/" rel="noopener noreferrer"&gt;published slides&lt;/a&gt;, you can click the mouse and hold to draw. The Spotlight cannot do that. For the real presentation, I modified the code to draw simply on hover, which can be done by waving the Spotlight around with the top button held down.&lt;/p&gt;

&lt;h1&gt;
  
  
  Perform
&lt;/h1&gt;

&lt;p&gt;I'd never tested any of this before a real crowd before. I had no idea where the screen would actually be in the bar and if it would even be possible to point at it without turning my back to the crowd. But this is the &lt;strong&gt;Perform&lt;/strong&gt; phase, with no room for &lt;strong&gt;Panic&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Phil was very kind and let me do some tests when I arrived at the bar. The screen was behind me but not too far. The Royal Sceptre was able to move the highlighter on it. This was good news.&lt;/p&gt;

&lt;p&gt;Then it was go time. I put my laptop down on the bar, plugged in an HDMI cable that was too short, and spoke into the microphone at full volume, making liberal use of the Royal Sceptre. The crowd got into it and we had a lot of fun together.&lt;/p&gt;

&lt;p&gt;On twitter, people said they enjoyed the talk. Yay!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1148832428905115649-337" src="https://platform.twitter.com/embed/Tweet.html?id=1148832428905115649"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1148832428905115649-337');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1148832428905115649&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;And another one here:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1148657668984365056-569" src="https://platform.twitter.com/embed/Tweet.html?id=1148657668984365056"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1148657668984365056-569');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1148657668984365056&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;In the end, pushing through the 4 P's and spending the time to build the talk was definitely worth it. I learned at lot about MDX and MDX deck, and it led to many fun conversations with folks who were curious about how it all worked. That gave me the motivation to write about it here.&lt;/p&gt;

&lt;p&gt;😅😅😅😅&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Is there a conclusion? I hope so.&lt;/p&gt;

&lt;p&gt;The 4 P's framework is horrible, please don't write talks that way.&lt;/p&gt;

&lt;p&gt;The Logitech Spotlight is very cool and I've only scraped the surface of how it can make very interactive presentations when combined with React and MDX.&lt;/p&gt;

&lt;p&gt;Phil and the whole JAMstack Conf crew threw an amazing conference. They're good people. I thank them for selecting my talk and not thinking it was a fake submission.&lt;/p&gt;

&lt;p&gt;There's no video but you can &lt;strong&gt;&lt;a href="https://mdx-fairy-tale.developermode.com/" rel="noopener noreferrer"&gt;see the slides&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/developermode/mdx-fairy-tale" rel="noopener noreferrer"&gt;look at the code&lt;/a&gt;&lt;/strong&gt; to learn about MDX and see how everything in the talk was built.&lt;/p&gt;

&lt;p&gt;If you have a question about MDX, MDX Deck, or (not using) the 4 P's, please ask.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>showdev</category>
    </item>
    <item>
      <title>MDX, authors and richer JAMstack content</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Fri, 31 May 2019 17:25:39 +0000</pubDate>
      <link>https://forem.com/orbit/mdx-authors-and-richer-jamstack-content-3i0f</link>
      <guid>https://forem.com/orbit/mdx-authors-and-richer-jamstack-content-3i0f</guid>
      <description>&lt;p&gt;Thanks to the growth of the JAMstack, developers are building performant and secure websites as quickly as ever. Content creators are benefitting from this renaissance too, but at the same time many authors are reaching the limitations of markdown as an authoring tool. &lt;/p&gt;

&lt;p&gt;The good news is there’s now a better way: a new format called MDX that empowers content creators to &lt;strong&gt;embed dynamic components inside of their markdown&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At the 3rd edition of the &lt;a href="https://jamstack.paris" rel="noopener noreferrer"&gt;JAMstack Paris meetup&lt;/a&gt;, I spoke about how developers can empower their creators with MDX. A big thanks to &lt;a href="https://twitter.com/phacks" rel="noopener noreferrer"&gt;Nicolas Goutay&lt;/a&gt; and &lt;a href="https://twitter.com/matthieuauger" rel="noopener noreferrer"&gt;Matthieu Auger&lt;/a&gt; from &lt;a href="https://www.theodo.fr/" rel="noopener noreferrer"&gt;Theodo&lt;/a&gt; for organizing the meetup and to &lt;a href="https://algolia.com/" rel="noopener noreferrer"&gt;Algolia&lt;/a&gt; for hosting us.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mdx-talk.developermode.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Fw_960%2Fv1559305360%2Fdevelopermode%2Fmdx-talk-title-slide" alt="MDX, authors and richer JAMstack content by Josh Dzielak" width="960" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mdxjs.com/" rel="noopener noreferrer"&gt;MDX&lt;/a&gt; is a relatively new file format that just &lt;a href="https://mdxjs.com/blog/v1" rel="noopener noreferrer"&gt;hit v1 in April&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MDX makes JSX components usable in markdown&lt;/strong&gt;. This allows developers to create rich, interactive components—think forms, polls, charts, layouts and more—which authors can embed elegantly inside of their content.&lt;/p&gt;

&lt;p&gt;Here's what an &lt;code&gt;.mdx&lt;/code&gt; file looks like, using the example of embedding a question &amp;amp; answer poll inline with normal markdown content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Hello, *world*!

This is just markdown here. The JSX is below.

&amp;lt;Poll&amp;gt;
  &amp;lt;Question&amp;gt;What is your favorite language?&amp;lt;/Question&amp;gt;
  &amp;lt;Answer&amp;gt;English&amp;lt;/Answer&amp;gt;
  &amp;lt;Answer&amp;gt;French&amp;lt;/Answer&amp;gt;
  &amp;lt;Answer&amp;gt;JavaScript&amp;lt;/Answer&amp;gt;
&amp;lt;/Poll&amp;gt;

Markdown continues down here.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSX syntax is tag-based like HTML, but the abstractions are higher-level, and developers can choose what JSX components to make available to authors. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers can (and should) design components in a way that makes them easier for even non-technical authors to use.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MDX holds a lot of early promise for making the JAMstack more authorable, a stated goal of the MDX creator:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What I mean by &lt;strong&gt;authorable&lt;/strong&gt; is that it's a format that can be naturally written in by all members of a cross-functional team after some learning - from engineering to marketing." — MDX author &lt;a href="https://twitter.com/john0" rel="noopener noreferrer"&gt;John Otander&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The video of the talk is forthcoming, but for now you can see &lt;a href="https://mdx-talk.developermode.com/" rel="noopener noreferrer"&gt;the talk slides&lt;/a&gt; as well as the &lt;a href="https://github.com/developermode/mdx-talk" rel="noopener noreferrer"&gt;talk source code&lt;/a&gt;, which itself is written in MDX using an excellent slide-making open source project called &lt;a href="https://github.com/jxnblk/mdx-deck" rel="noopener noreferrer"&gt;mdx-deck&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>4 lesser known ways to use Ruby’s Enumerable module</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Wed, 22 May 2019 13:59:53 +0000</pubDate>
      <link>https://forem.com/orbit/4-lesser-known-ways-to-use-ruby-s-enumerable-module-3d8b</link>
      <guid>https://forem.com/orbit/4-lesser-known-ways-to-use-ruby-s-enumerable-module-3d8b</guid>
      <description>&lt;p&gt;A big reason I love Ruby is how much work I can get done in just a few characters or lines of code, and ensuring that code is still easy to read for my peers. One area where this is most apparent is in dealing with arrays and hashes, also known as &lt;strong&gt;enumerables&lt;/strong&gt; in the Ruby world. &lt;/p&gt;

&lt;p&gt;Any object that includes Ruby’s powerful &lt;a href="https://ruby-doc.org/core-2.6.3/Enumerable.html" rel="noopener noreferrer"&gt;Enumerable&lt;/a&gt; module can be iterated over, traversed, manipulated, sliced and diced in various ways. This module’s flexibility leads to surprisingly terse code for complex tasks.&lt;/p&gt;

&lt;p&gt;When &lt;a href="https://blog.heroku.com/ruby-just-in-time-compilation" rel="noopener noreferrer"&gt;Ruby 2.6 arrived in December 2018&lt;/a&gt;, it came with some new methods for Enumerable as well as other improvements to list and sequence handling. In this post, I’ll show you a few capabilities recently added to Ruby’s Enumerable as well as a few old favorites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endless ranges
&lt;/h2&gt;

&lt;p&gt;Ranges are a great Ruby feature that allows you to quickly create iterable ranges from numbers or letters, such as &lt;code&gt;1..10&lt;/code&gt; or &lt;code&gt;('A'..'Z')&lt;/code&gt;. Before Ruby 2.6, the double-dot range syntax required a start and a finish. Now, there’s an intuitive syntax to create these endless ranges—simply omit a final character after the double dots: &lt;code&gt;1..&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Why are endless ranges useful? One obvious use case is as a clean way to generate an ever-growing list of integers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# 1&lt;/span&gt;
&lt;span class="c1"&gt;# 2&lt;/span&gt;
&lt;span class="c1"&gt;# 3&lt;/span&gt;
&lt;span class="c1"&gt;# ...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another unique way to use endless ranges is to use them in concert with other methods chained onto enumerable. In these cases, the range isn’t exactly endless but just ends when the conditions of the chained methods are satisfied. Let’s look at an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [1, 6, 11, 16, 21, 26, 31, 36, 41, 46, …. 491, 496]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What’s happening here? The &lt;code&gt;step(5)&lt;/code&gt; method takes each fifth number from the range, which remains infinite. The &lt;code&gt;take&lt;/code&gt; method takes the first 100 elements of that sequence, which now becomes finite. Using an endless range to begin the expression ensures that the latter part will work for any set of inputs. We could change the 5 or 100 to larger numbers and still get the expected result.&lt;/p&gt;

&lt;p&gt;Tip: Ranges work with letters, too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;'Z'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# ["A", "C", "E", "G", "I", "K", "M", "O", "Q", "S", "U", "W", "Y"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The &lt;code&gt;lazy&lt;/code&gt; keyword
&lt;/h2&gt;

&lt;p&gt;This one isn’t new to Ruby 2.6, but it is powerful and underused. Enumerables support a form of lazy iteration that helps you avoid reading entire files or sets of database records into memory when you might not need to. For example, when you only need to find the first 10 lines in a file that contain the word “jane”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"names.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; 
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/jane/i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although it’s only one extra method, the addition of &lt;code&gt;lazy&lt;/code&gt; after &lt;code&gt;each_line&lt;/code&gt; changes what happens under the hood. The entire file isn’t read into memory, as is what would happen without the lazy keyword. With lazy and &lt;code&gt;first(10)&lt;/code&gt; at the end of the expression, the file is read line by line, but the reading stops as soon as 10 occurrences are found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Range stepping
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;step&lt;/code&gt; method on a range can help you produce a subrange of every 2nd, 3rd, or nth element. Ruby 2.6 brings a bit more power and a new, shorter syntax for stepping.&lt;/p&gt;

&lt;p&gt;First off, a new alias for step is available - &lt;code&gt;%&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [1, 3, 5, 7, 9]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, there are now &lt;code&gt;first&lt;/code&gt; and &lt;code&gt;last&lt;/code&gt; methods that can be called on steps of ranges, which is of type &lt;a href="https://ruby-doc.org/core-2.6.0.preview2/Enumerator/ArithmeticSequence.html" rel="noopener noreferrer"&gt;ArithmethicSequence&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;
&lt;span class="c1"&gt;# 9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  each_cons
&lt;/h2&gt;

&lt;p&gt;When you need to iterate an array of multiple &lt;strong&gt;overlapping&lt;/strong&gt; elements at a time, &lt;code&gt;each_cons&lt;/code&gt; comes in handy. This method produces sub-arrays from consecutive elements similar to slice. However, the first element of the next array is the second element of the previous. This is easiest to see with an example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each_cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;each_cons&lt;/code&gt; takes an integer argument for how large each array should be.&lt;/p&gt;

&lt;p&gt;Because strings are just arrays of characters, &lt;code&gt;each_cons&lt;/code&gt; can be used to do some string processing that might otherwise be tedious. Here’s a fun example to make your strings look extra spooky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arrays and collections are scary"&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:join&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;
&lt;span class="c1"&gt;# "arrrraayyss  aanndd  ccoolllleeccttiioonnss  aarree  ssccaarry"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another, perhaps more useful way to use &lt;code&gt;each_cons&lt;/code&gt; is to keep the previous and next element in context while iterating over a collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;primes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;primes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_cons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; 
  &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is the prime number between &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; and &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;next_&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# "3 is the prime number between 2 and 5"&lt;/span&gt;
&lt;span class="c1"&gt;# "5 is the prime number between 3 and 7"&lt;/span&gt;
&lt;span class="c1"&gt;# "7 is the prime number between 5 and 11"&lt;/span&gt;
&lt;span class="c1"&gt;# "11 is the prime number between 7 and 13"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see another handy Ruby feature happening here: argument destructuring. One array is being passed to the function argument of the &lt;code&gt;each&lt;/code&gt; function, but we can provide three parameters: &lt;code&gt;previous&lt;/code&gt;, &lt;code&gt;current&lt;/code&gt;, and &lt;code&gt;next_&lt;/code&gt; to have Ruby put the 0th, 1st, and 2nd array elements into those variables automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We’ve just scratched the surface of what’s possible with Ruby Enumerables. Hopefully you’ve learned a few tips to tighten up your current or next codebase. Combining endless ranges, stepping, and the lazy keyword can make an entire family of loop processing use cases much easier.&lt;/p&gt;

&lt;p&gt;If you’re interested in learning more about how to level up your Ruby code, I highly recommend the Code[ish] Podcast with Aaron Patterson and this episode about &lt;a href="https://www.heroku.com/podcasts/codeish/2-ruby-regexes-and-risk-aaron-patterson-explains-why-hiring-open-source-developers-will-make-your-company-stronger" rel="noopener noreferrer"&gt;Ruby Regexes and How open source developers will make your company stronger&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>devtips</category>
    </item>
    <item>
      <title>World Celebrates International Developer Relations Day</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Mon, 01 Apr 2019 12:57:55 +0000</pubDate>
      <link>https://forem.com/orbit/world-celebrates-international-developer-relations-day-nej</link>
      <guid>https://forem.com/orbit/world-celebrates-international-developer-relations-day-nej</guid>
      <description>&lt;p&gt;San Francisco, CA, April. 1, 2019 — Today the world recognizes developer advocates, evangelists and everybody else on the "DevRel" team no matter what crazy title they have.&lt;/p&gt;

&lt;p&gt;What is developer relations? The most widely recognized definition comes from the movie &lt;em&gt;Gladiator&lt;/em&gt; (2000):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"There was a dream that was DevRel. You could only whisper it. Anything more than a whisper and it would vanish, it was so fragile."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Ff_auto%2Cq_auto%2Cw_600%2Cc_scale%2Fw_400%2Fdevelopermode%2Fare-you-not-entertained" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Ff_auto%2Cq_auto%2Cw_600%2Cc_scale%2Fw_400%2Fdevelopermode%2Fare-you-not-entertained" alt="Are you not entertained?" width="400" height="249"&gt;&lt;/a&gt;&lt;/p&gt;
Closing keynote @ Web Summit 2018



&lt;p&gt;Over 3 billion developers have gathered at meetups, conferences and hackathons around the world to cheer on their favorite advocates, and then to ask them support questions.&lt;/p&gt;

&lt;p&gt;Several major airlines have partnered to give DevRels free first-class upgrades today as they fly to and from their speaking engagements, homes and offices. You didn't think they'd get the day off, did you?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbukpvsvx6ar8zy7d0mx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbukpvsvx6ar8zy7d0mx.gif" alt="Clinking cheers in first class" width="400" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Earlier today, several vice presidents of innovative developer-facing companies issued a joint statement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Today, we're just going to assume the business value of DevRel."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This elicited an enormously positive response from developer relations practitioners worldwide, who instantly closed files like &lt;code&gt;ATTENDEES_COUNT.xls&lt;/code&gt; and &lt;code&gt;CONFERENCE_QUALIFIED_LEADS.csv&lt;/code&gt;, then shut their laptops and took the elevator down to the lobby bar to celebrate.&lt;/p&gt;

&lt;p&gt;Several developer advocates were contacted for this story but curiously all of them responded with the same message: &lt;em&gt;Out Of Office: Traveling&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;One advocate did reply a few minutes later and apologized, admitting that she was not actually traveling this week but just needed to go one consecutive 24-hour period this year without talking to anyone.&lt;/p&gt;

&lt;p&gt;Teammates from marketing, sales, engineering, business development, product, customer success, human resources and operations came together to celebrate their company's DevRels today, whom they work with on a regular basis. This turned out to be an effective team-building activity as most of those people had never met before.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Ff_auto%2Cq_auto%2Cw_700%2Cc_scale%2Fw_400%2Fdevelopermode%2Fmuch-success-to-you" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdzello%2Fimage%2Fupload%2Ff_auto%2Cq_auto%2Cw_700%2Cc_scale%2Fw_400%2Fdevelopermode%2Fmuch-success-to-you" alt="Lisa Kudrow bowing" width="400" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How can you help celebrate International Developer Relations Day? It's easy.&lt;/p&gt;

&lt;p&gt;If you're on the product or engineering team, just this once you can assume that the feedback gathered by your DevRels from the community is, in fact, valid feedback.&lt;/p&gt;

&lt;p&gt;If you're on the marketing team, consider taking 90 minutes next week to explain how the navigation inside of Google Analytics works. &lt;/p&gt;

&lt;p&gt;If you're in sales, it's easy, just batch up your introduction requests instead of making them one at a time, and under no circumstances ever send a whitepaper to a developer.&lt;/p&gt;

&lt;p&gt;If you're a designer or developer that uses the service that your friendly neighborhood DevRel works for, consider holding off on that request for 400% more free quota until next quarter so you don't skew the metrics that their bonus depends on. Maybe also pay their company money someday.&lt;/p&gt;

&lt;p&gt;If you are a conference lanyard, please stop twisting around and facing the wrong way.&lt;/p&gt;

&lt;p&gt;If you follow a DevRel on twitter, please do not reply to their tweets with "Hot Take" or "Unpopular Opinion". Avoid doing that today and also for the rest of your life, which will be longer.&lt;/p&gt;

&lt;p&gt;If you're a manager of a DevRel individual or team, please add an emoji to the calendar invite for your 1:1 meetings, preferably 🤗 or 🙏.&lt;/p&gt;

&lt;p&gt;How should you celebrate International Developer Relations Day if you yourself are a DevRel?&lt;/p&gt;

&lt;p&gt;Developer Advocate &lt;a href="https://twitter.com/jessicaewest" rel="noopener noreferrer"&gt;Jessica West&lt;/a&gt; recommends that you "Go purchase mini bottles of wine and visit a high rise to pretend like you're on a plane".&lt;/p&gt;

&lt;p&gt;Director of Developer Relations &lt;a href="https://twitter.com/elof" rel="noopener noreferrer"&gt;Justin Johnson&lt;/a&gt; encourages advocates to "Take that money you were going to spend on another .dev domain and buy a plate of tacos instead."&lt;/p&gt;

&lt;p&gt;The team at DeveloperMode hopes you'll take today to think about what you need in order to be happy and successful.&lt;/p&gt;

&lt;p&gt;Sleep. A lot. Take breaks. Tweet or don't tweet. Sprawl when you're in the airport lounge—that's what those jumbo 1-person couches are for. Don't burn out - burn in. Be proud, but stay humble. Don't drop the mic after your talk no matter how loud the audience is clapping. Microphones are expensive and you won't get invited back next year if you break one.&lt;/p&gt;

&lt;p&gt;Happy International Developer Relations Day. You've earned it.&lt;/p&gt;




&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1112699389217329153-804" src="https://platform.twitter.com/embed/Tweet.html?id=1112699389217329153"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1112699389217329153-804');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1112699389217329153&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>career</category>
      <category>devrel</category>
      <category>april1</category>
    </item>
    <item>
      <title>How to use the new github.dev personal website generator</title>
      <dc:creator>Josh Dzielak 🔆</dc:creator>
      <pubDate>Mon, 25 Feb 2019 15:18:13 +0000</pubDate>
      <link>https://forem.com/orbit/how-to-use-the-new-githubdev-personal-website-generator-1fde</link>
      <guid>https://forem.com/orbit/how-to-use-the-new-githubdev-personal-website-generator-1fde</guid>
      <description>&lt;p&gt;&lt;a href="https://github.dev" rel="noopener noreferrer"&gt;github.dev&lt;/a&gt; is a new community project by GitHub that lives on the &lt;a href="https://domains.google/tld/dev/" rel="noopener noreferrer"&gt;.dev TLD&lt;/a&gt;. With it, you can fork, customize and deploy a personal site that shows your GitHub bio and contributions, powered by the &lt;a href="https://developer.github.com/v3/" rel="noopener noreferrer"&gt;GitHub API&lt;/a&gt;, &lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;, and &lt;a href="https://jekyllrb.com/" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's my page: &lt;a href="https://dzello.github.io/" rel="noopener noreferrer"&gt;dzello.github.io&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Personally, I like this project because it gives developers an alternative way to showcase their coding talents and interests, beyond just their GitHub profile page, which some developers in the community have &lt;a href="https://twitter.com/emmawedekind/status/1099235211555074048" rel="noopener noreferrer"&gt;raised good questions about&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you already know how to fork a repo and use the command line, I can show you how to get your own github.dev instance up and running in about 10 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz1tt943lwc7iu0wv7ni.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz1tt943lwc7iu0wv7ni.webp" alt="Ryan Gosling saying ok" width="500" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Point a browser window to the &lt;a href="https://github.com/github/personal-website" rel="noopener noreferrer"&gt;github/personal-website&lt;/a&gt; repository.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the Fork button to make a copy of the repository in your account&lt;/li&gt;
&lt;li&gt;Go to the Settings tab and rename the repository to &lt;code&gt;{username}.github.io&lt;/code&gt;, substituting &lt;code&gt;{username}&lt;/code&gt; for your GitHub username&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repositories named &lt;code&gt;{username}.github.io&lt;/code&gt; do something really unique on GitHub. Their contents (specifically the _site folder) will automatically be deployed to a GitHub Pages URL and become available as a browsable website at this address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;https://&lt;span class="o"&gt;{&lt;/span&gt;username&lt;span class="o"&gt;}&lt;/span&gt;.github.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is unfortunately not on the new github.dev domain itself, but I do hope the project's name implies a plan for that 🤓.&lt;/p&gt;

&lt;p&gt;Before the site appears, however, you need to push at least one commit to the repo after renaming it. We'll do that in the following steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run locally
&lt;/h2&gt;

&lt;p&gt;As a prerequisite, &lt;a href="https://jekyllrb.com/docs/installation/" rel="noopener noreferrer"&gt;install Ruby&lt;/a&gt; if you don't have it already.&lt;/p&gt;

&lt;p&gt;First, clone your new repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:&lt;span class="o"&gt;{&lt;/span&gt;username&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;username&lt;span class="o"&gt;}&lt;/span&gt;.github.io.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, &lt;code&gt;cd&lt;/code&gt; into the repository and install Jekyll and dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;username&lt;span class="o"&gt;}&lt;/span&gt;.github.io
gem &lt;span class="nb"&gt;install &lt;/span&gt;jekyll bundler
bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you're ready to start up the site.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;exec &lt;/span&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browse to &lt;a href="http://localhost:4000" rel="noopener noreferrer"&gt;http://localhost:4000&lt;/a&gt; and you should see a page with your name, profile photo and public repositories. This data is already present thanks to the &lt;a href="https://github.com/jekyll/github-metadata#authentication" rel="noopener noreferrer"&gt;github-metadata Jekyll plugin&lt;/a&gt; and the &lt;a href="https://github.com/github/pages-gem" rel="noopener noreferrer"&gt;GitHub pages gem&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customization
&lt;/h2&gt;

&lt;p&gt;No further customization is required (feel free to skip down to #deployment), but do I recommend at least changing your interests so that your page accurately reflects who you are.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your interests
&lt;/h3&gt;

&lt;p&gt;By default, github.dev assumes you are interested in CSS, Web Design, and Sass. But what if you prefer PostCSS or are not actually a devsigner? Don't worry, it's easy to change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdx386c18zoct6rkyx62.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdx386c18zoct6rkyx62.gif" alt="Red easy button" width="220" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open up &lt;code&gt;_config.yml&lt;/code&gt; with your favorite text editor and find the &lt;code&gt;topics&lt;/code&gt; section. Make changes to the YAML to add, update and remove topics. Here's how you would add the &lt;a href="https://github.com/topics/awesome" rel="noopener noreferrer"&gt;awesome topic&lt;/a&gt; for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;topics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;awesome&lt;/span&gt;
    &lt;span class="na"&gt;web_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/topics/awesome&lt;/span&gt;
    &lt;span class="na"&gt;image_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://raw.githubusercontent.com/github/explore/c304601f028774885ef27f72e6fe2d331729d8bc/topics/awesome/awesome.png&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit the &lt;a href="https://github.com/topics" rel="noopener noreferrer"&gt;GitHub topics&lt;/a&gt; page to see what other interests you can add.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After you make changes to &lt;code&gt;_config.yml&lt;/code&gt;, you will need to stop Jekyll and restart it before they appear.&lt;/strong&gt; Changes to other files, however, should just require a page refresh.&lt;/p&gt;

&lt;h3&gt;
  
  
  Show popular repos first (optional)
&lt;/h3&gt;

&lt;p&gt;By default, repositories are sorted alphabetically. If instead you want your most-starred repos to be shown instead, you can make a change to the &lt;code&gt;_includes/projects.html&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"d-sm-flex flex-wrap gutter-condensed mb-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {% assign sorted_repositories = site.github.public_repositories | sort: 'watchers_count' | reverse %}
  {% for repository in sorted_repositories limit:6 %}
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"col-sm-6 col-md-12 col-lg-6 col-xl-4 mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {% include repo-card.html %}
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  {% endfor %}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is the &lt;code&gt;sort: 'watchers_count'&lt;/code&gt; and &lt;code&gt;reverse&lt;/code&gt;. There are other fields you can display or sort by too, see the documentation for the &lt;a href="https://github.com/jekyll/github-metadata" rel="noopener noreferrer"&gt;github-metadata jekyll plugin&lt;/a&gt;. You can also limit the total number of repositories shown, which I am doing above with &lt;code&gt;limit: 6&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔦 Dark mode (optional)
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;_config.yml&lt;/code&gt;, you can set &lt;code&gt;style: dark&lt;/code&gt;. This will make your visitors' faces glow less while they are reading your site at night.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/github/personal-website#customization" rel="noopener noreferrer"&gt;customization section&lt;/a&gt; of the README contains several more ways to really make your site your own. You can even add a blog, too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevn0sngc0cl8vs7vl1f7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevn0sngc0cl8vs7vl1f7.gif" alt="Mine mine mine GIF" width="498" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;Each time you push new commits to GitHub, your site will be built and deployed to &lt;code&gt;https://{username.github.io}/&lt;/code&gt;. At least one &lt;code&gt;git push&lt;/code&gt; is required before the site is deployed for the first time.&lt;/p&gt;

&lt;p&gt;Assuming you made some changes to your interests in the &lt;code&gt;_config.yml&lt;/code&gt; file, here's what you should do.&lt;/p&gt;

&lt;p&gt;Add and commit your changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add _config.yml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'Updated my interests'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then push them up to GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait a few minutes and your site should be live at &lt;code&gt;https://{username}.github.io/&lt;/code&gt;. 🎉 &lt;/p&gt;

&lt;p&gt;You can confirm this in the environment tab on the GitHub repo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xe3r0e101no0uzr48vs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xe3r0e101no0uzr48vs.png" alt="Text that says deployed to github-pages" width="800" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Troubleshooting: if for some reason the site doesn't load after a few minutes, try the URL &lt;code&gt;https://{username}.github.io/index.html&lt;/code&gt; instead. If that works, there may have been a caching issue, and you'll just need to wait a bit before you can access the site without the &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Congratulations!
&lt;/h2&gt;

&lt;p&gt;Are you excited about your new site? ✨ Drop in a comment below and let's see it! Tell us about any customizations that you made that others might want to try too.&lt;/p&gt;

&lt;p&gt;That's it for the tutorial. If you want to see more sites and community projects making their home on the new .dev domain, check out &lt;a href="https://github.com/developermode/awesome-dot-dev" rel="noopener noreferrer"&gt;awesome-dot-dev&lt;/a&gt; ⭐.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>github</category>
      <category>top7</category>
      <category>ruby</category>
    </item>
  </channel>
</rss>
