<?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: hyper</title>
    <description>The latest articles on DEV Community by hyper (@hyper).</description>
    <link>https://dev.to/hyper</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%2F582423%2F7d2fa049-db91-4f4f-98aa-13ec7dc589b9.png</url>
      <title>DEV Community: hyper</title>
      <link>https://dev.to/hyper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hyper"/>
    <language>en</language>
    <item>
      <title>Introducing Hyper {Nano}: Hyper Cloud in a Bottle ⚡️</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Mon, 02 May 2022 13:00:02 +0000</pubDate>
      <link>https://dev.to/hyper/introducing-hyper-nano-hyper-cloud-in-a-bottle-2ldd</link>
      <guid>https://dev.to/hyper/introducing-hyper-nano-hyper-cloud-in-a-bottle-2ldd</guid>
      <description>&lt;p&gt;In &lt;a href="https://blog.hyper.io/clean-architecture-at-hyper/"&gt;my previous post about Clean Architecture at Hyper&lt;/a&gt;, I briefly mentioned Hyper Nano.&lt;/p&gt;

&lt;p&gt;In this post, i’d like to focus on Hyper Nano, and how you can use it to build awesome applications using the Hyper Service Framework and &lt;a href="https://dashboard.hyper.io"&gt;Hyper Cloud&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are currently offering &lt;a href="https://calendly.com/hyper-cloud/hyper-cloud-technical-tour"&gt;hyper cloud tours&lt;/a&gt; and a free &lt;a href="https://calendly.com/hyper-cloud/chat-with-an-architect"&gt;Architecture Consultation&lt;/a&gt;, If you think we could help you build your next great project, let us know!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  What is Hyper Nano
&lt;/h4&gt;

&lt;p&gt;At discussed in my previous post, &lt;a href="https://github.com/hyper63/hyper/tree/main/images/nano"&gt;Hyper Nano&lt;/a&gt; is the compiled Hyper Service Framework using a set of “local development” adapters, that allows Hyper to be run locally, is simple to spin up and simple to blow away.&lt;/p&gt;

&lt;p&gt;It currently is running the following Hyper Services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-pouchdb"&gt;PouchDB&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;cache (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-sqlite"&gt;Sqlite&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;storage (powered by your local &lt;a href="https://github.com/hyper63/hyper-adapter-fs"&gt;file system&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;search (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-minisearch"&gt;Sqlite and Minisearch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;queue (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-queue"&gt;DnDB and an in-memory queue&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Usage
&lt;/h4&gt;

&lt;p&gt;You can find usage documentation in the &lt;a href="https://github.com/hyper63/hyper/tree/main/images/nano"&gt;README&lt;/a&gt;, but I wanted to highlight some key features here.&lt;/p&gt;

&lt;p&gt;Hyper Nano supports “bootstrap” and “purge” options. Bootstrap can be used to create hyper services on startup. Purge can be used to destroy services on startup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This will require the --experimental flag to be set.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can read about how to use these features &lt;a href="https://github.com/hyper63/hyper/tree/main/images/nano#bootstrapping-services"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Given this, here are some common workflows you can enable with Hyper Nano.&lt;/p&gt;

&lt;h4&gt;
  
  
  Workflows
&lt;/h4&gt;

&lt;p&gt;Here are some common workflows you can enable with Hyper Nano when building applications with Hyper. I will assume the Hyper Nano binary was downloaded and named hyper-nano and your application domain is named foo-app&lt;/p&gt;

&lt;p&gt;I will also list some pros and cons of each approach (Tyler’s opinion), and share the workflow we use at hyper every day, to build hyper.&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Development with Persistent Services
&lt;/h4&gt;

&lt;p&gt;This is the the most common workflow. You are developing your app, using Hyper as a services tier, on your own machine using localhost, and you'd like to have a persistent set of services. This would be like running Postgres, Redis, Elasticsearch, etc. using docker-compose and mounting volumes onto each, so that the data persist across containers.&lt;/p&gt;

&lt;p&gt;First you would download a hyper binary.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You would most likely not include the hyper binary or it’s files in __hyper__ under source control, just like you wouldn't commit a local database to source control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You would start Hyper Nano using ./hyper-nano which would start it listening on port 6363. As a one time setup, you would create the Hyper Services you needed, either using the REST api or hyper-connect. Then your application would consume those services using hyper-connect passing &lt;a href="http://localhost:6363/foo-app."&gt;http://localhost:6363/foo-app.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively you could pass flags to bootstrap those services ie. ./hyper-nano --experimental --data --cache --domain=foo-app which will create the database and cache service, and noop if they already exist.&lt;/p&gt;

&lt;p&gt;After the initial setup any time you wanted to start developing, you would just start Hyper Nano with ./hyper-nano and develop away.&lt;/p&gt;

&lt;p&gt;If you ever wanted to wipe all the data, you could either use the REST api, hyper-connect, or just simply delete the __hyper__ folder used to store data in Hyper Nano. You would then need to recreate those services again, just like if you deleted a database, and had to recreate it.&lt;/p&gt;

&lt;p&gt;For data, You would either seed the services or gradually build data up in the persistent services aka. no local seed data required&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is most familiar development workflow for most folks&lt;/li&gt;
&lt;li&gt;Sandboxed to localhost&lt;/li&gt;
&lt;li&gt;Doesn’t require internet connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual steps to create and remove services that aren’t needed when using Hyper Cloud&lt;/li&gt;
&lt;li&gt;If the data in the services becomes corrupted, a common occurrence during feature development, and there is no seed data being used. You have to manually correct it, or wipe the data away and build it up again.&lt;/li&gt;
&lt;li&gt;Each new feature uses the same Hyper service instances aka. &lt;strong&gt;No feature sandbox&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Must maintain a runtime on local ie. Node, Yarn, Deno, installing dependencies, cross versions, etc.&lt;/li&gt;
&lt;li&gt;Each developer must do these steps to set up a local environment, which could cause divergence aka. “it works on my machine” scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Local Development Using Ephemeral Services
&lt;/h4&gt;

&lt;p&gt;This workflow is similar to above, but the idea is that you blow away and recreate the services each time you start work on a new feature.&lt;/p&gt;

&lt;p&gt;You would start Hyper Nano with ./hyper-nano --experimental --data --cache --purge --domain=foo-app, which would destroy any old data and cache service, and then recreate them. Then you would develop as normal.&lt;/p&gt;

&lt;p&gt;For data, since the services are deleted and recreated every time, you would need some sort of seeding mechanism. &lt;a href="https://github.com/hyper63/hyper/tree/main/packages/connect#data"&gt;hyper.data.bulk on&lt;/a&gt;&lt;a href="https://github.com/hyper63/hyper/tree/main/packages/connect#data"&gt;hyper-connect&lt;/a&gt; is a great option for performing this.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No manual steps to create and delete servcies&lt;/li&gt;
&lt;li&gt;Sandboxed to localhost&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Feature&lt;/em&gt; development is sandboxed&lt;/li&gt;
&lt;li&gt;Doesn’t require internet connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You must have a seeding mechanism (I personally see this as a pro which I will cover in the next workflow)&lt;/li&gt;
&lt;li&gt;Must maintain a runtime on local ie. Node, Yarn, Deno, installing dependencies, cross versions, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cloud Development using Ephemeral Services
&lt;/h4&gt;

&lt;p&gt;This workflow uses Ephemeral Hyper Services, but also an Ephemeral development environment as well. Using services like &lt;a href="https://gitpod.io"&gt;GitPod&lt;/a&gt; or GitHub Workspaces, you would spin up a new environment for each new piece of work being done. This environment setup should download ./hyper-nano and start it, using bootstrapping and purging to create services. As part of environment set up, you would also run your seed script to bulk load your services with data.&lt;/p&gt;

&lt;p&gt;When you were done developing, you would push up your code to the remote, and then simply close the Cloud Environment. For the next piece of work, rinse and repeat.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No manual steps to create and delete services&lt;/li&gt;
&lt;li&gt;Sandboxed to Cloud Environment&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Feature&lt;/em&gt; development is sandboxed&lt;/li&gt;
&lt;li&gt;All are other dependencies are sandboxed ie. Runtime, dependencies, are sandboxed (no nvm!)&lt;/li&gt;
&lt;li&gt;Encourage trunk based development&lt;/li&gt;
&lt;li&gt;This becomes your onboarding flow for new developers, so your onboarding flow always stays up to date and lean&lt;/li&gt;
&lt;li&gt;Less likely for environment divergence to occur aka. no more “it works on my machine”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment setup must be codified for something like GitPod to execute.&lt;/li&gt;
&lt;li&gt;Needs an internet connection&lt;/li&gt;
&lt;li&gt;You must have a seeding mechanism (I personally see this as a pro in this setup)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What Hyper Does
&lt;/h4&gt;

&lt;p&gt;You can probably guess that we use the “Cloud Development using Ephemeral Services” workflow at hyper. We develop exclusively in Cloud Environments, and spin up new services and seed data for each new feature or bug.&lt;/p&gt;

&lt;p&gt;When we are done with the feature, we simply close and forget that environment and then spin up a new one.&lt;/p&gt;

&lt;p&gt;We use a &lt;a href="https://www.gitpod.io/docs/config-gitpod-file"&gt;.gitpod.yml file&lt;/a&gt; to configure our Cloud Environment with everything to start developing.&lt;/p&gt;

&lt;p&gt;This means our seed data must be kept up to date, which requires some work, but I personally think this is a good thing. It keeps our seed data from becoming stale tech debt, and keeps onboarding new team members lean. It also means that we can tune our seed data to include more and more data sets to support feature development, as more features become part of the application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suppose you had a subscription based platform. You could seed data where one customer is in a “paid” subscription state, another customer is “overdue” subscription state, and another customer is “no subscription” state. It becomes easy to build features for each of those customer states with your set of seed data&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Deploying your Application
&lt;/h4&gt;

&lt;p&gt;Eventually you’re going to need to deploy your application, where your application consumes your actual services in your &lt;a href="https://docs.hyper.io/applications"&gt;Hyper Cloud Application&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re using hyper-connect to consume your Hyper Services, all you have to do swap out your &lt;a href="https://docs.hyper.io/app-keys"&gt;connection string&lt;/a&gt; that you pass to hyper-connect and that's it! From local development to using actual services without any code changes 😎, for &lt;em&gt;all&lt;/em&gt; of your Services.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Hyper Nano has been a huge boon for us at hyper developing products like Hyper Cloud. Consider trying Hyper Nano in your development workflow and let us know what you think!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are currently offering &lt;a href="https://calendly.com/hyper-cloud/hyper-cloud-technical-tour"&gt;hyper cloud tours&lt;/a&gt; and a free &lt;a href="https://calendly.com/hyper-cloud/chat-with-an-architect"&gt;Architecture Consultation&lt;/a&gt;, If you think we could help you build your next great project, let us know!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cloud</category>
      <category>javascript</category>
      <category>easy</category>
    </item>
    <item>
      <title>Clean Architecture At Hyper ⚡️</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Wed, 27 Apr 2022 13:00:05 +0000</pubDate>
      <link>https://dev.to/hyper/clean-architecture-at-hyper-4p69</link>
      <guid>https://dev.to/hyper/clean-architecture-at-hyper-4p69</guid>
      <description>&lt;p&gt;With the &lt;a href="https://blog.hyper.io/hyper-cloud-beta-is-a-go/"&gt;beta launch of hyper cloud&lt;/a&gt;, I want to share a little bit about how hyper itself works under the hood, and how we leveraged the architecture to build tools that we use to build hyper, &lt;em&gt;with&lt;/em&gt; hyper.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are currently offering &lt;a href="https://calendly.com/hyper-cloud/hyper-cloud-technical-tour"&gt;hyper cloud tours&lt;/a&gt; and a free &lt;a href="https://calendly.com/hyper-cloud/chat-with-an-architect"&gt;Architecture Consultation&lt;/a&gt;, If you think we could help you build your next great project, let us know!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Clean Architecture 🧼🛠
&lt;/h4&gt;

&lt;p&gt;At Hyper, we embrace the &lt;a href="https://blog.hyper.io/the-perfect-application-architecture/"&gt;Clean Architecture&lt;/a&gt; approach to building software. This means separating side effects from business logic and working hard to keep business logic separated from other components.&lt;/p&gt;

&lt;p&gt;What is business logic? It’s your secret sauce; the data models that may interact with each other, and the &lt;em&gt;rules&lt;/em&gt; that govern how those models interact with each other. &lt;strong&gt;It is not a database, and it is not a frontend framework&lt;/strong&gt;. Those pieces are &lt;em&gt;side effects&lt;/em&gt; that tie &lt;em&gt;into&lt;/em&gt; your business logic. As Robert C. Martin, author of Clean Architecture put it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;there is &lt;strong&gt;nothing&lt;/strong&gt; architecturally significant about arranging data in rows within tables&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source: &lt;a href="https://en.wikipedia.org/wiki/Business_logic"&gt;https://en.wikipedia.org/wiki/Business_logic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I won’t go into great detail here, there are tons of material on this topic. We encourage teams to build software using the tenants of “Clean Architecture” and we’ve built hyper to encourage doing just that. And not only do we encourage teams to build software using the tenants of Clean Architecture, but this is also how we architected hyper, internally.&lt;/p&gt;

&lt;h4&gt;
  
  
  Under The Hood 🚘
&lt;/h4&gt;

&lt;p&gt;Hyper is built using a “&lt;a href="https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)"&gt;Ports and Adapters&lt;/a&gt;” approach.&lt;/p&gt;

&lt;p&gt;The general idea with Ports and Adapters is that the business logic layer defines the models and rules on how they interact with each other, and also a set of consumer-agnostic entry and exit points to and from the business layer. These entry and exit points are called “Ports”. All components &lt;em&gt;external&lt;/em&gt; to the business layer, interact by way and are interacted &lt;em&gt;with&lt;/em&gt;, the Ports. A Port defines an api but knows nothing about the mechanism or the impetus. Those two things are an Adapter’s job.&lt;/p&gt;

&lt;p&gt;Adapters perform the actual communication between external actors and the business layer. There are generally two types of Adapters: “Driving Adapters” and “Driven Adapters”.&lt;/p&gt;

&lt;p&gt;A driving adapter calls into the business layer, by way of a Port. The driving adapters can generally be thought of as the “presentation layer”. It could be a web application, a desktop application, a &lt;em&gt;CLI&lt;/em&gt;, anything that initiates some action on the business domain.&lt;/p&gt;

&lt;p&gt;A driven adapter is called by the business layer, to interact with some backend tool, ie. a database, storage bucket, cache, etc. The business layer calls into the driven adapter by way of the Port. &lt;strong&gt;Driven adapters implement the Port defined by the business layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So the flow generally looks like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Driving Adapter &amp;lt;--&amp;gt; Port &amp;lt;--&amp;gt; Business Layer &amp;lt;--&amp;gt; Port &amp;lt;--&amp;gt; Driven Adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SG3kPVl4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/978/0%2AiML0LJbD6PhT_tNc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SG3kPVl4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/978/0%2AiML0LJbD6PhT_tNc.png" alt="1-9B1EsZPbhElSEFDZU3IpXA" width="880" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://betterprogramming.pub/hexagonal-architecture-for-ios-part-1-600441c186b7"&gt;https://betterprogramming.pub/hexagonal-architecture-for-ios-part-1-600441c186b7&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefits
&lt;/h4&gt;

&lt;p&gt;Because the business layer enforces the Ports, and all external interactions with external components happens through the Ports, the business layer is encapsulated. The benefits of this for the system cannot be overstated.&lt;/p&gt;

&lt;p&gt;It means the business layer, the models and the rules governing them, can be developed &lt;em&gt;before&lt;/em&gt; choosing things like a database, or a frontend framework. Better yet, the business layer can be &lt;em&gt;tested&lt;/em&gt; before choosing any of those things. &lt;strong&gt;Covering business logic almost entirely with unit tests is a boon for confidence in the system.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When building software, a decision is a set of &lt;em&gt;constraints&lt;/em&gt;, and ideally the pros of accepting those constraints outweigh the cons. So we ought to defer accepting constraints until we have as much information as possible to inform that decision. Clean Architecture enables us to do just that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also allows for the separation of concerns. Each tier of the architecture can change without requiring changes in the other tiers. This is important because some tiers are more volatile than others; typically the UI of an application changes faster than business rules for example.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The only time we must touch multiple tiers is if a Port is changed. And that is usually a find and replace&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Hyper Clean Architecture Lingua Franca 📚
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gIcWLj2O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/825/0%2AiyI-g7LVRA9oQzGF.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gIcWLj2O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/825/0%2AiyI-g7LVRA9oQzGF.png" alt="hyper-architecture" width="825" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper Apps 🎮
&lt;/h4&gt;

&lt;p&gt;The Driving Adapters in the Hyper Service Framework are called “Apps” or “Apis”. We currently have two Apps available shown &lt;a href="https://nest.land/gallery?search=hyper-app"&gt;here&lt;/a&gt;. The GraphQL app will need to be overhauled eventually, but the Opine app is up to date and provides a RESTful api.&lt;/p&gt;

&lt;p&gt;In the future, we would like to see more app offerings. A CLI app, a GRPC app, we’ve even discussed a Service Worker app, so that Hyper could be run entirely in the browser, on a Service Worker 😎.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper Core 🪨
&lt;/h4&gt;

&lt;p&gt;The business layer in Hyper is called &lt;a href="https://nest.land/package/hyper"&gt;core&lt;/a&gt; which contains all of the business logic and enforces each Port. Core also defines the Port that a Hyper App calls.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper Ports 🔌
&lt;/h4&gt;

&lt;p&gt;There are multiple Ports defined in the Hyper Service Framework. You can see them all &lt;a href="https://nest.land/gallery?search=hyper-port"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper Adapters 🛠
&lt;/h4&gt;

&lt;p&gt;The Driven Adapters in the Hyper Service Framework are simply called “Adapters”. You can see many of them &lt;a href="https://nest.land/gallery?search=hyper-adapter"&gt;here&lt;/a&gt;. Each adapter implements a Port api and does the heavy lifting of communicating with an underlying component.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper Services
&lt;/h4&gt;

&lt;p&gt;A Hyper Service is combination of the components described above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Hyper App&lt;/li&gt;
&lt;li&gt;Hyper Core&lt;/li&gt;
&lt;li&gt;An Adapter Port&lt;/li&gt;
&lt;li&gt;A Hyper Adapter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a Hyper Data Service might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RESTful api -&amp;gt; Core -&amp;gt; Data Port -&amp;gt; CouchDB Adapter
// or
GraphQL api -&amp;gt; Core -&amp;gt; Data Port -&amp;gt; Postgres Adapter
// or
CLI -&amp;gt; Core -&amp;gt; Data Port -&amp;gt; DynamoDB Adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Hyper Cache Service might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRPC api -&amp;gt; Core -&amp;gt; Cache Port -&amp;gt; Redis Adapter
// or
GraphQL api -&amp;gt; Core -&amp;gt; Cache Port -&amp;gt; Sqlite Adapter
// or
CLI -&amp;gt; Core -&amp;gt; Cache Port -&amp;gt; FlatFile Adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Hyper Search Service might:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRPC api -&amp;gt; Core -&amp;gt; Search Port -&amp;gt; Elasticsearch Adapter
// or
RESTful api -&amp;gt; Core -&amp;gt; Search Port -&amp;gt; Minisearch Adapter
// or
CLI -&amp;gt; Core -&amp;gt; Search Port -&amp;gt; Algolia Adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope you’re noticing something:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adapters and Apps are &lt;em&gt;interchangeable&lt;/em&gt;&lt;/strong&gt;. This is how we can test our business layer without choosing a database, for example. We just mock the Adapter that communicates with the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This also means we can run the Hyper Service Framework using a set of “local development” adapters.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper {Nano} 🍷
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/hyper63/hyper/tree/main/images/nano"&gt;Hyper Nano&lt;/a&gt; is the compiled Hyper Service Framework using a set of “local development” adapters. It’s the same Hyper RESTful app, and the same Hyper Core, but with a set of adapters that allow it to run locally sandboxed, and simple to quickly spin up and then blow away.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-pouchdb"&gt;PouchDB&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;cache (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-sqlite"&gt;Sqlite&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;storage (powered by your local &lt;a href="https://github.com/hyper63/hyper-adapter-fs"&gt;file system&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;search (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-minisearch"&gt;Sqlite and Minisearch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;queue (powered by &lt;a href="https://github.com/hyper63/hyper-adapter-queue"&gt;DnDB and an in-memory queue&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hyper Nano is great for development or sandboxed short-lived environments ie. GitHub Workspaces or GitPod.&lt;/p&gt;

&lt;p&gt;Hyper Nano has some other features that we will cover in another blog post.&lt;/p&gt;

&lt;p&gt;At hyper, we use Hyper Nano to develop hyper products. When building &lt;a href="https://dashboard.hyper.io"&gt;hyper cloud&lt;/a&gt;, we simply spin up a Gitpod Workspace, which installs our dependencies, starts Hyper Nano, and bootstraps our services. The result is a completely sandboxed local development environment in Cloud 😎 ☁️⚡️. Yes, we use &lt;strong&gt;hyper&lt;/strong&gt; to build  &lt;strong&gt;hyper&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then in deployed environments, we use the Hyper Service Framework, but with actual Adapters to actual external services. &lt;strong&gt;Our interactions with Hyper does not change between Hyper Cloud and Hyper Nano&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;We try to practice what we preach, we dogfood practically everything we build, and hopefully, this provides some insights on how Hyper works internally and why you might consider trying Clean Architecture and Hyper.&lt;/p&gt;

&lt;p&gt;We are currently offering &lt;a href="https://calendly.com/hyper-cloud/hyper-cloud-technical-tour"&gt;hyper cloud tours&lt;/a&gt; and a free &lt;a href="https://calendly.com/hyper-cloud/chat-with-an-architect"&gt;Architecture Consultation&lt;/a&gt;, If you think we could help you build your next great project, let us know!&lt;/p&gt;

&lt;h4&gt;
  
  
  Acknowledgements
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Business_logic"&gt;https://en.wikipedia.org/wiki/Business_logic&lt;/a&gt; for the 3 tier architecture graphic&lt;/li&gt;
&lt;li&gt;Oleksandr Stepanov’s &lt;a href="https://betterprogramming.pub/hexagonal-architecture-for-ios-part-1-600441c186b7"&gt;awesome post&lt;/a&gt; on Hexagonal Architecture, which provides some great visualizations of the architecture&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>architecture</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>Introducing the Remix Hyper Stack ⚡️+=✨</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Fri, 22 Apr 2022 13:00:05 +0000</pubDate>
      <link>https://dev.to/hyper/introducing-the-remix-hyper-stack--5dni</link>
      <guid>https://dev.to/hyper/introducing-the-remix-hyper-stack--5dni</guid>
      <description>&lt;p&gt;At hyper, we love web standards. Web Standards are rules established by international standards bodies that define how the web works. These bodies put a lot of effort into ensuring the Web is maximally usable and accessible.&lt;/p&gt;

&lt;p&gt;If you’ve ever ended up on &lt;a href="https://developer.mozilla.org/"&gt;MDN Web Docs&lt;/a&gt; then you’re probably familiar with some of these Web Standards (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API"&gt;fetch&lt;/a&gt; anyone?).&lt;/p&gt;

&lt;p&gt;Our love of Web Standards is why we have embraced tools like &lt;a href="https://deno.land/?ref=hyper"&gt;Deno 🦕&lt;/a&gt; to build hyper.&lt;/p&gt;

&lt;p&gt;So whenever we see another framework or tool that is embracing Web Standards, that get’s us excited! One of these frameworks is &lt;a href="https://remix.run/?ref=hyper"&gt;Remix&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Remix run (the web 🌎)
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Hyper is a sponsor of &lt;a href="https://remix.run/conf"&gt;Remix Conf.&lt;/a&gt;. Consider coming to Remix Conf. to learn more about Remix. If you see a hyper shirt, come say hi!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Remix is a &lt;em&gt;full stack&lt;/em&gt; web framework.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remix is a full stack web framework that lets you focus on the user interface and work back through web standards to deliver a fast, slick, and resilient user experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Like other frameworks such as &lt;a href="https://nextjs.org/?ref=hyper"&gt;NextJS&lt;/a&gt;, &lt;a href="https://nuxtjs.org/?ref=hyper"&gt;NuxtJS&lt;/a&gt;, and &lt;a href="https://kit.svelte.dev/?ref=hyper"&gt;SvelteKit&lt;/a&gt;, Remix blurs the lines between client and server, providing a unified development experience that embraces the emerging “full stack developer” role.&lt;/p&gt;

&lt;p&gt;With Remix, you write frontend (React) and backend code in routes files. Your frontend code sits right next to the server code that handles input submitted from that UI. You use Web Standards like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API"&gt;fetch&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Request"&gt;Request&lt;/a&gt;, and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Response"&gt;Response&lt;/a&gt; to integrate your frontend and backend handlers. It supports TypeScript, bundling, accessibility, and route optimization, right out of the box. So far, building apps with Remix feels very ergonomic and easy to reason about.&lt;/p&gt;

&lt;p&gt;Remix does a ton for you. If you’d like to learn more, consider checking out their &lt;a href="https://remix.run/docs/en/v1?ref=hyper"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Remix Stacks
&lt;/h4&gt;

&lt;p&gt;One of the new features in Remix, that we are really excited about, is &lt;a href="https://remix.run/docs/en/v1/pages/stacks"&gt;Remix Stacks&lt;/a&gt;. Remix Stacks is a feature of the Remix CLI that allows you to generate a Remix project quickly and easily. There are some official stacks described in their &lt;a href="https://remix.run/docs/en/v1/pages/stacks?ref=hyper"&gt;docs&lt;/a&gt; that come with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Automatic deployment pipelines&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Linting/Formatting/TypeScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remix Stacks also supports custom templates, where you can build your own Stacks and then use the Remix CLI to spin up those stacks!&lt;/p&gt;

&lt;p&gt;We were wanting to build a starter project for &lt;a href="https://dashboard.hyper.io"&gt;hyper cloud&lt;/a&gt; and Remix. So when Remix Stacks were released, it seemed like a perfect opportunity.&lt;/p&gt;

&lt;h4&gt;
  
  
  Introducing the Remix Hyper Stack ⚡️💿
&lt;/h4&gt;

&lt;p&gt;We are happy to introduce the &lt;a href="https://github.com/hyper63/remix-hyper-stack"&gt;Remix Hyper Stack&lt;/a&gt;, a custom Remix Stack that comes with everything you need to start building 🛠, and shipping 🚀 with Hyper Cloud and Remix.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zBRi9pcW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A7T0wV7XhoHTZUnAG.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zBRi9pcW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A7T0wV7XhoHTZUnAG.png" alt="hyper-stack" width="880" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Out of the box, the Remix Hyper Stack comes with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.com"&gt;AWS deployment&lt;/a&gt; with &lt;a href="https://arc.codes/"&gt;Architect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hyper.io"&gt;Hyper Cloud&lt;/a&gt; integration via
&lt;a href="https://www.npmjs.com/package/hyper-connect"&gt;hyper-connect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Zero-setup ⚡️ local development using
&lt;a href="https://github.com/hyper63/hyper/tree/main/images/nano"&gt;hyper nano&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt; for deploy on merge to
production and staging environments&lt;/li&gt;
&lt;li&gt;Email/Password Authentication with
&lt;a href="https://remix.run/docs/en/v1/api/remix#createcookiesessionstorage"&gt;cookie-based sessions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Styling with &lt;a href="https://tailwindcss.com/"&gt;Tailwind&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;End-to-end testing with &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Local third party request mocking with &lt;a href="https://mswjs.io"&gt;MSW&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Unit testing with &lt;a href="https://vitest.dev"&gt;Vitest&lt;/a&gt; and
&lt;a href="https://testing-library.com"&gt;Testing Library&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code formatting with &lt;a href="https://prettier.io"&gt;Prettier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Linting with &lt;a href="https://eslint.org"&gt;ESLint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Static Types with &lt;a href="https://typescriptlang.org"&gt;TypeScript&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything that you need to start developing locally. Then once you’re ready, just add some &lt;a href="https://docs.github.com/en/actions/security-guides/encrypted-secrets"&gt;GitHub repo’s secrets&lt;/a&gt; and start deploying on AWS, consuming hyper cloud as your services tier 😎 💸.&lt;/p&gt;

&lt;h4&gt;
  
  
  Usage
&lt;/h4&gt;

&lt;p&gt;To use the &lt;a href="https://github.com/hyper63/remix-hyper-stack"&gt;Remix Hyper Stack&lt;/a&gt;, simply use the Remix CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-remix --template hyper63/remix-hyper-stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI will prompty you for some questions, pull down the stack, and set it up for you. Then just run npm run dev and start building!&lt;/p&gt;

&lt;h4&gt;
  
  
  What’s it doing?
&lt;/h4&gt;

&lt;p&gt;So what are each of the parts of the stack doing? Let’s go through it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The cool thing about Remix Stacks is that they are completely customizable. If you don’t like a piece, simply change it after setup, or even fork the original stack and create your own!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  AWS Deployment via Github Actions
&lt;/h4&gt;

&lt;p&gt;The Hyper Remix Stack comes with a Github Workflow that will deploy your application to AWS using &lt;a href="https://arc.codes/"&gt;Architect&lt;/a&gt;. Architect handles setting up ApiGateway, S3, and Lambda together, so that your application can scale to meet production demand.&lt;/p&gt;

&lt;p&gt;The workflow will run all your quality checks: Linting, Type checking, Testing, and Building. If all goes well, the the workflow will deploy your applciation. Out of the box, the workflow will deploy the main branch to a production environment and the dev branch to a staging environment. You can even setup separate credentials between production and staging in cases where you have a separate AWS account for each environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper Cloud Integration with hyper-connect
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://hyper.io"&gt;hyper cloud&lt;/a&gt; is a scalable, backend cloud-based service that you can use to spin up databases, caches, storage buckets, search engines, and persistent queues, no dev-ops required.&lt;/p&gt;

&lt;p&gt;Instead of figuring out how to deploy services in the cloud, securely, and to scale, just use hyper cloud and then consume your services using the hyper-connect SDK or REST. Focus on building features ⚡️, not cloud plumbing 🪠.&lt;/p&gt;

&lt;p&gt;Learn more at &lt;a href="https://docs.hyper.io/"&gt;our docs&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Development using hyper nano
&lt;/h4&gt;

&lt;p&gt;Although you can use a &lt;a href="https://docs.hyper.io/applications"&gt;hyper cloud application&lt;/a&gt; to develop, the Remix Hyper Stack also comes integrated with &lt;a href="https://github.com/hyper63/hyper/tree/main/images/nano"&gt;hyper nano&lt;/a&gt;. hyper nano is an instance of hyper that runs all of your hyper services locally, using local hyper service adapters! It works great for local development, and short-lived ephemeral environments like GitHub Workspaces or Gitpod&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;At hyper, we exclusively develop using short-lived, cloud-based, environments. And we use hyper nano to do it. In short, we build hyper using hyper.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;hyper-connect works seamlessly with both hyper cloud and hyper nano. Consume hyper nano for local development, then your deployed application consumes hyper cloud with no code changes. hyper connect handles that for you.&lt;/p&gt;

&lt;h4&gt;
  
  
  Styling, Type Checking, Linting, Testing, Oh My! 🐯
&lt;/h4&gt;

&lt;p&gt;The Remix Hyper Stack comes with linting using EsLint, type checking using TypeScript, testing using Vitest, and end to end testing using Cypress.&lt;/p&gt;

&lt;p&gt;All of this is integrated with Github Workflow, so all your quality checks pass before deploying your application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pqpy9TK3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/604/0%2Acm24v8oEc3S8rbYJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pqpy9TK3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/604/0%2Acm24v8oEc3S8rbYJ.png" alt="Screen-Shot-2022-04-21-at-3.57.28-PM" width="604" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Clean Architecture With Hyper
&lt;/h4&gt;

&lt;p&gt;Hyper embraces the &lt;a href="https://blog.hyper.io/the-perfect-application-architecture/"&gt;Clean Architecture&lt;/a&gt; approach to building software. This means separating side effects from business logic and striving to keep business logic separated from other details of the application.&lt;/p&gt;

&lt;p&gt;This has lots of benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business logic is &lt;em&gt;framework&lt;/em&gt; agnostic and can be reused&lt;/li&gt;
&lt;li&gt;Remix/NextJS/CRA/Preact&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Svelte&lt;/li&gt;
&lt;li&gt;CLI (The framework doesn’t even need to be web based!)&lt;/li&gt;
&lt;li&gt;Mobile app&lt;/li&gt;
&lt;li&gt;Business logic is &lt;em&gt;infrastructure&lt;/em&gt; agnostic:&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Cloud Provider&lt;/li&gt;
&lt;li&gt;Deployment configuration ie. lambda, Docker, K8s, etc.&lt;/li&gt;
&lt;li&gt;Easier to test business logic (unit tests and TypeScript cover most of it!)&lt;/li&gt;
&lt;li&gt;Separation of concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;All of the business logic for this application can be found in&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
 &lt;strong&gt;app/services&lt;/strong&gt;. Each service receives its side effects via &lt;a href="https://martinfowler.com/articles/refactoring-dependencies.html#DependencyInjection"&gt;dependency injection&lt;/a&gt; which are then easy to stub during unit testing.&lt;/p&gt;

&lt;p&gt;Our business models are simple schemas built on &lt;a href="https://github.com/colinhacks/zod"&gt;zod&lt;/a&gt; used to validate the correctness of data flowing in and out of our business logic layer. You could use anything to validate the contracts with your business logic, I chose zod because it's what we use at hyper. Joi, Yup, there are tons of options out there.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The important part of these schemas is that it puts enforcing our business logic contracts in the layer we control, not buried deep within a database schema, or a managed service where we have limited to no control. Doing that can cause coupling and unintended technical debt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because all side effects are injected via dependency injection, the business logic is incredibly easy to test. The business logic is practically fully tested using &lt;strong&gt;just unit tests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C9Jang-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/503/0%2AVTF1QY3EJTXvvuSU.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C9Jang-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/503/0%2AVTF1QY3EJTXvvuSU.png" alt="Business logic test coverage" width="503" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rest of the code in the project is all effectively glue code if you will, into our business logic, based on what our Remix app wants to do, in this case, a note taking app.&lt;/p&gt;

&lt;p&gt;Perhaps we have another application that will run NLP across notes, or an administrator application with separate authentication needs. Those applications can reuse our business logic just fine.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;We at hyper are very excited about Remix and Remix stacks. A huge shout out to the Remix team and to &lt;a href="https://kentcdodds.com/"&gt;Kent C. Dodds&lt;/a&gt; for showing us this cool new feature.&lt;/p&gt;

&lt;p&gt;Try out the &lt;a href="https://github.com/hyper63/remix-hyper-stack"&gt;Remix Hyper Stack&lt;/a&gt; today, and let us know what you think!&lt;/p&gt;

&lt;p&gt;We are also sponsoring &lt;a href="https://remix.run/conf"&gt;Remix Conf.&lt;/a&gt; and will be there, so if you see a hyper shirt, come say hi!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>remix</category>
      <category>stacks</category>
    </item>
    <item>
      <title>Using CloudFront to Redirect HTTP -&gt; HTTPS on ApiGateway</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Tue, 05 Apr 2022 13:00:04 +0000</pubDate>
      <link>https://dev.to/hyper/using-cloudfront-to-redirect-http-https-on-apigateway-8kd</link>
      <guid>https://dev.to/hyper/using-cloudfront-to-redirect-http-https-on-apigateway-8kd</guid>
      <description>&lt;p&gt;ApiGateway is great service for quickly spinning up a resilient, performant API layer for your application.&lt;/p&gt;

&lt;p&gt;An increasingly common practice, as a result of putting frameworks like &lt;a href="https://nextjs.org/"&gt;NextJS&lt;/a&gt;, &lt;a href="https://kit.svelte.dev/"&gt;SvelteKit&lt;/a&gt;, and &lt;a href="https://arc.codes/docs/en/get-started/quickstart"&gt;Architect&lt;/a&gt; behind ApiGateway on a Lambda integration, is to serve static assets, as well as data, using a single ApiGateway. The ApiGateway is assigned a Custom Domain name, and serves the web applciation, assets, and the api the serves the data to power it.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Problem
&lt;/h4&gt;

&lt;p&gt;When typing a url into a browser, if the protocol is not specified, most browsers will default to http. If your site is served up via ApiGateway, this will result in a failure to connect and an error:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pESeJJc_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AWcxIQvRjMZ6squ8H.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pESeJJc_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AWcxIQvRjMZ6squ8H.png" alt="Screen-Shot-2022-03-31-at-5.55.12-PM" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is because ApiGateway only supports https. This isn't a great user experience. Instead of an error, it would be great to redirect http -&amp;gt; https.Unfortunately, this involves more moving parts than is expected. There isn't a setting that you can toggle in ApiGateway; http isn't supported. To get around this, most solutions use CloudFront to perform this redirect. There were some tutorials that already exist on how to do this, but all them were missing some key details. This post will describe how I used CloudFront in front of ApiGateway to redirect http to https.&lt;/p&gt;

&lt;h4&gt;
  
  
  Set up CloudFront
&lt;/h4&gt;

&lt;p&gt;In order to set up CloudFront to redirect http to https, you will need to set up a CloudFront distribution to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;redirect http -&amp;gt; https&lt;/li&gt;
&lt;li&gt;forward all traffic to the &lt;strong&gt;invoke url&lt;/strong&gt; of your ApiGateway&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There some quirks to this, that I will get into later in this post&lt;/p&gt;

&lt;p&gt;First, navigate to the ApiGateway dashboard and take note of the invoke url for your Gateway.&lt;/p&gt;

&lt;p&gt;Next, navigate to the CloudFront dashboard and create a new CloudFront Distribution.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Origin Domain&lt;/strong&gt; paste in your ApiGateway’s invoke URL.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Origin Path&lt;/strong&gt; if you are using your &lt;strong&gt;default&lt;/strong&gt; stage, leave blank.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Name&lt;/strong&gt; , name the origin whatever you’d like.&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Viewer Protocol Policy&lt;/strong&gt; , check &lt;strong&gt;Redirect HTTP to HTTPS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Allowed HTTP Methods&lt;/strong&gt; , check &lt;strong&gt;GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This Next Piece is Important!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scroll down to &lt;strong&gt;Cache key and origin requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Cache Policy&lt;/strong&gt; choose &lt;strong&gt;CachingDisabled&lt;/strong&gt; policy. This will prevent CloudFront from caching responses from your ApiGateway.&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Origin request policy&lt;/strong&gt; choose &lt;strong&gt;AllViewer&lt;/strong&gt; policy. This will make CloudFront forward all headers it receives from the request to your ApiGateway. &lt;strong&gt;You will need this if your application uses cookies or Authorization header for AuthN/Z&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your ApiGateway uses a custom domain, this next piece is important!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scroll down to  &lt;strong&gt;Settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Alternate domain name (CNAME)&lt;/strong&gt; add the custom domain that is currently assigned to your ApiGateway. If you’re using ACM, choose the corresponding certificate for that custom domain.&lt;/p&gt;

&lt;p&gt;By default, ApiGateway has CORS disabled. If CORS is disabled on your ApiGateway, &lt;strong&gt;DO NOT&lt;/strong&gt; remove the custom domain configuration from your ApiGateway. The custom domain configuration &lt;strong&gt;should match&lt;/strong&gt; between CloudFront and ApiGateway. This will ensure requests are not rejected by ApiGateway due to CORS.&lt;/p&gt;

&lt;p&gt;Create the Distribution. After a few minutes, your Distribution should be &lt;strong&gt;deployed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Copy your &lt;strong&gt;Distribution domain name&lt;/strong&gt; , and update your DNS, that currently resolves to your ApiGateway, to instead resolve to your Distribution’s domain name. It may take some time for DNS to propagate.&lt;/p&gt;

&lt;p&gt;This should be all you need to set up CloudFront in front of your ApiGateway, in order to redirect http -&amp;gt; https. You can verify by navigating to your site, being sure to use the http protocol. Do this in a browser, and view the redirect in the network dev tools tab. You can also use cURL with the -L flag to follow redirects and see the redirects listed out listed out.&lt;/p&gt;

&lt;h4&gt;
  
  
  The important bits
&lt;/h4&gt;

&lt;p&gt;Most of this is probably self explanatory. The pieces that aren’t as intuitive:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;Origin request policy&lt;/strong&gt;  &lt;strong&gt;MUST&lt;/strong&gt; forward all headers received to ApiGateway. AWS has a precanned policy called &lt;strong&gt;AllViewer&lt;/strong&gt; that does this, but you can also create your own. Just make sure the headers you need are forwarded to ApiGateway by CloudFront&lt;/li&gt;
&lt;li&gt;If CORS is disabled for ApiGateway, the custom domain configuration &lt;strong&gt;MUST&lt;/strong&gt; exist on both the CloudFront distribution and the ApiGateway. Otherwise, ApiGateway will reject the request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hopefully this was helpful!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>hyper cloud beta is a go!</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Mon, 04 Apr 2022 12:41:12 +0000</pubDate>
      <link>https://dev.to/hyper/hyper-cloud-beta-is-a-go-kk2</link>
      <guid>https://dev.to/hyper/hyper-cloud-beta-is-a-go-kk2</guid>
      <description>&lt;p&gt;The &lt;a href="https://hyper.io/"&gt;hyper&lt;/a&gt; team is proud to announce ⚡️&lt;a href="https://dashboard.hyper.io/"&gt;hyper cloud&lt;/a&gt;⚡️ is now in beta.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;hyper is a dev-ops team wrapped in a single API. Our easy-to-learn API manages data, cache, storage, search, and queue services.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Okay, it’s confession time 😬.
&lt;/h4&gt;

&lt;p&gt;A long time ago, way before hyper, we may have contributed to codebases that may have turned into a big pile of 💩. As new features were attempted, unintentional technical debt and complexity increased. Our product slowly became intertwined and deeply coupled with the underlying services. We sacrificed quality to deadline pressure. Our developer happiness turned into frustration 🤯 and developer retention suffered. Adding developers and site reliability engineers frankly didn’t solve the problem. Maybe this sounds familiar to you.&lt;/p&gt;

&lt;p&gt;We learned from our mistakes by focusing on specific fundamentals: &lt;a href="https://www.amazon.com/Accelerate-Building-Performing-Technology-Organizations/dp/B07BMBYHXL/ref=sr_1_1?hvadid=241653451130&amp;amp;hvdev=c&amp;amp;hvlocphy=9010526&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=12362379891764064156&amp;amp;hvtargid=kwd-307609789829&amp;amp;hydadcr=21874_10169699&amp;amp;keywords=accelerate+book&amp;amp;qid=1644845702&amp;amp;sr=8-1"&gt;shifting left&lt;/a&gt;, &lt;a href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912"&gt;continuous delivery&lt;/a&gt; and &lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"&gt;clean architecture&lt;/a&gt;. The result is hyper: a game-changer for front-end developers, startups, agencies, or anyone looking to save time, energy, and money 💵.&lt;/p&gt;

&lt;h4&gt;
  
  
  Features are king 👑.
&lt;/h4&gt;

&lt;p&gt;Building the services that power your features is difficult to get right. We took what we’ve learned about building scalable, secure, and performant service tiers and crafted hyper cloud. With hyper cloud as your services tier, you can focus on building what matters most: features that delight your customers.&lt;/p&gt;

&lt;p&gt;How much of your budget is focused on your backend service personnel? Minimize the human resources required to build and maintain your software product. Bypass the red tape, frustration, bureaucracy, and uncertainty around creating cloud-based backend services. Stop wasting precious resources 💸. Shift your personnel to the side of your solution that your customers need: features and business logic.&lt;/p&gt;

&lt;p&gt;With a few clicks, you get robust and scalable backend cloud &lt;a href="https://hyper.io/product"&gt;services&lt;/a&gt; including a document datastore, in-memory cache, search engine, storage buckets, and queues. &lt;a href="https://dashboard.hyper.io/"&gt;Sign up&lt;/a&gt; for free 😀 with your GitHub account and create backend services in seconds. When you’re ready to step it up, we have &lt;a href="https://hyper.io/pricing"&gt;plans&lt;/a&gt; starting at $99 a month.&lt;/p&gt;

&lt;h4&gt;
  
  
  A DX that rocks 🎸
&lt;/h4&gt;

&lt;p&gt;Developers will enjoy a delightful DX 🤘🏽using a &lt;a href="https://docs.hyper.io/api-reference-hyper-cloud"&gt;REST API&lt;/a&gt; or the &lt;a href="https://docs.hyper.io/hyper-connect"&gt;hyper-connect SDK&lt;/a&gt; that supports Node and Deno 🦕. Our API provides a consistent shape across all our services, making it easy to learn and apply.&lt;/p&gt;

&lt;h4&gt;
  
  
  Support options
&lt;/h4&gt;

&lt;p&gt;We’ve got your back! 😉 We provide basic and extended support options. Learn by doing with our &lt;a href="https://docs.hyper.io/workshops"&gt;workshops&lt;/a&gt; 💪, &lt;a href="https://docs.hyper.io/nodejs-quickstarts"&gt;quickstarts&lt;/a&gt; 🚀, &lt;a href="https://blog.hyper.io/"&gt;blog&lt;/a&gt; 👩🏽‍💻, and YouTube &lt;a href="https://www.youtube.com/channel/UC_V8BG1cTmILu9IkTK-yn1A"&gt;tutorials&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Introducing our CTO service
&lt;/h4&gt;

&lt;p&gt;Our new &lt;a href="https://blog.hyper.io/cto-for-startups/"&gt;fractional CTO service for startups&lt;/a&gt; provides the oversight and guidance necessary to cultivate quality, productivity, and accountability. Let us help you curate the technology strategy and vision of your company’s software tools and technologies.&lt;/p&gt;

&lt;p&gt;Hyperfocus on features. Delight your developers and customers. Put your applications on solid footing. Hyper cloud is ready to go.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>saas</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Using Zod to Parse Function Schemas</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Mon, 14 Mar 2022 14:00:03 +0000</pubDate>
      <link>https://dev.to/hyper/using-zod-to-parse-function-schemas-5005</link>
      <guid>https://dev.to/hyper/using-zod-to-parse-function-schemas-5005</guid>
      <description>&lt;p&gt;Data validation, ensuring the data your system receives is in some expected shape, is crucial for a mature system. The most important part of a system, the business logic, expects and provides data in a particular shape, and so validating these shapes is an important part of running and testing your business logic.&lt;/p&gt;

&lt;p&gt;There are a ton of options. TypeScript is widely used and will provide compile time checks on your code. Most systems require &lt;em&gt;runtime&lt;/em&gt; validation at its boundaries. For example, I may have a web server endpoint that expects a certain payload shape that it will need to validate, at runtime. I can’t use TypeScript for that. In addition, TypeScript adds a build step (unless you use &lt;a href="https://deno.land/"&gt;Deno&lt;/a&gt; 🙂), and TypeScript checking can be bypassed using catchall types like any and unknown. I can disallow those types, using strict, but I now am beholden to library types, types I don't have control over or may be incorrect. So then using the any escape-hatch becomes an exercise in design and discipline, for each dev that works on the system. At the very least, that's cognitive overhead that can't be ignored, and at its worst, an obstacle to delivering quality software.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My last points were not to knock TypeScript, it’s great and we use it. My point is that &lt;strong&gt;it takes experience and discernment to know where TypeScript is a boon, and where TypeScript is an obstacle&lt;/strong&gt;. TypeScript catches &lt;em&gt;tons&lt;/em&gt; of common bugs, but it’s just another tool in the toolbox. It takes a good developer to decide how and when, and to what extent, to use it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So regardless of using compile time checks, we need some way to validate data shape at runtime, so that bad data doesn’t get into the crucial parts of the system. There are tons of runtime options. &lt;a href="https://github.com/sideway/joi"&gt;Joi&lt;/a&gt; or &lt;a href="https://github.com/jquense/yup"&gt;Yup&lt;/a&gt; are both great runtime options. At hyper, we use a library called &lt;a href="https://github.com/colinhacks/zod"&gt;Zod&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  At hyper
&lt;/h4&gt;

&lt;p&gt;The hyper service framework we’ve built at hyper, uses a “Ports and Adapters” architecture, also known as &lt;a href="https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)"&gt;Hexagonal Architecture&lt;/a&gt;. This allows swapping out the underlying components that power hyper services, without having to change the hyper core.&lt;/p&gt;

&lt;p&gt;To accomplish this architecture, hyper core must specify a contract or “port”, for each service that it offers. Then a service adapter must implement one of those ports in order to be used by hyper core:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4xVcbrN6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/825/0%2AqumaOiKNfLOhFzkB.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xVcbrN6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/825/0%2AqumaOiKNfLOhFzkB.png" alt="" width="825" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each of these ports are published modules. You can see hyper’s data port &lt;a href="https://nest.land/package/hyper-port-data"&gt;here&lt;/a&gt;. All service ports are implemented using zod. We define a Zod schema for the adapter object. Then, given an adapter implementation, the port wraps each function implemented by the adapter with the corresponding z.function() schema that enforces the contract between hyper core and the hyper adapter. Zod even has a feature that allows &lt;a href="https://github.com/colinhacks/zod#type-inference"&gt;TypeScript type inference from schemas&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;function schemas are a really cool feature of zod as they allow for separating the validation logic from the "meat" of the implementation. Adapters don't have to worry about validating inputs and outputs for each function implemented; hyper core does that. In fact, as an adapter developer, you can use the hyper port as part of your unit tests, ensuring your adapter returns the proper responses for each api!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { data } from 'https://x.nest.land/hyper-port-data@1.2.0/mod.js'

// wrap your impl with the port
const myDataAdapter = data({...})

/**
 * Now simply assert each api call,
 * and Zod parses the inputs and outputs.
 * If the test doesn't throw,
 * you know you've implemented the port!
 */
test('should return the correct shapes', async () =&amp;gt; {
  assert(await myDataAdapter.createDatabase('foo'))
  ...
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is precisely how hyper core wraps each adapter.&lt;/p&gt;

&lt;h4&gt;
  
  
  A function schema
&lt;/h4&gt;

&lt;p&gt;A function schema in zod looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MyFunctionSchema = z.function()
  .args(
    z.string()
  )
  .returns(
    z.promise(z.object({ ok: z.boolean() }))
  )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then pass a function to the schema’s implement method, which returns a new function that automatically validates its inputs and outputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function businessLogic (str) {
  ... // do some stuff
  return Promise.resolve({ ok: true })
}

const withValidation = MyFunctionSchema
    .implement(businessLogic)

withValidation('foo') // passes
withValidation(123) // throws ZodError because input doesn't match schema

MyFunctionSchema.implement(
   str =&amp;gt; Promise.resolve({ not_ok: true })
)('foo') // throws ZodError because output doesn't match schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Function overloading
&lt;/h4&gt;

&lt;p&gt;You may have a function that supports multiple input shapes and multiple output shapes. Zod does have support for &lt;a href="https://github.com/colinhacks/zod#unions"&gt;Union types&lt;/a&gt; which works as a sort of logical OR type, And you could use those to build a function schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const stringOrNumber = z.union(
  [z.string(), z.number()]
)

const identity = z.function()
  .args(stringOrNumber)
  .returns(stringOrNumber)
  .implement(i =&amp;gt; i)

// equivalent TS type
type stringOrNumberIdentity =
  (i: string | number) =&amp;gt; string | number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works if either input can produce either output, but if there is a 1:1 relationship between input and output, then we will need something different. For that, what we really want is a type like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type stringOrNumberIdentity =
  (str: string) =&amp;gt; string | (n: number) =&amp;gt; number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can accomplish this with two zod function schemas, and then parsing the argument using each schema's parameters() api. parameters() returns the Zod schema for the input args:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const strIdentity = z.function()
  .args(z.string())
  .returns(z.string())

// schema for the args of strIdentity
const strInput = strIdentity.parameters()

const numIdentity = z.function()
  .args(z.number())
  .returns(z.number())

const myFn = ....

const identityWithValidation = z.function()
  .args(stringOrNumber)
  .returns(stringOrNumber)
  .implement(i =&amp;gt; {
    if (strInput.safeParse(i).success)
       // parse i/o as string
       return strIdentity.implement(myFn)(i)

    // parse i/o as number
    return numIdentity.implement(myFn)(i)
  })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, we can enforce a 1:1 relationship between input and output, for an overloaded function.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;A system will need some sort of runtime validation eventually. Consider separating your validation logic into composable pieces using a library like zod&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>cleancode</category>
      <category>functionaljs</category>
    </item>
    <item>
      <title>hyper Enhancements</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Wed, 09 Mar 2022 21:34:25 +0000</pubDate>
      <link>https://dev.to/hyper/hyper-enhancements-13bc</link>
      <guid>https://dev.to/hyper/hyper-enhancements-13bc</guid>
      <description>&lt;p&gt;Announcing the Crysknife release!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d0aT8Okq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2Aics-OEGrkcdlgO38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d0aT8Okq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2Aics-OEGrkcdlgO38.png" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hyper team is pleased to announce &lt;a href="https://docs.hyper.io/cloud/whats-new"&gt;new enhancements&lt;/a&gt; to our service cloud platform for startups. hyper cloud is a scalable, backend cloud-based service to store and retrieve resources such as data, files, cached data, etc. &lt;strong&gt;No dev-ops required&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhancements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Updated hyper-connect with Queue and Storage. The &lt;a href="https://docs.hyper.io/cloud/hyper-connect"&gt;hyper-connect&lt;/a&gt; SDK now supports queue and storage services.&lt;/li&gt;
&lt;li&gt;🔥&lt;a href="https://docs.hyper.io/cloud/whats-new#zl-delete-a-service-instance"&gt;Delete a service instance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎉 &lt;a href="https://github.com/hyper63/hyper-ext-model"&gt;hyper-ext-model&lt;/a&gt; is an experimental hyper-connect extension that creates a model for an application that uses the hyper service.&lt;/li&gt;
&lt;li&gt;🎓 New NodeJS &lt;a href="https://docs.hyper.io/cloud/whats-new#mx-new-queue-service-quickstart"&gt;Queue Quickstart&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;😎 &lt;a href="https://docs.hyper.io/cloud/whats-new#wl-hyper-vision-enhancements"&gt;hyper vision enhancements&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🪄 &lt;a href="https://docs.hyper.io/cloud/whats-new#ey-enhanced-service-type-progress-steps"&gt;Enhanced service type progress steps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;👩🏽‍💻 &lt;a href="https://docs.hyper.io/cloud/whats-new#ta-improved-error-responses-from-cloudhyper"&gt;Improved error responses&lt;/a&gt; from cloud.hyper&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🍾 We’ve reached over 100 accounts created on hyper cloud. &lt;a href="https://dashboard.hyper.io/"&gt;Sign up&lt;/a&gt; for a &lt;strong&gt;free&lt;/strong&gt; hyper cloud account.🍾&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For more details, head on over to &lt;a href="https://docs.hyper.io/cloud/whats-new"&gt;What’s New&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Keeping it steezy,&lt;/p&gt;

&lt;p&gt;The hyper team&lt;/p&gt;

</description>
    </item>
    <item>
      <title>March hyper madness</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Sat, 05 Mar 2022 15:02:30 +0000</pubDate>
      <link>https://dev.to/hyper/march-hyper-madness-3j68</link>
      <guid>https://dev.to/hyper/march-hyper-madness-3j68</guid>
      <description>&lt;h4&gt;
  
  
  hyper is going BETA! ⚡️️️⚡️
&lt;/h4&gt;

&lt;p&gt;Our small developer preview has reached 100 accounts 🎉 and we are thankful 🙏 for the support and encouragement. Now that all of our hyper OSS ports are available via the cloud service we are ready to invite more developers to the platform.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;hyper will always have a free tier for developers, giving developers a chance to evaluate, prototype and experiement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Signup and start innovating today with hyper at &lt;a href="https://dashboard.hyper.io"&gt;https://dashboard.hyper.io&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Events in March
&lt;/h4&gt;

&lt;p&gt;There is a lot going on in March 2022 in the hyper verse.&lt;/p&gt;

&lt;h4&gt;
  
  
  March 17 — CHSJS Meetup — Remix and Github Actions
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XcCxkq8s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AH2e1liJ5HdzXBDdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XcCxkq8s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AH2e1liJ5HdzXBDdo.png" alt="" width="880" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can register here: &lt;a href="https://www.meetup.com/CharlestonJS/events/283033703/"&gt;https://www.meetup.com/CharlestonJS/events/283033703/&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  March 23 — Starters Guide to API Development
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dFGP0qlh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AhEFtXmRaZ9ZkXlEc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dFGP0qlh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AhEFtXmRaZ9ZkXlEc.png" alt="" width="880" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can register here: &lt;a href="https://www.charlestondigitalcorridor.com/talent/cdcu/1620179435385-starters-guide-api-design-scalable-application-architecture/"&gt;https://www.charlestondigitalcorridor.com/talent/cdcu/1620179435385-starters-guide-api-design-scalable-application-architecture/&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  March 29 — Opensource 101 — hyper OSS
&lt;/h4&gt;

&lt;p&gt;You can register here: &lt;a href="https://opensource101.com/registration/"&gt;https://opensource101.com/registration/&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Keep on a lookout for the hyper BETA announcement! 👀
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Community
&lt;/h4&gt;

&lt;p&gt;Join our Slack community and say 👋 &lt;a href="https://hyper.io/slack"&gt;https://hyper.io/slack&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ship First Development</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Thu, 24 Feb 2022 10:49:57 +0000</pubDate>
      <link>https://dev.to/hyper/ship-first-development-544d</link>
      <guid>https://dev.to/hyper/ship-first-development-544d</guid>
      <description>&lt;p&gt;Just do it, before you write a single line of code, automate your CI/CD pipeline, have a single passing test, that tests nothing and have a deployment script that publishes your project to a staging environment, then a production environment, or embrace &lt;a href="https://trunkbaseddevelopment.com/"&gt;trunk-based development&lt;/a&gt; and just have a production environment. The point is to take the time upfront to set up your automated delivery pipeline first before you start to write code.&lt;/p&gt;

&lt;p&gt;Before hyper, I was part of a team building a new software application and during the development process, everything was going great in our local environment. We were knocking out features left and right and our tests were verifying everything. As time went on, we would demo our work to our stakeholders, they would see the progress, but continue to make adjustments. These adjustments made the usability of the software better, but they impacted our capacity as the delivery date became closer. We shifted into another gear and began to implement the adjustments to the software application. Now it is time to ship our product, no sweat, we just push our code to the staging environment, then the production environment.&lt;/p&gt;

&lt;p&gt;Code push “take one”, 404, what? How can that be? Is the database running? Is it accessible by the application? Is the application running? Check the logs, oh it’s missing a dependency that happened to be installed on the local machine. Code push “take two”, success! no more 404, but authentication does not work, I can’t sign up. WTF, oh crap, we need to create a new OAuth2 service for both staging and production, because the callback URL needs to point to the actual environment. Code push take three, another issue, anyway, eventually we get the app deployed by the delivery date, but the process was a process of stress. And because the timeline was so tight we completely lost focus of documenting our deployment process or the time to create robust delivery scripts.&lt;/p&gt;

&lt;p&gt;What is the answer? It’s obvious, hire an SRE to do this for you right? Well, that will work, but that SRE needs to know everything about your app and technical stack, they need the time to understand what decisions you made and why you made them, then they need to start to dynamically create the deployment scripts, etc. Which will take time, and for many teams this is a valid process. But, I would like to recommend another approach, how about “ship your app first”, before one line of business logic is written. Take the time upfront to create the environments and write the automated deployment scripts and wire everything up end to end. Put a coming soon page up for your app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why?
&lt;/h4&gt;

&lt;p&gt;Simple, automation is easier to get right when not under duress. For example, all of your tasks are complete, everything works on your machine, the reviews have gone great and the stakeholders are excited to see your deliverable in a production environment. They think it will only take a minute, a push of the button to promote your incredible code to a production environment that meets all the performance and security requirements.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Guess what?&lt;/em&gt; The CI/CD setup always takes time, even for simple things, it takes time and there are always issues that come up between your dev environment and the staging and production environments, you may find the tests don’t run in the CI because they are missing some unexpected dependency. Or you may find that the SSL Cert is not generating because y0u don’t have the correct DNS configuration and you need operations to configure it and they are busy with other issues. You may find that the Redis production server you were promised months ago is not ready yet. This creates drama and anxiety and leads to pressure and frustration.&lt;/p&gt;

&lt;h4&gt;
  
  
  Just ship it! 🐿
&lt;/h4&gt;

&lt;p&gt;I have found, taking the time to set up CI/CD before writing code saves a lot of time and effort and reduces frustration at the point of delivery. Give it a try! You will be surprised.&lt;/p&gt;

&lt;h4&gt;
  
  
  CI (Github actions)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;on:
  push:
    branches: "**"
    tags-ignore: "*"

jobs:
  test-deno:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        deno-version: [1.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Deno $
        uses: denoland/setup-deno@v1
        with:
          deno-version: $
      - run: make
        env:
          CI: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CD (Github actions)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jobs:
  publish-nest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: denoland/setup-deno@v1
        with:
          deno-version: v1.x
      - run: deno install -A -f --unstable --no-check https://x.nest.land/eggs@0.3.6/eggs.ts
      - run: |
          export PATH="/home/runner/.deno/bin:$PATH"
          eggs link ${{ secrets.NESTAPIKEY }}
          eggs publish --yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What if I am adding a new feature to an existing product?
&lt;/h4&gt;

&lt;p&gt;This is one of the best things about automation is the ability to use feature flags, create your new module and any dependencies with no code, but hidden behind a feature flag, and ship it! Make sure you can push changes in real-time, now all you have to do is write and test your feature, have the code reviewed, and BAM! you are done! “Easy peasy lemon squeezy!” 🍋&lt;/p&gt;

&lt;h4&gt;
  
  
  “Ship first, code later”
&lt;/h4&gt;

&lt;p&gt;It may feel different, but it is not that hard and once you see the benefits you will jump for joy because you will no longer fear that push of code, it is done, you just have to make it work, which is the easy part 😀!&lt;/p&gt;

&lt;h4&gt;
  
  
  Not convinced? Trust the science!
&lt;/h4&gt;

&lt;p&gt;A DevOps study conducted with 5,000 developer teams assessing the quality and performance, and it turns out the teams that ship code multiple times a day have a higher quality score than teams that ship code weekly, monthly or quarterly. To dive deeper read Accelerate — &lt;a href="https://www.amazon.com/Accelerate-Software-Performing-Technology-Organizations/dp/1942788339"&gt;https://www.amazon.com/Accelerate-Software-Performing-Technology-Organizations/dp/1942788339&lt;/a&gt; or google DORA metrics. It will be time worth investing. While you are reading, ship your code, go ahead right now and push that developing code behind a feature flag, and know, that when it works on your machine, it will work in production! 🐿&lt;/p&gt;

&lt;h4&gt;
  
  
  BONUS: Pro Tip
&lt;/h4&gt;

&lt;p&gt;Develop in the cloud! By developing in the cloud, you keep your development environment clean and similar to the deployment environment. We use &lt;a href="https://gitpod.io"&gt;https://gitpod.io&lt;/a&gt; for our development environment and the result is frictionless experiences.&lt;/p&gt;

&lt;h4&gt;
  
  
  ⚡️hyper can help you ship! Spin up Data, Cache, Search, Storage, and Queue Services with a single click! Check it out at &lt;a href="https://hyper.io"&gt;https://hyper.io&lt;/a&gt;
&lt;/h4&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
      <category>shiftleft</category>
    </item>
    <item>
      <title>It’s your dime.</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Wed, 16 Feb 2022 20:08:25 +0000</pubDate>
      <link>https://dev.to/hyper/its-your-dime-24c0</link>
      <guid>https://dev.to/hyper/its-your-dime-24c0</guid>
      <description>&lt;p&gt;For all the non-technical and technical folks out there, I’d like to explain the genius behind hyper and our software development kit (SDK). With hyper, you can put the power back in the hands of your application developers, get things done, and get back to delighting your customers.&lt;/p&gt;

&lt;p&gt;Why should you consider using hyper?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hyper is easy.&lt;/strong&gt; Spin up backend services such as databases, search engines, and file storage buckets (to name a few) in seconds with literally a few clicks. It’s painless and friction-free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyper is inexpensive.&lt;/strong&gt; Start-ups that don’t have to spend hundreds of thousands of dollars on dev-ops personnel and database administrators have an advantage. &lt;a href="https://dashboard.hyper.io/"&gt;Sign up&lt;/a&gt; and try hyper for free. When you’re ready to get serious, our &lt;a href="https://docs.hyper.io/cloud/payment-and-pricing-terms"&gt;Pro plan&lt;/a&gt; is just $99.00 per month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus on features.&lt;/strong&gt; Hyper allows you to focus on your time and resources on your customers. It’s your dime. Would you rather spend it on features or managing backend services?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyper is secure, scalable, and performant.&lt;/strong&gt; This is what we do and we do it well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyper is composable.&lt;/strong&gt; What does this mean? A software developer can gracefully connect calls from one service, such as a call to the data service, to another, such as a call to the cache service. This is made possible by our &lt;a href="https://docs.hyper.io/cloud/hyper-connect"&gt;promised-based SDK&lt;/a&gt;. Its consistent shape and behavior provide a great developer experience. See our related blog posts on &lt;a href="https://blog.hyper.io/hyper-cache/"&gt;Caching all the things&lt;/a&gt; and &lt;a href="https://blog.hyper.io/composing-hyper-data-and-cache/"&gt;Composing Data and Cache&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In conclusion, hyper is unique in its ability to easily spin up new backend services, such as data, cache, queue, storage, and search in the cloud. How easy? Literally, just a few clicks. Skeptical? &lt;a href="https://dashboard.hyper.io/"&gt;Sign up&lt;/a&gt; and create a new hyper application and backend services for &lt;em&gt;free&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Keeping devs happy,&lt;/p&gt;

&lt;p&gt;⚡️ hyper team ⚡️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>saas</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Composing hyper data and cache services</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Wed, 16 Feb 2022 20:05:33 +0000</pubDate>
      <link>https://dev.to/hyper/composing-hyper-data-and-cache-services-416m</link>
      <guid>https://dev.to/hyper/composing-hyper-data-and-cache-services-416m</guid>
      <description>&lt;p&gt;hyper cache is a cache document store that provides a clean API to cache JSON documents. Caches are good for all sorts of things, to take the stress off of your transactional database when performing reads, to provide sessions for authentication, to contain simple aggregate values for dashboards and metrics, and more. Cache systems are complex and a challenge to set up and maintain. hyper removes this burden. hyper makes it easy to cache.&lt;/p&gt;

&lt;p&gt;Why should I consider hyper?&lt;/p&gt;

&lt;p&gt;For example, a dev could save data into the hyper data service followed by caching the document. Your application’s API can check for the data’s existence in the cache, and if it exists, retrieve popular data requests from memory rather than the disk. This has several advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt; : Retrieving data from cache is much faster than retrieving data from a database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conservation&lt;/strong&gt; : Retrieving data from a cache takes pressure off your database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delight&lt;/strong&gt; : A performant app delights the customer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s a TypeScript code sample that saves a JSON document into a hyper data service followed by caching the document into a hyper cache service. Since the calls to &lt;a href="https://docs.hyper.io/cloud/hyper-connect"&gt;hyper-connect&lt;/a&gt; are promised-based, the calls to data and cache can be chained together:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4AZpNpwr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2Ahe2GbiGam3Bfk3f_.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4AZpNpwr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2Ahe2GbiGam3Bfk3f_.png" alt="" width="880" height="2135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, while the code sample above demonstrates a fairly happy path, it does illustrate composition of individual hyper backend services. Ready learn more? Check out our &lt;a href="https://blog.hyper.io/"&gt;blogs&lt;/a&gt;, &lt;a href="https://docs.hyper.io/cloud"&gt;docs&lt;/a&gt;, &lt;a href="https://docs.hyper.io/cloud/workshops"&gt;workshop videos&lt;/a&gt;, and &lt;a href="https://docs.hyper.io/cloud/quickstarts"&gt;quickstarts&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Shhhh don’t tell anyone. We’re building an experimental project: ⚡️ &lt;a href="https://github.com/hyper63/hyper-ext-model"&gt;hyper-ext-model&lt;/a&gt; ⚡️. hyper-ext-model is a &lt;a href="https://docs.hyper.io/cloud/hyper-connect"&gt;hyper-connect&lt;/a&gt; extension that creates a model for an application that uses the hyper service. Using this extension you can compose hyper data, cache, search, storage, and queue (notification) services into a generic data model to define a given domain and provide basic business rules. You can specify rollback &lt;a href="https://github.com/hyper63/hyper-ext-model#modes"&gt;modes&lt;/a&gt; of atomic or non-atomic for those not-so-happy-paths. 😀 😔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s all about the dx y’all,&lt;/p&gt;

&lt;p&gt;The hyper team.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>3 responsibilities every software startup should address</title>
      <dc:creator>hyper</dc:creator>
      <pubDate>Tue, 15 Feb 2022 20:00:42 +0000</pubDate>
      <link>https://dev.to/hyper/3-responsibilities-every-software-startup-should-address-5gcm</link>
      <guid>https://dev.to/hyper/3-responsibilities-every-software-startup-should-address-5gcm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Are you a founder or leader of a software startup? If so you want to incorporate a CTO role into your organization, it does not necessarily require a full-time employee, but the role should be addressed within your technical team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(see&lt;/em&gt; &lt;em&gt;glossary&lt;/em&gt; &lt;em&gt;below for clear definition of technical terms)&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In working over 25 years with several startups to publicly traded companies and now consulting with many startups, I have found a recipe for success to creating high-performing development teams and high quality software. There are a set of requirements that should have focus and importance for the continued success of a software startup. This focus has been applied to startups like &lt;a href="https://citibot.io"&gt;Citibot&lt;/a&gt;, &lt;a href="https://hyper.io"&gt;Hyper&lt;/a&gt;, NeedConnect, and RezRev in the role of a fractional CTO. In this article, I will introduce you to these responsibilities in the shape of a CTO role with these core responsibilities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To fully understand the value a CTO can provide for a Startup Company lets dive into the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is CTO? Define the CTO Role&lt;/li&gt;
&lt;li&gt;CTO Responsibility 1 — Oversight and Direction (Values and Principles)&lt;/li&gt;
&lt;li&gt;CTO Responsibility 2 — Strategy and Vision (Methods and Practices)&lt;/li&gt;
&lt;li&gt;CTO Responsibility 3 — Client Empathy and Communication (Transparency)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chief Technology Officer / VP of Engineering / Lead Engineer are various roles you may encounter in technology-driven companies. The CTO may not be a full-time person in a startup, but a fractional role that may be played by a founder, consultant, or technical lead. Often the responsibilities of a CTO and the value of executing on those responsibilities are not realized early in the company’s growth. Let’s explore the role and responsibilities of a CTO and how a CTO can help set a technical startup company for success.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is a CTO?
&lt;/h4&gt;

&lt;p&gt;The role of a CTO is to provide and curate the technology strategy and vision of the company’s software tools and technologies. In this role the CTO has the following responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To provide oversight and direction for the technology group&lt;/li&gt;
&lt;li&gt;To establish and communicate a clear vision of the software architecture and lifecycle of the company’s software products&lt;/li&gt;
&lt;li&gt;To meet and work with customers and prospects to help provide clarity and understanding of the technical abilities and capabilities of the company’s software products&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Oversight and direction
&lt;/h4&gt;

&lt;p&gt;Software Development is in a constant state of motion that changes over time, based on a continuous feedback loop between the users of the software and the creators of the software. In order for this loop to remain highly functional and productive, it is a good idea to establish a system for checks and balances. Good working systems approach the delivery of the software in a “verify” mode. You may have heard of the phrase “Don’t Trust, Verify”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don’t Trust, Verify is a common communication strategy used in the blockchain development world, but it applies with all software code, we have tools and technologies that can quickly verify effective code, via automated testing and scanning tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This mode requires that the software is verified by the stakeholders, product team, or quality assurance team. In startups, depending on the size this may be founders, salespeople, or a dedicated product or quality review team. A CTO can help provide a vision and plan for a more efficient and productive review cycle. By establishing agreed-upon values and practices, the verification of delivery can require a high degree of automation to create high-quality deliverables.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://agilemanifesto.org/"&gt;agile manifesto&lt;/a&gt; has a great starting point for defining the values of a software development organization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individuals over interactions&lt;/li&gt;
&lt;li&gt;Working software&lt;/li&gt;
&lt;li&gt;Customer collaboration&lt;/li&gt;
&lt;li&gt;Responding to change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These four values are great values, and all participants in the software lifecycle will agree to these values. There are some additional values that I have implemented with several startups and consider to be a standard approach, that may require some debate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrity/Commitment to Quality&lt;/li&gt;
&lt;li&gt;Automate repeatable operations&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Quality first or “Shift Left” and Automate repeatable operations are strategies formed from the DevOps movement and are considered industry standard, proven and documented in the &lt;a href="https://www.amazon.com/Accelerate-Building-Performing-Technology-Organizations/dp/B07BMBYHXL/ref=sr_1_1?hvadid=241653451130&amp;amp;hvdev=c&amp;amp;hvlocphy=9010526&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=12362379891764064156&amp;amp;hvtargid=kwd-307609789829&amp;amp;hydadcr=21874_10169699&amp;amp;keywords=accelerate+book&amp;amp;qid=1644845702&amp;amp;sr=8-1"&gt;ACCELERATE book&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Lean development strategy (Lean development is the process of continuous delivery in small batches, this approach results in shipping production code multiple times a day instead of a weekly or bi-weekly cycle. Reference &lt;a href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912"&gt;Continuous Delivery&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Keep it simple (functional thinking — approaching software design and development using simplicity References, &lt;a href="https://www.amazon.com/Grokking-Simplicity-software-functional-thinking/dp/1617296201/ref=sr_1_2_sspa?hvadid=518090872306&amp;amp;hvdev=c&amp;amp;hvlocphy=9010526&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=3621213628978164124&amp;amp;hvtargid=kwd-1185437262936&amp;amp;hydadcr=14909_9746144&amp;amp;keywords=grokking+simplicity&amp;amp;qid=1643746742&amp;amp;sr=8-2-spons&amp;amp;psc=1&amp;amp;spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExR1RFWktUQzBYUEY0JmVuY3J5cHRlZElkPUEwMzkyNTE3MTAzVTk2WkgyU09LSSZlbmNyeXB0ZWRBZElkPUEwMzEwMTM5MTVWNjAwR01aWlMyMiZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU="&gt;Grokking Simplicity&lt;/a&gt; and &lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"&gt;Clean Architecture&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there may be more to consider, &lt;strong&gt;the most important thing is to capture values and define them for your team and make them transparent to the team&lt;/strong&gt; , each team member should apply your team’s values to every decision being discussed or determined and they can act as guard rails to protect the commitment to the success of the software and the success of the company.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the future we will expand deeper into the process of establishing core values and explore how to implement some of the core values I have mentioned here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other resources to check out: &lt;a href="https://12factor.net/"&gt;Twelve Factors&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Idea to product (like farm to table)
&lt;/h4&gt;

&lt;p&gt;Often times a company is born by an idea and the team creating the idea is not thinking about the far-off future of success, but thinking about the near-term challenge of creating enough value of a product to establish a sale. Early in my career, I was working for a startup company without clearly defined values for how the software developers should make decisions. Every developer and development team had to figure it out on their own with immense pressure to deliver features on fixed delivery dates. As a result, many shortcuts were applied and the software architecture formed organically and not by design, which resulted in complexity and confusion, and a lot of duplication of functionality. The result was a fragile product that contained lots of bugs. These bugs started to reduce the productivity of the teams, which resulted in delays and the inability to deliver features. Over time the creators of the software left and new developers were required to come in and work through the project with little documentation and scarce resources for direction. A common term to describe this situation is technical debt. Technical debt is a term that defines the trade-off between quality, cost, and time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Technical Debt (UnIntentional) — is best defined in the &lt;a href="https://stripe.com/reports/developer-coefficient-2018"&gt;developer coeffcient report&lt;/a&gt; — 17 hours a week or 42% of a developers time is spent on code maintenance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without a north star of identified values or principles, the likely hood that your software company can fall victim to un-intentional technical debt is increased greatly, and the sooner a startup company can define and instill values in the development practice the less likely large un-intentional technical debt will happen. The importance of oversight and direction to create accountability and purpose can not be overlooked and is a cornerstone responsibility of a CTO.&lt;/p&gt;

&lt;h4&gt;
  
  
  Strategy and Vision
&lt;/h4&gt;

&lt;p&gt;Having software developer values or principles is a great start but these guidelines need to translate down to practices and processes that shape your architecture/design and delivery lifecycle. A CTO is responsible for establishing the practices in a collaborative manner with the development team. These practices describe the architecture design patterns your team will implement as well as the approach to software delivery. But first to apply a clear vision of the product and approach. A great way to achieve this is to answer 10 questions called an inception deck. This inception deck asks the team to answer 10 questions about the product and plan that the team will develop. Regardless of approach, your team needs to understand the vision and purpose of the software product, what is the definition of success for the product? What is the technical stack? What is the budget? What is the timeline? What are the roles required to achieve the objective? How much will it cost for a minimum viable product, how much time will it take?&lt;/p&gt;

&lt;p&gt;There are a couple of practices that should be heavily considered on all projects and have been scientifically proven to create successful results. They are Continuous Delivery and Clean Architecture. We will explore these practices in the future. This core responsibility is to work with the team to establish the vision and practices to determine success for the software product. The benefit is that there will be strong clarity for each member of the team and as the team grows and things evolve knowledge can be transferred in a clear and transparent flow.&lt;/p&gt;

&lt;h4&gt;
  
  
  Client empathy and communication
&lt;/h4&gt;

&lt;p&gt;Technology and Software are confusing to a lot of people, from how it works to the complexity and challenges, customers/prospects may not want to get deep into the weeds of the technology, but often they need to be able to understand the value at a high level. The responsibility of the CTO is to be able to explain the technology in an understandable way for stakeholders, leaders, customers, and prospects. This is not as easy as it may seem, the complexity lies in calculating a baseline of understanding by the audience and adjusting the presentation in a way that transfers meaning. You will need to understand the audience’s environment, and deeply understand the problem the software product is looking to solve. Users gauge value on outcomes, and any process needs to have strong visibility of the outcomes it produces. These outcomes can be measurements or emotions, measurements usually form in productivity milestones. A user is able to x process y times faster using this software product. A user enjoys the experience of using this software to accomplish their goals.&lt;/p&gt;

&lt;p&gt;Effective communication of complex technology is often led by leveraging empathy, and you can become an effective communicator of how the technology your team is building can support the core needs of the user.&lt;/p&gt;

&lt;h4&gt;
  
  
  Infuse the communication into the product itself
&lt;/h4&gt;

&lt;p&gt;Once you establish an effective communication strategy, it is worth thinking about embedding this communication into the product itself. The term is called User Experience, and the more the product can communicate the features and functionality in a relatable way to the user the better the experience. In consumer products this can be in the form of creative communication messages or spinners and in more enterprise applications it can be in the form of dashboards and metrics. The more your product can tell a relatable story to your user the better chance for success and separation from the competition.&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;What is a CTO? A CTO is a role that provides and curates the strategy and vision of the software tools and technologies your company provides either to internal stakeholders or external customers. In order to fulfill that role the CTO must perform the following responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To provide oversight and direction for the company technical group&lt;/li&gt;
&lt;li&gt;To establish and communicate a clear vision of the software architecture and life cycle of the companies software products&lt;/li&gt;
&lt;li&gt;To meet and work with customers and prospects to help provide clarity and understanding of the technical abilities and capabilities of the companies software products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a startup founder, you may be thinking about budget, time, and fundraising. You may have hired an agency or freelancer to tackle the technical side and don’t want to worry about the details. There are many stories where that kind of approach has led to failing outright or costly technical debt and very plain cookie-cutter products. No matter what stage of your software product or products, make sure you have a strong strategy and vision in place to empower your technical team to become high-performing and successful. By investing attention to these responsibilities you will find an increased opportunity for success and you will find loyal and happy software team members leveraging all of their creativity and talent toward a common purpose.&lt;/p&gt;

&lt;h4&gt;
  
  
  Still, have questions?
&lt;/h4&gt;

&lt;p&gt;If you want to learn more about a Startup CTO and how to approach software development as a startup, sign up to get notified when the next chapter of the Startup CTO book will be available.&lt;/p&gt;

&lt;h4&gt;
  
  
  Glossary
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Software Architecture — The design of the software how the code is organized for maintainability, scalability, reliability, the more intentional in the design of software the better. You can also define software architecture in the terms of goals, the goal of software architecture is to create software that empowers high productivity and low cost over time in economies of scale.&lt;/li&gt;
&lt;li&gt;Software Lifecycle — Is the description of the process from feature to user, in order for a software feature to get to a user a series of steps or events need to occur, the description of these events organized in a timeline is known as the software development lifecycle. A common high-level lifecycle is the following: Design -&amp;gt; Develop -&amp;gt; Test -&amp;gt; Document -&amp;gt; Deploy&lt;/li&gt;
&lt;li&gt;Technical Debt (UnIntentional) — The added maintenance and support required over time that must be completed in order to keep software functional, as a code based grows the debt can build up and productivity slows and the cost of software increases exponentially.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cto</category>
      <category>technology</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
