Skip to content

Commit 9591ff8

Browse files
Align site with v0.1.11: MySQL 8.4, phpMyAdmin 5.2.2, and XAMPP positioning.
Add stack versions, SEO landing pages, download panel, and analytics hook.
1 parent 065b757 commit 9591ff8

28 files changed

Lines changed: 436 additions & 68 deletions

‎.env.example‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
DEVSTACKBOX_ROOT=../DevStackBox
2-
GITHUB_REPO=DevStackBox/DevStackBox
1+
# Optional: Plausible analytics (https://plausible.io)
2+
NEXT_PUBLIC_PLAUSIBLE_DOMAIN=devstackbox.com

‎app/download/page.tsx‎

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ import {
1010
getLatestRelease,
1111
} from "@/lib/github";
1212

13+
import { StackIncludedPanel } from "@/components/marketing/stack-included-panel";
1314
import { buildPageMetadata } from "@/lib/page-metadata";
1415

1516
export const revalidate = 300;
1617

1718
export const metadata: Metadata = buildPageMetadata({
1819
path: "/download",
1920
title: "Download",
20-
description: "Download the latest DevStackBox installer for Windows.",
21+
description:
22+
"Download DevStackBox for Windows - free XAMPP alternative with PHP 8.3, MySQL 8.4 LTS, and PHP 8.5 on demand.",
2123
});
2224

2325
export default async function DownloadPage() {
@@ -79,6 +81,21 @@ export default async function DownloadPage() {
7981
</div>
8082
</section>
8183

84+
<section className="mt-12 rounded-2xl border border-border bg-card p-6 sm:p-8">
85+
<h2 className="text-2xl font-bold tracking-tight">Stack contents</h2>
86+
<div className="mt-6">
87+
<StackIncludedPanel />
88+
</div>
89+
<p className="mt-6 text-sm text-muted-foreground">
90+
Windows may show SmartScreen for an unknown publisher. Choose More info, then Run anyway, or verify the
91+
SHA-256 checksum above. See our{" "}
92+
<Link href="/security" className="link-primary">
93+
security page
94+
</Link>
95+
.
96+
</p>
97+
</section>
98+
8299
<div className="mt-12 grid gap-10 lg:grid-cols-[0.7fr_1.3fr]">
83100
<div>
84101
<section>

‎app/layout.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Metadata } from "next";
22
import { RootProvider } from "fumadocs-ui/provider/next";
3+
import { Analytics } from "@/components/analytics";
34
import { JsonLd } from "@/components/json-ld";
45
import { SiteFooter } from "@/components/site-footer";
56
import { SiteHeader } from "@/components/site-header";
@@ -16,7 +17,7 @@ export const metadata: Metadata = {
1617
...buildPageMetadata({
1718
path: "/",
1819
description:
19-
"Apache, PHP, MySQL and phpMyAdmin in one free, open-source desktop application for Windows. No telemetry. No cloud dependency.",
20+
"Free XAMPP alternative for Windows: PHP 8.3 in the installer, PHP up to 8.5 in the app, MySQL 8.4 LTS, Apache, phpMyAdmin. MIT licensed.",
2021
}),
2122
title: {
2223
default: "DevStackBox - Modern local PHP development for Windows",
@@ -40,6 +41,7 @@ export default function RootLayout({
4041
<html lang="en" suppressHydrationWarning className={cn("font-sans", geist.variable)}>
4142
<body className="flex min-h-screen flex-col bg-background font-sans text-foreground antialiased">
4243
<JsonLd data={websiteSchemas()} />
44+
<Analytics />
4345
<RootProvider>
4446
<SiteHeader />
4547
<main className="flex-1">{children}</main>

‎app/migrate-from-xampp/page.tsx‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type { Metadata } from "next";
2+
import { SeoLanding } from "@/components/marketing/seo-landing";
3+
import { buildPageMetadata } from "@/lib/page-metadata";
4+
5+
export const metadata: Metadata = buildPageMetadata({
6+
path: "/migrate-from-xampp",
7+
title: "Migrate from XAMPP",
8+
description: "Move projects from XAMPP to DevStackBox on Windows - copy htdocs and import databases with the in-app wizard.",
9+
ogImage: "/og/migrate-from-xampp.png",
10+
});
11+
12+
export default function MigrateFromXamppPage() {
13+
return (
14+
<SeoLanding
15+
title="Migrate from XAMPP to DevStackBox"
16+
intro="Install DevStackBox, then use Import from XAMPP in the app to copy your htdocs folder. Export MySQL from phpMyAdmin in XAMPP and import into DevStackBox if you need existing databases."
17+
bullets={[
18+
"Default XAMPP path: C:\\xampp",
19+
"Projects land in DevStackBox www folder",
20+
"PHP 8.3 works immediately; add 8.4 or 8.5 from PHP Versions",
21+
]}
22+
/>
23+
);
24+
}

‎app/page.tsx‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import { FeatureGrid } from "@/components/home/feature-grid";
88
import { FeatureShowcase } from "@/components/home/feature-showcase";
99
import { HeroSection } from "@/components/home/hero-section";
1010
import { LatestReleaseSection } from "@/components/home/latest-release-section";
11+
import { ComparisonTable } from "@/components/home/comparison-table";
12+
import { NomadSection } from "@/components/home/nomad-section";
1113
import { OpenSourceStrip } from "@/components/home/open-source-strip";
14+
import { ScreenshotGallery } from "@/components/screenshot-gallery";
15+
import { StackVersionsSection } from "@/components/home/stack-versions-section";
1216
import { getLatestRelease, getRepoStats } from "@/lib/github";
1317

1418
export const revalidate = 300;
@@ -23,11 +27,15 @@ export default async function HomePage() {
2327
<>
2428
<HeroSection release={release} />
2529
<OpenSourceStrip />
30+
<StackVersionsSection />
2631
<FeatureGrid />
32+
<ComparisonTable />
2733
<BuiltFor />
2834
<FeatureShowcase />
35+
<ScreenshotGallery />
2936
<LatestReleaseSection release={release} />
3037
<DocsPreview />
38+
<NomadSection />
3139
<CommunityCta stats={stats} />
3240
<BottomDownloadCta />
3341
</>

‎app/sitemap.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ export default function sitemap(): MetadataRoute.Sitemap {
1515
"/security",
1616
"/license",
1717
"/whats-new",
18+
"/xampp-alternative",
19+
"/migrate-from-xampp",
20+
"/vs/laragon",
21+
"/vs/herd",
1822
].map((path) => ({
1923
url: `${base}${path}`,
2024
lastModified: new Date(),

‎app/vs/herd/page.tsx‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Metadata } from "next";
2+
import { SeoLanding } from "@/components/marketing/seo-landing";
3+
import { stackVersions } from "@/content/stack-versions";
4+
import { buildPageMetadata } from "@/lib/page-metadata";
5+
6+
export const metadata: Metadata = buildPageMetadata({
7+
path: "/vs/herd",
8+
title: "DevStackBox vs Herd",
9+
description: "DevStackBox is a free, open-source Windows PHP stack. Compare with Herd for local Laravel development.",
10+
ogImage: "/og/vs-herd.png",
11+
});
12+
13+
export default function VsHerdPage() {
14+
return (
15+
<SeoLanding
16+
title="DevStackBox vs Herd"
17+
intro="Herd targets macOS and Windows with a paid model. DevStackBox is MIT-licensed for Windows with PHP 8.3 out of the box and MySQL 8.4 LTS."
18+
bullets={[
19+
"No account required",
20+
`PHP through ${stackVersions.php.latestSupportedBranch} via in-app download`,
21+
"Full control of Apache and MySQL configs",
22+
]}
23+
/>
24+
);
25+
}

‎app/vs/laragon/page.tsx‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Metadata } from "next";
2+
import { SeoLanding } from "@/components/marketing/seo-landing";
3+
import { stackVersions } from "@/content/stack-versions";
4+
import { buildPageMetadata } from "@/lib/page-metadata";
5+
6+
export const metadata: Metadata = buildPageMetadata({
7+
path: "/vs/laragon",
8+
title: "DevStackBox vs Laragon",
9+
description: "Compare DevStackBox and Laragon - free MIT stack vs paid Pro features on Windows.",
10+
ogImage: "/og/vs-laragon.png",
11+
});
12+
13+
export default function VsLaragonPage() {
14+
return (
15+
<SeoLanding
16+
title="DevStackBox vs Laragon"
17+
intro="Laragon Pro adds paid features. DevStackBox is fully open source (MIT) with PHP 8.3 bundled and PHP up to 8.5 in the app."
18+
bullets={[
19+
`DevStackBox: PHP ${stackVersions.php.bundledLabel} + optional ${stackVersions.php.onDemandBranches.join(", ")}`,
20+
"No subscription for unlimited local sites",
21+
"Same Apache + MySQL + phpMyAdmin workflow you expect",
22+
]}
23+
/>
24+
);
25+
}

‎app/xampp-alternative/page.tsx‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Metadata } from "next";
2+
import { SeoLanding } from "@/components/marketing/seo-landing";
3+
import { stackVersions } from "@/content/stack-versions";
4+
import { buildPageMetadata } from "@/lib/page-metadata";
5+
6+
export const metadata: Metadata = buildPageMetadata({
7+
path: "/xampp-alternative",
8+
title: "XAMPP alternative for Windows",
9+
description: `DevStackBox is a free XAMPP alternative with PHP ${stackVersions.php.bundledLabel} bundled and PHP ${stackVersions.php.latestSupportedBranch} on demand.`,
10+
ogImage: "/og/xampp-alternative.png",
11+
});
12+
13+
export default function XamppAlternativePage() {
14+
return (
15+
<SeoLanding
16+
title="XAMPP alternative for Windows"
17+
intro={`XAMPP for Windows ships PHP ${stackVersions.xamppWindowsPhp}. DevStackBox installs PHP ${stackVersions.php.bundledLabel} and lets you add PHP ${stackVersions.php.latestSupportedBranch} without a second stack.`}
18+
bullets={[
19+
"One MIT-licensed desktop app for Apache, MySQL, phpMyAdmin, and PHP",
20+
"Unlimited local sites - no paid tier",
21+
"Offline-friendly after install",
22+
]}
23+
/>
24+
);
25+
}

‎components/analytics.tsx‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Script from "next/script";
2+
3+
const domain = process.env.NEXT_PUBLIC_PLAUSIBLE_DOMAIN;
4+
5+
export function Analytics() {
6+
if (!domain) return null;
7+
return (
8+
<Script
9+
defer
10+
data-domain={domain}
11+
src="https://plausible.io/js/script.js"
12+
strategy="afterInteractive"
13+
/>
14+
);
15+
}

0 commit comments

Comments
 (0)