NuxtVuePortfolio

esfahani-nuxt-theme — Nuxt Portfolio Template

By aynzad

Esfahani Theme is a Nuxt-based bilingual personal website and blog theme. Article content comes from Prismic, the projects page automatically pulls public GitHub repositories, and it supports using Gemini to automatically translate the projects page into Persian.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-03View source

What stands out

A quick read of the recorded project description.

01

Supports bilingual English and Persian (RTL) sites via @nuxtjs/i18n

02

Articles, about, and contact pages are provided by the Prismic headless CMS, with corresponding custom type definitions included in the repository

03

The projects page automatically pulls public GitHub repositories, displaying name, description, topics, star count, and demo links

04

The Persian projects page can be translated server-side via the Vercel AI SDK calling Google Gemini and cached by string, falling back to English when no key is available

05

Supports SSR, per-language sitemaps (including article images), canonical, og:image, and hreflang

06

Uses @nuxt/fonts to self-host Josefin Sans, Open Sans, and Vazirmatn fonts

Template Details

Esfahani Theme is a Nuxt theme for personal websites or blogs, released under the MIT license, authored by aynzad, with an online demo site at esfahani.dev. The theme's core positioning is a bilingual (English and Persian RTL) content site, using @nuxtjs/i18n to implement language switching and RTL layout.

Content is divided into three parts: articles, about, and contact pages are provided by the Prismic headless CMS. The repository includes three custom type definition files—about, contact, and articles—which need to be created in Prismic according to these structures; articles use Shiki for code highlighting and separate content by language. The projects page automatically lists public repositories of a specified account via the GitHub REST API, excluding forks and archived repositories, sorted by recent activity, with each card showing the repository name, description, topics, star count, and homepage link.

Under the Persian route, the repository names, descriptions, and topics on the projects page are translated server-side via the Vercel AI SDK calling Google Gemini, and cached by string; when no Gemini key is configured, it falls back to displaying English. The site supports SSR, generates sitemaps per language (including article images), canonical, og:image, and hreflang, and optionally integrates GA4. Fonts use @nuxt/fonts to self-host Josefin Sans, Open Sans, and Vazirmatn.

Regarding usage limitations: the theme relies on Prismic as the source for article and page content, requiring you to register and configure a repository yourself; the projects page relies on the GitHub API, and without a configured read-only token it is subject to a limit of 60 requests per hour; Persian automatic translation relies on a Gemini API key, which is an external service. One item in the README's TODO remains unfinished—fields such as name and job description have not yet been changed to be dynamically read from Prismic.

NuxtPortfolio

Is it right for your project?

Use Cases

  • Building a personal website or blog that needs both English and Persian (RTL) versions
  • Managing article, about, and contact page content with Prismic, and wanting articles separated by language
  • Wanting a projects showcase page that automatically syncs public GitHub repositories instead of manually maintaining a project list
  • Needing to automatically translate projects page content for Persian visitors while retaining an English fallback
  • Needing SSR pages and configuring sitemap, hreflang, canonical, and optional GA4 analytics

Suitable For

  • Individual developers with Prismic experience or willing to register a Prismic repository
  • Blog or portfolio authors who need English and Persian bilingual support and accept RTL layout
  • Developers who want the project list generated automatically from public GitHub repositories rather than maintained manually
  • Site maintainers who can provide a Gemini API key to enable Persian automatic translation
  • Front-end developers using pnpm and TypeScript workflows, possibly deploying to Vercel

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    After cloning the repository, run pnpm install and copy .env.sample to .env for configuration

  2. 2

    You need to create a repository in Prismic, create corresponding custom types according to about.json, contact.json, and articles.json under .prismic-custom-types in the repository, and fill the API endpoint into NUXT_PUBLIC_API_URL

  3. 3

    NUXT_PUBLIC_SITE_URL is required, used for sitemap, canonical, og:image, and hreflang; NUXT_PUBLIC_GITHUB_USERNAME is required for the projects page

  4. 4

    NUXT_GITHUB_TOKEN is an optional read-only PAT used to raise the GitHub API limit of 60 requests per hour; when NUXT_GEMINI_API_KEY is empty, the Persian projects page displays English

  5. 5

    NUXT_OG_IMAGE_SECRET is used for the dynamic OG image endpoint; leaving it empty disables the feature; NUXT_PUBLIC_GOOGLE_ANALYTICS_ID only accepts the GA4 G-XXXX format

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This listing covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.

Must comply with when using

  • Free use, modification, commercial use, and distribution of this version's code are permitted.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Using the theme's article, about, and contact page content requires the Prismic headless CMS; you must register a Prismic account, create a repository, fill the API endpoint into NUXT_PUBLIC_API_URL, and create corresponding custom types according to about.json, contact.json, and articles.json in the repository.
  • The projects page relies on the GitHub REST API, and NUXT_PUBLIC_GITHUB_USERNAME must be configured to specify the GitHub account to display; without a configured read-only PAT (NUXT_GITHUB_TOKEN), it is subject to GitHub's limit of 60 requests per hour.
  • Automatic translation of the Persian projects page relies on the external Google Gemini service and requires NUXT_GEMINI_API_KEY; when no key is provided, the Persian route falls back to displaying English without translation.
  • The dynamic OG image feature requires NUXT_OG_IMAGE_SECRET; leaving it empty disables the endpoint, so dynamic OG images cannot be generated.
  • One item in the README's TODO remains unfinished: fields such as name and job description have not yet been changed to be dynamically read from Prismic and currently must be maintained statically in code.
  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur additional charges.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

Create your [prismic](http://prismic.io/dashboard/signup) account.

Original README

`NUXT_PUBLIC_GITHUB_USERNAME` | for Projects | GitHub account whose public repos are listed

Original README

`NUXT_GEMINI_API_KEY` | no | Gemini key to auto-translate Projects into Farsi (empty = Farsi shows English)

Original README

`NUXT_OG_IMAGE_SECRET` | for OG | Secret used by the OG image endpoint; empty disables dynamic OG images

Original README

- [ ] Make name, job description, and similar fields dynamic by pulling them from Prismic

Original README
https://github.com/aynzad/esfahani-nuxt-theme/blob/master/LICENSEhttps://github.com/aynzad/esfahani-nuxt-theme/blob/master/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-03. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 83 / 100
Technologies
Nuxt · Vue
Website type
Portfolio
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-05-28
Screenshot last checked
2026-10-03

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Nuxt as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: a1992920314d1238111c532a056f02eb66df511dfe456860aac1cbf8888d1851

2026-10-03T04:58:29.405Z

Source file / repository
<p align="center"><img align="center" style="width:320px" src="./public/android-chrome-512x512.png"/></p><br/>
<p align="center">
    <span><img src="https://badgen.net/badge/license/MIT/blue" alt="license"></span>
    <span><img src="https://badgen.net/github/releases/aynzad/esfahani-nuxt-theme" alt="release"></span>
    <span><img src="https://badgen.net/github/last-commit/aynzad/esfahani-nuxt-theme" alt="last commit"></span>
    <span><img src="https://badgen.net/github/commits/aynzad/esfahani-nuxt-theme" alt="commits"></span>
    <span><img src="https://badgen.net/github/open-issues/aynzad/esfahani-nuxt-theme" alt="open issues"></span>
</p>

# Esfahani 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.

## Live Demo

Live production demo is available on [esfahani.dev](https://esfahani.dev).

## Features

- **Bilingual** — English and Farsi (RTL) via `@nuxtjs/i18n`.
- **Articles** — authored in Prismic, rendered with Shiki code highlighting and per-locale content.
- **Projects** — auto-populated from a GitHub account's public repos (stars, topics, demo links).
- **Farsi auto-translation** — the Projects page is translated on the server with Google Gemini (Vercel AI SDK), cached per string, with graceful fallback to English.
- **SSR + SEO** — server-rendered pages, sitemap (both locales, with article images), and GA4 analytics.
- **Self-hosted fonts** — Josefin Sans, Open Sans, and Vazirmatn via `@nuxt/fonts`.
- **Typed & linted** — TypeScript throughout, ESLint flat config.

## How it works:

- [Nuxt 4](https://nuxt.com/) (Vue 3, Nitro) SSR
- [Prismic](https://prismic.io/) headless CMS for articles/about/contact
- [GitHub REST API](https://docs.github.com/rest) powers the **Projects** page (public repos)
- [Vercel AI SDK](https://ai-sdk.dev/) + [Google Gemini](https://ai.google.dev/) to auto-translate the Projects page into Farsi
- [@nuxtjs/i18n](https://i18n.nuxtjs.org/) — English / Farsi (RTL)
- [Vercel](https://vercel.com/) deployment (auto-detected by Nitro)
- [TypeScript](https://typescriptlang.org/)
- [SASS](http://sass-lang.com/) preprocessor for CSS
- [pnpm](https://pnpm.io/) package manager

## Setup

### Install the project:

```shell
$ git clone https://github.com/aynzad/esfahani-nuxt-theme.git
$ pnpm install
$ cp .env.sample .env
```

Then run it:

```shell
$ pnpm dev      # dev server
$ pnpm build    # production build
```

### Create a `Prismic` repository

1. Create your [prismic](http://prismic.io/dashboard/signup) account.
1. [Create a repository](https://prismic.io/dashboard/new-repository)
1. Set `NUXT_PUBLIC_API_URL` in `.env` to your repository API endpoint.
1. Create a `about` custom type, using [about.json](./.prismic-custom-types/about.json) file.
1. Create a `contact` custom type, using [contact.json](./.prismic-custom-types/contact.json) file.
1. Create a `articles` custom type, using [articles.json](./.prismic-custom-types/articles.json) file.

### Environment variables

Configured in `.env` (see [.env.sample](./.env.sample)):

| Variable                          | Required     | Purpose                                                                                  |
| --------------------------------- | ------------ | ---------------------------------------------------------------------------------------- |
| `NUXT_PUBLIC_API_URL`             | yes          | Prismic repository API endpoint                                                          |
| `NUXT_PUBLIC_SITE_URL`            | yes          | Canonical site origin (no trailing slash); powers sitemap, canonical, og:image, hreflang |
| `NUXT_PUBLIC_GOOGLE_ANALYTICS_ID` | no           | GA4 measurement id (`G-XXXX`); legacy `UA-*` values are ignored                          |
| `NUXT_PUBLIC_PAGE_SIZE`           | no           | Articles per page on listing routes (default `10`)                                       |
| `NUXT_PUBLIC_IS_STAGING`          | no           | Flag staging deploys, e.g. for robots/noindex toggles (default `false`)                  |
| `NUXT_PUBLIC_GITHUB_USERNAME`     | for Projects | GitHub account whose public repos are listed                                             |
| `NUXT_GITHUB_TOKEN`               | no           | Read-only PAT to lift GitHub's 60 req/hr limit                                           |
| `NUXT_GEMINI_API_KEY`             | no           | Gemini key to auto-translate Projects into Farsi (empty = Farsi shows English)           |
| `NUXT_GEMINI_MODEL`               | no           | Override Gemini model (default `gemini-2.5-flash`)                                       |
| `NUXT_OG_IMAGE_SECRET`            | for OG       | Secret used by the OG image endpoint; empty disables dynamic OG images                   |

### Projects page

The Projects page lists the public repositories of `NUXT_PUBLIC_GITHUB_USERNAME` (forks/archived excluded, newest activity first). Each card shows the repo name, description, topics, star count, and a demo link when the repo has a homepage. On the Farsi route the names/descriptions/topics are translated on the server via Gemini (cached per string); without a key it falls back to English.

### Deploy on `Vercel` _(optional)_

You can use [Vercel](https://vercel.com/) for CI and CD your own fork of this project.

1. Create your [Vercel](https://vercel.com/signup) account.
1. [Create a Project](https://vercel.com/new) and import **your** git repository.

## Contributing

Great that you are considering supporting the project. You have a lot of ways to help me grow. I appreciate all contributions, even the smallest.

- Report an issue.
- Propose a feature.
- Send a pull request.
- Star project on the [GitHub](https://github.com/aynzad/esfahani-nuxt-theme)
- Tell about project around your community.

## TODO

- [x] Implement projects page
- [x] Improve SEO and accessibility
- [x] Add RSS feed (RSS 2.0, Atom, JSON Feed; per-locale).
- [x] Config test packages (like `vitest`) and Add unit test
- [ ] Make name, job description, and similar fields dynamic by pulling them from Prismic

## License

It is licensed under the [MIT license](http://opensource.org/licenses/MIT).
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.