<?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>DEV Community: Chris Manson</title>
    <description>The latest articles on DEV Community by Chris Manson (@real_ate).</description>
    <link>https://dev.to/real_ate</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%2F102486%2F3115603a-c1af-4dd9-9722-d50ede8e2563.jpg</url>
      <title>DEV Community: Chris Manson</title>
      <link>https://dev.to/real_ate</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/real_ate"/>
    <language>en</language>
    <item>
      <title>It's all Gravy</title>
      <dc:creator>Chris Manson</dc:creator>
      <pubDate>Tue, 02 Nov 2021 21:28:42 +0000</pubDate>
      <link>https://dev.to/real_ate/its-all-gravy-42a6</link>
      <guid>https://dev.to/real_ate/its-all-gravy-42a6</guid>
      <description>&lt;p&gt;Anyone that knows me will already know that I do a lot of Open Source development. I’ve been positively Open Source obsessed for over 15 years now and enjoy working on Open Source so much that I often describe it as a hobby and regularly work on it in my evenings and weekends.&lt;/p&gt;

&lt;p&gt;One of the things that I like to do is to encourage people to contribute to Open Source, leading projects within the Ember community as part of my role on the Ember Core Learning Team and regularly end up "assigning" people work as part of those projects. Sometimes I have a mentoring-style relationship with people where we would meet every week to discuss the work that they have been doing and see if there is anything I can do to unblock them. Invariably I will always have someone say in one of these calls that they are “really sorry but I haven’t been able to do any work on the task this week”. I have always told them the same thing, and for the longest time, I have also told them that I really need to write down my thoughts in a blog post so that I can just send people the link when it comes up. This is that blog post!&lt;/p&gt;

&lt;h2&gt;
  
  
  You have already gone above and beyond
&lt;/h2&gt;

&lt;p&gt;The conversation that I have with people when they haven't been able to get their "assigned task" done in the context of Open Source usually goes a little something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are doing this work as part of your free time. You have already done something for this project which is already going above and beyond, anything you do past this point is all gravy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even if the person had never written a line of code/documentation/configuration etc. and have just had a conversation about an issue, they have already done more than expected because they were never &lt;strong&gt;expected&lt;/strong&gt; to do anything. We always need to keep in mind that most open source contributions are given from people that are opting to give up their spare time (usually for free) and the level of expectation can never come anywhere close to the sort of relationship that an employer might have with an employee or contractor.&lt;/p&gt;

&lt;p&gt;When planning in an Open Source context I never have any expectation that anyone will complete any task they say that they do, even if they say they are working on it right now and &lt;strong&gt;guarantee&lt;/strong&gt; that it will be done by 5pm tonight. Even when I’m talking to colleges of mine who also happen to work in a company that provides 20% time to work on open source, I never feel bad if they don’t do something they said they would. Open source is an amorphous anarchy of projects that are usually driven by people’s interests and passions so any of the regular project management expectations don’t apply here.&lt;/p&gt;

&lt;p&gt;If you say you are going to do something don’t feel bad if you don’t get it done, it is never a problem.&lt;/p&gt;




&lt;p&gt;This post was originally posted on my personal blog &lt;a href="https://chris.manson.ie/it's-all-gravy/"&gt;https://chris.manson.ie/it's-all-gravy/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ember</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Is there a place for dev.to developers to chat?</title>
      <dc:creator>Chris Manson</dc:creator>
      <pubDate>Mon, 12 Aug 2019 09:14:39 +0000</pubDate>
      <link>https://dev.to/real_ate/is-there-a-place-for-dev-to-developers-to-chat-5gdn</link>
      <guid>https://dev.to/real_ate/is-there-a-place-for-dev-to-developers-to-chat-5gdn</guid>
      <description>&lt;p&gt;I've recently cloned the dev.to codebase to try and contribute and help with &lt;a href="https://github.com/thepracticaldev/dev.to/issues/3675"&gt;an issue that I discoverd&lt;/a&gt; but I'm wondering... where are all the developers!? 🤔&lt;/p&gt;

&lt;p&gt;Maybe it's just that I'm a bit spoiled by the Ember Community having a very active &lt;a href="https://emberjs.com/community/"&gt;Community Discord Server&lt;/a&gt; but I figured the right place to ask would be on dev.to itself 🎉&lt;/p&gt;

&lt;p&gt;So folks, if I want to learn how to contribute where should I go to hang out with like-minded individuals? I did find a wonderful &lt;a href="https://dev.to/devteam/devto-open-source-helpdiscussion-thread-v0-1l45"&gt;thread to help people with issues&lt;/a&gt; but I'm more so looking for the &lt;strong&gt;discussion&lt;/strong&gt; aspect rather than the "I have a problem can you help me fix it" sort of thread.&lt;/p&gt;

</description>
      <category>question</category>
      <category>meta</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The True Power of JSON:API - Have Someone Else Do It</title>
      <dc:creator>Chris Manson</dc:creator>
      <pubDate>Thu, 27 Jun 2019 06:47:35 +0000</pubDate>
      <link>https://dev.to/real_ate/the-true-power-of-json-api-have-someone-else-do-it-h9h</link>
      <guid>https://dev.to/real_ate/the-true-power-of-json-api-have-someone-else-do-it-h9h</guid>
      <description>&lt;p&gt;This post is going to try to show the true power of using a standard way to define your APIs and how to use JSON:API as an "anti-bikeshedding weapon". I will start with a bit of the theory, trying to explore why this is a good idea in the first place and then I will show you our solution for building standard JSON:API servers in a very short amount of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Theory
&lt;/h2&gt;

&lt;p&gt;It's best to start off with a definition of what JSON:API is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;JSON API is a specification for how a client should request resources for fetching or modification, and how a server should respond to those requests.&lt;/p&gt;

&lt;p&gt;JSON API is designed to minimise both the number of requests and the amount of data transmitted between clients and servers. This efficiency is achieved without compromising readability, flexibility, or discoverability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A lot of my understanding of the &lt;em&gt;why&lt;/em&gt; of JSON:API comes from a video of a talk given by Steve Klabnik at API Days Paris. I have embedded the video below because I &lt;strong&gt;highly recommend&lt;/strong&gt; you watch the whole thing to understand why this is such an important topic.&lt;/p&gt;


  &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Foi54om6oGQ"&gt;
&lt;/iframe&gt;

  &lt;em&gt;Steve Klabnik speaking about JSON:API at APIDays Paris&lt;/em&gt;


&lt;p&gt;It's difficult to distil this video down because there are so many important things that Steve says throughout the discussion and a lot of the value in what he is saying is the way that he puts these things in context.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;when you create unique, individual, snowflake, bespoke, hipster models of communication […]&lt;br&gt;
they’re not useful because only a few people know about them&lt;/p&gt;

&lt;p&gt;when you want to communicate with people, you want to communicate with as many as possible&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I particularly liked the part in the video where Steve mentions the specific challenges that software consultancies face when working with clients that have bespoke designed APIs&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you work for a consultancy and you’re building APIs for your clients on a regular basis:&lt;br&gt;
sometimes [it feels] very much like groundhog day, you’re doing the same thing over and over and&lt;br&gt;
over again. So if you’re building APIs over and over and over again, you know that that’s just a&lt;br&gt;
new fresh chance to argue over HTTP semantics with your entire team for a couple of weeks.&lt;/p&gt;

&lt;p&gt;I make choices that make you do more work, you make choices that make them do more work [...] it&lt;br&gt;
all goes around, and we just bill our hours&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An antidote to this whole process is for us to decide up-front that we are going to use one of the standard definitions of an API and for us to focus our time and energy on building applications and services for our clients.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you have a web page that describes the HTTP semantics and the structure of your JSON, you&lt;br&gt;
can’t waste 2 weeks of development time arguing about if you should use camelCase or underscores&lt;br&gt;
in your identifiers, or whether or not you should be name-spacing your model data, or whether or&lt;br&gt;
not posting this URL should or should not create whatever&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fr8w8ir19tdn0mr7ovhsb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fr8w8ir19tdn0mr7ovhsb.jpg"&gt;&lt;/a&gt;
  &lt;em&gt;Balint Erdi speaking at &lt;a href="https://www.youtube.com/watch?v=kPxiiAGMSzE" rel="noopener noreferrer"&gt;EmberConf 2107&lt;/a&gt;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;One of the other important points that I think has not been mentioned enough in the wider JSON:API discussion is that you are not supposed to work with JSON:API serialisation directly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The point is not that I want each of you to go and re-implement the specification. I want one of&lt;br&gt;
you to be the sacrificial lamb to re-implement the specification, and then everyone else can just&lt;br&gt;
use the fruits of their labour.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When it comes to &lt;a href="https://emberjs.com" rel="noopener noreferrer"&gt;EmberJS&lt;/a&gt; we can directly talk to any JSON:API server implementation without any configuration on the client side. One of the issues is that there are not enough JSON:API compliant servers out there, and that's what we're hopefully going to change in the next section.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Practice
&lt;/h2&gt;

&lt;p&gt;The goal of this post is to get you up and running with a fully functional JSON:API backend in less than five minutes (depending on your network speed for npm install). There will be a few things to install, but by the end of this you will have a production-ready system ready to deploy. Let's get started!&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup a database
&lt;/h3&gt;

&lt;p&gt;You will need a &lt;a href="https://www.mongodb.com" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt; database before we get started. There are many reasons why we based this system on MongoDB, but I will save that discussion for another blog post. I used to recommend that people go to &lt;a href="https://mlab.com/" rel="noopener noreferrer"&gt;mLab&lt;/a&gt; to get their database because they provide a free online sandbox databases, but now MongoDB themselves have come out with a product called &lt;a href="https://www.mongodb.com/cloud/atlas" rel="noopener noreferrer"&gt;MongoDB Atlas&lt;/a&gt; which is quite good and I use myself.&lt;/p&gt;

&lt;p&gt;You will need to create a database and create a user with write permissions to that database. Both mLab and MongoDB have comprehensive documentation on how to do this process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install NodeJS
&lt;/h3&gt;

&lt;p&gt;This backend runs on NodeJS, and we recommend that you use the latest LTS version 10.x when developing your backend. You can download node for your system directly from the &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;NodeJS website&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Yeoman and the generator
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://yeoman.io/" rel="noopener noreferrer"&gt;Yeoman&lt;/a&gt; is a tool for easily generating project scaffolding. To check if you have Yeoman already installed, run &lt;code&gt;yo --version&lt;/code&gt; on the command line, otherwise install it globally via npm:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g yo
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Next, we need to install the Yeoman generator we will use to scaffold our backend. It is the same generator we use to start building &lt;a href="https://authmaker.com" rel="noopener noreferrer"&gt;Authmaker&lt;/a&gt; compatible backends, but we will not be using any of the Authmaker services for this quick introduction so we can remove/ignore anything that is Authmaker specific.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g @authmaker/generator-express
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Generate your backend app
&lt;/h3&gt;

&lt;p&gt;Next step is to generate your backend&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir my-app-backend
cd my-app-backend
yo @authmaker/express
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The generator will prompt you for a database connection string, most of which will be provided by mLab or MongoDB Atlas in their web interface. You will need to make sure the username and password are correct (Remember that the username and password are for the database user you created, not your &lt;strong&gt;personal&lt;/strong&gt; mLab or MongoDB Atlas credentials). This information will be added to a non-git-tracked file &lt;code&gt;settings/secure.json&lt;/code&gt; and you should make sure that you never commit this file.&lt;/p&gt;

&lt;p&gt;The generator will also create two example files for reference, &lt;code&gt;models/example.js&lt;/code&gt; (a model) and &lt;code&gt;server/routes/v1/example.js&lt;/code&gt; (a route). You can use these for reference and eventually delete them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define your schema
&lt;/h3&gt;

&lt;p&gt;One of the reasons we are using MongoDB in this setup is because we want to be able to define our &lt;strong&gt;models&lt;/strong&gt; using &lt;a href="http://mongoosejs.com/index.html" rel="noopener noreferrer"&gt;Mongoose&lt;/a&gt;. This will allow us to define how we want to interact with our database while also providing just enough information for us to auto-generate a full CRUD (Create, Retrieve, Update and Delete) system for our API.&lt;/p&gt;

&lt;p&gt;Let's say we are working on a blog and need to perform CRUD actions on posts. In the &lt;code&gt;models&lt;/code&gt; folder, create &lt;code&gt;post.js&lt;/code&gt; and define the schema for the &lt;strong&gt;post&lt;/strong&gt; model as shown below. You can use the generated file &lt;code&gt;models/example.js&lt;/code&gt; for formatting reference and rename it to &lt;code&gt;post.js&lt;/code&gt; to get started.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// models/post.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Create your routes
&lt;/h3&gt;

&lt;p&gt;The package that will ultimately generate the JSON:API compliant routes for you is&lt;br&gt;
&lt;a href="https://github.com/stonecircle/express-autoroute-json" rel="noopener noreferrer"&gt;express-autoroute-json&lt;/a&gt;. It has already been installed by the project generator so you don't need to install it again. Instead of defining the direct behaviour of your API, you interact with &lt;code&gt;express-autoroute-json&lt;/code&gt; using declarative configuration blocks &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, and &lt;code&gt;delete&lt;/code&gt; that define the specific business-logic of your API.&lt;/p&gt;

&lt;p&gt;By including the block &lt;code&gt;find: {}&lt;/code&gt; in your route file, &lt;code&gt;express-autoroute-json&lt;/code&gt; will generate fully functioning 'Find All' and 'Find By Id' endpoints for accessing your database - no configuration needed.&lt;/p&gt;

&lt;p&gt;Using the &lt;code&gt;server/routes/v1/example.js&lt;/code&gt; file as a guide, create a new file to define the routes for the &lt;code&gt;post&lt;/code&gt; model we created in the previous step:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server/routes/v1/post.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;autorouteJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express-autoroute-json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../../models&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;autoroute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;autorouteJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// default CRUD&lt;/span&gt;
  &lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&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;p&gt;The above example is the most basic implementation of route creation with &lt;code&gt;express-autoroute-json&lt;/code&gt;. Upon starting your backend application, it will automatically generate dedicated routes for all CRUD actions on posts. Making a GET request to &lt;code&gt;/posts&lt;/code&gt; or &lt;code&gt;/posts/1&lt;/code&gt; will now return the appropriate data from your database.&lt;/p&gt;

&lt;p&gt;Additionally, you can limit your route definitions to certain request types.&lt;br&gt;
&lt;code&gt;express-autoroute-json&lt;/code&gt; will only generate the route types that you explicitly define. To completely forbid a particular request type, such as DELETE, simply omit the entire block &lt;code&gt;delete: {}&lt;/code&gt; from your route file.&lt;/p&gt;

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

&lt;p&gt;I have been working very hard to distil the essence of EmberJS' "&lt;a href="https://emberjs.com" rel="noopener noreferrer"&gt;zero configuration productivity&lt;/a&gt;" into &lt;code&gt;express-autoroute-json&lt;/code&gt; so that you can start being productive very quickly. I have worked on this platform for over four years, and it is currently powering some reasonably large APIs in production right now.&lt;/p&gt;

&lt;p&gt;I wanted to leave this post on something that Steve Klabnik said in his talk that resonates with everything that I'm trying to achieve with &lt;a href="https://authmaker.com" rel="noopener noreferrer"&gt;Authmaker&lt;/a&gt; and in many of the other open source projects I'm working on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop building super custom APIs! Check out one of the custom formats that we’ve all been&lt;br&gt;
developing, pick one and just use it. Build shared tooling to stop wasting everyone’s time and&lt;br&gt;
let’s build cool stuff to do neat things.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;This is a re-post of a &lt;a href="https://chris.manson.ie/the-true-power-of-json:api-have-someone-else-do-it/" rel="noopener noreferrer"&gt;blog on my personal site&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ember</category>
      <category>node</category>
      <category>javascript</category>
      <category>jsonapi</category>
    </item>
  </channel>
</rss>
