Freelance project2026

Russian with Julia

Next.jsConvexStripeCloudflare R2Google Calendar APIResendConvex Authshadcn/uiTailwindTypeScript

Website for an international Russian teacher

Complete freelance site for Julia, a private Russian teacher with over 500 students across 25 countries. The project's defining challenge: combining in one site a public-facing showcase, an online booking and payment system, and a paid video course platform purchasable per unit. Built so she could then be fully autonomous — she adds her courses, manages her students, and runs her site without needing me.

Overview01

An open-to-all showcase, a private space for her students, and booking in under a minute.

Website for an international Russian teacher
Fig.01 — Home pagerussianwithjulia.com

The site combines two worlds usually kept separate: a public showcase browsable with zero friction, and a private space for students who purchase video courses. All the marketing is open: you browse the sections, read the reviews, look at the world map of students, and can book a first call without creating an account.

The login only appears when it actually makes sense — to access already-purchased courses. The student receives a login link by email, no password, and accesses their dashboard. The teacher, meanwhile, has an admin area where she manages her courses, students, and calendar with full autonomy.

The site is live at russianwithjulia.com — feel free to visit and see for yourself.

Stakes & challenges02

Three questions to settle before the first line of code.

Each pillar below corresponds to a structural choice: what makes this site specific, and what pushed it well beyond a standard showcase site.

Challenge #1

Stripe payment and Google Calendar chained

The student picks a slot, pays online, receives the Google Calendar invitation with video call link: the entire chain completes in seconds, with no manual action from the teacher.

Challenge #2

A self-hosted video course platform

A real alternative to Podia or Teachable, with no recurring subscription and better protection than YouTube. Lesson packs purchasable per unit, videos served via signed URL from Cloudflare R2, zero egress fees.

Challenge #3

A visual identity that sticks

Logo, palette, world map of students, bilingual testimonials, refined micro-interactions. An effective one-page home for marketing, a dedicated space for paid courses: a site worth browsing, that naturally drives traffic.

Section03

The world map of students

The world map is one of the sections I most enjoyed building. Each dot represents a real student: the map visually conveys the international dimension of Julia's teaching, reaching over 500 people across 25 countries. The most representative city names are positioned by hand, giving a more human feel than automatic placement. To see it live, the best thing is to visit russianwithjulia.com.

Website for an international Russian teacher — The world map of students — view 0
Section04

Booking a first call

The booking widget takes up the right half of the screen: a calendar, available slots, a payment button, and that's it. The student picks their time, pays online, and immediately receives a Google Calendar invitation with a ready-to-use video call link. The event appears directly in the teacher's calendar, in her timezone. No manual entry, no email to send.

Website for an international Russian teacher — Booking a first call — view 0
Section05

Bilingual testimonials, student space and admin

The review carousel scrolls continuously, mixing Cyrillic and Latin alphabets (I standardized the reviews in English). The component originally comes from 21st.dev, reworked to match the site's identity. On the student side, a dashboard gives access to purchased packs and streamed lessons. On the admin side, Julia creates her packages, uploads videos directly to storage, tracks her students, and connects her Google calendar.

Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 0
Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 1
Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 2
Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 3
Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 4
Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 5
Website for an international Russian teacher — Bilingual testimonials, student space and admin — view 6
Under the hood06

Six decisions that defined the project.

For developers and recruiters opening this page: here are the technical choices this project forced me to articulate, not the ones I would have made by default. Each entry is documented internally as an ADR (Architecture Decision Record).

01

Combining a showcase site and authenticated app in one

Most sites do one or the other: a presentation one-pager, or a real application requiring login from the start. Here both coexist. All marketing stays public, instantly accessible. The login only appears when it genuinely makes sense (buying a pack or accessing already-purchased courses). No authentication wall on first contact, but a real secure session for the paid section.

02

Passwordless authentication (magic link)

Both students and the teacher sign in by receiving a one-time link to their email: one click, and the session opens. No password to create, memorize, forget, or reset. Technically, Convex Auth handles the flow, with Resend for sending emails from a verified professional domain. Going live required configuring specific DNS records (SPF, DKIM) on the domain zone to ensure emails land in the inbox and not in spam.

03

Payment and calendar chained in under five seconds

The student picks a slot and pays via Stripe. Once the payment is confirmed server-side, a Google Calendar event is automatically created in the teacher's calendar, with a video call link generated on the fly and the student invited. The entire chain (payment, database write, event creation, invitation send) completes in a matter of seconds. The teacher has absolutely nothing to do between the booking and the appointment itself.

04

Private video hosting on Cloudflare R2

Cloudflare R2 was chosen over AWS S3 for one simple reason: R2 doesn't charge for outbound bandwidth, whereas S3 charges per gigabyte served. On video streaming, that's the cost that spikes first. The 10 GB free tier is more than enough for language courses, and even beyond that, costs remain minimal. Above all, it's a real alternative to Podia or Teachable subscriptions at €20-40/month that had to be avoided. The admin uploads files directly from their browser via a pre-signed URL: the video never transits through the Next.js server, avoiding proxy costs and speeding up uploads.

05

World map of students: manual placement over algorithm

The map is rendered by dotted-map, a small library that transforms a world map into a styled dot grid. First attempt at placing city names: an automatic algorithm to avoid label overlaps, with dotted lines connecting each name to its dot. Too fragile, and the result looked robotic. Switched to a manual system: in developer mode, an overlay lets you place each label with the mouse, positions are stored locally, and a button exports the JSON to paste into the code for production. Human result, adjustable in two minutes when a new country is added.

06

Full client ownership of her tools

The domain, the Stripe payment account, the Resend email account, Google Cloud access: everything is opened in the teacher's name, not the developer's. My access is limited to temporary credentials shared via video call while configuring services. If she changes developers tomorrow, everything stays in place and belongs to her (no migration needed). This logic is documented in the project source code as ADRs (Architecture Decision Records), reusable as a template for future freelance projects.

Project stack07

The tools powering the site.

01Next.js 16App Router · static pages + authenticated /courses area
02ConvexReal-time database · auth · progress tracking
03Convex AuthPasswordless magic link · admin whitelist
04StripeVideo pack payment · lesson session checkout
05Cloudflare R2Video hosting · zero egress fees · signed URLs
06Google CalendarAutomatic appointment creation + video call link
07ResendMagic link and confirmation delivery · verified domain
08dotted-mapStyled world map of students
09next-intlFR / EN internationalization
10Tailwind · shadcnConsistent and productive UI system

Like what you see?

I build custom sites for artists, independents, and small businesses.

Brand identity, e-commerce, admin interfaces — every project is thought through and coded from scratch.

View my packages

Next project

BNP Paribas

Module e-learning IA générative