From bb5c04601953ed752076437d62222fdeba903d8e Mon Sep 17 00:00:00 2001 From: yash-pouranik Date: Fri, 18 Sep 2026 02:40:51 +0530 Subject: [PATCH 1/4] feat(landing): expand marketing site, add SEO metadata, trust badges, comparisons, and blog --- .gitignore | Bin 206 -> 265 bytes AGENTS.md | 8 +- apps/landing/astro.config.mjs | 9 +- apps/landing/package.json | 1 + apps/landing/public/badges/mintlify.svg | 1 + apps/landing/public/badges/mongodb.svg | 1 + apps/landing/public/robots.txt | 3 +- apps/landing/public/sitemap.xml | 9 - apps/landing/src/components/BlogCard.astro | 150 ++ .../src/components/ChangelogTimeline.astro | 347 +++ .../src/components/ComparisonTable.astro | 233 ++ apps/landing/src/components/Footer.astro | 32 +- apps/landing/src/components/Navbar.astro | 394 ++- apps/landing/src/components/PageHero.astro | 107 + apps/landing/src/content.config.ts | 17 + ...ng-started-with-urbackend-in-5-minutes.mdx | 109 + .../mongodb-baas-vs-traditional-backend.mdx | 74 + .../content/blog/why-we-built-urbackend.mdx | 60 + apps/landing/src/layouts/Base.astro | 33 +- apps/landing/src/layouts/ContentPage.astro | 355 +++ apps/landing/src/pages/blog/[...slug].astro | 27 + apps/landing/src/pages/blog/index.astro | 228 ++ apps/landing/src/pages/changelog.astro | 261 ++ apps/landing/src/pages/compare/firebase.astro | 267 ++ apps/landing/src/pages/compare/index.astro | 165 ++ apps/landing/src/pages/compare/supabase.astro | 245 ++ apps/landing/src/pages/developers.astro | 445 ++++ apps/landing/src/pages/features.astro | 542 ++++ apps/landing/src/pages/index.astro | 185 +- apps/landing/src/pages/mongodb.astro | 337 +++ apps/landing/src/pages/pricing.astro | 98 +- apps/landing/src/pages/use-cases.astro | 409 +++ apps/web-client/.env.example | 5 + apps/web-client/Dockerfile | 48 + apps/web-client/components.json | 20 + apps/web-client/next-env.d.ts | 5 + apps/web-client/next.config.mjs | 7 + apps/web-client/package.json | 37 + apps/web-client/postcss.config.mjs | 9 + apps/web-client/public/robots.txt | 2 + apps/web-client/src/app/globals.css | 60 + apps/web-client/src/app/layout.tsx | 70 + apps/web-client/src/app/page.tsx | 136 + apps/web-client/src/app/users/page.tsx | 272 ++ apps/web-client/src/components/ui/badge.tsx | 36 + apps/web-client/src/components/ui/button.tsx | 56 + apps/web-client/src/components/ui/card.tsx | 86 + apps/web-client/src/components/ui/dialog.tsx | 133 + apps/web-client/src/components/ui/input.tsx | 25 + apps/web-client/src/components/ui/table.tsx | 117 + apps/web-client/src/lib/utils.ts | 6 + apps/web-client/src/tests/button.test.tsx | 32 + apps/web-client/src/tests/card.test.tsx | 36 + apps/web-client/src/tests/setup.ts | 1 + apps/web-client/tailwind.config.ts | 77 + apps/web-client/tsconfig.json | 26 + apps/web-client/vitest.config.ts | 17 + .../src/components/Layout/Footer.jsx | 8 +- docker-compose.yml | 18 + mintlify/docs/docs.json | 23 +- package-lock.json | 2291 ++++++++++++++++- package.json | 7 +- 62 files changed, 8641 insertions(+), 177 deletions(-) create mode 100644 apps/landing/public/badges/mintlify.svg create mode 100644 apps/landing/public/badges/mongodb.svg delete mode 100644 apps/landing/public/sitemap.xml create mode 100644 apps/landing/src/components/BlogCard.astro create mode 100644 apps/landing/src/components/ChangelogTimeline.astro create mode 100644 apps/landing/src/components/ComparisonTable.astro create mode 100644 apps/landing/src/components/PageHero.astro create mode 100644 apps/landing/src/content.config.ts create mode 100644 apps/landing/src/content/blog/getting-started-with-urbackend-in-5-minutes.mdx create mode 100644 apps/landing/src/content/blog/mongodb-baas-vs-traditional-backend.mdx create mode 100644 apps/landing/src/content/blog/why-we-built-urbackend.mdx create mode 100644 apps/landing/src/layouts/ContentPage.astro create mode 100644 apps/landing/src/pages/blog/[...slug].astro create mode 100644 apps/landing/src/pages/blog/index.astro create mode 100644 apps/landing/src/pages/changelog.astro create mode 100644 apps/landing/src/pages/compare/firebase.astro create mode 100644 apps/landing/src/pages/compare/index.astro create mode 100644 apps/landing/src/pages/compare/supabase.astro create mode 100644 apps/landing/src/pages/developers.astro create mode 100644 apps/landing/src/pages/features.astro create mode 100644 apps/landing/src/pages/mongodb.astro create mode 100644 apps/landing/src/pages/use-cases.astro create mode 100644 apps/web-client/.env.example create mode 100644 apps/web-client/Dockerfile create mode 100644 apps/web-client/components.json create mode 100644 apps/web-client/next-env.d.ts create mode 100644 apps/web-client/next.config.mjs create mode 100644 apps/web-client/package.json create mode 100644 apps/web-client/postcss.config.mjs create mode 100644 apps/web-client/public/robots.txt create mode 100644 apps/web-client/src/app/globals.css create mode 100644 apps/web-client/src/app/layout.tsx create mode 100644 apps/web-client/src/app/page.tsx create mode 100644 apps/web-client/src/app/users/page.tsx create mode 100644 apps/web-client/src/components/ui/badge.tsx create mode 100644 apps/web-client/src/components/ui/button.tsx create mode 100644 apps/web-client/src/components/ui/card.tsx create mode 100644 apps/web-client/src/components/ui/dialog.tsx create mode 100644 apps/web-client/src/components/ui/input.tsx create mode 100644 apps/web-client/src/components/ui/table.tsx create mode 100644 apps/web-client/src/lib/utils.ts create mode 100644 apps/web-client/src/tests/button.test.tsx create mode 100644 apps/web-client/src/tests/card.test.tsx create mode 100644 apps/web-client/src/tests/setup.ts create mode 100644 apps/web-client/tailwind.config.ts create mode 100644 apps/web-client/tsconfig.json create mode 100644 apps/web-client/vitest.config.ts diff --git a/.gitignore b/.gitignore index 167348b263bd71773a8a310576379bdecc6d12e3..a3d9afaa5c9e669aa0bd986839af4324647d23f1 100644 GIT binary patch literal 265 zcmXX=F^bQMNxNtS=iee j3nyHLpVmg~xegN8YnWk0o-n$?(tA7Up&-QiueS38uY*~% literal 206 zcmXYr!3x755JWvM_z#8ll*8sH`T>O;OA(_>5^7vg6YAf0llC(6SZ0=q?8&U`w?L)W zFm6lm;z)7-DRvmx*`VQoNsjly43#r!aJ*Bt6CH(0YdU?)BMYQpBd%UUkMAWj3w-_= z4cE(~)tRFPV^VY0&18&}I!x{9*uMmCsi6zD6nUOnrBclql-Mro#18dpQAJhNE3H6% E0U4A#>Hq)$ diff --git a/AGENTS.md b/AGENTS.md index 0d0268cf8..392e1ecc1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,10 +22,10 @@ Workspace scripts are defined in [package.json](/package.json). ## Production Deployment Endpoints & Domains -- **Frontend Landing**: `https://urbackend.bitbros.in` -- **Dashboard App**: `https://app.urbackend.bitbros.in` -- **Dashboard API (Internal/Admin)**: `https://api.urbackend.bitbros.in` -- **Public API (SDK & User Auth)**: `https://api.ub.bitbros.in` +- **Frontend Landing**: `https://urbackend.in/` +- **Dashboard App**: `https://app.urbackend.in/` +- **Dashboard API (Internal/Admin)**: `https://platform-api.urbackend.in/` +- **Public API (SDK & User Auth)**: `https://api.urbackend.in/` ## Important project rules diff --git a/apps/landing/astro.config.mjs b/apps/landing/astro.config.mjs index 2154b1493..8b3e84236 100644 --- a/apps/landing/astro.config.mjs +++ b/apps/landing/astro.config.mjs @@ -1,17 +1,22 @@ // @ts-check import { defineConfig } from 'astro/config'; +import mdx from '@astrojs/mdx'; import react from '@astrojs/react'; import sitemap from '@astrojs/sitemap'; import vercel from '@astrojs/vercel'; // https://astro.build/config export default defineConfig({ - site: 'https://urbackend.bitbros.in', + site: 'https://urbackend.in', + redirects: { + '/sitemap.xml': '/sitemap-index.xml', + }, integrations: [ react(), + mdx(), sitemap({ - filter: (page) => page === 'https://urbackend.bitbros.in/', + filter: (page) => !page.includes('/404'), }), ], adapter: vercel() diff --git a/apps/landing/package.json b/apps/landing/package.json index d2acb0382..823c42bf7 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -12,6 +12,7 @@ "astro": "astro" }, "dependencies": { + "@astrojs/mdx": "^4.x", "@astrojs/react": "^4.x", "@astrojs/sitemap": "^3.x", "@astrojs/vercel": "^9.0.0", diff --git a/apps/landing/public/badges/mintlify.svg b/apps/landing/public/badges/mintlify.svg new file mode 100644 index 000000000..514234094 --- /dev/null +++ b/apps/landing/public/badges/mintlify.svg @@ -0,0 +1 @@ +Mintlify \ No newline at end of file diff --git a/apps/landing/public/badges/mongodb.svg b/apps/landing/public/badges/mongodb.svg new file mode 100644 index 000000000..6a5554e5a --- /dev/null +++ b/apps/landing/public/badges/mongodb.svg @@ -0,0 +1 @@ +MongoDB \ No newline at end of file diff --git a/apps/landing/public/robots.txt b/apps/landing/public/robots.txt index 3b9797192..acfe8b564 100644 --- a/apps/landing/public/robots.txt +++ b/apps/landing/public/robots.txt @@ -1,4 +1,5 @@ User-agent: * Allow: / -Sitemap: https://urbackend.bitbros.in/sitemap.xml +Sitemap: https://urbackend.in/sitemap-index.xml +Sitemap: https://urbackend.in/sitemap-0.xml diff --git a/apps/landing/public/sitemap.xml b/apps/landing/public/sitemap.xml deleted file mode 100644 index 4af579212..000000000 --- a/apps/landing/public/sitemap.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - https://urbackend.bitbros.in/ - 2026-09-17 - weekly - 1.0 - - diff --git a/apps/landing/src/components/BlogCard.astro b/apps/landing/src/components/BlogCard.astro new file mode 100644 index 000000000..ef5433bdb --- /dev/null +++ b/apps/landing/src/components/BlogCard.astro @@ -0,0 +1,150 @@ +--- +import { ArrowRight, Calendar, User } from 'lucide-react'; + +interface Props { + slug: string; + title: string; + description: string; + date: Date | string; + author: string; + category: string; + tags?: string[]; +} + +const { slug, title, description, date, author, category, tags = [] } = Astro.props; + +const formattedDate = new Date(date).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric' +}); +--- + + + + diff --git a/apps/landing/src/components/ChangelogTimeline.astro b/apps/landing/src/components/ChangelogTimeline.astro new file mode 100644 index 000000000..8a945b90e --- /dev/null +++ b/apps/landing/src/components/ChangelogTimeline.astro @@ -0,0 +1,347 @@ +--- +import { Tag, Sparkles, Wrench, Bug, ExternalLink } from 'lucide-react'; + +export interface ReleaseEntry { + title: string; + date: string; + version?: string; + summary?: string; + features?: string[]; + improvements?: string[]; + fixes?: string[]; + link?: string; +} + +interface Props { + releases: ReleaseEntry[]; +} + +const { releases } = Astro.props; +--- + +
+
+ + {releases.map((release) => ( +
+
+
+
+ +
+
+
+ {release.date} + {release.version && ( + + + {release.version} + + )} +
+

{release.title}

+ {release.summary &&

{release.summary}

} +
+ +
+ {release.features && release.features.length > 0 && ( +
+

+ New Features +

+
    + {release.features.map((item) => ( +
  • + + +
  • + ))} +
+
+ )} + + {release.improvements && release.improvements.length > 0 && ( +
+

+ Improvements +

+
    + {release.improvements.map((item) => ( +
  • + + +
  • + ))} +
+
+ )} + + {release.fixes && release.fixes.length > 0 && ( +
+

+ Bug Fixes +

+
    + {release.fixes.map((item) => ( +
  • + + +
  • + ))} +
+
+ )} +
+ + {release.link && ( + + )} +
+
+ ))} +
+ + diff --git a/apps/landing/src/components/ComparisonTable.astro b/apps/landing/src/components/ComparisonTable.astro new file mode 100644 index 000000000..ea63471e2 --- /dev/null +++ b/apps/landing/src/components/ComparisonTable.astro @@ -0,0 +1,233 @@ +--- +import { Check, X, Minus } from 'lucide-react'; + +interface ComparisonRow { + category: string; + feature: string; + urbackend: string | boolean; + competitor: string | boolean; + note?: string; +} + +interface Props { + competitor: string; + rows: ComparisonRow[]; +} + +const { competitor, rows } = Astro.props; + +// Group rows by category +const categories = Array.from(new Set(rows.map((r) => r.category))); +--- + +
+
+ + + + + + + + + + {categories.map((cat) => ( + <> + + + + {rows.filter((r) => r.category === cat).map((row) => ( + + + + + + ))} + + ))} + +
Feature +
+ urBackend + MongoDB Native +
+
+
+ {competitor} +
+
{cat}
+
{row.feature}
+ {row.note &&
{row.note}
} +
+ {typeof row.urbackend === 'boolean' ? ( + row.urbackend ? ( + + ) : ( + + ) + ) : ( + {row.urbackend} + )} + + {typeof row.competitor === 'boolean' ? ( + row.competitor ? ( + + ) : ( + + ) + ) : ( + {row.competitor} + )} +
+
+
+ + diff --git a/apps/landing/src/components/Footer.astro b/apps/landing/src/components/Footer.astro index d1669e31d..236474571 100644 --- a/apps/landing/src/components/Footer.astro +++ b/apps/landing/src/components/Footer.astro @@ -1,6 +1,6 @@ --- import { Github, ArrowRight } from 'lucide-react'; -const ADMIN_EMAIL = 'yashpouranik@gmail.com'; // Hardcoding since this is static site +const ADMIN_EMAIL = 'yash@urbackend.in'; // Official contact email ---