commits in the last year
Don't waste time on Stripe subscriptions or designing a pricing section. Get started today with our battle-tested stack and built-in monetization features.
Get Lifetime Access
565 commits in the last year
© 2026 Dirstarter. All rights reserved.
Programmatic access to tools, categories, tags, posts, and AI generation via a REST API with OpenAPI docs
DirStarter now ships with a public REST API at /api/v1 for programmatic management of your directory. Build integrations, automate content workflows, or connect external tools without touching the dashboard.

/api/v1: CRUD operations for tools, categories, tags, and blog posts/api/v1/docs with Try-it-out supportRetry-After headersIssue an API key from the API keys page in your dashboard (/app/api-keys). The full token is shown once; only a SHA-256 hash is stored. Send it as Authorization: Bearer <key> — a key acts as its owner and inherits that user's permissions, so sensitive resources such as ads, users, reports, and metrics stay locked to the dashboard. Revoke or expire a key to cut off access instantly.
The OpenAPI spec and REST surface also lay the groundwork for agentic access in future releases, such as an MCP server or CLI for managing your directory from AI tools and scripts.
See the Public HTTP API documentation for authentication, endpoints, and examples.
All UI components have been migrated from Radix UI to Base UI for a more modern, flexible foundation
We've migrated all UI components from Radix UI to Base UI — a lower-level, unstyled component library that gives you more control over rendering and styling.
asChild prop has been replaced with Base UI's render prop and useRender hook for polymorphic renderingtailwind-variants instead of cva, with support for multi-element slot stylingdata-open, data-horizontal, etc.) instead of Radix's data-state attributesIf you've customized any UI components, you'll need to update:
asChild → render prop — Components no longer accept asChild. Use the render prop with a callback insteaddata-state="open" with data-open, and similar Base UI attribute conventionstailwind-variants syntax. Check for updated patternsBlog posts are now fully managed through the admin dashboard with a rich text editor, scheduling, and database storage
Blog posts are no longer stored as static MDX files. They now live in your database with a full admin interface for creating, editing, and publishing – giving you complete control over your content without touching code.

If you're upgrading from a previous version that used file-based MDX blog posts, a migration script is included to automatically move your content to the database:
Signed-in users can now bookmark tools and manage them from a dedicated dashboard tab
We've added tool bookmarks so your users can save tools they find interesting and come back to them later — all from a dedicated tab in their dashboard.

Bookmarks are stored as a simple relation between users and tools, with a unique constraint ensuring each tool can only be bookmarked once per user. When a user or tool is deleted, associated bookmarks are automatically cleaned up via cascading deletes.
The bookmark button appears alongside existing tool actions (report, embed, visit) and visually indicates whether a tool is already saved.
Replace the simple featured flag with a flexible three-tier system for tool listings
We've replaced the simple "featured" toggle with a three-tier listing system that gives you more flexibility in how you monetize and display tools in your directory.
The tier system is built into your Stripe products. Add a tier field to your product metadata (e.g., tier: "Standard" or tier: "Premium"), and the webhook will automatically update the tool's tier when a purchase completes.
In the admin panel, you'll now see a tier dropdown instead of the old "Feature this tool" toggle. This gives you full control over tool visibility and benefits without requiring a payment.
components/common/@radix-ui/react-slot — Use the new slot() utility from lib/slot.ts backed by Base UI's mergePropsSKIP_ENV_VALIDATION=1 bun run scripts/migrate-posts.tsThe script parses frontmatter, extracts plain text for search, and inserts each post into the database. It's safe to run multiple times – posts with existing slugs are skipped.
Existing featured tools have been automatically migrated to the Premium tier. All other tools start at the Free tier. No action is required on your part.