What's in The Boring JavaScript Stack? ​
The Boring JavaScript Stack combines Sails, Inertia, Tailwind CSS, and your choice of Vue, React, or Svelte.
Vue, React, or Svelte ​
Pick one UI framework for the app's pages and components. Inertia uses those components as the client-side view layer.
Tailwind CSS ​
Tailwind CSS provides the utility classes used for styling pages and components.
Inertia ​
Inertia lets Sails controllers return pages and props without building a separate JSON API.
Sails ​
At the core of this stack is Sails, which handles routing, policies, models, helpers, sessions, scripts, and other server-side behavior.
Because we’re using Sails as the web framework, we can leverage a lot of its features including:
- Authentication: Sails has a robust support for session-based authentication.
- Sails Wish: Easily setup OAuth flows with providers like GitHub or Google in your Sails applications.
- Authorization: Sails has policies which are versatile tools for authorization and access control: they let you execute some logic before an action is run in order to determine whether or not to continue processing the request.
- Waterline ORM: Sails comes installed with a powerful ORM/ODM called Waterline, a datastore-agnostic tool that dramatically simplifies interaction with one or more databases.
- WebSocket support: Sails apps are capable of full-duplex, realtime communication between the client and server.
- File uploads: Skipper makes it easy to implement streaming file uploads to disk, Amazon S3, Cloudflare R2, DigitalOcean Spaces or any supported file upload adapters.
- Shell scripts: Sails lets you run JavaScript functions as shell scripts. This can be useful for running scheduled jobs with Sails Quest (cron, Heroku scheduler), worker processes, and any other custom, one-off scripts that need access to your Sails app's models, configuration, and helpers.
- Sails Mail: Send email through a Sails hook and helper-based API.
- Sails Quest: Schedule background jobs in your Sails applications with human-readable intervals, cron expressions, and full access to your app's context.