Skip to content

Feat/revamp pricing page#416

Closed
Aryan-205 wants to merge 4 commits into
apsinghdev:mainfrom
Aryan-205:feat/revamp-pricing-page
Closed

Feat/revamp pricing page#416
Aryan-205 wants to merge 4 commits into
apsinghdev:mainfrom
Aryan-205:feat/revamp-pricing-page

Conversation

@Aryan-205

@Aryan-205 Aryan-205 commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

closes #409
I have made the table pricing section and fixed the hero section a bit
Here are some attached screenshots to give you an idea
Screenshot 2026-06-23 at 10 59 47 PM
Screenshot 2026-06-23 at 11 00 02 PM
Screenshot 2026-06-23 at 11 00 12 PM

Summary by CodeRabbit

  • New Features

    • Plans now support configurable subscription durations
    • Added new 4-year plan option
  • Improvements

    • Subscription end dates now calculated based on plan duration rather than fixed yearly periods
    • Pricing page redesigned with new comparison layout and improved navigation

@vercel

vercel Bot commented Jun 23, 2026

Copy link
Copy Markdown

@Aryan-205 is attempting to deploy a commit to the AJEET PRATAP SINGH's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a durationMonths integer field to the Plan database model with a migration and default of 12. Seeds a new 4-year plan with durationMonths: 48. Updates createSubscription to compute subscription end dates from plan duration rather than a fixed year. Rebuilds the pricing page with a three-tier comparison table component system.

Changes

Plan Duration Field and Pricing Page Revamp

Layer / File(s) Summary
Plan schema and migration
apps/api/prisma/migrations/.../migration.sql, apps/api/prisma/schema.prisma
Adds durationMonths INTEGER NOT NULL DEFAULT 12 column to the Plan table via a new migration; schema file updated with whitespace alignment only.
Seed scripts updated for durationMonths
apps/api/prisma/seed.ts, apps/api/scripts/seed-pro-modules.ts
Updates Test Plan upsert to set durationMonths: 12, adds a new 4-year plan upsert with durationMonths: 48, and adds durationMonths: 12 to the Pro dev-seed plan creation.
Subscription end-date driven by plan duration
apps/api/src/services/payment.service.ts
Introduces resolvePlanDurationMonths helper to derive month count from plan.durationMonths or plan.interval. Replaces the fixed +1-year endDate in createSubscription with month-offset arithmetic that clamps to the last valid day of the target month.
Pricing page data model and layout
apps/web/src/app/(main)/(landing)/pricing/page.tsx (lines 3–282)
Updates imports for PrimaryButton, icons, and useRouter. Defines TierKey, FeatureValue, ComparisonFeature, PlanTier types, a comparisonFeatures table, and a tiers array with env-derived plan IDs. Rewrites the Pricing component to render a hero, PricingComparison, testimonials, and contact sections.
PricingComparison UI components and styling
apps/web/src/app/(main)/(landing)/pricing/page.tsx (lines 292–670), apps/web/src/components/ui/custom-button.tsx, apps/web/tailwind.config.ts
Adds PlanColumns, PlanColumn, FeatureCell, PlanColumnHeader, and PricingComparison components. Free-tier CTAs route to /dashboard/home; paid-tier CTAs wire PaymentFlow with plan ID and callback. Restyles testimonials borders to border-border/divide-border. Minor cosmetic fixes to PrimaryButton and Tailwind config.

Sequence Diagram

sequenceDiagram
  participant Browser
  participant PricingPage
  participant PricingComparison
  participant PlanColumnHeader
  participant PaymentFlow
  participant PaymentService

  Browser->>PricingPage: visit /pricing
  PricingPage->>PricingComparison: tiers + callbackUrl
  PricingComparison->>PlanColumnHeader: render per tier
  PlanColumnHeader-->>Browser: free CTA → /dashboard/home
  PlanColumnHeader->>PaymentFlow: paid CTA with planId + callbackUrl
  PaymentFlow->>PaymentService: initiate subscription
  PaymentService->>PaymentService: resolvePlanDurationMonths(plan)
  PaymentService-->>PaymentFlow: endDate (month-offset clamped)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • apsinghdev/opensox#250: Touches the same pricing/page.tsx and PaymentFlow integration with callbackUrl wiring.
  • apsinghdev/opensox#282: Modifies apps/api/prisma/seed.ts to introduce seed plans/subscriptions, directly overlapping with this PR's seed changes.
  • apsinghdev/opensox#309: Modifies the same pricing/page.tsx around PaymentFlow integration and plan/callback wiring.

Poem

🐇 Hop hop, a new plan appears,
Four years of learning, no fears!
durationMonths now drives the date,
No more fixed year — computed straight.
The pricing page shines, three tiers in a row,
A rabbit built this, now off I go! 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Feat/revamp pricing page' directly and concisely summarizes the main change—a revamp of the pricing page implementation as specified in issue #409.
Linked Issues check ✅ Passed All core requirements from #409 are implemented: hero section with 'OpenSOX Pro' title and jackedAJ image, three-column pricing table (Free/Pro/Pro Plus), subscription duration logic using durationMonths field, and testimonials section preservation.
Out of Scope Changes check ✅ Passed Changes are focused on pricing page revamp (section updates, subscription logic, seed scripts for test plans) and minor UI polish. No unrelated system changes detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch feat/revamp-pricing-page

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/src/app/(main)/(landing)/pricing/page.tsx

Oops! Something went wrong! :(

ESLint: 8.57.1

TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
| property 'configs' -> object with constructor 'Object'
| property 'flat' -> object with constructor 'Object'
| ...
| property 'plugins' -> object with constructor 'Object'
--- property 'react' closes the circle
Referenced from: /apps/web/.eslintrc.json
at JSON.stringify ()
at /node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2156:45
at Array.map ()
at ConfigValidator.formatErrors (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2147:23)
at ConfigValidator.validateConfigSchema (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2177:84)
at ConfigArrayFactory._normalizeConfigData (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3019:19)
at ConfigArrayFactory._loadConfigData (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2984:21)
at ConfigArrayFactory._loadExtendedShareableConfig (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3285:21)
at ConfigArrayFactory._loadExtends (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3156:25)
at ConfigArrayFactory._normalizeObjectConfigDataBody (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3095:25)

apps/web/src/components/ui/custom-button.tsx

Oops! Something went wrong! :(

ESLint: 8.57.1

TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
| property 'configs' -> object with constructor 'Object'
| property 'flat' -> object with constructor 'Object'
| ...
| property 'plugins' -> object with constructor 'Object'
--- property 'react' closes the circle
Referenced from: /apps/web/.eslintrc.json
at JSON.stringify ()
at /node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2156:45
at Array.map ()
at ConfigValidator.formatErrors (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2147:23)
at ConfigValidator.validateConfigSchema (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2177:84)
at ConfigArrayFactory._normalizeConfigData (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3019:19)
at ConfigArrayFactory._loadConfigData (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2984:21)
at ConfigArrayFactory._loadExtendedShareableConfig (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3285:21)
at ConfigArrayFactory._loadExtends (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3156:25)
at ConfigArrayFactory._normalizeObjectConfigDataBody (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3095:25)

apps/web/tailwind.config.ts

Oops! Something went wrong! :(

ESLint: 8.57.1

TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
| property 'configs' -> object with constructor 'Object'
| property 'flat' -> object with constructor 'Object'
| ...
| property 'plugins' -> object with constructor 'Object'
--- property 'react' closes the circle
Referenced from: /apps/web/.eslintrc.json
at JSON.stringify ()
at /node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2156:45
at Array.map ()
at ConfigValidator.formatErrors (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2147:23)
at ConfigValidator.validateConfigSchema (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2177:84)
at ConfigArrayFactory._normalizeConfigData (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3019:19)
at ConfigArrayFactory._loadConfigData (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2984:21)
at ConfigArrayFactory._loadExtendedShareableConfig (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3285:21)
at ConfigArrayFactory._loadExtends (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3156:25)
at ConfigArrayFactory._normalizeObjectConfigDataBody (/node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3095:25)


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@apps/api/prisma/migrations/20260621140000_add_plan_duration_months/migration.sql`:
- Line 2: The migration adds the durationMonths column with a default of 12
months, but this will incorrectly set all existing Plan rows to 12 months if
they previously had different durations. Add an UPDATE statement in the
migration to backfill the durationMonths column for existing Plan records with
their correct duration values based on legacy data or plan type logic before the
column is enforced as NOT NULL, ensuring that resolvePlanDurationMonths in
apps/api/src/services/payment.service.ts uses accurate historical durations for
existing plans rather than defaulting everything to 12 months.

In `@apps/api/prisma/seed.ts`:
- Around line 21-29: The upsert operations in the seed file only update the
durationMonths field, which means if these plan IDs already exist with stale
values, rerunning the seed won't normalize them and will leave inconsistent
state. Update both upsert calls (the one creating Test Plan with id
385b8215-d70f-473e-81c9-68a673c0d2fc-test and the other one mentioned in the
also applies to section) to include all fields in the update object that are
present in the create object: name, interval, durationMonths, price, and
currency. This ensures that each rerun of the seed will properly normalize any
existing records with the current values.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 195-200: Replace the inline style object containing maskImage,
WebkitMaskImage, and filter blur properties with equivalent Tailwind utility
classes. Additionally, replace all hardcoded hex color values found at lines
219, 227-229, and 279 with appropriate Tailwind color utilities or design tokens
from your design system. Remove the style prop entirely and convert all styling
to use Tailwind classes to maintain consistency with the design system
constraints for the pricing page component.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 20286501-d560-412b-875b-8f25a7f34c96

📥 Commits

Reviewing files that changed from the base of the PR and between a9e1e12 and ba39639.

⛔ Files ignored due to path filters (1)
  • apps/web/public/assets/jackedaj.jpg is excluded by !**/*.jpg
📒 Files selected for processing (8)
  • apps/api/prisma/migrations/20260621140000_add_plan_duration_months/migration.sql
  • apps/api/prisma/schema.prisma
  • apps/api/prisma/seed.ts
  • apps/api/scripts/seed-pro-modules.ts
  • apps/api/src/services/payment.service.ts
  • apps/web/src/app/(main)/(landing)/pricing/page.tsx
  • apps/web/src/components/ui/custom-button.tsx
  • apps/web/tailwind.config.ts

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Plan" ADD COLUMN "durationMonths" INTEGER NOT NULL DEFAULT 12;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

backfill existing plan durations before enforcing default 12

this migration assigns durationMonths = 12 to all existing Plan rows. since resolvePlanDurationMonths in apps/api/src/services/payment.service.ts now prefers durationMonths, any legacy non-yearly plans would be treated as 12-month subscriptions.

proposed migration shape
-ALTER TABLE "Plan" ADD COLUMN "durationMonths" INTEGER NOT NULL DEFAULT 12;
+ALTER TABLE "Plan" ADD COLUMN "durationMonths" INTEGER;
+
+UPDATE "Plan"
+SET "durationMonths" = CASE LOWER(COALESCE("interval", ''))
+  WHEN 'monthly' THEN 1
+  WHEN 'quarterly' THEN 3
+  WHEN 'yearly' THEN 12
+  WHEN 'annual' THEN 12
+  ELSE 12
+END
+WHERE "durationMonths" IS NULL;
+
+ALTER TABLE "Plan" ALTER COLUMN "durationMonths" SET NOT NULL;
+ALTER TABLE "Plan" ALTER COLUMN "durationMonths" SET DEFAULT 12;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
ALTER TABLE "Plan" ADD COLUMN "durationMonths" INTEGER NOT NULL DEFAULT 12;
ALTER TABLE "Plan" ADD COLUMN "durationMonths" INTEGER;
UPDATE "Plan"
SET "durationMonths" = CASE LOWER(COALESCE("interval", ''))
WHEN 'monthly' THEN 1
WHEN 'quarterly' THEN 3
WHEN 'yearly' THEN 12
WHEN 'annual' THEN 12
ELSE 12
END
WHERE "durationMonths" IS NULL;
ALTER TABLE "Plan" ALTER COLUMN "durationMonths" SET NOT NULL;
ALTER TABLE "Plan" ALTER COLUMN "durationMonths" SET DEFAULT 12;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/api/prisma/migrations/20260621140000_add_plan_duration_months/migration.sql`
at line 2, The migration adds the durationMonths column with a default of 12
months, but this will incorrectly set all existing Plan rows to 12 months if
they previously had different durations. Add an UPDATE statement in the
migration to backfill the durationMonths column for existing Plan records with
their correct duration values based on legacy data or plan type logic before the
column is enforced as NOT NULL, ensuring that resolvePlanDurationMonths in
apps/api/src/services/payment.service.ts uses accurate historical durations for
existing plans rather than defaulting everything to 12 months.

Comment thread apps/api/prisma/seed.ts
Comment on lines +21 to 29
update: { durationMonths: 12 },
create: {
id: '385b8215-d70f-473e-81c9-68a673c0d2fc-test',
name: 'Test Plan',
interval: 'yearly',
durationMonths: 12,
price: 100, // 1 rupee in paise
currency: 'INR',
},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

make upsert updates deterministic for seeded plan ids

both upsert calls only update durationMonths. if these ids already exist with stale price/currency/interval/name, reruns won’t normalize them, which can leave inconsistent seed state.

suggested update-branch normalization
   const testPlan = await prisma.plan.upsert({
     where: { id: '385b8215-d70f-473e-81c9-68a673c0d2fc-test' },
-    update: { durationMonths: 12 },
+    update: {
+      name: 'Test Plan',
+      interval: 'yearly',
+      durationMonths: 12,
+      price: 100,
+      currency: 'INR',
+    },
     create: {
       id: '385b8215-d70f-473e-81c9-68a673c0d2fc-test',
       name: 'Test Plan',
@@
   const fourYearPlan = await prisma.plan.upsert({
     where: { id: '385b8215-d70f-473e-81c9-68a673c0d2fc-4yr-test' },
-    update: { durationMonths: 48 },
+    update: {
+      name: 'Pro 4 Year (Test)',
+      interval: 'yearly',
+      durationMonths: 48,
+      price: 100,
+      currency: 'INR',
+    },
     create: {
       id: '385b8215-d70f-473e-81c9-68a673c0d2fc-4yr-test',
       name: 'Pro 4 Year (Test)',

Also applies to: 36-44

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/api/prisma/seed.ts` around lines 21 - 29, The upsert operations in the
seed file only update the durationMonths field, which means if these plan IDs
already exist with stale values, rerunning the seed won't normalize them and
will leave inconsistent state. Update both upsert calls (the one creating Test
Plan with id 385b8215-d70f-473e-81c9-68a673c0d2fc-test and the other one
mentioned in the also applies to section) to include all fields in the update
object that are present in the create object: name, interval, durationMonths,
price, and currency. This ensures that each rerun of the seed will properly
normalize any existing records with the current values.

Comment on lines +195 to +200
style={{
maskImage: "linear-gradient(to top, black 0%, transparent 85%)",
WebkitMaskImage:
"linear-gradient(to top, black 0%, transparent 85%)",
filter: "blur(10px)",
}}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

replace hardcoded colors and inline styles with design-token/tailwind utilities.

Line 195-Line 200 uses inline style, and Line 219, Line 227-Line 229, and Line 279 use hardcoded hex colors. this breaks the design-system constraints for the web app.

proposed fix
-          <div
-            aria-hidden
-            className="pointer-events-none absolute inset-x-0 bottom-0 -z-10 h-1/2 lg:h-2/5"
-            style={{
-              maskImage: "linear-gradient(to top, black 0%, transparent 85%)",
-              WebkitMaskImage:
-                "linear-gradient(to top, black 0%, transparent 85%)",
-              filter: "blur(10px)",
-            }}
-          >
+          <div
+            aria-hidden
+            className="pointer-events-none absolute inset-x-0 bottom-0 -z-10 h-1/2 lg:h-2/5 [mask-image:linear-gradient(to_top,black_0%,transparent_85%)] [webkit-mask-image:linear-gradient(to_top,black_0%,transparent_85%)] blur-[10px]"
+          >
@@
-                <span className="bg-gradient-to-b from-[`#a472ea`] to-[`#432ba0`] bg-clip-text text-transparent">
+                <span className="bg-gradient-to-b from-brand-purple-light to-brand-purple-dark bg-clip-text text-transparent">
@@
-                learning <span className="text-[`#a472ea`]">Open Source.</span>{" "}
-                <span className="text-[`#a472ea`]">Build in Public.</span>{" "}
-                <span className="text-[`#a472ea`]">First Principles.</span>
+                learning <span className="text-brand-purple-light">Open Source.</span>{" "}
+                <span className="text-brand-purple-light">Build in Public.</span>{" "}
+                <span className="text-brand-purple-light">First Principles.</span>
@@
-            className="hover:underline bg-gradient-to-b from-[`#a472ea`] via-[`#a472ea`]/80 to-[`#432ba0`] bg-clip-text text-transparent"
+            className="hover:underline bg-gradient-to-b from-brand-purple-light via-brand-purple-light/80 to-brand-purple-dark bg-clip-text text-transparent"

As per coding guidelines, always use Tailwind classes for styling and never use hardcoded hex values in apps/web/src/**/*.{tsx,ts,jsx,js}.

Also applies to: 219-229, 279-279

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx around lines 195 - 200,
Replace the inline style object containing maskImage, WebkitMaskImage, and
filter blur properties with equivalent Tailwind utility classes. Additionally,
replace all hardcoded hex color values found at lines 219, 227-229, and 279 with
appropriate Tailwind color utilities or design tokens from your design system.
Remove the style prop entirely and convert all styling to use Tailwind classes
to maintain consistency with the design system constraints for the pricing page
component.

Source: Coding guidelines

@apsinghdev

Copy link
Copy Markdown
Owner

covered in #414

thank you so much for ur contribution!

@apsinghdev apsinghdev closed this Jun 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[rvmp-5]: pricing page revamp

3 participants