This commit is contained in:
2026-04-27 17:02:49 +02:00
parent 3e9f863121
commit 3bb0549109
17 changed files with 2590 additions and 33 deletions

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('blumen-scanner')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('flower-scanner')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('identify-plant-photo')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}

View File

@@ -7,25 +7,25 @@ import { siteConfig, hasIosStoreUrl } from '@/lib/site'
export const metadata: Metadata = {
metadataBase: new URL(siteConfig.domain),
title: {
default: 'GreenLens - Plant Identifier and Care Planner',
default: 'GreenLens Pflanzen erkennen & Pflege-App',
template: '%s | GreenLens',
},
description:
'GreenLens helps you identify plants, organize your collection, and keep up with care routines in one app.',
'GreenLens erkennt Pflanzen per Foto in Sekunden und liefert sofort Pflegeplan, Gießerinnerungen und Gesundheitscheck — alles in einer App.',
keywords: [
'plant identifier by picture',
'Pflanzen erkennen App',
'Pflanzen bestimmen per Foto',
'Blumen Scanner',
'Pflanzen erkennen per Foto',
'plant identifier app',
'plant care app',
'watering reminders',
'houseplant tracker',
'plant identification',
'plant health check',
'Pflanzen App',
'GreenLens',
],
authors: [{ name: siteConfig.name }],
openGraph: {
title: 'GreenLens - Plant Identifier and Care Planner',
description: 'Identify plants, get care guidance, and manage your collection with GreenLens.',
title: 'GreenLens Pflanzen erkennen & Pflege-App',
description: 'Pflanzen per Foto erkennen, Pflegeplan erhalten und Gesundheitsprobleme diagnostizieren — alles in einer App.',
type: 'website',
url: siteConfig.domain,
},
@@ -35,8 +35,8 @@ export const metadata: Metadata = {
},
twitter: {
card: 'summary_large_image',
title: 'GreenLens - Plant Identifier and Care Planner',
description: 'Identify plants, get care guidance, and manage your collection with GreenLens.',
title: 'GreenLens Pflanzen erkennen & Pflege-App',
description: 'Pflanzen per Foto erkennen, Pflegeplan erhalten und Gesundheitsprobleme diagnostizieren — alles in einer App.',
},
}
@@ -56,6 +56,13 @@ export default async function RootLayout({ children }: { children: React.ReactNo
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify([
{
'@context': 'https://schema.org',
'@type': 'WebSite',
name: siteConfig.name,
url: siteConfig.domain,
inLanguage: ['de', 'en', 'es'],
},
{
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
@@ -63,7 +70,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
operatingSystem: 'iOS, Android',
applicationCategory: 'LifestyleApplication',
description:
'Identify plants, track care schedules, and manage your collection with AI-powered scans.',
'Pflanzen per Foto erkennen, Pflegeplan erhalten und Gesundheitsprobleme diagnostizieren.',
inLanguage: ['de', 'en', 'es'],
...(hasIosStoreUrl && { downloadUrl: siteConfig.iosAppStoreUrl }),
offers: {
@@ -78,7 +85,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
name: siteConfig.name,
url: siteConfig.domain,
description:
'GreenLens is a plant identification and care planning app for iOS and Android.',
'GreenLens ist eine App zur Pflanzenerkennung und Pflegeplanung r iOS und Android.',
contactPoint: {
'@type': 'ContactPoint',
contactType: 'customer support',

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('pflanzen-bestimmen')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('pflanzen-krankheiten-erkennen')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('pflanzen-pflege-app')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}

View File

@@ -6,7 +6,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
return [
{
url: baseUrl,
lastModified: new Date('2026-04-08'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'weekly',
priority: 1,
},
@@ -18,46 +18,76 @@ export default function sitemap(): MetadataRoute.Sitemap {
},
{
url: `${baseUrl}/plant-identifier-app`,
lastModified: new Date('2026-04-12'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/plant-disease-identifier`,
lastModified: new Date('2026-04-12'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.75,
},
{
url: `${baseUrl}/plant-care-app`,
lastModified: new Date('2026-04-12'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.75,
},
{
url: `${baseUrl}/pflanzen-erkennen-app`,
lastModified: new Date('2026-04-12'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.75,
priority: 0.85,
},
{
url: `${baseUrl}/blumen-scanner`,
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/pflanzen-bestimmen`,
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/vs/picturethis`,
lastModified: new Date('2026-04-10'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.65,
},
{
url: `${baseUrl}/vs/plantum`,
lastModified: new Date('2026-04-10'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.65,
},
{
url: `${baseUrl}/vs/inaturalist`,
lastModified: new Date('2026-04-12'),
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.65,
},
{
url: `${baseUrl}/vs/google-lens`,
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.75,
},
{
url: `${baseUrl}/flower-scanner`,
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/identify-plant-photo`,
lastModified: new Date('2026-04-27'),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/imprint`,
lastModified: new Date('2026-04-08'),

View File

@@ -0,0 +1,33 @@
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import SeoCategoryPage from '@/components/SeoCategoryPage'
import { getSeoPageBySlug } from '@/lib/seoPages'
import { siteConfig } from '@/lib/site'
const profile = getSeoPageBySlug('zimmerpflanzen-bestimmen')
export const metadata: Metadata = !profile
? {}
: {
title: profile.metaTitle,
description: profile.metaDescription,
alternates: { canonical: profile.canonical },
openGraph: {
title: profile.metaTitle,
description: profile.metaDescription,
url: `${siteConfig.domain}${profile.canonical}`,
type: 'website',
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
},
twitter: {
card: 'summary_large_image',
title: profile.metaTitle,
description: profile.metaDescription,
images: ['/og-image.png'],
},
}
export default function Page() {
if (!profile) notFound()
return <SeoCategoryPage profile={profile} />
}