About
I'm Amir, a backend and full-stack engineer in Bornova, İzmir. I got here sideways: I studied International Business & Trade at Pamukkale Üniversitesi, taught myself to build, then proved it on real client work rather than in a CS classroom.
What I'm good at is the part of a product where almost right is not enough: permissions that change per viewer, orders that move stock and money in the same transaction, schedule changes that expire on their own.
I work across Python/FastAPI, TypeScript/React, PostgreSQL and .NET, but the stack matters less to me than the data model underneath it.
Most of that work has been client or owner-operated platforms — Sadaf, HemaStore, KohaApp, RashApp, EVO. Some of it shipped, some of it was cancelled, and a few projects never left my machine. It's all below, labelled for what it actually is.
What I have shipped, and where it stands
- HemaStore — digital goods commerceOwner and sole engineer. Telegram Mini App, Persian-RTL admin, Fastify API, one Postgres.Running
- Sadaf — B2B visa capacity platformAgency-facing panel, back end and front end, against a second team's Core API.Delivered
- KohaApp — tournament operationsPaid engagement. Bulk ID-card generation replaced the manual step for organisers.Maintained to 2025
- EVO — field merchandising route plannerDomain modelling and the .NET backend. The planner was finished; the engagement was not.Cancelled before launch
- RashApp — warranty & customer platformBackend end to end: accounts, SMS verification, user CRUD.Cancelled before launch
- EDIP, Shelf Scanner, Signature Verification, CIFAR-10, Smart PDFSingle-author applied-AI work: hybrid retrieval, on-device vision, evaluation.Study, never deployed
How I like to work
Contract first, where it's possible. On EVO the .NET backend generates an OpenAPI specification, which generates the typed client the React panel consumes, so a breaking change to a response shape fails the build rather than the browser.
Decisions written down as mechanisms, not intentions. Long passwords use bcrypt_sha256 rather than bare bcrypt, so nothing is silently truncated at 72 bytes. Temporary schedule changes expire instead of waiting for a manual undo. Notifications go through an outbox, so a dead worker loses nothing.
Tests that assert behaviour rather than shape. A mounted component proves very little; what matters is whether the thing it is supposed to do actually happened.
Honest status. If something was cancelled or never reached production, I say so. The applied-AI projects are real single-author work, but none of them ran in production.