feat: add OG images for all 78 tool pages
- Generate unique AI images for each tool using gpt-image-1-mini
- Update script to fetch tools from production API
- Images served from public/og/tool/{package-name}-{tool-name}.png
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 2.1 MiB |
BIN
apps/web/public/og/tool/bedrock-agentcore-browsertools.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/ctx-zip-createvercelsandboxcodemode.png
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
apps/web/public/og/tool/davincidreams-my-tools-anothertool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/davincidreams-my-tools-exampletool.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/exalabs-ai-sdk-websearch.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/firecrawl-aisdk-crawltool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/firecrawl-aisdk-scrapetool.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/firecrawl-aisdk-searchtool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/fish-joke-generator-default.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/openai-zod-validator-default.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
BIN
apps/web/public/og/tool/parallel-web-ai-sdk-tools-searchtool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
BIN
apps/web/public/og/tool/superagent-ai-ai-sdk-guard.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/superagent-ai-ai-sdk-redact.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/superagent-ai-ai-sdk-verify.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/tavily-ai-sdk-tavilysearch.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-cows-fatcow.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-cows-skinnycow.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/thomasdavis-humans-anothertool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-humans-exampletool.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-asklisatool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-complimentlisatool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-giftlisatool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-greetlisatool.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-lisaadvicetool.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-lisafacttool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-lisafarewelltool.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-lisajoketool.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-lisamoodtool.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
apps/web/public/og/tool/thomasdavis-lisa-lisawisdomtool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-canceljob.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-executecode.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-getjob.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-listjobs.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-listlanguages.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-runcode.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/thomasdavis-unsandbox-runcodeasync.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/tpmjs-emoji-magic-emojimood.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/tpmjs-emoji-magic-texttoemoji.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
apps/web/public/og/tool/tpmjs-hello-hellonametool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/tpmjs-hello-helloworldtool.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-canceljob.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-executecode.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-executecodeasync.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-getjob.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-listjobs.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-listlanguages.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-runcode.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/tpmjs-unsandbox-runcodeasync.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-biosearch.png
Normal file
|
After Width: | Height: | Size: 2.2 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-companyresearch.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-economicssearch.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-financesearch.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-papersearch.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-patentsearch.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-secsearch.png
Normal file
|
After Width: | Height: | Size: 2.3 MiB |
BIN
apps/web/public/og/tool/valyu-ai-sdk-websearch.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
|
|
@ -214,8 +214,8 @@ async function fetchTools(): Promise<
|
||||||
category: string;
|
category: string;
|
||||||
}>
|
}>
|
||||||
> {
|
> {
|
||||||
// Fetch tools from the API
|
// Fetch tools from production API
|
||||||
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
|
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://tpmjs.com';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`${baseUrl}/api/tools?limit=100`);
|
const response = await fetch(`${baseUrl}/api/tools?limit=100`);
|
||||||
|
|
@ -224,8 +224,22 @@ async function fetchTools(): Promise<
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data } = await response.json();
|
const json = await response.json();
|
||||||
return data.tools || [];
|
// API returns { data: [...tools] } where each tool has package.npmPackageName
|
||||||
|
const tools = json.data || [];
|
||||||
|
return tools.map(
|
||||||
|
(tool: {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
package: { npmPackageName: string; category: string };
|
||||||
|
}) => ({
|
||||||
|
id: tool.name,
|
||||||
|
name: tool.name,
|
||||||
|
packageName: tool.package.npmPackageName,
|
||||||
|
description: tool.description || '',
|
||||||
|
category: tool.package.category || 'other',
|
||||||
|
})
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn('Could not fetch tools:', error);
|
console.warn('Could not fetch tools:', error);
|
||||||
return [];
|
return [];
|
||||||
|
|
|
||||||