gora.
next.js · i18n · hreflang · remote

Next.js Developer for Multilingual Websites

Gora is an independent full-stack developer who builds multilingual websites in Next.js: every language on its own URL, hreflang and localized metadata set up correctly, sitemaps that list each version, and typography that works for both Latin and Cyrillic text. Production sites in Lithuanian, Russian and English stand behind this page.

  • Three languages on one production storefront
  • 979 pages in two locales with consistent hreflang
  • 1,958 URLs across four sitemaps

Language support is mostly URL, metadata and content-structure work, not translated strings alone. This is the part I do deliberately on every site.

  • One URL per language

    Each language gets its own path prefix (/lt, /ru and /en on Jusmila) and is rendered statically, so search engines and visitors land on the version they asked for.

  • hreflang that matches reality

    Every page lists all of its language versions plus an x-default, the pairs are reciprocal and the sitemap carries the same pairs. A page that exists in one language only declares no false alternates. This site is built that way, with English as the unprefixed default language.

  • Localized metadata and structured data

    Titles, descriptions and Open Graph tags are set per language and per page, and JSON-LD carries the language of the page. Aperwind's structured data covers 23 schema.org types.

  • Latin and Cyrillic typography

    Fonts, line lengths and headings are checked with both scripts, because a layout that works in English can break in Russian, where words run longer.

  • A keyword cluster per language

    People search with different words in each language, so each language gets its own page structure instead of a translated copy. The Vilnius SEO project handled Lithuanian, Polish and Russian queries separately.

  • Catalogues and admin panels in several languages

    Product and listing catalogues with an admin panel for staff: 10,000+ parts in three languages for Jusmila, a daily-synced property catalogue in two languages for Aperwind.

  • URL hygiene as languages grow

    Lowercase paths, redirects for retired URLs, 410 for a section that no longer exists and no sitemap entries for pages marked noindex: the checks that keep a multilingual site from contradicting itself.

  • Changing the languages of a live site

    Adding a language or changing the URL scheme with permanent redirects from the old addresses, so indexed pages keep their signals. This site moved English from a /en prefix to the unprefixed root that way.

Three production projects with their numbers. Each links to the full case study.

Jusmila — motorcycle parts e-commerce in three languages

Storefront for motorcycle, ATV and moped parts in Lithuanian, Russian and English, with a local warehouse in Šakiai.

What was done
A Next.js storefront on next-intl where each language is its own URL prefix (/lt, /ru, /en), statically rendered for SEO, backed by a NestJS API and a Vite + React admin in one Turborepo monorepo.
Problem solved
A niche catalogue whose customers search in three languages, with 10,000+ parts that must stay current and be indexable in each language.
Technology
  • Next.js 14 + next-intl
  • NestJS 10
  • PostgreSQL 16
  • Redis
  • Socket.IO
  • Turborepo
In numbers
  • Three languages, each on its own URL prefix
  • 10,000+ parts in the catalogue
  • Statically rendered pages for SEO

Read the case study →

Aperwind — two-locale property catalogue

Public catalogue of new-build property in Thailand in Russian and English (aperwind.com).

What was done
A six-segment URL scheme that starts with the language, four split sitemaps, URL hygiene in middleware (lowercase paths, 410 for a dead section, 301 for empty form fields) and structured data across 23 schema.org types.
Problem solved
Keep both language versions of every listing consistent while a daily sync changes the data underneath, without losing a single indexed URL.
Technology
  • Next.js 15
  • React 19
  • TypeScript
  • PostgreSQL 16
  • Python 3
  • hreflang
In numbers
  • 979 pages in two locales with consistent hreflang
  • 1,958 URLs across four sitemaps
  • Structured data covers 23 schema.org types

Read the case study →

Last-mile delivery platform — Miami

Multi-tenant delivery platform whose storefront runs in three locales (client under NDA).

What was done
A Next.js 14 storefront with an ISR-cached catalogue and three locales next to a separate Vite admin SPA and a NestJS API, all in one Turborepo monorepo.
Problem solved
Serve a fast, cacheable multilingual storefront without coupling it to the operators' admin panel.
Technology
  • Next.js 14
  • ISR caching
  • NestJS 10
  • PostgreSQL 16
  • Redis 7
  • Turborepo
In numbers
  • Storefront with ISR catalogue caching and three locales
  • 11 apps and two shared packages in one Turborepo monorepo
  • 50-page admin panel with RBAC across four roles

Read the case study →

Front end
Next.js (App Router) · next-intl · React · TypeScript · Tailwind CSS
Search
hreflang · JSON-LD / schema.org · XML sitemaps per language · Core Web Vitals · Google Search Console · Yandex Webmaster
Back end
NestJS · PostgreSQL · Redis
Delivery
Docker · GitHub Actions · nginx + Let's Encrypt · Cloudflare

Start from the languages and the audience, and fix the URL scheme before anything is translated.

  1. 01 · First message

    Write to me on Telegram. In your own words, even if you don't know the technical terms. I care more about understanding what you want to build than what you call it.

  2. 02 · Reading between the lines

    Within a day or two I understand the task and give you an estimate of timeline and budget. If I see it isn't my case — I say so right away, no hedging.

  3. 03 · Lock-in

    Price and timeline — in writing. 50% upfront. After that things change only by mutual agreement, and rarely.

  4. 04 · Work

    I show interim results at my own pace. At the end — handover with documentation and access. First month of support is included by default.

  • I handle the whole chain: URL scheme, rendering, metadata, hreflang, sitemaps and the back end, so nothing falls between a front-end team and an SEO agency.
  • Production experience: multilingual sites in three languages and in two, running in production, not demos.
  • I work in English and Russian myself, so I can check those versions directly.
  • Existing sites are welcome: adding a language or fixing hreflang on a live site is routine work, with redirects from the old addresses.
  • Code goes into your GitHub from day one, with documentation and credentials in your hands. No lock-in to me.
  • Direct communication with the developer, with no agency layer.

I work remotely and take projects from anywhere. Day-to-day communication happens on Telegram or email in English or Russian, with video calls on request.

Multilingual projects add content work, so I plan the translation workflow with you. Copy in languages beyond English and Russian comes from a native-speaking translator, planned as a separate line in the estimate.

I do not publish a price list, because a five-page brochure site in two languages and a catalogue in three are very different projects. What moves the cost: the number of languages, page types and templates, where the content comes from and who translates it, an admin panel, integrations, and whether an existing site must be migrated without losing indexed URLs.

After your first message I send a written estimate of timeline and budget, usually within a day or two. If the task is not a good fit, I say so in the first reply. Once agreed, price and timeline are fixed in writing with 50% upfront.

How much does a multilingual website cost?
It depends on scope, so I quote per project rather than from a price list. The main drivers are the number of languages, page types, who produces the translations, an admin panel and integrations. Send a short description on Telegram and I reply with a written estimate of timeline and budget, usually within a day or two.
Do I need a separate URL for each language?
In my setup, yes: a path prefix such as /lt or /ru, or a subdomain if there is a reason for one. A separate URL lets search engines index each version and lets you link to it directly. If the language is chosen only by browser settings or a cookie, every language shares one URL and search engines cannot index the versions separately.
What is hreflang and do I need it?
hreflang tells search engines which language version of a page to show to which audience. Every version lists all the others and itself, with an x-default for visitors outside your languages. Without it, search engines can show the wrong language or treat the versions as duplicates.
Can you add languages to an existing website?
Yes. I first check the URLs, templates and metadata; if the site is not structured for several languages, I say so in the first reply. Old addresses redirect permanently to the new ones so indexed pages keep their signals.
Which languages do you work with?
I write and check English and Russian content myself and have shipped Lithuanian as a third language. For other languages the copy comes from a native-speaking translator, planned as a separate line in the estimate.
Do you use next-intl or another library?
On Jusmila I used next-intl, with each language on its own statically rendered URL prefix. The choice depends on the project: this site runs its own routing with English unprefixed and Russian and Lithuanian under /ru and /lt.
Can staff manage products and content themselves?
Yes. Catalogue-style sites get an admin panel, such as the Vite + React admin for Jusmila or the 50-page panel of the delivery platform, so staff manage products and orders without a developer.
Who owns the code and where is the site hosted?
You do. The code lives in your GitHub repository from day one, with documentation in the README and credentials with you. I usually deploy to a VPS with Docker, nginx and Let's Encrypt, or to your own infrastructure.

Describe the task in your own words. I respond within 24 hours, usually the same day on weekdays.

Elsewhere: GitHub·Telegram channel·Reddit·X