<?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: David Miranda</title>
    <description>The latest articles on DEV Community by David Miranda (@panphora).</description>
    <link>https://dev.to/panphora</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%2F122987%2F9b28686f-ff1f-4ae2-96bc-020b1c6a860b.png</url>
      <title>DEV Community: David Miranda</title>
      <link>https://dev.to/panphora</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/panphora"/>
    <language>en</language>
    <item>
      <title>Build your first Remake app</title>
      <dc:creator>David Miranda</dc:creator>
      <pubDate>Wed, 17 Mar 2021 15:03:33 +0000</pubDate>
      <link>https://dev.to/panphora/build-your-first-remake-app-243o</link>
      <guid>https://dev.to/panphora/build-your-first-remake-app-243o</guid>
      <description>&lt;p&gt;This is a story of two problems and two solutions.&lt;/p&gt;

&lt;p&gt;My first problem was a problem of my own creation. I read a lot of blog posts online, many of them so good that I save them for later, to re-read and share. I started with a simple page on my website where I just kept a list of those links, and why I enjoyed them. But eventually, the list became slow and annoying to update manually — I wanted an app.&lt;/p&gt;

&lt;p&gt;That’s when I came upon my second problem, which was very much not my own: Even for something super, super simple, like &lt;em&gt;I want a page on the Internet where I can share an updated list of links&lt;/em&gt;, it takes a lot of work to get something working. &lt;strong&gt;The road from idea to prototype is covered with excuses not to build&lt;/strong&gt;, and I’m sure you’ve felt the same problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://remaketheweb.com/"&gt;Remake&lt;/a&gt; sweeps away those excuses. I took a few hours on a Friday to sketch out an idea for &lt;a href="https://shelfpageapp.remakeapps.com/"&gt;Shelf.page&lt;/a&gt; and build it with Remake.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qBy2fCY0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qBy2fCY0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/01.png" alt="A preview of the shelf.page web app"&gt;&lt;/a&gt;A preview of the shelf.page web app&lt;br&gt;
Shelf.page is representative of a really common kind of app. Every user gets a profile or account page at a unique URL, with a bunch of fields to customize their page and edit it themselves. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remake shines at building these kinds of apps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Normally, I would spend the first hour or two of starting a project like this: installing tools, setting up a database, and connecting all the components together, but Remake let me build a full-stack app while focusing on just frontend code. This, combined with one-liner deploys and fast builds, makes Remake rocket fuel for building these kinds of single-page apps — &lt;em&gt;I finished Shelf.page in about half the time I expected it to take!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The rest of this post is about Remake, and how it could cut down your time-to-launch to help you build faster, too.&lt;/p&gt;

&lt;p&gt;If you already know what Remake is, and want to just get started with code, feel free to skip down to the Create Remake section.&lt;/p&gt;
&lt;h2&gt;
  
  
  What’s Remake?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://remaketheweb.com/"&gt;Remake&lt;/a&gt; lets you write an app by describing your idea in annotated templates, not writing boilerplate code.&lt;/p&gt;

&lt;p&gt;When you get down to it, Remake is a framework. And frameworks are always about abstracting out some repetitive, common part of projects. So a good way to understand Remake is to ask, &lt;em&gt;what does Remake abstract for you?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In my experience, Remake is built on three big ideas.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Describe your app with annotated templates
&lt;/h3&gt;

&lt;p&gt;The headline feature of Remake is that you can describe your entire app in a few templates. Remake looks at the shape of your data, and some annotations you add to your template, and takes care of making data editable and interactive in your page.&lt;/p&gt;

&lt;p&gt;We’ll dive deeper into Remake’s annotations (attributes) later in the post, but here’s a taste. Let’s say you want every user to have an editable “name” field on their account. You can write a template with some attributes, like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-name"&lt;/span&gt;
  &lt;span class="na"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;key:name=&lt;/span&gt;&lt;span class="s"&gt;"@innerText"&lt;/span&gt;
  &lt;span class="na"&gt;edit:name&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ name }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Remake that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This field is a property on the user’s account object (&lt;code&gt;object&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;This field should be stored under the label “name” in the user’s account (&lt;code&gt;key:name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;This field should be editable on the page, for the account owner (&lt;code&gt;edit:name&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are a few more directives that combine together to add &lt;strong&gt;a layer of editability over your app that’s smart enough to know how you store your data&lt;/strong&gt;. Combined with &lt;a href="https://handlebarsjs.com/"&gt;Handlebars templates&lt;/a&gt;, Remake gives you a way to create fully interactive, editable web pages with just templates sprinkled with annotations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Write templates that describe how your data relates to your UI, and Remake does the rest.&lt;/em&gt; &lt;strong&gt;This is a core idea of Remake.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. *&lt;strong&gt;&lt;em&gt;Zero-config user accounts and emails&lt;/em&gt;&lt;/strong&gt;*
&lt;/h3&gt;

&lt;p&gt;I’ve made &lt;a href="https://thesephist.com/projects/"&gt;lots of side projects over the years&lt;/a&gt;, but every time I start a new one, I always need to stop and ask myself if I want to support user accounts, because authentication and account management is an evergreen hassle. Even for prototypes and quick hacks, setting up a database, creating login flows, copy-pasting code from some other project to remember how to implement login securely … all of this takes time, and none of it adds to the actual functionality of the idea I’m trying to bring to life.&lt;/p&gt;

&lt;p&gt;Remake apps know how to set up and manage accounts, so in building my own Shelf.page app, I never had to worry about setting up an authentication system. Because I also deployed through Remake’s CLI and platform, user accounts &lt;em&gt;just worked&lt;/em&gt; — password resets, login, account pages, the whole thing.&lt;/p&gt;

&lt;p&gt;There’s a tradeoff to this zero-configuration setup: There’s not a whole lot you can customize about the login process. It doesn’t support logging in with Google or Apple accounts, for example, and doesn’t support two-factor authentication. But until your idea grows out of the early phase of getting &lt;em&gt;some&lt;/em&gt; traction, having to worry little about account management will probably save me hours off each project, and add years to my life.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Opinionated ecosystem for one-liner deployments
&lt;/h3&gt;

&lt;p&gt;A lot of the strengths of Remake like zero-config accounts, smart templates, and easy deploys are possible because Remake is &lt;em&gt;opinionated&lt;/em&gt; about how your project should be set up.&lt;/p&gt;

&lt;p&gt;Like Ruby on Rails or Create React App, Remake comes with a CLI that helps you set up a Remake project. If you follow Remake’s conventions about where files go and how pages are rendered, in return Remake’s CLI also gives you a local development server out of the box and a way to deploy a production app to Remake’s deployment service with a CLI one-liner, remake deploy.&lt;/p&gt;

&lt;p&gt;A second benefit of an opinionated design is that, if you have multiple Remake projects, you’ll never have to open up an old project and sit there trying to remind yourself where you put the exact file or page template you’re looking for — every project is roughly structured the same.&lt;/p&gt;

&lt;p&gt;Taken altogether, by having a clear, opinionated model of describing how your data is related to your UI, Remake lets you write an app by just describing your idea, not wiring together lots of boilerplate code.&lt;/p&gt;

&lt;p&gt;Let’s see how these pillars of Remake come together to actually help build a real app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Remake!
&lt;/h2&gt;

&lt;p&gt;Every Remake project starts the same:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx remake create shelf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b"&gt;npx&lt;/a&gt; is a package runner for NPM libraries — it helps you run commands from NPM packages without installing it globally.&lt;/p&gt;

&lt;p&gt;Here, I wanted to create an app called shelf, but you can pick your own name. Once we run the command, Remake will make a new folder named shelf (or a name you pick) with a starter Remake app inside. If you’ve used Create React App, this might feel familiar.&lt;/p&gt;

&lt;p&gt;To test out the starter app, we can cd into the new project and run the dev server:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd shelf
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Remake will take a second to build the app, and start running the app at &lt;code&gt;localhost:3000&lt;/code&gt;. Visit the URL on your computer to see the starter app, which is a Trello clone. You can also find this demo &lt;a href="https://kanban.remakeapps.com/"&gt;on the Remake website&lt;/a&gt;. It should look like this.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6s-MbH1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6s-MbH1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/02.png" alt="Remake Trello clone web app"&gt;&lt;/a&gt;Remake Trello clone web app&lt;br&gt;
Try using the starter app to get a feel for how Remake apps work. Try adding, removing, and saving changes. Here are a few things I noticed in my brief tour.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mkqS9K-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mkqS9K-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/03.png" alt="Remake's built-in edit popover"&gt;&lt;/a&gt;Remake's built-in edit popover&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can click on titles of stacks or task items to edit the text inside.&lt;/li&gt;
&lt;li&gt;When you edit some text, a modal opens with buttons to save, cancel, or (sometimes) delete the item.&lt;/li&gt;
&lt;li&gt;You can drag-and-drop to reorder items in a list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is no Netflix, but there’s enough here to build many kinds of apps. Adding, removing, and changing things are the building blocks for everything from blogs and todo lists to personal dashboards.&lt;/p&gt;

&lt;p&gt;Let’s see what code makes this app possible by visiting &lt;code&gt;app/pages/app-index.hbs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;app-index.hbs&lt;/code&gt; file, which is a Handlebars template, we’ll find an HTML template sprinkled with attributes like &lt;code&gt;object&lt;/code&gt; and &lt;code&gt;edit:&lt;/code&gt;. You might have a guess as to what some of these attributes do, but for now, all we need to know is that &lt;strong&gt;these attributes are key to how Remake associates your app’s data with the template&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you change the template and reload the page in your browser, you should see any changes in the template now reflected in the page. Try tweaking a few things before we explore the rest of Remake, like changing the “Add stack” button’s text.&lt;/p&gt;
&lt;h2&gt;
  
  
  A tour of Remake
&lt;/h2&gt;

&lt;p&gt;Before diving into building an app with Remake, we should understand what goes where in a Remake project.&lt;/p&gt;
&lt;h3&gt;
  
  
  Static files in app/assets
&lt;/h3&gt;

&lt;p&gt;Every web app needs to serve assets like images, JavaScript files, and CSS stylesheets. These are saved in &lt;code&gt;app/assets&lt;/code&gt; under their respective folders. &lt;/p&gt;
&lt;h3&gt;
  
  
  Page templates in app/pages
&lt;/h3&gt;

&lt;p&gt;If you’ve been following along thus far, you might have a good guess about what these files do — they’re templates for pages in your app.&lt;/p&gt;

&lt;p&gt;For now, we only need to worry about &lt;code&gt;app-index.hbs&lt;/code&gt;, but here are what the other pages do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index.hbs&lt;/code&gt;: The “index page” of your app, when the user isn’t logged in (as opposed to app-index, for when the user is logged in).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user/&lt;/code&gt; templates: Pages related to account management, like login/sign up pages and password reset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the time, you’ll be editing &lt;code&gt;app-index.hbs&lt;/code&gt;. You can also add other pages next to &lt;code&gt;app-index.hbs&lt;/code&gt; to create new static or dynamic (templated) pages for each user. This might be useful if your app has multiple pages or a sub-page for a particular piece of data, for example.&lt;/p&gt;
&lt;h3&gt;
  
  
  Root templates in app/layouts
&lt;/h3&gt;

&lt;p&gt;You might have noticed that pages in app/pages don’t contain HTML boilerplate code like the page head. This is the responsibility of &lt;code&gt;app/layouts/default.hbs&lt;/code&gt;, which defines the app “shell” into which all your pages are rendered by Remake.&lt;/p&gt;
&lt;h3&gt;
  
  
  User data in app/data and _remake-data
&lt;/h3&gt;

&lt;p&gt;Remake stores user data in &lt;code&gt;data/database/user-app-data&lt;/code&gt; as JSON files. For example, for my user account with the username “thesephist”, Remake will create a &lt;code&gt;thesephist.json&lt;/code&gt; in which to store all my account data.&lt;/p&gt;

&lt;p&gt;If you’re used to storing data in a relational database like Postgres, this tradeoff means a few things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inspecting, editing, and debugging data is trivial, because you can just open the files to see how Remake sees your data.&lt;/li&gt;
&lt;li&gt;On the downside, storing data in files doesn't necessarily provide the same scalability and durability guarantees as a production-grade database.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the kinds of apps I’m making for myself and a small number of users, most of the time, the advantages end up outweighing the costs. Under app/data, we can define a default user data file that every new user will inherit, when they make a new account.&lt;/p&gt;
&lt;h2&gt;
  
  
  Thinking in Remake
&lt;/h2&gt;

&lt;p&gt;Remake started “clicking” for me when I learned that most of building a Remake app is &lt;strong&gt;finding a way to map a user’s data to parts of the user interface.&lt;/strong&gt; I call this &lt;em&gt;thinking in Remake&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When a user requests a page from a running Remake app, what actually happens?&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BWp4yRZ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BWp4yRZ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/04.png" alt="How the parts of Remake fit together"&gt;&lt;/a&gt;How the parts of Remake fit together&lt;br&gt;
After authenticating the user, Remake…&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches the data file (&lt;code&gt;{user-name}.json&lt;/code&gt;) for this user&lt;/li&gt;
&lt;li&gt;Finds the Handlebars template for the requested page&lt;/li&gt;
&lt;li&gt;Renders the page template with data from the user’s data file, and sends it to the browser, along with small CSS and JavaScript bundles for Remake’s UI.&lt;/li&gt;
&lt;li&gt;The browser then loads the page, and Remake’s scripts crawls the page for any elements annotated with Remake’s attributes to &lt;em&gt;understand how the UI maps back to the user’s data&lt;/em&gt;. When the user makes any edits to the page, the annotations tell Remake how to save those changes back to the backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A key piece of the puzzle to understand is that &lt;strong&gt;the template tells Remake how to render the page from the data; Remake attributes tell Remake how to save data back from the page’s UI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because of this, a good first step to building a Remake app is to map out how your user’s data connects to your UI. For my Shelf.page app, I started with a schema like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"displayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Linus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"bio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Student, writer, fan of the 90s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"topics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tech"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Remake"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"remaketheweb.com"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mozilla.com"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Community"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Get Together"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gettogether.world"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A user has a display name and a short bio, and owns a list of topics. Each topic has a name for the topic, and a list of links under it with a label and a URL.&lt;/p&gt;

&lt;p&gt;This shape of data maps really nicely to Shelf.page’s UI.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qmIK0QCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qmIK0QCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3.amazonaws.com/remake-web-assets/build-your-first-remake-app-blog-post/05.png" alt="The parts of the shelf.page application"&gt;&lt;/a&gt;The parts of the shelf.page application&lt;br&gt;
Once we’ve sketched this out, the work that remains is to express this in code! First, we write a Handlebars template for this page — this lets Remake render our page.&lt;/p&gt;

&lt;p&gt;Second, we add Remake attributes to our template, so Remake can save any edits. This is the topic of our next section.&lt;/p&gt;
&lt;h2&gt;
  
  
  Remake attributes
&lt;/h2&gt;

&lt;p&gt;Remake attributes have a lot of flexibility, but to get started, you’ll probably use them in a handful of useful combinations.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Editable text fields
&lt;/h3&gt;

&lt;p&gt;Most commonly, you’ll want to make a text field editable. In our example, we might want the user to be able to edit the &lt;code&gt;displayName&lt;/code&gt; property of our user data object. This takes three attributes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;  
  &lt;span class="na"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;key:display-name=&lt;/span&gt;&lt;span class="s"&gt;"@innerText"&lt;/span&gt;
  &lt;span class="na"&gt;edit:display-name:without-remove&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ display_name }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we tell Remake we’re talking about a property on a JSON object (&lt;code&gt;object&lt;/code&gt;), specifically the property display_name (&lt;code&gt;key:display-name&lt;/code&gt;). Then we make this field editable, but not removable, with &lt;code&gt;edit:display-name:without-remove&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Lists of things
&lt;/h3&gt;

&lt;p&gt;The next common case is a list of things. For example, you might want to add a task onto a todo list. If we have data that looks like below…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"topics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Computer science"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Writing"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...and we want to show a list of editable topics, we’ll use these attributes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; 
  &lt;span class="na"&gt;array&lt;/span&gt;
  &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"topics"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {{#for topic in topics}}
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; 
      &lt;span class="na"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;key:name=&lt;/span&gt;&lt;span class="s"&gt;"@search"&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; 
        &lt;span class="na"&gt;target:name&lt;/span&gt;
        &lt;span class="na"&gt;edit:name&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ topic.name }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  {{/for}}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There’s a lot going on here, so let’s break it down. As you follow along, consider how the hierarchy of the template matches the hierarchy of our data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At the top, we tell Remake we have an array (&lt;code&gt;array&lt;/code&gt;) of things at the property “topics” (&lt;code&gt;key="topics"&lt;/code&gt;). Within this div, Remake will consider the array the “root” of our data.&lt;/li&gt;
&lt;li&gt;We use Handlebars template notation to render an array of things &lt;code&gt;{{#for topic...}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Each section element corresponds to a single item in the array of topics, which is an object in our data. We tell Remake this with &lt;code&gt;object&lt;/code&gt;. &lt;code&gt;key:name&lt;/code&gt; tells Remake to “link” this element to a particular editable field, which will come in handy next.&lt;/li&gt;
&lt;li&gt;Finally, we have an editable field for our topic names. We make this field editable &lt;em&gt;and deletable&lt;/em&gt; with &lt;code&gt;edit:name&lt;/code&gt;. What happens when we delete this field? Deleting this field will delete the whole topic (the whole section element) because the topic is the closest JSON object that Remake could find in our data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;target:name&lt;/code&gt; Remake attributes are the key to this pattern. It tells Remake to link one editable field to another part of our template.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Adding an item to a list
&lt;/h3&gt;

&lt;p&gt;The last pattern to know is a button to add more items to a list. Given our template for a list from before, adding a button is straightforward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;array&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"topics"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {{#for topic in topics}}
    ...
  {{/for}}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;new:topic&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;New topic&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we added an element, &lt;em&gt;outside of our loop&lt;/em&gt; with the Remake attribute &lt;code&gt;new:topic&lt;/code&gt;, which tells Remake that clicking this button should add a topic item to our templated list of topics.&lt;/p&gt;

&lt;p&gt;These patterns were enough for me to build Shelf.page, and will help you get started making Remake apps. But if you’re interested in the full breadth of attributes offered by Remake, you can check out Remake’s data attributes documentation: &lt;a href="https://docs.remaketheweb.com/saving-data-attributes/"&gt;saving data&lt;/a&gt;, &lt;a href="https://docs.remaketheweb.com/updating-data-attributes"&gt;updating data&lt;/a&gt;, &lt;a href="https://docs.remaketheweb.com/reacting-to-data-attributes"&gt;reacting to data&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finishing touches and debugging tips
&lt;/h2&gt;

&lt;p&gt;Once we have the basics of the app working with a template, there are a few finishing touches you might want to add. You might also run into some bugs you’re not sure how to start fixing. Here are a few tips I picked up shipping my first Remake project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript&lt;/strong&gt;. Remake will not compile your JavaScript or CSS with Babel or SASS, but you can set those up yourself. Just make sure all your transpiled files end up in the &lt;code&gt;assets/&lt;/code&gt; directory. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layouts&lt;/strong&gt;. If you want to customize the “shell” of your app outside of the contents of page templates, you can update &lt;code&gt;app/layouts/default.hbs&lt;/code&gt; to add any stylesheets, script tags, or metadata you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging data&lt;/strong&gt;. If you suspect Remake isn’t saving your data the way you expect, a good place to check is &lt;code&gt;data/database/user-app-data&lt;/code&gt;, to see how Remake is saving your changes. If the data in the user JSON file isn’t shaped the way you expect, you could narrow down your search for the buggy parts of the template.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploy!
&lt;/h2&gt;

&lt;p&gt;Once you have a working Remake app, deploying is fast and simple on Remake’s deployment platform. From the root of your project folder, simply run the command&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx remake deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and Remake will copy the right files up and spin up your service! If this is your first time deploying, Remake might ask you to create an account.&lt;/p&gt;

&lt;p&gt;That’s it! You’ve deployed your Remake app, hassle-free. Try it out by going to your new domain and creating an account!&lt;/p&gt;

&lt;h2&gt;
  
  
  Do more with Remake
&lt;/h2&gt;

&lt;p&gt;We’ve explored the basics of Remake in this post, but Remake is still growing and improving. For Remake the &lt;em&gt;framework&lt;/em&gt;, a cleaner project layout is in the works, with nicer error messages and better documentation. For Remake the &lt;em&gt;tool and deployment platform&lt;/em&gt;, you can expect new features like custom domain support in the future.&lt;/p&gt;

&lt;p&gt;I’m really excited by how much faster I am at building simple apps when building with Remake, and I’m looking forward to how Remake grows in the future. If you, like me, have a few too many ideas for the hours in a day, consider building out your next hack on Remake.&lt;/p&gt;

&lt;p&gt;Guest post written by &lt;a href="https://thesephist.com/"&gt;Linus Lee&lt;/a&gt;. I'd highly recommend following him for more hacks, insights, and cool projects.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>framework</category>
      <category>webapp</category>
    </item>
    <item>
      <title>Hacking Hypertext</title>
      <dc:creator>David Miranda</dc:creator>
      <pubDate>Wed, 02 Sep 2020 15:44:48 +0000</pubDate>
      <link>https://dev.to/panphora/hacking-hypertext-56l</link>
      <guid>https://dev.to/panphora/hacking-hypertext-56l</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LlqCsH9C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2020/09/hack-final.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LlqCsH9C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2020/09/hack-final.jpg" alt="Hacking Hypertext"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever wondered: “What if clicking on a hyperlink could transport me — not just the screen in front of me — to a new location?”&lt;/p&gt;

&lt;p&gt;That’s what the founders of Uber wondered. So, they transformed an ordinary link into a request for a ride.&lt;/p&gt;

&lt;p&gt;This is called “hacking hypertext”.&lt;/p&gt;

&lt;p&gt;Imagine, a link—a button, a menu, a search result—being able to accomplish something amazing with a single click.&lt;/p&gt;

&lt;p&gt;Google is a great example of this. They hacked hypertext in two ways: 1) They realized a hyperlink to a page meant it was valuable and 2) They gave everyone access to these valuable links with the click of a Search button.&lt;/p&gt;

&lt;p&gt;Facebook took hyperlinks to the next level by making them represent people and their relationships. Events, messages, profile pages, relationship statuses — all available with a single click.&lt;/p&gt;

&lt;p&gt;Who else has hacked hypertext?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon has 1-Click ordering that makes products show up at your door within a couple of days&lt;/li&gt;
&lt;li&gt;Airbnb lets you rent apartments around the world with a click&lt;/li&gt;
&lt;li&gt;Netflix makes thousands of tv shows and movies accessible with a single click&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These companies transform the good ol’ hyperlink into something incredibly powerful.&lt;/p&gt;

&lt;p&gt;For most of us, though, links are still just plain, boring links.&lt;/p&gt;

&lt;p&gt;As an ordinary person on the internet, I can’t create a link out of thin air that will show a list of my upcoming events or let someone rent my apartment — I rely on Facebook and Airbnb to allow me to create these kinds of links.&lt;/p&gt;

&lt;p&gt;So, the question is: why isn’t hypertext more powerful by default?&lt;/p&gt;

&lt;p&gt;The answer is: it’s wildly expensive to transform an ordinary hyperlink into something more.&lt;/p&gt;

&lt;p&gt;Big companies like Google and Facebook spend billions of dollars a year building the infrastructure and hiring the talent necessary to support their hypertext hacks.&lt;/p&gt;

&lt;p&gt;Usually, the most an ordinary citizen of the internet can do is link to a social media profile or personal website.&lt;/p&gt;

&lt;p&gt;But... what if someone decided to democratize the incredible power these big companies have to hack hypertext?&lt;/p&gt;

&lt;p&gt;What if anyone could hack hypertext?&lt;/p&gt;

&lt;p&gt;More and more companies are buying into the “Low-Code” movement. Companies like Stripe, Webflow, and Shopify are making it easier to create online businesses. And companies like Airtable, Bubble, and Glide are making it possible for ordinary people to build powerful experiences on top of their own hypertext hacks.&lt;/p&gt;

&lt;p&gt;But the foundation is still lacking. Hypertext itself hasn’t changed that much in the past three decades. It’s still, by default, pretty weak: it’s meant to create links between pages, not links to real-world actions.&lt;/p&gt;

&lt;p&gt;I believe there’s a stage after “Low-Code”, a kind of hypertext 2.0. Maybe it comes with virtual reality, or cryptocurrency — or maybe it’s born when someone creates a new type of web browser. I don’t know. But, when it comes, it’s going to let anyone have the power to reshape the world with a good ol’ hyperlink.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Turn Your Static Website Into a Web App in Minutes With Remake, An Open Source Framework</title>
      <dc:creator>David Miranda</dc:creator>
      <pubDate>Thu, 23 Jul 2020 15:27:17 +0000</pubDate>
      <link>https://dev.to/panphora/turn-your-static-website-into-a-web-app-in-minutes-with-remake-an-open-source-framework-4c5f</link>
      <guid>https://dev.to/panphora/turn-your-static-website-into-a-web-app-in-minutes-with-remake-an-open-source-framework-4c5f</guid>
      <description>&lt;h2&gt;
  
  
  Introducing Remake
&lt;/h2&gt;

&lt;p&gt;If you've developed products before, you know there are two huge traps you can get stuck in because building web apps the traditional way is so damn hard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do a ton of research, come up with ideas, but never actually build anything. You never feel quite ready to commit because you’re not sure it’s “the right idea”.&lt;/li&gt;
&lt;li&gt;Start building a really small piece of a really big idea, hoping that when you finally release the entire product years from now, it will “change everything overnight”, but never feel ready to show it to the world because “it’s not quite done yet”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://remaketheweb.com/" rel="noopener noreferrer"&gt;Remake&lt;/a&gt; solves this predicament by pulling it out at the root: it makes building an app so damn easy that all your reasons for not shipping it disappear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.remaketheweb.com%2Fcontent%2Fimages%2F2020%2F07%2Fillustration-for-first-blog-post.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.remaketheweb.com%2Fcontent%2Fimages%2F2020%2F07%2Fillustration-for-first-blog-post.jpg" alt="Turn Your Static Website Into a Web App in Minutes With Remake, A Low-Code Framework"&gt;&lt;/a&gt;Remake lets you turn static HTML into an interactive web app super quickly&lt;/p&gt;

&lt;p&gt;Remake is a new type of framework whose goal is to make building web apps feel more like doing a quick sketch and less like painting a masterpiece.&lt;/p&gt;

&lt;p&gt;What if you could use regular HTML to build a dynamic, editable website in about an hour? Well, we’ve got news for you — &lt;em&gt;Remake&lt;/em&gt; makes this a reality.&lt;/p&gt;

&lt;p&gt;Remake wants to help you, above all else: &lt;strong&gt;Find product/market fit&lt;/strong&gt; by launching early and often.&lt;/p&gt;

&lt;p&gt;Our goal is to speed up this process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get a working product into people's hands (Remake)&lt;/li&gt;
&lt;li&gt;Get the feedback you need&lt;/li&gt;
&lt;li&gt;Improve your product until it’s valuable to your users (Remake)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  So, what is Remake, really?
&lt;/h2&gt;

&lt;p&gt;Well, have you ever created a really nice design and wished people could just start using it? Remake lets you do that. Remake provides a simplified structure for what a web app can be, allowing you to take big shortcuts and speed up your workflow.&lt;/p&gt;

&lt;p&gt;Remake works by redefining what HTML can do. It transforms HTML into a language that's purpose-built for making interactive websites. Simply put, Remake makes it possible to build a web app entirely in your front-end code.&lt;/p&gt;

&lt;p&gt;With Remake, you can transform an HTML + CSS template into a fully-functional web app in minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fremake-web-assets.s3.amazonaws.com%2Fwhat-is-remake-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fremake-web-assets.s3.amazonaws.com%2Fwhat-is-remake-diagram.png" alt="Turn Your Static Website Into a Web App in Minutes With Remake, A Low-Code Framework"&gt;&lt;/a&gt;Add a few attributes to your HTML to create a working web app&lt;/p&gt;

&lt;p&gt;Remake assumes that most of your app’s data will be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Displayed directly on the page (as text, CSS styles, images, or uploaded files)&lt;/li&gt;
&lt;li&gt;Will be editable by the page's owner — and only by them&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remake features powerful, built-in components that will allow your users to create, edit, and delete data from the page, while also creating a direct link between your HTML’s state and your back-end state so it can keep them in sync.&lt;/p&gt;

&lt;p&gt;In most apps, HTML is already used for organizing and displaying data. The only thing it’s missing (before it can be used for building dynamic web applications) is the ability to save data in a separate location so the page can be re-rendered later.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Language for Building Web Apps
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://remaketheweb.com/" rel="noopener noreferrer"&gt;Remake&lt;/a&gt; adds what's missing from HTML to transform it into a simple, declarative, and powerful language for building web apps.&lt;/p&gt;

&lt;p&gt;So, now you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use HTML attributes to attach data to the page&lt;/li&gt;
&lt;li&gt;Sync that data to your back-end automatically&lt;/li&gt;
&lt;li&gt;Use the structure of the data on the front-end in your back-end&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And your users will be happy with your Remake web app as well!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It comes, out-of-the-box, with components for easily editing data&lt;/li&gt;
&lt;li&gt;It has API endpoints that it calls automatically for you (for saving/creating/editing/deleting data)&lt;/li&gt;
&lt;li&gt;It even supports user accounts and file-based routing so you can just focus on building something that works!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build a Photo Blog in Only a Few Minutes!
&lt;/h2&gt;

&lt;p&gt;With all of these powerful features, it only takes a few minutes to create a delightfully simple web app out of a few HTML + CSS files. With Remake, you can get back to shipping and everything else will be taken care of for you!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YQxnDSthhO0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Create a photo blog web app in Remake in 20 lines of HTML






&lt;p&gt;&lt;a href="https://remaketheweb.com/" rel="noopener noreferrer"&gt;Remake&lt;/a&gt; is ready for your big idea. What do you want to make today?&lt;/p&gt;

&lt;p&gt;"Intro to Remake (Part 2)" is coming soon. &lt;a href="https://form.remaketheweb.com/" rel="noopener noreferrer"&gt;Sign up to hear about it!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>code</category>
    </item>
    <item>
      <title>How 3 Product Hunt UX Bugs Derailed My Product Launch</title>
      <dc:creator>David Miranda</dc:creator>
      <pubDate>Sun, 19 Jan 2020 17:05:17 +0000</pubDate>
      <link>https://dev.to/panphora/how-3-product-hunt-ux-bugs-derailed-my-product-launch-1pce</link>
      <guid>https://dev.to/panphora/how-3-product-hunt-ux-bugs-derailed-my-product-launch-1pce</guid>
      <description>&lt;p&gt;Let me begin by saying I &lt;em&gt;love&lt;/em&gt; &lt;a href="https://www.producthunt.com/"&gt;Product Hunt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's nothing else like it. Hacker News is too harsh. Reddit discourages self-promotion in 90% of its subreddits. Indie Hackers has too much self-promotion.&lt;/p&gt;

&lt;p&gt;In all this noise, Product Hunt is an oasis of pure, early-startup excitement about, well, products — and the people who build them.&lt;/p&gt;

&lt;p&gt;As an entrepreneur and solo founder, nothing appeals to me more than a community site designed around building new ideas, showing them off to the world, and putting them in people's hands.&lt;/p&gt;

&lt;p&gt;It's a wonderful corner of the internet that I enjoy visiting daily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---evxN0YX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-16.22.36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---evxN0YX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-16.22.36.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;An example of Product Hunt's supportive ethos from the founder&lt;/p&gt;

&lt;h2&gt;
  
  
  Launching my first product by accident
&lt;/h2&gt;

&lt;p&gt;If you want to skip to the end, where I summarize Product Hunt's UX bugs and tell you how to avoid them, click here.&lt;/p&gt;

&lt;p&gt;My first serious attempt at building a product for other people was &lt;a href="https://artisfy.com/"&gt;Artisfy&lt;/a&gt;, a marketplace for hiring freelance illustrators for 1 hour at a time.&lt;/p&gt;

&lt;p&gt;After spending 3 months designing every page in Sketch, 5 months building out the front-end code, and 6 months implementing a backend with Meteor, someone named &lt;a href="https://www.producthunt.com/@natelegler"&gt;Nate&lt;/a&gt; posted Artisfy to Product Hunt without telling me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It was one of the best surprises I've ever received.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At 10am, on November 29, 2016 — 3 days after my birthday — I realized I was getting sign ups from &lt;em&gt;real, actual&lt;/em&gt; freelance artists and users. By 10:15am, I realized where the traffic was coming from. Imagine my surprise when I realized Artisfy was featured in the #2 spot on the front page of my favorite website.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I was ecstatic.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Launching my second product on purpose (and the #1 UX bug)
&lt;/h2&gt;

&lt;p&gt;After the success of Artisfy's surprise launch, I started talking with my new users. I emailed them, did lots of phone calls and video calls, went to meet them at coffee shops all around Boston and Cambridge, trying to learn what they wanted from Artisfy.&lt;/p&gt;

&lt;p&gt;It didn't take long to realize most of them didn't need a new marketplace website. There were thousands of those already and many of the freelancers I talked to were looking to move off of them as soon as possible and recruit their own clients. Gradually, it sunk in for me: freelance illustrators needed a home for their professional services.&lt;/p&gt;

&lt;p&gt;So, I set off to work on a brand new product, in the early days of 2017: &lt;a href="http://requestcreative.com/"&gt;RequestCreative&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This was a really, really exciting time for me. I was working out of a warm and lively co-working space and I got to focus on building RequestCreative every single day. I felt very lucky.&lt;/p&gt;

&lt;p&gt;And, I had a plan for getting some early traction: &lt;a href="https://www.producthunt.com/ship"&gt;Product Hunt Ship&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Product Hunt Ship has _ &lt;strong&gt;2&lt;/strong&gt; _ &lt;strong&gt;&lt;em&gt;big&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;&lt;em&gt;features&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The ability to schedule your product post&lt;/li&gt;
&lt;li&gt;Promotion of your product on the Product Hunt home page!!!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you can't tell, the second feature is, &lt;em&gt;by far&lt;/em&gt;, the more exciting one 😆&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pYdj9pvc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-15.59.54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pYdj9pvc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-15.59.54.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You see, Product Hunt gets about &lt;strong&gt;5 million visits per month&lt;/strong&gt; (&lt;a href="https://www.similarweb.com/website/producthunt.com"&gt;according to SimilarWeb&lt;/a&gt;). So, even if you're only featured 1% of the time (and I think it's more than that), that's a total of 5,000 people per month seeing &lt;em&gt;your&lt;/em&gt; product.&lt;/p&gt;

&lt;p&gt;That's an incredible value, especially since you know this audience is 1) interested in early-stage products and 2) might subscribe with just the click of the button to hear more about your startup in the future.&lt;/p&gt;

&lt;p&gt;So, of course, I signed up right away and&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up a Ship page&lt;/li&gt;
&lt;li&gt;Uploaded my logo and media&lt;/li&gt;
&lt;li&gt;Double checked to make sure everything looked right&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then I waited...&lt;/p&gt;

&lt;p&gt;And over the course of the next three weeks, &lt;strong&gt;2 subscribers&lt;/strong&gt; trickled in.&lt;/p&gt;

&lt;p&gt;They were both people I knew. 😫&lt;/p&gt;

&lt;p&gt;It turns out, I had missed a toggle button that was buried deep in the Product Hunt Ship interface: "Promote on Product Hunt", which was &lt;strong&gt;off&lt;/strong&gt; by default.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This very important toggle wasn't mentioned on the Product Hunt home page after I logged in, nor on my personal profile page — nor on my product's Edit Post page.&lt;/li&gt;
&lt;li&gt;It also wasn't mentioned on the Product Hunt Ship Dashboard page.&lt;/li&gt;
&lt;li&gt;It was buried, at the bottom of the sidebar, on the product's Upcoming page about 2/3 of the way down &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's quite a lot of burying for a feature that most users aren't even aware they should be looking for. I personally assumed that — since it was, by far, the most valuable feature of Product Hunt Ship — it would be &lt;em&gt;turned on by default.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yviWmAeu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/where-is-promotion-toggle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yviWmAeu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/where-is-promotion-toggle.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;Where is the toggle? Not anywhere obvious.&lt;/p&gt;

&lt;p&gt;This is currently the #1 UX bug on Product Hunt Ship and it ruined my second product launch.&lt;/p&gt;

&lt;p&gt;During the launch day, when I didn't know about this little, secret toggle that unlocks 90% of the value of Product Hunt Ship, I was still blaming myself for not being able to get more subscribers.&lt;/p&gt;

&lt;p&gt;I thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maybe my copywriting is off&lt;/p&gt;

&lt;p&gt;Maybe people just aren't interested in RequestCreative's promise&lt;/p&gt;

&lt;p&gt;Maybe there was some secret algorithm that Product Hunt used to determine who was featured in the Upcoming box and I just wasn't chosen...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To be fair, Product Hunt Ship did send me &lt;em&gt;one email&lt;/em&gt; with a mention of the "Promote on Product Hunt" toggle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u7UDQQjI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-16.28.25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u7UDQQjI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-16.28.25.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;Can you find it?&lt;/p&gt;

&lt;p&gt;However, their mention of it was in the &lt;strong&gt;second&lt;/strong&gt; (not the first) onboarding email, hidden way below the fold on mobile devices. To find it, you had to read through a bunch of other (mostly useless) copy and scroll past a big, centered image.&lt;/p&gt;

&lt;p&gt;No one has time for that.&lt;/p&gt;

&lt;p&gt;And this was the &lt;strong&gt;&lt;em&gt;only time&lt;/em&gt;&lt;/strong&gt; in the onboarding they called it out.&lt;/p&gt;

&lt;p&gt;I ended up spending $79 on Ship (and a month prepping for the launch) for almost no value — all because I missed this single sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix this UX bug
&lt;/h2&gt;

&lt;p&gt;I think the solution to this UX bug is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The first email Ship subscribers receive should have the subject line: "Your Product is Not Being Promoted Yet". That would pretty much do it. If you really want to be nice about it, maybe send them a followup 7 days later with the same subject line.&lt;/li&gt;
&lt;li&gt;Then, on the user's list of upcoming products, &lt;strong&gt;in bold, red letters,&lt;/strong&gt; it should probably say: this product is "Not being promoted yet"&lt;/li&gt;
&lt;li&gt;Finally, on your Ship dashboard, at the top of the page, above the completely useless graph that was stuck at 2 users during my entire pre-launch, and highlighted in a bright red background, maybe say something like: "Do you want to enable promotion on Product Hunt? &lt;u&gt;Yes&lt;/u&gt; or &lt;u&gt;No&lt;/u&gt;"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AxAZanxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/not-being-promoted-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AxAZanxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/not-being-promoted-1.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or, of course, &lt;strong&gt;they could just&lt;/strong&gt;  &lt;strong&gt;turn on promoting products by default&lt;/strong&gt; , since it's literally the #1 reason anyone signs up for Ship and it's absolutely zany to charge for value you're not providing.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first product's (failed) launch
&lt;/h2&gt;

&lt;p&gt;If you're curious about how RequestCreative did on launch day... I won't lie and tell you I wasn't disappointed.&lt;/p&gt;

&lt;p&gt;It hung out, just off of the front page, all day, right under the "Show More" button.&lt;/p&gt;

&lt;p&gt;It was a little heart breaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  My second product's tumultuous &amp;amp; amazing non-launch (and UX bugs #2 and #3)
&lt;/h2&gt;

&lt;p&gt;After RequestCreative didn't land with a splash, I was a bit disheartened. I truly thought I had created something useful and amazing — something the Product Hunt community would love.&lt;/p&gt;

&lt;p&gt;When it didn't do well, it was hard to keep working on it, even thought it's something I had invested a year of my life into.&lt;/p&gt;

&lt;p&gt;For anyone struggling with this right now — the anticipation or reality of a "failed" launch — I'd strongly recommend watching &lt;a href="https://www.youtube.com/watch?v=1hHMwLxN6EM"&gt;this excellent video&lt;/a&gt; by YC Startup School:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please don't fall in love with your MVP. It's just step 1 in a journey."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uq-Vgop2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-17.23.56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uq-Vgop2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-17.23.56.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, anyways, as a way of recovering, I focused on something fun. I started tinkering around with the code behind RequestCreative and slowly extracting it into a web framework.&lt;/p&gt;

&lt;p&gt;At first, I told myself it was just for fun. But then I was making notes and taping them to my wall — and drawing diagrams — and seeing if what I had on my hands was truly as groundbreaking as it seemed.&lt;/p&gt;

&lt;p&gt;This, eventually, after a year of hard work, became &lt;a href="https://remaketheweb.com/"&gt;Remake&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Which, kind of, sort of, launched a few weeks ago.&lt;/p&gt;

&lt;p&gt;You see, despite visiting Product Hunt nearly every day, I'm still not an expert at it. And, it turns out, &lt;strong&gt;I unintentionally sabotaged my launch day with the stupidest mistake possible.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Delaying the launch
&lt;/h2&gt;

&lt;p&gt;On November 11th, I made the decision to delay Remake's launch by 2 days, from 11/20 to 11/22.&lt;/p&gt;

&lt;p&gt;My promo video wasn't finished yet, I had on a couple pages of documentation done, and I the website was only 50% done.&lt;/p&gt;

&lt;p&gt;Then on November 18th, with the pressure of a quickly approaching launch day mounting again, and still no website ready yet...&lt;/p&gt;

&lt;p&gt;I rescheduled again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;To the past... oops&lt;/em&gt;&lt;/strong&gt; 🤪&lt;/p&gt;

&lt;p&gt;Like any truly visionary founder, I moved up my MVP launch date to be as early as possible: November 5th — &lt;em&gt;2 weeks in the past.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🙃&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DFDIxL_r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-17.46.10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DFDIxL_r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-17.46.10.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the thing that surprised me the most: Product Hunt Support simply responded with, "Sure thing that's changed for you now!"&lt;/p&gt;

&lt;p&gt;The next morning, I checked on it and realized my unbelievable mistake and the Product Hunt staff quickly rectified the situation.&lt;/p&gt;

&lt;p&gt;Remake was now back to being scheduled for the future — &lt;strong&gt;December 5th&lt;/strong&gt; — and I was going to be ready!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(However, this simple rescheduling-to-the-past mistake would soon come back to haunt me...)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  UX Mistake #2
&lt;/h2&gt;

&lt;p&gt;Before we get to the true comedy of errors of this story, this is where Product Hunt's UX mistake #2 comes in.&lt;/p&gt;

&lt;p&gt;The only reason I needed to talk to a human to reschedule my post (instead of doing it myself) was because their scheduler only allows you to select a date a few weeks out.&lt;/p&gt;

&lt;p&gt;And, although it gives the mistaken impression that you can keep pushing it further out every couple of weeks, indefinitely — eventually you reach a hard limit.&lt;/p&gt;

&lt;p&gt;So, the simple solution here would be to allow people to schedule their product whenever they want to.&lt;/p&gt;

&lt;p&gt;Ideally, only in the future. 😆&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e0Ym5Fhz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.04.04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e0Ym5Fhz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.04.04.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might wonder: why even schedule your product at all if it turns out to be this complicated — having to reach out to customer support every couple weeks?&lt;/p&gt;

&lt;p&gt;Well, it turns out, if you choose not schedule your product's launch, then _ &lt;strong&gt;anyone else can launch your product for you&lt;/strong&gt; —_ before you're ready 😳 — even if you have an upcoming product and are paying for Product Hunt Ship.&lt;/p&gt;

&lt;p&gt;Launching early, this time around, would've been a disaster — unlike with Artisfy.&lt;/p&gt;

&lt;p&gt;You see, at this time, I still thought of Product Hunt as a great source of interested early users and developers and I was really looking forward to knocking it out of the park with a beautiful startup website.&lt;/p&gt;

&lt;p&gt;If someone launched my product early, the website would've been the early, very rough, barely coherent documentation site — which provided only a single demo, no email sign up forms, and no substantial information about how to use Remake.&lt;/p&gt;

&lt;p&gt;It probably wouldn't have done well — and I wouldn't have been able to launch it again on my own, since it was launched already.&lt;/p&gt;

&lt;p&gt;When I spent 3 months of time and energy gearing up for a big Product Hunt release, it simply wasn't worth it to launch early.&lt;/p&gt;

&lt;h2&gt;
  
  
  The day before launch day
&lt;/h2&gt;

&lt;p&gt;Remember when I mistakenly scheduled my post for November 5th — two weeks in the past?&lt;/p&gt;

&lt;p&gt;Well, apparently that caused some major issues with Product Hunt's backend and really came back to bite me &lt;em&gt;the day before launch.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was in the middle of updating the launch website, when I remembered to check in on my Product Hunt post to make sure everything looked good.&lt;/p&gt;

&lt;p&gt;That's when I noticed something really bad:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2uzilz1---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.11.11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2uzilz1---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.11.11.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remake had suddenly reverted to being posted a month ago. 😣&lt;/p&gt;

&lt;p&gt;I reached out to support right away.&lt;/p&gt;

&lt;p&gt;As usual, they responded in under an hour and rescheduled the post for December 5th — the following day.&lt;/p&gt;

&lt;p&gt;Then, while continuing to prepare my post for launch day — adding some images, refining the copy and headlines — I noticed it happened... _ &lt;strong&gt;again.&lt;/strong&gt; _ 😳&lt;/p&gt;

&lt;p&gt;At this point, it was the evening before the launch — just a few hours out.&lt;/p&gt;

&lt;p&gt;I started panicking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What if I was doing something wrong? What if it wasn't a database error on Product Hunt's part, but &lt;em&gt;I&lt;/em&gt; was responsible for launching it by mistake?&lt;/li&gt;
&lt;li&gt;Was there a secret toggle (like Ship) somewhere that I wasn't seeing? &lt;/li&gt;
&lt;li&gt;Was the support staff going to think I was trying to cheat the system somehow — and prevent me from launching altogether!?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I quickly looked around on the Edit Post page, looking for anything that might have caused the scheduled date to be canceled and cause my product to launch right away.&lt;/p&gt;

&lt;p&gt;And that's when I saw it: a simple little magic toggle that I had never truly understood, but had occasionally toggled when I didn't know what else to do.&lt;/p&gt;

&lt;p&gt;I know, I know...you really wouldn't think I design web apps for a living... 🤪 The #1 rule for users of software should be, "don't toggle a magic setting you don't understand."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oNiP-rFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/crazy-little-toggle1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oNiP-rFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/crazy-little-toggle1.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two options:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QLEg-J4N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2020/01/Screenshot-2020-01-21-11.05.20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QLEg-J4N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2020/01/Screenshot-2020-01-21-11.05.20.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With no further explanation.&lt;/p&gt;

&lt;p&gt;I assumed, in my moment of (slight) panic, that these options referred to the status of my product post, _ &lt;strong&gt;not the status of my startup.&lt;/strong&gt; _&lt;/p&gt;

&lt;p&gt;You see, a "pre-launch startup" is a technical term in Silicon Valley. It means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your product isn't ready yet. &lt;/li&gt;
&lt;li&gt;It's not available. &lt;/li&gt;
&lt;li&gt;It's &lt;em&gt;pre&lt;/em&gt;-launch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a Boston native, I don't hear it as much, except when I'm watching &lt;a href="https://www.startupschool.org/latest"&gt;YC videos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, (somewhat my fault here...) it simply didn't register as having anything to do with the status of my product/startup.&lt;/p&gt;

&lt;p&gt;I especially didn't think it would be something that would &lt;strong&gt;completely decimate&lt;/strong&gt; my launch.&lt;/p&gt;

&lt;p&gt;So, I set the Status to &lt;strong&gt;Pre-launch&lt;/strong&gt; , contacted customer support to reschedule the post, and promptly forgot about the magic little toggle.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Please don't make any further changes"
&lt;/h2&gt;

&lt;p&gt;This is about the time someone on the Product Hunt staff told me to stop editing my post, because: "when you update the post, it stops it from being scheduled."&lt;/p&gt;

&lt;p&gt;😳&lt;/p&gt;

&lt;p&gt;Huh?&lt;/p&gt;

&lt;p&gt;Well, um.... okay, I guess. 😐&lt;/p&gt;

&lt;p&gt;That made no sense to me, but I figured it was probably because of the scheduling-to-the-past thing from earlier (which must have really caused some hard-to-undo database flag to be set).&lt;/p&gt;

&lt;p&gt;I told the marketing freelancer I was working with to not touch the post either — it was &lt;em&gt;completely hands-off&lt;/em&gt; until launch time.&lt;/p&gt;

&lt;p&gt;We both gently stepped away from the keyboard, hoping and expecting a perfectly normal, relatively successful Product Hunt launch.&lt;/p&gt;

&lt;p&gt;I sent out the launch emails and went to bed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7bbNJqVu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/remake-launch-email-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7bbNJqVu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/remake-launch-email-2.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;Launch email for &lt;a href="https://remaketheweb.com/"&gt;RemakeTheWeb.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The day of the launch
&lt;/h2&gt;

&lt;p&gt;I woke up on the morning of the launch and checked on the Product Hunt post. It had gotten 7 upvotes already — more than a lot of the other posts, but fewer than some.&lt;/p&gt;

&lt;p&gt;It hadn't made it to the home page yet...&lt;/p&gt;

&lt;p&gt;But I was still hopeful.&lt;/p&gt;

&lt;p&gt;I went for a walk, recorded a quick launch day video for people interested in the project, and went back inside to start my 9 hour launch live stream 😁&lt;/p&gt;

&lt;p&gt;I answered questions and emails, got some serious help from &lt;a href="https://twitter.com/levelsio"&gt;@levelsio&lt;/a&gt; on a Twitter post that went viral, posted a couple launch posts to Reddit and Designer News — and checked on Product Hunt about 3 times an hour.&lt;/p&gt;

&lt;p&gt;For the whole day, I couldn't shake the feeling that Remake should've reached the front page with the amount of votes it was getting.&lt;/p&gt;

&lt;p&gt;Then I got a couple of messages from Product Hunt users that Remake wasn't showing up anywhere on Product Hunt — not even when they searched for it. They said they had to go to the "New" tab and scroll forever just to find it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mO8bcvUg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-07-10.30.46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mO8bcvUg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-07-10.30.46.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4hFk_eka--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-07-10.30.58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4hFk_eka--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-07-10.30.58.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started worrying that maybe something had gone really wrong.&lt;/p&gt;

&lt;p&gt;Maybe I really had messed up Product Hunt's database with my rescheduling... Or annoyed the staff enough with my requests for them to shadow ban me from the home page...&lt;/p&gt;

&lt;p&gt;To be honest, I had no idea what was happening.&lt;/p&gt;

&lt;p&gt;I reached out to customer support, once again, towards the end of the day — after not making it onto the home page despite getting more upvotes than 7 of the other products featured there.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I don't understand why my page failed to reach the front page — even under the Show More button. It launched around the same time as a lot of the products at the bottom and received more upvotes than some, but it never made it to the front page.&lt;/p&gt;

&lt;p&gt;Did something malfunction with my post again?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I got a little cynical: was it an editorial decision? Did the staff prevent my post from hitting the front page because they thought it wasn't good enough?&lt;/p&gt;

&lt;p&gt;I scoured Product Hunt's FAQ for answers.&lt;/p&gt;

&lt;p&gt;At the very bottom of the FAQ articles in the "Posting" category, I came across a certain article title — that, when I read it, instantly made me realize &lt;strong&gt;my big mistake. 🤦‍♂️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_HfnaLBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.41.43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_HfnaLBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.41.43.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I suddenly remembered back to that toggle on the Edit Post page.&lt;/p&gt;

&lt;p&gt;I opened the FAQ article to read it.&lt;/p&gt;

&lt;p&gt;Here's what it said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We encourage people to submit launched products that are available to play with immediately; however, the occasional crowdfunded or pre-launch submission is acceptable if it provides thorough information about the product (e.g. clear video with a product feature walkthrough) and proof that it's not vaporware. That said, we may remove pre-launch submissions and recommend founders to wait until their product has launched before submitting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://help.producthunt.com/en/articles/484932-do-you-accept-submissions-for-unreleased-products"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn't want to admit it to myself, but I had single-handedly sabotaged my own product launch and been responsible for shadow-banning myself from the Product Hunt home page.&lt;/p&gt;

&lt;p&gt;I reached out to customer support one more time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LI401OTM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.46.13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LI401OTM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/Screenshot-2019-12-06-18.46.13.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indeed, that was it.&lt;/p&gt;

&lt;p&gt;They reached out to me shortly after, with a link to the article I had just read.&lt;/p&gt;

&lt;h2&gt;
  
  
  UX mistake #3 and how to fix it
&lt;/h2&gt;

&lt;p&gt;I'm sure a lot of people who launch on Product Hunt know what Pre-launch means and they, also, might understand that it impacts their eligibility to reach the home page.&lt;/p&gt;

&lt;p&gt;But, also, maybe they don't.&lt;/p&gt;

&lt;p&gt;It would be very, very polite of Product Hunt to just tell you, on the Edit Post page, exactly what Pre-launch means — so more people like me don't sabotage months of work over a misunderstanding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---QroHxiL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/crazy-little-toggle-warning.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---QroHxiL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/crazy-little-toggle-warning.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;Or even just: "Pre-launch means product is not available for use yet."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm writing this post
&lt;/h2&gt;

&lt;p&gt;So, you might be wondering: what happened to &lt;a href="https://remaketheweb.com/"&gt;Remake&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Well, actually, thanks to a launch tweet that &lt;a href="https://twitter.com/levelsio"&gt;@levelsio&lt;/a&gt; helped me write and share, the launch was actually a big success!&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--rGfA_513--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/750189939237724161/IujoWnMI_normal.jpg" alt="David Miranda profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        David Miranda
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/panphora"&gt;@panphora&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      I built a framework called 🧙‍♂️Remake that lets you build an interactive website, using only HTML: &lt;br&gt;&lt;br&gt;🤖 Build and design an app&lt;br&gt;🧘‍♀️ User accounts &lt;br&gt;🦙 Zero config &lt;br&gt;🏹 Built-in CRUD features &lt;br&gt;&lt;br&gt;👇&lt;a href="https://t.co/Lh1kVr3XCi"&gt;remaketheweb.com&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      17:22 PM - 05 Dec 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1202639336790990849" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1202639336790990849" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      33
      &lt;a href="https://twitter.com/intent/like?tweet_id=1202639336790990849" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      175
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Remake also received a lot of interest on &lt;a href="https://www.reddit.com/r/SideProject/comments/e6jll7/remake_a_framework_for_building_web_apps_quickly/?"&gt;Reddit&lt;/a&gt; and &lt;a href="https://www.designernews.co/stories/106154"&gt;Designer News&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;All this, despite not receiving any traffic from Product Hunt. Since my product wasn't featured at all or even available in search, Remake ended up sending hundreds of visitors to Product Hunt, but didn't really receive any back.&lt;/p&gt;

&lt;p&gt;I'm hoping Product Hunt might consider giving me a redo, but for now I'm happy to just share this, so someone else with a big idea might avoid my mistakes.&lt;/p&gt;

&lt;p&gt;For now, Remake is still marked as pre-launch, even though the product, on launch day, was (and has been for months) functional and ready to use!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UcmnON9L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/pre-launch-dot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UcmnON9L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/pre-launch-dot.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;Apparently, this little dot means you're still pre-launch&lt;/p&gt;

&lt;p&gt;I only learned what this little dot of invisibility meant on December 6th, after it was too late. If I only I had hovered over it... 👻&lt;/p&gt;

&lt;p&gt;So, without further ado:&lt;/p&gt;

&lt;h2 id="a-quick-tldr-summary-of-product-hunt-s-ux-mistakes-and-how-to-avoid-them-for-your-own-launch"&gt;A Quick TLDR Summary of Product Hunt's UX Mistakes and How to Avoid Them For Your Own Launch&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If you sign up for Product Hunt Ship, &lt;strong&gt;no matter what,&lt;/strong&gt; find the magic "Promote on Product Hunt" toggle and turn it on:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6Jir8XBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/promote-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Jir8XBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/promote-1.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will help your launch out &lt;em&gt;so, so much&lt;/em&gt; and get you a lot of early email subscribers! It's totally worth (even double) the current cost of Ship_._&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; It's on your upcoming page, in the sidebar, about halfway down, under a few other options you probably don't care about.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you decide to reschedule your launch at any point, check with a friend or coworker first to make sure the launch date you chose is &lt;em&gt;in the future&lt;/em&gt; 😜, because otherwise, Product Hunt might schedule it &lt;em&gt;in the past&lt;/em&gt; for you — mark it is as already launched — and that could cause a lot of unexpected, totally weird issues for you down the line.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🤷‍♂️&lt;/p&gt;

&lt;p&gt;Seriously, though: I'd recommend claiming your product's URL by scheduling a post and then ask customer support to schedule your launch &lt;em&gt;way&lt;/em&gt; in the future.&lt;/p&gt;

&lt;p&gt;This way, you'll have plenty of breathing room, and you won't have to deal with the hassle of reaching out to Customer Support every week or two to push push back your launch into the future.&lt;/p&gt;

&lt;p&gt;And you can just launch when you want, with no worries or mishaps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't touch the Status dropdown on your Edit Post page. Don't ask what it does or what it means. Just don't touch it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EL0c84Mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/crazy-little-toggle-no-touching.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EL0c84Mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.remaketheweb.com/content/images/2019/12/crazy-little-toggle-no-touching.png" alt="How 3 Product Hunt UX Bugs Derailed My Product Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading :)&lt;/p&gt;

&lt;p&gt;Reach out if you want any more tips on Product Hunt launches — I'm (very slowly) becoming competent at using it. 😆&lt;/p&gt;




&lt;p&gt;Psst! Take a look at &lt;a href="https://remaketheweb.com/"&gt;Remake&lt;/a&gt;: A faster way to build web apps.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>launch</category>
      <category>framework</category>
    </item>
    <item>
      <title>Open Question: How can I upload files to S3 from Node.js, while having a progress bar and the ability to resize the image?</title>
      <dc:creator>David Miranda</dc:creator>
      <pubDate>Wed, 26 Dec 2018 05:13:35 +0000</pubDate>
      <link>https://dev.to/panphora/open-question-how-can-i-upload-files-to-s3-from-nodejs-while-having-a-progress-bar-and-the-ability-to-resize-the-image-4ckn</link>
      <guid>https://dev.to/panphora/open-question-how-can-i-upload-files-to-s3-from-nodejs-while-having-a-progress-bar-and-the-ability-to-resize-the-image-4ckn</guid>
      <description>&lt;p&gt;Hello Dev.to,&lt;/p&gt;

&lt;p&gt;This is an open request for help/suggestions. I'm new to contributing to this community, but a long-time fan. &lt;/p&gt;

&lt;p&gt;I have a problem that I'm hoping you can help with. I'd post this on Stack Overflow, but I'm hoping a conversation here can be more open-ended than it would be there. &lt;/p&gt;

&lt;p&gt;I'm currently building a web app in which image uploading is a core component. I have uploading working and implementing, with a progress bar to show the user the status of the upload. I also have the ability to crop/resize the image after it's uploaded. I'm currently doing this all with the &lt;code&gt;multer&lt;/code&gt; npm package. &lt;/p&gt;

&lt;p&gt;However, whenever I deploy my server, the PaaS I'm using wipes out all the uploaded files because the new deploy replaces the old one. So, I needed to switch to uploading to a 3rd party service like S3 (or start hosting my web app on Digital Ocean).&lt;/p&gt;

&lt;p&gt;Recently, I got uploads to S3 working with &lt;code&gt;multer&lt;/code&gt; by using the companion package, &lt;code&gt;multer-s3&lt;/code&gt;. However, with &lt;code&gt;multer-s3&lt;/code&gt;, I lose the ability to track the progress of the upload. If you look up the &lt;code&gt;httpUploadProgress&lt;/code&gt; event that's fired by the AWS SDK, you'll &lt;a href="https://github.com/aws/aws-sdk-js/issues/1323"&gt;quickly find &lt;/a&gt; that the event is only fired at the end of an upload -- not multiple times a second as you might expect from an AJAX &lt;code&gt;progress&lt;/code&gt; event.&lt;/p&gt;

&lt;p&gt;So, if I want to keep support file uploading and still have a progress bar, here are my options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use a 3rd party service like Cloudinary or Transloadit or Uploadcare or Imgix, etc., etc.&lt;/li&gt;
&lt;li&gt;Upload images directly to S3 using a &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html"&gt;Presigned Url&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or.... 3. Get rid of the progress bar altogether.&lt;/p&gt;

&lt;p&gt;For the life of me, I can't understand why this is such a hard problem. I feel like there &lt;em&gt;must&lt;/em&gt; be a simple solution I'm just not aware of.&lt;/p&gt;

&lt;p&gt;To quickly go through the reasons I don't like my current options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A 3rd party service locks me into their API. Some of these services require jQuery and/or other large front-end libraries in order to upload directly to them (I'd prefer just an endpoint). And, if I choose to send the file directly from my server to avoid these extra client-side dependencies, it's not clear from their docs if most of these services would even return a progress event... However, in the end, the main problem with these services is cost. I don't ever want to pay $20 - $50 per month to handle file uploads if I can do it for $1-$2 on my own (although, at this point, it might be worth it).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The second option, uploading directly to S3 from the client using a Presigned URL, would be great in the near term, as I don't really want to modify the images just yet. However, in the near future, I could definitely see converting some of the images to WebP for browsers that support that image format -- or trimming some fat off the larger 2-20MB images.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And, as for the option of removing the progress bar... I think it's a huge usability enhancement to have one! As a user, it's really nice to know when your work is saved and how long it will take. I guess I could just show an infinite loading indicator, but then I worry about the people on a slow connection who might be sitting there with no indication when the stupid indicator is going to stop spinning... just waiting, and waiting...&lt;/p&gt;

&lt;p&gt;So, I'm really stuck here. On the one hand, I feel like image uploading with a progress bar (and the ability to modify the image on the back-end after) should be a solved and simple problem. While, on the other hand, I'm strongly considering just biting the bullet and going with something like Cloudinary, even though it will probably double the size of my client-side JavaScript bundle (something I'd &lt;em&gt;really&lt;/em&gt; love to avoid).&lt;/p&gt;

&lt;p&gt;So... Are there any services or packages you know of that I'm missing? Is there anything you know of that will let me upload files in Node.js to an 3rd party storage service like S3, &lt;em&gt;while&lt;/em&gt; showing a progress bar to the user, &lt;em&gt;while&lt;/em&gt; not adding lots of dependencies to my client-side JS, &lt;em&gt;while&lt;/em&gt; giving me the ability to optimize/crop/convert images after they've been uploaded?&lt;/p&gt;

&lt;p&gt;Now that I think about it... maybe this &lt;em&gt;IS&lt;/em&gt; a lot to ask... heh. And, to think, I was incredulous towards a back-end developer &lt;em&gt;10 years ago&lt;/em&gt; when he told me this was a hard problem... 🙈&lt;/p&gt;

&lt;p&gt;Any open source solution would be a huge plus, but an upload service that costs $10/month would be great too.&lt;/p&gt;

&lt;p&gt;This is an open discussion and all suggestions are welcome! 😬😁☃️ Happy Holidays!&lt;/p&gt;

</description>
      <category>node</category>
      <category>s3</category>
      <category>upload</category>
      <category>question</category>
    </item>
  </channel>
</rss>
