{"repo":"wasp-lang/open-saas","free":true,"listed":false,"github":"https://github.com/wasp-lang/open-saas","clone":"git clone https://github.com/wasp-lang/open-saas.git","description":"A 100% free modern JS SaaS boilerplate (React, NodeJS, Prisma). Full-featured: Auth (email, google, github, slack, MS), Email sending, Background jobs, Landing page, Payments (Stripe, Polar.sh), Shadcn UI, S3 file upload. AI-ready with tailored AGENTS.md, skills, and Claude Code plugin. One cmd deploy. Powered by Wasp full-stack framework.","language":"MDX","stars":15416,"topics":["ai","authentication","aws-s3","boilerplate","chatgpt","full-stack","google-auth","hacktoberfest","nodejs","open-source","openai-api","postgresql","prisma","react","saas","saas-boilerplate","saas-starter","saas-template","typesafe","typescript"],"license":"MIT","category":"saas_starter","readme_excerpt":"## Welcome to your new SaaS App! 🎉\n\n<div style=\"display: flex; gap: 16px; align-items: center;\">\n  <a href=\"https://www.producthunt.com/products/open-saas?embed=true&utm_source=badge-top-post-topic-badge&utm_medium=badge&utm_source=badge-open&#0045;saas&#0045;2&#0045;0\" target=\"_blank\">\n    <img src=\"https://api.producthunt.com/widgets/embed-image/v1/top-post-topic-badge.svg?post_id=1023519&theme=neutral&period=weekly&topic_id=237&t=1760520428563\" alt=\"Open&#0032;SaaS&#0032;2&#0046;0 - Free&#0044;&#0032;open&#0045;source&#0032;SaaS&#0032;starter&#0032;kit&#0032;with&#0032;superpowers | Product Hunt\" style=\"width: 250px; height: 54px;\" width=\"250\" height=\"54\" />\n  </a>\n  <a href=\"https://www.producthunt.com/products/open-saas?embed=true&utm_source=badge-top-post-badge&utm_medium=badge&utm_source=badge-open&#0045;saas&#0045;2&#0045;0\" target=\"_blank\">\n    <img src=\"https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=1023519&theme=neutral&period=daily&t=1760520428563\" alt=\"Open&#0032;SaaS&#0032;2&#0046;0 - Free&#0044;&#0032;open&#0045;source&#0032;SaaS&#0032;starter&#0032;kit&#0032;with&#0032;superpowers | Product Hunt\" style=\"width: 250px; height: 54px;\" width=\"250\" height=\"54\" />\n  </a>\n</div>\n\nhttps://github.com/user-attachments/assets/3856276b-23e9-455e-a564-b5f26f4f0e98\n\nYou've decided to build a SaaS app with the Open SaaS template. Great choice!\n\nThis template is:\n\n1. fully open-source\n2. completely free to use and distribute\n3. comes with a ton of features out of the box!\n4. ready to work with your favorite AI coding tool or agent (Claude Code, Cursor, Codex, OpenCode, etc.)\n\n🧑‍💻 Check it out in action here: [OpenSaaS.sh](https://opensaas.sh)\n📚 Check out the Docs here: [Open SaaS Docs](https://docs.opensaas.sh)\n\n## What's inside?\n\nThe template itself is built on top of some very powerful tools and frameworks, including:\n\n- 🐝 [Wasp](https://wasp.sh) - a full-stack React, NodeJS, Prisma framework with superpowers\n- 🚀 [Astro](https://starlight.astro.build/) - Astro's lightweight \"Starlight\" template for documentation and blog\n- 💸 [Stripe](https://stripe.com), [Polar.sh](https://polar.sh), or [Lemon Squeezy](https://lemonsqueezy.com/) - for products and payments\n- 💅 [ShadCN UI](https://tailwindcss.com) - for components & styling (plus admin dashboard!)\n- 🤖 [AI-Ready](https://docs.opensaas.sh/) - Custom Plugins, Skills, & Rules for AI-assisted coding with Claude Code, Cursor, or your favorite AI-assisted coding tool\n- 📈 [Plausible](https://plausible.io) or [Google](https://analytics.google.com/) Analytics\n- 🤖 [OpenAI](https://openai.com) - OpenAI API w/ function calling example\n- 📦 [AWS S3](https://aws.amazon.com/s3/) - for file uploads\n- 📧 [SendGrid](https://sendgrid.com), [MailGun](https://mailgun.com), or SMTP - for email sending\n- 🧪 [Playwright](https://playwright.dev) - end-to-end tests with Playwright\n\nBecause we're using Wasp as the full-stack framework, we can leverage a lot of its features to build our SaaS in record time, including:\n\n- 🔐 [Full-stack Authentication](https://wasp.sh/docs/auth/overview) - Email verified + social Auth in a few lines of code.\n- ⛑ [End-to-end Type Safety](https://wasp.sh/docs/data-model/operations/overview) - Type your backend functions and get inferred types on the front-end automatically, without the need to install or configure any third-party libraries. Oh, and type-safe Links, too!\n- 🤖 [Jobs](https://wasp.sh/docs/advanced/jobs) - Run cron jobs in the background or set up queues simply by defining a function in the config file.\n- 🚀 [One-command Deploy](https://wasp.sh/docs/advanced/deployment/overview) - Easily deploy your DB, Server, & Client with one commaned to [Railway](https://railway.app) or [Fly.io](https://fly.io) via the CLI. Or deploy manually to any other hosting serivce of your choice.\n\nYou also get access to Wasp's diverse, helpful community if you get stuck or need help.\n\n- 🤝 [Wasp Discord](https://discord.gg/aCamt5wCpS)\n\n## Getting Started\n\n### Simple Instructions\n\nFirst, to install the latest version of [Wasp](https://wasp.sh/) on macOS, Linux, or Windows with WSL, run the following command:\n\n```bash\nnpm i -g @wasp.sh/wasp-cli\n```\n\nThen, create a new SaaS app with the following command:\n\n```bash\nwasp new -t saas\n```\n\nThis will create a **clean copy of the Open SaaS template** into a new directory, and you can start building your SaaS app right away!\n\n### Detailed Instructions\n\nFor everything you need to know about getting started and using this template, check out the [Open SaaS Docs](https://docs.opensaas.sh).\n\nWe've documented everything in great detail, including installation instructions, pulling updates to the template, guides for integrating services, SEO, deployment, and more. 🚀\n\n## Getting Help & Providing Feedback\n\nThere are two ways to get help or provide feedback (and we try to always respond quickly!):\n\n1. [Open an issue](https://github.com/wasp-lang/open-saas/issues)\n2. [Wasp Discord](https://discord.gg/aCamt5wCpS) -- please direct questions to the #🙋questions forum channel\n\n## Development Tools\n\n### Code Quality Tools\n\nThis repository includes comprehensive code quality tooling to help maintain code standards:\n\n#### Prettier (Code Formatting)\n\nPrettier is configured for automatic code formatting across all JavaScript, TypeScript, and other supported files.\n\n```bash\n# Check if files are formatted correctly\nnpm run prettier:check\n\n# Automatically format all files\nnpm run prettier:format\n```\n\n#### ESLint (Code Linting)\n\nESLint is configured with TypeScript and React support to catch potential bugs and enforce code quality standards.\n\n```bash\n# Run ESLint to check for issues\nnpm run lint\n\n# Automatically fix fixable issues\nnpm run lint:fix\n```\n\nThe ESLint configuration includes:\n\n- TypeScript support with `@typescript-eslint`\n- React and React Hooks linting\n- Sensible defaults tuned for a SaaS application\n- Automatic support for CommonJS (.cjs), ES Modules (.mjs), and TypeScript files\n\nBoth Prettier and ESLint checks are automatically run in CI/CD pipelines to ensure code quality.\n\nFor information about other development tools used to maintain derived projects (like opensaas.sh and template-test), see [tools/README.md](./tools/README.md).\n\n## Contributing\n\nNote that we've tried to get as many of the core features of a SaaS app into this template as possible, but there still might be some missing features or functionality.\n\nWe could always use some help tying up loose ends: contributions are welcome! Check out [CONTRIBUTING.md](/CONTRIBUTING.md) for more details.\n","default_branch":"main","files":674,"tree":[".editorconfig",".gitattributes",".github/FUNDING.yml",".github/pull_request_template.md",".github/workflows/automation-pr-close-stale.yaml",".github/workflows/automation-pr-label-external.yaml",".github/workflows/blog-deployment.yml",".github/workflows/check-opensaas-diffs.yml",".github/workflows/e2e-tests.yml",".github/workflows/lint.yml",".github/workflows/template-release.yml",".gitignore",".npmrc",".nvmrc",".prettierignore","CONTRIBUTING.md","LICENSE","README.md","eslint.config.js","opensaas-sh/.gitignore","opensaas-sh/README.md","opensaas-sh/app_diff/.claude/settings.json.diff","opensaas-sh/app_diff/.env.client.diff","opensaas-sh/app_diff/.env.vault.diff","opensaas-sh/app_diff/.gitignore.diff","opensaas-sh/app_diff/README.md.diff","opensaas-sh/app_diff/deletions","opensaas-sh/app_diff/fly-client.toml.diff","opensaas-sh/app_diff/fly-server.toml.diff","opensaas-sh/app_diff/main.wasp.ts.diff","opensaas-sh/app_diff/migrations/20231213174854_init/migration.sql.diff","opensaas-sh/app_diff/migrations/20240105224550_tasks/migration.sql.diff","opensaas-sh/app_diff/migrations/20240207164719_files/migration.sql.diff","opensaas-sh/app_diff/migrations/20240226123357_new_auth_structure/migration.sql.diff","opensaas-sh/app_diff/migrations/20240226130234_remove_old_auth_structure/migration.sql.diff","opensaas-sh/app_diff/migrations/20240226145340_remove_unique_email_username/migration.sql.diff","opensaas-sh/app_diff/migrations/20240605151848_remove_has_paid/migration.sql.diff","opensaas-sh/app_diff/migrations/20240702143707_update_user_entity/migration.sql.diff","opensaas-sh/app_diff/migrations/20240715142249_version_14/migration.sql.diff","opensaas-sh/app_diff/migrations/20241126132514_remove_checkout_session_id/migration.sql.diff","opensaas-sh/app_diff/migrations/20250220095333_remove_last_active_timestamp/migration.sql.diff","opensaas-sh/app_diff/migrations/20250710084843_remove_newsletter_fields/migration.sql.diff","opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff","opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff","opensaas-sh/app_diff/migrations/migration_lock.toml.diff","opensaas-sh/app_diff/package-lock.json.diff","opensaas-sh/app_diff/package.json.diff","opensaas-sh/app_diff/public/fonts/Satoshi-Black.woff2.copy","opensaas-sh/app_diff/public/fonts/Satoshi-Bold.woff2.copy","opensaas-sh/app_diff/public/fonts/Satoshi-Light.woff2.copy","opensaas-sh/app_diff/public/fonts/Satoshi-Medium.woff2.copy","opensaas-sh/app_diff/public/fonts/Satoshi-Regular.woff2.copy","opensaas-sh/app_diff/public/scripts/posthog.js.diff","opensaas-sh/app_diff/public/scripts/reo.js.diff","opensaas-sh/app_diff/schema.prisma.diff","opensaas-sh/app_diff/scripts/generate-llms-txt.mjs.diff","opensaas-sh/app_diff/src/admin/dashboards/analytics/RevenueAndProfitChart.tsx.diff","opensaas-sh/app_diff/src/admin/dashboards/users/UsersTable.tsx.diff","opensaas-sh/app_diff/src/analytics/providers/plausibleAnalyticsUtils.ts.diff","opensaas-sh/app_diff/src/auth/auth.wasp.ts.diff","opensaas-sh/app_diff/src/auth/email-and-pass/emails.ts.diff","opensaas-sh/app_diff/src/auth/userSignupFields.ts.diff","opensaas-sh/app_diff/src/client/App.tsx.diff","opensaas-sh/app_diff/src/client/Main.css.diff","opensaas-sh/app_diff/src/client/components/NavBar/Announcement.tsx.diff","opensaas-sh/app_diff/src/client/components/NavBar/NavBar.tsx.diff","opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff","opensaas-sh/app_diff/src/client/components/RepoInfo.tsx.diff","opensaas-sh/app_diff/src/client/components/cookie-consent/Config.ts.diff","opensaas-sh/app_diff/src/client/components/ui/button.tsx.diff","opensaas-sh/app_diff/src/client/components/ui/card.tsx.diff","opensaas-sh/app_diff/src/client/head.wasp.ts.diff","opensaas-sh/app_diff/src/client/utils.ts.diff","opensaas-sh/app_diff/src/env.ts.diff","opensaas-sh/app_diff/src/file-upload/file-upload.wasp.ts.diff","opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff","opensaas-sh/app_diff/src/file-upload/operations.ts.diff","opensaas-sh/app_diff/src/file-upload/workers.ts.diff","opensaas-sh/app_diff/src/landing-page/LandingPage.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Examples/AIReady.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Examples/Admin.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Examples/Auth.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Examples/Payments.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Examples/index.ts.diff","opensaas-sh/app_diff/src/landing-page/components/ExamplesCarousel.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/FeaturesGrid.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Hero/Hero.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Hero/Orbit.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Hero/index.ts.diff","opensaas-sh/app_diff/src/landing-page/components/HighlightedFeature.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Roadmap.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/RoadmapEpicCard.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/RoadmapStatusColumn.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/SchemaMarkup.tsx.diff","opensaas-sh/app_diff/src/landing-page/components/Testimonials.tsx.diff","opensaas-sh/app_diff/src/landing-page/contentSections.tsx.diff","opensaas-sh/app_diff/src/landing-page/landing-page.wasp.ts.diff","opensaas-sh/app_diff/src/landing-page/logos/PrismaLogo.tsx.diff","opensaas-sh/app_diff/src/landing-page/logos/ReactLogo.tsx.diff","opensaas-sh/app_diff/src/landing-page/logos/SalesforceLogo.tsx.diff","opensaas-sh/app_diff/src/landing-page/logos/ShadCNLogo.tsx.diff","opensaas-sh/app_diff/src/landing-page/operations.ts.diff","opensaas-sh/app_diff/src/payment/PricingPage.tsx.diff","opensaas-sh/app_diff/src/payment/payment.wasp.ts.diff","opensaas-sh/app_diff/src/payment/paymentProcessor.ts.diff","opensaas-sh/app_diff/src/payment/stripe/paymentProcessor.ts.diff","opensaas-sh/app_diff/src/payment/stripe/webhook.ts.diff","opensaas-sh/app_diff/src/payment/user.ts.diff","opensaas-sh/app_diff/src/server/emailSender.wasp.ts.diff","opensaas-sh/app_diff/src/server/scripts/dbSeeds.ts.diff","opensaas-sh/app_diff/src/shared/common.ts.diff","opensaas-sh/app_diff/src/user/operations.ts.diff","opensaas-sh/blog/.gitignore","opensaas-sh/blog/.npmrc","opensaas-sh/blog/.vscode/extensions.json","opensaas-sh/blog/.vscode/launch.json","opensaas-sh/blog/README.md","opensaas-sh/blog/astro.config.mjs","opensaas-sh/blog/package-lock.json","opensaas-sh/blog/package.json","opensaas-sh/blog/public/banner-images/2023-11-21-coverlettergpt.webp","opensaas-sh/blog/public/banner-images/2024-10-10-most-annoying-cookie-banner-contest.webp","opensaas-sh/blog/public/banner-images/2024-11-22-best-annoying-cookie-consent-banners.webp","opensaas-sh/blog/public/banner-images/2024-12-04-open-source-saas-boilerplate-vs-paid.webp","opensaas-sh/blog/public/banner-images/2024-12-10-turboreel-os-ai-video-generator-built-with-open-saas.webp","opensaas-sh/blog/public/banner-images/2024-12-16-my-gpt-wrapper.webp","opensaas-sh/blog/public/banner-images/2025-01-30-from-0-to-400-customers-saas-growth-hacks.webp","opensaas-sh/blog/public/banner-images/2025-02-26-incident-report-vulnerability-in-open-saas.webp","opensaas-sh/blog/public/banner-images/2025-02-27-meet-marko-saric-co-founder-of-privacy-friendly-plausible-analytics.webp","opensaas-sh/blog/public/banner-images/2025-03-12-going-from-an-idea-to-mvp-in-weeks-promptpandas-launches.webp","opensaas-sh/blog/public/banner-images/2025-05-07-you-should-still-launch-your-product-on-ph.webp","opensaas-sh/blog/public/banner-images/2025-05-21-saas-cost-marketing-breakdown.webp","opensaas-sh/blog/public/banner-images/2025-07-29-open-saas-version-2.webp","opensaas-sh/blog/public/banner-images/2025-11-19-gemini-3-open-saas.webp","opensaas-sh/blog/public/banner-images/2025-11-21-open-saas-public-roadmap.webp","opensaas-sh/blog/public/banner-images/2026-03-16-best-way-to-vibe-code-saas-2026.webp","opensaas-sh/blog/public/banner-images/2026-04-13-good-specs-right-tools-pm-built-emergency-saas-opensaas.webp","opensaas-sh/blog/public/banner-images/2026-05-29-seo-and-ai-discoverability-for-your-saas.webp","opensaas-sh/blog/public/banner-images/README.md","opensaas-sh/blog/public/banner-images/opensaas.webp","opensaas-sh/blog/public/chroni-dashboard.mp4","opensaas-sh/blog/public/favicon.svg","opensaas-sh/blog/public/scripts/posthog.js","opensaas-sh/blog/scripts/generate-llm-files.mjs","opensaas-sh/blog/src/assets/admin/admin-dashboard.png","opensaas-sh/blog/src/assets/ai/0.23/llm-txt-chat.webp","opensaas-sh/blog/src/assets/ai/llm-txt-chat.webp","opensaas-sh/blog/src/assets/ai/vibe-boi.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/boilerplate-licenses.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/community-contributions.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/dave-shipfast-tweet.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/free-updates-vs-not.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/marc1.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/marc2.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/opensaas.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/os-commits.png","opensaas-sh/blog/src/assets/boilerplate-starters/0.23/os-gh-stats.png","opensaas-sh/blog/src/assets/boilerplate-starters/boilerplate-licenses.png","opensaas-sh/blog/src/assets/boilerplate-starters/community-contributions.png","opensaas-sh/blog/src/assets/boilerplate-starters/dave-shipfast-tweet.png","opensaas-sh/blog/src/assets/boilerplate-starters/free-updates-vs-not.png","opensaas-sh/blog/src/assets/boilerplate-starters/marc1.png","opensaas-sh/blog/src/assets/boilerplate-starters/marc2.png","opensaas-sh/blog/src/assets/boilerplate-starters/opensaas.png","opensaas-sh/blog/src/assets/boilerplate-starters/os-commits.png","opensaas-sh/blog/src/assets/boilerplate-starters/os-gh-stats.png","opensaas-sh/blog/src/assets/chroni/0.23/Chroni-sign-up.png","opensaas-sh/blog/src/assets/chroni/Chroni-sign-up.png","opensaas-sh/blog/src/assets/chroni/chroni-dashboard.gif","opensaas-sh/blog/src/assets/chroni/chroni-hero.png","opensaas-sh/blog/src/assets/cookie-banner-hackathon/285-3umaGH-gangnam.mp4","opensaas-sh/blog/src/assets/cookie-banner-hackathon/286-wardbox.mp4","opensaas-sh/blog/src/assets/cookie-banner-hackathon/295-camblackwood.mp4","opensaas-sh/blog/src/assets/cookie-banner-hackathon/296-henryboyd.mp4","opensaas-sh/blog/src/assets/cookie-banner-hackathon/300-lezzz-sound.mp4","opensaas-sh/blog/src/assets/cookie-banner-hackathon/302-fecony-whereda.mp4","opensaas-sh/blog/src/assets/cookie-consent/annoying-cookie-banners.jpg","opensaas-sh/blog/src/assets/cookie-consent/cookiebanner.png","opensaas-sh/blog/src/assets/cookie-consent/enter.gif","opensaas-sh/blog/src/assets/cookie-consent/image.png","opensaas-sh/blog/src/assets/cookie-consent/keyboard.jpg","opensaas-sh/blog/src/assets/cookie-consent/preferences.png","opensaas-sh/blog/src/assets/cookie-consent/wheel.gif","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/coverlettergpt-indiehackers.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/coverlettergpt-may2025.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/coverlettergpt-ph-launch.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/coverlettergpt-plans.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/coverlettergpt-reddit.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/coverlettergpt.webp","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/jeep.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/mrr-graph.webp","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/mrr-revenue.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/openai-cost.png","opensaas-sh/blog/src/assets/cover-letter-gpt/0.23/openai-requests.png","opensaas-sh/blog/src/assets/cover-letter-gpt/coverlettergpt-indiehackers.png","opensaas-sh/blog/src/assets/cover-letter-gpt/coverlettergpt-may2025.png","opensaas-sh/blog/src/assets/cover-letter-gpt/coverlettergpt-ph-launch.png","opensaas-sh/blog/src/assets/cover-letter-gpt/coverlettergpt-plans.png","opensaas-sh/blog/src/assets/cover-letter-gpt/coverlettergpt-reddit.png","opensaas-sh/blog/src/assets/cover-letter-gpt/coverlettergpt.webp","opensaas-sh/blog/src/assets/cover-letter-gpt/demo-video.mp4","opensaas-sh/blog/src/assets/cover-letter-gpt/jeep.png","opensaas-sh/blog/src/assets/cover-letter-gpt/mrr-graph.webp","opensaas-sh/blog/src/assets/cover-letter-gpt/mrr-growth.png","opensaas-sh/blog/src/assets/cover-letter-gpt/mrr-revenue.png","opensaas-sh/blog/src/assets/cover-letter-gpt/openai-cost.png","opensaas-sh/blog/src/assets/cover-letter-gpt/openai-requests.png","opensaas-sh/blog/src/assets/file-uploads/cors.png","opensaas-sh/blog/src/assets/file-uploads/create-bucket.png","opensaas-sh/blog/src/assets/file-uploads/default-settings.png","opensaas-sh/blog/src/assets/file-uploads/find-s3.png","opensaas-sh/blog/src/assets/file-uploads/keys.png","opensaas-sh/blog/src/assets/file-uploads/new-bucket.png","opensaas-sh/blog/src/assets/file-uploads/permissions.png","opensaas-sh/blog/src/assets/file-uploads/username.png","opensaas-sh/blog/src/assets/gemini-3/0.23/chat.webp","opensaas-sh/blog/src/assets/gemini-3/0.23/landing-page.webp","opensaas-sh/blog/src/assets/gemini-3/chat.webp","opensaas-sh/blog/src/assets/gemini-3/landing-page.webp","opensaas-sh/blog/src/assets/lemon-squeezy/add-product.png","opensaas-sh/blog/src/assets/lemon-squeezy/add-variant.png","opensaas-sh/blog/src/assets/lemon-squeezy/store-id.png","opensaas-sh/blog/src/assets/lemon-squeezy/subscription-variant-ids.png","opensaas-sh/blog/src/assets/lemon-squeezy/variant-id.png","opensaas-sh/blog/src/assets/ngrok.png","opensaas-sh/blog/src/assets/open-saas-v2/0.23/open-saas-banner-light.png","opensaas-sh/blog/src/assets/open-saas-v2/0.23/playwright-ui.png","opensaas-sh/blog/src/assets/open-saas-v2/0.23/polar.webp","opensaas-sh/blog/src/assets/open-saas-v2/0.23/wait-theres-more.jpg","opensaas-sh/blog/src/assets/open-saas-v2/open-saas-banner-light.png","opensaas-sh/blog/src/assets/open-saas-v2/open-saas-redesign.webp","opensaas-sh/blog/src/assets/open-saas-v2/open-saas-v1.mp4","opensaas-sh/blog/src/assets/open-saas-v2/open-saas-v2.mp4","opensaas-sh/blog/src/assets/open-saas-v2/playwright-ui.png","opensaas-sh/blog/src/assets/open-saas-v2/polar.webp","opensaas-sh/blog/src/assets/open-saas-v2/wait-theres-more.jpg","opensaas-sh/blog/src/assets/ph/0.23/1.png","opensaas-sh/blog/src/assets/ph/0.23/10.png","opensaas-sh/blog/src/assets/ph/0.23/11.png","opensaas-sh/blog/src/assets/ph/0.23/12.png","opensaas-sh/blog/src/assets/ph/0.23/13.png","opensaas-sh/blog/src/assets/ph/0.23/14.png","opensaas-sh/blog/src/assets/ph/0.23/15.png","opensaas-sh/blog/src/assets/ph/0.23/16.png","opensaas-sh/blog/src/assets/ph/0.23/17.png","opensaas-sh/blog/src/assets/ph/0.23/18.png","opensaas-sh/blog/src/assets/ph/0.23/19.png","opensaas-sh/blog/src/assets/ph/0.23/2.png","opensaas-sh/blog/src/assets/ph/0.23/3.png","opensaas-sh/blog/src/assets/ph/0.23/4.png","opensaas-sh/blog/src/assets/ph/0.23/5.png","opensaas-sh/blog/src/assets/ph/0.23/6.gif","opensaas-sh/blog/src/assets/ph/0.23/7.png","opensaas-sh/blog/src/assets/ph/0.23/8.png","opensaas-sh/blog/src/assets/ph/0.23/9.png","opensaas-sh/blog/src/assets/ph/1.png","opensaas-sh/blog/src/assets/ph/10.png","opensaas-sh/blog/src/assets/ph/11.png","opensaas-sh/blog/src/assets/ph/12.png","opensaas-sh/blog/src/assets/ph/13.png","opensaas-sh/blog/src/assets/ph/14.png","opensaas-sh/blog/src/assets/ph/15.png","opensaas-sh/blog/src/assets/ph/16.png","opensaas-sh/blog/src/assets/ph/17.png","opensaas-sh/blog/src/assets/ph/18.png","opensaas-sh/blog/src/assets/ph/19.png","opensaas-sh/blog/src/assets/ph/2.png","opensaas-sh/blog/src/assets/ph/2025-03-27-you-should-still-launch-your-product-on-ph.webp","opensaas-sh/blog/src/assets/ph/3.png","opensaas-sh/blog/src/assets/ph/4.png","opensaas-sh/blog/src/assets/ph/5.png","opensaas-sh/blog/src/assets/ph/6.gif","opensaas-sh/blog/src/assets/ph/7.png","opensaas-sh/blog/src/assets/ph/8.png","opensaas-sh/blog/src/assets/ph/9.png","opensaas-sh/blog/src/assets/ph/compass.png","opensaas-sh/blog/src/assets/plausible/0.23/plausible-community.png","opensaas-sh/blog/src/assets/plausible/plausible-community.png","opensaas-sh/blog/src/assets/polar/user-table.png","opensaas-sh/blog/src/assets/polar/webhook-log.png","opensaas-sh/blog/src/assets/promptpanda/0.23/interface.png","opensaas-sh/blog/src/assets/promptpanda/0.23/list.png","opensaas-sh/blog/src/assets/promptpanda/0.23/meme1.jpg","opensaas-sh/blog/src/assets/promptpanda/0.23/meme2.jpg","opensaas-sh/blog/src/assets/promptpanda/0.23/ph1.png","opensaas-sh/blog/src/assets/promptpanda/0.23/ph2.png","opensaas-sh/blog/src/assets/promptpanda/interface.png","opensaas-sh/blog/src/assets/promptpanda/list.png","opensaas-sh/blog/src/assets/promptpanda/meme1.jpg","opensaas-sh/blog/src/assets/promptpanda/meme2.jpg","opensaas-sh/blog/src/assets/promptpanda/ph1.png","opensaas-sh/blog/src/assets/promptpanda/ph2.png","opensaas-sh/blog/src/assets/promptpanda/prompt-panda.png","opensaas-sh/blog/src/assets/promptpanda/prompt-panda.webp","opensaas-sh/blog/src/assets/ricardo-growth-hacks/0.23/article-generation.png","opensaas-sh/blog/src/assets/ricardo-growth-hacks/0.23/google-addons.png","opensaas-sh/blog/src/assets/ricardo-growth-hacks/0.23/meeting-reminders.png","opensaas-sh/blog/src/assets/ricardo-growth-hacks/article-generation.png","opensaas-sh/blog/src/assets/ricardo-growth-hacks/google-addons.png","opensaas-sh/blog/src/assets/ricardo-growth-hacks/meeting-reminders.png","opensaas-sh/blog/src/assets/roadmap/0.23/open-saas-ai-ready.webp","opensaas-sh/blog/src/assets/roadmap/0.23/open-saas-epic-detail.webp","opensaas-sh/blog/src/assets/roadmap/0.23/open-saas-epic.webp","opensaas-sh/blog/src/assets/roadmap/0.23/open-saas-roadmap.webp","opensaas-sh/blog/src/assets/roadmap/0.23/open-saas-used-by.webp","opensaas-sh/blog/src/assets/roadmap/0.23/subscribe-github.webp","opensaas-sh/blog/src/assets/roadmap/open-saas-ai-ready.webp","opensaas-sh/blog/src/assets/roadmap/open-saas-epic-detail.webp","opensaas-sh/blog/src/assets/roadmap/open-saas-epic.webp","opensaas-sh/blog/src/assets/roadmap/open-saas-roadmap.webp","opensaas-sh/blog/src/assets/roadmap/open-saas-used-by.webp","opensaas-sh/blog/src/assets/roadmap/subscribe-github.webp","opensaas-sh/blog/src/assets/seo/0.23/google-bot.png","opensaas-sh/blog/src/assets/seo/0.23/lighthouse-devtools.png","opensaas-sh/blog/src/assets/seo/google-bot.png","opensaas-sh/blog/src/assets/seo/lighthouse-devtools.png","opensaas-sh/blog/src/assets/stripe/api-keys.png","opensaas-sh/blog/src/assets/stripe/db-studio.png","opensaas-sh/blog/src/assets/stripe/listen-to-stripe-events.png","opensaas-sh/blog/src/assets/stripe/npm-version.png","opensaas-sh/blog/src/assets/stripe/price-ids.png","opensaas-sh/blog/src/assets/stripe/stripe-webhook-signing-secret.png","opensaas-sh/blog/src/assets/stripe/switch-plans.png","opensaas-sh/blog/src/assets/stripe/test-product.png","opensaas-sh/blog/src/assets/turboreel/0.23/landing.webp","opensaas-sh/blog/src/assets/turboreel/0.23/reddit-100-users.webp","opensaas-sh/blog/src/assets/turboreel/0.23/reddit-200-upvotes.webp","opensaas-sh/blog/src/assets/turboreel/landing.webp","opensaas-sh/blog/src/assets/turboreel/opensaas.mp4","opensaas-sh/blog/src/assets/turboreel/reddit-100-users.webp","opensaas-sh/blog/src/assets/turboreel/reddit-200-upvotes.webp","opensaas-sh/blog/src/assets/turboreel/studio-interface.mp4","opensaas-sh/blog/src/assets/wasp-logo.svg","opensaas-sh/blog/src/components/BlogPostSchema.astro","opensaas-sh/blog/src/components/CookieConsentBanner.astro","opensaas-sh/blog/src/components/CopyForLlmButton.astro","opensaas-sh/blog/src/components/FAQSection.astro","opensaas-sh/blog/src/components/HeadWithOGImage.astro","opensaas-sh/blog/src/components/Header.astro","opensaas-sh/blog/src/components/HiddenLLMHelper.astro","opensaas-sh/blog/src/components/MyRightNavBarItems.astro","opensaas-sh/blog/src/components/PageFrameWithCookieConsent.astro","opensaas-sh/blog/src/components/PageTitleWithBannerImage.astro","opensaas-sh/blog/src/components/SiteTitle.astro","opensaas-sh/blog/src/components/StarOpenSaaSCTA.astro","opensaas-sh/blog/src/components/Testimonial.astro","opensaas-sh/blog/src/components/Tweet.astro","opensaas-sh/blog/src/components/VideoPlayer.astro","opensaas-sh/blog/src/components/imagePaths.ts","opensaas-sh/blog/src/content.config.ts","opensaas-sh/blog/src/content/docs/0.23/general/admin-dashboard.mdx","opensaas-sh/blog/src/content/docs/0.23/general/privacy-policy.mdx","opensaas-sh/blog/src/content/docs/0.23/general/user-overview.md","opensaas-sh/blog/src/content/docs/0.23/guides/analytics.md","opensaas-sh/blog/src/content/docs/0.23/guides/authentication.md","opensaas-sh/blog/src/content/docs/0.23/guides/authorization.md","opensaas-sh/blog/src/content/docs/0.23/guides/cookie-consent.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/deploying.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/email-sending.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/file-uploading.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/payment-integrations/index.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/payment-integrations/lemon-squeezy.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/payment-integrations/polar.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/payment-integrations/stripe.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/seo-performance.mdx","opensaas-sh/blog/src/content/docs/0.23/guides/tests.md","opensaas-sh/blog/src/content/docs/0.23/guides/updating-opensaas.md","opensaas-sh/blog/src/content/docs/0.23/guides/vibe-coding.mdx","opensaas-sh/blog/src/content/docs/0.23/index.mdx","opensaas-sh/blog/src/content/docs/0.23/start/getting-started.mdx","opensaas-sh/blog/src/content/docs/0.23/start/guided-tour.md","opensaas-sh/blog/src/content/docs/blog/2023-11-21-coverlettergpt.mdx","opensaas-sh/blog/src/content/docs/blog/2024-10-10-most-annoying-cookie-banner-contest.mdx","opensaas-sh/blog/src/content/docs/blog/2024-11-22-best-annoying-cookie-consent-banners.mdx","opensaas-sh/blog/src/content/docs/blog/2024-12-04-open-source-saas-boilerplate-vs-paid.mdx","opensaas-sh/blog/src/content/docs/blog/2024-12-10-turboreel-os-ai-video-generator-built-with-open-saas.mdx","opensaas-sh/blog/src/content/docs/blog/2024-12-16-my-gpt-wrapper.mdx","opensaas-sh/blog/src/content/docs/blog/2025-01-30-from-0-to-400-customers-saas-growth-hacks.mdx","opensaas-sh/blog/src/content/docs/blog/2025-02-26-incident-report-vulnerability-in-open-saas.mdx","opensaas-sh/blog/src/content/docs/blog/2025-02-27-meet-marko-saric-co-founder-of-privacy-friendly-plausible-analytics.mdx","opensaas-sh/blog/src/content/docs/blog/2025-03-12-going-from-an-idea-to-mvp-in-weeks-promptpandas-launches.mdx","opensaas-sh/blog/src/content/docs/blog/2025-05-07-you-should-still-launch-your-product-on-ph.mdx","opensaas-sh/blog/src/content/docs/blog/2025-05-21-saas-cost-marketing-breakdown.mdx","opensaas-sh/blog/src/content/docs/blog/2025-07-29-open-saas-version-2.mdx","opensaas-sh/blog/src/content/docs/blog/2025-11-19-gemini-3-open-saas.mdx","opensaas-sh/blog/src/content/docs/blog/2025-11-21-open-saas-public-roadmap.mdx","opensaas-sh/blog/src/content/docs/blog/2026-03-16-best-way-to-vibe-code-saas-2026.mdx","opensaas-sh/blog/src/content/docs/blog/2026-04-13-good-specs-right-tools-pm-built-emergency-saas-opensaas.mdx","opensaas-sh/blog/src/content/docs/blog/2026-05-29-seo-and-ai-discoverability-for-your-saas.mdx","opensaas-sh/blog/src/content/docs/general/admin-dashboard.mdx","opensaas-sh/blog/src/content/docs/general/privacy-policy.mdx","opensaas-sh/blog/src/content/docs/general/user-overview.md","opensaas-sh/blog/src/content/docs/guides/analytics.md","opensaas-sh/blog/src/content/docs/guides/authentication.md","opensaas-sh/blog/src/content/docs/guides/authorization.md","opensaas-sh/blog/src/content/docs/guides/cookie-consent.mdx","opensaas-sh/blog/src/content/docs/guides/deploying.mdx","opensaas-sh/blog/src/content/docs/guides/email-sending.mdx","opensaas-sh/blog/src/content/docs/guides/file-uploading.mdx","opensaas-sh/blog/src/content/docs/guides/payment-integrations/index.mdx"],"storefront":"/r/wasp-lang","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/wasp-lang/open-saas/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."}