Skip to content

Commit a3d8bec

Browse files
cj-vanaclaude
andcommitted
feat: Add Meadowood Observer and rename to Analyzers
- Add Meadowood Observer alongside M3SHGHOST Observer - Rename "Observer" to "Analyzers" throughout the site - Update observer page hero with two CTA buttons for each analyzer - Update navigation, footer, start page, and about page links - Update metadata and descriptions for plural terminology 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 0ea8af2 commit a3d8bec

File tree

5 files changed

+90
-77
lines changed

5 files changed

+90
-77
lines changed

src/app/about/page.tsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -310,11 +310,9 @@ export default function AboutPage() {
310310
Resources & Links
311311
</h2>
312312
<div className="grid md:grid-cols-3 gap-6">
313-
{/* Observer Link */}
314-
<a
315-
href="https://analyzer.letsmesh.net/node/4D0CC1003DBF678DF420907F9ACD77BD71D9E4C34300F72660F6BA6A2656A868"
316-
target="_blank"
317-
rel="noopener noreferrer"
313+
{/* Analyzers Link */}
314+
<Link
315+
href="/observer"
318316
className="card-mesh p-6 hover:border-mesh transition-colors group"
319317
>
320318
<div className="flex items-start gap-4">
@@ -325,20 +323,20 @@ export default function AboutPage() {
325323
</div>
326324
<div>
327325
<h3 className="text-lg font-bold mb-1 text-foreground group-hover:text-mesh transition-colors">
328-
Denver Observer
326+
Denver Analyzers
329327
</h3>
330328
<p className="text-sm text-foreground-muted mb-2">
331329
View real-time network statistics and node activity for the Denver area.
332330
</p>
333331
<span className="text-mesh text-sm inline-flex items-center gap-1">
334-
View Observer
332+
View Analyzers
335333
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
336-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
334+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
337335
</svg>
338336
</span>
339337
</div>
340338
</div>
341-
</a>
339+
</Link>
342340

343341
{/* LetsMesh Link */}
344342
<a

src/app/observer/page.tsx

Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import JsonLd from '@/components/JsonLd';
55
import { generateBreadcrumbSchema } from '@/lib/schemas/breadcrumb';
66

77
export const metadata: Metadata = {
8-
title: 'M3SHGHOST OBSERVER',
8+
title: 'Denver MeshCore Analyzers',
99
description:
10-
'Live network monitoring for Denver MeshCore. The M3SHGHOST OBSERVER tracks mesh network status, node activity, signal strength, and network health metrics in real-time across the Colorado Front Range.',
10+
'Live network monitoring for Denver MeshCore. Our analyzers track mesh network status, node activity, signal strength, and network health metrics in real-time across the Colorado Front Range.',
1111
keywords: [
1212
'mesh network',
13+
'analyzer',
1314
'observer',
1415
'network monitoring',
1516
'Denver',
@@ -22,19 +23,27 @@ export const metadata: Metadata = {
2223
canonical: '/observer',
2324
},
2425
openGraph: {
25-
title: 'M3SHGHOST OBSERVER | Denver MeshCore',
26+
title: 'Denver MeshCore Analyzers',
2627
description:
2728
'Live network monitoring for Denver MeshCore. Track mesh network status and node activity in real-time.',
2829
url: 'https://denvermc.com/observer',
2930
},
3031
};
3132

32-
const OBSERVER_URL =
33-
'https://analyzer.letsmesh.net/node/4D0CC1003DBF678DF420907F9ACD77BD71D9E4C34300F72660F6BA6A2656A868';
33+
const OBSERVERS = [
34+
{
35+
name: 'M3SHGHOST',
36+
url: 'https://analyzer.letsmesh.net/node/4D0CC1003DBF678DF420907F9ACD77BD71D9E4C34300F72660F6BA6A2656A868',
37+
},
38+
{
39+
name: 'Meadowood',
40+
url: 'https://analyzer.letsmesh.net/node/92D29EDD92724217FB1D42E2D6226004F70469F77D1D6D8C4B6C3B26F78B1001',
41+
},
42+
];
3443

3544
const breadcrumbData = generateBreadcrumbSchema([
3645
{ name: 'Home', url: 'https://denvermc.com' },
37-
{ name: 'Observer', url: 'https://denvermc.com/observer' },
46+
{ name: 'Analyzers', url: 'https://denvermc.com/observer' },
3847
]);
3948

4049
export default function ObserverPage() {
@@ -84,75 +93,76 @@ export default function ObserverPage() {
8493
</div>
8594

8695
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold mb-4 font-mono tracking-tight">
87-
<span className="text-gradient-mesh">M3SHGH</span>
88-
<span className="text-sunset-500">O</span>
89-
<span className="text-gradient-mesh">ST</span>
90-
<span className="text-foreground-muted"> </span>
91-
<span className="text-mesh">0</span>
92-
<span className="text-gradient-mesh">BSERVER</span>
96+
<span className="text-gradient-mesh">Denver </span>
97+
<span className="text-mesh">Analyzers</span>
9398
</h1>
9499

95100
<p className="text-xl md:text-2xl text-foreground-muted mb-4">
96101
Live network monitoring for Denver MeshCore
97102
</p>
98103

99104
<p className="text-foreground-muted max-w-2xl mx-auto mb-8">
100-
The M3SHGHOST OBSERVER is a dedicated monitoring node that watches over the Denver mesh network,
105+
Our analyzer nodes are dedicated monitoring stations that watch over the Denver mesh network,
101106
tracking activity, measuring performance, and ensuring network health across the Front Range.
102107
</p>
103108

104-
{/* Primary CTA */}
105-
<a
106-
href={OBSERVER_URL}
107-
target="_blank"
108-
rel="noopener noreferrer"
109-
className="inline-flex items-center gap-3 btn-accent text-lg px-8 py-4 focus-ring"
110-
>
111-
<svg
112-
className="h-6 w-6"
113-
fill="none"
114-
stroke="currentColor"
115-
viewBox="0 0 24 24"
116-
aria-hidden="true"
117-
>
118-
<path
119-
strokeLinecap="round"
120-
strokeLinejoin="round"
121-
strokeWidth={2}
122-
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
123-
/>
124-
<path
125-
strokeLinecap="round"
126-
strokeLinejoin="round"
127-
strokeWidth={2}
128-
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
129-
/>
130-
</svg>
131-
Open Live Analyzer
132-
<svg
133-
className="h-5 w-5"
134-
fill="none"
135-
stroke="currentColor"
136-
viewBox="0 0 24 24"
137-
aria-hidden="true"
138-
>
139-
<path
140-
strokeLinecap="round"
141-
strokeLinejoin="round"
142-
strokeWidth={2}
143-
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
144-
/>
145-
</svg>
146-
</a>
109+
{/* Analyzer CTAs */}
110+
<div className="flex flex-col sm:flex-row gap-4 justify-center">
111+
{OBSERVERS.map((observer) => (
112+
<a
113+
key={observer.name}
114+
href={observer.url}
115+
target="_blank"
116+
rel="noopener noreferrer"
117+
className="inline-flex items-center gap-3 btn-accent text-lg px-6 py-4 focus-ring"
118+
>
119+
<svg
120+
className="h-6 w-6"
121+
fill="none"
122+
stroke="currentColor"
123+
viewBox="0 0 24 24"
124+
aria-hidden="true"
125+
>
126+
<path
127+
strokeLinecap="round"
128+
strokeLinejoin="round"
129+
strokeWidth={2}
130+
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
131+
/>
132+
<path
133+
strokeLinecap="round"
134+
strokeLinejoin="round"
135+
strokeWidth={2}
136+
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
137+
/>
138+
</svg>
139+
{observer.name}
140+
<svg
141+
className="h-5 w-5"
142+
fill="none"
143+
stroke="currentColor"
144+
viewBox="0 0 24 24"
145+
aria-hidden="true"
146+
>
147+
<path
148+
strokeLinecap="round"
149+
strokeLinejoin="round"
150+
strokeWidth={2}
151+
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
152+
/>
153+
</svg>
154+
</a>
155+
))}
156+
</div>
147157
</div>
148158
</section>
149159

150160

151-
{/* What is the Observer Section */}
161+
{/* What are Analyzers Section */}
152162
<section className="px-6 py-16">
153163
<div className="mx-auto max-w-6xl">
154164
<h2 className="text-3xl font-bold text-center mb-12 text-foreground">
155-
What is the <span className="text-mesh">Observer</span>?
165+
What are <span className="text-mesh">Analyzers</span>?
156166
</h2>
157167

158168
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
@@ -176,8 +186,8 @@ export default function ObserverPage() {
176186
</div>
177187
<h3 className="text-lg font-semibold text-foreground mb-2">Network Monitoring</h3>
178188
<p className="text-foreground-muted text-sm">
179-
The observer node continuously monitors network traffic, tracking messages as they propagate
180-
through the Denver mesh network. It provides visibility into network activity patterns and
189+
Our analyzer nodes continuously monitor network traffic, tracking messages as they propagate
190+
through the Denver mesh network. They provide visibility into network activity patterns and
181191
communication flows.
182192
</p>
183193
</div>
@@ -202,7 +212,7 @@ export default function ObserverPage() {
202212
</div>
203213
<h3 className="text-lg font-semibold text-foreground mb-2">Performance Metrics</h3>
204214
<p className="text-foreground-muted text-sm">
205-
Track signal strength, hop counts, and message delivery rates. The observer collects
215+
Track signal strength, hop counts, and message delivery rates. The analyzers collect
206216
performance data that helps identify network bottlenecks and optimize node placement
207217
across the Front Range.
208218
</p>

src/app/start/page.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,14 @@ const resources = [
261261
description: "Real-time network visualization and node statistics",
262262
},
263263
{
264-
name: "Denver Observer Node",
264+
name: "M3SHGHOST Analyzer",
265265
url: "https://analyzer.letsmesh.net/node/4D0CC1003DBF678DF420907F9ACD77BD71D9E4C34300F72660F6BA6A2656A868",
266-
description: "View our main Denver observer node on LetsMesh",
266+
description: "View the M3SHGHOST analyzer node on LetsMesh",
267+
},
268+
{
269+
name: "Meadowood Analyzer",
270+
url: "https://analyzer.letsmesh.net/node/92D29EDD92724217FB1D42E2D6226004F70469F77D1D6D8C4B6C3B26F78B1001",
271+
description: "View the Meadowood analyzer node on LetsMesh",
267272
},
268273
{
269274
name: "Denver MeshCore Discord",

src/components/Footer.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ const quickLinks = [
55
{ href: '/', label: 'Home' },
66
{ href: '/why-meshcore', label: 'Why MeshCore?' },
77
{ href: '/nodes', label: 'Nodes' },
8-
{ href: '/observer', label: 'Observer' },
8+
{ href: '/observer', label: 'Analyzers' },
99
{ href: '/about', label: 'About' },
1010
{ href: '/start', label: 'Get Started' },
1111
];
1212

1313
const communityLinks = [
1414
{ href: 'https://discord.gg/QpaW8FTTCE', label: 'Discord', icon: 'discord', external: true },
1515
{
16-
href: 'https://analyzer.letsmesh.net/node/4D0CC1003DBF678DF420907F9ACD77BD71D9E4C34300F72660F6BA6A2656A868',
17-
label: 'Observer',
18-
external: true,
16+
href: '/observer',
17+
label: 'Analyzers',
18+
external: false,
1919
},
2020
];
2121

src/components/Navigation.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const navLinks: NavLink[] = [
1515
{ href: '/', label: 'Home' },
1616
{ href: '/why-meshcore', label: 'Why MeshCore?' },
1717
{ href: '/map', label: 'Map' },
18-
{ href: '/observer', label: 'Observer' },
18+
{ href: '/observer', label: 'Analyzers' },
1919
{ href: '/about', label: 'About' },
2020
{ href: '/start', label: 'Get Started' },
2121
];

0 commit comments

Comments
 (0)