<?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: Chuks Opia</title>
    <description>The latest articles on DEV Community by Chuks Opia (@troy34).</description>
    <link>https://dev.to/troy34</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%2F45905%2F5bd4b841-d0ad-425f-8b7a-58f06a4c25c3.jpg</url>
      <title>DEV Community: Chuks Opia</title>
      <link>https://dev.to/troy34</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/troy34"/>
    <language>en</language>
    <item>
      <title>Build an Instagram Clone with Ruby and Pusher</title>
      <dc:creator>Chuks Opia</dc:creator>
      <pubDate>Fri, 01 Jun 2018 20:44:37 +0000</pubDate>
      <link>https://dev.to/troy34/build-an-instagram-clone-with-ruby-and-pusher-54ik</link>
      <guid>https://dev.to/troy34/build-an-instagram-clone-with-ruby-and-pusher-54ik</guid>
      <description>

&lt;p&gt;&lt;a href="https://thepracticaldev.s3.amazonaws.com/i/nxqfrbmepu3pwj7fmb1d.gif"&gt;https://thepracticaldev.s3.amazonaws.com/i/nxqfrbmepu3pwj7fmb1d.gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last week, I entered the &lt;a href="https://dev.to/devteam/first-ever-dev-contest-build-a-realtime-app-with-pusher-4nhp?utm_source=additional_box&amp;amp;utm_medium=internal&amp;amp;utm_campaign=devteam_boosted&amp;amp;booster_org=devteam"&gt;first ever DEV Contest&lt;/a&gt; to build a Realtime App with Pusher. After a very busy day and about 4 hours of coding, I submitted an Instagram clone.&lt;/p&gt;

&lt;p&gt;You can check out my entry below to see the live app and Github repo. It'll be nice to also get your ❤️ &amp;amp; 🦄 on my entry post.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
        &lt;a href="/troy34" class="ltag__link__link"&gt;
          &lt;div class="ltag__link__pic"&gt;
            &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2cG4_AtS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--WdDtvkav--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/45905/5bd4b841-d0ad-425f-8b7a-58f06a4c25c3.jpg" alt="troy34 image"&gt;
          &lt;/div&gt;&lt;/a&gt;
          &lt;a href="/troy34/entry-instagram-clone-2gbp" class="ltag__link__link"&gt;
            &lt;div class="ltag__link__content"&gt;
              &lt;h2&gt;[Entry] Instagram clone&lt;/h2&gt;
              &lt;h3&gt;Chuks Opia&lt;/h3&gt;
              &lt;div class="ltag__link__taglist"&gt;
&lt;span class="ltag__link__tag"&gt;#pushercontest&lt;/span&gt;&lt;span class="ltag__link__tag"&gt;#rubyrails&lt;/span&gt;&lt;span class="ltag__link__tag"&gt;#instagram&lt;/span&gt;&lt;span class="ltag__link__tag"&gt;#pusher&lt;/span&gt;
&lt;/div&gt;
            &lt;/div&gt;
        &lt;/a&gt;
      &lt;/div&gt;


&lt;p&gt;In this post, I'll be taking you through how I built the Instagram clone app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the application
&lt;/h3&gt;

&lt;p&gt;I built the app using Ruby on Rails. I made use of &lt;a href="Devise"&gt;Devise&lt;/a&gt; for user authentication and &lt;a href="https://github.com/carrierwaveuploader/carrierwave"&gt;Carrierwave&lt;/a&gt; for image upload.&lt;br&gt;
If you have Ruby and Rails installed and want to follow along, run the following command to generate a new Rails app.&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$    rails new instaclone -T --database=postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In your app's root directory, open your Gemfile and add the following and then run &lt;code&gt;bundle install&lt;/code&gt; in your terminal:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Gemfile

gem 'bootstrap', '~&amp;gt; 4.1.0'
gem 'jquery-rails'
gem 'pusher'
gem 'figaro'
gem 'devise'
gem 'will_paginate', '~&amp;gt; 3.1.0'
gem 'carrierwave'
gem "fog-aws"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Database setup
&lt;/h3&gt;

&lt;p&gt;To get our app up and running, we’ll create a database for it to work with. You can check out this &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-setup-ruby-on-rails-with-postgres"&gt;article&lt;/a&gt; on how to create a Postgres database and an associated user and password.&lt;/p&gt;

&lt;p&gt;Once you have your database details, in your &lt;code&gt;database.yml&lt;/code&gt; file, under the development key, add the following code:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# config/database.yml

...
development:
  &amp;lt;&amp;lt;: *default
  database: instaclone_development // add this line if it isn't already there
  username: database_user // add this line
  password: user_password // add this line
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensure that the username and password entered in the code above has access to the &lt;code&gt;instaclone_development&lt;/code&gt; database. After that, run the following code to setup the database:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#    setup database
$    rails db:setup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  User authentication
&lt;/h3&gt;

&lt;p&gt;With our database set up, we'll set up user authentication with Devise. Devise is a flexible authentication solution for Ruby on Rails. It helps you set up user authentication in seconds. In your terminal, run the following command:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$    rails generate devise:install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above command will install Devise. At this point, a number of instructions will appear in the console, one of which involves adding some code to your &lt;code&gt;application.html.erb&lt;/code&gt; file. We’ll also add our Pusher script to the file.&lt;/p&gt;

&lt;p&gt;Replace the code in your &lt;code&gt;app/views/layouts/application.html.erb&lt;/code&gt; file with the one &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/views/layouts/application.html.erb"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we’ll generate our authentication view pages, like and then user model using Devise. In your terminal, run the following command:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#    generate Devise view pages
$    rails generate devise:views

#    generate user model
$    rails generate devise user

#    generate migration to add extra columns to the user model
$    rails generate migration add_username_to_users username:string:uniq

#    generate a likes model
$    rails generate model like like_count:integer post:references
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now that we have generated our migration files, let's make some modifications to some files before running our migrations.&lt;/p&gt;

&lt;p&gt;Update the code in your application controller, with the following:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/controllers/application_controller.rb

class ApplicationController &amp;lt; ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?
  before_action :authenticate_user!

  protected

  def configure_permitted_parameters
    added_attrs = [:username, :email, :password, :password_confirmation, :remember_me]
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Also, update the code in your likes migration file with the following&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# db/migrate/20180524215616_create_likes.rb

class CreateLikes &amp;lt; ActiveRecord::Migration[5.1]
  def change
    create_table :likes do |t|
      t.integer :like_count, default: 0
      t.references :post, foreign_key: true

      t.timestamps
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, we’re ready to run our migration and see our app. In your terminal, run the following:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#    run database migrations
$    rails db:migrate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After running migrations, start the development server on your terminal by running rails s. Visit &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; in your browser to see your brand new application:&lt;/p&gt;
&lt;h3&gt;
  
  
  Pusher account setup
&lt;/h3&gt;

&lt;p&gt;Now that our application is up and running, head over to Pusher and &lt;a href="https://dashboard.pusher.com/accounts/sign_up"&gt;sign up for a free account&lt;/a&gt;.&lt;br&gt;
After creating a Pusher account, create a new app by selecting &lt;strong&gt;Channels apps&lt;/strong&gt; on the sidebar and clicking &lt;strong&gt;Create Channels app&lt;/strong&gt; button on the bottom of the sidebar.&lt;br&gt;
Configure your app by providing basic information requested in the form presented. You can also choose the environment you intend to integrate with Pusher, to be provided with some boilerplate setup code. After that, click the &lt;strong&gt;App Keys&lt;/strong&gt; tab to retrieve your keys.&lt;/p&gt;
&lt;h3&gt;
  
  
  Styling the pages
&lt;/h3&gt;

&lt;p&gt;To style our pages, we'll make use of Bootstrap. We have already added Bootstrap to our app while setting it up, so all we need to do is require it and add our markup and styles.&lt;br&gt;
First we'll generate a controller for our posts; in your terminal, run the following command:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#    generate a posts controller
$    rails g controller posts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Update the code in the following files with the code in each link provided below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace the code in &lt;code&gt;app/assets/javascripts/application.js&lt;/code&gt; with the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/assets/javascripts/application.js"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Replace the code in &lt;code&gt;app/views/devise/registrations/new.html.erb&lt;/code&gt; with the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/views/devise/registrations/new.html.erb"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Replace the code in &lt;code&gt;app/views/devise/sessions/new.html.erb&lt;/code&gt; with the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/views/devise/sessions/new.html.erb"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rename your &lt;code&gt;app/assets/stylesheets/application.css&lt;/code&gt; file to &lt;code&gt;app/assets/stylesheets/application.scss&lt;/code&gt; and replace the code there with the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/assets/stylesheets/application.scss"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/controllers/posts_controller.rb"&gt;here&lt;/a&gt; to your &lt;code&gt;app/controllers/posts_controller.rb&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Add the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/config/routes.rb"&gt;here&lt;/a&gt; to your &lt;code&gt;config/routes.rb&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we reload our app in the browser, we should be greeted with a lovely sight. Go ahead and create an account.&lt;/p&gt;

&lt;p&gt;If you encounter any error related to application.html.erb, in config/boot.rb, change the ExecJS runtime from Duktape to Node.&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# config/boot.rb
ENV['EXECJS_RUNTIME'] ='Node'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Realtime posts with Pusher
&lt;/h3&gt;

&lt;p&gt;For users to see our posts realtime, whenever a user adds a post, we save it to the database and notify Pusher by broadcasting the new post and subscribing to it on the frontend of our app.&lt;br&gt;
Let’s initialise our Pusher client. In the &lt;code&gt;config/initializers&lt;/code&gt; folder, create a &lt;code&gt;pusher.rb&lt;/code&gt; file and add the following code:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# config/initializers/pusher.rb

require 'pusher'

Pusher.app_id = ENV["PUSHER_APP_ID"]
Pusher.key = ENV["PUSHER_KEY"]
Pusher.secret = ENV["PUSHER_SECRET"]
Pusher.cluster = ENV["PUSHER_CLUSTER"]
Pusher.logger = Rails.logger
Pusher.encrypted = true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Since we don't want our Pusher keys to be visible to the public, we'll add save them as environmental variables. To do this, we'll make use of Figaro.&lt;br&gt;
Run &lt;code&gt;figaro install&lt;/code&gt; in your terminal. It will generate an &lt;code&gt;application.yml&lt;/code&gt; file. In the &lt;code&gt;application.yml&lt;/code&gt; file add your Pusher keys:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# config/application.yml

PUSHER_APP_ID: '11234'
PUSHER_KEY: '1234567890'
PUSHER_SECRET: '1234556677'
PUSHER_CLUSTER: 'us'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With Pusher now initialised, lets notify Pusher whenever a new post is saved. Add the code below to your post model:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/models/post.rb

class Post &amp;lt; ApplicationRecord
  belongs_to :user
  has_many :likes
  after_create :notify_pusher

  mount_uploader :image, ImageUploader

  validates :caption, presence: true

  def serialised
    {
      id: self.id,
      caption: self.caption,
      user: self.user.username,
      image: self.image_url,
      likes: self.likes[0].like_count
    }
  end

  def notify_pusher
    Pusher.trigger('post', 'new', self.serialised)
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the code above, we have a &lt;code&gt;notify_pusher&lt;/code&gt; action that is called after a new post is created. In the &lt;code&gt;notify_pusher&lt;/code&gt; action, we notify pusher of the new post by triggering a new post event and passing in the new post.&lt;/p&gt;

&lt;p&gt;Also, we have to notify Pusher whenever there's a new like for an image. Add the following code to the likes model&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/models/like.rb

class Like &amp;lt; ApplicationRecord
  after_save :notify_pusher, on: :create
  belongs_to :post

  def notify_pusher
    Pusher.trigger('post', 'new-like', self.post.serialised)
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As with the user model, we also notify Pusher of a new like by broadcasting a &lt;code&gt;new-like&lt;/code&gt; event.&lt;/p&gt;

&lt;p&gt;For us to get the update realtime on the frontend of our app, we have to subscribe to the new post event we broadcasted on the server side. Lets rename our &lt;code&gt;app/assets/javascripts/posts.coffee&lt;/code&gt; file to &lt;code&gt;app/assets/javascripts/posts.coffee.erb&lt;/code&gt; and add the code &lt;a href="https://github.com/9jaswag/instaclone/blob/develop/app/assets/javascripts/posts.coffee.erb"&gt;here&lt;/a&gt; to the file.&lt;br&gt;
In the code we added to the file above, we subscribe our Pusher client to the &lt;code&gt;new&lt;/code&gt; and &lt;code&gt;new-like&lt;/code&gt; events for posts and likes respectively. Whenever there's a new event, we update the page with the new post and likes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;There you have it, if you have followed this tutorial to this point, you should have your own fully functional Instagram clone.&lt;br&gt;
Pusher is a very powerful software that can help you implement any realtime feature you can think of.&lt;/p&gt;

&lt;p&gt;If you found this post useful, please add a  ❤️ &amp;amp; 🦄 both here and in my entry post.&lt;br&gt;
      &lt;/p&gt;
&lt;div class="ltag__link"&gt;
        &lt;a href="/troy34" class="ltag__link__link"&gt;
          &lt;div class="ltag__link__pic"&gt;
            &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2cG4_AtS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--WdDtvkav--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/45905/5bd4b841-d0ad-425f-8b7a-58f06a4c25c3.jpg" alt="troy34 image"&gt;
          &lt;/div&gt;&lt;/a&gt;
          &lt;a href="/troy34/entry-instagram-clone-2gbp" class="ltag__link__link"&gt;
            &lt;div class="ltag__link__content"&gt;
              &lt;h2&gt;[Entry] Instagram clone&lt;/h2&gt;
              &lt;h3&gt;Chuks Opia&lt;/h3&gt;
              &lt;div class="ltag__link__taglist"&gt;
&lt;span class="ltag__link__tag"&gt;#pushercontest&lt;/span&gt;&lt;span class="ltag__link__tag"&gt;#rubyrails&lt;/span&gt;&lt;span class="ltag__link__tag"&gt;#instagram&lt;/span&gt;&lt;span class="ltag__link__tag"&gt;#pusher&lt;/span&gt;
&lt;/div&gt;
            &lt;/div&gt;
        &lt;/a&gt;
      &lt;/div&gt;



</description>
      <category>pushercontest</category>
      <category>rubyrails</category>
      <category>instagram</category>
      <category>pusher</category>
    </item>
    <item>
      <title>[Entry] Instagram clone</title>
      <dc:creator>Chuks Opia</dc:creator>
      <pubDate>Thu, 24 May 2018 23:45:43 +0000</pubDate>
      <link>https://dev.to/troy34/entry-instagram-clone-2gbp</link>
      <guid>https://dev.to/troy34/entry-instagram-clone-2gbp</guid>
      <description>&lt;h1&gt;
  
  
  What I built
&lt;/h1&gt;

&lt;p&gt;Here's a link to a video on Google Drive: &lt;a href="https://drive.google.com/file/d/1q9rITDg4XdbAoCbNTGmzkDWNTHXf6Vpr/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1q9rITDg4XdbAoCbNTGmzkDWNTHXf6Vpr/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I built an Instagram clone. You can upload pictures and others can view them in realtime. You can also heart pictures. The Instagram clone uses Pusher to update the pictures and likes in realtime&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pushergram.herokuapp.com/" rel="noopener noreferrer"&gt;https://pushergram.herokuapp.com/&lt;/a&gt;&lt;br&gt;
The app is responsive and can be viewed on mobile and desktop devices.&lt;/p&gt;
&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/9jaswag/instaclone" rel="noopener noreferrer"&gt;https://github.com/9jaswag/instaclone&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  How I built it (what's the stack? did I run into issues or discover something new along the way?)
&lt;/h1&gt;
&lt;h4&gt;
  
  
  Stack
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ruby on Rails&lt;/li&gt;
&lt;li&gt;Pusher&lt;/li&gt;
&lt;li&gt;Devise&lt;/li&gt;
&lt;li&gt;Bootstrap&lt;/li&gt;
&lt;li&gt;Carrierwave&lt;/li&gt;
&lt;li&gt;Heroku for hosting&lt;/li&gt;
&lt;li&gt;AWS for holding the images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built this app in 4 hours 😴 😪. I built it using Ruby on Rails and handled user authentication with Devise.&lt;/p&gt;
&lt;h4&gt;
  
  
  Issues
&lt;/h4&gt;

&lt;p&gt;The two issues I faced while building this app were handling image uploads and updating both likes and new posts in realtime.&lt;/p&gt;

&lt;p&gt;After different tries with the image upload, I settled for Paperclip and it was all smooth sailing until I deployed to Heroku and couldn't find the images uploaded after 1 minute of uploading them and after minutes of Googling, I found out that Heroku does not store images.&lt;br&gt;
I ended up using Carrierwave for image upload since it integrated well with AWS.&lt;/p&gt;

&lt;p&gt;When it came to updating image likes in realtime, I had to find a way to identify the image in the DOM whose likes was to be updated. To solve this, I used &lt;code&gt;data attributes&lt;/code&gt; to locate the posts via their ids and update their likes.&lt;/p&gt;
&lt;h1&gt;
  
  
  Additional Resources/Info
&lt;/h1&gt;

&lt;p&gt;-&lt;a href="https://github.com/carrierwaveuploader/carrierwave" rel="noopener noreferrer"&gt;Carrierwave&lt;/a&gt; and &lt;a href="https://github.com/plataformatec/devise" rel="noopener noreferrer"&gt;Devise&lt;/a&gt; are life savers. I was able to handle user authentication and images uploads easily with them.&lt;br&gt;
-Pusher makes implementing realtime features as easy as ABC &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Here's a post on how I built the app:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/troy34" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45905%2F5bd4b841-d0ad-425f-8b7a-58f06a4c25c3.jpg" alt="troy34"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/troy34/build-an-instagram-clone-with-ruby-and-pusher-54ik" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Build an Instagram Clone with Ruby and Pusher&lt;/h2&gt;
      &lt;h3&gt;Chuks Opia ・ Jun 1 '18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#pushercontest&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#rubyrails&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#instagram&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#pusher&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>pushercontest</category>
      <category>rubyrails</category>
      <category>instagram</category>
      <category>pusher</category>
    </item>
  </channel>
</rss>
