Skip to content
Muhammet Şafak
tr

Expertise

JavaScript and TypeScript developer — web and mobile fed by one API

Shipping the same feature across three layers — a Laravel API, a web UI and a React Native app — taught me the hard part is the contract, not the code.

Since
2008 Since
years
18 years
posts
41 posts
projects
13 projects

Me in the JavaScript & TypeScript ecosystem

The full story: About

My identity in this ecosystem comes down to one sentence: I am the person who writes the product’s back end and then puts its web and mobile surfaces on the same contract. I am not building a design system; I am building the interface that talks to the API. JavaScript and TypeScript are not a preference on this page — they are the language of the layer where the product meets the user.

The parts of interface architecture that touch the system side — server-side rendering decisions, caching strategy — are written on sade.dev.

What I deliver in this ecosystem

What they have in common is one contract underneath all of them; I am not building a design system, I am building the interface that talks to the API.

  • Three layers, one contract

    The same feature ships as a REST API, a web UI and a mobile app at once. I keep the split strict: web and mobile never talk to each other, only over the shared API.

  • The mobile client

    The iOS and Android half of the same product, with React Native and Expo. Getting it through the stores is part of the job too.

  • The type layer

    TypeScript carries one contract from API to UI. Writing the contract twice, once at each end, means there is no contract.

  • Build and styling pipeline

    The build pipeline that cuts dev server startup to seconds, and a utility-first styling layer. The toolchain keeps changing; the job of these two layers does not.

The hard part is the contract, not the code

Most of the errors I meet on the interface side look like interface errors and turn out to be contract errors. When a field name, a date format or the meaning of an error code drifts between layers, the result is a cluster of failures that all look unrelated and share one root. So I start from what the back end promises, not from how the interface will look.

Not tied to a single library

All three are different answers to the same question; which one gets opened is decided by the product's needs.

  • The Vue side

    I spent a long time here — component-based interface architecture, routing and state management. Not a lost investment: it is where I can compare the two approaches.

  • The React side

    The centre of gravity moved here through mobile needs, and having the same mental model on web and mobile made things easier.

  • Interfaces out of a server-side frame

    Approaches that pull a modern interface out of a server-side frame and cut the code shipped to the browser.

What makes me replace a tool

The longest-running thing I have watched in this ecosystem is the tooling changing — AJAX with jQuery, then Gulp, then Webpack, then Vite. The decision went through the same order every time.

01 The bill is always configuration
Every migration cost the same thing: configuration. What is expensive is not the tool itself but the setup weight of making it run.
02 The return has to beat the bill
I take on a new tool when it returns more than the configuration bill I pay for it. When it does not, the old tool stays where it is.
03 "More modern" is not a reason
The age of a tool is not a measure. The measure is which concrete job it makes cheaper in this product.
04 Build time is a line item too
I apply the same measure on the compiler side: build time is a cost line, not a detail.

What sets its own rules on mobile

My expectation that React experience from the web would transfer turned out half right: the component thinking is the same, the rest is not.

  • Navigation architecture

    Navigation is built together with the screen architecture; router habits from the web do not carry over as they are.

  • List rendering performance

    List rendering performance is one of the headings I work on separately on the mobile side.

  • Versioning with OTA updates

    Being able to ship an update without a store round makes version management a subject in itself.

  • Store submission

    Getting it through the store is part of the job as well — and a craft independent of the app's code.

What I do not do

Accessibility auditing, building a design system and advanced animation work are not my field, and I say so when it needs saying. The parts of interface architecture that touch the system side — SSR decisions, caching strategy — are written on sade.dev.

Recent writing in this area

See all

What I have built in this area

All Labs records

A Reddit-like community platform where every vehicle make and model has its own club, holding ICE and EV under one roof; web and mobile run in parallel.

What it does today

A community platform where every car make and model has its own club; identity, content, notifications and moderation all run on a single-schema API, with the web and mobile clients sharing that one schema. Anyone looking for a community specific to their car's model can join today.

Web Mobile Laravel PHP PostgreSQL +6 more
July 2026 — September 2026

A deterministic puzzle on a node-and-edge board, offline-first; one TypeScript core feeds 36+6 levels to both web and mobile.

What it does today

Lets the player solve 36 levels + 6 hidden levels on a node-and-edge board through fully deterministic moves, with no luck or reflexes involved; a single TypeScript core drives both the web (PWA) and mobile (iOS/Android) client at once. Playable in the browser at silkward.com.

Web Mobile TypeScript Next.js React +3 more
September 2026 — September 2026

An offline night-shift simulation solved with a gamified Unix command set; one game engine runs the web and mobile versions at once.

What it does today

Has the player resolve seven incident types on a night shift through twenty-nine commands in a gamified Unix syntax (real flags, tab completion and `man` included); the web (PWA) and mobile (iOS/Android) versions share the same game engine. Playable in the browser at sysadmincrisis.com.

Web Mobile TypeScript Next.js React +3 more
September 2026 — September 2026

What shipped in this area

All projects
Garajdaş architecture diagram — a resolution comparison between a single make-level club and multiple make-model-level clubs, arrows from the schema's sole owner, the Laravel API, to the web (Next.js) and mobile (Expo/React Native) clients, the five completed MVP phases and a 97-test badge

Garajdaş

Ongoing

Founder & Developer

Tier: Active Development

Garajdaş is a community platform where every car make-and-model has its own club, keeping internal-combustion and electric vehicles under one roof. A single API schema is shared by the web (Next.js) and mobile (Expo/React Native) clients, the design system is defined in one file and synced by hand. The MVP phases are closed, the API has 97 tests; the platform is live.

Laravel PHP PostgreSQL +6 more
September 2026 — Ongoing
The Regnarium board — cities and armies on a hex map with a combat preview showing exact damage numbers

Regnarium

Ongoing

Designer & Developer

Tier: On Demand

Regnarium fits the explore-expand-exploit-exterminate loop of 4X strategy into a single sitting, played offline in the browser. The 480-hex map closes after at most 60 turns, combat rolls no dice and the preview you see before attacking is the calculation itself; there are no accounts, no servers and no tracking.

TypeScript Next.js React +6 more
September 2026 — Ongoing
The SilkWard board — a preview of a node-and-edge graph where the enemy advances by the same deterministic rule as the player, with solver-cli measuring level difficulty via BFS

SilkWard

Ongoing

Designer & Developer

Tier: Minimal Maintenance

SilkWard is an offline puzzle game that resolves 36 levels plus 6 hidden levels on a node-and-edge board through entirely deterministic moves. A single TypeScript core feeds the web (PWA) and mobile (Expo) clients at once; level difficulty is measured by the minimum move count the solver-cli tool finds via BFS. It is playable today at silkward.com.

TypeScript Next.js React +3 more
September 2026 — Ongoing

Technologies I pair it with

  • TypeScript

    The type layer that carries one contract from API to UI.

  • React

    The component side.

  • React Native

    The iOS and Android half of the same product.

  • Expo

    Builds, store submission and OTA updates.

  • Vite

    The build pipeline that cut dev server startup to seconds.

  • Tailwind CSS

    Utility-first styling layer.

  • Node.js

    Where the toolchain runs.

Frequently asked

7 questions

  • How long have you written JavaScript?

    Since 2008, so 18 years — the same year as PHP. The two were two faces of one job: PHP on the server, first jQuery and later Vue and React in the browser.

  • Are you a frontend developer?

    Not exactly. I am the person who writes the product's backend and then puts its web and mobile surfaces on the same contract. I am not the one building a design system from scratch; I am the one building the interface that talks to the API.

  • Vue or React?

    I have written both. On the Vue side about component architecture, routing and state management (Vuex, later Pinia); on the React side about hooks, concurrent rendering and the form actions that arrived with React 19. Today mobile work makes React Native mandatory, so the weight sits on the React side.

  • Do you build mobile apps?

    Yes, with React Native and Expo. Two of the recorded projects have their mobile client written that way, and one of them is live on the App Store and Google Play. I have separate posts on OTA updates, navigation architecture and list rendering performance.

  • Do you use TypeScript?

    Yes, and the reason collapses into one thing: end-to-end type safety from API to UI. Writing the contract twice, once at each end, means there is no contract.

  • How much have you written in this area?

    This site carries 41 posts and 13 projects tagged across the JavaScript ecosystem; the oldest is AJAX with jQuery, the newest is TypeScript's new compiler.

  • Doesn't the toolchain change constantly?

    It does, and I moved that chain from Gulp to Webpack and from Webpack to Vite myself. But every migration cost the same thing: configuration. Replacing a tool is only the right call if it returns more than the configuration bill you pay for it.

Let us work together

If you have work in this ecosystem, tell me what you are building and we will talk about how to build it.

Search the site

Start typing to search posts, projects and pages.

Esc to close Powered by Pagefind