55 content : https://docs.sailscasts.com/boring-stack-social.png
66title : Ascent
77titleTemplate : The Boring JavaScript Stack
8- description : Ascent is a production-ready React SaaS template built on The Boring JavaScript Stack. Ship products with battle-tested technologies and focus on actual real users instead of wrestling with complex build tools.
8+ description : Ascent is a production-ready SaaS template built on The Boring JavaScript Stack. Available with React or Vue frontends . Ship products with battle-tested technologies and focus on actual real users instead of wrestling with complex build tools.
99prev :
1010 text : Mellow
1111 link : ' /boring-stack/mellow'
@@ -19,7 +19,7 @@ editLink: true
1919
2020** Ship products with battle-tested technologies. Say no to chasing JavaScript trends.**
2121
22- Ascent is a production-ready React SaaS template built on The Boring JavaScript Stack. Focus on shipping to actual real users instead of wrestling with complex build tools and trendy frameworks.
22+ Ascent is a production-ready SaaS template built on The Boring JavaScript Stack. Available with ** React ** or ** Vue ** frontends . Focus on shipping to actual real users instead of wrestling with complex build tools and trendy frameworks.
2323
2424## The Boring Stack Philosophy
2525
@@ -40,12 +40,24 @@ Ascent is a production-ready React SaaS template built on The Boring JavaScript
4040
4141### Frontend
4242
43+ Choose between React or Vue for your frontend:
44+
45+ #### React Frontend
46+
4347- ** [ React 19] ( https://react.dev ) ** - Latest React with modern features and concurrent rendering
4448- ** [ Inertia.js] ( https://inertiajs.com ) ** - Modern monolith approach eliminating API complexity
4549- ** [ PrimeReact] ( https://primereact.org ) ** - 80+ production-ready UI components
4650- ** [ Tailwind CSS] ( https://tailwindcss.com ) ** - Utility-first CSS framework for styling PrimeReact components
4751- ** [ Rsbuild] ( https://rsbuild.dev ) ** - Fast build tool powered by Rspack (via Sails Shipwright)
4852
53+ #### Vue Frontend
54+
55+ - ** [ Vue 3] ( https://vuejs.org ) ** - Progressive JavaScript framework with Composition API
56+ - ** [ Inertia.js] ( https://inertiajs.com ) ** - Modern monolith approach eliminating API complexity
57+ - ** [ PrimeVue Volt] ( https://volt.primevue.org ) ** - 50+ fully customizable, accessible UI components powered by Unstyled PrimeVue and Tailwind CSS v4
58+ - ** [ Tailwind CSS v4] ( https://tailwindcss.com ) ** - Next-generation utility-first CSS framework
59+ - ** [ Rsbuild] ( https://rsbuild.dev ) ** - Fast build tool powered by Rspack (via Sails Shipwright)
60+
4961### Development & Build Tools
5062
5163- ** [ Sails Hook Shipwright] ( https://github.com/sailscastshq/sails-hook-shipwright ) ** - Modern asset pipeline with hot reload
@@ -63,8 +75,11 @@ Ascent is a production-ready React SaaS template built on The Boring JavaScript
6375### Installation
6476
6577``` bash
66- # Create new project with Ascent template
78+ # Create new project with Ascent template (React)
6779npx create-sails@latest my-saas-app --react --ascent
80+
81+ # Or with Vue
82+ npx create-sails@latest my-saas-app --vue --ascent
6883```
6984
7085### Quick Start
@@ -137,11 +152,11 @@ Visit `http://localhost:1337` to see your application running!
137152### UI/UX Features
138153
139154- ** Responsive Design** - Mobile-first responsive layouts
140- - ** PrimeReact + Tailwind** - Rich components styled with utility classes
141- - ** Toast Notifications** - User feedback with PrimeReact Toast
155+ - ** Prime UI + Tailwind** - Rich components (PrimeReact or PrimeVue Volt) styled with utility classes
156+ - ** Toast Notifications** - User feedback with Prime UI Toast components
142157- ** Loading States** - Comprehensive loading and error states
143158- ** Form Validation** - Client and server-side validation
144- - ** Accessibility** - WCAG- compliant components
159+ - ** Accessibility** - WCAG AA compliant components
145160
146161## Development Commands
147162
@@ -167,12 +182,14 @@ npx sails generate model Product
167182npx sails generate helper format-date
168183```
169184
170- ## PrimeReact + Tailwind Usage
185+ ## Frontend Examples
171186
172- Ascent combines PrimeReact's rich components with Tailwind's utility classes:
187+ Ascent combines Prime UI components with Tailwind's utility classes:
173188
174189### Authentication Form Example
175190
191+ #### React Frontend
192+
176193``` jsx path=null start=null
177194import { useForm } from ' @inertiajs/react'
178195import { Button } from ' primereact/button'
@@ -238,8 +255,74 @@ export default function LoginForm() {
238255}
239256```
240257
258+ #### Vue Frontend
259+
260+ ``` vue path=null start=null
261+ <script setup>
262+ import { useForm } from '@inertiajs/vue3'
263+ import Button from '@/components/button/Button.vue'
264+ import InputText from '@/components/inputtext/InputText.vue'
265+ import Password from '@/components/password/Password.vue'
266+ import Card from '@/components/card/Card.vue'
267+
268+ const form = useForm({
269+ emailAddress: '',
270+ password: ''
271+ })
272+
273+ function handleSubmit() {
274+ form.post('/login')
275+ }
276+ </script>
277+
278+ <template>
279+ <Card class="mx-auto mt-8 w-full max-w-md">
280+ <template #content>
281+ <form @submit.prevent="handleSubmit" class="space-y-6 p-6">
282+ <h2 class="text-center text-2xl font-bold text-gray-900">
283+ Welcome Back
284+ </h2>
285+
286+ <div class="space-y-4">
287+ <div>
288+ <InputText
289+ v-model="form.emailAddress"
290+ placeholder="Email address"
291+ :class="['w-full', { 'p-invalid': form.errors.emailAddress }]"
292+ />
293+ <small v-if="form.errors.emailAddress" class="p-error block mt-1">
294+ {{ form.errors.emailAddress }}
295+ </small>
296+ </div>
297+
298+ <div>
299+ <Password
300+ v-model="form.password"
301+ placeholder="Password"
302+ :feedback="false"
303+ toggleMask
304+ class="w-full"
305+ />
306+ </div>
307+ </div>
308+
309+ <Button
310+ type="submit"
311+ label="Sign In"
312+ class="w-full"
313+ :loading="form.processing"
314+ severity="info"
315+ />
316+ </form>
317+ </template>
318+ </Card>
319+ </template>
320+ ```
321+
241322### Team Management Table
242323
324+ #### React Frontend
325+
243326``` jsx path=null start=null
244327import { DataTable } from ' primereact/datatable'
245328import { Column } from ' primereact/column'
@@ -283,6 +366,60 @@ export default function TeamMembers({ members }) {
283366}
284367```
285368
369+ #### Vue Frontend
370+
371+ ``` vue path=null start=null
372+ <script setup>
373+ import { router } from '@inertiajs/vue3'
374+ import DataTable from '@/components/datatable/DataTable.vue'
375+ import Column from '@/components/column/Column.vue'
376+ import Button from '@/components/button/Button.vue'
377+ import Tag from '@/components/tag/Tag.vue'
378+
379+ defineProps({
380+ members: Array
381+ })
382+
383+ function removeMember(memberId) {
384+ router.delete(`/team/members/${memberId}`)
385+ }
386+ </script>
387+
388+ <template>
389+ <div class="bg-white rounded-lg border">
390+ <DataTable
391+ :value="members"
392+ class="text-sm"
393+ stripedRows
394+ responsiveLayout="scroll"
395+ >
396+ <Column field="user.fullName" header="Name" />
397+ <Column field="user.emailAddress" header="Email" />
398+ <Column header="Role">
399+ <template #body="{ data }">
400+ <Tag
401+ :value="data.role"
402+ :severity="data.role === 'owner' ? 'success' : 'info'"
403+ class="text-xs"
404+ />
405+ </template>
406+ </Column>
407+ <Column header="Actions">
408+ <template #body="{ data }">
409+ <Button
410+ icon="pi pi-trash"
411+ severity="danger"
412+ text
413+ size="small"
414+ @click="removeMember(data.id)"
415+ />
416+ </template>
417+ </Column>
418+ </DataTable>
419+ </div>
420+ </template>
421+ ```
422+
286423## Project Structure
287424
288425```
@@ -292,11 +429,11 @@ my-saas-app/
292429│ ├── models/ # Database models (User, Team, etc.)
293430│ ├── helpers/ # Reusable business logic
294431│ └── policies/ # Authorization middleware
295- ├── assets/js/ # React frontend
432+ ├── assets/js/ # Frontend ( React or Vue)
296433│ ├── components/ # Reusable UI components
297434│ ├── pages/ # Inertia.js pages
298435│ ├── layouts/ # App layouts
299- │ └── hooks/ # Custom React hooks
436+ │ └── hooks/ # Custom hooks ( React) or composables (Vue)
300437├── config/ # Sails.js configuration
301438├── views/ # Email templates
302439├── content/ # Blog and static content
@@ -368,7 +505,7 @@ Ascent includes a comprehensive `WARP.md` file that provides [Warp](https://warp
368505
369506### What's in WARP.md
370507
371- - ** Project Architecture** - Complete overview of Sails.js + React + PrimeReact structure
508+ - ** Project Architecture** - Complete overview of Sails.js + React/Vue + Prime UI structure
372509- ** Development Patterns** - Established conventions for controllers, models, and components
373510- ** Configuration Guidelines** - Environment setup and deployment patterns
374511- ** Code Examples** - Working patterns for authentication, teams, billing, and more
@@ -383,13 +520,13 @@ With the included WARP.md file, you can ask Warp AI to:
383520- ** Build team management features** that integrate seamlessly
384521- ** Add billing integrations** using your existing Lemon Squeezy setup
385522- ** Debug issues** with understanding of your specific architecture
386- - ** Refactor components** while maintaining PrimeReact + Tailwind patterns
523+ - ** Refactor components** while maintaining Prime UI + Tailwind patterns
387524
388525### Getting Started with Warp
389526
3905271 . ** Open your project in [ Warp] ( https://warp.dev ) **
3915282 . ** Reference the WARP.md file** when asking questions or requesting code generation
392- 3 . ** Ask context-specific questions** about your Sails.js + React architecture
529+ 3 . ** Ask context-specific questions** about your Sails.js + React/Vue architecture
3935304 . ** Request customizations** that follow your established patterns
394531
395532Example prompts:
@@ -407,5 +544,7 @@ This approach ensures that AI-generated code integrates seamlessly with your exi
407544- ** [ Authentication Guide] ( /boring-stack/authentication ) ** - Authentication patterns
408545- ** [ Sails.js Documentation] ( https://sailsjs.com/documentation ) ** - Backend framework guide
409546- ** [ Inertia.js Guide] ( https://inertiajs.com ) ** - Modern monolith approach
410- - ** [ PrimeReact Components] ( https://primereact.org ) ** - UI component library
547+ - ** [ PrimeReact Components] ( https://primereact.org ) ** - React UI component library
548+ - ** [ PrimeVue Volt Components] ( https://volt.primevue.org ) ** - Vue UI component library with Tailwind v4
411549- ** [ React 19 Documentation] ( https://react.dev ) ** - Latest React features
550+ - ** [ Vue 3 Documentation] ( https://vuejs.org ) ** - Progressive JavaScript framework
0 commit comments