diff --git a/CLAUDE.md b/CLAUDE.md
index 089f0a4..da7946e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -684,14 +684,14 @@ The full working implementation is live at [tpmjs.com](https://tpmjs.com).
## NPM Package Syncing System
-TPMJS.com automatically mirrors npm packages with the `tpmjs-tool` keyword to keep the tool registry up-to-date. This section documents how the syncing system works.
+TPMJS.com automatically mirrors npm packages with the `tpmjs` keyword to keep the tool registry up-to-date. This section documents how the syncing system works.
### Overview
The sync system uses three automated strategies running on Vercel Cron to discover and update TPMJS tools:
1. **Changes Feed** - Monitors npm's real-time changes feed for all package updates
-2. **Keyword Search** - Actively searches npm for packages with the `tpmjs-tool` keyword
+2. **Keyword Search** - Actively searches npm for packages with the `tpmjs` keyword
3. **Metrics Sync** - Updates download stats and calculates quality scores
### Sync Endpoints
@@ -735,12 +735,12 @@ All sync endpoints are located in `apps/web/src/app/api/sync/`:
#### 2. Keyword Search Sync (`/api/sync/keyword`)
-**Purpose:** Actively searches npm for packages with the `tpmjs-tool` keyword.
+**Purpose:** Actively searches npm for packages with the `tpmjs` keyword.
**Schedule:** Every 15 minutes (`*/15 * * * *`)
**How it works:**
-1. Searches npm registry for packages with keyword `tpmjs-tool` (up to 250 results)
+1. Searches npm registry for packages with keyword `tpmjs` (up to 250 results)
2. Fetches full metadata for each package
3. Validates the `tpmjs` field
4. Upserts tools with `discoveryMethod: 'keyword'`
@@ -1078,7 +1078,7 @@ curl -X POST http://localhost:3000/api/sync/changes \
Here's how a new TPMJS tool gets discovered:
-1. **Developer publishes package to npm** with `tpmjs-tool` keyword and `tpmjs` field in package.json
+1. **Developer publishes package to npm** with `tpmjs` keyword and `tpmjs` field in package.json
2. **Within 2 minutes:** Changes feed sync picks it up from npm's `/_changes` endpoint
3. **Validation:** `validateTpmjsField()` checks that the `tpmjs` field meets requirements
4. **Database Insert:** Tool is upserted with initial data
diff --git a/HOW_TO_PUBLISH_A_TOOL.md b/HOW_TO_PUBLISH_A_TOOL.md
index 565cb8c..9ef0fc4 100644
--- a/HOW_TO_PUBLISH_A_TOOL.md
+++ b/HOW_TO_PUBLISH_A_TOOL.md
@@ -5,7 +5,7 @@ This guide shows you how to create and publish an AI tool that will be automatic
## Quick Start
1. Create a new NPM package
-2. Add `"tpmjs-tool"` to the `keywords` array in package.json
+2. Add `"tpmjs"` to the `keywords` array in package.json
3. Add a `tpmjs` field with your tool's metadata
4. Publish to NPM
5. Your tool will automatically appear on tpmjs.com within 15 minutes
@@ -24,18 +24,18 @@ npm init -y
### 2. Add the Required Keyword
-In your `package.json`, add `"tpmjs-tool"` to the keywords array:
+In your `package.json`, add `"tpmjs"` to the keywords array:
```json
{
"name": "@yourname/my-awesome-tool",
"version": "1.0.0",
- "keywords": ["tpmjs-tool", "ai", "other-keywords"],
+ "keywords": ["tpmjs", "ai", "other-keywords"],
...
}
```
-**Important:** The `"tpmjs-tool"` keyword is REQUIRED for automatic discovery!
+**Important:** The `"tpmjs"` keyword is REQUIRED for automatic discovery!
### 3. Add TPMJS Metadata
@@ -212,7 +212,7 @@ npm publish --access public
Your tool will be automatically discovered through:
-1. **Keyword Search** - Runs every 15 minutes, searches NPM for `"tpmjs-tool"`
+1. **Keyword Search** - Runs every 15 minutes, searches NPM for `"tpmjs"`
2. **Changes Feed** - Monitors NPM publishes in real-time (every 2 minutes)
After publishing, your tool should appear on https://tpmjs.com within 15 minutes!
@@ -229,7 +229,7 @@ Here's the complete `package.json` from the published example:
"version": "0.2.0",
"description": "A tool for creating structured blog posts with AI-generated content",
"type": "module",
- "keywords": ["tpmjs-tool", "blog", "content", "ai", "writing"],
+ "keywords": ["tpmjs", "blog", "content", "ai", "writing"],
"exports": {
".": {
"types": "./dist/index.d.ts",
@@ -402,7 +402,7 @@ Or manually check the structure matches the examples above.
## Troubleshooting
**Tool not appearing after 15 minutes?**
-- Check that you added `"tpmjs-tool"` to keywords
+- Check that you added `"tpmjs"` to keywords
- Verify your `tpmjs` field has required fields (category, description)
- Check the NPM package is public: `npm view yourpackage`
diff --git a/LAUNCH_REVIEW.md b/LAUNCH_REVIEW.md
index edb20e4..38d77b8 100644
--- a/LAUNCH_REVIEW.md
+++ b/LAUNCH_REVIEW.md
@@ -282,7 +282,7 @@ this becomes unmanageable.
designed for AI agents. Agents can search for tools by description and load them
at runtime.
-**For Tool Builders:** Add `tpmjs-tool` keyword to your package.json.
+**For Tool Builders:** Add `tpmjs` keyword to your package.json.
Your tool appears on tpmjs.com within 15 minutes.
**For Agent Developers:** Use semantic search to find tools:
diff --git a/README.md b/README.md
index 03b88c6..057aaff 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
**TPMJS is a registry for discovering AI tools published to npm.**
-Browse, search, and find tools at [tpmjs.com](https://tpmjs.com). Publish your tool by adding the `tpmjs-tool` keyword to your package.json—it appears in the registry within 15 minutes.
+Browse, search, and find tools at [tpmjs.com](https://tpmjs.com). Publish your tool by adding the `tpmjs` keyword to your package.json—it appears in the registry within 15 minutes.
## Why TPMJS?
@@ -24,7 +24,7 @@ npx @tpmjs/create-basic-tools
Or add manually to your package.json:
```json
{
- "keywords": ["tpmjs-tool"],
+ "keywords": ["tpmjs"],
"tpmjs": {
"category": "text-analysis"
}
diff --git a/TPMJS_TALK.md b/TPMJS_TALK.md
index 99142bd..5a2b8ed 100644
--- a/TPMJS_TALK.md
+++ b/TPMJS_TALK.md
@@ -38,13 +38,13 @@ TPMJS runs three automated sync jobs:
**1. npm Changes Feed (every 2 minutes)**
```
-npm registry → /_changes endpoint → filter for tpmjs-tool keyword → process
+npm registry → /_changes endpoint → filter for tpmjs keyword → process
```
This catches new packages and updates in near-real-time. We track sequence numbers so we never reprocess.
**2. Keyword Search (every 15 minutes)**
```
-npm search "tpmjs-tool" → up to 250 results → validate → ingest
+npm search "tpmjs" → up to 250 results → validate → ingest
```
Backup mechanism. Catches anything the changes feed missed.
@@ -61,7 +61,7 @@ To get indexed, a package needs two things:
```json
{
"name": "@acme/my-tool",
- "keywords": ["tpmjs-tool"],
+ "keywords": ["tpmjs"],
"tpmjs": {
"category": "web-scraping",
"description": "Scrapes URLs and returns structured markdown"
@@ -303,7 +303,7 @@ Publish to npm → hope someone finds it → no visibility into usage
After TPMJS:
```
-Publish to npm with tpmjs-tool keyword → indexed within 2 minutes →
+Publish to npm with tpmjs keyword → indexed within 2 minutes →
schema auto-extracted → quality scored → discoverable by search →
execution stats tracked
```
@@ -383,7 +383,7 @@ Discovery is the bottleneck. We're fixing discovery.
- **Browse**: https://tpmjs.com/tool-search
- **Playground**: https://tpmjs.com/playground
-- **Publish**: Add `tpmjs-tool` keyword + `tpmjs` field to your package.json
+- **Publish**: Add `tpmjs` keyword + `tpmjs` field to your package.json
- **API**: `GET https://tpmjs.com/api/tools`
---
diff --git a/apps/tutorial/src/app/page.tsx b/apps/tutorial/src/app/page.tsx
index a08af14..70a5b0b 100644
--- a/apps/tutorial/src/app/page.tsx
+++ b/apps/tutorial/src/app/page.tsx
@@ -53,7 +53,7 @@ const tutorials = [
/>
),
- features: ['tpmjs-tool keyword', 'Schema extraction', 'Quality scoring'],
+ features: ['tpmjs keyword', 'Schema extraction', 'Quality scoring'],
},
];
diff --git a/apps/tutorial/src/components/author-slides/AuthorNextStepsSlide.tsx b/apps/tutorial/src/components/author-slides/AuthorNextStepsSlide.tsx
index 20051ed..660e5ce 100644
--- a/apps/tutorial/src/components/author-slides/AuthorNextStepsSlide.tsx
+++ b/apps/tutorial/src/components/author-slides/AuthorNextStepsSlide.tsx
@@ -3,7 +3,7 @@
import { motion } from 'framer-motion';
const steps = [
- { num: '1', text: 'Add "tpmjs-tool" to your package.json keywords' },
+ { num: '1', text: 'Add "tpmjs" to your package.json keywords' },
{ num: '2', text: 'Define your tools in the "tpmjs" field' },
{ num: '3', text: 'npm publish' },
];
diff --git a/apps/tutorial/src/components/author-slides/HowSyncWorksSlide.tsx b/apps/tutorial/src/components/author-slides/HowSyncWorksSlide.tsx
index 3fbc120..f9108e5 100644
--- a/apps/tutorial/src/components/author-slides/HowSyncWorksSlide.tsx
+++ b/apps/tutorial/src/components/author-slides/HowSyncWorksSlide.tsx
@@ -3,7 +3,7 @@
import { motion } from 'framer-motion';
const syncSteps = [
- { step: '1', text: 'You publish to npm with tpmjs-tool keyword', color: 'purple' },
+ { step: '1', text: 'You publish to npm with tpmjs keyword', color: 'purple' },
{ step: '2', text: 'Registry detects your package within 2 minutes', color: 'cyan' },
{ step: '3', text: 'We extract schemas from your package.json', color: 'emerald' },
{ step: '4', text: 'Your tool appears in search results', color: 'yellow' },
diff --git a/apps/tutorial/src/components/author-slides/PackageSetupSlide.tsx b/apps/tutorial/src/components/author-slides/PackageSetupSlide.tsx
index 59a389c..84df22c 100644
--- a/apps/tutorial/src/components/author-slides/PackageSetupSlide.tsx
+++ b/apps/tutorial/src/components/author-slides/PackageSetupSlide.tsx
@@ -7,7 +7,7 @@ const packageJson = [
{ id: 'name', line: ' "name": "@your-org/your-tools",' },
{ id: 'version', line: ' "version": "1.0.0",' },
{ id: 'keywords-open', line: ' "keywords": [' },
- { id: 'keyword', line: ' "tpmjs-tool"' },
+ { id: 'keyword', line: ' "tpmjs"' },
{ id: 'keywords-close', line: ' ],' },
{ id: 'tpmjs-open', line: ' "tpmjs": {' },
{ id: 'tools-open', line: ' "tools": [{ ... }]' },
@@ -43,7 +43,7 @@ export function PackageSetupSlide(): React.ReactElement {
@@ -40,9 +40,9 @@ export async function POST(request: NextRequest) {
const skippedPackages: Array<{ name: string; author: string; reason: string }> = [];
try {
- // Search for packages with 'tpmjs-tool' keyword
+ // Search for packages with 'tpmjs' keyword
const searchResults = await searchByKeyword({
- keyword: 'tpmjs-tool',
+ keyword: 'tpmjs',
size: 250, // Get up to 250 packages per sync
});
@@ -122,7 +122,7 @@ export async function POST(request: NextRequest) {
frameworks: validation.packageData.frameworks || [],
tier: validation.tier || 'minimal',
discoveryMethod: 'keyword',
- isOfficial: pkg.keywords?.includes('tpmjs-tool') || false,
+ isOfficial: pkg.keywords?.includes('tpmjs') || false,
npmDownloadsLastMonth: 0, // Will be updated by metrics sync
githubStars: githubStars,
},
@@ -141,7 +141,7 @@ export async function POST(request: NextRequest) {
env: validation.packageData.env ?? undefined,
frameworks: validation.packageData.frameworks || [],
tier: validation.tier || 'minimal',
- isOfficial: pkg.keywords?.includes('tpmjs-tool') || false,
+ isOfficial: pkg.keywords?.includes('tpmjs') || false,
},
});
diff --git a/apps/web/src/app/docs/page.tsx b/apps/web/src/app/docs/page.tsx
index 99a70fa..87904a2 100644
--- a/apps/web/src/app/docs/page.tsx
+++ b/apps/web/src/app/docs/page.tsx
@@ -370,9 +370,7 @@ Use registrySearch to find tools, then registryExecute to run them.\`,
TPMJS automatically discovers tools from npm packages that have the{' '}
-
- tpmjs-tool
- {' '}
+ tpmjs{' '}
keyword. Tools are indexed every 2-15 minutes.
@@ -832,7 +830,7 @@ while (true) {
{[
- { step: '1', label: 'Add tpmjs-tool keyword' },
+ { step: '1', label: 'Add tpmjs keyword' },
{ step: '2', label: 'Add tpmjs field' },
{ step: '3', label: 'Publish to npm' },
{ step: '4', label: 'Live in 15 minutes!' },
@@ -878,7 +876,7 @@ while (true) {
code={`{
"name": "@yourname/my-tool",
"version": "1.0.0",
- "keywords": ["tpmjs-tool"],
+ "keywords": ["tpmjs"],
"tpmjs": {
"category": "text-analysis",
"frameworks": ["vercel-ai"],
@@ -1118,7 +1116,7 @@ export TPMJS_EXECUTOR_URL=https://executor.mycompany.com`}
{[
{
q: 'How long does it take for my tool to appear?',
- a: 'Tools are discovered within 2-15 minutes of publishing to npm. Make sure you have the "tpmjs-tool" keyword in your package.json.',
+ a: 'Tools are discovered within 2-15 minutes of publishing to npm. Make sure you have the "tpmjs" keyword in your package.json.',
},
{
q: 'What is auto-discovery?',
@@ -1155,8 +1153,8 @@ export TPMJS_EXECUTOR_URL=https://executor.mycompany.com`}
Ensure you have{' '}
- tpmjs-tool in
- your keywords
+ tpmjs in your
+ keywords
Verify your tpmjs field is valid JSON
diff --git a/apps/web/src/app/faq/page.tsx b/apps/web/src/app/faq/page.tsx
index fa6d7dd..9d0fbc8 100644
--- a/apps/web/src/app/faq/page.tsx
+++ b/apps/web/src/app/faq/page.tsx
@@ -83,7 +83,7 @@ export default function FAQPage(): React.ReactElement {
Think of it as npm for AI tools. Developers publish tools to npm with the{' '}
- tpmjs-tool
+ tpmjs
{' '}
keyword, and TPMJS automatically syncs them to our registry where they can be
discovered by AI agents and developers.
@@ -97,7 +97,7 @@ export default function FAQPage(): React.ReactElement {
Add the{' '}
- tpmjs-tool
+ tpmjs
{' '}
keyword to your package.json
Automatic discovery and indexing of npm packages with the{' '}
- tpmjs-tool{' '}
+ tpmjs{' '}
keyword
A searchable registry of AI tools with quality scoring and health checks
@@ -247,7 +247,7 @@ export default function TermsPage(): React.ReactElement {
By publishing a tool to npm with the{' '}
- tpmjs-tool{' '}
+ tpmjs{' '}
keyword, you grant TPMJS a non-exclusive, worldwide, royalty-free license to:
@@ -321,7 +321,7 @@ export default function TermsPage(): React.ReactElement {
You may stop using the Service at any time. If you have published tools, they will
remain in the registry unless you remove the{' '}
- tpmjs-tool{' '}
+ tpmjs{' '}
keyword from your package or unpublish your package from npm.
diff --git a/apps/web/src/app/tool/[...slug]/ToolDetailClient.tsx b/apps/web/src/app/tool/[...slug]/ToolDetailClient.tsx
index 6b62f1b..29af85a 100644
--- a/apps/web/src/app/tool/[...slug]/ToolDetailClient.tsx
+++ b/apps/web/src/app/tool/[...slug]/ToolDetailClient.tsx
@@ -11,6 +11,8 @@ import { Spinner } from '@tpmjs/ui/Spinner/Spinner';
import Link from 'next/link';
import { useState } from 'react';
import { AppHeader } from '~/components/AppHeader';
+import { BundleSize } from '~/components/BundleSize';
+import { DownloadSparkline } from '~/components/DownloadSparkline';
import { Markdown } from '~/components/Markdown';
import { ToolPlayground } from '~/components/ToolPlayground';
@@ -340,6 +342,21 @@ export function ToolDetailClient({ tool, slug }: ToolDetailClientProps): React.R
language="bash"
showCopy={true}
/>
+
+
+