Skip to content

Commit 74bdbfb

Browse files
authored
Merge pull request #78 from NodeByteHosting/development
feat: add new seo standards and more
2 parents e60ee12 + 9c17849 commit 74bdbfb

21 files changed

Lines changed: 571 additions & 28 deletions

File tree

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,11 @@ next-env.d.ts
3333
/app/generated/prisma
3434

3535
.vscode/
36+
37+
# PWA service worker build outputs
38+
/public/sw.js
39+
/public/sw.js.map
40+
/public/worker-*.js
41+
/public/worker-*.js.map
42+
/public/fallback-*.js
43+
/public/fallback-*.js.map

CHANGELOG.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,53 @@ All notable changes to the NodeByte Hosting website will be documented in this f
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [3.4.1] - 2026-03-16
9+
10+
### Added
11+
- **Progressive Web App (PWA) Support** - Full PWA implementation via `@serwist/next` + `serwist`
12+
- `app/sw.ts` service worker with precaching of all static pages/assets at build time
13+
- Runtime caching via Serwist `defaultCache` (covers API responses, images, fonts with best-practice strategies)
14+
- `skipWaiting` + `clientsClaim` for instant SW activation with no user-facing reload prompt
15+
- Navigation preload enabled for faster page loads under SW interception
16+
- `app/offline/page.tsx` — offline fallback page shown for uncached navigations; styled to match site with "Try Again" and "Go Home" actions
17+
- SW build disabled in development to avoid stale-cache issues during local dev
18+
- SW build artifacts (`public/sw.js`, `public/sw.js.map`, `public/worker-*.js`, `public/fallback-*.js`) added to `.gitignore`
19+
- **Web App Manifest** (`app/manifest.ts`) — file-based PWA manifest via Next.js metadata API
20+
- `display_override: ["standalone", "window-controls-overlay", "minimal-ui"]` for progressive desktop enhancement
21+
- `prefer_related_applications: false` so browsers prioritise the PWA install prompt
22+
- App shortcuts to `/games`, `/vps`, and `/dashboard`
23+
- **AI Crawler Policy** (`app/robots.ts`) — three-tier bot rules
24+
- AI training scrapers fully disallowed: `GPTBot`, `anthropic-ai`, `CCBot`, `Google-Extended`, `Meta-ExternalAgent`, `cohere-ai`, `Bytespider`, `Diffbot`, `PetalBot`, `omgilibot`, `AI2Bot`, `img2dataset`, `Scrapy`
25+
- AI browsing/answer agents allowed on public content: `ChatGPT-User`, `Claude-Web`, `PerplexityBot`, `Applebot`, `YouBot`
26+
- Default `*` rule unchanged — allow `/`, block private paths
27+
- **`llms.txt`** (`public/llms.txt`) — llmstxt.org standard for AI systems
28+
- Structured Markdown describing site sections, services, pricing currency (GBP), and scope (no domains / shared hosting / dedicated)
29+
- Direct links to all major product pages with concise descriptions for LLM context
30+
- **`sitemap.xml`** (`app/sitemap.ts`) — Next.js file-based sitemap with 12 static routes, correct priorities, and change frequencies
31+
- **`security.txt`** (`public/.well-known/security.txt`) — RFC 9116 security disclosure file
32+
- **JSON-LD Structured Data**`Organization` and `WebSite` schemas injected in root layout `<head>`
33+
- `Organization`: name, logo, description, contact point, `sameAs` (Twitter)
34+
- `WebSite`: includes `SearchAction` pointing to `/kb?q=` for Google Sitelinks Searchbox eligibility
35+
- **Security Headers** — applied site-wide via `next.config.mjs`
36+
- `X-Content-Type-Options: nosniff`
37+
- `X-Frame-Options: DENY`
38+
- `Referrer-Policy: strict-origin-when-cross-origin`
39+
- `Permissions-Policy` blocking camera, microphone, geolocation, and FLoC (`interest-cohort`)
40+
- `Strict-Transport-Security` with 2-year `max-age`, `includeSubDomains`, and `preload`
41+
- `X-DNS-Prefetch-Control: on`
42+
- **Page Metadata**`title`, `description`, `openGraph`, `twitter` added or improved across all public pages
43+
- `app/about/page.tsx`, `app/contact/page.tsx` (previously had no metadata), `app/auth/register/page.tsx`
44+
- `app/games/minecraft/page.tsx`, `app/games/rust/page.tsx`, `app/games/hytale/page.tsx`
45+
- `app/vps/amd/page.tsx`, `app/vps/intel/page.tsx`
46+
- **Canonical URL**`alternates: { canonical: "/" }` added to root layout metadata
47+
48+
### Changed
49+
- **`next.config.mjs`** — Serwist plugin wraps the config chain (`withSerwist(withNextIntl(nextConfig))`)
50+
- **`next.config.mjs`** — Fixed silent bug: `images` key was defined twice; redundant `remotePatterns` block removed (superseded by `unoptimized: true`)
51+
- **Root Layout Keywords** — expanded to include VPS-specific terms: `amd vps`, `intel vps`, `kvm vps`, `nvme ssd`, `root access vps`, `nodebyte`
52+
53+
---
54+
855
## [3.4.0] - 2026-03-16
956

1057
### Added

app/about/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Metadata } from "next"
33

44
export const metadata: Metadata = {
55
title: "About Us",
6-
description: "Learn about NodeByte Hosting - Fast, reliable, and affordable game server and VPS hosting built for communities and businesses.",
6+
description: "Learn about NodeByte Hosting who we are, what we stand for, and why thousands of players and developers trust us for game server and VPS hosting.",
77
}
88

99
export default function About() {

app/auth/register/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { getTranslations } from "next-intl/server"
33

44
export const metadata = {
55
title: "Register",
6-
description: "Create your NodeByte Hosting account to access your game servers and services.",
6+
description: "Create your NodeByte Hosting account to manage your game servers, VPS, and services all in one place.",
77
}
88

99
export default async function RegisterPage() {

app/contact/page.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
import type { Metadata } from "next"
12
import { Contact } from "@/packages/ui/components/Layouts/Contact/contact"
23

4+
export const metadata: Metadata = {
5+
title: "Contact Us",
6+
description: "Get in touch with the NodeByte Hosting team. We offer 24/7 support via Discord and our ticketing system for all game server and VPS hosting queries.",
7+
}
8+
39
export default function ContactPage() {
410
return <Contact />
511
}

app/games/hytale/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { LINKS } from "@/packages/core/constants/links"
99

1010
export const metadata: Metadata = {
1111
title: "Hytale Server Hosting",
12-
description: "Set out on an adventure built for both creation and play. Hytale blends the freedom of a sandbox with the momentum of an RPG: explore a procedurally generated world full of dungeons, secrets, and a variety of creatures, then shape it block by block.",
12+
description: "Be ready when Hytale launches. NodeByte Hosting will offer high-performance Hytale server hosting with mod support, custom maps, DDoS protection, and 24/7 support.",
1313
}
1414

1515
export default async function HytalePage() {

app/games/minecraft/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { getTranslations } from "next-intl/server"
88
import { LINKS } from "@/packages/core/constants/links"
99

1010
export const metadata: Metadata = {
11-
title: "Minecraft Servers",
12-
description: "High performance Minecraft server hosting with instant setup, DDoS protection, and 24/7 support.",
11+
title: "Minecraft Server Hosting",
12+
description: "High-performance Minecraft server hosting with instant setup, Java & Bedrock support, one-click Forge & Fabric mod loaders, and enterprise DDoS protection.",
1313
}
1414

1515
export default async function MinecraftPage() {

app/games/rust/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type { Metadata } from "next"
99

1010
export const metadata: Metadata = {
1111
title: "Rust Server Hosting",
12-
description: "High performance Rust server hosting with Oxide/uMod support, custom maps, and DDoS protection. Instant setup with 24/7 expert support.",
12+
description: "High-performance Rust server hosting with Oxide/uMod support, custom maps, wipe scheduling, RCON access, and enterprise DDoS protection.",
1313
}
1414

1515
export default async function RustPage() {

app/layout.tsx

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,24 @@ export const metadata: Metadata = {
2929
default: "NodeByte Hosting",
3030
template: "%s | NodeByte Hosting",
3131
},
32-
description: "Fast, reliable, scalable and secure hosting services for your gaming experience. Launch dedicated and managed game servers with instant setup, DDoS protection and low latency networking.",
32+
description: "Fast, reliable, and secure hosting for game servers and VPS. Instant deployment, enterprise DDoS protection, NVMe SSD storage, and 24/7 expert support.",
3333
metadataBase: new URL("https://nodebyte.host"),
34-
keywords: ["game server hosting", "minecraft hosting", "rust server hosting", "hytale hosting", "ark server hosting", "dedicated servers", "vps hosting", "ddos protection", "low latency gaming", "cloud servers"],
34+
keywords: ["game server hosting", "vps hosting", "minecraft hosting", "rust server hosting", "hytale hosting", "amd vps", "intel vps", "kvm vps", "dedicated servers", "ddos protection", "nvme ssd", "low latency gaming", "root access vps", "cloud servers", "nodebyte"],
3535
applicationName: "NodeByte Hosting",
36+
alternates: {
37+
canonical: "/",
38+
},
3639
openGraph: {
3740
siteName: "NodeByte Hosting",
38-
description: "Fast, reliable, scalable and secure hosting services for your gaming experience. Launch dedicated and managed game servers with instant setup, DDoS protection and low latency networking.",
41+
description: "Fast, reliable, and secure hosting for game servers and VPS. Instant deployment, enterprise DDoS protection, NVMe SSD storage, and 24/7 expert support.",
3942
images: ["/og.png"],
4043
creators: ["@CodeMeAPixel"],
4144
locale: "en-US",
4245
url: "https://nodebyte.host",
4346
},
4447
twitter: {
4548
title: "NodeByte Hosting",
46-
description: "Fast, reliable, scalable and secure hosting services for your gaming experience. Launch dedicated and managed game servers with instant setup, DDoS protection and low latency networking.",
49+
description: "Fast, reliable, and secure hosting for game servers and VPS. Instant deployment, enterprise DDoS protection, NVMe SSD storage, and 24/7 expert support.",
4750
images: ["/og.png"],
4851
creator: "@CodeMeAPixel",
4952
card: "summary_large_image",
@@ -104,6 +107,42 @@ export default async function RootLayout({
104107
<head>
105108
{/* Prevent browser translation extensions from modifying the page */}
106109
<meta name="google" content="notranslate" />
110+
<script
111+
type="application/ld+json"
112+
dangerouslySetInnerHTML={{
113+
__html: JSON.stringify([
114+
{
115+
"@context": "https://schema.org",
116+
"@type": "Organization",
117+
name: "NodeByte Hosting",
118+
url: "https://nodebyte.host",
119+
logo: "https://nodebyte.host/logo.png",
120+
description: "Fast, reliable, and secure hosting for game servers and VPS. Instant deployment, enterprise DDoS protection, NVMe SSD storage, and 24/7 expert support.",
121+
sameAs: ["https://twitter.com/CodeMeAPixel"],
122+
contactPoint: {
123+
"@type": "ContactPoint",
124+
contactType: "customer support",
125+
url: "https://nodebyte.host/contact",
126+
availableLanguage: "English",
127+
},
128+
},
129+
{
130+
"@context": "https://schema.org",
131+
"@type": "WebSite",
132+
name: "NodeByte Hosting",
133+
url: "https://nodebyte.host",
134+
potentialAction: {
135+
"@type": "SearchAction",
136+
target: {
137+
"@type": "EntryPoint",
138+
urlTemplate: "https://nodebyte.host/kb?q={search_term_string}",
139+
},
140+
"query-input": "required name=search_term_string",
141+
},
142+
},
143+
]),
144+
}}
145+
/>
107146
</head>
108147
<body className={`font-sans antialiased notranslate`}>
109148
<QueryClientProvider>

app/manifest.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import type { MetadataRoute } from "next"
2+
3+
export default function manifest(): MetadataRoute.Manifest {
4+
return {
5+
name: "NodeByte Hosting",
6+
short_name: "NodeByte",
7+
description: "Fast, reliable, and secure hosting for game servers and VPS. Instant deployment, enterprise DDoS protection, NVMe SSD storage, and 24/7 expert support.",
8+
start_url: "/",
9+
display: "standalone",
10+
background_color: "#0a0a0a",
11+
theme_color: "#0a0a0a",
12+
orientation: "portrait-primary",
13+
scope: "/",
14+
lang: "en-US",
15+
categories: ["hosting", "gaming", "infrastructure"],
16+
icons: [
17+
{
18+
src: "/favicon.ico",
19+
sizes: "any",
20+
type: "image/x-icon",
21+
},
22+
{
23+
src: "/logo.png",
24+
sizes: "512x512",
25+
type: "image/png",
26+
purpose: "any",
27+
},
28+
{
29+
src: "/logo.png",
30+
sizes: "512x512",
31+
type: "image/png",
32+
purpose: "maskable",
33+
},
34+
],
35+
display_override: ["standalone", "window-controls-overlay", "minimal-ui"],
36+
prefer_related_applications: false,
37+
shortcuts: [
38+
{
39+
name: "Game Servers",
40+
url: "/games",
41+
description: "Browse game server hosting plans",
42+
},
43+
{
44+
name: "VPS Hosting",
45+
url: "/vps",
46+
description: "Browse VPS hosting plans",
47+
},
48+
{
49+
name: "Dashboard",
50+
url: "/dashboard",
51+
description: "Manage your servers",
52+
},
53+
],
54+
}
55+
}

0 commit comments

Comments
 (0)