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
477 commits in the last year
© 2026 Dirstarter. All rights reserved.
The separate admin and dashboard areas are now one permission-gated /app workspace
The admin panel and the user dashboard have merged into a single /app workspace. Instead of two separate areas, everyone signs in to one dashboard that adapts to their role: admins manage content, while every signed-in user gets their own submissions and bookmarks.
/app: Content management, settings, and personal pages live under a single shell, and the sidebar shows only what your role can accesscan(user, permission)) decides what each user sees, replacing the hard split between the admin and dashboard areas/app/api-keys (admin only)/admin/* and /dashboard/* 308-redirect to their /app/* equivalents, so existing bookmarks and external links stay validExisting routes redirect automatically, so there's nothing to change in your deployment. Just sign in at /app.
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, admin only). 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.
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.