A static directory starter for Nuxt 4. No database, no CMS account, no server, no signup — entries are files in the repository, and the whole site builds to plain HTML you can host anywhere for free.
Status: v0.1.0, early. It builds and it works, and it is small. Please read What it does not do before investing time — that section is longer than the feature list, on purpose.
Most directory starters assume you want a platform: visitors sign up, submit their own lis$ings, pay for featured spots, and you moderate from an admin panel. That needs a database, an auth provider, a payment webhook and a running server. If that is the directory you are building, this is the wrong repository — see the links at the end of the next section.
This one assumes the opposite: one person curates the list. You add an entry, you commit, it deploys. That removes the backend, and with it the hosting bill, the accounts, and every third-party request at runtime.
-
Entries as data. One
data/entries.json. Add an object, rebuild, done. -
Generated pages. Index, one detail page per entry, one page per category — all pre-rendered to static HTML at build time.
-
Client-side search and filtering. Full-text filter plus category filter, no search service.
-
SEO plumbing, which is most of what a directory is actually for:
- per-page
<title>and meta description derived from the entry data - canonical URLs
sitemap.xmlandrobots.txtgenerated at build time- JSON-LD structured data —
ItemListon the index,SoftwareApplicationon detail pages
- per-page
-
No third-party requests at runtime. No trackers, no analytics, no CDN, no externally loaded web fonts. The generated HTML references your own assets and the outbound links in your own entries — nothing else. Verify it yourself rather than believing me:
npm run generate grep -roE 'https?://[a-z0-9.-]+' .output/public --include='*.html' | sed 's/.*http/http/' | sort -u
That is a factual property of the build output, not a legal claim. Which obligations apply to your site depends on what you add and where you host it.
-
Plain CSS. No UI framework, no licence to buy, nothing to keep in sync.
This is the honest half. Because there is no server, none of the following is possible, and no configuration will change that:
- No submission form. Visitors cannot add entries. Entries arrive as a commit or a pull request — which works if your audience are developers, and not at all if they are not.
- No user accounts. No login, no "edit my listing", no password reset.
- No payments. Paid listings, featured spots and sponsored placements all need a server to receive the payment webhook. A static site never learns that anyone paid.
- No moderation workflow. No pending/approved states, no admin panel. Your admin panel is your text editor.
- No AI autofill at request time. An API key must never reach the browser.
- No uploads, comments, ratings or view counters.
If you need any of those, the honest recommendation is to start from a full-featured open-source project instead — for example MkThingsHQ/mkdirs (Apache-2.0, Next.js, includes submissions, auth, Stripe and moderation) or PBHAHAHA/Nuxt_Mkdirs (MIT, Nuxt 4). They do those things. This does not.
npm install
npm run dev # http://localhost:3000
npm run generate # static build into .output/public/Deploy .output/public/ to any static host.
Set your own domain so canonical URLs and the sitemap are correct:
NUXT_PUBLIC_SITE_URL=https://your-directory.example npm run generateAppend to data/entries.json:
{
"slug": "my-tool",
"name": "My Tool",
"description": "One or two sentences. Also used as the meta description.",
"url": "https://example.org",
"category": "Developer Tools",
"tags": ["tag-a", "tag-b"],
"license": "MIT"
}Rebuild. The detail page, the category page, the sitemap entry and the structured data all follow from that object.
The example directory lists real open-source self-hosted projects with their actual URLs and
licences. Nothing in it is invented, and no project listed has endorsed this repository.
Replace data/entries.json with your own data.
v0.1.0 is deliberately small. The following is planned and therefore not present today:
- (planned) a local build script that fills an entry from a URL
- (planned) pagination for large directories
- (planned) tag pages alongside category pages
- (planned) an RSS feed
None of the above exists yet. If one of them matters to you, an issue is the fastest way to move it up the list.
There is no mailing list and no contact form. Open an issue — that is the only channel. Starring the repository is a useful signal to me about whether this is worth continuing.
MIT ℔ see LICENSE.
Operator of the demo site: Christopher Kraft, Albert-Schweitzer-Straße 1, 51429 Bergisch Gladbach, Germany, chris@kr