├── .env.example ├── .env.loc ├── .eslintrc.json ├── .gitignore ├── LICENSE ├── README.md ├── app ├── api │ └── lemonsqueezy │ │ ├── payment │ │ └── route.ts │ │ └── webhook │ │ └── route.ts ├── favicon.ico ├── globals.css ├── handler │ └── [...stack] │ │ └── page.tsx ├── layout.tsx ├── loading.tsx ├── not-found.tsx └── page.tsx ├── components.json ├── components ├── About.tsx ├── AnimatedButton.tsx ├── Bento.tsx ├── FAQs.tsx ├── Features.tsx ├── Hero.tsx ├── How.tsx ├── Marquee.tsx ├── MobileNav.tsx ├── Navbar.tsx ├── PopupList.tsx ├── Press.tsx ├── Pricing.tsx ├── Shiny.tsx ├── SideNav.tsx ├── cta.tsx ├── email-template.tsx ├── footer.tsx ├── logo.tsx ├── magicui │ ├── animated-list.tsx │ ├── animated-shiny-text.tsx │ ├── animated-subscribe-button.tsx │ ├── bento-grid.tsx │ └── marquee.tsx ├── mode-toggle.tsx ├── theme-provider.tsx ├── ui │ ├── accordion.tsx │ ├── avatar.tsx │ ├── badge.tsx │ ├── button.tsx │ ├── card.tsx │ ├── dropdown-menu.tsx │ └── sheet.tsx └── useAccountNav.tsx ├── db ├── index.ts └── schema.ts ├── drizzle.config.ts ├── lib ├── axios.ts └── utils.ts ├── next.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.mjs ├── public ├── logo.svg ├── next.svg └── vercel.svg ├── stack.tsx ├── tailwind.config.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | #DATABASE 2 | TURSO_CONNECTION_URL= 3 | TURSO_AUTH_TOKEN= 4 | 5 | #PAYMENT 6 | LEMON_SQUEEZY_STORE_ID = 7 | LEMON_SQUEEZY_API_KEY = 8 | LEMON_SQUEEZY_WEBHOOK_SIGNATURE = 9 | 10 | #EMAIL 11 | RESEND_API_KEY = -------------------------------------------------------------------------------- /.env.loc: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_STACK_PROJECT_ID= 2 | NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY= 3 | STACK_SECRET_SERVER_KEY= -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | .env 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 wolfgunblood 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Next.js SaaS kit

4 |

🔥 Open Source MVP Boilerplate

5 | 6 | [![GitHub Repo stars](https://img.shields.io/github/stars/wolfgunblood/nextjs-saaskit)](https://github.com/wolfgunblood/nextjs-saaskit) 7 | 8 |
9 |
10 | 15 | 16 | image 17 | 18 | ## Motivation 19 | 20 | Implementing authentication in Next.js, especially Email+Password authentication, Oauth, payments, and database integration can be challenging. 21 | 22 | No more hassle with user management. No more hassle for payment integrations. No more building a landing page from scratch. 23 | 24 | A done-for-you starter kit 25 | 26 | ## Key Features 27 | 28 | - **Authentication:** 💼 Support for Credential and OAuth(google,github) authentication. 29 | - **Authorization:** 🔒 Easily manage public and protected routes within the `app directory`. 30 | - **Email Verification:** 📧 Verify user identities through email. 31 | - **Password Reset:** 🔑 Streamline password resets by sending email password reset links. 32 | - **Lemonsqueezy Payment:** 💳 Setup user subscriptions seamlessly with lemonsqueezy. 33 | - **Turso Database:** 🛢️ Utilize a turso database set up. 34 | - **Drizzle ORM:** 🛢️ Utilize a Drizzle ORM. 35 | 36 | ## Tech Stack 37 | 38 | - [Next.js](https://nextjs.org) 39 | - [Stack Auth](https://stack-auth.com/) 40 | - [Tailwind CSS](https://tailwindcss.com) 41 | - [Shadcn UI](https://ui.shadcn.com/) 42 | - [React Hook Form](https://www.react-hook-form.com/) 43 | 44 | ## Get Started 45 | 46 | 1. `git clone https://github.com/wolfgunblood/nextjs-saaskit` 47 | 2. `cd projectName` 48 | 3. Copy `.env.loc` to `.env.local` 49 | 4. Copy `.env.example` to `.env` 50 | 5. Update env variables 51 | 6. Run `npm install` to install dependencies. 52 | 7. Execute `npm dev` to start the development server and enjoy! 53 | 54 | ## Roadmap 55 | 56 | - [ ] Stripe Integration 57 | - [ ] Resend Integration 58 | - [ ] Prisma Integration 59 | 60 | ## Contributing 61 | 62 | To contribute, fork the repository and create a feature branch. Test your changes, and if possible, open an issue for discussion before submitting a pull request. Follow project guidelines, and welcome feedback to ensure a smooth integration of your contributions. Your pull requests are warmly welcome. 63 | 64 | ### New 65 | 66 | [NextWrapper](https://nextwrapper.com/) - An AI-powered No-Code tool to build your SaaS. 67 | 68 | Build SaaS, AI tool, and web app builder in days not months 69 | 70 | An AI-powered No-Code tool to build your SaaS, AI tool, or any web app in days—not months. Stop wasting time setting up everything & leverage AI to build your startup today! 71 | -------------------------------------------------------------------------------- /app/api/lemonsqueezy/payment/route.ts: -------------------------------------------------------------------------------- 1 | import { lemonSqueezyApiInstance } from "@/lib/axios"; 2 | 3 | export const dynamic = "force-dynamic"; 4 | 5 | export async function POST(req :Request) { 6 | try { 7 | const reqData = await req.json(); 8 | 9 | if (!reqData.product_id) 10 | return Response.json( 11 | { message: "product_id is required" }, 12 | { status: 400 } 13 | ); 14 | 15 | const response = await lemonSqueezyApiInstance.post("/checkouts", { 16 | data: { 17 | type: "checkouts", 18 | attributes: { 19 | checkout_data: { 20 | custom: { 21 | user_id: "123", 22 | }, 23 | }, 24 | }, 25 | relationships: { 26 | store: { 27 | data: { 28 | type: "stores", 29 | id: process.env.LEMON_SQUEEZY_STORE_ID!.toString(), 30 | }, 31 | }, 32 | variant: { 33 | data: { 34 | type: "variants", 35 | id: reqData.product_id.toString(), 36 | }, 37 | }, 38 | }, 39 | }, 40 | }); 41 | 42 | const checkoutUrl = response.data.data.attributes.url; 43 | 44 | console.log(response.data); 45 | 46 | return Response.json({ checkoutUrl }); 47 | } catch (error) { 48 | console.error(error); 49 | Response.json({ message: "An error occured" }, { status: 500 }); 50 | } 51 | } -------------------------------------------------------------------------------- /app/api/lemonsqueezy/webhook/route.ts: -------------------------------------------------------------------------------- 1 | 2 | export async function POST(req : Request) { 3 | try { 4 | const crypto = typeof window === 'undefined' ? require('crypto') : null; 5 | if (!crypto) { 6 | throw new Error("crypto is required"); 7 | } 8 | // Catch the event type 9 | const clonedReq = req.clone(); 10 | const eventType = req.headers.get("X-Event-Name"); 11 | const body = await req.json(); 12 | 13 | // Check signature 14 | const secret = process.env.LEMON_SQUEEZY_WEBHOOK_SIGNATURE; 15 | if (!secret) { 16 | throw new Error("Webhook signature secret is not defined."); 17 | } 18 | const hmac = crypto.createHmac("sha256", secret); 19 | const digest = Buffer.from( 20 | hmac.update(await clonedReq.text()).digest("hex"), 21 | "utf8" 22 | ); 23 | const signature = Buffer.from(req.headers.get("X-Signature") || "", "utf8"); 24 | 25 | if (!crypto.timingSafeEqual(digest, signature)) { 26 | throw new Error("Invalid signature."); 27 | } 28 | 29 | console.log(body); 30 | 31 | if (eventType === "order_created") { 32 | const userId = body.meta.custom_data.user_id; 33 | const isSuccessful = body.data.attributes.status === "paid"; 34 | } 35 | 36 | return Response.json({ message: "Webhook received" }); 37 | } catch (err) { 38 | console.error(err); 39 | return Response.json({ message: "Something went wrong" }, { status: 500 }); 40 | } 41 | } -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- 1 |  h6  (�00 h&�(  ���1�������ٷ����������ٛ������1��� ������������������������������������������� ��� ������������������������������������������������q�� ��š��������������������������������������������~���w������1���������������f~^�YsV�TsU�PtT�LtS�NZ��������~���u���m��1��ė������������l~_�XnR���~�}�}�v�|�p�{�EnN�HY�����~���u���n������������������N[F����������ݢ��ޡ�p�|�j�z�4]@�����~���u���l����������������Ѡ�"(�����UlQ���������FmN�j�z�)�rԒ�~���u���m�������������������csX���~�����������������j�y�BuQ�����~���u���m����������������������� �$�"�"�%� �j�������~���u���l�����ė������������������������HbG�b�h�����������������~���u���n������1��������������������c�_�TsT��˓�����������������~���u���m��1��š��������������������������������������������~���w������ ������������������������������������������������q�� ��� ������������������������������������������� ���1�������ٷ����������ٛ������1( @ �����Y�������̻����������������̣������Y������&�����������������������������������������������������������&�� 2 | ��������������������������������������������������������������������������� 3 | ���%�������������������������������������������������������������������������������ԃ��%���1����������������������������������������������������������������������������������������}��1���%��������������������������������������������������������������������������������������������}���u��%�� 4 | ������������������������������������������������������������������������������������������������|���x���f�� 5 | ��Ì������������������������������������������������������������������������������������������������|���x���s������&������������������������������������������������������������������������������������������|���x���s���k��&��ŝ��������������������������������������������m�������������������|���x���s���p�������������������������������������� 6 | �GYB�G[D�E[C�D[C�B[B�@[B�>[B�=[A�;[A�8Y?� ������������������|���x���s���o���f�����Y��������������������������������HXB�����������������������������������������7Y?�����������������|���x���s���n���m��Y��ś��������������������������������JZD����������ܢ������������������ݟ���������8\A�����������������|���x���s���n���k��������������������������������ڧ�u�h��JZD������ڢ��e�d���������^�c���ۜ�����8\A��N�`�yݙ���������|���x���s���n���j�������������������������������]iP���IZD������˘��YxX���������SxW���͒�����8[@���:jI���������|���x���s���n���j������������������������������������z��JZD������ߦ��m�l���������e�k���������8[A��\�q������������|���x���s���n���j���������������������������������������JZD���������������������������������������8\A�����������������|���x���s���n���j���������������������������������������EU@�����������������������������������������5V=�����������������|���x���s���n���j���������������������������������������#��2>/�3@0�1@0�0@/�.@/�-@/�,A/�+A.�*A.�'?,��$�����������������|���x���s���n���j�����ś���������������������������������˚�*3&� �������� � 7 | �3$�x͐�����������������|���x���s���n���k������Y��������������������������������������������������������$�$�����������������������������������������|���x���s���n���m��Y����������������������������������������������k�f�E[C�D[C� �$�����������������������������������������|���x���s���o���f����ŝ����������������������������������������&����-@.�����������������������������������������|���x���s���p������&������������������������������������������������������������������������������������������������|���x���s���k��&��Ì������������������������������������������������������������������������������������������������|���x���s����� 8 | ������������������������������������������������������������������������������������������������|���x���f�� 9 | ���%��������������������������������������������������������������������������������������������}���u��%���1����������������������������������������������������������������������������������������}��1���%�������������������������������������������������������������������������������ԃ��%�� 10 | ��������������������������������������������������������������������������� 11 | ���&�����������������������������������������������������������&�����Y�������̻����������������̣������Y���(0` ��������"���I�����������ط����������������ب����������I���"������������2���v������������������������������������������������������������������v���2���������������������������������������������������������������������������������������������������������r��������������������������������������������������������������������������������������������������r���������?�������������������������������������������������������������������������������������������������������������������?������e��������������������������������������������������������������������������������������������������������������������������e��������p����������������������������������������������������������������������������������������������������������������������������������p���������p���������������������������������������������������������������������������������������������������������������������������������������}��p�����e�������������������������������������������������������������������������������������������������������������������������������������������{���y��e������?�����������������������������������������������������������������������������������������������������������������������������������������������{���y���u��?��������¸�����������������������������������������������������������������������������������������������������������������������������������������������{���x���v���m�����r���������������������������������������������������������������������������������������������������������������������������������������������������{���y���u���r��r���������������������������������������������������������������������������������������������������������������������������������������������������������{���y���u���s���n�������ŝ�������������������������������������������������{�]sW�TjO�SiN�QiN�PiN�OiN�MiM�LiM�KjM�IjM�HjL�GjL�EjL�DjL�CjL�GtR�d�t��������������������������������{���y���u���r���p���������2�����������������������������������������������O^G� 12 | ����������������� �8_B����������������������������{���y���u���r���o���k��2������v����������������������������������������������|� 13 | �����������������  �� �_�t������������������������{���y���u���r���o���n��v��������ű��������������������������������������������bsW�����y��ס��ء��ؠ��ؠ��؟��؟��؞��ٞ��ٝ��ٝ��ٜ��ٜ��ٛ��ٚ�d�s�  ��BuQ������������������������{���y���u���r���o���l���i�����"�����������������������������������������������ZjP����ס����������������������������������������������������������ٚ���=kK������������������������{���y���u���r���o���l���i��"���I�����������������������������������������������ZiP����ע��������������������������������������������������������ښ���=jJ������������������������{���y���u���r���o���l���i��I��Ɔ�����������������������������������������������ZiP����ע�����������~�BW@�y�w�����������������o�v�:X?�o�{����������ښ���=jJ������������������������{���y���u���r���o���l���i�����ŵ������������������������������������������}�DO<�"����ע���������AT>��$0$�����������������!0#��7U<���������ښ���"�-P7�[�s����������������{���y���u���r���o���l���j����������������������������������������������#������ס��������=N:��(�����������������(��3O8���������ٚ�����#�|�������������{���y���u���r���o���l���i����������������������������������������������esX�*1%�����ע��������>P;��)�����������������)��4P9���������ٚ��� �1"�@uQ����������������{���y���u���r���o���l���i���������������������������������������������������ۦ�Q_H����ע���������^zZ��PlO�����������������IlN��P{X����������ٚ���6`C�}ޚ�������������������{���y���u���r���o���l���i������������������������������������������������������ZiP����ע��������������������������������������������������������ښ���=jJ������������������������{���y���u���r���o���l���i������������������������������������������������������ZiP����ע����������������������������������������������������������ٚ���=jJ������������������������{���y���u���r���o���l���i�������������������������������������������������������\lR����ϛ����������������������������������������������������������Д���>mL������������������������{���y���u���r���o���l���i�����ŵ������������������������������������������������x�k���/:,�UjP�UkP�SkP�RkP�PkO�OkO�MkN�LkN�KlN�IlN�HlM�GlM�ElM�CkL�$;*���Q�d������������������������{���y���u���r���o���l���j�����Ć�������������������������������������������������٤�3<.�������������������$=+�~ۙ������������������������{���y���u���r���o���l���i������I�����������������������������������������������������ި�[nS� �  �  �  �  �  � ��� � 14 |  15 | � 16 |  17 | � 18 |  19 | �  20 | �  21 | � �BoN�������������������������������{���y���u���r���o���l���i��I���"������������������������������������������������������������������������������������w�v� � �o�u������������������������������������������������������������{���y���u���r���o���l���i��"�����ű���������������������������������������������������������������������ܣ��ؠ��؟�g�f� 22 | � �o�u������������������������������������������������������������{���y���u���r���o���l���i��������v����������������������������������������������������������������WoS� ����� �o�u������������������������������������������������������������{���y���u���r���o���n��v������2����������������������������������������������������������������#������  �w�}������������������������������������������������������������{���y���u���r���o���k��2�����ŝ����������������������������������������������������������������TlQ�PiN�NiM�MiM�LiM�_�b���������������������������������������������������������������{���y���u���r���p����������������������������������������������������������������������������������������������������������������������������������������������������������������{���y���u���s���n�����r���������������������������������������������������������������������������������������������������������������������������������������������������{���y���u���r��r�����¸�����������������������������������������������������������������������������������������������������������������������������������������������{���x���v���m��������?�����������������������������������������������������������������������������������������������������������������������������������������������{���y���u��?������e�������������������������������������������������������������������������������������������������������������������������������������������{���y��e������p���������������������������������������������������������������������������������������������������������������������������������������}��p��������p����������������������������������������������������������������������������������������������������������������������������������p���������e��������������������������������������������������������������������������������������������������������������������������e�����?�������������������������������������������������������������������������������������������������������������������?���������r��������������������������������������������������������������������������������������������������r���������������������������������������������������������������������������������������������������������2���v������������������������������������������������������������������v���2�����������"���I�����������ط����������������ب����������I���"������ -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | 6 | @layer base { 7 | :root { 8 | --background: 0 0% 100%; 9 | --foreground: 224 71.4% 4.1%; 10 | --card: 0 0% 100%; 11 | --card-foreground: 224 71.4% 4.1%; 12 | --popover: 0 0% 100%; 13 | --popover-foreground: 224 71.4% 4.1%; 14 | --primary: 220.9 39.3% 11%; 15 | --primary-foreground: 210 20% 98%; 16 | --secondary: 220 14.3% 95.9%; 17 | --secondary-foreground: 220.9 39.3% 11%; 18 | --muted: 220 14.3% 95.9%; 19 | --muted-foreground: 220 8.9% 46.1%; 20 | --accent: 220 14.3% 95.9%; 21 | --accent-foreground: 220.9 39.3% 11%; 22 | --destructive: 0 84.2% 60.2%; 23 | --destructive-foreground: 210 20% 98%; 24 | --border: 220 13% 91%; 25 | --input: 220 13% 91%; 26 | --ring: 224 71.4% 4.1%; 27 | --radius: 0.5rem; 28 | } 29 | 30 | .dark { 31 | --background: 224 71.4% 4.1%; 32 | --foreground: 210 20% 98%; 33 | --card: 224 71.4% 4.1%; 34 | --card-foreground: 210 20% 98%; 35 | --popover: 224 71.4% 4.1%; 36 | --popover-foreground: 210 20% 98%; 37 | --primary: 210 20% 98%; 38 | --primary-foreground: 220.9 39.3% 11%; 39 | --secondary: 215 27.9% 16.9%; 40 | --secondary-foreground: 210 20% 98%; 41 | --muted: 215 27.9% 16.9%; 42 | --muted-foreground: 217.9 10.6% 64.9%; 43 | --accent: 215 27.9% 16.9%; 44 | --accent-foreground: 210 20% 98%; 45 | --destructive: 0 62.8% 30.6%; 46 | --destructive-foreground: 210 20% 98%; 47 | --border: 215 27.9% 16.9%; 48 | --input: 215 27.9% 16.9%; 49 | --ring: 216 12.2% 83.9%; 50 | } 51 | } 52 | 53 | @layer base { 54 | * { 55 | @apply border-border; 56 | } 57 | body { 58 | @apply bg-background text-foreground; 59 | } 60 | } -------------------------------------------------------------------------------- /app/handler/[...stack]/page.tsx: -------------------------------------------------------------------------------- 1 | import { StackHandler } from "@stackframe/stack"; 2 | import { stackServerApp } from "../../../stack"; 3 | 4 | export default function Handler(props: any) { 5 | return ; 6 | } 7 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { StackProvider, StackTheme } from "@stackframe/stack"; 3 | import { stackServerApp } from "../stack"; 4 | import { Inter } from "next/font/google"; 5 | import "./globals.css"; 6 | import { ThemeProvider } from "@/components/theme-provider"; 7 | import { PopupList } from "@/components/PopupList"; 8 | 9 | const inter = Inter({ subsets: ["latin"] }); 10 | 11 | export const metadata: Metadata = { 12 | title: "Acme Inc.", 13 | description: "description", 14 | }; 15 | 16 | export const runtime = "edge"; 17 | 18 | export default function RootLayout({ 19 | children, 20 | }: Readonly<{ 21 | children: React.ReactNode; 22 | }>) { 23 | return ( 24 | 25 | 26 | 27 | 28 | 29 | 30 | 36 | {children} 37 | 38 | 39 | 40 | 41 | 42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /app/loading.tsx: -------------------------------------------------------------------------------- 1 | export default function Loading() { 2 | // Stack uses React Suspense, which will render this page while user data is being fetched. 3 | // See: https://nextjs.org/docs/app/api-reference/file-conventions/loading 4 | return <>; 5 | } 6 | -------------------------------------------------------------------------------- /app/not-found.tsx: -------------------------------------------------------------------------------- 1 | // This sets the page to use the Edge runtime 2 | export const runtime = 'edge'; 3 | 4 | // Asynchronous function to handle the 404 page 5 | export default async function NotFound() { 6 | // Here you can include any server-side logic if necessary 7 | // For instance, fetching data from an API 8 | 9 | // Return the JSX for the 404 page 10 | return ( 11 |
12 |

404 - Page Not Found

13 |

We're sorry, the page you requested could not be found.

14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import About from "@/components/About"; 3 | import { Bento } from "@/components/Bento"; 4 | import CTA from "@/components/cta"; 5 | import { FAQ } from "@/components/FAQs"; 6 | import Features from "@/components/Features"; 7 | import Footer from "@/components/footer"; 8 | import Hero from "@/components/Hero"; 9 | import HowComponent from "@/components/How"; 10 | import Testimonial from "@/components/Marquee"; 11 | import Navbar from "@/components/Navbar"; 12 | import { Press } from "@/components/Press"; 13 | import { Pricing } from "@/components/Pricing"; 14 | import Image from "next/image"; 15 | 16 | export default function Home() { 17 | return ( 18 | <> 19 | 20 | 21 | 22 | 23 | {/* */} 24 | 25 | 26 | 27 | 28 |