Compare commits
3 Commits
521cc307a3
...
6b0ab27a3a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b0ab27a3a | ||
|
|
289baec8cf | ||
|
|
11ba2db893 |
63
.gitignore
vendored
63
.gitignore
vendored
@@ -1,64 +1,3 @@
|
|||||||
# dependencies
|
|
||||||
/node_modules
|
/node_modules
|
||||||
/.pnp
|
|
||||||
.pnp.js
|
|
||||||
.cursor/
|
|
||||||
|
|
||||||
# testing
|
|
||||||
/coverage
|
|
||||||
|
|
||||||
# production
|
|
||||||
/build
|
|
||||||
/dist
|
/dist
|
||||||
/public/index.prerender.html
|
/logs
|
||||||
/public/assets/images/prod*.jpg
|
|
||||||
/public/assets/images/cat*.jpg
|
|
||||||
/public/prerender.css
|
|
||||||
/public/Artikel/*
|
|
||||||
/public/Kategorie/*
|
|
||||||
/public/agb
|
|
||||||
/public/batteriegesetzhinweise
|
|
||||||
/public/datenschutz
|
|
||||||
/public/impressum
|
|
||||||
/public/sitemap
|
|
||||||
/public/widerrufsrecht
|
|
||||||
/public/robots.txt
|
|
||||||
/public/sitemap.xml
|
|
||||||
/public/index.prerender.html
|
|
||||||
/public/Konfigurator
|
|
||||||
/public/profile
|
|
||||||
/public/404
|
|
||||||
|
|
||||||
/public/products.xml
|
|
||||||
/public/llms*
|
|
||||||
|
|
||||||
# misc
|
|
||||||
.DS_Store
|
|
||||||
.env.local
|
|
||||||
.env.development.local
|
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
|
|
||||||
.hintrc
|
|
||||||
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
# Editor directories and files
|
|
||||||
.idea
|
|
||||||
*.suo
|
|
||||||
*.ntvs*
|
|
||||||
*.njsproj
|
|
||||||
*.sln
|
|
||||||
*.sw?
|
|
||||||
|
|
||||||
# Local configuration
|
|
||||||
src/config.local.js
|
|
||||||
|
|
||||||
taxonomy-with-ids.de-DE*
|
|
||||||
|
|
||||||
# Local development notes
|
|
||||||
dev-notes.md
|
|
||||||
dev-notes.local.md
|
|
||||||
logs/
|
|
||||||
@@ -51,17 +51,35 @@ function readListFile(filePath) {
|
|||||||
throw new Error('File is empty');
|
throw new Error('File is empty');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse first line: categoryName,categoryId
|
// Parse first line: categoryName,categoryId,[subcategoryIds]
|
||||||
const firstLine = lines[0];
|
const firstLine = lines[0];
|
||||||
const [categoryName, categoryId] = firstLine.split(',');
|
const parts = firstLine.split(',');
|
||||||
|
|
||||||
|
if (parts.length < 2) {
|
||||||
|
throw new Error('Invalid first line format');
|
||||||
|
}
|
||||||
|
|
||||||
|
const categoryName = parts[0].replace(/^"|"$/g, '');
|
||||||
|
const categoryId = parts[1].replace(/^"|"$/g, '');
|
||||||
|
|
||||||
|
// Parse subcategory IDs from array notation [id1,id2,...]
|
||||||
|
let subcategoryIds = [];
|
||||||
|
if (parts.length >= 3) {
|
||||||
|
const subcatString = parts.slice(2).join(','); // Handle case where array spans multiple comma-separated values
|
||||||
|
const match = subcatString.match(/\[(.*?)\]/);
|
||||||
|
if (match && match[1]) {
|
||||||
|
subcategoryIds = match[1].split(',').map(id => id.trim()).filter(id => id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!categoryName || !categoryId) {
|
if (!categoryName || !categoryId) {
|
||||||
throw new Error('Invalid first line format');
|
throw new Error('Invalid first line format');
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
categoryName: categoryName.replace(/^"|"$/g, ''), // Remove quotes if present
|
categoryName: categoryName,
|
||||||
categoryId: categoryId.replace(/^"|"$/g, ''),
|
categoryId: categoryId,
|
||||||
|
subcategoryIds: subcategoryIds,
|
||||||
content: content
|
content: content
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -70,11 +88,66 @@ function readListFile(filePath) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to build processing order based on dependencies
|
||||||
|
function buildProcessingOrder(categories) {
|
||||||
|
const categoryMap = new Map();
|
||||||
|
const processed = new Set();
|
||||||
|
const processingOrder = [];
|
||||||
|
|
||||||
|
// Create a map of categoryId -> category data
|
||||||
|
categories.forEach(cat => {
|
||||||
|
categoryMap.set(cat.categoryId, cat);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Function to check if all subcategories are processed
|
||||||
|
function canProcess(category) {
|
||||||
|
return category.subcategoryIds.every(subId => processed.has(subId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep processing until all categories are done
|
||||||
|
while (processingOrder.length < categories.length) {
|
||||||
|
const beforeLength = processingOrder.length;
|
||||||
|
|
||||||
|
// Find categories that can be processed now
|
||||||
|
for (const category of categories) {
|
||||||
|
if (!processed.has(category.categoryId) && canProcess(category)) {
|
||||||
|
processingOrder.push(category);
|
||||||
|
processed.add(category.categoryId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no progress was made, there might be a circular dependency or missing category
|
||||||
|
if (processingOrder.length === beforeLength) {
|
||||||
|
console.error('⚠️ Unable to resolve all category dependencies');
|
||||||
|
// Add remaining categories anyway
|
||||||
|
for (const category of categories) {
|
||||||
|
if (!processed.has(category.categoryId)) {
|
||||||
|
console.warn(` Adding ${category.categoryName} (${category.categoryId}) despite unresolved dependencies`);
|
||||||
|
processingOrder.push(category);
|
||||||
|
processed.add(category.categoryId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return processingOrder;
|
||||||
|
}
|
||||||
|
|
||||||
// Function to generate SEO description using OpenAI
|
// Function to generate SEO description using OpenAI
|
||||||
async function generateSEODescription(productListContent, categoryName, categoryId) {
|
async function generateSEODescription(productListContent, categoryName, categoryId, subcategoryDescriptions = []) {
|
||||||
try {
|
try {
|
||||||
console.log(`🔄 Generating SEO description for category: ${categoryName} (ID: ${categoryId})`);
|
console.log(`🔄 Generating SEO description for category: ${categoryName} (ID: ${categoryId})`);
|
||||||
|
|
||||||
|
// Prepend subcategory information if present
|
||||||
|
let fullContent = productListContent;
|
||||||
|
if (subcategoryDescriptions.length > 0) {
|
||||||
|
const subcatInfo = 'This category has the following subcategories:\n' +
|
||||||
|
subcategoryDescriptions.map(sub => `- "${sub.name}": ${sub.description}`).join('\n') +
|
||||||
|
'\n\n';
|
||||||
|
fullContent = subcatInfo + productListContent;
|
||||||
|
}
|
||||||
|
|
||||||
const response = await openai.responses.create({
|
const response = await openai.responses.create({
|
||||||
model: "gpt-5.1",
|
model: "gpt-5.1",
|
||||||
input: [
|
input: [
|
||||||
@@ -92,7 +165,7 @@ async function generateSEODescription(productListContent, categoryName, category
|
|||||||
"content": [
|
"content": [
|
||||||
{
|
{
|
||||||
"type": "input_text",
|
"type": "input_text",
|
||||||
"text": productListContent
|
"text": fullContent
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -124,15 +197,8 @@ async function generateSEODescription(productListContent, categoryName, category
|
|||||||
"verbosity": "medium"
|
"verbosity": "medium"
|
||||||
},
|
},
|
||||||
reasoning: {
|
reasoning: {
|
||||||
"effort": "none",
|
"effort": "none"
|
||||||
"summary": "auto"
|
}
|
||||||
},
|
|
||||||
tools: [],
|
|
||||||
store: false,
|
|
||||||
include: [
|
|
||||||
"reasoning.encrypted_content",
|
|
||||||
"web_search_call.action.sources"
|
|
||||||
]
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const description = response.output_text;
|
const description = response.output_text;
|
||||||
@@ -190,31 +256,97 @@ async function main() {
|
|||||||
|
|
||||||
console.log(`📂 Found ${listFiles.length} list files to process`);
|
console.log(`📂 Found ${listFiles.length} list files to process`);
|
||||||
|
|
||||||
const results = [];
|
// Step 1: Read all list files and extract category information
|
||||||
|
console.log('📖 Reading all category files...');
|
||||||
|
const categories = [];
|
||||||
|
const fileDataMap = new Map(); // Map categoryId -> fileData
|
||||||
|
|
||||||
// Process each list file
|
|
||||||
for (const listFile of listFiles) {
|
for (const listFile of listFiles) {
|
||||||
const filePath = path.join(DIST_DIR, listFile);
|
const filePath = path.join(DIST_DIR, listFile);
|
||||||
|
|
||||||
// Read and parse the file
|
|
||||||
const fileData = readListFile(filePath);
|
const fileData = readListFile(filePath);
|
||||||
|
|
||||||
if (!fileData) {
|
if (!fileData) {
|
||||||
console.log(`⚠️ Skipping ${listFile} due to read error`);
|
console.log(`⚠️ Skipping ${listFile} due to read error`);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
categories.push({
|
||||||
|
categoryId: fileData.categoryId,
|
||||||
|
categoryName: fileData.categoryName,
|
||||||
|
subcategoryIds: fileData.subcategoryIds,
|
||||||
|
listFileName: listFile
|
||||||
|
});
|
||||||
|
|
||||||
|
fileDataMap.set(fileData.categoryId, {
|
||||||
|
...fileData,
|
||||||
|
listFileName: listFile
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`✅ Read ${categories.length} categories`);
|
||||||
|
|
||||||
|
// Step 2: Build processing order based on dependencies
|
||||||
|
console.log('🔨 Building processing order based on category hierarchy...');
|
||||||
|
const processingOrder = buildProcessingOrder(categories);
|
||||||
|
|
||||||
|
const leafCategories = processingOrder.filter(cat => cat.subcategoryIds.length === 0);
|
||||||
|
const parentCategories = processingOrder.filter(cat => cat.subcategoryIds.length > 0);
|
||||||
|
|
||||||
|
console.log(` 📄 ${leafCategories.length} leaf categories (no subcategories)`);
|
||||||
|
console.log(` 📁 ${parentCategories.length} parent categories (with subcategories)`);
|
||||||
|
|
||||||
|
// Step 3: Process categories in order
|
||||||
|
const results = [];
|
||||||
|
const generatedDescriptions = new Map(); // Map categoryId -> {seo_description, long_description}
|
||||||
|
|
||||||
|
for (const category of processingOrder) {
|
||||||
|
const fileData = fileDataMap.get(category.categoryId);
|
||||||
|
|
||||||
|
if (!fileData) {
|
||||||
|
console.log(`⚠️ Skipping ${category.categoryName} - no file data found`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gather subcategory descriptions
|
||||||
|
const subcategoryDescriptions = [];
|
||||||
|
for (const subId of category.subcategoryIds) {
|
||||||
|
const subDesc = generatedDescriptions.get(subId);
|
||||||
|
const subCategory = categories.find(cat => cat.categoryId === subId);
|
||||||
|
|
||||||
|
if (subDesc && subCategory) {
|
||||||
|
subcategoryDescriptions.push({
|
||||||
|
name: subCategory.categoryName,
|
||||||
|
description: subDesc.long_description || subDesc.seo_description
|
||||||
|
});
|
||||||
|
} else if (subCategory) {
|
||||||
|
console.warn(` ⚠️ Subcategory ${subCategory.categoryName} (${subId}) not yet processed`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Generate SEO description
|
// Generate SEO description
|
||||||
const description = await generateSEODescription(
|
const descriptionJSON = await generateSEODescription(
|
||||||
fileData.content,
|
fileData.content,
|
||||||
fileData.categoryName,
|
fileData.categoryName,
|
||||||
fileData.categoryId
|
fileData.categoryId,
|
||||||
|
subcategoryDescriptions
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Parse the JSON response
|
||||||
|
let parsedDescription;
|
||||||
|
try {
|
||||||
|
parsedDescription = JSON.parse(descriptionJSON);
|
||||||
|
generatedDescriptions.set(category.categoryId, parsedDescription);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(` ❌ Failed to parse JSON for ${category.categoryName}:`, error.message);
|
||||||
|
parsedDescription = { seo_description: descriptionJSON, long_description: descriptionJSON };
|
||||||
|
generatedDescriptions.set(category.categoryId, parsedDescription);
|
||||||
|
}
|
||||||
|
|
||||||
// Store result
|
// Store result
|
||||||
results.push({
|
results.push({
|
||||||
categoryId: fileData.categoryId,
|
categoryId: category.categoryId,
|
||||||
listFileName: listFile,
|
listFileName: fileData.listFileName,
|
||||||
description: description
|
description: parsedDescription.seo_description || descriptionJSON
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add delay to avoid rate limiting
|
// Add delay to avoid rate limiting
|
||||||
@@ -242,6 +374,7 @@ if (import.meta.url === `file://${process.argv[1]}`) {
|
|||||||
export {
|
export {
|
||||||
findListFiles,
|
findListFiles,
|
||||||
readListFile,
|
readListFile,
|
||||||
|
buildProcessingOrder,
|
||||||
generateSEODescription,
|
generateSEODescription,
|
||||||
writeCSV
|
writeCSV
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -247,10 +247,6 @@ const renderPage = (
|
|||||||
if (!suppressLogs) {
|
if (!suppressLogs) {
|
||||||
console.log(`✅ ${description} prerendered to ${outputPath}`);
|
console.log(`✅ ${description} prerendered to ${outputPath}`);
|
||||||
console.log(` - Markup length: ${renderedMarkup.length} characters`);
|
console.log(` - Markup length: ${renderedMarkup.length} characters`);
|
||||||
console.log(` - CSS rules: ${Object.keys(cache.inserted).length}`);
|
|
||||||
console.log(` - Total inlined CSS: ${Math.round(combinedCss.length / 1024)}KB`);
|
|
||||||
console.log(` - Render-blocking CSS eliminated: ${inlinedCss ? 'YES' : 'NO'}`);
|
|
||||||
console.log(` - Fallback content saved to window.__PRERENDER_FALLBACK__`);
|
|
||||||
if (productDetailCacheScript) {
|
if (productDetailCacheScript) {
|
||||||
console.log(` - Product detail cache populated for SPA hydration`);
|
console.log(` - Product detail cache populated for SPA hydration`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ const generateProductsXml = (allProductsData = [], baseUrl, config) => {
|
|||||||
689: "543561", // Seeds (Saatgut)
|
689: "543561", // Seeds (Saatgut)
|
||||||
706: "543561", // Stecklinge (cuttings) – ebenfalls Pflanzen/Saatgut
|
706: "543561", // Stecklinge (cuttings) – ebenfalls Pflanzen/Saatgut
|
||||||
376: "2802", // Grow-Sets – Pflanzen- & Kräuteranbausets
|
376: "2802", // Grow-Sets – Pflanzen- & Kräuteranbausets
|
||||||
|
915: "2802", // Grow-Sets > Set-Zubehör – Pflanzen- & Kräuteranbausets
|
||||||
|
|
||||||
// Headshop & Accessories
|
// Headshop & Accessories
|
||||||
709: "4082", // Headshop – Rauchzubehör
|
709: "4082", // Headshop – Rauchzubehör
|
||||||
@@ -129,8 +130,13 @@ const generateProductsXml = (allProductsData = [], baseUrl, config) => {
|
|||||||
714: "4082", // Headshop > Bongs > Zubehör – Rauchzubehör
|
714: "4082", // Headshop > Bongs > Zubehör – Rauchzubehör
|
||||||
748: "4082", // Headshop > Bongs > Köpfe – Rauchzubehör
|
748: "4082", // Headshop > Bongs > Köpfe – Rauchzubehör
|
||||||
749: "4082", // Headshop > Bongs > Chillums/Diffusoren/Kupplungen – Rauchzubehör
|
749: "4082", // Headshop > Bongs > Chillums/Diffusoren/Kupplungen – Rauchzubehör
|
||||||
|
921: "4082", // Headshop > Pfeifen – Rauchzubehör
|
||||||
|
924: "4082", // Headshop > Dabbing – Rauchzubehör
|
||||||
896: "3151", // Headshop > Vaporizer – Vaporizer
|
896: "3151", // Headshop > Vaporizer – Vaporizer
|
||||||
|
923: "4082", // Headshop > Papes & Blunts – Rauchzubehör
|
||||||
710: "5109", // Headshop > Grinder – Gewürzmühlen (Küchenhelfer)
|
710: "5109", // Headshop > Grinder – Gewürzmühlen (Küchenhelfer)
|
||||||
|
922: "4082", // Headshop > Aktivkohlefilter & Tips – Rauchzubehör
|
||||||
|
916: "4082", // Headshop > Rollen & Bauen – Rauchzubehör
|
||||||
|
|
||||||
// Measuring & Packaging
|
// Measuring & Packaging
|
||||||
186: "5631", // Headshop > Wiegen & Verpacken – Aufbewahrung/Zubehör
|
186: "5631", // Headshop > Wiegen & Verpacken – Aufbewahrung/Zubehör
|
||||||
@@ -140,6 +146,7 @@ const generateProductsXml = (allProductsData = [], baseUrl, config) => {
|
|||||||
407: "3561", // Headshop > Grove Bags – Aufbewahrungsbehälter
|
407: "3561", // Headshop > Grove Bags – Aufbewahrungsbehälter
|
||||||
449: "1496", // Headshop > Cliptütchen – Lebensmittelverpackungsmaterial
|
449: "1496", // Headshop > Cliptütchen – Lebensmittelverpackungsmaterial
|
||||||
539: "3110", // Headshop > Gläser & Dosen – Lebensmittelbehälter
|
539: "3110", // Headshop > Gläser & Dosen – Lebensmittelbehälter
|
||||||
|
920: "581", // Headshop > Räucherstäbchen – Raumdüfte (Home Fragrances)
|
||||||
|
|
||||||
// Lighting & Equipment
|
// Lighting & Equipment
|
||||||
694: "3006", // Lampen – Lampen (Beleuchtung)
|
694: "3006", // Lampen – Lampen (Beleuchtung)
|
||||||
|
|||||||
@@ -259,7 +259,8 @@ const generateCategoryProductList = (category, categoryProducts = []) => {
|
|||||||
const categorySlug = category.seoName.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
const categorySlug = category.seoName.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
||||||
const fileName = `llms-${categorySlug}-list.txt`;
|
const fileName = `llms-${categorySlug}-list.txt`;
|
||||||
|
|
||||||
let content = `${String(category.name)},${String(category.id)}\n`;
|
const subcategoryIds = (category.subcategories || []).join(',');
|
||||||
|
let content = `${String(category.name)},${String(category.id)},[${subcategoryIds}]\n`;
|
||||||
|
|
||||||
categoryProducts.forEach((product) => {
|
categoryProducts.forEach((product) => {
|
||||||
const artnr = String(product.articleNumber || '');
|
const artnr = String(product.articleNumber || '');
|
||||||
|
|||||||
@@ -7,11 +7,17 @@ const collectAllCategories = (categoryNode, categories = []) => {
|
|||||||
|
|
||||||
// Add current category (skip root category 209)
|
// Add current category (skip root category 209)
|
||||||
if (categoryNode.id !== 209) {
|
if (categoryNode.id !== 209) {
|
||||||
|
// Extract subcategory IDs from children
|
||||||
|
const subcategoryIds = categoryNode.children
|
||||||
|
? categoryNode.children.map(child => child.id)
|
||||||
|
: [];
|
||||||
|
|
||||||
categories.push({
|
categories.push({
|
||||||
id: categoryNode.id,
|
id: categoryNode.id,
|
||||||
name: categoryNode.name,
|
name: categoryNode.name,
|
||||||
seoName: categoryNode.seoName,
|
seoName: categoryNode.seoName,
|
||||||
parentId: categoryNode.parentId
|
parentId: categoryNode.parentId,
|
||||||
|
subcategories: subcategoryIds
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
90
public/llms-cat.txt
Normal file
90
public/llms-cat.txt
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
categoryId,listFileName,seoDescription
|
||||||
|
"703","https://growheads.de/llms-abluft-sets-list.txt","Abluft-Sets für Growbox & Indoor-Grow: leise, energiesparend & mit Aktivkohlefilter zur Geruchsneutralisation. Ideal für Zelte von 60 cm bis 1 m²."
|
||||||
|
"317","https://growheads.de/llms-air-pot-list.txt","Air-Pot Pflanztöpfe für maximales Wurzelwachstum: Air-Pruning, optimale Belüftung & Drainage. Ideal für Indoor, Outdoor, Hydroponik & Anzucht."
|
||||||
|
"922","https://growheads.de/llms-aktivkohlefilter-tips-list.txt","Aktivkohlefilter & Tips für Zigaretten und Selbstgedrehte – milderer Geschmack, weniger Schadstoffe, optimale Rauchfilterung und hoher Genuss."
|
||||||
|
"372","https://growheads.de/llms-autopot-list.txt","AutoPot Bewässerungssysteme & Zubehör: Stromlose, automatische Pflanzenbewässerung mit Tanks, Schläuchen, FlexiPots & AQUAvalve5 für Hydroponik & Garten."
|
||||||
|
"389","https://growheads.de/llms-blumat-list.txt","Blumat Bewässerungssysteme & Zubehör: Tropf-Bewässerung, Erdfeuchte-Sensoren und Ventile für automatische, bedarfsgerechte Pflanzenbewässerung."
|
||||||
|
"355","https://growheads.de/llms-boveda-integra-boost-list.txt","Boveda & Integra Boost Hygro-Packs für perfekte Feuchtigkeitskontrolle Deiner Kräuter. Verhindern Schimmel, Austrocknung und Aroma-Verlust bei der Lagerung."
|
||||||
|
"749","https://growheads.de/llms-chillums-diffusoren-kupplungen-list.txt","Chillums, Diffusoren & Kupplungen für Bongs – große Auswahl an 14,5mm, 18,8mm & 29,2mm Adaptern aus Glas für bessere Kühlung & sanfteren Rauchgenuss."
|
||||||
|
"449","https://growheads.de/llms-cliptuetchen-list.txt","Cliptütchen & Mylarbeutel: hochwertige Zip Bags und Schnellverschlussbeutel in vielen Größen, starken Folienstärken und Farben – ideal zur sicheren Lagerung."
|
||||||
|
"924","https://growheads.de/llms-dabbing-list.txt","Entdecken Sie hochwertiges Dabbing-Zubehör für konzentrierte Aromagenuss – Dab Rigs, Tools und mehr für ein intensives, sauberes Dab-Erlebnis."
|
||||||
|
"691","https://growheads.de/llms-duenger-list.txt","Dünger & Pflanzennährstoffe für Erde, Coco & Hydro: Bio- und Mineraldünger, Booster, Wurzelstimulatoren, PK-Additive & pH-Regulatoren für maximale Erträge."
|
||||||
|
"692","https://growheads.de/llms-duenger-zubehoer-list.txt","Dünger-Zubehör: Abfüllhähne, Wurmhumus, pH-Eichlösungen & Desinfektionsmittel für präzise Dosierung, Hygiene und optimale Nährstoffversorgung der Pflanzen."
|
||||||
|
"489","https://growheads.de/llms-eazyplug-jiffy-list.txt","EazyPlug & Jiffy Anzuchtmedien: nachhaltige Anzuchtwürfel, Torftöpfe & Trays für Stecklinge und Sämlinge mit optimalem Wasser-Luft-Verhältnis."
|
||||||
|
"243","https://growheads.de/llms-erde-list.txt","Hochwertige Blumenerde & Bio-Substrate: torffrei, organisch, vorgedüngt – ideal für Indoor-Grow, Urban Gardening, Kräuter, Gemüse & Cannabis-Anbau."
|
||||||
|
"302","https://growheads.de/llms-erntemaschinen-list.txt","Erntemaschinen & Leaf Trimmer für professionelle Ernteverarbeitung – vom manuellen Trimmer bis zur automatisierten Profigerät, inkl. Zubehör & Ersatzteile."
|
||||||
|
"280","https://growheads.de/llms-erntescheeren-list.txt","Hochwertige Erntescheren & Gartenscheren für präzise Pflanzenschnitte. Entdecken Sie Profi-Erntescheren aus Edelstahl & Japanstahl für Garten & Indoor-Grow."
|
||||||
|
"424","https://growheads.de/llms-etiketten-schilder-list.txt","Etiketten & Schilder für Garten & Gewächshaus – wasserfeste Stecketiketten in vielen Farben für Pflanzenbeschriftung, Sortierung und Kennzeichnung."
|
||||||
|
"278","https://growheads.de/llms-extraktion-list.txt","Hochwertige Extraktionszubehör & -geräte: Pollenmaschinen, Extraktorbeutel, DME-Gas, Rosin Bags & Infuser für saubere Pflanzen- und Öl-Extraktionen."
|
||||||
|
"379","https://growheads.de/llms-geruchsneutralisation-list.txt","Effektive Geruchsneutralisation für Haushalt, Grow-Räume & Gewerbe – ONA & BIODOR Gel, Spray, Filter und Ozongeneratoren gegen Tabak-, Cannabis- & Tiergerüche."
|
||||||
|
"359","https://growheads.de/llms-gewaechshaeuser-list.txt","Gewächshäuser & Anzuchtgewächshäuser für drinnen: beheizt, mit LED & Lüftung. Ideal für Kräuter, Gemüse & Stecklinge – für erfolgreiche Pflanzenanzucht."
|
||||||
|
"539","https://growheads.de/llms-glaeser-dosen-list.txt","Gläser & Dosen für luftdichte, lichtgeschützte und geruchsneutrale Aufbewahrung von Kräutern, Lebensmitteln & Wertsachen. Vakuum-, Stash- & Miron-Glas."
|
||||||
|
"710","https://growheads.de/llms-grinder-list.txt","Hochwertige Grinder & Kräutermühlen aus Aluminium, Holz & Edelstahl – 2-, 3- & 4-teilig, Pollinator, Non-Sticky & Design-Grinder für Tabak & Kräuter."
|
||||||
|
"407","https://growheads.de/llms-grove-bags-list.txt","Grove Bags TerpLoc – professionelle Lagerung für Cannabis & Kräuter. Schimmelschutz, Feuchtigkeitskontrolle, Terpene & Aroma optimal bewahren."
|
||||||
|
"408","https://growheads.de/llms-growcontrol-list.txt","GrowControl Steuerungen & Sensoren für präzises Klima-, CO₂- und Lichtmanagement im Indoor-Grow. Made in Germany, kompatibel mit EC-Lüftern & LED-Systemen."
|
||||||
|
"373","https://growheads.de/llms-growtool-list.txt","GrowTool Zubehör für professionelle Bewässerung & GrowRacks: stabile Unterbauten, aeroponische Systeme, Adapter & Wasserkühler für optimales Indoor-Growing."
|
||||||
|
"310","https://growheads.de/llms-heizmatten-list.txt","Heizmatten für Gewächshaus, Growbox & Terrarium: Effiziente Wurzelwärme, schnellere Keimung & gesundes Pflanzenwachstum mit Thermostat-Steuerung."
|
||||||
|
"748","https://growheads.de/llms-koepfe-list.txt","Hochwertige Bong-Köpfe & Glasbowls: Entdecke Trichterköpfe, Flutschköpfe und Zenit Premium-Köpfe in 14,5 & 18,8 mm in vielen Farben online."
|
||||||
|
"269","https://growheads.de/llms-kokos-list.txt","Entdecken Sie hochwertige Kokossubstrate & Kokosmatten für Hydroponik, Indoor-Grow & Topfkulturen – torffreie, nachhaltige Coco-Erden für starkes Wurzelwachstum."
|
||||||
|
"364","https://growheads.de/llms-kunststofftoepfe-list.txt","Kunststofftöpfe für Pflanzen, Anzucht und Umtopfen: Viereckige Pflanztöpfe, Airpots & Mini-Pots in vielen Größen für gesundes Wurzelwachstum."
|
||||||
|
"694","https://growheads.de/llms-lampen-list.txt","Entdecken Sie hochwertige LED Grow Lampen & Pflanzenlampen mit Vollspektrum für Indoor-Grow, Wachstum & Blüte. Effizient, dimmbar & langlebig."
|
||||||
|
"261","https://growheads.de/llms-lampenzubehoer-list.txt","Hochwertiges Lampenzubehör für Growbox & Gewächshaus: Aufhängungen, Dimmer, Reflektoren, Netzteile & SANlight-Zubehör für optimales Pflanzenlicht."
|
||||||
|
"387","https://growheads.de/llms-literatur-list.txt","Entdecke Fachliteratur zu Cannabis-Anbau, Bio-Grow, LED, Hydrokultur & Extraktion – praxisnahe Bücher für Indoor- und Outdoor-Gärtner, Anfänger & Profis."
|
||||||
|
"658","https://growheads.de/llms-luftbe-und-entfeuchter-list.txt","Effektive Luftbefeuchter & Luftentfeuchter für Growroom & Indoor-Anbau. Optimale Luftfeuchtigkeit, Schimmelvorbeugung & gesundes Pflanzenwachstum."
|
||||||
|
"403","https://growheads.de/llms-messbecher-mehr-list.txt","Messbecher, Pipetten & Einwegspritzen zum präzisen Abmessen von Flüssigkeiten – ideal für Dünger, Zusätze, Labor und Garten. Verschiedene Größen."
|
||||||
|
"344","https://growheads.de/llms-messgeraete-list.txt","Präzise pH-, EC-, Temperatur- und Klimamessgeräte für Garten, Hydroponik & Labor. Entdecke Profi-Messinstrumente, Sonden und Kalibrierlösungen."
|
||||||
|
"555","https://growheads.de/llms-mikroskope-list.txt","Mikroskope & Lupen für Hobby, Schule & Elektronik: Entdecken Sie 5x–100x Vergrößerung, USB-Mikroskope, LED-Modelle und mobile Zoom-Mikroskope."
|
||||||
|
"923","https://growheads.de/llms-papes-blunts-list.txt","Entdecke hochwertige Papers & Blunts für perfekten Rauchgenuss – von klassischen Blättchen bis aromatisierten Blunt Wraps in vielen Größen und Stärken."
|
||||||
|
"222","https://growheads.de/llms-pe-teile-list.txt","PE-Teile für Bewässerung: Absperrhähne, Kupplungen, T-Stücke & Endkappen für PE-Schläuche – ideal für Gartenbewässerung und Tropfbewässerung."
|
||||||
|
"580","https://growheads.de/llms-perlite-blaehton-list.txt","Perlite & Blähton für Hydroponik, Hydrokultur & Gartenbau. Optimale Drainage, Belüftung und Wasserspeicherung für gesundes Wurzelwachstum."
|
||||||
|
"921","https://growheads.de/llms-pfeifen-list.txt","Entdecken Sie Pfeifen für Aktivkohlefilter: langlebige Holzpfeifen und hochwertige Aluminium-Pfeifen mit Royal Filter Adapter für ein reines Raucherlebnis."
|
||||||
|
"239","https://growheads.de/llms-pflanzenschutz-list.txt","Pflanzenschutz biologisch & chemiefrei: Nützlinge, Neemöl, Gelbtafeln & Raubmilben gegen Trauermücken, Thripse, Spinnmilben, Blattläuse & Weiße Fliege."
|
||||||
|
"259","https://growheads.de/llms-pressen-list.txt","Hydraulische Rosin Pressen, Pollenpressen & Rosin Bags für professionelle, lösungsmittelfreie Extraktion und Harzpressung. Große Auswahl & Top-Marken."
|
||||||
|
"297","https://growheads.de/llms-pumpen-list.txt","Entdecken Sie leistungsstarke Pumpen für Bewässerung, Hydroponik & Aquaristik: Tauchpumpen, Umwälzpumpen, Belüftungs- und Luftpumpen für jeden Bedarf."
|
||||||
|
"519","https://growheads.de/llms-pumpsprueher-list.txt","Pumpsprüher & Drucksprüher für Garten, Haushalt & Industrie. Hochwertige 1–8L Sprüher für Pflanzenpflege, Reinigung und Pflanzenschutz online kaufen."
|
||||||
|
"920","https://growheads.de/llms-raeucherstaebchen-list.txt","Entdecken Sie hochwertige Räucherstäbchen wie Goloka Nag Champa und Satya für Meditation, Ayurveda, Chakra-Harmonisierung und entspannende Duftmomente."
|
||||||
|
"450","https://growheads.de/llms-restposten-list.txt","Günstige Restposten: stark reduzierte Markenartikel, Sonderposten und Einzelstücke für cleveres Sparen. Jetzt Restbestände kaufen und Schnäppchen sichern."
|
||||||
|
"916","https://growheads.de/llms-rollen-bauen-list.txt","Entdecke Rolling Trays, Tin Boxen & Rolling Sets für perfektes Drehen – praktische Aufbewahrung, integriertes Zubehör & stylische Designs."
|
||||||
|
"609","https://growheads.de/llms-schalldaempfer-list.txt","Schalldämpfer für Lüftungsanlagen: hochwertige Rohr- & Telefonieschalldämpfer zur effektiven Geräuschreduzierung in Wohnraum, Gewerbe & Technikräumen."
|
||||||
|
"405","https://growheads.de/llms-schlaeuche-1-list.txt","Schläuche für Bewässerung & Garten: Tropfschläuche, Mikroschläuche und flexible Gartenschläuche in verschiedenen Durchmessern für präzise Wasserversorgung."
|
||||||
|
"250","https://growheads.de/llms-schlaeuche-list.txt","Hochwertige Lüftungs- und Abluftschläuche: Aluflex-, Combi-, Phonic Trap & Sonodec für leise, effiziente Belüftung in Growroom, Werkstatt & Haus."
|
||||||
|
"689","https://growheads.de/llms-seeds-list.txt","Entdecke hochwertige Samen: Cannabis-, Gemüse- und Kräutersamen für Indoor & Outdoor, inklusive Autoflower, CBD, Fast Version & Bio-Gartensaatgut."
|
||||||
|
"915","https://growheads.de/llms-set-zubehoer-list.txt","Set-Zubehör für Grow & Indoor-Garten: Erde, Dünger-Starterkit, Ernteschere, Thermo-Hygrometer & WLAN Zeitschaltuhr für optimale Pflanzenpflege."
|
||||||
|
"4","https://growheads.de/llms-sonstiges-list.txt","Sonstiges Garten- & Grow-Zubehör: LST Pflanzenbieger, Kabel, CBD-Aromaöle, Adventskalender, Schutzbrillen & Bambusstäbe günstig online kaufen."
|
||||||
|
"354","https://growheads.de/llms-sprueher-list.txt","Sprüher & Sprühflaschen fürs Pflanzenwässern: Drucksprüher, Handsprüher, Gießstäbe & Hozelock-Spritzdüsen für Gewächshaus, Garten & Indoor-Grow."
|
||||||
|
"706","https://growheads.de/llms-stecklinge-list.txt","Entdecke hochwertige Cannabis-Stecklinge: Top-Genetiken, feminisierte & Autoflower Sorten, hohe THC- und CBD-Werte, ideal für Indoor- & Outdoor-Grower."
|
||||||
|
"298","https://growheads.de/llms-steinwolltrays-list.txt","Steinwolltrays & Anzuchtsysteme für Stecklinge & Samen – Grodan, Speedgrow & Joplug. Optimale Bewurzelung, Hydroponik-tauglich, pH-neutral & effizient."
|
||||||
|
"314","https://growheads.de/llms-steuergeraete-list.txt","Steuergeräte für Indoor-Grow & Gewächshaus: Klimacontroller, Lüftersteuerungen, CO₂-Regler & Thermostate für optimales Grow-Klima online kaufen."
|
||||||
|
"301","https://growheads.de/llms-stofftoepfe-list.txt","Stofftöpfe & Pflanzsäcke für gesundes Wurzelwachstum – atmungsaktive, nachhaltige Fabric Pots aus recyceltem Material für Indoor & Outdoor Anbau."
|
||||||
|
"292","https://growheads.de/llms-trays-fluttische-list.txt","Trays & Fluttische für Growbox & Gewächshaus: stabile Pflanzschalen, Fluttischböden, Water Trays und Eisenracks für effiziente Bewässerung & Trocknung."
|
||||||
|
"293","https://growheads.de/llms-trockennetze-list.txt","Trockennetze & Dry Bags für Kräuter, Blüten & Samen: platzsparend, geruchsarm & schimmelfrei trocknen – ideal für Growbox, Indoor & Balkon."
|
||||||
|
"480","https://growheads.de/llms-tropfer-list.txt","Tropfer & Mikroschläuche für professionelle Tropfbewässerung – Zubehör, Verbinder und Systeme für Garten, Gewächshaus & Containerpflanzen."
|
||||||
|
"214","https://growheads.de/llms-umluft-ventilatoren-list.txt","Umluft-Ventilatoren für Growbox, Growraum & Haushalt: leise Clip‑, Box‑ und Wandventilatoren mit Oszillation, EC-Motor, energieeffizient & langlebig."
|
||||||
|
"220","https://growheads.de/llms-untersetzer-list.txt","Untersetzer & Auffangschalen für Pflanztöpfe: eckig & rund, verschiedene Größen, robust, wasserdicht – ideal für Indoor-Grow, Balkon & Zimmerpflanzen."
|
||||||
|
"346","https://growheads.de/llms-vakuumbeutel-list.txt","Vakuumbeutel & Alu-Bügelbeutel für Lebensmittel, Fermentation & Lagerung – luftdicht, robust, BPA-frei. Passend zu allen gängigen Vakuumierern."
|
||||||
|
"896","https://growheads.de/llms-vaporizer-list.txt","Vaporizer & E-Rigs für Kräuter & Konzentrate: Entdecke Premium-Verdampfer, Dab Tools & Zubehör von Puffco, Storz & Bickel, Wolkenkraft u.v.m."
|
||||||
|
"374","https://growheads.de/llms-verbindungsteile-list.txt","Verbindungsteile für Lüftungsanlagen: Außen- & Innenverbinder, Reduzierstücke, Gummimuffen, Dichtbänder, T- und Y-Stücke für luftdichte Rohrverbindungen."
|
||||||
|
"421","https://growheads.de/llms-vermehrungszubehoer-list.txt","Vermehrungszubehör für Stecklinge & Jungpflanzen: Bewurzelungsgel, Clonex Mist, Jiffy Quelltöpfe, Skalpelle & Substrate für erfolgreiche Pflanzenzucht."
|
||||||
|
"187","https://growheads.de/llms-waagen-list.txt","Präzisionswaagen, Taschenwaagen & Paketwaagen: Entdecken Sie digitale Waagen, Juwelierwaagen und Eichgewichte für Labor, Versand, Haushalt & Hobby."
|
||||||
|
"425","https://growheads.de/llms-wassertanks-list.txt","Wassertanks & Nährstofftanks für Bewässerung & Hydroponik – robuste Tanks, flexible Flex-Tanks, Tankdurchführungen & Zubehör für Growbox und Garten."
|
||||||
|
"186","https://growheads.de/llms-wiegen-verpacken-list.txt","Wiegen & Verpacken: Präzisionswaagen, Vakuumbeutel, Grove Bags, Boveda, Integra Boost, Cliptütchen sowie Gläser & Dosen für sichere Lagerung."
|
||||||
|
"693","https://growheads.de/llms-zelte-list.txt","Entdecke hochwertige Growzelte für Indoor-Growing – von kompakten Mini-Growboxen bis zu Profi-Zelten mit Mylar, PAR+ & stabilen Stahlrahmen."
|
||||||
|
"226","https://growheads.de/llms-zeltzubehoer-list.txt","Zeltzubehör für Growbox & Growzelt: Scrog-Netze, Stütznetze, Space Booster, Stoffböden, Verbinder & Zubehör für stabile, effiziente Indoor-Grows."
|
||||||
|
"686","https://growheads.de/llms-zubehoer-1-list.txt","Zubehör für Aktivkohlefilter, Vorfilter und Flansche: hochwertiges Lüftungs- & Filterzubehör für Prima Klima und Can Filters in Profi-Qualität."
|
||||||
|
"741","https://growheads.de/llms-zubehoer-2-list.txt","Zubehör für Lüfter & Klima: EC-Controller, Temperaturregler, Netzstecker & Gewebeband für leisen, effizienten und sicheren Betrieb Ihrer Lüftungsanlage."
|
||||||
|
"294","https://growheads.de/llms-zubehoer-3-list.txt","Praktisches Zubehör für Bewässerung, Hydroponik & Garten: Schläuche, Filter, Heizstäbe, Verbinder und mehr für effiziente Grow- & Bewässerungssysteme."
|
||||||
|
"714","https://growheads.de/llms-zubehoer-list.txt","Zubehör für Bongs & Wasserpfeifen: Aktivkohle, Adapter, Filter, Köpfe, Vorkühler, Reinigungsmittel & Tools von Zenit, Smokebuddy, Black Leaf u.v.m."
|
||||||
|
"392","https://growheads.de/llms-zuluftfilter-list.txt","Zuluftfilter für Growroom & Gewächshaus: saubere Frischluft, Schutz vor Pollen, Staub & Insekten, optimales Klima und gesundes Pflanzenwachstum."
|
||||||
|
"308","https://growheads.de/llms-ab-und-zuluft-list.txt","Ab- und Zuluft für Growbox & Raumklima: leise EC-Lüfter, Rohrventilatoren, Iso-Boxen, Schläuche, Filter, Schalldämpfer & Zubehör für Profi-Lüftung."
|
||||||
|
"248","https://growheads.de/llms-aktivkohlefilter-list.txt","Aktivkohlefilter für Growbox, Industrie & Lüftung: hochwertige Geruchsneutralisation, Luftreinigung und Zubehör von Can Filters, Prima Klima, Rhino u.v.m."
|
||||||
|
"240","https://growheads.de/llms-anbauzubehoer-list.txt","Anbauzubehör für Indoor & Outdoor Grow: Kabel, Zeitschaltuhren, Pflanzentraining, Befestigung, Gewächshausheizung & mehr für Hobby- und Profigärtner."
|
||||||
|
"286","https://growheads.de/llms-anzucht-list.txt","Anzucht-Zubehör für erfolgreiches Vorziehen: Steinwolltrays, Heizmatten, Gewächshäuser, Vermehrungszubehör sowie EazyPlug & Jiffy Substrate online kaufen."
|
||||||
|
"247","https://growheads.de/llms-belueftung-list.txt","Belüftung für Growbox & Indoor-Grow: Umluft-Ventilatoren, Aktivkohlefilter, Ab- und Zuluft, Steuergeräte, Luftbefeuchter & Entfeuchter, Geruchsneutralisation."
|
||||||
|
"221","https://growheads.de/llms-bewaesserung-list.txt","Bewässerungssysteme für Garten, Gewächshaus & Indoor-Grow: Pumpen, Schläuche, Tropfer, AutoPot, Blumat, Trays, Wassertanks & Zubehör günstig kaufen."
|
||||||
|
"242","https://growheads.de/llms-boeden-list.txt","Böden & Substrate für Profi- und Hobby-Grower: Erde, Kokos, Perlite & Blähton für Indoor-Grow, Hydroponik und Gartenbau. Optimale Drainage & Nährstoffversorgung."
|
||||||
|
"711","https://growheads.de/llms-bongs-list.txt","Bongs online kaufen: Glasbongs, Acrylbongs & Ölbongs von Black Leaf, Jelly Joker, Grace Glass, Boost, Zenit u.v.m. Für Kräuter, Öl & Dabs – große Auswahl."
|
||||||
|
"258","https://growheads.de/llms-ernte-verarbeitung-list.txt","Ernte & Verarbeitung: Pressen, Extraktion, Erntescheren, Trockennetze & Erntemaschinen für effiziente, schonende Blüten- und Kräuterverarbeitung."
|
||||||
|
"376","https://growheads.de/llms-grow-sets-list.txt","Entdecken Sie hochwertige Grow-Sets für Indoor-Growing: Komplettsets mit LED-Beleuchtung, Growbox, Abluftsystem & Zubehör für Anfänger und Profis."
|
||||||
|
"709","https://growheads.de/llms-headshop-list.txt","Headshop mit Bongs, Vaporizern, Pfeifen, Dabbing‑Zubehör, Papes, Grinder, Filtern, Waagen, Rolling Trays & Räucherstäbchen – alles für dein Rauch‑Setup."
|
||||||
|
"219","https://growheads.de/llms-toepfe-list.txt","Töpfe für Indoor- und Outdoorgrowing: Stofftöpfe, Air-Pots, Kunststofftöpfe & Untersetzer für optimales Wurzelwachstum und professionelle Pflanzenzucht."
|
||||||
|
"695","https://growheads.de/llms-zubehoer-4-list.txt","Zubehör für Growbox & Indoor-Grow: Zeltzubehör, Anbauzubehör, Lampenzubehör, Messgeräte, Ernte & Verarbeitung sowie Dünger-Zubehör online kaufen."
|
||||||
Reference in New Issue
Block a user