Vitrincim

Fast sites that search engines can actually read

I build multilingual, search-visible websites with Next.js and TypeScript — and I write them so the next developer can pick them up without calling me.

Bilal Faruk Özdemir

Bilal Faruk ÖzdemirTürkiye · working remotely, you deal with me directly

What I do

Building the site is the easy half

The hard half is everything that decides whether anyone finds it: structured data that stays correct, language routing that does not lie to Google, and a codebase that can still be changed a year from now.

Next.js & TypeScript

App Router, server components, typed routes. Strict TypeScript with noUncheckedIndexedAccess on, so the build catches what the dev server quietly lets through.

Technical SEO

Structured data, canonical URLs, sitemaps and Core Web Vitals. Not an audit PDF — the markup is generated from your data, so it stops drifting out of date the week after launch.

Multilingual sites

Localized URL segments, a complete hreflang graph, and per-page language control so a page is never advertised in a language it does not actually have.

Supabase & Vercel

Postgres with row-level security, auth, edge deployment and preview environments. Every branch gets a URL you can click before anything reaches production.

All of it runs on a framework I built: page metadata, JSON-LD, hreflang and sitemaps are generated from one typed schema. Nothing is hand-written per page, so a fix in one place corrects every page at once — and nothing silently rots when content changes.

Work

Three different scales, three different problems

Desktop view of the ZULKA FX websitePhone view of the ZULKA FX website
Pyromusical & fireworks production · International

ZULKA FX

A production company running large-scale shows across Turkey, the UAE, Saudi Arabia and Iraq. Their buyers search in their own languages, so one language was never going to be enough.

  • Five languages: English, Turkish, Arabic, German, Russian
  • Localized URL segments per language — /services, /hizmetler, /khidmat — not query strings
  • Complete hreflang graph with x-default; every page declares only the languages it actually has
  • Heavy 4K video presentation with mobile performance held intact
Desktop view of the Arabacı Taş websitePhone view of the Arabacı Taş website
Stone paving & landscaping · Turkey

Arabacı Taş

A family stone-paving firm with no digital presence at all — every job came by word of mouth. The site had to rank for commercial-intent local searches, not just exist.

  • Location-based service pages generated from a typed schema, not hand-written
  • LocalBusiness structured data with service area, opening hours and price ranges
  • Guide content targeting material-selection queries — the part that pulls search traffic
  • Ranks #1 for its main commercial keyword; owns both of the top two results for another
Desktop view of the Kalıcı Hediye websitePhone view of the Kalıcı Hediye website
Personalised digital gifts · Own product

Kalıcı Hediye

Personalised gift pages for birthdays and anniversaries. My own product — this is where I test productisation, pricing and conversion before recommending any of it to a client.

  • Occasion-based landing pages: birthday, anniversary, mother’s day
  • Three-tier transparent pricing, ordering handled entirely over WhatsApp
  • 13-question FAQ built by answering real objections one at a time
  • Roughly 10% click-through from search — about double the expected rate at its position

Every one of these is live and clickable. Open them side by side — they look nothing alike, which is the only real proof that no template was involved.

How I work

What hiring me is actually like

1

I ask before I build

One clarifying question up front costs a message. Building the wrong thing costs a week. If a requirement is ambiguous I will say so rather than guess quietly.

2

You see it running early

Preview deployments from the first day, not a demo at the end. You review something you can click, on your phone, before the scope is locked.

3

The code outlives me

Comments explain why a decision was made, not what a line does. When you hand this to another developer — or back to your own team — the reasoning comes with it.

4

I tell you what went wrong

If something is broken, slower than promised, or was a bad idea in the first place, you hear it from me first. Surprises at handover are how projects end badly.

Pricing

You see the number before the work starts

Fixed scope, fixed price. If the work grows we agree on it first — the invoice never grows on its own. These are starting points; the real number comes after we have talked about what you actually need.

Website

from $1,200

One language · typically 2–4 weeks

  • Next.js and TypeScript, no page builder underneath
  • Structured data, sitemap and canonical URLs generated from your content
  • Core Web Vitals in the green on mobile, verified before handover
  • Contact form wired to your inbox, working without JavaScript
  • Deployed, domain connected, and the repository is yours

Multilingual

from $2,000

Two or more languages · typically 3–6 weeks

  • Everything above, per language
  • Localized URL segments — /services and /hizmetler, not ?lang=tr
  • Complete hreflang graph with x-default
  • Per-page language control, so no page is advertised in a language it lacks
  • Built this way for a client selling across four countries

Scope not clear yet? Then fixed price is guesswork and you would be paying for my guess. In that case I work hourly at $45/hour — usually a short, capped block to size the problem, after which we can go back to a fixed number. Ongoing maintenance works the same way.

Getting started

Send me the URL, I will tell you what I would fix

The first conversation is free and is not a sales call. If you already have a site, send the link — I will tell you what is holding it back, whether or not you hire me.