
Template details
Esfahani Nuxt Theme
The Esfahani Theme is a multilingue NuxtJs theme which aims to modernize, organize and enhance some aspects of personal website or weblog themes development.
About this template
The Esfahani Nuxt Theme is a bilingual English/Farsi starter for personal websites and weblogs built on Nuxt 4, using Prismic as a headless CMS and the GitHub REST API to power a Projects page.
What is the Esfahani Nuxt Theme?
It is a server-side-rendered Nuxt 4 theme that takes content from Prismic (articles, about, contact) and public GitHub repositories as inputs, and produces a personal website with English and Farsi locales, sitemap, RSS feeds, and SEO metadata. The theme is maintained by aynzad on GitHub and is licensed under the MIT license. It uses Vue 3, Nitro, SASS, and TypeScript throughout.
Key Features
- Bilingual i18n — English and Farsi (RTL) via @nuxtjs/i18n, with per-locale content and translated URLs.
- Prismic CMS integration — Articles, About, and Contact content authored in Prismic, using custom types defined in the repo (about.json, contact.json, articles.json).
- GitHub-powered Projects page — Public repositories of a configured GitHub user are listed, excluding forks and archived repos, showing name, description, topics, star count, and homepage link.
- Farsi auto-translation — The Projects page is translated server-side with Google Gemini (Vercel AI SDK) with per-string caching; without a Gemini key it falls back to English.
- SSR and SEO — Server-rendered pages, sitemap covering both locales with article images, canonical URLs, hreflang, and GA4 analytics.
- Self-hosted fonts — Josefin Sans, Open Sans, and Vazirmatn (for Farsi) bundled via @nuxt/fonts.
- RSS feeds — RSS 2.0, Atom, and JSON Feed generated per locale.
- Typed codebase — TypeScript throughout with ESLint flat config and unit tests (Vitest).
Who is it for?
- Personal bloggers — set up a bilingual weblog with Prismic as the admin interface without building the front-end.
- Developers — fork the repo and customize the Nuxt 4 structure, SASS styles, and components to learn modern Nuxt patterns.
- Portfolio-driven freelancers — showcase open-source work by pointing the Projects page at a GitHub account and letting it auto-update.
- Farsi-speaking audiences — out-of-the-box RTL layout and auto-translated project content.
What can you do with the Esfahani Nuxt Theme?
- Publish bilingual articles: Write content in Prismic and serve it in English and Farsi with language-specific routing.
- Auto-display your GitHub projects: Connect a GitHub username and the site lists public repos with stars and topics on a Projects page.
- Deploy to Vercel: Push the repo to your own GitHub account, import it into Vercel, and get an SSR site with automatic deployment detection.
How does it work?
The README describes a setup: clone the repo, install with pnpm, copy .env.sample to .env, create a Prismic repository, and set environment variables such as NUXT_PUBLIC_API_URL. Then run pnpm dev for development or pnpm build for production. On the server, Nuxt fetches Prismic content and GitHub data, and optionally translates project metadata with Gemini.
FAQ
Is the Esfahani Nuxt Theme free?
Yes, it is open source under the MIT license, so you can use it for personal or commercial projects without licensing fees.
Which CMS does it use?
It uses Prismic as a headless CMS. You create an account, create a repository, and set NUXT_PUBLIC_API_URL to your endpoint. Custom types for about, contact, and articles are included in the repo.
Does the theme support RTL languages?
Yes, it is bilingual with English and Farsi, and Farsi uses an RTL layout via @nuxtjs/i18n.
How does the Projects page get data?
It uses the GitHub REST API to list public repos from the NUXT_PUBLIC_GITHUB_USERNAME, excluding forks and archives. A read-only GitHub token can be set to raise the API rate limit above the default 60 requests per hour.
What happens if I don't set a Gemini API key?
The Farsi auto-translation of the Projects page is disabled and the page falls back to showing English content. The key is optional, but without it the translated strings are not generated.
















