
TL;DR
The DevDigest tools directory is not just a list of links. One registry now feeds tool pages, category filters, comparison routes, RSS, JSON APIs, search, sitemap discovery, and content expansion loops.
Read next
A field note on adding pricing, Pro, apps, sponsors, partners, hiring, consulting, newsletter, and weekly rollup paths to DevDigest without turning the site into vague growth copy.
8 min readThe DevDigest blog is no longer just a folder of markdown files. It is becoming a small content operating system: posts, tags, RSS, search, llms.txt, route discovery, content expansion reports, and app-linked build logs.
9 min readFrom terminal agents to cloud IDEs - these are the AI coding tools worth using for TypeScript development in 2026.
8 min readTool directories usually fail in one of two ways.
The first version is a static list. It helps for a week, then every new tool, pricing change, category page, comparison, RSS item, and search result becomes manual upkeep.
The second version goes the other way. It turns into a giant database product before it has earned the complexity.
The DevDigest tools directory sits in the middle.
It is still simple enough to understand in one pass, but it has enough structure to compound.
That is the point of this build log.
The useful thing is not that /tools exists. The useful thing is that the same tool registry can feed human browsing, search, comparison pages, RSS, JSON APIs, sitemap discovery, and future editorial reports.
The source of truth is lib/tools.ts.
Each tool entry has the fields the rest of the site needs:
id for stable routes like /tools/claude-code,name for labels, metadata, search, and comparison titles,category for filters and category pages,description for cards, RSS summaries, JSON APIs, and search snippets,longDescription for the detail page and RSS body,link and optional affiliateLink for outbound routing,badge, tags, videos, addedDate, and featuredImage for richer surfaces.That is not an enterprise content model.
It is just enough schema.
The directory then fans out into routes:
/tools/[slug] for individual tool pages,/tools/categories/[category] for ranked category pages,/compare/[slug] for public head-to-head pages,The important part is not any single route.
The important part is that a new tool can enter several systems without being rewritten five times.
When the site had a handful of tools, hardcoding cards was fine.
Once the directory became a real asset, hardcoding became the enemy.
The same facts kept showing up in different places:
If those facts live in five places, they drift.
If they live in one registry, every surface becomes cheaper to maintain.
That is why the directory is a content system, not just a page.
The registry is the contract.
/toolsThe /tools page is the human entry point.
It does a few jobs at once:
ToolsDirectoryClient,The client component is where the directory becomes usable.
It supports search, category filters, sorting by name, category, video count, or votes, grid and list view, popular tag shortcuts, and URL syncing for category filters.
That last part matters.
The filter is not just local UI state. A category can be linked, shared, and recovered from the URL.
That makes the directory useful as infrastructure for other pages.
Get the weekly deep dive
Tutorials on Claude Code, AI agents, and dev tools - delivered free every week.
From the archive
May 30, 2026 • 8 min read
May 30, 2026 • 9 min read
May 30, 2026 • 10 min read
May 30, 2026 • 11 min read
/tools/[slug]Each tool page is statically generated from the registry.
The route uses getAllToolSlugs() for static params and getToolById() for lookup. If a slug is not in the registry, it 404s.
The page adds:
This is the compounding part.
A tool is not only a card on /tools. It becomes a page that can rank, be shared, be linked from a blog post, show up in search, appear in sitemap, and become part of a comparison.
/tools/feed.xmlThe tools RSS feed is small but useful.
It sorts entries with addedDate first, then falls back to undated tools. Each item includes:
content:encoded,pubDate when addedDate exists,That gives subscribers and feed-aware bots a way to notice tool inventory changes without crawling the whole site.
It also makes the directory feel alive.
If a tool gets added and dated, it can show up in a feed instead of silently appearing in a grid.
There are two machine-readable tool surfaces.
/api/tools is the lightweight filtered endpoint. It accepts a category and query parameter, filters the registry, and returns { tools, total }.
/api/tools.json is the directory export. It returns:
That split is healthy.
One route is useful for lightweight app behavior. The other is useful for agents, scripts, dashboards, and external systems that want the full directory as data.
The site search index pulls tools directly from lib/tools.ts.
In lib/searchIndex.ts, every tool becomes a search item with:
tool,/tools/[id],The same search index also includes standalone pages such as /tools/categories, /tools/compare, and /compare/matrix, plus public comparison routes and public tool category pages.
That is a small but important difference.
Search should find both the object and the surface around the object.
If someone searches "Claude Code", the tool page matters.
If someone searches "compare tools", the comparison route matters.
If someone searches "AI frameworks", the category route matters.
That index backs more than one interface. The /search page uses buildSearchIndex() directly, the Cmd-K search modal fetches /api/search-index when it opens, and /opensearch.xml lets browsers point search queries at the site.
The comparison system has several shapes.
lib/comparisons.ts defines curated tool pairs by ID. Those pairs generate public head-to-head comparison pages such as /compare/claude-code-vs-cursor.
The comparison builder pulls the tool records, creates dimensions like category, type, pricing, best for, language or platform, and open source status, then exposes only public comparison entries.
The /compare hub groups public comparisons, comparison articles, seed comparisons, canonical decision links, and FAQ schema.
The /tools/compare route solves a different problem: pick two or three tools from the registry and compare them side by side quickly.
Those are separate jobs.
The first is editorial. It says, "Here are the head-to-head pages worth publishing."
The second is utility. It says, "Let me compare the exact tools I am considering."
Both depend on the tool registry staying clean.
The sitemap includes:
/tools,/tools/categories,/tools/new,/tools/submit,/tools/compare,/tools/[slug] page,/tools/categories/[category] page,/compare,/compare/matrix.That matters because directory work should not be invisible.
If the site creates structured tool pages but forgets discovery, the pages are technically present and practically buried.
The sitemap turns registry entries into crawlable inventory.
The current system is useful, but it still has rough edges.
The biggest one is drift.
/compare/matrix has its own local list of tools. It is useful as a matrix, but it is not the same source of truth as lib/tools.ts.
That is the next obvious cleanup.
The matrix should either derive from the registry or declare exactly why it is a curated subset.
Same with any route that knows tool names, prices, or categories outside the registry. Duplicated facts are acceptable for a first version. They become liabilities once the site grows.
The second improvement is freshness.
The RSS feed has addedDate, but the directory could use a more visible "new tools" lane that turns recent tool additions into blog, feed, and newsletter material.
The third improvement is source discipline.
Tool pages should not become stale vendor blurbs. Pricing, model names, and plan limits change constantly. The registry should describe workflow fit, then link readers to current vendor docs and pricing pages when the claim is time-sensitive.
There are four parts of this system I do not want fully automated.
Agents can suggest tools. They should not decide the directory.
Every tool needs a reason to exist: audience demand, search demand, personal usage, a video tie-in, or a comparison route that needs it.
Pricing changes too often.
If a page needs exact dollars, it should either point to a current source or live in a pricing-specific surface that gets refreshed deliberately.
Generated dimensions are useful for scaffolding.
Final verdicts need judgment.
Comparisons are where trust is won or lost.
Affiliate links should never be the primary content model.
They can exist, but the directory has to stay useful even when a tool has no affiliate program.
The useful pattern is:
one registry
many routes
human page
machine API
feed
search index
sitemap
editorial backlinks
repeat
That is the same pattern from the agent content system build log.
The difference is the object.
For the blog, the object is a markdown post.
For the app directory, the object is an app entry.
For the tools directory, the object is a tool record.
The principle is the same: do not ship isolated pages when you can ship a small system.
The tool directory is not done when the cards render.
It is done when each tool enters the full distribution layer:
That is how a directory compounds.
Not as a database for its own sake.
As a set of routes that help developers decide what to use next.
Technical content at the intersection of AI and development. Building with AI agents, Claude Code, and modern dev tools - then showing you exactly how it works.
Local-first markdown knowledge base with wikilinks. My entire DevDigest pipeline lives here - research, scripts, conte...
View ToolMCP server directory and ranking site. Tracks weekly downloads, GitHub stars, and build status across 5,000+ servers.
View ToolGoogle's open-source coding CLI. Free tier with Gemini 2.5 Pro. Supports tool use, file editing, shell commands. 1M toke...
View ToolAI app builder - describe what you want, get a deployed full-stack app with React, Supabase, and auth. No coding requi...
View ToolFind the right CLI without trawling GitHub. Search, filter, install.
View AppTurn a one-liner into a working Claude Code skill. From idea to installed in a minute.
View AppTalk, get text. A Mac dictation app that doesn't waste your words.
View AppStep-by-step guide to building an MCP server in TypeScript - from project setup to tool definitions, resource handling, testing, and deployment.
AI AgentsPer-directory prompt history with Ctrl+R reverse search.
Claude CodeSearch file contents by pattern with regex support.
Claude Code
A field note on adding pricing, Pro, apps, sponsors, partners, hiring, consulting, newsletter, and weekly rollup paths t...

The DevDigest blog is no longer just a folder of markdown files. It is becoming a small content operating system: posts,...

From terminal agents to cloud IDEs - these are the AI coding tools worth using for TypeScript development in 2026.

12 AI coding tools across 4 architecture types, compared on pricing, strengths, weaknesses, and best use cases. The defi...

Complete pricing breakdown for every major AI coding tool. Claude Code, Cursor, Copilot, Windsurf, Codex, Augment, and m...

A tour of every app and tool in the Developers Digest network - from AI model comparisons to cron job scheduling.

What if your dev tools weren't separate apps but one operating system? The thesis behind /os and /suites - small, shar...

New tutorials, open-source projects, and deep dives on coding agents - delivered weekly.