VueRailsStarter

vuejs-rails-starterkit — Vue Starter Template

By jetthoughts

A starter template based on Rails 6 and Vue.js 2 that provides step-by-step instructions for building a hybrid application foundation with Webpacker, Turbolinks, PWA, AdminLTE, and Jest.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

1 previews
Author preview
Author-provided preview

Preview provided in the project README.

One original preview is available. Open the full image to inspect the design.

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-01View source

What stands out

A quick read of the recorded project description.

01

Covers the complete setup process from rails new to deployment in step-by-step documentation

02

Integrates Rails 6, Vue.js 2, Webpacker 5, and Webpack 4 for frontend and backend

03

Includes example configurations for Webpacker SplitChunks and lazy loading

04

Provides Jest + Vue Test Utils component unit testing and coverage configuration

05

Preconfigures GitHub, Heroku, CircleCI, Codecov, Dependabot, and tools such as Rubocop and ESLint

06

Includes steps for integrating PWA, Turbolinks, and the AdminLTE theme

Template Details

This is a GitHub template repository for building a Rails 6 + Vue.js 2 project from scratch. The README documents the complete setup process in steps: first generate a Rails project with Vue using rails new, then configure the development environment, add a sample page hosting Vue components, enable Webpacker's SplitChunks assets, integrate Jest for component unit testing, deploy to Heroku, configure a basic PWA, enable Turbolinks, install the AdminLTE interface theme, and finally set up continuous integration and static code analysis.

The technology stack covered by the template includes: Rails 6, Vue.js 2 (with Vue Test Utils), Webpacker 5 and Webpack 4, Bootstrap 4 and the AdminLTE theme, and Babel 7. System dependencies are Ruby 3.0, Node.js 14, Yarn, PostgreSQL 12, and the Heroku CLI. The repository also includes preconfigured settings for GitHub, Heroku (including Review Apps), CircleCI, Codecov/Simplecov, Dependabot, and static analysis tools such as Pronto, Rubocop, ESLint, and EditorConfig.

The README explicitly states that the Rails 5.2 version is on the rails-5-latest branch, while the current main branch targets Rails 6. The repository description positions it as a starter kit for developing hybrid mobile applications, but the README body mainly covers web-side setup steps. The code is MIT licensed and can be used, modified, commercialized, and distributed for free, provided the copyright and license notice are retained when distributing. Third-party assets such as demo images, fonts, and icons, as well as external services like domains, hosting, and databases, require separate verification of their licenses or fees.

VueRailsStarter kit

Is it right for your project?

Use Cases

  • Starting a new project that combines Rails and Vue from scratch
  • Referencing engineering configurations for Webpacker SplitChunks and asset tag usage
  • Adding Jest unit tests and coverage for Vue components
  • Planning to deploy a Rails + Vue application to Heroku and integrate CI

Suitable For

  • Development teams familiar with Ruby on Rails and preparing to introduce Vue
  • Those needing a reusable Rails + Vue project scaffold as a starting point
  • Developers looking for reference steps to integrate PWA, Turbolinks, and AdminLTE

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    System dependencies are Ruby 3.0, Node.js 14, Yarn, PostgreSQL 12, and the Heroku CLI

  2. 2

    Follow the README steps in order; Rails 5.2 users must switch to the rails-5-latest branch

  3. 3

    Before deploying to Heroku, complete production asset precompilation verification

  4. 4

    Licenses and fees for third-party assets and external services (domains, hosting, databases, etc.) must be confirmed separately

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license from the public repository; the free scope applies to that version's code and does not imply that external services or third-party assets are free.

Must comply with when using

  • The code of this version may be used, modified, commercialized, and distributed for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • The main branch targets Rails 6; for the Rails 5.2 version, you must switch to the rails-5-latest branch and cannot directly use the current main branch code.
  • Deployment steps depend on the Heroku CLI and a Heroku account; operations such as creating an app and adding a Postgres add-on must be done on the Heroku platform and may incur external service fees.
  • The deployment example uses the Heroku Postgres add-on (hobby-dev tier), which must be provisioned on Heroku and is an external hosting/database dependency.
  • The PWA step depends on the serviceworker-rails gem imported directly from GitHub, requiring access to that external repository; its own license and maintenance status must be confirmed separately.
  • Frontend dependencies such as the AdminLTE theme, Bootstrap, jQuery, and Font Awesome are third-party packages; their respective licenses and commercial terms must be checked separately and are not granted together with this project's MIT license.
  • Layout code must be obtained from the AdminLTE official website; the license and usage conditions for that theme and its assets are determined by the AdminLTE project and must be confirmed separately.
  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur additional charges.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

For Rails 5.2, please check https://github.com/jetthoughts/vuejs-rails-starterkit/tree/rails-5-latest

Original README

Requirements: [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).

Original README

heroku addons:create heroku-postgresql:hobby-dev

Original README

gem 'serviceworker-rails', github: 'rossta/serviceworker-rails'

Original README

yarn add admin-lte bootstrap jquery popover @fortawesome/fontawesome-free

Original README

Code for layout you can find [here](https://adminlte.io/themes/v3/starter.html).

Original README
https://github.com/jetthoughts/vuejs-rails-starterkit/blob/master/LICENSEhttps://github.com/jetthoughts/vuejs-rails-starterkit/blob/master/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-01. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 81 / 100
Technologies
Vue · Rails
Website type
Starter
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2023-01-19
Screenshot last checked
2026-10-01

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Vue as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: 93530faeedfda922a571c6d48eb41e9eeef724eaf08b48e0a5e67b2d7f7250f1

2026-10-01T02:54:35.720Z

Source file / repository
# Rails 6 + Vue.js 2 Starter Kit GitHub Template.

**NOTE:** For Rails 5.2, please check
https://github.com/jetthoughts/vuejs-rails-starterkit/tree/rails-5-latest

[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)
![GitHub Actions Test](https://github.com/jetthoughts/vuejs-rails-starterkit/workflows/Test/badge.svg)
[![CircleCI Test](https://circleci.com/gh/jetthoughts/vuejs-rails-starterkit.svg?style=svg)](https://circleci.com/gh/jetthoughts/vuejs-rails-starterkit)
[![codecov](https://codecov.io/gh/jetthoughts/vuejs-rails-starterkit/branch/master/graph/badge.svg)](https://codecov.io/gh/jetthoughts/vuejs-rails-starterkit)

A quick and easy way to setup Rails + PWA + Turbolinks + Webpacker + Bootstrap with AdminLTE theme + Vue + Jest.
If your team is considering or has already decided to use Vue, this is the right for you.
As an additional review of how to setup PWA, Turbolinks, CSS frameworks, Storybook.

### Preview of all steps
[![asciicast](https://asciinema.org/a/ArqvGrc6JK6pKzlRTMV3Jotwr.svg)](https://asciinema.org/a/ArqvGrc6JK6pKzlRTMV3Jotwr)

### Expected Final Screen
![image](https://user-images.githubusercontent.com/53345298/80085750-586bc080-8561-11ea-8c3b-dc1eab5b9200.png)

## Table of Contents
- [Step 1. Generate Ruby on Rails Project with Vue.js](#generate-ruby-on-rails-project-with-vuejs-no-turbolinks-included-on-this-stage)
- [Step 2. Setup development environment](#setup-development-environment)
- [Step 3. Add sample page to host Vue.js component](#add-sample-page-to-host-vuejs-component)
- [Step 4. Use Webpacker assets in the application](#use-webpacker-assets-in-the-application)
- [Step 5. Install Jest for Component Unit Tests](#install-jest-for-component-unit-tests)
- [Step 6. Setup Heroku and Deploy](#setup-heroku-and-deploy)
- [Step 7. Setup basic PWA](#setup-basic-pwa)
- [Step 8. Setup Turbolinks](#setup-turbolinks)
- [Step 9. Installs UI Kit - AdminLTE](#setup-adminlte)
- [Step 10. Configure continuous integration and other services for static code
  analysis](#configure-continuous-integration-and-other-services-for-static-code-analysis)


#### Things you may want to cover:

#### Features:

* Optimized for peformance Webpacker with Vue.js: Lazy Load, Split Chunks
* Turbolinks
* PWA
* Backend Unit and System Tests with coverage
* Vue.js Unit Tests with coverage
* Deployable to Heroku
* Pre-setup for services:
    - GitHub
    - Heroku (Heroku Reviews Apps)
    - CircleCI
    - Codecov and Simplecov
    - Dependabot
* Static Code Analyzers:
    - Pronto
    - Rubocop
    - ESLint
    - EditorConfig


#### Dependencies:

* [Ruby on Rails](https://rubyonrails.org/) version 6
* [Vue.js](https://vuejs.org) version 2 with [Vue Test Utils](https://vue-test-utils.vuejs.org/)
* [Webpacker](https://github.com/rails/webpacker) 5 with [Webpack](https://webpack.js.org/) 4
* [Bootstrap](https://getbootstrap.com/) 4 with [AdminLTE Template](https://adminlte.io/)
* [Babel](https://babeljs.io/) 7

#### System Dependencies:

* [Ruby](https://www.ruby-lang.org/en/) 3.0
* [Node.js](https://nodejs.org/en/) 14
* [Yarn](https://yarnpkg.com/en/)
* [PostgreSQL](https://www.postgresql.org/) 12
* [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)

## Generate Ruby on Rails Project with Vue.js (No Turbolinks included on this stage)

```bash
gem install rails

rails new vuejs-rails-starterkit --force --database=postgresql \
  --skip-action-mailer --skip-action-cable --skip-sprockets --skip-turbolinks \
  --webpack=vue

cd ./vuejs-rails-starterkit

bin/rails db:create db:migrate
```

This generates Rails project with:

 - Vue component in `app/javascript/app.vue`
 - Example entry file `app/javascript/packs/hello_vue.js`

### Setup development environment:

1. Uncomment `system('bin/yarn')` in `bin/setup` and `bin/update` to
install new node modules.

2. Install dependencies:

```bash
bin/setup
```
3. Enable *content_security_policy* in the `config/initializers/content_security_policy.rb`
with the following configuration:

```ruby
Rails.application.config.content_security_policy do |policy|
  policy.script_src :self, :https

  if Rails.env.development? || Rails.env.test?
    policy.connect_src :self, :https, 'http://localhost:3035', 'ws://localhost:3035'
  end
end
```
4. Verify that we have not broken anything

```bash
bin/webpack
bin/rails runner "exit"
```

### Add sample page to host Vue.js component

1. Generate controller and view:

```bash
bin/rails generate controller Landing index --no-javascripts --no-stylesheets --no-helper --no-assets --no-fixture
```

2. Update `app/views/landing/index.html.erb` to:

```erb
<h1>Landing#index</h1>
<p>Find me in app/views/landing/index.html.erb</p>

<div id='hello_vue_app'></div>
```

3. Change `app/javascript/packs/hello_vue.js` to:

```javascript
import Vue from 'vue'
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App),
    el: '#hello_vue_app'
  }).$mount()
})
```

4. Setup a sample page as a home page by updating `config/routes.rb`:

```ruby
  root 'landing#index'
```

### Use Webpacker assets in the application

1. Enable Webpacker with `SplitChunks`:

   * Enable `SplitChunks` with default config by adding to `config/webpack/environment.js`:

     ```js
     environment.splitChunks()
     ```

   * Enable Webpacker by updating `app/views/layouts/application.html.erb`:

     Change:

     ```erb
     <%= stylesheet_link_tag 'application', media: 'all' %>
     <%= javascript_pack_tag 'application' %>
     ```

     to:

     ```erb
     <%= stylesheet_packs_with_chunks_tag 'application', 'hello_vue', media: 'all' %>
     <%= javascript_packs_with_chunks_tag 'application', 'hello_vue' %>
     ```

2. Verify locally that vue.js is working and `SplitChunks` is enabled

```bash
bin/rails s
open "http://localhost:3000/"
```

Expect to see
![](https://user-images.githubusercontent.com/8617866/79469404-ca478580-8008-11ea-8b1a-e74cdc906183.png)

The `javascript_packs_with_chunks_tag` and `stylesheet_packs_with_chunks_tag` helpers split assets
into small size chunks and create html tags for them:

```html
<script src="/packs/js/runtime~hello_vue-818eba5af0151079cb6c.js"></script>
<script src="/packs/js/1-7b962b4481d6abff6c2b.chunk.js"></script>
<script src="/packs/js/hello_vue-bc0218ac204eff3ff742.chunk.js"></script>
```

## Install Jest for Component Unit Tests

1. Add Jest with required dependencies

```bash
yarn add --dev jest @vue/test-utils vue-jest babel-core@^7.0.0-bridge.0 babel-jest jest-serializer-vue
```

2. Configure Jest in `package.json` (including the Coverage enabling):

```json
  "scripts": {
    "test": "jest"
  },
  "jest": {
    "verbose": true,
    "testURL": "http://localhost/",
    "roots": [
      "test/javascript"
    ],
    "moduleDirectories": [
      "node_modules",
      "app/javascript"
    ],
    "moduleNameMapper": {
      "^@/(.*)$": "<rootDir>/app/javascript/$1"
    },
    "moduleFileExtensions": [
      "js",
      "json",
      "vue"
    ],
    "transform": {
      ".+\\.js$": "babel-jest",
      ".+\\.vue$": "vue-jest"
    },
    "testPathIgnorePatterns": [
      "<rootDir>/config/webpack/"
    ],
    "snapshotSerializers": [
      "jest-serializer-vue"
    ],
    "collectCoverage": true,
    "collectCoverageFrom": [
      "**/*.{js,vue}",
      "!**/node_modules/**"
    ]
  },
```

3. Add `test/javascript/test.test.js`:

```js
test('there is no I in team', () => {
  expect('team').not.toMatch(/I/);
});
```

4. Verify installation

```bash
yarn test
```

Expect to see ![](https://cl.ly/3y0d2E110c3H/Image%202018-03-31%20at%2019.18.54.public.png)

6. Add component test for App in `test/javascript/app.test.js`:

```js
import { mount, shallowMount } from '@vue/test-utils'
import App from 'app';

describe('App', () => {
  test('is a Vue instance', () => {
    const wrapper = mount(App)
    expect(wrapper.vm).toBeTruthy()
  })

  test('matches snapshot', () => {
    const wrapper = shallowMount(App)
    expect(wrapper.html()).toMatchSnapshot()
  })
});
```

7. Verify by

```bash
yarn test
```

You should see all tests passed

## Setup Heroku and Deploy

1. Confirm compilation is working:

```bash
RAILS_ENV=production \
NODE_ENV=production \
RAILS_SERVE_STATIC_FILES=true \
SECRET_KEY_BASE="7aa51097e982f34be02abe83528c3308768dff3837b405e0907028c750d22d067367fb79e2b223e3f223fea50ddf2d5dc9b3c933cf5bc8c7f2a3d3d75f73c4a7" \
bin/rails assets:precompile
```

2. Create a Heroku App and provision it

Requirements: [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).

**NOTE:** Do not forget to commit all your changes: `git add . && git
commit -m "Generates Ruby on Rails application with Vue.js onboard"`


```bash
heroku create

heroku addons:create heroku-postgresql:hobby-dev

heroku buildpacks:add heroku/ruby

heroku config:set RAILS_ENV=production NODE_ENV=production YARN_PRODUCTION=true MALLOC_ARENA_MAX=2
```

3. Setup Node.js for Heroku

```bash
heroku buildpacks:add --index 1 heroku/nodejs
```

Use the `engines` section of the `package.json` to specify the version of Node.js to use on Heroku.
Drop the ‘v’ to save only the version number:

```json
{
  "engines": {
    "node": ">= 12.x"
  }
}
```

4. Deploy and verify that vue.js is working on Heroku

```bash
git push heroku master

heroku apps:open
```

## Setup basic PWA

1. Install `serviceworker-rails` by adding into `Gemfile`:

```ruby
gem 'serviceworker-rails', github: 'rossta/serviceworker-rails'
```

2. Following the guide: https://github.com/rossta/serviceworker-rails
   you should get something like: https://gist.github.com/pftg/786b147eff85a6fc98bd8dc1c3c9778e

3. There'll be an issue with service worker registration on the page saying:
`Uncaught ReferenceError: window is not defined` and
`Failed to register a ServiceWorker...`.
To fix that add following line to `config/webpack/environment.js`
as suggested [here](https://github.com/webpack/webpack/issues/6642#issuecomment-371087342):

```javascript
environment.config.set('output.globalObject', 'this')
```

## Setup Turbolinks

1. Add node dependencies

```bash
yarn add vue-turbolinks turbolinks
```

2. Load Turbolinks by adding to
   `app/javascript/initializers/turbolinks.js`:

```javascript
import Turbolinks from 'turbolinks'
Turbolinks.start()
```

3. Add to `app/javascript/packs/application.js`:

```javascript
import 'initializers/turbolinks.js'
```

4. Change `app/javascript/packs/hello_vue.js` to:

```javascript
import TurbolinksAdapter from 'vue-turbolinks'
import Vue from 'vue'
import App from '../app.vue'

Vue.use(TurbolinksAdapter)

document.addEventListener('turbolinks:load', () => {
  const app = new Vue({
    render: h => h(App),
    el: '#hello_vue_app'
  }).$mount()
})

```

5. Update layout `app/views/layouts/application.html.erb`:

```erb
<%= javascript_packs_with_chunks_tag 'hello_vue', 'application', 'data-turbolinks-track': 'reload' %>
```

6. Run tests and server to verify:

```bash
bin/rails t
bin/rails s
```

## Setup AdminLTE

1. Add node dependencies

```bash
yarn add admin-lte bootstrap jquery popover @fortawesome/fontawesome-free
```

2. Add `app/javascript/initializers/adminlte.js` initializer:

```javascript
import '../assets/adminlte.scss'
import('./plugins') // () needed for async loading
```

3. Add `app/javascript/initializers/plugins.js` file with plugin importing:

```javascript
import '@fortawesome/fontawesome-free'
import 'jquery/src/jquery.js'
import 'popper.js'
import 'bootstrap'
import 'admin-lte/build/js/AdminLTE'
```

4. Import admin lte initializer in `app/javascript/packs/application.js` pack:

```javascript
import 'initializers/adminlte'
```

5. Next step is updating main layout `app/views/layouts/application.html.erb`. Code for layout you can find [here](https://adminlte.io/themes/v3/starter.html).
Also don't forget to add `yield` in div with `content` class:

```html
<div class="content">
    <%= yield %>
</div>
```

6. Add styles to `app/javascript/assets/adminlte.scss`:

```css
$fa-font-path: '~@fortawesome/fontawesome-free/webfonts';

@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/brands';

@import "~admin-lte/build/scss/adminlte";
```

7. Run tests and server to verify:

```bash
yarn test
bin/rails test
bin/rails test:system
bin/rails s
```

Expect to see:
![image](https://user-images.githubusercontent.com/53345298/80085750-586bc080-8561-11ea-8c3b-dc1eab5b9200.png)

## Configure continuous integration and other services for static code analysis.

To be able to automatically analyze the quality of the code, let's install the [jt_tools](https://github.com/jetthoughts/jt_tools) gem.

1. Add this line to your application's Gemfile:

```ruby
gem 'jt_tools', groups: [:development]
```

2. Next step is running bundle install and generator:

```bash
bin/bundle
bin/rails jt_tools:install
```

3. Run linters to verify

```bash
bin/lint-pr
```
You should see a list of the linters that were running.
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.

vitesse

vitesse

Vitesse is an opinionated Vite + Vue 3 starter template maintained by antfu-collective, offering file-based routing, component and API auto-import, Pinia, UnoCSS, PWA, i18n, Markdown, vite-ssg, TypeScript, Vitest, and Cypress.

Vue · Starter

vitesse-webext

vitesse-webext

vitesse-webext is a Vite-powered WebExtension starter template using Vue 3 and TypeScript, with built-in popup, options, and content script examples. It targets Chrome and Firefox, integrates webextension-polyfill, webext-bridge, UnoCSS, VueUse, and unplugin tools, and supports hot reload during development.

Vue · Starter

laravel-vue-spa

laravel-vue-spa

A Laravel + Vue SPA starter kit for quickly building a decoupled web application skeleton. It includes login, registration, email verification, and password reset flows, uses JWT for authentication, and integrates Laravel Socialite with GitHub as an example provider.

Vue · Starter

vue3-h5-template

vue3-h5-template

A mobile H5 starter template built on Vue3, Vite, and Vant4, with TypeScript by default and JavaScript and i18n branches.

Vue · Starter

tov-template

tov-template

tov-template is an MIT-licensed Vite + Vue 3 + TypeScript starter maintained by dishait. It bundles file-based routing, layouts, Mock, auto-imports, UnoCSS, Pinia, vue-request, Vitest, i18n, dark mode, Dockerfile, and engineering scripts.

Vue · Starter

shadcn-vue-landing-page

shadcn-vue-landing-page

A Vue + Shadcn-Vue + TypeScript + Tailwind landing page template with sections like Navbar, Hero, Pricing, FAQ, Team, and Contact, plus dark mode and responsive layout.

Vue · Corporate Website