Skip to content

Commit a7ed397

Browse files
committed
SEO performance improvements
1 parent 2934251 commit a7ed397

40 files changed

Lines changed: 784 additions & 127 deletions

File tree

apps/marketing/public/sitemap.xml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,41 @@
490490
<changefreq>weekly</changefreq>
491491
<priority>0.7</priority>
492492
</url>
493+
<url>
494+
<loc>https://www.simple-table.com/frameworks</loc>
495+
<changefreq>weekly</changefreq>
496+
<priority>0.8</priority>
497+
</url>
498+
<url>
499+
<loc>https://www.simple-table.com/frameworks/angular</loc>
500+
<changefreq>weekly</changefreq>
501+
<priority>0.8</priority>
502+
</url>
503+
<url>
504+
<loc>https://www.simple-table.com/frameworks/react</loc>
505+
<changefreq>weekly</changefreq>
506+
<priority>0.8</priority>
507+
</url>
508+
<url>
509+
<loc>https://www.simple-table.com/frameworks/solid</loc>
510+
<changefreq>weekly</changefreq>
511+
<priority>0.8</priority>
512+
</url>
513+
<url>
514+
<loc>https://www.simple-table.com/frameworks/svelte</loc>
515+
<changefreq>weekly</changefreq>
516+
<priority>0.8</priority>
517+
</url>
518+
<url>
519+
<loc>https://www.simple-table.com/frameworks/vanilla</loc>
520+
<changefreq>weekly</changefreq>
521+
<priority>0.8</priority>
522+
</url>
523+
<url>
524+
<loc>https://www.simple-table.com/frameworks/vue</loc>
525+
<changefreq>weekly</changefreq>
526+
<priority>0.8</priority>
527+
</url>
493528
<url>
494529
<loc>https://www.simple-table.com/legal/eula</loc>
495530
<changefreq>monthly</changefreq>

apps/marketing/scripts/generate-sitemap.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ async function getNextJsRoutes() {
1414
const appDir = resolve(__dirname, "../src/app");
1515
const routes = await glob("**/page.{tsx,jsx,js,ts}", { cwd: appDir });
1616

17+
const frameworkHubRoutes = ["react", "vue", "angular", "svelte", "solid", "vanilla"].map(
18+
(id) => `frameworks/${id}`
19+
);
20+
1721
const processedRoutes = routes
1822
.map((route) => {
1923
// Convert file path to URL path
@@ -40,7 +44,8 @@ async function getNextJsRoutes() {
4044
processedRoutes.unshift(""); // Add root route at the beginning
4145
}
4246

43-
return processedRoutes;
47+
const merged = [...new Set([...processedRoutes, ...frameworkHubRoutes])];
48+
return merged;
4449
}
4550

4651
// Function to format XML with proper indentation
@@ -112,6 +117,9 @@ async function generateSitemap() {
112117
} else if (route.startsWith("docs/")) {
113118
routeConfig.priority = 0.8;
114119
routeConfig.changefreq = "weekly";
120+
} else if (route === "frameworks" || route.startsWith("frameworks/")) {
121+
routeConfig.priority = 0.75;
122+
routeConfig.changefreq = "weekly";
115123
} else if (route.startsWith("examples/")) {
116124
routeConfig.priority = 0.7;
117125
routeConfig.changefreq = "weekly";

apps/marketing/src/app/blog/ant-design-table-vs-simple-table/page.tsx

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { Metadata } from "next";
1717
import { SEO_STRINGS } from "@/constants/strings/seo";
1818
import BlogLayout from "@/components/BlogLayout";
1919
import CallToActionCard from "@/components/CallToActionCard";
20+
import { SIMPLE_TABLE_FRAMEWORKS_SHORT } from "@/constants/frameworkIntegrationHub";
2021
import { SIMPLE_TABLE_INFO, ANT_DESIGN_TABLE_INFO } from "@/constants/packageInfo";
2122
import Link from "next/link";
2223

@@ -72,6 +73,17 @@ export default function AntDesignTableVsSimpleTablePage() {
7273
is a standalone, lightweight grid. Which should you choose? This comparison breaks down
7374
bundle size, features, and when to use each.
7475
</p>
76+
<p className="text-base max-w-3xl mx-auto text-center text-gray-600 dark:text-gray-400 mt-4">
77+
<strong>Simple Table</strong> pairs a shared core with official adapters for{" "}
78+
{SIMPLE_TABLE_FRAMEWORKS_SHORT}.{" "}
79+
<Link
80+
href="/frameworks"
81+
className="text-blue-600 dark:text-blue-400 hover:underline font-semibold"
82+
>
83+
Framework setup hub
84+
</Link>
85+
.
86+
</p>
7587
</section>
7688

7789
{/* Main Content */}
@@ -96,10 +108,10 @@ export default function AntDesignTableVsSimpleTablePage() {
96108
</p>
97109

98110
<p className="mb-4 text-gray-700 dark:text-gray-300">
99-
<strong>Simple Table</strong> is a standalone, lightweight React data grid with no
100-
dependencies on design systems. It's built specifically for React, highly
101-
performant, and gives you complete control over styling while keeping your bundle
102-
small.
111+
<strong>Simple Table</strong> is a lightweight data grid with official adapters for{" "}
112+
{SIMPLE_TABLE_FRAMEWORKS_SHORT} and no dependency on Ant Design or other design
113+
systems. This article compares the React path (@simple-table/react); the same
114+
features are available on other stacks.
103115
</p>
104116

105117
<p className="mb-4 text-gray-700 dark:text-gray-300">
@@ -393,7 +405,7 @@ export default function AntDesignTableVsSimpleTablePage() {
393405
>
394406
row grouping
395407
</Link>
396-
. Simple Table is a standalone React library with more comprehensive features
408+
. Simple Table ships a multi-framework core with more comprehensive features
397409
built-in, at 1/4 the bundle size. See the{" "}
398410
<Link
399411
href="/comparisons/simple-table-vs-ant-design"
@@ -739,8 +751,9 @@ export default function AntDesignTableVsSimpleTablePage() {
739751
</div>
740752

741753
<p className="text-gray-700 dark:text-gray-300">
742-
For most standalone React apps (especially customer-facing or mobile-first), Simple
743-
Table's lightweight approach and zero dependencies make it the practical choice. For
754+
For most React apps without Ant Design (especially customer-facing or mobile-first),
755+
Simple Table's lightweight approach and zero UI-framework dependencies make it the
756+
practical choice. For
744757
Ant Design apps, stick with the ecosystem for consistency. Both libraries will serve
745758
you well within their intended contexts.
746759
</p>
@@ -752,7 +765,7 @@ export default function AntDesignTableVsSimpleTablePage() {
752765
{/* Call to Action */}
753766
<CallToActionCard
754767
title="Build lightweight, feature-rich tables without design system overhead"
755-
description="Simple Table delivers complete data grid functionality in just 24KB—3× smaller than Ant Design Table with dependencies. Get sorting, filtering, pagination, grouping, and more without compromising on features."
768+
description={`Simple Table delivers complete data grid functionality in just 24KB—3× smaller than Ant Design Table with dependencies. Get sorting, filtering, pagination, grouping, and more without compromising on features. Same core and adapters for ${SIMPLE_TABLE_FRAMEWORKS_SHORT}.`}
756769
primaryButton={{
757770
text: "View Documentation",
758771
href: "/docs/installation",

apps/marketing/src/app/blog/devextreme-grid-vs-simple-table/page.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Metadata } from "next";
1818
import { SEO_STRINGS } from "@/constants/strings/seo";
1919
import BlogLayout from "@/components/BlogLayout";
2020
import CallToActionCard from "@/components/CallToActionCard";
21+
import { SIMPLE_TABLE_FRAMEWORKS_SHORT } from "@/constants/frameworkIntegrationHub";
2122
import { SIMPLE_TABLE_INFO, DEVEXTREME_GRID_INFO } from "@/constants/packageInfo";
2223
import { SIMPLE_TABLE_ANNUAL_COST_RANGE, SIMPLE_TABLE_PRICING } from "@/constants/simpleTablePricing";
2324
import Link from "next/link";
@@ -70,6 +71,17 @@ export default function DevExtremeGridVsSimpleTablePage() {
7071
enterprise support. Simple Table is free (MIT) at 42KB with zero dependencies. This
7172
comparison helps you decide if premium features justify the annual cost.
7273
</p>
74+
<p className="text-base max-w-3xl mx-auto text-center text-gray-600 dark:text-gray-400 mt-4">
75+
<strong>Simple Table</strong> pairs a shared core with official adapters for{" "}
76+
{SIMPLE_TABLE_FRAMEWORKS_SHORT}.{" "}
77+
<Link
78+
href="/frameworks"
79+
className="text-blue-600 dark:text-blue-400 hover:underline font-semibold"
80+
>
81+
Framework setup hub
82+
</Link>
83+
.
84+
</p>
7385
</section>
7486

7587
{/* Main Content */}
@@ -965,7 +977,7 @@ export default function DevExtremeGridVsSimpleTablePage() {
965977
{/* Call to Action */}
966978
<CallToActionCard
967979
title="Get enterprise features without enterprise pricing"
968-
description={`Simple Table delivers virtualization, row grouping, column pinning, and more in ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}. FREE for zero-revenue companies, or $850/year for commercial use. Save $11,937+ over 3 years vs DevExtreme while keeping open-source freedom.`}
980+
description={`Simple Table delivers virtualization, row grouping, column pinning, and more in ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}. FREE for zero-revenue companies, or $850/year for commercial use. Save $11,937+ over 3 years vs DevExtreme while keeping open-source freedom. Same core and adapters for ${SIMPLE_TABLE_FRAMEWORKS_SHORT}.`}
969981
primaryButton={{
970982
text: "View Documentation",
971983
href: "/docs/installation",

apps/marketing/src/app/blog/ka-table-vs-simple-table/page.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Metadata } from "next";
1818
import { SEO_STRINGS } from "@/constants/strings/seo";
1919
import BlogLayout from "@/components/BlogLayout";
2020
import CallToActionCard from "@/components/CallToActionCard";
21+
import { SIMPLE_TABLE_FRAMEWORKS_SHORT } from "@/constants/frameworkIntegrationHub";
2122
import { SIMPLE_TABLE_INFO, KA_TABLE_INFO } from "@/constants/packageInfo";
2223
import Link from "next/link";
2324

@@ -74,6 +75,17 @@ export default function KaTableVsSimpleTablePage() {
7475
licensed and free—but they serve different developer philosophies. This comparison helps
7576
you choose the right fit.
7677
</p>
78+
<p className="text-base max-w-3xl mx-auto text-center text-gray-600 dark:text-gray-400 mt-4">
79+
<strong>Simple Table</strong> pairs a shared core with official adapters for{" "}
80+
{SIMPLE_TABLE_FRAMEWORKS_SHORT}.{" "}
81+
<Link
82+
href="/frameworks"
83+
className="text-blue-600 dark:text-blue-400 hover:underline font-semibold"
84+
>
85+
Framework setup hub
86+
</Link>
87+
.
88+
</p>
7789
</section>
7890

7991
{/* Main Content */}
@@ -907,8 +919,9 @@ export default function KaTableVsSimpleTablePage() {
907919

908920
<div className="prose prose-gray dark:prose-invert max-w-none">
909921
<p className="mb-4 text-gray-700 dark:text-gray-300">
910-
Both ka-table and Simple Table are excellent, MIT-licensed React table libraries
911-
with zero dependencies. The choice comes down to your{" "}
922+
Both ka-table and Simple Table are excellent, MIT-licensed options for React tables.
923+
Simple Table ships the same core with official adapters for{" "}
924+
{SIMPLE_TABLE_FRAMEWORKS_SHORT}. The choice comes down to your{" "}
912925
<strong>state management philosophy</strong>:
913926
</p>
914927

@@ -1006,7 +1019,7 @@ export default function KaTableVsSimpleTablePage() {
10061019
{/* Call to Action */}
10071020
<CallToActionCard
10081021
title="Build React tables without reducer boilerplate"
1009-
description={`Simple Table delivers complete data grid functionality in just ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}—30% smaller than ka-table. Get sorting, filtering, pagination, grouping, virtualization, and more with a pragmatic, batteries-included API. No Redux patterns required.`}
1022+
description={`Simple Table delivers complete data grid functionality in just ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}—30% smaller than ka-table. Get sorting, filtering, pagination, grouping, virtualization, and more with a pragmatic, batteries-included API. No Redux patterns required. Same core and adapters for ${SIMPLE_TABLE_FRAMEWORKS_SHORT}.`}
10101023
primaryButton={{
10111024
text: "View Documentation",
10121025
href: "/docs/installation",

apps/marketing/src/app/blog/kendoreact-grid-vs-simple-table/page.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { Metadata } from "next";
1919
import { SEO_STRINGS } from "@/constants/strings/seo";
2020
import BlogLayout from "@/components/BlogLayout";
2121
import CallToActionCard from "@/components/CallToActionCard";
22+
import { SIMPLE_TABLE_FRAMEWORKS_SHORT } from "@/constants/frameworkIntegrationHub";
2223
import { SIMPLE_TABLE_INFO, KENDOREACT_GRID_INFO } from "@/constants/packageInfo";
2324
import Link from "next/link";
2425

@@ -72,7 +73,18 @@ export default function KendoReactGridVsSimpleTablePage() {
7273
<p className="text-lg max-w-3xl mx-auto text-center text-gray-700 dark:text-gray-300">
7374
KendoReact Grid (by Progress/Telerik) costs $649-$1,199/year with 120+ premium components
7475
and a limited free tier. Simple Table is fully free (MIT) at 42KB with zero dependencies.
75-
This comparison helps you evaluate commercial licensing vs open-source freedom.
76+
This comparison helps you evaluate commercial licensing vs open-source freedom.
77+
</p>
78+
<p className="text-base max-w-3xl mx-auto text-center text-gray-600 dark:text-gray-400 mt-4">
79+
<strong>Simple Table</strong> pairs a shared core with official adapters for{" "}
80+
{SIMPLE_TABLE_FRAMEWORKS_SHORT}.{" "}
81+
<Link
82+
href="/frameworks"
83+
className="text-blue-600 dark:text-blue-400 hover:underline font-semibold"
84+
>
85+
Framework setup hub
86+
</Link>
87+
.
7688
</p>
7789
</section>
7890

@@ -784,7 +796,7 @@ export default function KendoReactGridVsSimpleTablePage() {
784796
{/* Call to Action */}
785797
<CallToActionCard
786798
title="Get enterprise features without the subscription cost"
787-
description={`Simple Table delivers virtualization, row grouping, column pinning, and more in ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}. FREE for zero-revenue companies, or $850/year for commercial use. Save $7,185-$15,435 over 3 years vs KendoReact while keeping full open-source freedom.`}
799+
description={`Simple Table delivers virtualization, row grouping, column pinning, and more in ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}. FREE for zero-revenue companies, or $850/year for commercial use. Save $7,185-$15,435 over 3 years vs KendoReact while keeping full open-source freedom. Same core and adapters for ${SIMPLE_TABLE_FRAMEWORKS_SHORT}.`}
788800
primaryButton={{
789801
text: "View Documentation",
790802
href: "/docs/installation",

apps/marketing/src/app/blog/mantine-datatable-vs-simple-table/page.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Metadata } from "next";
1818
import { SEO_STRINGS } from "@/constants/strings/seo";
1919
import BlogLayout from "@/components/BlogLayout";
2020
import CallToActionCard from "@/components/CallToActionCard";
21+
import { SIMPLE_TABLE_FRAMEWORKS_SHORT } from "@/constants/frameworkIntegrationHub";
2122
import { SIMPLE_TABLE_INFO, MANTINE_DATATABLE_INFO } from "@/constants/packageInfo";
2223
import Link from "next/link";
2324

@@ -74,6 +75,17 @@ export default function MantineDatatableVsSimpleTablePage() {
7475
Both are MIT licensed—but which fits your project? This comparison covers bundle size,
7576
Mantine dependencies, and real-world use cases.
7677
</p>
78+
<p className="text-base max-w-3xl mx-auto text-center text-gray-600 dark:text-gray-400 mt-4">
79+
<strong>Simple Table</strong> pairs a shared core with official adapters for{" "}
80+
{SIMPLE_TABLE_FRAMEWORKS_SHORT}.{" "}
81+
<Link
82+
href="/frameworks"
83+
className="text-blue-600 dark:text-blue-400 hover:underline font-semibold"
84+
>
85+
Framework setup hub
86+
</Link>
87+
.
88+
</p>
7789
</section>
7890

7991
{/* Main Content */}
@@ -98,9 +110,10 @@ export default function MantineDatatableVsSimpleTablePage() {
98110
</p>
99111

100112
<p className="mb-4 text-gray-700 dark:text-gray-300">
101-
<strong>Simple Table</strong> is a standalone React data grid with zero dependencies
102-
on any UI framework. It's framework-agnostic, lighter, and highly performant. You
103-
get all the features without committing to Mantine UI or any design system. If
113+
<strong>Simple Table</strong> has zero dependency on Mantine and official adapters
114+
for {SIMPLE_TABLE_FRAMEWORKS_SHORT}. This article compares the React story; the same
115+
product is available for Vue, Angular, and other stacks. You get advanced features
116+
without committing to Mantine UI. If
104117
you're evaluating alternatives,{" "}
105118
<Link
106119
href="/blog/ag-grid-alternatives-free-react-data-grids"
@@ -892,7 +905,7 @@ export default function MantineDatatableVsSimpleTablePage() {
892905
</div>
893906

894907
<p className="text-gray-700 dark:text-gray-300">
895-
For standalone React apps, mobile-first products, or teams avoiding design system
908+
For React apps without Mantine, mobile-first products, or teams avoiding design system
896909
lock-in, Simple Table's lightweight approach wins. For Mantine UI apps where
897910
consistency trumps bundle size, Mantine DataTable is excellent. Both are MIT
898911
licensed and production-ready—choose based on your constraints, not arbitrary
@@ -945,7 +958,7 @@ export default function MantineDatatableVsSimpleTablePage() {
945958
{/* Call to Action */}
946959
<CallToActionCard
947960
title="Build React tables without Mantine UI overhead"
948-
description={`Simple Table delivers complete data grid functionality in just ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}—4× smaller than Mantine DataTable with dependencies. Get sorting, filtering, pagination, grouping, virtualization, and more without locking into Mantine UI.`}
961+
description={`Simple Table delivers complete data grid functionality in just ${SIMPLE_TABLE_INFO.bundleSizeMinGzip}—4× smaller than Mantine DataTable with dependencies. Get sorting, filtering, pagination, grouping, virtualization, and more without locking into Mantine UI. Same core and adapters for ${SIMPLE_TABLE_FRAMEWORKS_SHORT}.`}
949962
primaryButton={{
950963
text: "View Documentation",
951964
href: "/docs/installation",

0 commit comments

Comments
 (0)