about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-03-12 16:09:46 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-03-12 16:21:53 +0100
commitaab9f57e369c492bad03bcf15411394897314b4d (patch)
treeae8cf704e2b2321993cabf326af82ae0f86b6697
parent447cfef62d74a670ddd600c0240f41746ac2fe0a (diff)
Adding config for puma, dashboard layout, fixing some queries
-rw-r--r--Gemfile4
-rw-r--r--Gemfile.lock44
-rw-r--r--app/assets/stylesheets/application.scss2
-rw-r--r--app/assets/stylesheets/dashboard.scss130
-rw-r--r--app/assets/stylesheets/stream_entries.scss16
-rw-r--r--app/controllers/accounts_controller.rb2
-rw-r--r--app/controllers/api/accounts_controller.rb2
-rw-r--r--app/controllers/home_controller.rb8
-rw-r--r--app/models/status.rb8
-rw-r--r--app/views/api/statuses/show.rabl4
-rw-r--r--app/views/home/index.html.haml2
-rw-r--r--app/views/layouts/application.html.haml3
-rw-r--r--app/views/layouts/auth.html.haml15
-rw-r--r--app/views/layouts/dashboard.html.haml45
-rw-r--r--app/views/layouts/doorkeeper/admin.html.erb37
-rw-r--r--app/views/layouts/doorkeeper/application.html.erb23
-rw-r--r--app/views/layouts/public.html.haml2
-rw-r--r--app/views/stream_entries/_status.html.haml4
-rwxr-xr-xbin/rails5
-rwxr-xr-xbin/rake5
-rwxr-xr-xbin/spring15
-rw-r--r--config/application.rb5
-rw-r--r--config/initializers/redis.rb2
-rw-r--r--config/puma.rb13
-rw-r--r--config/routes.rb2
25 files changed, 264 insertions, 134 deletions
diff --git a/Gemfile b/Gemfile
index 62a0e1478..631d76c6c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,7 +14,7 @@ gem 'puma'
 gem 'haml-rails'
 gem 'pg'
 gem 'dotenv-rails'
-gem 'font-awesome-sass'
+gem 'font-awesome-rails'
 
 gem 'paranoia', '~> 2.0'
 gem 'paperclip', '~> 4.3'
@@ -34,7 +34,6 @@ gem 'hiredis'
 gem 'redis', '~>3.2'
 gem 'fast_blank'
 gem 'htmlentities'
-gem 'message_bus'
 gem 'onebox'
 
 group :development, :test do
@@ -52,7 +51,6 @@ end
 
 group :development do
   gem 'web-console', '~> 2.0'
-  gem 'spring'
   gem 'rubocop', require: false
   gem 'better_errors'
   gem 'binding_of_caller'
diff --git a/Gemfile.lock b/Gemfile.lock
index d51b9fffd..5d4ff524b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -41,7 +41,7 @@ GEM
     ast (2.2.0)
     backport_new_renderer (1.0.0)
       rails
-    bcrypt (3.1.10)
+    bcrypt (3.1.11)
     better_errors (2.1.1)
       coderay (>= 1.0.0)
       erubis (>= 2.6.6)
@@ -61,7 +61,7 @@ GEM
       coffee-script-source
       execjs
     coffee-script-source (1.10.0)
-    concurrent-ruby (1.0.0)
+    concurrent-ruby (1.0.1)
     crack (0.4.3)
       safe_yaml (~> 1.0.0)
     debug_inspector (0.0.2)
@@ -74,7 +74,7 @@ GEM
       warden (~> 1.2.3)
     diff-lcs (1.2.5)
     docile (1.1.5)
-    domain_name (0.5.20160216)
+    domain_name (0.5.20160309)
       unf (>= 0.0.5, < 1.0.0)
     doorkeeper (3.1.0)
       railties (>= 3.2)
@@ -86,8 +86,8 @@ GEM
     execjs (2.6.0)
     fabrication (2.14.1)
     fast_blank (1.0.0)
-    font-awesome-sass (4.5.0)
-      sass (>= 3.2)
+    font-awesome-rails (4.5.0.1)
+      railties (>= 3.2, < 5.1)
     fuubar (2.0.0)
       rspec (~> 3.0)
       ruby-progressbar (~> 1.4)
@@ -126,8 +126,8 @@ GEM
     jbuilder (2.4.1)
       activesupport (>= 3.0.0, < 5.1)
       multi_json (~> 1.2)
-    jquery-rails (4.1.0)
-      rails-dom-testing (~> 1.0)
+    jquery-rails (4.1.1)
+      rails-dom-testing (>= 1, < 3)
       railties (>= 4.2.0)
       thor (>= 0.14, < 2.0)
     json (1.8.3)
@@ -136,11 +136,8 @@ GEM
       nokogiri (>= 1.5.9)
     mail (2.6.3)
       mime-types (>= 1.16, < 3)
-    message_bus (1.1.1)
-      rack (>= 1.1.3)
-      redis
     method_source (0.8.2)
-    mime-types (2.99)
+    mime-types (2.99.1)
     mimemagic (0.3.0)
     mini_portile2 (2.0.0)
     minitest (5.8.4)
@@ -149,7 +146,7 @@ GEM
     mustache (1.0.2)
     nokogiri (1.6.7.2)
       mini_portile2 (~> 2.0.0.rc2)
-    oj (2.14.5)
+    oj (2.14.6)
     onebox (1.5.35)
       htmlentities (~> 4.3.4)
       moneta (~> 0.8)
@@ -179,7 +176,7 @@ GEM
       slop (~> 3.4)
     pry-rails (0.3.4)
       pry (>= 0.9.10)
-    puma (2.16.0)
+    puma (3.1.0)
     quiet_assets (1.1.0)
       railties (>= 3.1, < 5.0)
     rabl (0.12.0)
@@ -221,7 +218,7 @@ GEM
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
     rainbow (2.1.0)
-    rake (10.5.0)
+    rake (11.1.0)
     rdoc (4.2.2)
       json (~> 1.4)
     redis (3.2.2)
@@ -232,7 +229,7 @@ GEM
       rspec-core (~> 3.4.0)
       rspec-expectations (~> 3.4.0)
       rspec-mocks (~> 3.4.0)
-    rspec-core (3.4.3)
+    rspec-core (3.4.4)
       rspec-support (~> 3.4.0)
     rspec-expectations (3.4.0)
       diff-lcs (>= 1.2.0, < 2.0)
@@ -249,12 +246,12 @@ GEM
       rspec-mocks (~> 3.4.0)
       rspec-support (~> 3.4.0)
     rspec-support (3.4.1)
-    rubocop (0.37.2)
-      parser (>= 2.3.0.4, < 3.0)
+    rubocop (0.38.0)
+      parser (>= 2.3.0.6, < 3.0)
       powerpack (~> 0.1)
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.7)
-      unicode-display_width (~> 0.3)
+      unicode-display_width (~> 1.0, >= 1.0.1)
     ruby-progressbar (1.7.5)
     ruby_parser (3.8.1)
       sexp_processor (~> 4.1)
@@ -276,11 +273,10 @@ GEM
       simplecov-html (~> 0.10.0)
     simplecov-html (0.10.0)
     slop (3.6.0)
-    spring (1.6.3)
     sprockets (3.5.2)
       concurrent-ruby (~> 1.0)
       rack (> 1, < 3)
-    sprockets-rails (3.0.1)
+    sprockets-rails (3.0.4)
       actionpack (>= 4.0)
       activesupport (>= 4.0)
       sprockets (>= 3.0.0)
@@ -299,7 +295,7 @@ GEM
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.2)
-    unicode-display_width (0.3.1)
+    unicode-display_width (1.0.2)
     warden (1.2.6)
       rack (>= 1.0)
     web-console (2.3.0)
@@ -307,7 +303,7 @@ GEM
       binding_of_caller (>= 0.7.2)
       railties (>= 4.0)
       sprockets-rails (>= 2.0, < 4.0)
-    webmock (1.24.1)
+    webmock (1.24.2)
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
       hashdiff
@@ -326,7 +322,7 @@ DEPENDENCIES
   dotenv-rails
   fabrication
   fast_blank
-  font-awesome-sass
+  font-awesome-rails
   fuubar
   goldfinger
   haml-rails
@@ -335,7 +331,6 @@ DEPENDENCIES
   http
   jbuilder (~> 2.0)
   jquery-rails
-  message_bus
   nokogiri
   oj
   onebox
@@ -357,7 +352,6 @@ DEPENDENCIES
   sass-rails (~> 5.0)
   sdoc (~> 0.4.0)
   simplecov
-  spring
   sqlite3
   therubyracer
   uglifier (>= 1.3.0)
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index d4b462cab..e393e2a23 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -9,7 +9,6 @@ $lighter-text-color: #8b8687;
 
 @import url(https://fonts.googleapis.com/css?family=Roboto:400,500,400italic);
 @import url(https://fonts.googleapis.com/css?family=Roboto+Mono);
-@import "font-awesome-sprockets";
 @import "font-awesome";
 
 /* http://meyerweb.com/eric/tools/css/reset/
@@ -334,3 +333,4 @@ body {
 @import 'home';
 @import 'accounts';
 @import 'stream_entries';
+@import 'dashboard'
diff --git a/app/assets/stylesheets/dashboard.scss b/app/assets/stylesheets/dashboard.scss
new file mode 100644
index 000000000..05d495988
--- /dev/null
+++ b/app/assets/stylesheets/dashboard.scss
@@ -0,0 +1,130 @@
+.dashboard-wrapper {
+  background: #282c37;
+  border-radius: 4px;
+  margin: 20px auto;
+  width: 940px;
+  display: flex;
+
+  .dashboard__sidebar {
+    width: 240px;
+    border-radius: 4px 0 0 4px;
+
+    .dashboard__top-bar {
+      border-radius: 4px 0 0 0;
+    }
+
+    ul {
+      padding: 20px 0;
+
+      a {
+        display: block;
+        padding: 7px 20px;
+        color: #d9e1e8;
+        text-decoration: none;
+        font-size: 14px;
+        font-weight: 400;
+
+        .fa {
+          display: inline-block;
+          width: 18px;
+          text-align: center;
+          margin-right: 5px;
+        }
+      }
+
+      .active {
+        a {
+          background: darken(#282c37, 5%);
+          border-left: 2px solid #2b90d9;
+          padding-left: 18px;
+        }
+      }
+    }
+  }
+
+  .dashboard__current-user {
+    padding: 20px;
+
+    a {
+      text-decoration: none;
+      color: inherit;
+    }
+
+    .dashboard__current-user__avatar {
+      display: block;
+      width: 50px;
+      height: 50px;
+      border-radius: 50px;
+      float: left;
+      margin-right: 15px;
+    }
+
+    .dashboard__current-user__display-name {
+      font-weight: 500;
+      font-size: 13px;
+      color: #d9e1e8;
+      display: block;
+      margin-top: 5px;
+    }
+
+    .dashboard__current-user__username {
+      font-size: 12px;
+      display: block;
+      color: #2b90d9;
+    }
+  }
+
+  .dashboard__logo {
+    color: #2b90d9;
+
+    span {
+      font-weight: 500;
+    }
+  }
+
+  .dashboard__top-bar {
+    background: #fff;
+    padding: 20px;
+    box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
+    border-bottom: 1px solid #d9e1e8;
+    color: #282c37;
+    font-size: 16px;
+    overflow: hidden;
+
+    &.alternate {
+      background: lighten(#282c37, 10%);
+      border-bottom: 1px solid lighten(#282c37, 10%);
+      text-align: center;
+    }
+
+    ul {
+      float: right;
+      list-style: none;
+      display: block;
+
+      li {
+        display: inline-block;
+      }
+    }
+
+    a {
+      color: #9baec8;
+      text-decoration: none;
+    }
+  }
+
+  .dashboard__content {
+    flex: 1;
+    background: #d9e1e8;
+    border-radius: 0 4px 4px 0;
+
+    .dashboard__content__content {
+      //padding: 20px;
+    }
+
+    .dashboard__top-bar {
+      border-radius: 0 4px 0 0;
+    }
+  }
+
+}
diff --git a/app/assets/stylesheets/stream_entries.scss b/app/assets/stylesheets/stream_entries.scss
index 31bec6374..ef302bc89 100644
--- a/app/assets/stylesheets/stream_entries.scss
+++ b/app/assets/stylesheets/stream_entries.scss
@@ -14,6 +14,14 @@
     &.entry-predecessor, &.entry-successor {
       background: #d9e1e8;
       border-left-color: #d9e1e8;
+
+      .header {
+        .header__right {
+          .counter-btn {
+            color: darken(#d9e1e8, 15%);
+          }
+        }
+      }
     }
 
     &.entry-follow, &.entry-favourite {
@@ -43,6 +51,14 @@
     }
   }
 
+  &.activity-stream-embedded {
+    box-shadow: none;
+
+    .entry {
+      border-radius: 0;
+    }
+  }
+
   .entry__container {
     display: flex;
   }
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 156926927..47d114416 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -5,7 +5,7 @@ class AccountsController < ApplicationController
   before_action :set_webfinger_header
 
   def show
-    @statuses = @account.statuses.order('id desc').includes(thread: [:account], reblog: [:account], stream_entry: [])
+    @statuses = @account.statuses.order('id desc').with_includes.with_counters
 
     respond_to do |format|
       format.html
diff --git a/app/controllers/api/accounts_controller.rb b/app/controllers/api/accounts_controller.rb
index ac16ed7c1..13c2b3d8a 100644
--- a/app/controllers/api/accounts_controller.rb
+++ b/app/controllers/api/accounts_controller.rb
@@ -15,7 +15,7 @@ class Api::AccountsController < ApiController
   end
 
   def statuses
-    @statuses = @account.statuses.order('created_at desc')
+    @statuses = @account.statuses.with_includes.with_counts.order('created_at desc')
   end
 
   def follow
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index 294749a22..5238b2fc0 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -1,8 +1,16 @@
 class HomeController < ApplicationController
+  layout 'dashboard'
+
   before_action :authenticate_user!
 
   def index
     feed      = Feed.new(:home, current_user.account)
     @statuses = feed.get(20, (params[:offset] || 0).to_i)
   end
+
+  def mentions
+    feed      = Feed.new(:mentions, current_user.account)
+    @statuses = feed.get(20, (params[:offset] || 0).to_i)
+    render action: :index
+  end
 end
diff --git a/app/models/status.rb b/app/models/status.rb
index 4fedad107..52e6f8a21 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -49,6 +49,14 @@ class Status < ActiveRecord::Base
     content.truncate(80, omission: "...")
   end
 
+  def reblogs_count
+    self.attributes['reblogs_count'] || self.reblogs.count
+  end
+
+  def favourites_count
+    self.attributes['favourites_count'] || self.favourites.count
+  end
+
   def mentions
     m = []
 
diff --git a/app/views/api/statuses/show.rabl b/app/views/api/statuses/show.rabl
index 83377e0e8..6c4063b80 100644
--- a/app/views/api/statuses/show.rabl
+++ b/app/views/api/statuses/show.rabl
@@ -4,8 +4,8 @@ attributes :id, :created_at, :in_reply_to_id
 node(:uri)              { |status| uri_for_target(status) }
 node(:content)          { |status| status.local? ? linkify(status) : status.content }
 node(:url)              { |status| url_for_target(status) }
-node(:reblogs_count)    { |status| status.reblogs.count }
-node(:favourites_count) { |status| status.favourites.count }
+node(:reblogs_count)    { |status| status.reblogs_count }
+node(:favourites_count) { |status| status.favourites_count }
 node(:favourited)       { |status| current_user.account.favourited?(status) }
 node(:reblogged)        { |status| current_user.account.reblogged?(status) }
 
diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml
index 068c34408..2d1e9c091 100644
--- a/app/views/home/index.html.haml
+++ b/app/views/home/index.html.haml
@@ -1,3 +1,3 @@
-.activity-stream.activity-stream-headless
+.activity-stream.activity-stream-embedded
   - @statuses.each do |status|
     = render partial: 'stream_entries/status', locals: { status: status, include_threads: false, is_successor: false, is_predecessor: false }
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 25b3b5b49..868944a21 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -8,5 +8,4 @@
     = csrf_meta_tags
     = yield :header_tags
   %body
-    .container
-      = content_for?(:content) ? yield(:content) : yield
+    = content_for?(:content) ? yield(:content) : yield
diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml
index 8a2c8fa74..bddba570a 100644
--- a/app/views/layouts/auth.html.haml
+++ b/app/views/layouts/auth.html.haml
@@ -1,11 +1,12 @@
 - content_for :content do
-  .logo-container
-    %h1
-      = link_to root_path do
-        = render partial: 'application/logo', locals: { dim: 200 }
-        %small= Rails.configuration.x.local_domain
+  .container
+    .logo-container
+      %h1
+        = link_to root_path do
+          = render partial: 'application/logo', locals: { dim: 200 }
+          %small= Rails.configuration.x.local_domain
 
-  .form-container
-    = yield
+    .form-container
+      = yield
 
 = render template: "layouts/application"
diff --git a/app/views/layouts/dashboard.html.haml b/app/views/layouts/dashboard.html.haml
new file mode 100644
index 000000000..128bf8db9
--- /dev/null
+++ b/app/views/layouts/dashboard.html.haml
@@ -0,0 +1,45 @@
+- content_for :content do
+  .dashboard-wrapper
+    .dashboard__sidebar
+      .dashboard__top-bar.alternate
+        &nbsp;
+      .dashboard__current-user
+        = link_to account_path(current_user.account) do
+          = image_tag current_user.account.avatar.url(:medium), class: 'dashboard__current-user__avatar'
+          %strong.dashboard__current-user__display-name= current_user.account.display_name
+          %span.dashboard__current-user__username= "@#{current_user.account.username}"
+      %ul
+        %li.active
+          = link_to root_path do
+            = fa_icon 'home'
+            Home
+        %li
+          = link_to mentions_path do
+            = fa_icon 'at'
+            Mentions
+        %li
+          = link_to root_path do
+            = fa_icon 'group'
+            Subscriptions
+        %li
+          = link_to oauth_authorized_applications_path do
+            = fa_icon 'shield'
+            Authorized apps
+        %li
+          = link_to root_path do
+            = fa_icon 'user'
+            Edit profile
+        %li
+          = link_to edit_registration_path(current_user) do
+            = fa_icon 'wrench'
+            Change password
+    .dashboard__content
+      .dashboard__top-bar
+        Home
+        %ul
+          %li= link_to fa_icon('sign-out'), destroy_user_session_path, method: :delete
+      .dashboard__content__content= yield
+  .footer
+    .domain= Rails.configuration.x.local_domain
+
+= render template: "layouts/application"
diff --git a/app/views/layouts/doorkeeper/admin.html.erb b/app/views/layouts/doorkeeper/admin.html.erb
deleted file mode 100644
index 1d1a688a2..000000000
--- a/app/views/layouts/doorkeeper/admin.html.erb
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>Doorkeeper</title>
-  <%= stylesheet_link_tag "doorkeeper/admin/application" %>
-  <%= csrf_meta_tags %>
-</head>
-<body>
-<div class="navbar navbar-inverse navbar-static-top" role="navigation">
-  <div class="container-fluid">
-    <div class="navbar-header">
-      <%= link_to t('doorkeeper.layouts.admin.nav.oauth2_provider'), oauth_applications_path, class: 'navbar-brand' %>
-    </div>
-    <ul class="nav navbar-nav">
-      <%= content_tag :li, class: "#{'active' if request.path == oauth_applications_path}" do %>
-        <%= link_to t('doorkeeper.layouts.admin.nav.applications'), oauth_applications_path %>
-      <% end %>
-      <%= content_tag :li do %>
-        <%= link_to 'Home', root_path %>
-      <% end %>
-    </ul>
-  </div>
-</div>
-<div class="container">
-  <%- if flash[:notice].present? %>
-    <div class="alert alert-info">
-      <%= flash[:notice] %>
-    </div>
-  <% end -%>
-
-  <%= yield %>
-</div>
-</body>
-</html>
diff --git a/app/views/layouts/doorkeeper/application.html.erb b/app/views/layouts/doorkeeper/application.html.erb
deleted file mode 100644
index 562005af0..000000000
--- a/app/views/layouts/doorkeeper/application.html.erb
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title><%= t('doorkeeper.layouts.application.title') %></title>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <%= stylesheet_link_tag "doorkeeper/application" %>
-  <%= csrf_meta_tags %>
-</head>
-<body>
-<div id="container">
-  <%- if flash[:notice].present? %>
-    <div class="alert alert-info">
-      <%= flash[:notice] %>
-    </div>
-  <% end -%>
-
-  <%= yield %>
-</div>
-</body>
-</html>
diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml
index eb3c54f9d..2234df225 100644
--- a/app/views/layouts/public.html.haml
+++ b/app/views/layouts/public.html.haml
@@ -1,5 +1,5 @@
 - content_for :content do
-  = yield
+  .container= yield
   .footer
     .domain= Rails.configuration.x.local_domain
 
diff --git a/app/views/stream_entries/_status.html.haml b/app/views/stream_entries/_status.html.haml
index 6323501cc..16f036ad3 100644
--- a/app/views/stream_entries/_status.html.haml
+++ b/app/views/stream_entries/_status.html.haml
@@ -24,10 +24,10 @@
         .header__right
           .counter-btn{ class: reblogged_by_me_class(status) }
             %i.fa.fa-retweet
-            %span.counter-number= status.reblog? ? status.reblog.reblogs.count : status.reblogs_count
+            %span.counter-number= status.reblog? ? status.reblog.reblogs_count : status.reblogs_count
           .counter-btn{ class: favourited_by_me_class(status) }
             %i.fa.fa-star
-            %span.counter-number= status.reblog? ? status.reblog.favourites.count : status.favourites_count
+            %span.counter-number= status.reblog? ? status.reblog.favourites_count : status.favourites_count
       .content
         = status.reblog? ? (status.reblog.local? ? linkify(status.reblog) : status.reblog.content.html_safe) : (status.local? ? linkify(status) : status.content.html_safe)
 
diff --git a/bin/rails b/bin/rails
index 0138d79b7..5191e6927 100755
--- a/bin/rails
+++ b/bin/rails
@@ -1,9 +1,4 @@
 #!/usr/bin/env ruby
-begin
-  load File.expand_path('../spring', __FILE__)
-rescue LoadError => e
-  raise unless e.message.include?('spring')
-end
 APP_PATH = File.expand_path('../../config/application', __FILE__)
 require_relative '../config/boot'
 require 'rails/commands'
diff --git a/bin/rake b/bin/rake
index d87d5f578..17240489f 100755
--- a/bin/rake
+++ b/bin/rake
@@ -1,9 +1,4 @@
 #!/usr/bin/env ruby
-begin
-  load File.expand_path('../spring', __FILE__)
-rescue LoadError => e
-  raise unless e.message.include?('spring')
-end
 require_relative '../config/boot'
 require 'rake'
 Rake.application.run
diff --git a/bin/spring b/bin/spring
deleted file mode 100755
index 62ec28f8c..000000000
--- a/bin/spring
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env ruby
-
-# This file loads spring without using Bundler, in order to be fast.
-# It gets overwritten when you run the `spring binstub` command.
-
-unless defined?(Spring)
-  require 'rubygems'
-  require 'bundler'
-
-  if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^    (?:  )*spring \((.*?)\)$.*?^$/m))
-    Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq }
-    gem 'spring', match[1]
-    require 'spring/binstub'
-  end
-end
diff --git a/config/application.rb b/config/application.rb
index 3f23b0a94..e7634854a 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -29,8 +29,9 @@ module Mastodon
     config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
 
     config.to_prepare do
-      Doorkeeper::AuthorizationsController.layout 'auth'
-      Doorkeeper::AuthorizedApplicationsController.layout 'auth'
+      Doorkeeper::ApplicationsController.layout           'dashboard'
+      Doorkeeper::AuthorizedApplicationsController.layout 'dashboard'
+      Doorkeeper::AuthorizationsController.layout         'auth'
     end
   end
 end
diff --git a/config/initializers/redis.rb b/config/initializers/redis.rb
index 14f3778c4..a4e4cfc48 100644
--- a/config/initializers/redis.rb
+++ b/config/initializers/redis.rb
@@ -1 +1 @@
-$redis = Redis.new(host: ENV['REDIS_HOST'] || 'localhost', port: ENV['REDIS_PORT'] || 6379)
+$redis = Redis.new(host: ENV['REDIS_HOST'] || 'localhost', port: ENV['REDIS_PORT'] || 6379, driver: :hiredis)
diff --git a/config/puma.rb b/config/puma.rb
new file mode 100644
index 000000000..49f4b974d
--- /dev/null
+++ b/config/puma.rb
@@ -0,0 +1,13 @@
+workers Integer(ENV['WEB_CONCURRENCY'] || 2)
+threads_count = Integer(ENV['MAX_THREADS'] || 5)
+threads threads_count, threads_count
+
+preload_app!
+
+rackup      DefaultRackup
+port        ENV['PORT']     || 3000
+environment ENV['RACK_ENV'] || 'development'
+
+on_worker_boot do
+  ActiveRecord::Base.establish_connection
+end
diff --git a/config/routes.rb b/config/routes.rb
index d63bdf981..70cd20a82 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -49,5 +49,7 @@ Rails.application.routes.draw do
     end
   end
 
+  get '/mentions', to: 'home#mentions', as: :mentions
+
   root 'home#index'
 end