{"id":14955321,"url":"https://github.com/zakariaf/rails-base-app","last_synced_at":"2025-04-12T14:57:12.451Z","repository":{"id":39719210,"uuid":"441827067","full_name":"zakariaf/rails-base-app","owner":"zakariaf","description":"An example of Rails 7 and Vue 3 app which is using Vite, and includes Docker configs for building production images and some of the useful tools to start your projects","archived":false,"fork":false,"pushed_at":"2024-10-28T21:23:18.000Z","size":590,"stargazers_count":232,"open_issues_count":15,"forks_count":72,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-29T14:15:16.519Z","etag":null,"topics":["devise","devise-jwt","docker","docker-compose","dockerfile","pinia","rails","rails7","ruby","ruby-on-rails","typescript","vite","vue","vue3","vuejs"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zakariaf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-26T06:42:46.000Z","updated_at":"2024-10-23T20:14:35.000Z","dependencies_parsed_at":"2024-02-13T04:23:48.007Z","dependency_job_id":"5ae028cc-ab68-4227-9d49-0255914e9986","html_url":"https://github.com/zakariaf/rails-base-app","commit_stats":{"total_commits":309,"total_committers":5,"mean_commits":61.8,"dds":"0.16828478964401294","last_synced_commit":"16afaf50ef7223fef1202c72dbeff8bdfe09ad42"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakariaf%2Frails-base-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakariaf%2Frails-base-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakariaf%2Frails-base-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakariaf%2Frails-base-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zakariaf","download_url":"https://codeload.github.com/zakariaf/rails-base-app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248586249,"owners_count":21128997,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devise","devise-jwt","docker","docker-compose","dockerfile","pinia","rails","rails7","ruby","ruby-on-rails","typescript","vite","vue","vue3","vuejs"],"created_at":"2024-09-24T13:10:58.977Z","updated_at":"2025-04-12T14:57:12.428Z","avatar_url":"https://github.com/zakariaf.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://rubyonrails.org/\"\u003e\u003cimg width=\"300\" src=\"https://zakaria.dev/assets/images/rails_base_app/Ruby_On_Rails_Logo.png\" alt=\"Ruby On Rails\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://vite-ruby.netlify.app/\" style=\"margin-left: 20px\"\u003e\u003cimg width=\"110\" src=\"https://zakaria.dev/assets/images/rails_base_app/vite_ruby.svg\" alt=\"Vite Ruby\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://vuejs.org/\" style=\"margin-left: 20px\"\u003e\u003cimg width=\"90\" src=\"https://zakaria.dev/assets/images/rails_base_app/vuejs-logo.png\" alt=\"Vue.js\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.docker.com\" style=\"margin-left: 20px\"\u003e\u003cimg width=\"105\" src=\"https://zakaria.dev/assets/images/rails_base_app/docker-logo.png\" alt=\"Docker\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# An example Rails 7 app\n\n[![](https://badgen.net/badge/Rails/7.0.4.3/red)](https://github.com/zakariaf/rails-base-app/blob/main/Gemfile.lock) [![](https://badgen.net/badge/Ruby/3.2.2/red)](https://github.com/zakariaf/rails-base-app/blob/main/.ruby-version) [![](https://img.shields.io/badge/dynamic/json?color=red\u0026label=Vite\u0026query=%24.devDependencies.vite\u0026url=https%3A%2F%2Fraw.githubusercontent.com%2Fzakariaf%2Frails-base-app%2Fmain%2Fpackage.json)](https://github.com/zakariaf/rails-base-app/blob/main/package.json) [![](https://img.shields.io/badge/dynamic/json?color=brightgreen\u0026label=Vue\u0026query=%24.dependencies.vue\u0026url=https%3A%2F%2Fraw.githubusercontent.com%2Fzakariaf%2Frails-base-app%2Fmain%2Fpackage.json)](https://github.com/zakariaf/rails-base-app/blob/main/package.json) [![](https://img.shields.io/badge/dynamic/json?color=blue\u0026label=TypeScript\u0026query=%24.devDependencies.typescript\u0026url=https%3A%2F%2Fraw.githubusercontent.com%2Fzakariaf%2Frails-base-app%2Fmain%2Fpackage.json)](https://github.com/zakariaf/rails-base-app/blob/main/package.json) [![GitHub license](https://img.shields.io/github/license/zakariaf/rails-base-app)](https://github.com/zakariaf/rails-base-app/blob/main/LICENSE)\n\n**This app is built with Rails 7, Ruby 3, Vite, Vue 3 and typescript. and is using Docker for building production images** You could use this example app as a base for your upcoming projects. Or, you could use it as a tutorial that tells you which steps you need to take to create a project from scratch.\n\nSeveral gems and packages are included in this example app that I've been using for a long time. It wires up a number of things you might use in a real world Rails app. However, at the same time it's not loaded up with a million personal opinions.\n\n- As [Webpacker](https://github.com/rails/webpacker#webpacker-has-been-retired-) has been retired, we are using [Vite](https://vite-ruby.netlify.app/) instead. It wouldn't be fair if I didn't say that: **Vite** is fantastic.\n\n\u003c!-- List of all topics --\u003e\n\n## Table of Contents\n\n- [An example Rails 7 app](#an-example-rails-7-app)\n  - [Table of Contents](#table-of-contents)\n  - [Tech stack](#tech-stack)\n    - [Back-end](#back-end)\n    - [Front-end](#front-end)\n    - [Healthy app](#healthy-app)\n      - [Frontend](#frontend)\n      - [Backend](#backend)\n      - [Common](#common)\n  - [Auth](#auth)\n    - [`/signup`](#signup)\n    - [`/login`](#login)\n    - [`/logout`](#logout)\n  - [Apps](#apps)\n  - [Running app](#running-app)\n    - [1. Clone the repo](#1-clone-the-repo)\n    - [2. Install dependencies](#2-install-dependencies)\n    - [3. Copy .env to .env.local](#3-copy-env-to-envlocal)\n    - [4. Setup database](#4-setup-database)\n    - [5. Run the app](#5-run-the-app)\n  - [Docker](#docker)\n    - [1. Build the images](#1-build-the-images)\n  - [Renaming the project](#renaming-the-project)\n  - [How to contribute](#how-to-contribute)\n  - [License](#license)\n  - [TODO](#todo)\n\n## Tech stack\n\nInitially, I used the `rails new baseapp -c tailwindcss -d postgresql` command to initialize the project using the importmaps and default configurations, but I have since removed the importmaps, tailwindcss, and all default configurations in favor of using Vite.\nYou can see a list of gems that are in the project with a link to their commit. Therefore, you can easily find what we configured for each gem.\n\n**Note** there is a commit/branch for each gem/package and adding/changing a code in the repo, and you can see the list of the steps we did in order at the below. e.g. step 1 in the repo was **init project** and using **PostgreSQL**. step number 2 was adding **RSpec**, etc.\n\n### Back-end\n\n- 1- [PostgreSQL](https://www.postgresql.org/) ([init project](https://github.com/zakariaf/rails-base-app/commit/f62b5cfab5a58aff5f233d3f05b5e5b157d5a5c9))\n- 2- [RSpec](https://github.com/rspec/rspec-metagem) ([commit1](https://github.com/zakariaf/rails-base-app/commit/9363d5196130661481ebad2f4067f88b5558ed8e)) ([commit2](https://github.com/zakariaf/rails-base-app/commit/98b97191858a41055c624a9668627a63efa2393f))\n- 3- [Factory Bot Rails](https://github.com/thoughtbot/factory_bot_rails) ([commit](https://github.com/zakariaf/rails-base-app/commit/6345a47aab301abf731678bc70a29af67c8d6d64))\n- 4- [Faker](https://github.com/faker-ruby/faker) ([commit](https://github.com/zakariaf/rails-base-app/commit/436743fccee0e9f2d72a2af556dcb2bccea0d44e))\n- 5- [Database Cleaner](https://github.com/DatabaseCleaner/database_cleaner) ([commit](https://github.com/zakariaf/rails-base-app/commit/653e37e65260ad1b28f699d08ddf206054800810))\n- 6- [SimpleCov](https://github.com/simplecov-ruby/simplecov) ([commit](https://github.com/zakariaf/rails-base-app/commit/a1e629b26bf45f008d27ca4ae1a794de65581e2c))\n- 7. Rubocop(Check the [**Healthy app/Backend**](#healthy-app) part)\n- 8- [Annotate](https://github.com/ctran/annotate_models) ([commit](https://github.com/zakariaf/rails-base-app/commit/5c2a5d2480bbfdd7afd148fc08dc02bda324fc0e))\n- 9- [Pry](https://github.com/pry/pry) ([commit](https://github.com/zakariaf/rails-base-app/commit/fd94d91fda2e28293266b3f210801e8462fad4cb))\n- 10- [Pagy](https://github.com/ddnexus/pagy) ([commit1](https://github.com/zakariaf/rails-base-app/commit/f5c4839ba05fe8a927bb18e06e89b0fb20f12045)) ([commit2](https://github.com/zakariaf/rails-base-app/commit/090194eb6912a72ec23349afbca1d3e211204769))\n- 11- [HasScope](https://github.com/heartcombo/has_scope) ([commit](https://github.com/zakariaf/rails-base-app/commit/a1564e9f8ee645b5b6394bc99608d57eef95b830))\n- 12- [JSON:API serializer](https://github.com/jsonapi-serializer/jsonapi-serializer) A fast JSON:API serializer for Ruby Objects ([commit](https://github.com/zakariaf/rails-base-app/commit/c57cb9db2c0df761e48bdae77971d5fd093033bb))\n  - [jsonapi.rb](https://github.com/stas/jsonapi.rb) which provides some features for `jsonapi-serializer` [PR](https://github.com/zakariaf/rails-base-app/pull/9), [commit](https://github.com/zakariaf/rails-base-app/commit/b463d3a024513040c52b0745d042ee1fd9ea96aa) and [PR2](https://github.com/zakariaf/rails-base-app/pull/13)\n  - [jsonapi-rspec](https://github.com/jsonapi-rb/jsonapi-rspec) which provides some beautiful RSpec matchers for JSON API [PR](https://github.com/zakariaf/rails-base-app/pull/10)\n- 13- [Action Cable](https://guides.rubyonrails.org/action_cable_overview.html) ([commit](https://github.com/zakariaf/rails-base-app/commit/3d6bd4194c3a992c838093bb8c8c7332784cffba))\n- 14- [Redis](https://redis.io/) ([commit](https://github.com/zakariaf/rails-base-app/commit/3d6bd4194c3a992c838093bb8c8c7332784cffba), [PR](https://github.com/zakariaf/rails-base-app/pull/20))\n- 15- [Sidekiq](https://github.com/mperham/sidekiq) ([commit](https://github.com/zakariaf/rails-base-app/commit/f7b759d9d42ce3444a04978fe2cbfc66cd120250), [PR](https://github.com/zakariaf/rails-base-app/pull/22))\n- 16- [dotenv](https://github.com/bkeepers/dotenv) ([commit](https://github.com/zakariaf/rails-base-app/commit/3aaa696c4228aac2dac40ff42591f07dc74a62bb))\n- 28- [shoulda-matchers]() ([PR] (https://github.com/zakariaf/rails-base-app/pull/34))\n\n### Front-end\n\n- 17- [Vite](https://github.com/ElMassimo/vite_ruby) Removing importmaps and all frontend libraries and Use Vite instead ([PR](https://github.com/zakariaf/rails-base-app/pull/1)), and remove Sprockets and unused assets files ([PR](https://github.com/zakariaf/rails-base-app/pull/21))\n- 18- Code quality and format (Check **Healthy app/Frontend** part)\n- 19- [Vue.js](https://vuejs.org/) Vue.js version 3 ([PR](https://github.com/zakariaf/rails-base-app/pull/4) , [PR-fixbug](https://github.com/zakariaf/rails-base-app/pull/11))\n- 27- Enabling auth process(and make the app ready) which needed more packages [PR](https://github.com/zakariaf/rails-base-app/pull/15):\n  - [axios](https://www.npmjs.com/package/axios)\n  - [pinia](https://pinia.vuejs.org/introduction.html) The official state management library for Vue. will be used instead of **Vuex**\n  - [vue-query](https://www.npmjs.com/package/vue-query)\n  - [@babel/types](https://babeljs.io/docs/en/babel-types)\n  - We start using [TypeScript](https://www.typescriptlang.org/) and [Vue3 compistion API](https://vuejs.org/guide/extras/composition-api-faq.html) here\n\n### Healthy app\n\n#### Frontend\n\n- 18- Code quality and format ([PR1](https://github.com/zakariaf/rails-base-app/pull/2), [PR2](https://github.com/zakariaf/rails-base-app/pull/3))\n  - [ESlint](https://eslint.org/)\n  - [Eslint plugin vue](https://eslint.vuejs.org/rules/)\n  - [Prettier](https://prettier.io/)\n  - [Husky](https://typicode.github.io/husky/#/)\n  - [lint-staged](https://github.com/okonet/lint-staged)\n\n#### Backend\n\n- 7- [RuboCop](https://github.com/rubocop/rubocop) Code quality and format. First I added [rubocop-rails_config gem](https://github.com/toshimaru/rubocop-rails_config) by these two commits ([commit1](https://github.com/zakariaf/rails-base-app/commit/abfdce196721e517b9391b618093506fe062c499)) ([commit2](https://github.com/zakariaf/rails-base-app/commit/89e675b793a0467b271e91c85215a6539bcc4b57)), but after a while, I removed this gem and added rubocop gem and its extensions separately in this [PR](https://github.com/zakariaf/rails-base-app/pull/8)\n\n- 20- [Brakeman](https://github.com/presidentbeef/brakeman) Checking Ruby on Rails applications for security vulnerabilities. you can check `config/brakeman.ignore` to see ignore errors ([PR](https://github.com/zakariaf/rails-base-app/pull/7))\n- 21- [bundler-audit](https://github.com/rubysec/bundler-audit) Patch-level verification for bundler ([PR](https://github.com/zakariaf/rails-base-app/pull/7))\n- 22- [Fasterer](https://github.com/DamirSvrtan/fasterer) Make Rubies code faster by suggestion some speed improvements. check `.fasterer.yml` to enable/disable suggestions ([PR](https://github.com/zakariaf/rails-base-app/pull/7))\n- 23- [License Finder](https://github.com/pivotal/LicenseFinder) Check the licenses of the gems and packages. you can update `doc/dependency_decisions.yml` to manage licenses ([PR](https://github.com/zakariaf/rails-base-app/pull/7))\n- Moving linting gems into development and test group in Gemfile ([commit](https://github.com/zakariaf/rails-base-app/commit/5671c93ac791b4ad7ea8dcc191d0f36730887f50))\n\n#### Common\n\n- 24- [overcommit](https://github.com/sds/overcommit) to manage and configure Git hooks by managing all healthy app tools. you can check `.overcommit.yml` to enable or disable tools. ([PR](https://github.com/zakariaf/rails-base-app/pull/7))\n- 25- Enabling github action to run `overcommit` after push and pull requests in github. Check `.github/workflows/lint.yml` to see the github configs ([PR](https://github.com/zakariaf/rails-base-app/pull/7))\n\n## Auth\n\n- 26- [Devise](https://github.com/heartcombo/devise) and [Devise::JWT](https://github.com/waiting-for-dev/devise-jwt) JWT authentication solution [Backend PR1](https://github.com/zakariaf/rails-base-app/pull/6), [Backend PR2](https://github.com/zakariaf/rails-base-app/pull/12)\n\nWe are using JWT to authentication using Devise and Devise::JWT gems. If you send a request to log in, the successful response will give you a header called `Authorization` which has the JWT token as value. and you need to add this header and its value to all of your requests.\n\nPredefined auth routes:\n\n### `/signup`\n\n**Request**:\n\n```\ncurl -XPOST -H \"Content-Type: application/json\" -d '{ \"user\": { \"email\": \"test@example.com\", \"password\": \"12345678\", \"password_confirmation\": \"12345678\" } }' http://localhost:3000/signup\n```\n\n**Response**: Returns the details of the created user\n\n```\n{\"data\":{\"id\":\"4\",\"type\":\"user\",\"attributes\":{\"email\":\"test@example.com\",\"sign_in_count\":1,\"created_at\":\"2022-04-18T17:49:06.798Z\"}}}\n```\n\n### `/login`\n\n**Request**:\n\n```bash\ncurl -XPOST -i -H \"Content-Type: application/json\" -d '{ \"user\": { \"email\": \"test@example.com\", \"password\": \"12345678\" } }' http://localhost:3000/login\n```\n\n**Response**: includes `Authorization` in header and details of the loggedin user\n\n```bash\nHTTP/1.1 200 OK\nX-Frame-Options: SAMEORIGIN\nX-XSS-Protection: 0\nX-Content-Type-Options: nosniff\nX-Download-Options: noopen\n....\nContent-Type: application/vnd.api+json; charset=utf-8\nAuthorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0Iiwic2NwIjoidXNlciIsImF1ZCI6bnVsbCwiaWF0IjoxNjUwMzA0MjU3LCJleHAiOjE2NTAzOTA2NTcsImp0aSI6IjM4ZmI4ZGIyLWVlMjgtNDg2Yy05YjE5LTA2NWVmYmQ0ZGE4MCJ9.p8766vPrhiGpPyV2FdShw1ljBx2Os3D1oE_rPjjAYrY\n...\n\n{\"data\":{\"id\":\"4\",\"type\":\"user\",\"attributes\":{\"email\":\"test@example.com\",\"sign_in_count\":2,\"created_at\":\"2022-04-18T17:49:06.798Z\"}}}\n```\n\n\u003cimg width=\"400\" src=\"https://zakaria.dev/assets/images/rails_base_app/login.png\" alt=\"Login\"\u003e\n\n### `/logout`\n\n**Request**: includes `Authorization` and its JWT token in the header of `DELETE` request\n\n```bash\ncurl -XDELETE -H \"Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0Iiwic2NwIjoidXNlciIsImF1ZCI6bnVsbCwiaWF0IjoxNjUwMzA0MjU3LCJleHAiOjE2NTAzOTA2NTcsImp0aSI6IjM4ZmI4ZGIyLWVlMjgtNDg2Yy05YjE5LTA2NWVmYmQ0ZGE4MCJ9.p8766vPrhiGpPyV2FdShw1ljBx2Os3D1oE_rPjjAYrY\" -H \"Content-Type: application/json\" http://localhost:3000/logout\n```\n\n**Response**: nothing\n\n\u003cimg width=\"400\" src=\"https://zakaria.dev/assets/images/rails_base_app/logout.png\" alt=\"Logout\"\u003e\n\n**Note** We are using JWT to authentication, it means you can use this Rails base app as a **vanilla rails app** (Backend and frontend together), or as a **Rails API app**. both you can use.\n\n## Apps\n\nI always prefer to have two apps for my projects, one for the part that will be shown public (I called it **Website**), and the second one for the part that you are managing there (I called it **Panel**), simplify you need to log in to have access there.\n\nIf you can check the codes you can see that there are two layout view files and two actions in application_controller, and two routes in routes.rb file. and for frontend there are two different entrypoints and routers ane etc.\n\nIn this case, you can use different technologies and UI Component Libraries in frontend, e.g. use [Vuetify](https://vuetifyjs.com/en/) for **Website** and use [VueTailwind](https://www.vue-tailwind.com/) for **Panel**. or even (it's a bit headache) but you can use [React](https://reactjs.org/) for **Website** and use [Vue.js](https://vuejs.org/) for **Panel**.\n\nTwo simple html/css templates have been added for **Website** and **Panel**. you can remove them easily\n\n![Website and Panel preview](https://zakaria.dev/repos_images/website.png)\n\n## Running app\n\nI generally recommend to use Docker only for building production images, and not for development. hence I didn't add any docker configs for development.\n\nTo run the app locally, you need to have [Ruby](https://www.ruby-lang.org/en/) and [PostgreSQL](https://www.postgresql.org/) installed on your machine.\n\n### 1. Clone the repo\n\n```bash\ngit clone https://github.com/zakariaf/rails-base-app baseapp\ncd baseapp\n```\n\n### 2. Install dependencies\n\n```bash\nbundle install # install ruby gems\nyarn install # install node packages\n```\n\n### 3. Copy .env to .env.local\n\n- `.env` file is used for production\n- `.env.local` will be used for development\n- `.env.test` will be used for test\n\nUsually, you only need to change the Postgres variables in `.env.local` file to match your local database.\n\n```bash\ncp .env .env.local\ncp .env .env.test\n```\n\n### 4. Setup database\n\n```bash\nbundle exec rails db:setup\n```\n\n### 5. Run the app\n\n```bash\nbin/dev\n```\n\n## Docker\n\nAs I mentioned before, We use Docker only for building production images. We are using [Docker Compose](https://docs.docker.com/compose/) to build the images and run the containers. You can check the `docker-compose.yml` file to see the configurations. and you can check the `Dockerfile` file to see the configurations for the production image.\n\nDockerize was done by these two MRs:\n\n- [Dockerize the app](https://github.com/zakariaf/rails-base-app/pull/23)\n- [Dockerize the app (2)](https://github.com/zakariaf/rails-base-app/pull/32)\n\n**NOTE** Documentation about docker is not complete yet, I will update it soon.\n\n### 1. Build the images\n\n```bash\ndocker compose build\n```\n\n## Renaming the project\n\nThis app is named `baseapp` and the module is named `BaseApp`. But for sure you would like to have a different name.\n\nThe only thing you need to do is just running the `bin/rename-project yourappname YouAppName` script.\nas you see this script needs 2 arguments:\n\n- First argument: The lower case version of your app's name, such as `myapp` or `my_app` depending on your preference.\n- Second argument: Used for your app's module name. such as `MyApp`\n\n`bin/rename-project myapp MyApp`\n\nThis script is going to:\n\n- Perform a number of find / replace actions\n- Initialize a new git repo for you (Optionally)\n\nAfter that, If you're happy with your new project's name you can delete this\nscript.\n\nOr you can keep it around in case you decide to change your project's\nname later on.\n\nI got the rename script idea and codes from [Docker Rails Example](https://github.com/nickjj/docker-rails-example#running-a-script-to-automate-renaming-the-project) project with some small changes.\n\n## How to contribute\n\nI'm happy to accept any contributions you might want to make. Please follow these steps:\n\n1. Fork the repo\n2. Create a new branch\n3. Make your changes\n4. Run the test suite\n5. Submit a pull request\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n\n## TODO\n\n- [ ] automat deploy process using capistrano\n- [ ] Add cypress (e2e testing)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzakariaf%2Frails-base-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzakariaf%2Frails-base-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzakariaf%2Frails-base-app/lists"}