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;
|
||||
}>
|
||||
> {
|
||||
// Fetch tools from the API
|
||||
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
|
||||
// Fetch tools from production API
|
||||
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://tpmjs.com';
|
||||
|
||||
try {
|
||||
const response = await fetch(`${baseUrl}/api/tools?limit=100`);
|
||||
|
|
@ -224,8 +224,22 @@ async function fetchTools(): Promise<
|
|||
return [];
|
||||
}
|
||||
|
||||
const { data } = await response.json();
|
||||
return data.tools || [];
|
||||
const json = await response.json();
|
||||
// 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) {
|
||||
console.warn('Could not fetch tools:', error);
|
||||
return [];
|
||||
|
|
|
|||