Skip to content

Commit a361ef3

Browse files
Trust SSOT for releases, marketing fixes, and OG previews.
Show installer SHA from GitHub digest; XAMPP hero; Laragon comparison; SmartScreen FAQ link; star button; restore per-page og images.
1 parent d602d28 commit a361ef3

27 files changed

Lines changed: 219 additions & 42 deletions

‎LAUNCH-MEDIA.md‎

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
1-
# Reviewed launch media - 18 October 2026
1+
# Reviewed launch media
22

3-
Fresh, unaltered captures from the installed internal v0.1.15 build:
3+
## Required retake (v0.1.12 public build)
44

5-
- `public/screenshots/app/services-preview.jpg`: Apache running, MySQL 8.4.11 stopped, PHP 8.3.31 ready.
6-
- `public/screenshots/app/projects-preview.jpg`: filtered a.test project, PHP 8.5, trusted HTTPS; personal folders excluded by filtering.
7-
- `public/screenshots/app/project-details-preview.jpg`: actual HTTP 200, trusted HTTPS and document-root settings.
8-
- `public/screenshots/app/project-php-preview.jpg`: installed PHP selection in project details.
5+
Replace these four homepage assets on **installed public v0.1.12** (sidebar About must show v0.1.12, not internal build numbers):
96

10-
The features shown are included in public v0.1.12, released on 18 October 2026. Screenshots retain the original internal v0.1.15 build label; this is capture provenance, not an unreleased-feature notice. No version labels, health results, or status badges were edited into captures.
7+
| File | Scene |
8+
|------|--------|
9+
| `public/screenshots/app/services-preview.jpg` | Services dashboard |
10+
| `public/screenshots/app/projects-preview.jpg` | Projects list with **my-shop.test** |
11+
| `public/screenshots/app/project-details-preview.jpg` | Project details: HTTP/HTTPS health, document root |
12+
| `public/screenshots/app/project-php-preview.jpg` | Per-site PHP dropdown |
1113

12-
Old GIFs remain held outside public because of private paths, outdated versions, or obscuring overlays. Automatic GIF discovery remains disabled. No video or founder photo is fabricated. The older approved PHP-download capture remains available in the screenshot gallery.
14+
**Sample project:** folder `D:\work\my-shop`, hostname `my-shop.test` (outside `www`; do not use `www/a` or `a.test`).
15+
16+
Do not edit version labels, health badges, or status into captures. Exclude private paths from frame.
17+
18+
## Open Graph (social preview)
19+
20+
Static images live under `public/og/` and are wired per page via `ogImage` in `buildPageMetadata`.
21+
22+
## Gallery
23+
24+
Additional PNGs under `public/screenshots/app/` are listed by `listGalleryImages()` for the homepage gallery.

‎app/download/page.tsx‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const metadata: Metadata = buildPageMetadata({
2020
title: "Download",
2121
description:
2222
"Download DevStackBox for Windows - free XAMPP alternative with PHP 8.3, MySQL 8.4 LTS, and PHP 8.5 on demand.",
23+
ogImage: "/og/download.png",
2324
});
2425

2526
export default async function DownloadPage() {
@@ -32,7 +33,11 @@ export default async function DownloadPage() {
3233
<section className="grid gap-10 rounded-3xl border border-border bg-gradient-to-br from-primary/10 via-card to-card p-6 sm:p-10 lg:grid-cols-[1.1fr_0.9fr] lg:items-center">
3334
<div>
3435
<p className="text-sm font-semibold uppercase tracking-[0.14em] text-primary">DevStackBox for Windows</p>
35-
<p className="mt-3 text-sm text-muted-foreground">v0.1.12 adds project workspaces, per-site PHP, and trusted local HTTPS. The button below installs the latest release from GitHub.</p>
36+
<p className="mt-3 text-sm text-muted-foreground">
37+
{release
38+
? `${release.tag_name} is the latest stable release from GitHub.`
39+
: "The button below installs the latest release from GitHub."}
40+
</p>
3641
<h1 className="mt-3 text-4xl font-bold tracking-tight sm:text-5xl">Download the local PHP stack.</h1>
3742
<p className="mt-4 max-w-xl text-lg leading-relaxed text-muted-foreground">
3843
Install Apache, PHP, MySQL, and phpMyAdmin in one desktop application. Your projects and settings stay on your PC.
@@ -89,7 +94,11 @@ export default async function DownloadPage() {
8994
<StackIncludedPanel />
9095
</div>
9196
<p className="mt-6 text-sm text-muted-foreground">
92-
The installer is not Windows Authenticode-signed, so SmartScreen may show an unknown publisher. Verify the file and its source before running it. See our{" "}
97+
The installer is not Windows Authenticode-signed, so SmartScreen may show an unknown publisher. Verify the file and its source before running it. See{" "}
98+
<Link href="/docs/faq#why-does-windows-smartscreen-warn-about-the-installer" className="link-primary">
99+
SmartScreen FAQ
100+
</Link>{" "}
101+
and our{" "}
93102
<Link href="/security" className="link-primary">
94103
security page
95104
</Link>

‎app/layout.tsx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { SiteFooter } from "@/components/site-footer";
66
import { SiteHeader } from "@/components/site-header";
77
import { siteConfig } from "@/content/homepage";
88
import { buildPageMetadata } from "@/lib/page-metadata";
9+
import { getLatestRelease } from "@/lib/github";
910
import { websiteSchemas } from "@/lib/structured-data";
1011
import "./globals.css";
1112
import { Geist } from "next/font/google";
@@ -26,15 +27,17 @@ export const metadata: Metadata = {
2627
metadataBase: new URL(siteConfig.url),
2728
};
2829

29-
export default function RootLayout({
30+
export default async function RootLayout({
3031
children,
3132
}: Readonly<{
3233
children: React.ReactNode;
3334
}>) {
35+
const release = await getLatestRelease();
36+
const softwareVersion = release?.tag_name?.replace(/^v/i, "");
3437
return (
3538
<html lang="en" suppressHydrationWarning className={cn("font-sans", geist.variable)}>
3639
<body className="flex min-h-screen flex-col bg-background font-sans text-foreground antialiased">
37-
<JsonLd data={websiteSchemas()} />
40+
<JsonLd data={websiteSchemas({ softwareVersion })} />
3841
<Analytics />
3942
<RootProvider>
4043
<a href="#main-content" className="skip-link">Skip to content</a>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Link from "next/link";
22
import { buildPageMetadata } from "@/lib/page-metadata";
3-
export const metadata = buildPageMetadata({path:"/migrate-from-xampp",title:"Migrate from XAMPP",description:"Move projects from XAMPP to DevStackBox on Windows. Copy htdocs with the in-app importer, then export and import databases separately."});
3+
export const metadata = buildPageMetadata({path:"/migrate-from-xampp",title:"Migrate from XAMPP",description:"Move projects from XAMPP to DevStackBox on Windows. Copy htdocs with the in-app importer, then export and import databases separately.",ogImage:"/og/migrate-from-xampp.png"});
44
const steps = [
55
["Back up your current projects", "Copy your XAMPP htdocs folder to a separate backup. Export each database as SQL from XAMPP phpMyAdmin while its database service is running. Keep the originals until you have tested everything."],
66
["Install DevStackBox", "Install the Windows app. Stop XAMPP Apache and its database service before starting the equivalent DevStackBox services, so ports 80 and 3306 are available."],

‎app/opengraph-image.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const contentType = "image/png";
55
export default function Image() {
66
return new ImageResponse(<div style={{display:"flex",flexDirection:"column",justifyContent:"space-between",width:"100%",height:"100%",background:"#111b26",color:"#ffffff",padding:"64px"}}>
77
<div style={{display:"flex",fontSize:32,color:"#8cafff"}}>DevStackBox / Free & open source</div>
8-
<div style={{display:"flex",flexDirection:"column",fontSize:76,fontWeight:700,letterSpacing:-3,lineHeight:1.1}}><span>Your PHP stack.</span><span style={{color:"#8cafff"}}>At home on Windows.</span></div>
8+
<div style={{display:"flex",flexDirection:"column",fontSize:58,fontWeight:700,letterSpacing:-2,lineHeight:1.12}}><span>The free XAMPP alternative</span><span style={{color:"#8cafff"}}>for Windows.</span></div>
99
<div style={{display:"flex",fontSize:26,color:"#c6d2e3"}}>Apache · PHP · MySQL · phpMyAdmin</div>
1010
</div>, size);
1111
}

‎app/page.tsx‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import { DocsPreview } from "@/components/home/docs-preview";
66
import { FeatureShowcase } from "@/components/home/feature-showcase";
77
import { HeroSection } from "@/components/home/hero-section";
88
import { ComparisonTable } from "@/components/home/comparison-table";
9+
import { LatestReleaseBand } from "@/components/home/latest-release-band";
910
import { StackVersionsSection } from "@/components/home/stack-versions-section";
1011
import { getLatestRelease, getRepoStats } from "@/lib/github";
1112
export const revalidate = 300;
1213
export default async function HomePage() {
1314
const [release, stats] = await Promise.all([getLatestRelease(), getRepoStats()]);
14-
return <><HeroSection release={release} /><StackVersionsSection /><section className="mx-auto max-w-6xl px-5 py-12 sm:px-6"><div className="rounded-3xl border border-border bg-muted/30 p-6 sm:p-10"><p className="text-sm font-semibold text-primary">New in v0.1.12</p><h2 className="mt-3 text-3xl font-bold tracking-tight">Each project, with its own PHP and HTTPS.</h2><p className="mt-4 max-w-3xl leading-7 text-muted-foreground">Connect an existing folder, give it a .test hostname, and manage its document root, installed PHP runtime, and trusted local certificate from one details page.</p><div className="mt-7 grid gap-6 md:grid-cols-3"><div><h3 className="font-semibold">Keep existing projects</h3><p className="mt-2 text-sm leading-6 text-muted-foreground">Use folders outside www. Connecting a site keeps your files in place.</p></div><div><h3 className="font-semibold">Choose installed PHP</h3><p className="mt-2 text-sm leading-6 text-muted-foreground">Download in PHP Versions, then pin a version per website or inherit the default.</p></div><div><h3 className="font-semibold">Check HTTPS and site health</h3><p className="mt-2 text-sm leading-6 text-muted-foreground">Local certificates use mkcert. Windows trust approval is required; website errors are checked separately.</p></div></div><Link href="/docs/getting-started/projects" className="mt-7 inline-flex min-h-11 items-center font-semibold text-primary underline underline-offset-4">Explore the project workflow</Link></div></section><FeatureShowcase /><ScreenshotGallery /><DocsPreview /><ComparisonTable /><CommunityCta stats={stats} /><BottomDownloadCta /></>;
15+
return <><HeroSection release={release} stats={stats} /><StackVersionsSection /><LatestReleaseBand release={release} /><FeatureShowcase /><ScreenshotGallery /><DocsPreview /><ComparisonTable /><CommunityCta stats={stats} /><BottomDownloadCta /></>;
1516
}

‎app/releases/page.tsx‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Metadata } from "next";
22
import Link from "next/link";
33
import { ReleaseBody } from "@/components/release-body";
4+
import { ReleaseChecksum } from "@/components/release-checksum";
45
import {
56
findWindowsInstaller,
67
formatReleaseDate,
@@ -45,7 +46,22 @@ export default async function ReleasesPage() {
4546
</time>
4647
</div>
4748
<p className="mt-1 text-sm text-muted-foreground">{r.tag_name} · {r.prerelease ? "Pre-release" : "Stable"}</p>
48-
{r.body ? <details className="mt-5"><summary className="py-2 text-sm font-medium text-primary">Read release notes</summary><ReleaseBody body={r.body} className="mt-3" /></details> : null}
49+
{installer ? (
50+
<ReleaseChecksum
51+
release={r}
52+
className="mt-5 rounded-xl border border-border bg-muted/20 p-4"
53+
/>
54+
) : null}
55+
{r.body ? (
56+
<details className="mt-5">
57+
<summary className="py-2 text-sm font-medium text-primary">Read release notes</summary>
58+
<ReleaseBody
59+
body={r.body}
60+
className="mt-3"
61+
omitInstallerSha={Boolean(installer)}
62+
/>
63+
</details>
64+
) : null}
4965
<div className="mt-5 flex flex-wrap gap-4 text-sm">
5066
<a
5167
href={r.html_url}

‎app/vs/herd/page.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ComparisonPage } from "@/components/marketing/comparison-page";
22
import { buildPageMetadata } from "@/lib/page-metadata";
3-
export const metadata = buildPageMetadata({path:"/vs/herd",title:"DevStackBox vs Herd",description:"Compare DevStackBox's Apache and MySQL Windows stack with Herd's free PHP environment and optional Pro features."});
3+
export const metadata = buildPageMetadata({path:"/vs/herd",title:"DevStackBox vs Herd",description:"Compare DevStackBox's Apache and MySQL Windows stack with Herd's free PHP environment and optional Pro features.",ogImage:"/og/vs-herd.png"});
44
export default function Page() { return <ComparisonPage title="DevStackBox vs Herd" competitor="Herd" intro="Herd has a free PHP development environment and optional paid Pro capabilities. DevStackBox bundles an Apache and MySQL stack in a free, MIT-licensed Windows app." rows={[
55
["Price","Free (MIT)","Free basic edition; optional paid Pro"], ["Platform","Windows 10/11 x64","Windows and macOS"], ["Web server","Apache","nginx"], ["Database workflow","MySQL 8.4 LTS and phpMyAdmin included","Managed database services in Pro"], ["Focus","Local PHP projects, Apache configuration, and XAMPP migration","Laravel and PHP development with integrated tooling"],
66
]} tradeoff="DevStackBox is a natural fit if you want Apache, bundled MySQL, and familiar phpMyAdmin workflows on Windows. Herd is worth considering for its Laravel-focused environment, nginx, and integrated developer tooling. Its basic edition is free; compare the particular Pro features you need." source="https://herd.laravel.com/windows" sourceLabel="Official Herd for Windows" />; }

‎app/vs/laragon/page.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ComparisonPage } from "@/components/marketing/comparison-page";
22
import { buildPageMetadata } from "@/lib/page-metadata";
33
import { laragonPrice } from "@/content/comparisons";
4-
export const metadata = buildPageMetadata({path:"/vs/laragon",title:"DevStackBox vs Laragon",description:"Compare two Windows development environments: DevStackBox's MIT-licensed PHP stack and Laragon's non-commercial and commercial licensing."});
4+
export const metadata = buildPageMetadata({path:"/vs/laragon",title:"DevStackBox vs Laragon",description:"Compare two Windows development environments: DevStackBox's MIT-licensed PHP stack and Laragon's non-commercial and commercial licensing.",ogImage:"/og/vs-laragon.png"});
55
export default function Page() { return <ComparisonPage title="DevStackBox vs Laragon" competitor="Laragon" intro="Two ways to build locally on Windows. DevStackBox focuses on an open-source PHP stack; Laragon offers a broader environment for multiple languages and services." rows={[
66
["Price", "Free (MIT)", laragonPrice], ["Local sites","Unlimited","Unlimited"], ["Platform","Windows 10/11 x64","Windows"], ["Stack","Apache, PHP, MySQL 8.4 LTS, phpMyAdmin","Configurable services and multiple runtimes"], ["PHP versions","PHP 8.3 bundled; additional branches in the app","Multiple versions supported"],
77
]} tradeoff="Choose DevStackBox for an MIT-licensed Apache and MySQL workflow with no commercial license purchase. Consider Laragon if its broader runtime support, portability, and established workflows suit your projects. Check the licensing terms for your use." source="https://laragon.org/pricing" sourceLabel="Official Laragon pricing" />; }

‎app/whats-new/page.tsx‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ReleaseBody } from "@/components/release-body";
2+
import { ReleaseChecksum } from "@/components/release-checksum";
23
import type { Metadata } from "next";
34
import Link from "next/link";
45
import { Download, ExternalLink } from "lucide-react";
@@ -53,7 +54,20 @@ export default async function WhatsNewPage() {
5354
</div>
5455
</header>
5556

56-
<section className="mt-10"><h2 className="mb-5 text-2xl font-semibold">Release highlights</h2>{release.body ? <ReleaseBody body={release.body} /> : <p className="text-muted-foreground">Read the full release on GitHub for details.</p>}</section>
57+
<section className="mt-10">
58+
<h2 className="mb-5 text-2xl font-semibold">Release highlights</h2>
59+
{installer ? (
60+
<ReleaseChecksum
61+
release={release}
62+
className="mb-6 rounded-xl border border-border bg-muted/30 p-4"
63+
/>
64+
) : null}
65+
{release.body ? (
66+
<ReleaseBody body={release.body} omitInstallerSha={Boolean(installer)} />
67+
) : (
68+
<p className="text-muted-foreground">Read the full release on GitHub for details.</p>
69+
)}
70+
</section>
5771

5872
<nav aria-label="Release links" className="mt-12 flex flex-wrap gap-4 border-t border-border pt-8 text-sm">
5973
<Link href="/changelog" className="text-primary hover:underline">

0 commit comments

Comments
 (0)