erhan kaya.devindependent developer
software & games

Hello, world. I’m Erhan.

Mustafa Erhan Kaya

Independent software and game developer in Istanbul.
I build ZINK!, DuckIn and Pyralis,
and bring game developers together.

Enter the work ↓
This is a living point cloud.
Move through it. Leave a little chaos.

Game design meets systems engineering.

Small puzzles.
Serious engineering.

A bilingual word game built around fair play:
offline puzzles, daily challenges, and a
deterministic engine behind every round.

Flutter / Dart / Riverpod / Supabase

192 crossword levels · 2 content languages

Turning city signals into better timing.

Read the city.
Find your calm.

Crowd forecasts for 80,000+ places across
three cities. Weather, traffic, and events
become a clearer answer to “when should I go?”

Flutter / TypeScript / PostGIS / Mapbox

80k+ places covered · 18 prediction signals

One identity across fragmented platforms.

Many libraries.
One player story.

Games, playtime, reviews, and friendships
in one place. A connected gaming identity
across digital libraries and the tabletop.

Flutter / Riverpod / Supabase / API integrations

5 ecosystem integrations · 1 unified library

Community leadership

Game development
communities.

IGDA Istanbul founding leader & director.
BAU BUG Zone co-founder.
Former ÜNOG director for two years.

Let’s make something ↗

Indie games / Cooking / Tolkien

About Mustafa Erhan KayaCommunity work & sources

PROJECT FILE / 01

The engineering behind the experience

ZINK!

A word game should feel effortless. Making every round fair, reproducible, and playable offline takes a carefully designed system.

192crossword levels
2content languages
1deterministic core

The challenge

Keep the game responsive without a connection, make daily competition consistent, and give Turkish and English players puzzles written for their own language.

SYSTEM OVERVIEW

  1. Versioned content
  2. Pure Dart engine
  3. Run event log
  4. Server score
01

A replayable game engine

Separated the round engine from Flutter, networking, and the device clock. Seeded letter ordering and an injected clock make the same inputs reproducible in tests and score verification.

02

Offline by design

Bundled versioned, encrypted language packs for local play. Daily rounds are composed from a shared server set; submitted event logs let the server calculate the score.

03

Content that survives an update

Built separate Turkish and English crossword collections. Expanded each from 64 to 96 levels while preserving the original puzzles, save versions, and existing progress.

WHAT THIS MADE POSSIBLE

192 crossword levels across two independently authored languages. A content expansion verified against both real packs, with 161 focused Flutter tests recorded for that release.

Flutter / Dart / Riverpod / SupabaseVisit playzink.com ↗
PROJECT FILE / 02

The engineering behind the experience

DuckIn

A useful city map should tell you more than where a place is. DuckIn helps you understand when it might actually be worth going.

80k+places covered
18prediction signals
3Turkish cities

The challenge

Crowd levels change with the weather, nearby events, traffic, and the time of day. Turn fragmented city data into a forecast people can understand before they leave.

SYSTEM OVERVIEW

  1. City data feeds
  2. Scoring + confidence
  3. PostGIS queries
  4. Flutter + Mapbox
01

A city-scale data pipeline

Combined historical visit patterns with weather, traffic, parking, events, and calendar signals. Scheduled collectors feed a Supabase backend, with PostGIS powering nearby-place queries.

02

An explainable prediction engine

Built a deterministic TypeScript scoring core that accepts explicit inputs and time. It produces hourly and current forecasts, confidence information, and the most relevant factors behind a prediction.

03

Changes you can replay

Separated data collection from scoring and added snapshot replay checks. Engine changes can be compared against the same captured inputs before they ship, rather than judged by a moving live-data target.

WHAT THIS MADE POSSIBLE

Coverage spanning Istanbul, Ankara, and İzmir, with 80,000+ places and 18 prediction signals. The mobile experience connects forecasts, map discovery, and arrival-time planning.

Flutter / TypeScript / PostGIS / MapboxVisit duckin.app ↗
PROJECT FILE / 03

The engineering behind the experience

Pyralis

Your gaming history belongs to you, even when it lives in different stores. Pyralis brings those disconnected pieces into a single library and social identity.

5ecosystem integrations
1unified library
2worlds: digital + tabletop

The challenge

Different platforms expose different identities, catalogs, and levels of detail. Bring them together without pretending every API supports the same features.

SYSTEM OVERVIEW

  1. Platform APIs
  2. Provider adapters
  3. Shared catalog
  4. Library + social
01

Connecting the ecosystems

Integrated Steam, PlayStation, Xbox, Riot/Valorant, and BoardGameGeek. Provider-specific services handle library data, while backend proxies handle external API access and token flows.

02

One game, multiple sources

Matched platform records to a shared game catalog using IGDB. Combined imported libraries with ratings, reviews, and tabletop session logging so the profile reflects more than a single store.

03

A personal history worth keeping

Built playback views around playtime, genres, platforms, and achievements where the source supports them. Social discovery adds player follows and reviews to the library experience.

WHAT THIS MADE POSSIBLE

A single Flutter product connecting five gaming ecosystems, with a unified library, social reviews, and personal playback. Steam supports playtime and achievements; other integrations reflect the data their APIs actually provide.

Flutter / Riverpod / Supabase / API integrationsVisit pyralis.app ↗