Clients through Samwell.dev

Teach For Armenia: bilingual site on Next.js and Sanity

Role
Full-stack engineer, via Samwell.dev

16 pages, 2 locales, 61 Sanity schemas

private repo, commit a86a314

Duration
Mar 2025 to Apr 7 2026, one contract
Technology
Next.js 16.1.6, Sanity v5, next-intl, Resend
tfa.netarmenia.com
tfa.netarmenia.com
Program page on desktop showing the application and training stages as connected step cards

Teach For Armenia recruits university graduates into two years of teaching in under-resourced Armenian schools. I built their public website in English and Armenian: 16 pages across 2 locales, with 61 Sanity content schemas behind them (KB §3). Armenian display text carries its own scale, 0.93 against the Latin setting, measured in the project stylesheet as of 2026-03-25.

The link above points to tfa.netarmenia.com. The contract ended on April 7, 2026, and I have not verified since then what runs on the client's own domain.

What the contract asked for

One contract ran from March 2025 to April 7, 2026 (KB §3). It opened with SEO and GEO work on the sites Teach For Armenia already had. GEO is generative-engine optimization: writing and marking up pages so answer engines quote them correctly instead of paraphrasing them wrong. Those pages sat on Squarespace, so the work went in through code injection, the hook Squarespace gives you for adding your own markup and scripts.

From January 23, 2026 the contract turned into a build. Four things were named in it: the new Teach For Armenia website, the Armenia Education Initiative website, a donation platform, and web marketing. It was invoiced in three tranches and ended on April 7, 2026 (KB §3). This page covers the two websites.

What the work had to fit around

Two scripts in one layout. Armenian sits on a larger x-height than the Latin face beside it. X-height is the height of a lowercase letter without an ascender, and it is what the eye reads as size, so the same font size looks bigger in Armenian. A headline that fits its container in English runs past it in Armenian.

Two content systems inside one contract. The Teach For Armenia site runs on Sanity v5. The Armenia Education Initiative site runs on Payload CMS v3 (KB §3). Both had to serve English and Armenian, and neither could reuse the other's schema work.

One build window for four deliverables. Between January 23 and April 7, 2026 the same contract carried both websites, the donation platform and the web marketing (KB §3).

What I built

The site runs on Next.js 16, at 16.1.6 in package.json on main as of 2026-03-25 (KB §3). Sanity v5 holds the content. Routing and text selection go through next-intl, the library that resolves a page's copy for the language in the URL, with English and Armenian as the two locales (KB §3).

Content is modeled rather than typed into templates. 61 Sanity schemas define the shapes an editor fills in, which is what lets staff change a headline, a statistic or a person's bio in both languages without a developer (KB §3). Forms hand off to Resend, the service that sends the confirmation mail after a submission. Every page emits JSON-LD, the machine-readable summary search and answer engines read before they decide what a page is about (KB §3).

The bilingual typography is handled in CSS rather than at runtime. One stylesheet, app/globals-v2.css, holds 4,474 lines with 406 custom-property declarations across 12 labelled token layers, counted in the repository as of 2026-03-25 (KB §3). A custom property is a named CSS value the rest of the sheet reads instead of repeating a literal. When the page language is Armenian, display text takes a 0.93 multiplier and body text takes 0.96, so both scripts land on the same optical size without JavaScript measuring anything in the browser.

The second site in the same contract was the Armenia Education Initiative, built between January 23 and March 3, 2026 on tranches one and two. Next.js with Payload CMS v3, a custom i18n layer, 12 pages in English and Armenian, and a five-step application wizard with anti-spam on the submit path. The third tranche was not worked and not invoiced (KB §3).

What is measurable

SignalFigureSource
Pages16, across 2 localesKB §3, Teach For Armenia contract row
Content schemas61 in SanityKB §3
TypeScript source439 tracked .ts/.tsx files, 83,391 linescounted in the project repository, as of 2026-03-25
Design-system stylesheet4,474 lines, 406 custom-property declarations, 12 labelled token layersapp/globals-v2.css, as of 2026-03-25
Armenian type scale0.93 display, 0.96 bodyapp/globals-v2.css, as of 2026-03-25
FrameworkNext.js 16.1.6package.json on main, as of 2026-03-25
Second site12 pages in English and Armenian, five-step application wizardKB §3, Armenia Education Initiative row

No traffic, recruitment or donation figures appear on this page. The contract ended on April 7, 2026, and I hold no measurement of what the site did after handover that I can point a reader at.

Stack

Next.js 16.1.6, Sanity v5, next-intl for English and Armenian, Resend for transactional mail, JSON-LD for structured data, TypeScript throughout. The Armenia Education Initiative site: Next.js with Payload CMS v3 and a custom i18n layer.

Discuss a bilingual build

Open to a full-time remote role or a fixed-scope project.