{"repo":"pjborowiecki/saasyland.com","free":true,"listed":false,"github":"https://github.com/pjborowiecki/saasyland.com","clone":"git clone https://github.com/pjborowiecki/saasyland.com.git","description":"Saasy Land is an open-source, opinionated, clean, elegant Next.js starter kit for production-grade SaaS. Engineered for scale with Bun, Vercel, Elysia, Better Auth, Neon Postgres + Drizzle, and Shadcn UI. The robust, high-performance foundation for serious builders to ship modern, scalable full-stack applications without the boilerplate overhead.","language":"TypeScript","stars":435,"topics":["better-auth","bun","bun-runtime","cloudflare-email-service","drizzle","neon","next16","nextjs","r2","saas","saas-boilerplate","saas-template","serverless","starter-template","vercel"],"license":"MIT","category":"saas_starter","readme_excerpt":"# [Next 14 starters with authentication and database set up](https://saasyland.com)\n\n#### See the live demo [here](https://saasyland.com)\n\n## Description:\n\nStarter templates for [Next.js 14](https://nextjs.org/) full-stack projects. Built with [TypeScript](https://www.typescriptlang.org/), [Tailwind CSS](https://tailwindcss.com/), [ShadCn/ui](https://ui.shadcn.com/), authentication, and database. Several branches contain several different configurations, including serverless databases like PostgreSQL with [Neon](https://neon.tech), or MySQL with [PlanetScale](https://planetscale.com), [Drizzle ORM](https://orm.drizzle.team/), [Prisma ORM v.5](https://www.prisma.io/) (serverless-compatible), but also [MongoDB Atlas](https://www.mongodb.com/atlas/database), [Supabase](https://supabase.com/), and even [Nest.js](https://nestjs.com/), [Express (MERN stack)](https://expressjs.com/), or [Django](https://www.djangoproject.com/). All users are stored in a database, regardless of whether they signed up with email and password, magic link, or via an OAuth provider, such a Google or GitHub.\n\n<br />\n\n> **Warning**\n> This project is still in active development. See a feature list below to get a better understanding of what has been implemented to date and what is yet to come.\n\n<br />\n\n## Features:\n\n- [x] Authentication with NextAuth\n- [x] Database and ORM set up\n- [x] Magic link authentication\n- [x] OAuth authentication\n- [x] Email and password authentication\n- [x] Email verification\n- [x] Password reset\n- [x] Email templates with React Email\n- [x] Functional contact form\n- [x] Functional newsletter sign up\n- [x] Functional blog with Contentlayer and MDX\n- [x] Functional and styled landing page with pricing, features, testimonials, and FAQ sections\n- [x] Functional and styled sign in and sign up pages\n- [x] Input validation with Zod\n- [x] Rigorous linting and TypeScript type checking\n\n<br />\n\n- [ ] Documentation pages\n- [ ] Stripe payments integration\n- [ ] Opt out from newsletter\n- [ ] User profile and settings pages\n- [ ] Custom loading pages with skeleton loaders\n- [ ] Custom error pages\n- [ ] Add pages for menu items\n- [ ] Improve MDX blog styling\n- [ ] Improve performance and make Edge compatible\n- [ ] Add tests\n\n<br />\n\n![public/images/screenshots/screenshot_1](./public/images/screenshots/screenshot_1.png)\n\n![public/images/screenshots/screenshot_2](./public/images/screenshots/screenshot_2.png)\n\n![public/images/screenshots/screenshot_3](./public/images/screenshots/screenshot_3.png)\n\n![public/images/screenshots/screenshot_4](./public/images/screenshots/screenshot_4.png)\n\n<br />\n\n## Available configurations:\n\n- ### [next-auth-drizzle-neon-postgres](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-drizzle-planetscale-mysql)\n\nThis branch contains a Next.js 14 starter with Next-Auth authentication using JSON Web Tokens (JWT), and a PostgreSQL database set up at [Neon](https://neon.tech). The database is connected with [Drizzle ORM](https://orm.drizzle.team), which is serverless-compatible. OAuth authentication is also set up for GitHub and Google providers. The set up contains email verification and password reset functionality, both set up with [Resend](https://resend.com) and [React Email](https://react).\n\n- ### [next-auth-drizzle-planetscale-mysql](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-drizzle-planetscale-mysql)\n\nThis branch contains a Next.js 14 starter with Next-Auth authentication using JSON Web Tokens (JWT), and a MySQL database set up at [PlanetScale](https://planetscale.com). The database is connected with [Drizzle ORM](https://orm.drizzle.team/), which is serverless-compatible. OAuth authentication is also set up for GitHub and Google providers. The set up contains email verification and password reset functionality, both set up with [Resend](https://resend.com) and [React Email](https://react.email/).\n\n- ### [next-auth-prisma5-serverless-neon-postgres](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-prisma5-serverless-neon-postgres)\n\nThis branch contains a Next.js 14 starter with Next-Auth authentication using JSON Web Tokens (JWT), and a PostgreSQL database set up at [Neon](https://neon.tech). The database is connected via [Prisma](https://prisma.io) v.5, which is serverless-compatible. OAuth authentication is also set up for GitHub and Google. The set up contains email verification and password reset functionality, both set up with [Resend](https://resend.com) and [React Email](https://react.email/).\n\n- ### [next-auth-prisma5-serverless-planetscale-mysql](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-prisma5-serverless-planetscale-mysql)\n\nThis branch contains a Next.js 14 starter with Next-Auth authentication using JSON Web Tokens (JWT), and a MySQL database set up at [PlanetScale](https://planetscale.com). The database is connected via [Prisma](https://prisma.io) v.5, which is serverless-compatible. OAuth authentication is also set up for GitHub and Google. The set up contains email verification and password reset functionality, both set up with [Resend](https://resend.com) and [React Email](https://react.email/).\n\n- ### [next-auth-docker-local-postgres-drizzle](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-docker-local-postgres-drizzle)\n\nUnder construction\n\n- ### [next-auth-docker-local-postgres-prisma](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-docker-local-postgres-prisma)\n\nUnder construction\n\n- ### [next-auth-mongoose-mongodb](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-mongoose-mongodb)\n\nUnder construction\n\n- ### [nestjs-nextjs-next-auth-prisma-sqlite](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/nestjs-nextjs-next-auth-prisma-sqlite)\n\nUnder construction\n\n- ### [nestjs-nextjs-next-auth-drizzle-sqlite](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/nestjs-nextjs-next-auth-drizzle-sqlite)\n\nUnder construction\n\n- ### [mern-nextjs-redux](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/mern-nextjs-redux)\n\nUnder construction\n\n- ### [mern-vite-plain-react-redux](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/mern-vite-plain-react-redux)\n\nUnder construction\n\n- ### [next-auth-supabase-postgres](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/next-auth-supabase-postgres)\n\nUnder construction\n\n- ### [supabase-postgres](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/supabase-postgres)\n\nUnder construction\n\n- ### [django-rest-djoser-digital-ocean-spaces-aws-ses-next-redux](https://github.com/pjborowiecki/SAASY-LAND-Next-14-Starters-With-Authentication-And-Database-Implemented/tree/django-rest-djoser-digital-ocean-spaces-aws-ses-next-redux)\n\nUnder construction\n","default_branch":"main","files":195,"tree":[".env.example",".eslintignore",".eslintrc.json",".gitignore",".nvmrc",".prettierignore",".prettierrc.json","LICENSE","README.md","components.json","contentlayer.config.js","next.config.mjs","package.json","pnpm-lock.yaml","postcss.config.mjs","prisma/schema.prisma","public/favicon.ico","public/fonts/cal-sans-semi-bold.woff2","public/images/avatars/alfredobradley.jpeg","public/images/avatars/bethcraig.jpeg","public/images/avatars/darrenmiller.jpeg","public/images/avatars/derrickbowman.jpeg","public/images/avatars/jennyblack.jpeg","public/images/avatars/kevinhamilton.jpeg","public/images/avatars/michellejensen.jpeg","public/images/avatars/pjborowiecki.jpeg","public/images/avatars/rafalkowalski.jpeg","public/images/avatars/troycastillo.jpeg","public/images/benefits/1.jpeg","public/images/benefits/2.jpeg","public/images/benefits/3.jpeg","public/images/blog/blog-four.jpeg","public/images/blog/blog-one.jpeg","public/images/blog/blog-three.jpeg","public/images/blog/blog-two.jpeg","public/images/features/authentication.png","public/images/features/blogging.png","public/images/features/database.png","public/images/features/emails.png","public/images/features/payments.png","public/images/radial_1.svg","public/images/screenshots/screenshot_1.png","public/images/screenshots/screenshot_2.png","public/images/screenshots/screenshot_3.png","public/images/screenshots/screenshot_4.png","public/logo.svg","public/next.svg","public/vercel.svg","src/actions/auth.ts","src/actions/email.ts","src/actions/newsletter.ts","src/actions/user.ts","src/app/(auth)/layout.tsx","src/app/(auth)/signin/magic-link-signin/page.tsx","src/app/(auth)/signin/page.tsx","src/app/(auth)/signin/password-reset/page.tsx","src/app/(auth)/signin/password-update/page.tsx","src/app/(auth)/signup/page.tsx","src/app/(auth)/signup/reverify-email/page.tsx","src/app/(auth)/signup/verify-email/page.tsx","src/app/(dashboard)/dashboard/account/page.tsx","src/app/(dashboard)/dashboard/layout.tsx","src/app/(dashboard)/dashboard/page.tsx","src/app/(dashboard)/dashboard/settings/page.tsx","src/app/(landing)/about/page.tsx","src/app/(landing)/blog/[...slug]/loading.tsx","src/app/(landing)/blog/[...slug]/not-found.tsx","src/app/(landing)/blog/[...slug]/page.tsx","src/app/(landing)/blog/loading.tsx","src/app/(landing)/blog/page.tsx","src/app/(landing)/faq/page.tsx","src/app/(landing)/features/page.tsx","src/app/(landing)/layout.tsx","src/app/(landing)/page.tsx","src/app/(landing)/pricing/page.tsx","src/app/(landing)/privacy/page.tsx","src/app/(landing)/tos/page.tsx","src/app/api/auth/[...nextauth]/route.ts","src/app/api/og/route.tsx","src/app/layout.tsx","src/app/opengraph-image.png","src/auth.ts","src/components/auth/oauth-buttons.tsx","src/components/auth/signout-button.tsx","src/components/copy-button.tsx","src/components/emails/email-verification-email.tsx","src/components/emails/magic-link-email.tsx","src/components/emails/new-enquiry-email.tsx","src/components/emails/newsletter-welcome-email.tsx","src/components/emails/reset-password-email.tsx","src/components/error-card.tsx","src/components/forms/contact-form.tsx","src/components/forms/email-verification-form.tsx","src/components/forms/newsletter-signup-form.tsx","src/components/forms/password-reset-form.tsx","src/components/forms/password-update-form.tsx","src/components/forms/signin-with-email-form.tsx","src/components/forms/signin-with-password-form.tsx","src/components/forms/signup-with-password-form.tsx","src/components/forms/update-user-form.tsx","src/components/icons.tsx","src/components/mdx/callout.tsx","src/components/mdx/code-block.tsx","src/components/mdx/mdx-card.tsx","src/components/mdx/mdx-components.tsx","src/components/mdx/mdx-pager.tsx","src/components/nav/footer.tsx","src/components/nav/header.tsx","src/components/nav/navigation-mobile.tsx","src/components/nav/navigation.tsx","src/components/password-input.tsx","src/components/sections/benefits-section.tsx","src/components/sections/contact-section.tsx","src/components/sections/faq-section.tsx","src/components/sections/features-section.tsx","src/components/sections/hero-section.tsx","src/components/sections/newsletter-section.tsx","src/components/sections/pricing-section.tsx","src/components/sections/tech-section.tsx","src/components/sections/testimonials-section.tsx","src/components/tailwind-indicator.tsx","src/components/theme-toggle.tsx","src/components/ui/accordion.tsx","src/components/ui/alert-dialog.tsx","src/components/ui/alert.tsx","src/components/ui/aspect-ratio.tsx","src/components/ui/avatar.tsx","src/components/ui/badge.tsx","src/components/ui/button.tsx","src/components/ui/calendar.tsx","src/components/ui/card.tsx","src/components/ui/checkbox.tsx","src/components/ui/collapsible.tsx","src/components/ui/command.tsx","src/components/ui/context-menu.tsx","src/components/ui/dialog.tsx","src/components/ui/dropdown-menu.tsx","src/components/ui/form.tsx","src/components/ui/hover-card.tsx","src/components/ui/input.tsx","src/components/ui/label.tsx","src/components/ui/menubar.tsx","src/components/ui/navigation-menu.tsx","src/components/ui/popover.tsx","src/components/ui/progress.tsx","src/components/ui/radio-group.tsx","src/components/ui/scroll-area.tsx","src/components/ui/select.tsx","src/components/ui/separator.tsx","src/components/ui/sheet.tsx","src/components/ui/skeleton.tsx","src/components/ui/slider.tsx","src/components/ui/switch.tsx","src/components/ui/tabs.tsx","src/components/ui/textarea.tsx","src/components/ui/toast.tsx","src/components/ui/toaster.tsx","src/components/ui/toggle.tsx","src/components/ui/tooltip.tsx","src/config/auth.ts","src/config/db.ts","src/config/defaults.ts","src/config/email.ts","src/config/fonts.ts","src/config/site.ts","src/content/authors/pjborowiecki.mdx","src/content/blog/boosting-efficiency-with-server-actions.mdx","src/content/blog/caching-and-server-side-rendering-in-nextjs.mdx","src/content/blog/serverless-architecture.mdx","src/content/blog/serverless-functions-in-nextjs.mdx","src/content/pages/privacy.mdx","src/content/pages/terms.mdx","src/data/features.ts","src/data/frequently-asked-questions.ts","src/data/pricing-plans.ts","src/data/tech-stack.ts","src/data/testimonials.ts","src/env.mjs","src/hooks/use-toast.ts","src/lib/auth.ts","src/lib/mdx.ts","src/lib/utils.ts","src/providers/smooth-scroll-provider.tsx","src/providers/theme-provider.tsx","src/styles/globals.css","src/styles/mdx.css","src/types/index.d.ts","src/types/next-auth.d.ts","src/validations/auth.ts","src/validations/email.ts","src/validations/newsletter.ts","src/validations/og.ts","src/validations/user.ts","tailwind.config.ts","tsconfig.json"],"storefront":"/r/pjborowiecki","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/pjborowiecki/saasyland.com/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}