feat(blog): resolve SEO cannibalization, update blog posts & clean up dev posts
1
.gitignore
vendored
@@ -53,6 +53,7 @@ greenlens-cli/
|
||||
greenlens-python/
|
||||
greenlens-vscode/
|
||||
greenlens-chrome-extension/
|
||||
homebrew-greenlens/
|
||||
|
||||
# Claude / Agents (symlinks incompatible with EAS Build on Windows)
|
||||
.agents/
|
||||
|
||||
@@ -1,261 +0,0 @@
|
||||
---
|
||||
title: "Modern High-Throughput QR & UTM Tracking Architecture for SMB Micro-SaaS"
|
||||
description: "Learn how to build a high-performance HTTP redirect engine with dynamic QR code rendering, async analytics capture, and microsecond latency."
|
||||
tags: ["systemdesign", "backend", "node", "webdev"]
|
||||
canonical_url: "https://qrmaster.net/"
|
||||
cover_image: "https://qrmaster.net/images/blog/qr-tracking-architecture.jpg"
|
||||
---
|
||||
|
||||
# Modern High-Throughput QR & UTM Tracking Architecture for SMB Micro-SaaS
|
||||
|
||||
QR codes are everywhere—from restaurant tables and product packaging to event banners and marketing campaigns. However, for SMBs and modern digital marketers, a static QR code that bakes a raw target URL directly into the matrix is a missed opportunity.
|
||||
|
||||
If a marketing link changes or requires UTM parameters (`utm_source`, `utm_medium`, `utm_campaign`), a static QR code printed on 10,000 flyers becomes instantly useless.
|
||||
|
||||
This is why modern SaaS applications build **Dynamic QR & UTM Tracking Infrastructure**. When a user scans a dynamic QR code (`qrmaster`), the scanner sends an HTTP request to an ultra-fast redirection edge service. The service records scan telemetry (user agent, geolocation, device type, timestamp) asynchronously before issuing an instantaneous `302 Found` redirect to the destination URL with injected UTM parameters.
|
||||
|
||||
In this system design breakdown, we'll examine the backend architecture of [QRMaster](https://qrmaster.net/), exploring how to process thousands of HTTP redirects per second with sub-millisecond latency, render dynamic vector SVG/PNG QR codes on demand, and capture scan analytics without blocking user navigation.
|
||||
|
||||
---
|
||||
|
||||
## 1. High-Level Redirect & Analytics System Architecture
|
||||
|
||||
To deliver an instantaneous scan experience, the primary redirection worker must **never block** on database disk writes or synchronous analytics processing.
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Mobile Camera / QR Scanner] -->|Scans QR Code| B[Edge Redirection Worker `qrmaster.net/r/:slug`]
|
||||
B -->|Fast In-Memory Cache Lookup| C{Slug Found in Redis?}
|
||||
C -- Yes --> D[Extract Destination URL & UTM Params]
|
||||
C -- No --> E[Read PostgreSQL DB & Warm Redis Cache]
|
||||
E --> D
|
||||
|
||||
D -->|1. Immediate HTTP 302 Redirect| F[User's Mobile Browser]
|
||||
D -->|2. Fire-and-Forget Async Event| G[Redis Stream / Queue `scan_events`]
|
||||
|
||||
G --> H[Background Analytics Worker]
|
||||
H --> I[Parse Geolocation & User-Agent]
|
||||
I --> J[Time-Series Analytics DB / PostgreSQL]
|
||||
```
|
||||
|
||||
### Key Performance Targets:
|
||||
- **Redirection Latency:** $< 15 \text{ ms}$ (99th percentile).
|
||||
- **Cache Hit Rate:** $> 99\%$ via Redis memory caching.
|
||||
- **Analytics Loss Rate:** Zero data loss via durable stream buffers (Redis Streams).
|
||||
|
||||
---
|
||||
|
||||
## 2. Implementing the Ultra-Fast Redirection Middleware
|
||||
|
||||
Below is a production-grade Node.js/TypeScript edge route handler designed for ultra-low latency redirection and fire-and-forget telemetry recording:
|
||||
|
||||
```typescript
|
||||
// routes/redirectHandler.ts
|
||||
import { Request, Response } from 'express';
|
||||
import { Redis } from 'ioredis';
|
||||
|
||||
const redis = new Redis(process.env.REDIS_URL || 'redis://localhost:6379');
|
||||
|
||||
export interface LinkMetadata {
|
||||
destinationUrl: string;
|
||||
utmSource?: string;
|
||||
utmMedium?: string;
|
||||
utmCampaign?: string;
|
||||
isActive: boolean;
|
||||
}
|
||||
|
||||
export async function handleQrRedirect(req: Request, res: Response): Promise<void> {
|
||||
const { slug } = req.params;
|
||||
const cacheKey = `link:${slug}`;
|
||||
|
||||
try {
|
||||
// 1. In-Memory Cache Lookup (< 2ms)
|
||||
let linkDataRaw = await redis.get(cacheKey);
|
||||
let linkData: LinkMetadata;
|
||||
|
||||
if (linkDataRaw) {
|
||||
linkData = JSON.parse(linkDataRaw);
|
||||
} else {
|
||||
// Database Fallback (Cold Cache)
|
||||
linkData = await fetchLinkFromDatabase(slug);
|
||||
if (!linkData || !linkData.isActive) {
|
||||
res.status(404).send('QR Code Link Not Found or Expired.');
|
||||
return;
|
||||
}
|
||||
// Warm Redis Cache with 1-Hour TTL
|
||||
await redis.setex(cacheKey, 3600, JSON.stringify(linkData));
|
||||
}
|
||||
|
||||
// 2. Construct Final Redirect URL with UTM Query Parameters
|
||||
const finalUrl = buildUtmTargetUrl(linkData);
|
||||
|
||||
// 3. Fire-and-Forget Analytics Telemetry (Async - Does NOT block response)
|
||||
enqueueScanAnalytics(slug, req);
|
||||
|
||||
// 4. Instantaneous 302 Found Redirect
|
||||
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
|
||||
res.redirect(302, finalUrl);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Redirect Handler Error:', error);
|
||||
res.redirect(302, 'https://qrmaster.net?error=redirect_failed');
|
||||
}
|
||||
}
|
||||
|
||||
function buildUtmTargetUrl(data: LinkMetadata): string {
|
||||
const url = new URL(data.destinationUrl);
|
||||
if (data.utmSource) url.searchParams.set('utm_source', data.utmSource);
|
||||
if (data.utmMedium) url.searchParams.set('utm_medium', data.utmMedium);
|
||||
if (data.utmCampaign) url.searchParams.set('utm_campaign', data.utmCampaign);
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
function enqueueScanAnalytics(slug: string, req: Request): void {
|
||||
const eventPayload = {
|
||||
slug,
|
||||
ip: req.ip || req.headers['x-forwarded-for'] || '0.0.0.0',
|
||||
userAgent: req.headers['user-agent'] || 'Unknown',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
// Push event to Redis Stream without waiting for completion
|
||||
redis.xadd('stream:qr_scans', '*', 'data', JSON.stringify(eventPayload)).catch(err => {
|
||||
console.error('Failed to enqueue scan analytics event:', err);
|
||||
});
|
||||
}
|
||||
|
||||
async function fetchLinkFromDatabase(slug: string): Promise<LinkMetadata> {
|
||||
// Mock DB Query for fallback
|
||||
return {
|
||||
destinationUrl: 'https://qrmaster.net/pricing',
|
||||
utmSource: 'qr_flyer',
|
||||
utmMedium: 'print',
|
||||
utmCampaign: 'summer_2026',
|
||||
isActive: true
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Dynamic Vector (SVG) & Raster (PNG) QR Generation at Scale
|
||||
|
||||
Instead of pre-generating and storing millions of static PNG files in cloud storage (S3/CloudFront), dynamic QR engines render SVG vectors programmatically on demand using lightweight matrix calculation algorithms:
|
||||
|
||||
```typescript
|
||||
// services/qrGenerator.ts
|
||||
import QRCode from 'qrcode';
|
||||
|
||||
export interface QrRenderOptions {
|
||||
errorCorrectionLevel: 'L' | 'M' | 'Q' | 'H';
|
||||
margin: number;
|
||||
color: {
|
||||
dark: string; // Foreground modules
|
||||
light: string; // Background
|
||||
};
|
||||
}
|
||||
|
||||
export async function generateQrSvg(
|
||||
targetUrl: string,
|
||||
options?: Partial<QrRenderOptions>
|
||||
): Promise<string> {
|
||||
const defaultOpts: QrRenderOptions = {
|
||||
errorCorrectionLevel: 'M',
|
||||
margin: 2,
|
||||
color: {
|
||||
dark: '#3b5bdb', // QRMaster Indigo
|
||||
light: '#ffffff'
|
||||
},
|
||||
...options
|
||||
};
|
||||
|
||||
try {
|
||||
// Generate Vector SVG String
|
||||
const svgString = await QRCode.toString(targetUrl, {
|
||||
type: 'svg',
|
||||
...defaultOpts
|
||||
});
|
||||
|
||||
return svgString;
|
||||
} catch (err) {
|
||||
throw new Error(`QR Generation Failed: ${err}`);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Background Stream Worker for Analytics Processing
|
||||
|
||||
A dedicated background worker consumes events from `stream:qr_scans`, parses user-agent headers to extract device types (iOS, Android, Desktop), resolves geolocation from IP addresses, and performs batch upserts into PostgreSQL:
|
||||
|
||||
```typescript
|
||||
// workers/analyticsWorker.ts
|
||||
import { Redis } from 'ioredis';
|
||||
import UAParser from 'ua-parser-js';
|
||||
|
||||
const redis = new Redis(process.env.REDIS_URL || 'redis://localhost:6379');
|
||||
|
||||
async function startAnalyticsWorker() {
|
||||
console.log('🚀 Starting QR Analytics Consumer Worker...');
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
// Read up to 100 events from Redis Stream
|
||||
const results = await redis.xread('BLOCK', 2000, 'STREAMS', 'stream:qr_scans', '$');
|
||||
|
||||
if (!results) continue;
|
||||
|
||||
const streams = results[0];
|
||||
const events = streams[1];
|
||||
|
||||
const batchRecords = events.map(evt => {
|
||||
const payload = JSON.parse(evt[1][1]);
|
||||
const ua = new UAParser(payload.userAgent).getResult();
|
||||
|
||||
return {
|
||||
slug: payload.slug,
|
||||
device: ua.device.type || 'desktop',
|
||||
os: ua.os.name || 'Unknown',
|
||||
browser: ua.browser.name || 'Unknown',
|
||||
timestamp: new Date(payload.timestamp)
|
||||
};
|
||||
});
|
||||
|
||||
// Execute Bulk Insert into Time-Series DB Table
|
||||
await bulkInsertAnalyticsRecords(batchRecords);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Analytics Worker Batch Error:', error);
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function bulkInsertAnalyticsRecords(records: any[]) {
|
||||
// Bulk database insert implementation
|
||||
console.log(`Processed batch of ${records.length} scan records.`);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Benchmarking Redirection Performance: Direct DB vs. Edge Cache
|
||||
|
||||
We load-tested our redirection architecture using `autocannon` at 5,000 concurrent HTTP requests per second:
|
||||
|
||||
| Architectural Setup | 99th Percentile Latency | Throughput (Req/Sec) | CPU Utilization |
|
||||
|---|---|---|---|
|
||||
| Direct DB Query per Redirect | 185 ms | 820 req/sec | 94% (DB Constrained) |
|
||||
| **Redis Cache + Stream Worker (QRMaster)** | **4.2 ms** | **4,850 req/sec** | **18% (Lightweight)** |
|
||||
|
||||
---
|
||||
|
||||
## Summary & Architectural Lessons
|
||||
|
||||
1. **Decouple Telemetry from Redirects:** Never execute synchronous database writes inside the HTTP redirect request path.
|
||||
2. **Utilize In-Memory Caching:** Store slug-to-URL mappings in Redis to achieve single-digit millisecond response times.
|
||||
3. **Render SVG Vectors Programmatically:** Render vector QR codes dynamically on demand to eliminate static file storage overhead.
|
||||
4. **Buffer Events with Streams:** Use Redis Streams or Kafka to handle sudden traffic spikes without dropping scan analytics data (`qr code tracking`).
|
||||
|
||||
To test dynamic QR code creation and real-time UTM tracking analytics, explore [QRMaster](https://qrmaster.net/).
|
||||
@@ -1,5 +1,6 @@
|
||||
import React from 'react'
|
||||
import { Metadata } from 'next'
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import SeoNavbar from '@/components/seo/SeoNavbar'
|
||||
import SeoFooter from '@/components/seo/SeoFooter'
|
||||
@@ -14,7 +15,22 @@ export const metadata: Metadata = {
|
||||
},
|
||||
}
|
||||
|
||||
const readMoreLabel: Record<string, string> = {
|
||||
en: 'Read Full Guide',
|
||||
de: 'Ganzen Artikel lesen',
|
||||
es: 'Leer la guía completa',
|
||||
}
|
||||
|
||||
const languageBadge: Record<string, { label: string; flag: string }> = {
|
||||
en: { label: 'EN', flag: '🇬🇧' },
|
||||
de: { label: 'DE', flag: '🇩🇪' },
|
||||
es: { label: 'ES', flag: '🇪🇸' },
|
||||
}
|
||||
|
||||
export default function BlogIndexPage() {
|
||||
// This index page's own chrome (hero copy) stays English, but every post —
|
||||
// English, German, Spanish — is listed here with a small language badge so
|
||||
// DE/ES posts are actually discoverable instead of living at an unlinked URL.
|
||||
const posts = Object.values(blogPosts)
|
||||
|
||||
return (
|
||||
@@ -46,7 +62,7 @@ export default function BlogIndexPage() {
|
||||
|
||||
{/* Blog Cards Grid */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||
{posts.map((post) => (
|
||||
{posts.map((post, index) => (
|
||||
<Link
|
||||
key={post.slug}
|
||||
href={`/blog/${post.slug}`}
|
||||
@@ -54,15 +70,21 @@ export default function BlogIndexPage() {
|
||||
>
|
||||
{/* Image */}
|
||||
<div className="relative h-52 w-full overflow-hidden bg-emerald-950">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img
|
||||
<Image
|
||||
src={post.heroImage}
|
||||
alt={post.heroImageAlt}
|
||||
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
|
||||
fill
|
||||
priority={index < 3}
|
||||
loading={index < 3 ? undefined : 'lazy'}
|
||||
sizes="(min-width: 768px) 33vw, 100vw"
|
||||
className="object-cover group-hover:scale-105 transition-transform duration-500"
|
||||
/>
|
||||
<div className="absolute top-4 left-4 bg-emerald-950/90 backdrop-blur-md px-3.5 py-1 rounded-full text-[10px] font-extrabold uppercase tracking-wider text-emerald-300 border border-emerald-500/30">
|
||||
{post.category}
|
||||
</div>
|
||||
<div className="absolute top-4 right-4 bg-white/95 backdrop-blur-md px-2.5 py-1 rounded-full text-[10px] font-extrabold uppercase tracking-wider text-emerald-900 border border-emerald-600/20 shadow-sm">
|
||||
{languageBadge[post.locale]?.flag ?? ''} {languageBadge[post.locale]?.label ?? post.locale}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Card Content */}
|
||||
@@ -80,7 +102,7 @@ export default function BlogIndexPage() {
|
||||
</div>
|
||||
|
||||
<div className="text-emerald-700 font-bold text-sm flex items-center gap-1.5 group-hover:translate-x-1 transition-transform">
|
||||
<span>Read Full Guide</span>
|
||||
<span>{readMoreLabel[post.locale] ?? readMoreLabel.en}</span>
|
||||
<span>→</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
export const metadata = buildSeoPageMetadata('wie-funktioniert-pflanzenerkennung')
|
||||
export default createSeoPage('wie-funktioniert-pflanzenerkennung')
|
||||
@@ -1,4 +0,0 @@
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
export const metadata = buildSeoPageMetadata('zimmerpflanzen-mit-wenig-licht')
|
||||
export default createSeoPage('zimmerpflanzen-mit-wenig-licht')
|
||||
@@ -1,4 +1,5 @@
|
||||
import React from 'react'
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import SeoNavbar from '@/components/seo/SeoNavbar'
|
||||
import SeoFooter from '@/components/seo/SeoFooter'
|
||||
@@ -6,6 +7,84 @@ import { BlogPost } from '@/lib/blogPosts'
|
||||
|
||||
const SITE = 'https://greenlenspro.com'
|
||||
|
||||
const blogUiCopy = {
|
||||
en: {
|
||||
home: 'Home',
|
||||
blog: 'Blog',
|
||||
quickAnswer: 'Quick Botanical Answer',
|
||||
tableOfContents: 'Table of Contents',
|
||||
updated: 'Updated',
|
||||
actionPlan: 'Action Plan',
|
||||
stepByStepGuide: 'Step-by-Step Action Guide',
|
||||
questionsAndAnswers: 'Questions & Answers',
|
||||
faqHeading: 'Frequently Asked Questions',
|
||||
relatedGuides: 'Related Guides',
|
||||
ctaEyebrow: 'Instant AI Health Diagnosis',
|
||||
ctaTitle: 'Unsure what is wrong with your plant?',
|
||||
ctaBody: 'Scan your plant leaf with GreenLens AI for an immediate disease check, pest identification, and custom care plan.',
|
||||
ctaButton: 'Start Free Scan ➔',
|
||||
appEyebrow: 'GreenLens Pro iOS App',
|
||||
appTitle: 'Identify Any Plant & Get Custom Care Plans',
|
||||
appBody: 'Scan your houseplants in seconds, diagnose leaf diseases, and get automatic watering reminders tailored to your space.',
|
||||
appButton: 'Start First Scan Free — No Account Needed',
|
||||
howCompiled: 'How this guide was compiled',
|
||||
sources: 'Sources',
|
||||
published: 'Published',
|
||||
lastUpdated: 'Last updated',
|
||||
writtenBy: 'Written by',
|
||||
},
|
||||
de: {
|
||||
home: 'Start',
|
||||
blog: 'Blog',
|
||||
quickAnswer: 'Kurze Antwort',
|
||||
tableOfContents: 'Inhaltsverzeichnis',
|
||||
updated: 'Aktualisiert am',
|
||||
actionPlan: 'Handlungsplan',
|
||||
stepByStepGuide: 'Schritt-für-Schritt-Anleitung',
|
||||
questionsAndAnswers: 'Fragen & Antworten',
|
||||
faqHeading: 'Häufig gestellte Fragen',
|
||||
relatedGuides: 'Weitere Ratgeber',
|
||||
ctaEyebrow: 'Sofortige KI-Gesundheitsanalyse',
|
||||
ctaTitle: 'Unsicher, was mit deiner Pflanze los ist?',
|
||||
ctaBody: 'Scanne ein Blatt deiner Pflanze mit GreenLens AI für eine sofortige Diagnose, Schädlingserkennung und einen individuellen Pflegeplan.',
|
||||
ctaButton: 'Kostenlosen Scan starten ➔',
|
||||
appEyebrow: 'GreenLens Pro iOS App',
|
||||
appTitle: 'Jede Pflanze erkennen & individuelle Pflegepläne erhalten',
|
||||
appBody: 'Scanne deine Zimmerpflanzen in Sekunden, diagnostiziere Blattkrankheiten und erhalte automatische Gießerinnerungen, abgestimmt auf deinen Standort.',
|
||||
appButton: 'Ersten Scan gratis starten — ohne Anmeldung',
|
||||
howCompiled: 'Wie dieser Ratgeber entstanden ist',
|
||||
sources: 'Quellen',
|
||||
published: 'Veröffentlicht am',
|
||||
lastUpdated: 'Zuletzt aktualisiert am',
|
||||
writtenBy: 'Verfasst von',
|
||||
},
|
||||
es: {
|
||||
home: 'Inicio',
|
||||
blog: 'Blog',
|
||||
quickAnswer: 'Respuesta rápida',
|
||||
tableOfContents: 'Índice de contenidos',
|
||||
updated: 'Actualizado',
|
||||
actionPlan: 'Plan de acción',
|
||||
stepByStepGuide: 'Guía paso a paso',
|
||||
questionsAndAnswers: 'Preguntas y respuestas',
|
||||
faqHeading: 'Preguntas frecuentes',
|
||||
relatedGuides: 'Guías relacionadas',
|
||||
ctaEyebrow: 'Diagnóstico instantáneo con IA',
|
||||
ctaTitle: '¿No sabes qué le pasa a tu planta?',
|
||||
ctaBody: 'Escanea una hoja de tu planta con GreenLens AI para un diagnóstico inmediato, detección de plagas y un plan de cuidado personalizado.',
|
||||
ctaButton: 'Iniciar escaneo gratis ➔',
|
||||
appEyebrow: 'GreenLens Pro para iOS',
|
||||
appTitle: 'Identifica cualquier planta y recibe planes de cuidado personalizados',
|
||||
appBody: 'Escanea tus plantas de interior en segundos, diagnostica enfermedades de las hojas y recibe recordatorios de riego automáticos adaptados a tu espacio.',
|
||||
appButton: 'Haz tu primer escaneo gratis — sin cuenta',
|
||||
howCompiled: 'Cómo se elaboró esta guía',
|
||||
sources: 'Fuentes',
|
||||
published: 'Publicado el',
|
||||
lastUpdated: 'Última actualización',
|
||||
writtenBy: 'Escrito por',
|
||||
},
|
||||
} as const
|
||||
|
||||
/**
|
||||
* JSON-LD für Blogposts. BlogPosting liefert Autor und Datum, FAQPage und HowTo
|
||||
* sind die beiden Formate, aus denen AI-Antwortsysteme direkt extrahieren.
|
||||
@@ -116,6 +195,8 @@ function renderFormattedText(text: string) {
|
||||
}
|
||||
|
||||
export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
const t = blogUiCopy[post.locale] ?? blogUiCopy.en
|
||||
|
||||
return (
|
||||
<div className="bg-[#fdfbf6] text-on-surface font-body antialiased min-h-screen relative overflow-hidden">
|
||||
<script
|
||||
@@ -124,7 +205,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
/>
|
||||
|
||||
{/* Navigation Header */}
|
||||
<SeoNavbar locale="en" />
|
||||
<SeoNavbar locale={post.locale} />
|
||||
|
||||
{/* Decorative Green Glow Blobs */}
|
||||
<div className="absolute inset-0 pointer-events-none -z-10" aria-hidden="true">
|
||||
@@ -141,11 +222,11 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{/* Breadcrumbs */}
|
||||
<nav className="flex items-center gap-2 text-xs text-emerald-800/70 mb-6 font-semibold tracking-wide">
|
||||
<Link href="/" className="hover:text-emerald-700 transition-colors">
|
||||
Home
|
||||
{t.home}
|
||||
</Link>
|
||||
<span>/</span>
|
||||
<Link href="/blog" className="hover:text-emerald-700 transition-colors">
|
||||
Blog
|
||||
{t.blog}
|
||||
</Link>
|
||||
<span>/</span>
|
||||
<span className="text-emerald-700 font-bold">{post.category}</span>
|
||||
@@ -177,7 +258,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
<div>
|
||||
<div className="font-bold text-sm text-emerald-950">{post.author.name}</div>
|
||||
<div className="text-xs text-emerald-700 font-medium">
|
||||
{post.author.role} • Updated {post.publishedAt}
|
||||
{post.author.role} • {t.updated} {post.publishedAt}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -190,11 +271,13 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
<div className="lg:col-span-8">
|
||||
{/* Featured Hero Image */}
|
||||
<div className="relative w-full h-[360px] sm:h-[450px] rounded-2xl overflow-hidden shadow-2xl mb-10 border-2 border-emerald-900/10 group">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img
|
||||
<Image
|
||||
src={post.heroImage}
|
||||
alt={post.heroImageAlt}
|
||||
className="w-full h-full object-cover"
|
||||
fill
|
||||
priority
|
||||
sizes="(min-width: 1024px) 66vw, 100vw"
|
||||
className="object-cover"
|
||||
/>
|
||||
{/* Dynamic Hero Overlay Badge */}
|
||||
<div className="absolute bottom-6 left-6 right-6 sm:right-auto max-w-[350px] bg-white/95 backdrop-blur-md p-4 rounded-xl border-2 border-emerald-600/30 flex items-center gap-3 shadow-2xl">
|
||||
@@ -214,7 +297,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{post.directAnswer && (
|
||||
<div className="bg-emerald-500/10 border-l-4 border-emerald-600 p-6 rounded-r-2xl mb-10 shadow-sm border-y border-r border-emerald-600/20">
|
||||
<div className="flex items-center gap-2 text-emerald-800 font-extrabold text-xs uppercase tracking-wider mb-2">
|
||||
<span>⚡ Quick Botanical Answer</span>
|
||||
<span>⚡ {t.quickAnswer}</span>
|
||||
</div>
|
||||
<p className="text-emerald-950 font-medium leading-relaxed text-base max-w-[72ch]">
|
||||
{renderFormattedText(post.directAnswer)}
|
||||
@@ -226,7 +309,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{post.toc && post.toc.length > 0 && (
|
||||
<div className="lg:hidden bg-white p-6 rounded-2xl border-2 border-emerald-600/20 mb-10 shadow-sm">
|
||||
<div className="font-extrabold text-xs text-emerald-800 uppercase tracking-widest mb-3">
|
||||
Table of Contents
|
||||
{t.tableOfContents}
|
||||
</div>
|
||||
<ul className="space-y-2.5 text-sm font-medium">
|
||||
{post.toc.map((item) => (
|
||||
@@ -322,20 +405,20 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
<div className="my-10 p-6 sm:p-8 rounded-2xl bg-gradient-to-br from-emerald-900 via-emerald-950 to-ink text-white border-2 border-emerald-400/30 shadow-xl flex flex-col sm:flex-row items-center justify-between gap-6">
|
||||
<div className="space-y-1.5 text-center sm:text-left">
|
||||
<div className="flex items-center justify-center sm:justify-start gap-2 text-xs font-extrabold tracking-widest text-emerald-400 uppercase">
|
||||
<span>🌿 Instant AI Health Diagnosis</span>
|
||||
<span>🌿 {t.ctaEyebrow}</span>
|
||||
</div>
|
||||
<h3 className="font-display text-xl sm:text-2xl font-bold text-white">
|
||||
Unsure what is wrong with your plant?
|
||||
{t.ctaTitle}
|
||||
</h3>
|
||||
<p className="text-white/80 text-sm max-w-[480px]">
|
||||
Scan your plant leaf with GreenLens AI for an immediate disease check, pest identification, and custom care plan.
|
||||
{t.ctaBody}
|
||||
</p>
|
||||
</div>
|
||||
<Link
|
||||
href="/"
|
||||
className="shrink-0 bg-emerald-500 hover:bg-emerald-400 text-ink font-bold px-6 py-3.5 rounded-full text-sm shadow-xl hover:scale-105 transition-all duration-200"
|
||||
>
|
||||
Start Free Scan ➔
|
||||
{t.ctaButton}
|
||||
</Link>
|
||||
</div>
|
||||
)}
|
||||
@@ -349,10 +432,10 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
className="scroll-mt-28 bg-white p-6 sm:p-8 rounded-2xl border-2 border-emerald-600/20 shadow-md"
|
||||
>
|
||||
<div className="text-xs font-extrabold tracking-widest text-emerald-700 uppercase mb-2">
|
||||
Action Plan
|
||||
{t.actionPlan}
|
||||
</div>
|
||||
<h2 className="font-display text-2xl font-bold text-emerald-950 mb-6">
|
||||
{post.howToName ?? 'Step-by-Step Action Guide'}
|
||||
{post.howToName ?? t.stepByStepGuide}
|
||||
</h2>
|
||||
<div className="space-y-4">
|
||||
{post.howToSteps.map((step, idx) => (
|
||||
@@ -377,10 +460,10 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{post.faqs && post.faqs.length > 0 && (
|
||||
<section id="faq" className="scroll-mt-28 pt-8 border-t-2 border-emerald-600/20">
|
||||
<div className="text-xs font-extrabold tracking-widest text-emerald-700 uppercase mb-2">
|
||||
Questions & Answers
|
||||
{t.questionsAndAnswers}
|
||||
</div>
|
||||
<h2 className="font-display text-2xl sm:text-3xl font-bold text-emerald-950 mb-6">
|
||||
Frequently Asked Questions
|
||||
{t.faqHeading}
|
||||
</h2>
|
||||
<div className="space-y-4">
|
||||
{post.faqs.map((faq, idx) => (
|
||||
@@ -401,13 +484,13 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
<div className="p-8 sm:p-10 rounded-3xl bg-gradient-to-br from-emerald-900 via-emerald-950 to-ink text-white border-2 border-emerald-400/30 text-center shadow-2xl my-12 relative overflow-hidden">
|
||||
<div className="absolute top-0 right-0 w-64 h-64 bg-emerald-500/10 blur-3xl rounded-full pointer-events-none" />
|
||||
<span className="text-xs font-extrabold tracking-widest uppercase text-emerald-400 block mb-2">
|
||||
GreenLens Pro iOS App
|
||||
{t.appEyebrow}
|
||||
</span>
|
||||
<h3 className="font-display text-2xl sm:text-3xl font-bold mt-1 mb-3 text-white">
|
||||
Identify Any Plant & Get Custom Care Plans
|
||||
{t.appTitle}
|
||||
</h3>
|
||||
<p className="text-white/80 text-sm sm:text-base max-w-[600px] mx-auto mb-6 leading-relaxed">
|
||||
Scan your houseplants in seconds, diagnose leaf diseases, and get automatic watering reminders tailored to your space.
|
||||
{t.appBody}
|
||||
</p>
|
||||
<a
|
||||
href="https://apps.apple.com/app/greenlens"
|
||||
@@ -415,7 +498,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-ink font-bold px-7 py-3.5 rounded-full shadow-xl hover:scale-105 transition-all duration-200"
|
||||
>
|
||||
<span>Start First Scan Free — No Account Needed</span>
|
||||
<span>{t.appButton}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -448,7 +531,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{post.relatedPosts && post.relatedPosts.length > 0 && (
|
||||
<div className="bg-white p-6 rounded-2xl border-2 border-emerald-600/20 shadow-sm">
|
||||
<div className="font-extrabold text-xs uppercase tracking-widest text-emerald-800 mb-4">
|
||||
Related Guides
|
||||
{t.relatedGuides}
|
||||
</div>
|
||||
<div className="space-y-4">
|
||||
{post.relatedPosts.map((related) => (
|
||||
@@ -479,7 +562,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{post.methodology && (
|
||||
<>
|
||||
<h2 className="text-sm font-extrabold uppercase tracking-widest text-emerald-800 mb-3">
|
||||
How this guide was compiled
|
||||
{t.howCompiled}
|
||||
</h2>
|
||||
<p className="text-[15px] leading-relaxed text-emerald-950/80">{post.methodology}</p>
|
||||
</>
|
||||
@@ -488,7 +571,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
{post.sources && post.sources.length > 0 && (
|
||||
<>
|
||||
<h2 className="text-sm font-extrabold uppercase tracking-widest text-emerald-800 mt-7 mb-3">
|
||||
Sources
|
||||
{t.sources}
|
||||
</h2>
|
||||
<ul className="space-y-2">
|
||||
{post.sources.map((source) => (
|
||||
@@ -509,8 +592,8 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
)}
|
||||
|
||||
<p className="text-xs text-emerald-950/50 mt-6">
|
||||
Published {post.publishedAt}
|
||||
{post.updatedAt ? ` · Last updated ${post.updatedAt}` : ''} · Written by {post.author.name},{' '}
|
||||
{t.published} {post.publishedAt}
|
||||
{post.updatedAt ? ` · ${t.lastUpdated} ${post.updatedAt}` : ''} · {t.writtenBy} {post.author.name},{' '}
|
||||
{post.author.role}
|
||||
</p>
|
||||
</section>
|
||||
@@ -519,7 +602,7 @@ export function BlogPostTemplate({ post }: { post: BlogPost }) {
|
||||
</main>
|
||||
|
||||
{/* Site Footer */}
|
||||
<SeoFooter locale="en" />
|
||||
<SeoFooter locale={post.locale} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -561,7 +561,7 @@ const seoPageProfiles: Record<string, SeoPageProfile> = {
|
||||
description: 'The English version of this page for plant identification and care.',
|
||||
},
|
||||
{
|
||||
href: '/wie-funktioniert-pflanzenerkennung',
|
||||
href: '/blog/wie-funktioniert-pflanzenerkennung',
|
||||
label: 'Wie funktioniert Pflanzenerkennung?',
|
||||
description: 'Wie die KI-Bestimmung technisch funktioniert und wo ihre Grenzen liegen.',
|
||||
},
|
||||
@@ -2669,7 +2669,7 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
description: 'Pflanze per Foto bestimmen — besser als mit Google.',
|
||||
},
|
||||
{
|
||||
href: '/zimmerpflanzen-mit-wenig-licht',
|
||||
href: '/blog/zimmerpflanzen-mit-wenig-licht',
|
||||
label: 'Zimmerpflanzen für wenig Licht',
|
||||
description: 'Die 10 robustesten Schattenpflanzen samt Licht-Guide.',
|
||||
},
|
||||
@@ -4018,359 +4018,6 @@ const contentClusterSeoPages: Record<string, SeoPageProfile> = {
|
||||
],
|
||||
},
|
||||
|
||||
'wie-funktioniert-pflanzenerkennung': {
|
||||
slug: 'wie-funktioniert-pflanzenerkennung',
|
||||
locale: 'de',
|
||||
templateIntent: 'identification',
|
||||
metaTitle: 'Wie funktioniert Pflanzenerkennung per KI wirklich?',
|
||||
metaDescription:
|
||||
'Wie erkennt eine App eine Pflanze anhand eines Fotos? So funktioniert KI-Pflanzenerkennung technisch, wie genau sie wirklich ist und wie dein Foto zum besten Ergebnis führt.',
|
||||
canonical: '/wie-funktioniert-pflanzenerkennung',
|
||||
h1: 'Wie funktioniert Pflanzenerkennung per KI wirklich?',
|
||||
tagline: 'Ein Foto, und Sekunden später ein Artname. Was dahinter passiert — und wie zuverlässig das wirklich ist.',
|
||||
heroImage: '/hero-plant.png',
|
||||
heroImageAlt: 'Smartphone fotografiert das Blatt einer Zimmerpflanze zur Bestimmung per KI',
|
||||
directAnswer:
|
||||
'KI-Pflanzenerkennung nutzt Computer Vision: Ein Modell vergleicht Blattform, Aderung, Oberflächentextur, Wuchsform, Blütenstruktur und Farbverteilung deines Fotos mit einem Trainingsdatensatz aus teils mehreren Millionen Pflanzenbildern und gibt das wahrscheinlichste Ergebnis mit einem Konfidenz-Wert zurück. Unter guten Bedingungen — scharfes Foto, gute Beleuchtung, häufige Art — erreichen moderne Modelle 90–97 % Trefferquote. Bei schlechten Fotos oder seltenen Arten kann die Quote auf unter 60 % sinken.',
|
||||
definitionBlock:
|
||||
'Pflanzenerkennung per KI ist eine Anwendung von Computer Vision, einem Teilgebiet der Künstlichen Intelligenz, das Bilder automatisch analysiert und interpretiert. Statt eines Bestimmungsschlüssels mit einzeln abgefragten Merkmalen vergleicht ein trainiertes Modell das gesamte Foto mit bekannten Mustern aus einem Trainingsdatensatz und schlägt die wahrscheinlichste Art vor.',
|
||||
lastUpdated: 'August 2026',
|
||||
lastUpdatedIso: '2026-08-05',
|
||||
includeAppSchema: true,
|
||||
contentSections: [
|
||||
{
|
||||
eyebrow: 'Technik dahinter',
|
||||
title: 'Was die KI im Foto konkret analysiert',
|
||||
body: 'Das Modell vergleicht mehrere Merkmale gleichzeitig mit seinem Trainingsdatensatz und gibt das wahrscheinlichste Ergebnis mit einem Konfidenz-Prozentwert zurück.',
|
||||
bullets: [
|
||||
'Blattform & Randmuster — das primäre Erkennungsmerkmal vieler Arten.',
|
||||
'Blattaderung (Venation) — unterscheidet nahe verwandte Gattungen.',
|
||||
'Oberflächentextur — glatt, filzig, gewachst oder bestachelt.',
|
||||
'Wuchsform — Kletterpflanze, Rosette, aufrecht oder hängend.',
|
||||
'Blütenstruktur — falls vorhanden, das stärkste Einzelmerkmal.',
|
||||
'Farbverteilung — Grüntöne, Panaschierung oder Verfärbungen.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Bevor du scannst',
|
||||
title: 'Was die Erkennungsrate zuverlässig zerstört',
|
||||
body: 'Selbst ein gutes Modell versagt bei einem schlecht aufgenommenen Foto. Diese Fehler senken die Trefferquote am stärksten.',
|
||||
bullets: [
|
||||
'Vogelperspektive auf einen ganzen Strauch ohne Detailblick auf ein einzelnes Blatt.',
|
||||
'Starke Schatten oder direktes Gegenlicht.',
|
||||
'Zu großer Abstand — das Blatt nimmt weniger als 40 % des Bildes ein.',
|
||||
'Verwackelte oder unscharfe Aufnahmen.',
|
||||
'Fotos von bereits toten oder extrem verblassten Blättern.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Grenzen kennen',
|
||||
title: 'Wann KI-Pflanzenerkennung an ihre Grenzen stößt',
|
||||
body: 'KI-Pflanzenerkennung ist beeindruckend, aber nicht unfehlbar. Bei diesen Fällen lohnt sich ein zweiter Blick, bevor du dich auf ein Ergebnis verlässt.',
|
||||
bullets: [
|
||||
'Jungpflanzen: Sämlinge haben noch keine artspezifischen Blattmerkmale.',
|
||||
'Stark mutierte Kultivare: Ein buntblättriger Kultivar kann optisch völlig anders aussehen als der Wildtyp.',
|
||||
'Seltene, endemische Arten mit wenig Trainingsdaten im Modell.',
|
||||
'Krankheits-überlagerte Blätter: Stark verfärbte oder nekrotische Blätter erschweren die Formanalyse.',
|
||||
'Fotos von Fotos: Screenshots aus dem Internet liefern schlechtere Ergebnisse als direkte Kameraaufnahmen.',
|
||||
],
|
||||
},
|
||||
],
|
||||
featureTable: {
|
||||
title: 'Pflanzenerkennung im Vergleich: Google Lens oder eine spezialisierte App',
|
||||
alternativeLabel: 'Google Lens / allgemeine Bildersuche',
|
||||
rows: [
|
||||
{
|
||||
feature: 'Artgenauigkeit',
|
||||
greenlens: 'Nutzt einen botanischen Spezial-Datensatz, der auf Pflanzenarten trainiert ist.',
|
||||
alternative: 'Guter Allgemeinwert ohne botanischen Fokus.',
|
||||
},
|
||||
{
|
||||
feature: 'Pflegeanleitung',
|
||||
greenlens: 'Liefert direkt nach dem Scan Hinweise zu Licht, Wasser und Standort.',
|
||||
alternative: 'Keine Pflegeinformationen — nur der Name.',
|
||||
},
|
||||
{
|
||||
feature: 'Krankheitsdiagnose',
|
||||
greenlens: 'Eigener Gesundheitscheck für Symptome wie gelbe Blätter oder braune Spitzen.',
|
||||
alternative: 'Keine Diagnosefunktion vorhanden.',
|
||||
},
|
||||
{
|
||||
feature: 'Giftigkeit-Check',
|
||||
greenlens: 'Giftigkeitshinweis für Kinder und Haustiere direkt im Scan-Ergebnis.',
|
||||
alternative: 'Muss separat recherchiert werden.',
|
||||
},
|
||||
{
|
||||
feature: 'Kosten',
|
||||
greenlens: 'Erster Scan gratis ohne Anmeldung, danach begrenzte Scans und optional GreenLens Pro.',
|
||||
alternative: 'Kostenlos nutzbar.',
|
||||
},
|
||||
],
|
||||
},
|
||||
greenLensIf: [
|
||||
'Du willst nicht nur den Artnamen, sondern direkt Pflegehinweise zu deiner Pflanze.',
|
||||
'Du bist unsicher, ob deine Pflanze für Kinder oder Haustiere giftig ist.',
|
||||
'Du möchtest bei Symptomen wie gelben Blättern gleich einen Gesundheitscheck.',
|
||||
],
|
||||
notBestIf: [
|
||||
'Du willst seltene Wildpflanzen für Citizen Science dokumentieren — dafür sind PlantNet oder iNaturalist mit ihrer großen Fachcommunity besser geeignet.',
|
||||
'Du brauchst nur einmal schnell einen groben Namen ohne weitere Infos — dafür reicht Google Lens.',
|
||||
],
|
||||
offer: {
|
||||
eyebrow: 'Zum Ausprobieren',
|
||||
title: 'Erst scannen, dann entscheiden',
|
||||
body:
|
||||
'Fotografier eine Pflanze und sieh dir an, was du bekommst: Artname, Pflegehinweise und bei Bedarf einen Gesundheitscheck. Ohne Anmeldung, ohne Zahlungsdaten.',
|
||||
terms:
|
||||
'Ein Scan gratis, ganz ohne Anmeldung. Nach der Anmeldung drei weitere. Erst danach brauchst du GreenLens Pro — Monats- oder Jahresabo, die aktuellen Preise stehen im App Store. Verlängert sich automatisch, jederzeit über die iPhone-Einstellungen kündbar.',
|
||||
ctaLabel: 'Ersten Scan gratis starten — ohne Anmeldung',
|
||||
},
|
||||
howToName: 'So gelingt das perfekte Erkennungsfoto',
|
||||
howToSteps: [
|
||||
{
|
||||
name: 'Ein vollständiges Blatt zeigen',
|
||||
text: 'Zeige ein einzelnes, gesundes und voll entwickeltes Blatt ohne Überlappung mit anderen Blättern.',
|
||||
},
|
||||
{
|
||||
name: 'Bei natürlichem Tageslicht fotografieren',
|
||||
text: 'Kein Blitz verwenden. Indirektes Tageslicht, zum Beispiel neben dem Fenster, liefert die besten Ergebnisse.',
|
||||
},
|
||||
{
|
||||
name: 'Auf kontrastreichen Hintergrund achten',
|
||||
text: 'Ein Blatt auf weißem Papier zu fotografieren erhöht die Erkennungsgenauigkeit deutlich.',
|
||||
},
|
||||
{
|
||||
name: 'Scharf fokussieren',
|
||||
text: 'Auf dem Touchscreen auf das Blatt tippen, damit die Kamera darauf fokussiert statt auf den Hintergrund.',
|
||||
},
|
||||
{
|
||||
name: 'Blüten mitfotografieren',
|
||||
text: 'Blüht die Pflanze, unbedingt zusätzlich die Blüte fotografieren — das erhöht die Trefferquote spürbar.',
|
||||
},
|
||||
],
|
||||
faqs: [
|
||||
{
|
||||
question: 'Wie genau ist KI-Pflanzenerkennung wirklich?',
|
||||
answer:
|
||||
'Bei guten Fotos und häufigen Arten erreichen moderne Apps 90–97 % Trefferquote. Bei schlechten Bildern oder seltenen Arten kann die Quote auf unter 60 % sinken. Die Qualität des Fotos beeinflusst das Ergebnis stärker als fast jeder andere Faktor.',
|
||||
},
|
||||
{
|
||||
question: 'Kann eine App auch giftige Pflanzen erkennen?',
|
||||
answer:
|
||||
'Ja — und das ist eine der wertvollsten Funktionen. Bei Verdacht auf eine Vergiftung, besonders bei Kindern, solltest du dich aber nie allein auf eine App verlassen, sondern immer zusätzlich die Giftnotrufzentrale kontaktieren.',
|
||||
},
|
||||
{
|
||||
question: 'Kann ich Pflanzen auch ohne Internet per App erkennen?',
|
||||
answer:
|
||||
'Das hängt von der jeweiligen App ab. Manche speichern ein lokales Offline-Modell für häufige Arten, für seltene Arten ist in der Regel eine Internetverbindung nötig. GreenLens benötigt für Scans und den Gesundheitscheck eine Internetverbindung.',
|
||||
},
|
||||
{
|
||||
question: 'Warum erkennt die App meine Pflanze nicht sicher?',
|
||||
answer:
|
||||
'Häufige Gründe sind ein unscharfes oder schlecht beleuchtetes Foto, eine Jungpflanze ohne artspezifische Merkmale, ein stark mutierter Kultivar oder eine seltene Art mit wenig Trainingsdaten. Versuch es mit mehreren Fotos aus verschiedenen Winkeln und, falls vorhanden, mit Blüte oder Stängel.',
|
||||
},
|
||||
{
|
||||
question: 'Ist der erste Scan bei GreenLens kostenlos?',
|
||||
answer:
|
||||
'Ja. Ein Scan ist gratis, ganz ohne Anmeldung. Nach der Anmeldung bekommst du drei weitere. Danach brauchst du GreenLens Pro — Monats- oder Jahresabo mit den jeweils aktuellen Preisen im App Store, jederzeit über die iPhone-Einstellungen kündbar.',
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/zimmerpflanzen-mit-wenig-licht',
|
||||
label: 'Zimmerpflanzen für wenig Licht',
|
||||
description: 'Die 10 robustesten Schattenpflanzen samt Licht-Guide.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-erkennen-app',
|
||||
label: 'Pflanzen erkennen App',
|
||||
description: 'Foto scannen, Artname und Pflegeplan sofort erhalten.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-bestimmen',
|
||||
label: 'Pflanzen bestimmen',
|
||||
description: 'Der Hauptvergleich für Pflanzenbestimmung per Foto und Google Lens.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-krankheiten-erkennen',
|
||||
label: 'Pflanzenkrankheiten erkennen',
|
||||
description: 'Symptome wie gelbe Blätter, Flecken oder Schädlinge diagnostizieren.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
'zimmerpflanzen-mit-wenig-licht': {
|
||||
slug: 'zimmerpflanzen-mit-wenig-licht',
|
||||
locale: 'de',
|
||||
templateIntent: 'care',
|
||||
metaTitle: 'Zimmerpflanzen für wenig Licht: Die 10 besten Schattenpflanzen',
|
||||
metaDescription:
|
||||
'Welche Zimmerpflanzen kommen mit wenig Licht aus? Die 10 robustesten Arten für dunkle Ecken, Nordfenster und Flure — mit Pflege-Tipps und Symptom-Check.',
|
||||
canonical: '/zimmerpflanzen-mit-wenig-licht',
|
||||
h1: 'Zimmerpflanzen für wenig Licht: Die 10 besten Schattenpflanzen (+ Licht-Guide)',
|
||||
tagline: 'Nicht jede Wohnung hat ein lichtdurchflutetes Südfenster. Diese Pflanzen wachsen trotzdem.',
|
||||
heroImage: '/hero-image.png',
|
||||
heroImageAlt: 'Robuste grüne Schattenpflanze wie Bogenhanf in einer dunklen Zimmerecke fernab vom Fenster',
|
||||
directAnswer:
|
||||
'Zimmerpflanzen wie Zamioculcas, Bogenhanf, Schusterpalme, Efeutute und Einblatt kommen mit wenig Licht aus, weil sie sich evolutionär an das schattige Unterholz von Tropenwäldern angepasst haben. Als Faustregel gilt: Unter rund 300 Lux stellen selbst schattentolerante Pflanzen ohne Pflanzenlampe das Wachstum ein. Ein Lichtmessgerät brauchst du dafür nicht — ein einfacher Schattentest mit der Hand reicht, um den eigenen Standort grob einzuschätzen.',
|
||||
definitionBlock:
|
||||
'„Wenig Licht" bedeutet nicht „kein Licht". Jede grüne Pflanze braucht Photonen für die Photosynthese. In der Botanik wird Beleuchtungsstärke in Lux gemessen: Helle Standorte liegen über 2.000 Lux, Halbschatten bei 1.000–2.000 Lux, Schatten bei 300–800 Lux. Schattenpflanzen sind Arten, die mit deutlich reduzierter Photosynthese-Aktivität auskommen und deshalb auch dunklere Standorte verzeihen.',
|
||||
lastUpdated: 'August 2026',
|
||||
lastUpdatedIso: '2026-08-05',
|
||||
includeAppSchema: true,
|
||||
contentSections: [
|
||||
{
|
||||
eyebrow: 'Einordnen',
|
||||
title: 'Was „wenig Licht" für Zimmerpflanzen wirklich bedeutet',
|
||||
body: 'Die Lichtstärke wird in Lux gemessen. Diese Faustregel hilft bei der Einordnung deines Standorts.',
|
||||
bullets: [
|
||||
'Helle Standorte: über 2.000 Lux — geeignet für Sonnenanbeter wie Sukkulenten, Kakteen und Ficus.',
|
||||
'Halbschatten: 1.000–2.000 Lux — Bereich für Monstera, Efeutute und Philodendron.',
|
||||
'Schatten / wenig Licht: 300–800 Lux — Bereich für Bogenhanf, Zamioculcas, Einblatt und Schusterpalme.',
|
||||
'Unter 300 Lux: Ohne künstliche Pflanzenlampe stellen selbst schattentolerante Pflanzen das Wachstum ein.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Top 10',
|
||||
title: 'Die robustesten Zimmerpflanzen für dunkle Standorte',
|
||||
body: 'Diese zehn Arten gelten als besonders schattentolerant und kommen mit deutlich reduziertem Lichtbedarf aus.',
|
||||
bullets: [
|
||||
'Zamioculcas zamiifolia (Glücksfeder): 300–600 Lux, extrem selten gießen — im Schatten nur alle 4–6 Wochen.',
|
||||
'Sansevieria / Dracaena trifasciata (Bogenhanf): 400–800 Lux, verträgt fast jeden Standort, Staunässe vermeiden.',
|
||||
'Aspidistra elatior (Schusterpalme): 300–700 Lux, ideal für kühle, schattige Flure und Treppenhäuser.',
|
||||
'Epipremnum aureum (Efeutute): 500–1.000 Lux, bunte Blattmuster verblassen im Schatten leicht, Wachstum bleibt stabil.',
|
||||
'Spathiphyllum (Einblatt): 400–800 Lux, zeigt Durst durch hängende Blätter, erholt sich nach dem Gießen schnell.',
|
||||
'Aglaonema (Kolbenfaden): 500–800 Lux bei dunkelgrünen Sorten, Zugluft und Temperaturen unter 15 °C vermeiden.',
|
||||
'Chamaedorea elegans (Bergpalme): 600–1.000 Lux, regelmäßig besprühen beugt Spinnmilben vor.',
|
||||
'Philodendron hederaceum (Herzblatt-Philodendron): 500–900 Lux, Substrat zwischen den Gießvorgängen antrocknen lassen.',
|
||||
'Calathea / Goeppertia (Korbmarante): 600–1.000 Lux, braucht hohe Luftfeuchtigkeit und kalkarmes Wasser.',
|
||||
'Chlorophytum comosum (Grünlilie): 500–1.200 Lux, sehr anpassungsfähig und verzeiht Pflegefehler.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Warnsignale',
|
||||
title: 'Woran du Lichtmangel frühzeitig erkennst',
|
||||
body: 'Bekommt eine Pflanze an ihrem Standort zu wenig Licht, zeigt sie meist deutliche Signale, bevor es kritisch wird.',
|
||||
bullets: [
|
||||
'Geilwuchs (Vergeilung): lange, dünne Triebe mit großen Blattabständen, die dem Licht entgegenwachsen.',
|
||||
'Verblasste Panaschierung: bunte Blattmuster werden wieder rein grün, weil die Pflanze mehr Chlorophyll bildet.',
|
||||
'Stagnierendes Wachstum: über Monate hinweg treiben keine neuen Blätter mehr aus.',
|
||||
'Braune oder gelbe Blätter: Durch den verlangsamten Stoffwechsel verbraucht die Pflanze kaum Wasser — wird normal weitergegossen, droht Wurzelfäule.',
|
||||
],
|
||||
},
|
||||
],
|
||||
featureTable: {
|
||||
title: 'Den passenden Lichtbedarf finden: App-Katalog oder eigene Recherche',
|
||||
alternativeLabel: 'Eigene Recherche',
|
||||
rows: [
|
||||
{
|
||||
feature: 'Lichtbedarf pro Art',
|
||||
greenlens: 'Der Katalog von rund 240 Pflanzenarten zeigt den Lichtbedarf direkt im Pflegeprofil — wenig Licht, Halbschatten, helles Indirektlicht oder direkte Sonne.',
|
||||
alternative: 'Angaben aus verschiedenen Quellen zusammensuchen, die sich oft widersprechen.',
|
||||
},
|
||||
{
|
||||
feature: 'Vor dem Kauf prüfen',
|
||||
greenlens: 'Pflanze im Katalog nachschlagen oder direkt im Laden scannen, bevor sie mit nach Hause kommt.',
|
||||
alternative: 'Erst zuhause merken, dass der Standort nicht passt.',
|
||||
},
|
||||
{
|
||||
feature: 'Gießrhythmus anpassen',
|
||||
greenlens: 'Der Pflegeplan berücksichtigt den reduzierten Wasserbedarf schattentoleranter Arten.',
|
||||
alternative: 'Gießintervall bleibt gleich, obwohl der Standort dunkler ist.',
|
||||
},
|
||||
{
|
||||
feature: 'Symptome einordnen',
|
||||
greenlens: 'Der Gesundheitscheck hilft, Vergeilung, verblasste Panaschierung oder braune Blätter einzuordnen.',
|
||||
alternative: 'Symptome müssen selbst gedeutet werden.',
|
||||
},
|
||||
],
|
||||
},
|
||||
greenLensIf: [
|
||||
'Du willst vor dem Kauf wissen, ob eine Pflanze an deinem dunklen Standort überhaupt wachsen kann.',
|
||||
'Du bist unsicher, wie du den Lichtwert deiner Wohnung ohne Messgerät einschätzt.',
|
||||
'Deine Schattenpflanze zeigt Vergeilung oder verblasste Blätter und du willst die Ursache verstehen.',
|
||||
],
|
||||
notBestIf: [
|
||||
'Dein Standort liegt unter 300 Lux und hat keine Pflanzenlampe — dann hilft auch die robusteste Art nicht dauerhaft.',
|
||||
'Du suchst reine Sonnenanbeter wie Kakteen oder Sukkulenten — die brauchen einen hellen Platz.',
|
||||
],
|
||||
offer: {
|
||||
eyebrow: 'Vor dem Kauf prüfen',
|
||||
title: 'Passt die Pflanze zu deinem Standort?',
|
||||
body:
|
||||
'Scanne eine Pflanze im Laden oder durchstöbere den Katalog von zu Hause aus. Du siehst direkt, ob der Lichtbedarf zu deiner dunklen Ecke passt — samt vollständiger Pflegeempfehlung.',
|
||||
terms:
|
||||
'Ein Scan gratis, ganz ohne Anmeldung. Nach der Anmeldung drei weitere. Erst danach brauchst du GreenLens Pro — Monats- oder Jahresabo, die aktuellen Preise stehen im App Store. Verlängert sich automatisch, jederzeit über die iPhone-Einstellungen kündbar.',
|
||||
ctaLabel: 'Ersten Scan gratis starten — ohne Anmeldung',
|
||||
},
|
||||
howToName: 'So schätzt du die Lichtstärke deines Standorts ein',
|
||||
howToSteps: [
|
||||
{
|
||||
name: 'Schattentest machen',
|
||||
text: 'Halte deine Hand mittags etwa 30 cm über die Fläche. Ein scharfer, klar umrissener Schatten bedeutet helles Licht, ein weicher verschwommener Schatten Halbschatten, ein kaum erkennbarer Schatten wenig Licht.',
|
||||
},
|
||||
{
|
||||
name: 'Fensterausrichtung beachten',
|
||||
text: 'Südfenster bekommen den ganzen Tag direktes Licht, Ostfenster sanftes Morgenlicht, Westfenster heiße Nachmittagssonne. Nordfenster liefern das weichste, gleichmäßigste Licht im Halbschatten- bis Schattenbereich.',
|
||||
},
|
||||
{
|
||||
name: 'Abstand zum Fenster einbeziehen',
|
||||
text: 'Die Lichtintensität nimmt mit der Entfernung deutlich ab — zwei Meter von einem hellen Fenster entfernt liegt oft schon im Bereich „wenig Licht".',
|
||||
},
|
||||
{
|
||||
name: 'Jahreszeit berücksichtigen',
|
||||
text: 'Ein Standort, der im Sommer als Halbschatten durchgeht, kann im Winter zu wenig Licht werden, weil die Sonne tiefer steht und die Tage kürzer sind.',
|
||||
},
|
||||
{
|
||||
name: 'Passende Pflanze wählen',
|
||||
text: 'Mit der eingeschätzten Lichtstufe im GreenLens-Katalog nachsehen, welche der rund 240 Arten realistisch an diesem Standort gedeihen.',
|
||||
},
|
||||
],
|
||||
faqs: [
|
||||
{
|
||||
question: 'Kann eine Zimmerpflanze ohne Fenster im Flur überleben?',
|
||||
answer:
|
||||
'Nein, ganz ohne Tageslicht oder künstliche Pflanzenlampe stirbt jede Pflanze nach einigen Wochen bis Monaten ab. Schattenpflanzen wie Bogenhanf oder Zamioculcas überleben jedoch bei schwachem Restlicht durch Türen oder Nebenräume.',
|
||||
},
|
||||
{
|
||||
question: 'Warum vertrocknen die Blattspitzen bei Schattenpflanzen im Winter?',
|
||||
answer:
|
||||
'Im Winter sinkt die Luftfeuchtigkeit durch Heizungsluft stark ab. Pflanzen wie Calathea oder Einblatt bekommen dann leicht braune Blattspitzen. Ein Luftbefeuchter oder regelmäßiges Besprühen hilft.',
|
||||
},
|
||||
{
|
||||
question: 'Muss ich Pflanzen an dunklen Standorten weniger gießen?',
|
||||
answer:
|
||||
'Ja. Das ist der häufigste Fehler. Da Pflanzen im Schatten weniger Photosynthese betreiben, verbrauchen sie deutlich weniger Wasser und die Erde bleibt viel länger feucht. Prüfe vor jedem Gießen mit der Fingerprobe die ersten 3–4 cm Erde.',
|
||||
},
|
||||
{
|
||||
question: 'Wie viele Pflanzenarten kennt der GreenLens-Katalog?',
|
||||
answer:
|
||||
'Der kuratierte Katalog umfasst aktuell rund 240 Pflanzenarten mit Angaben zu Lichtbedarf, Gießrhythmus und weiteren Pflegehinweisen — Tendenz steigend.',
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/wie-funktioniert-pflanzenerkennung',
|
||||
label: 'Wie funktioniert Pflanzenerkennung?',
|
||||
description: 'Wie die KI-Bestimmung technisch funktioniert und wo ihre Grenzen liegen.',
|
||||
},
|
||||
{
|
||||
href: '/zimmerpflanzen-bestimmen',
|
||||
label: 'Zimmerpflanzen bestimmen',
|
||||
description: 'Monstera, Efeutute & Co. per Foto bestimmen und Pflegeplan erhalten.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-pflege-app',
|
||||
label: 'Pflanzen Pflege App',
|
||||
description: 'Gießerinnerungen und Pflegeplan, abgestimmt auf Standort und Art.',
|
||||
},
|
||||
{
|
||||
href: '/gelbe-blaetter-zimmerpflanze',
|
||||
label: 'Gelbe Blätter erkennen',
|
||||
description: 'Wenn eine Schattenpflanze trotz wenig Licht gelbe Blätter bekommt.',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
const allSeoPages = {
|
||||
@@ -4416,8 +4063,6 @@ export const germanSeoPageSlugs = [
|
||||
'giessplan-zimmerpflanzen',
|
||||
'pflanzen-diagnose',
|
||||
'welche-pflanze-ist-das',
|
||||
'wie-funktioniert-pflanzenerkennung',
|
||||
'zimmerpflanzen-mit-wenig-licht',
|
||||
] as const
|
||||
|
||||
export function getSeoPageBySlug(slug: string): SeoPageProfile | undefined {
|
||||
|
||||
@@ -90,7 +90,7 @@ export const spanishSeoPageProfiles: Record<string, SeoPageProfile> = {
|
||||
description: 'Analiza sintomas y recibe el siguiente paso mas seguro.',
|
||||
},
|
||||
{
|
||||
href: '/es/como-funciona-el-reconocimiento-de-plantas-por-ia',
|
||||
href: '/blog/como-funciona-el-reconocimiento-de-plantas-por-ia',
|
||||
label: 'Como funciona el reconocimiento de plantas por IA',
|
||||
description: 'Entiende que hay detras del escaneo antes de confiar en el resultado.',
|
||||
},
|
||||
@@ -181,7 +181,7 @@ export const spanishSeoPageProfiles: Record<string, SeoPageProfile> = {
|
||||
description: 'Cuando una planta muestra sintomas, revisa la causa probable.',
|
||||
},
|
||||
{
|
||||
href: '/es/plantas-de-interior-poca-luz',
|
||||
href: '/blog/plantas-de-interior-poca-luz',
|
||||
label: 'Plantas de interior con poca luz',
|
||||
description: 'Elige especies que toleren el rincon mas oscuro de tu casa.',
|
||||
},
|
||||
@@ -447,368 +447,6 @@ export const spanishSeoPageProfiles: Record<string, SeoPageProfile> = {
|
||||
],
|
||||
},
|
||||
|
||||
'como-funciona-el-reconocimiento-de-plantas-por-ia': {
|
||||
slug: 'como-funciona-el-reconocimiento-de-plantas-por-ia',
|
||||
locale: 'es',
|
||||
metaTitle: '¿Cómo Funciona Realmente el Reconocimiento de Plantas por IA?',
|
||||
metaDescription:
|
||||
'¿Cómo identifica una app la especie de una planta a partir de una sola foto? Explicamos cómo funciona la IA detrás del reconocimiento de plantas, qué tan precisa es realmente y cómo sacar el mejor resultado en cada escaneo.',
|
||||
canonical: '/es/como-funciona-el-reconocimiento-de-plantas-por-ia',
|
||||
h1: '¿Cómo Funciona Realmente el Reconocimiento de Plantas por IA?',
|
||||
tagline: 'La IA acierta el nombre en segundos. Lo dificil es saber cuando conviene dudar de ella.',
|
||||
directAnswer:
|
||||
'Las apps de reconocimiento de plantas usan redes neuronales convolucionales entrenadas con millones de fotos etiquetadas para comparar tu imagen con miles de especies y devolver una lista de coincidencias con un porcentaje de confianza. Con una foto nitida de una especie comun, los modelos bien entrenados superan el 95% de precision.',
|
||||
definitionBlock:
|
||||
'El reconocimiento de plantas por IA usa una rama del aprendizaje profundo llamada Redes Neuronales Convolucionales (CNN). El modelo detecta y pondera caracteristicas visuales como la forma de la hoja, el margen, la venacion, la textura y la estructura floral, y las compara contra millones de imagenes de entrenamiento para devolver las especies mas probables.',
|
||||
lastUpdated: 'Agosto 2026',
|
||||
lastUpdatedIso: '2026-08-05',
|
||||
includeAppSchema: true,
|
||||
heroImage: '/hero-image.png',
|
||||
heroImageAlt:
|
||||
'Persona fotografiando una hoja con el movil para identificarla mediante inteligencia artificial',
|
||||
contentSections: [
|
||||
{
|
||||
eyebrow: 'Como funciona',
|
||||
title: 'Que pasa en los dos segundos tras la foto',
|
||||
body:
|
||||
'La IA no "ve" la planta como tu. Detecta y pondera cientos de caracteristicas visuales de forma simultanea, entrenadas sobre imagenes de jardines botanicos, bases de datos de ciencia ciudadana como iNaturalist y herbarios digitales.',
|
||||
bullets: [
|
||||
'Forma de la hoja: lobulada, ovalada, lanceolada, palmeada, lineal.',
|
||||
'Margen foliar: liso, serrado, ondulado, dentado.',
|
||||
'Venacion: pinnada, palmeada, paralela.',
|
||||
'Textura superficial, distribucion del color y estructura floral, si existe.',
|
||||
'El modelo devuelve una lista de las 3 a 5 especies mas probables, cada una con un porcentaje de confianza.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Gratis vs. de pago',
|
||||
title: 'Que suele incluir cada nivel',
|
||||
body:
|
||||
'La identificacion gratuita cubre la mayoria de los usos cotidianos. Esto es lo que suele estar en cada nivel, en la categoria en general.',
|
||||
bullets: [
|
||||
'Gratis: nombre comun y cientifico, resumen basico de cuidados, aviso de toxicidad y acceso a foros.',
|
||||
'De pago: diagnostico de enfermedades por foto, escaneos ilimitados, identificacion detallada de plagas, diario de crecimiento y modo sin conexion.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Casos de uso',
|
||||
title: '5 situaciones donde esta tecnologia marca la diferencia',
|
||||
body: 'Del regalo sin etiqueta a la compra en el vivero, estas son las situaciones donde escanear ahorra tiempo y evita errores.',
|
||||
bullets: [
|
||||
'La planta misteriosa: sin nombre ni etiqueta, el escaneo te da la especie y sus necesidades basicas al instante.',
|
||||
'"¿Es venenosa?": consulta la ficha de toxicidad de inmediato, aunque conviene llamar siempre al centro de toxicologia ante cualquier duda real.',
|
||||
'Identificacion en rutas y naturaleza: ayuda a distinguir bayas o plantas invasoras, pero verifica siempre con una segunda fuente antes de tocar o consumir algo silvestre.',
|
||||
'Compras mas inteligentes en el vivero: escanea el ejemplar del mostrador antes de comprarlo para saber si se adapta a tu espacio.',
|
||||
'Aprender con los ninos: convierte un paseo en un juego de identificacion natural.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Consejos practicos',
|
||||
title: 'Como hacer la foto perfecta para maxima precision',
|
||||
body: 'La precision es cosa de dos: la IA solo puede trabajar con lo que le das.',
|
||||
bullets: [
|
||||
'Fotografia una sola hoja bien desarrollada, con luz natural y sin flash, llenando al menos el 50% del encuadre.',
|
||||
'Un fondo blanco liso y una flor visible, si la hay, mejoran mucho la precision.',
|
||||
'Evita vistas aereas de toda la planta, contraluz, plantulas muy jovenes, capturas de pantalla y hojas muy enfermas o necroticas.',
|
||||
'Si la confianza es baja, prueba con el enves de la hoja, una seccion del tallo o el cepellon si la planta esta recien trasplantada.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Comparativa',
|
||||
title: 'Reconocimiento por IA vs. Google Lens',
|
||||
body: 'Google Lens tambien identifica plantas, y es gratis. La diferencia esta en lo que ocurre despues del nombre.',
|
||||
bullets: [
|
||||
'Precision de especie: Google Lens usa conocimiento general; una app dedicada usa un conjunto de datos botanico especializado.',
|
||||
'Instrucciones de cuidado y diagnostico de enfermedades: ausentes en Google Lens, disponibles justo despues del escaneo en una app especializada.',
|
||||
'Comprobacion de toxicidad: indirecta via busqueda web en Google Lens, directa en los resultados de una app dedicada.',
|
||||
'Si solo quieres un nombre ocasional, Google Lens basta. Si te importan tus plantas, una app especializada aporta mucho mas.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Limites',
|
||||
title: 'Las plantas mas dificiles de identificar',
|
||||
body: 'Ninguna app es perfecta. Estas son las situaciones donde incluso la mejor tecnologia tiene dificultades.',
|
||||
bullets: [
|
||||
'Cultivares variegados: escanea la hoja mas "normal" de la planta.',
|
||||
'Plantulas: espera hasta que aparezcan las primeras hojas verdaderas.',
|
||||
'Especies muy raras: usa iNaturalist para identificacion comunitaria.',
|
||||
'Hojas muy enfermas: fotografia una hoja sana si esta disponible.',
|
||||
'Suculentas y cactus de aspecto similar: fotografia desde multiples angulos.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Siguiente frontera',
|
||||
title: 'Diagnostico de enfermedades de plantas',
|
||||
body: 'Identificar la especie es solo el comienzo. Las apps avanzadas tambien analizan sintomas visibles para sugerir la causa mas probable.',
|
||||
bullets: [
|
||||
'Hojas amarillas: exceso de riego, falta de agua, deficiencia nutricional o dano por plagas.',
|
||||
'Puntas marrones: baja humedad, toxicidad por fluor o falta de riego.',
|
||||
'Polvo blanco: oidio (hongos) o depositos minerales del agua dura.',
|
||||
'Residuo pegajoso: melaza de pulgones o cochinillas.',
|
||||
],
|
||||
},
|
||||
],
|
||||
featureTable: {
|
||||
title: 'Que distingue a GreenLens de un reconocimiento de plantas generico',
|
||||
alternativeLabel: 'Apps de identificacion genericas',
|
||||
rows: [
|
||||
{
|
||||
feature: 'Precision por especie',
|
||||
greenlens: 'Modelo apoyado en un conjunto de datos botanico especializado, con buen rendimiento en especies comunes.',
|
||||
alternative: 'Motores de proposito general con menos precision en flora.',
|
||||
},
|
||||
{
|
||||
feature: 'Despues del escaneo',
|
||||
greenlens: 'Conecta el resultado con cuidado, riego y diagnostico de salud en el mismo flujo.',
|
||||
alternative: 'Suele terminar en el nombre de la especie.',
|
||||
},
|
||||
{
|
||||
feature: 'Catalogo de cuidado',
|
||||
greenlens: 'Fichas verificadas a mano para unas 240 especies, en crecimiento cada mes.',
|
||||
alternative: 'Presume reconocer miles de especies, pero sin fichas de cuidado verificadas.',
|
||||
},
|
||||
],
|
||||
},
|
||||
greenLensIf: [
|
||||
'Quieres saber que planta tienes delante y como cuidarla, no solo su nombre.',
|
||||
'Te interesa entender que hace la IA detras del escaneo antes de confiar en el resultado.',
|
||||
'Buscas una segunda opinion rapida antes de comprar una planta en el vivero.',
|
||||
],
|
||||
notBestIf: [
|
||||
'Necesitas identificacion botanica profesional certificada para fines cientificos.',
|
||||
'Quieres verificar si una planta silvestre es segura para comer — consulta siempre una guia de campo o un experto, nunca solo una app.',
|
||||
],
|
||||
offer: {
|
||||
eyebrow: 'Pruebalo primero',
|
||||
title: 'Escanea y compruebalo tu mismo',
|
||||
body:
|
||||
'Fotografia una hoja y mira lo que recibes antes de decidir nada: nombre de la especie, cuidados y una revision de salud si la planta muestra sintomas. Sin cuenta y sin datos de pago.',
|
||||
terms:
|
||||
'Un escaneo gratis, sin crear cuenta. Tres mas despues de registrarte. A partir de ahi necesitas GreenLens Pro: suscripcion mensual o anual, con los precios actuales en la App Store. Se renueva automaticamente y puedes cancelar cuando quieras desde los ajustes del iPhone.',
|
||||
ctaLabel: 'Haz tu primer escaneo gratis — sin cuenta',
|
||||
},
|
||||
faqs: [
|
||||
{
|
||||
question: '¿Qué apps ofrecen la mejor identificación gratuita de plantas?',
|
||||
answer:
|
||||
'GreenLens Pro, PlantNet e iNaturalist ofrecen una identificación gratuita potente. La precisión depende mucho de la calidad de la foto.',
|
||||
},
|
||||
{
|
||||
question: '¿Pueden las apps identificar plantas a partir de una foto de mi galería?',
|
||||
answer:
|
||||
'Sí. Todas las principales apps de identificación de plantas aceptan imágenes de tu galería, no solo fotos tomadas en directo.',
|
||||
},
|
||||
{
|
||||
question: '¿Cuántas plantas puede reconocer un identificador de plantas por IA?',
|
||||
answer:
|
||||
'Los motores genéricos presumen de reconocer entre 10.000 y 400.000+ especies a nivel básico, pero reconocer la forma de una hoja no es lo mismo que saber cómo mantener esa planta con vida. GreenLens ha construido a mano fichas de cuidado detalladas y comprobadas para unas 240 especies hasta ahora, y añade especies nuevas cada mes.',
|
||||
},
|
||||
{
|
||||
question: '¿Es seguro usar una app para identificar plantas silvestres comestibles?',
|
||||
answer:
|
||||
'Como primer paso, sí. Pero nunca consumas nada basándote únicamente en la identificación de una app: verifica siempre con una guía de campo o un experto.',
|
||||
},
|
||||
{
|
||||
question: '¿Funcionan las apps identificadoras de plantas sin conexión?',
|
||||
answer:
|
||||
'Algunas ofrecen modo sin conexión limitado para las especies más comunes. La cobertura completa normalmente requiere conexión a internet.',
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/es/identificador-de-plantas',
|
||||
label: 'Identificador de plantas',
|
||||
description: 'Escanea una planta y recibe su nombre junto con el plan de cuidado.',
|
||||
},
|
||||
{
|
||||
href: '/es/diagnosticar-enfermedades-plantas',
|
||||
label: 'Diagnosticar enfermedades de plantas',
|
||||
description: 'Cuando el problema no es el nombre sino un sintoma, empieza aqui.',
|
||||
},
|
||||
{
|
||||
href: '/es/plantas-de-interior-poca-luz',
|
||||
label: 'Plantas de interior con poca luz',
|
||||
description: 'Descubre que especies toleran rincones oscuros y como evaluarlo sin aparatos.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
'plantas-de-interior-poca-luz': {
|
||||
slug: 'plantas-de-interior-poca-luz',
|
||||
locale: 'es',
|
||||
metaTitle: 'Plantas de interior con poca luz — guia completa',
|
||||
metaDescription:
|
||||
'¿Qué plantas de interior necesitan poca luz? Descubre las 10 plantas más resistentes para habitaciones oscuras, sombra y pasillos, con consejos para evaluar la luz de tu casa.',
|
||||
canonical: '/es/plantas-de-interior-poca-luz',
|
||||
h1: 'Las 10 Mejores Plantas de Interior con Poca Luz',
|
||||
tagline: 'No toda casa tiene ventanales al sur — estas plantas no los necesitan.',
|
||||
directAnswer:
|
||||
'Zamioculca, sansevieria, aspidistra, potos y espatifilo estan entre las plantas de interior mas tolerantes a la poca luz: heredaron del sotobosque tropical la capacidad de funcionar con tasas de fotosintesis reducidas y sobrevivir con 300-800 lux, muy por debajo de los 2.000+ lux que necesitan la mayoria de las plantas de interior comunes.',
|
||||
definitionBlock:
|
||||
'Poca luz no significa sin luz: toda planta verde necesita fotones para hacer fotosintesis. En botanica la intensidad se mide en lux, y las plantas tolerantes a sombra evolucionaron bajo el dosel de los bosques tropicales para funcionar con 300-800 lux, un nivel mucho mas bajo que la luz indirecta brillante.',
|
||||
lastUpdated: 'Agosto 2026',
|
||||
lastUpdatedIso: '2026-08-05',
|
||||
includeAppSchema: true,
|
||||
heroImage: '/hero-plant.png',
|
||||
heroImageAlt:
|
||||
'Rincon de una habitacion con poca luz natural decorado con plantas de interior resistentes a la sombra',
|
||||
contentSections: [
|
||||
{
|
||||
eyebrow: 'Conceptos basicos',
|
||||
title: 'Que significa realmente "poca luz" para las plantas',
|
||||
body: 'Un error comun en jardineria de interior es pensar que "poca luz" equivale a "sin luz". Estos son los niveles orientativos, de mas a menos intensidad.',
|
||||
bullets: [
|
||||
'Luz indirecta brillante: mas de 2.000 lux — suculentas, ficus, cactus.',
|
||||
'Sombra media: 1.000-2.000 lux — monstera, potos, filodendro.',
|
||||
'Poca luz (tolerantes a sombra): 300-800 lux — sansevieria, zamioculca, cuna de Moises, aspidistra.',
|
||||
'Menos de 300 lux: sin una lampara de crecimiento LED, incluso las plantas mas resistentes terminan debilitandose.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'El top 10',
|
||||
title: 'Las 10 mejores plantas de interior para poca luz',
|
||||
body: 'De la zamioculca a la cinta, estas diez especies estan entre las mas resistentes a la sombra para interiores.',
|
||||
bullets: [
|
||||
'Zamioculca (Zamioculcas zamiifolia): 300-600 lux. Riega muy poco, en zonas sombrias cada 4 a 6 semanas.',
|
||||
'Sansevieria / lengua de suegra (Dracaena trifasciata): 400-800 lux. Evita el exceso de agua para prevenir pudricion de raices.',
|
||||
'Aspidistra (Aspidistra elatior): 300-700 lux. Ideal para pasillos frios y entradas sin sol directo.',
|
||||
'Potos (Epipremnum aureum): 500-1.000 lux. Excelente para estantes altos o macetas colgantes en zonas sombrias.',
|
||||
'Espatifilo / cuna de Moises (Spathiphyllum): 400-800 lux. Avisa que necesita agua inclinando sus hojas.',
|
||||
'Aglaonema: 500-800 lux. Las variedades verde oscuro toleran mejor la sombra que las rosadas o rojas.',
|
||||
'Palmera de salon (Chamaedorea elegans): 600-1.000 lux. Pulveriza sus hojas para mantener la humedad.',
|
||||
'Filodendro hoja de corazon (Philodendron hederaceum): 500-900 lux. Deja secar la capa superior de tierra entre riegos.',
|
||||
'Calatea (Calathea / Goeppertia): 600-1.000 lux. No tolera el sol directo pero exige alta humedad.',
|
||||
'Cinta / mala madre (Chlorophytum comosum): 500-1.200 lux. Muy adaptable y facil de reproducir por hijuelos.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Riego rapido',
|
||||
title: 'Luz y riego de un vistazo',
|
||||
body: 'Un resumen de la frecuencia de riego en verano e invierno para las especies mas populares de esta lista.',
|
||||
bullets: [
|
||||
'Zamioculca (300-600 lux): cada 3 semanas en verano, cada 5-6 semanas en invierno.',
|
||||
'Sansevieria (400-800 lux): cada 2-3 semanas en verano, cada 4 semanas en invierno.',
|
||||
'Aspidistra (300-700 lux): cada 2 semanas en verano, cada 3-4 semanas en invierno.',
|
||||
'Potos (500-1.000 lux): semanal en verano, cada 2 semanas en invierno.',
|
||||
'Espatifilo (400-800 lux): semanal en verano, cada 1-2 semanas en invierno.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Senales de alerta',
|
||||
title: 'Sintomas de falta de luz: como detectarla',
|
||||
body: 'Cuando una planta recibe menos luz de la que necesita, muestra senales claras.',
|
||||
bullets: [
|
||||
'Etiolacion: tallos alargados y debiles con gran espacio entre hojas, buscando la fuente de luz.',
|
||||
'Perdida de variegacion: las hojas veteadas se vuelven verde oscuro solido para maximizar la clorofila.',
|
||||
'Crecimiento estancado: la planta no produce hojas nuevas durante meses.',
|
||||
'Hojas amarillas o pudricion: la fotosintesis se ralentiza, la planta consume menos agua y el riego excesivo pudre las raices con mas facilidad.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Sin aparatos',
|
||||
title: 'Como evaluar la luz de tu casa sin ningun aparato',
|
||||
body: 'No necesitas un luxometro: con un poco de observacion puedes averiguarlo tu mismo.',
|
||||
bullets: [
|
||||
'La prueba de la sombra: coloca la mano a 30 cm sobre la superficie al mediodia y observa la nitidez de la sombra.',
|
||||
'La orientacion de la ventana importa: sur da sol directo todo el dia, este luz matutina suave, oeste sol intenso por la tarde y norte la luz mas constante y suave, a menudo ideal para plantas tolerantes a sombra.',
|
||||
'La distancia a la ventana es tan importante como la orientacion: un rincon a 2 metros de una ventana luminosa ya puede estar en el rango de poca luz.',
|
||||
'La luz cambia con las estaciones: un lugar con luz media en verano puede convertirse en poca luz en invierno, asi que observa tus plantas durante el ano.',
|
||||
],
|
||||
},
|
||||
],
|
||||
featureTable: {
|
||||
title: 'Que aporta GreenLens a la hora de elegir planta segun la luz',
|
||||
alternativeLabel: 'Buscar por tu cuenta',
|
||||
rows: [
|
||||
{
|
||||
feature: 'Requisito de luz por especie',
|
||||
greenlens: 'Cada ficha del catalogo indica si la planta necesita poca luz, media/indirecta, indirecta brillante o sol directo.',
|
||||
alternative: 'Hay que buscar y contrastar varias fuentes para cada especie.',
|
||||
},
|
||||
{
|
||||
feature: 'Antes de comprar',
|
||||
greenlens: 'Escanea la planta en el vivero y comprueba si encaja con el rincon que tienes en mente.',
|
||||
alternative: 'Sueles decidir en la tienda sin verificar el requisito real de luz.',
|
||||
},
|
||||
{
|
||||
feature: 'Catalogo de cuidado',
|
||||
greenlens: 'Unas 240 especies con fichas verificadas a mano, en crecimiento cada mes.',
|
||||
alternative: 'Bases de datos genericas sin verificacion de cuidado real.',
|
||||
},
|
||||
],
|
||||
},
|
||||
greenLensIf: [
|
||||
'Tienes un rincon oscuro y no sabes que planta sobrevivira ahi.',
|
||||
'Quieres comprobar el requisito de luz de una planta antes de comprarla.',
|
||||
'Ya tienes plantas y sospechas que la falta de luz esta detras de su estancamiento.',
|
||||
],
|
||||
notBestIf: [
|
||||
'Buscas exclusivamente plantas de sol directo o de exterior.',
|
||||
'Necesitas mediciones exactas de lux con un luxometro profesional.',
|
||||
],
|
||||
offer: {
|
||||
eyebrow: 'Antes de comprar',
|
||||
title: 'Comprueba el requisito de luz antes de decidir',
|
||||
body:
|
||||
'Escanea o busca la planta en el catalogo de GreenLens y consulta su requisito real de luz antes de llevarla a un rincon donde no prosperaria.',
|
||||
terms:
|
||||
'Un escaneo gratis, sin crear cuenta. Tres mas despues de registrarte. A partir de ahi necesitas GreenLens Pro: suscripcion mensual o anual, con los precios actuales en la App Store. Se renueva automaticamente y puedes cancelar cuando quieras desde los ajustes del iPhone.',
|
||||
ctaLabel: 'Haz tu primer escaneo gratis — sin cuenta',
|
||||
},
|
||||
howToName: 'Como evaluar la luz de tu casa sin aparatos',
|
||||
howToSteps: [
|
||||
{
|
||||
name: 'Haz la prueba de la sombra',
|
||||
text: 'Coloca la mano a 30 cm sobre la superficie donde iria la planta, al mediodia: sombra nitida es luz brillante, sombra suave es luz media, sombra apenas perceptible es poca luz, y sin sombra visible es demasiado oscuro sin una lampara LED.',
|
||||
},
|
||||
{
|
||||
name: 'Revisa la orientacion de la ventana',
|
||||
text: 'Sur recibe sol directo todo el dia, este da luz matutina suave, oeste trae sol intenso por la tarde y norte ofrece la luz mas constante y suave, a menudo la mejor opcion para plantas tolerantes a la sombra.',
|
||||
},
|
||||
{
|
||||
name: 'Mide la distancia a la ventana',
|
||||
text: 'La intensidad lumínica cae rapido cuanto mas te alejas: un rincon a 2 metros de una ventana luminosa ya puede estar en el rango de poca luz.',
|
||||
},
|
||||
{
|
||||
name: 'Ten en cuenta la estacion del ano',
|
||||
text: 'Un lugar con luz media en verano puede convertirse en poca luz en invierno porque el sol esta mas bajo y los dias son mas cortos; acerca tus plantas a la ventana si hace falta.',
|
||||
},
|
||||
],
|
||||
faqs: [
|
||||
{
|
||||
question: '¿Puede sobrevivir una planta en un baño o pasillo sin ventanas?',
|
||||
answer:
|
||||
'Ninguna planta verde sobrevive sin luz a largo plazo. En habitaciones sin ventanas debes utilizar lámparas de crecimiento LED (300+ lux durante 8-10 horas al día).',
|
||||
},
|
||||
{
|
||||
question: '¿Por qué se secan las puntas de las hojas en invierno?',
|
||||
answer:
|
||||
'Las puntas marrones suelen deberse a la baja humedad por la calefacción o al uso de agua de grifo con cloro o cal.',
|
||||
},
|
||||
{
|
||||
question: '¿Debo regar menos las plantas que están en la sombra?',
|
||||
answer:
|
||||
'Sí. En zonas con poca luz las plantas consumen agua mucho más despacio. Comprueba siempre los primeros 3 cm de tierra antes de volver a regar.',
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/es/como-funciona-el-reconocimiento-de-plantas-por-ia',
|
||||
label: 'Cómo funciona el reconocimiento de plantas por IA',
|
||||
description: 'Entiende que hay detras del escaneo antes de confiar en el resultado.',
|
||||
},
|
||||
{
|
||||
href: '/es/identificador-de-plantas',
|
||||
label: 'Identificador de plantas',
|
||||
description: 'Identifica la especie y consulta su requisito de luz en el mismo escaneo.',
|
||||
},
|
||||
{
|
||||
href: '/es/app-para-cuidar-plantas',
|
||||
label: 'App para cuidar plantas',
|
||||
description: 'Organiza el riego y la ubicacion de cada planta segun sus necesidades.',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
export const spanishSeoPageSlugs = Object.keys(spanishSeoPageProfiles)
|
||||
|
||||
|
After Width: | Height: | Size: 712 KiB |
|
After Width: | Height: | Size: 941 KiB |
BIN
greenlns-landing/public/blog/brown-spots-on-houseplant-leaf.jpg
Normal file
|
After Width: | Height: | Size: 795 KiB |
BIN
greenlns-landing/public/blog/gardening-tools-flatlay.jpg
Normal file
|
After Width: | Height: | Size: 852 KiB |
BIN
greenlns-landing/public/blog/houseplant-in-dark-room-corner.jpg
Normal file
|
After Width: | Height: | Size: 638 KiB |
BIN
greenlns-landing/public/blog/houseplant-next-to-notebook.jpg
Normal file
|
After Width: | Height: | Size: 848 KiB |
BIN
greenlns-landing/public/blog/houseplants-on-sunny-windowsill.jpg
Normal file
|
After Width: | Height: | Size: 867 KiB |
BIN
greenlns-landing/public/blog/monstera-in-bright-living-room.jpg
Normal file
|
After Width: | Height: | Size: 906 KiB |
BIN
greenlns-landing/public/blog/person-checking-houseplant-soil.jpg
Normal file
|
After Width: | Height: | Size: 774 KiB |
|
After Width: | Height: | Size: 818 KiB |
|
After Width: | Height: | Size: 705 KiB |
BIN
greenlns-landing/public/blog/plant-with-dry-leaf-edges.jpg
Normal file
|
After Width: | Height: | Size: 720 KiB |
|
After Width: | Height: | Size: 833 KiB |
BIN
greenlns-landing/public/blog/roots-fresh-soil-terracotta-pot.jpg
Normal file
|
After Width: | Height: | Size: 865 KiB |
BIN
greenlns-landing/public/blog/small-houseplant-on-desk.jpg
Normal file
|
After Width: | Height: | Size: 768 KiB |
|
After Width: | Height: | Size: 634 KiB |
|
After Width: | Height: | Size: 819 KiB |
BIN
greenlns-landing/public/blog/water-droplets-on-green-leaf.jpg
Normal file
|
After Width: | Height: | Size: 729 KiB |
BIN
greenlns-landing/public/blog/watering-can-next-to-calathea.jpg
Normal file
|
After Width: | Height: | Size: 698 KiB |
BIN
greenlns-landing/public/blog/wilted-plant-healthy-plant.jpg
Normal file
|
After Width: | Height: | Size: 932 KiB |
BIN
greenlns-landing/public/blog/woman-waters-houseplant.jpg
Normal file
|
After Width: | Height: | Size: 904 KiB |
BIN
greenlns-landing/public/blog/yellowing-monstera-leaf-texture.jpg
Normal file
|
After Width: | Height: | Size: 726 KiB |