A Full Stack Developer working across the modern .NET and Angular ecosystem.
I’ve been a software developer at ARCA Yazılım since July 2025. I build scalable applications with Clean Architecture, CQRS and multi-tenant approaches — focusing on API design, role- and permission-based authorization, performance optimization, automated testing and real-time integrations. Alongside development I also work on the client-facing side: analyzing business requirements, taking part in project presentations and managing client communication.
Contributed to backend, frontend, security and integration components of enterprise SaaS platforms in Agile delivery cycles using GitLab and Jira.
Process
02
Developed multi-tenant APIs with .NET 9, ASP.NET Core, Clean Architecture and CQRS, creating scalable business rules and reusable REST services.
Architecture
03
Implemented JWT refresh-token flows, HttpOnly/SameSite cookies, RBAC, audit logging and rate limiting, and performed security hardening based on penetration test findings.
Security
04
Built real-time notification and permission-propagation mechanisms with SignalR; automated operational processes with scheduled Hangfire jobs.
Real-time
05
Integrated SOAP/REST banking APIs, MutluCell SMS, the 3CX call center API and WhatsApp/WATI messaging into production modules.
Integration
06
Developed Angular 20 admin panel features and AI/MCP-powered components inside the enterprise SaaS template.
Frontend
07
Served as business analyst on the YODER association platform alongside development: delivered presentations during client visits, analyzed business requirements with the client and translated them into development scope, and acted as the primary point of contact for the client.
Client & Analysis
08
Took part in the client-facing project presentations at the close of the employee transportation and fleet optimization project.
Business analysis: presentations during client visits, business requirements analyzed with the client and translated into development scope, and primary point of contact for the client
Donor, family support, orphan sponsorship and campaign modules
Income-expense tracking and staff operations modules
Transaction sync and collection reconciliation via SOAP bank API
Automated notifications via MutluCell SMS & WhatsApp/WATI
3CX API integration wiring call-centre workflows into the system
Dynamic Excel reporting with ClosedXML
Scheduled job automation with Hangfire and live alerts via SignalR
02AI · ARCA
AI-Powered Hotel Reservation Call Assistant
A low-latency voice AI call assistant that automates multi-hotel operations.
Ticket, task, project, purchase request and expense modules
Drag-and-drop visual workflow editor built with @foblex/flow
Scheduling and appointments via FullCalendar & Google Calendar
Leave, remote-work, CV pool and asset assignment for HR
Dynamic reporting and export with jsPDF and XLSX
Ticket notes with mentions using the Quill rich-text editor
Layered multi-tenant roles: super-admin, admin and user
Real-time notifications and SLA reporting via SignalR
05Solo · Full-Stack
Cloud-Based Document Management System
A document management system handling document requests, approvals and expiry tracking, with high-performance filtering and access for 10,000+ documents.
.NET CoreAngularMS SQLCQRSHangfire
Designed an end-to-end .NET Core + Angular full-stack architecture
High-performance filtering and access layer for 10K+ documents
Approve/reject flow for document requests, plus an approval-request mechanism that puts record changes behind sign-off
Expiry review process scheduled with Hangfire: automatic email reminders with delay, disable and resolve steps
Baskets for collecting documents and sharing them with other users
MCP-based AI chatbot solution integrated with external services
A multi-tenant fleet platform running employee transportation operations end-to-end, with VROOM/OSRM-based route optimization and real-time Arvento GPS tracking.
.NET 9ASP.NET CoreAngular 20PostgreSQLClean ArchitectureCQRS / MediatRHangfireSignalRVROOMOSRMArvento GPS API
End-to-end backend and admin panel covering tenant, company, department, stop, vehicle and rotation/expedition modules
Automated route optimization engine using the VROOM solver on OSRM distance-matrix and route-geometry services, respecting vehicle capacity, shift time windows and maximum travel time/distance
Bulk route preview, auto-generation and route consolidation workflows
Real-time vehicle location, live expedition tracking and passenger-history sync via Arvento GPS/fleet integration
Layered RBAC + Data-Scope authorization with granular role/user based entity and page permissions
Real-time notifications and live tracking via SignalR; scheduled-job automation for passenger-history sync and auto route generation via Hangfire
Took part in the client-facing project presentations at project close
07Mobile · Personal project
Bütçem — Offline Income, Expense & Budget Tracker
A personal finance app that runs fully offline — no server, no account; all data lives in a single SQLite file on the phone.
Offline-first architecture on Flutter + Drift (SQLite); money kept as minor-unit integers, movements stored as double-entry postings
Daily allowance: spendable balance minus the recurring payments still due this month, divided by the remaining days — category limits bind when tighter
Bank statement (CSV) import with column mapping, duplicate detection, merchant→category guessing and one-tap undo
Instalment purchases report spend in the purchase month and cash-out in their own month
Recurring transactions, category budgets, savings goals, debt tracking, month-closing report and a home-screen widget
Query discipline: per-screen query budget tests, a 10,000-record performance test, aggregates computed in single SQL statements
794 tests (pure services, database migrations, end-to-end screen flows); sideloaded signed APK with version.json based self-update
08Mobile · Multiplayer game
Harfsayı — Word & Number Game
A Turkish mobile game mixing word and arithmetic rounds, playable live against friends and fully offline.
Server-authoritative flow: question generation, the clock and refereeing all live on the server, the client only draws — moving the device clock forward changes nothing
Live duels, 2v2 team matches, spectator mode and a nightly 21:00 elimination tournament over SignalR
An anagram index over a 62,326-word TDK dictionary feeds four features at once: best answer, garden level generation, bot answers and the uniqueness check for the final conundrum
A Turkish morphology analyser splits words into root + suffixes; rejected words go to an appeal jury and accepted ones join the live dictionary
Offline play: question pack embedded in the app, a drift/SQLite cache and idempotent sync keyed by device UUID — installable and playable in airplane mode
Async duels, daily challenge, weekly leagues, seasons, word collection and a crossword generator (grid plus a clue filter over TDK definitions)
378 backend and 118 mobile tests plus end-to-end smoke tests covering WebSockets; deployed with Docker behind a permanent Cloudflare Tunnel address
01/ 08
Swipe
01/ 08 YODER Association & Donation Operations Platform
University Projects
C++ · OOP
Object-Oriented Programming Project
A modular C++ desktop stock-tracking app built on OOP principles.
C++OOPQt
Full-Stack
E-Commerce Web Application
A dynamic cart and order management system built on a PostgreSQL backend.
PostgreSQLCRUDWeb
05
Academic background
2024
2020 — 2024
3.17
/ 4.00
Karadeniz Technical University
Statistics & Computer Science
06
Communication level
TurkishNative
EnglishB1 · Intermediate
07
Certificates
0101
BTK Akademi
Angular Training
0202
BTK Akademi
KVKK & GDPR Training
0303
Ankara Development Agency
Startup Law & Intellectual Property
0404
BTK Akademi
Version Control: Git / GitHub
0505
BTK Akademi
Effective Communication Strategies
0606
BTK Akademi
Public Speaking & Presentation
0707
BTK Akademi
Agile Project Management
0808
BTK Akademi
Building AI Agents with Platforms
0909
BTK Akademi
Database Attacks & Database Security
01/ 09
Swipe
08
Contact
Open to new projects
Got a project?
I’m open to new opportunities, enterprise projects and collaborations. Drop a message and I’ll get back to you shortly.
Why .NET and C# Still Sit Behind Every Project I Build
One language, seven very different products.
.NET is Microsoft's open source runtime, and C# is the language that runs on top of it. Together they cover most of what you need to stand up an API, talk to a database and write business logic. .NET 9 brought real performance gains too, with the same code now running faster on less memory.
What Actually Changes When You Split Reads From Writes With CQRS
One apartment management system saw query performance jump 40 percent.
Once an API starts growing, the first bottleneck is usually that reads and writes run through the exact same code path. Clean Architecture addresses that by splitting the application into layers, keeping business rules independent of the database and the framework. CQRS goes a step further and separates read operations (queries) from write operations (commands) entirely. MediatR is the small .NET library that routes each command or query to the handler responsible for it.
ABP Framework: Not Rebuilding Tenant and Permission Logic Every Time
A modular foundation for multi-tenant SaaS, nothing more.
Rebuilding tenant management, permission handling and user-role infrastructure from scratch on every new multi-tenant project wastes time. That's exactly what ABP Framework is for: an open source framework built on .NET, grounded in Domain-Driven Design principles, that ships those repeating pieces as ready-made modules.
Entity Framework Core and the Code-First Way of Managing a Database
I manage the database schema through code instead of writing raw SQL by hand.
Changing a database schema doesn't have to mean opening a database tool and editing tables by hand, it can just as easily happen through code. Entity Framework Core is the ORM for .NET that makes that possible: you define your classes as entities, and EF Core maps them to tables. You write queries in LINQ, and they get translated into SQL Server queries behind the scenes. With a code-first approach, the schema moves forward through migrations instead, versioned right alongside the code and trackable in the git history.
Unit Tests and Architecture Tests: Two Different Kinds of Safety Net
A broken layering rule should fail a test, not slip past a review.
Seeing a piece of code work once is one thing. Knowing it still works six months later, after someone else has touched it, is another. That's what unit tests are for: you isolate a method or a handler, mock its dependencies, and check that a given input produces the expected output. Architecture tests work at a different level entirely, they don't check behavior, they check the dependency rules between layers, like making sure the Domain layer never references Infrastructure directly.
Performance Testing: Measuring a 40 Percent Query Speed-Up
Verifying the gain from a CQRS split with before-and-after measurements.
A hundred records and a filter screen runs fine; push that to ten thousand and the same screen can slow to a crawl. Performance testing exists to measure exactly that gap, not whether the code returns the right answer, but how long it takes and how much it costs to get there. You run the same queries against data volumes close to real usage and measure time, query count, memory.
Building Admin Panels with Angular 20 and TypeScript
One frontend stack, six projects, six different admin screens.
Using the same frontend stack across six unrelated projects is a pretty direct way to find out whether a framework actually holds up. Angular is Google's TypeScript framework built around components, made for applications that need to stay maintainable years after the first commit. TypeScript adds static typing on top of JavaScript, so when you reference a property that doesn't exist on an API response, you find out at compile time instead of in production.
Building Offline-First Mobile Apps with Flutter and Dart
Two personal mobile projects that keep working with no connection at all.
Angular covers the web side of my work; on mobile, my pick is Flutter. Flutter is Google's UI framework for shipping Android and iOS apps from a single codebase, and Dart is the language it runs on. It draws the interface with its own rendering engine rather than the platform's native widgets, so a screen looks the same on every device. During development hot reload shows a change within seconds, while release builds compile Dart ahead of time to native machine code.
The Qt and C++ Stock Tracker I Built in University
Not a professional project, but where object-oriented programming actually clicked.
The first serious desktop application I wrote in university was a stock tracker, built with Qt and C++. Qt is a C++ framework for building desktop applications, where the UI and the underlying logic live in the same codebase. Its signal-slot mechanism is how you wire interface elements, buttons, lists, forms, to the logic behind them: you define which function runs when a specific button gets clicked.
Choosing Between SQL Server and PostgreSQL by Project
Two relational databases, two different sets of projects.
Which database ends up on a project usually comes down to the team and the infrastructure, not the language itself. SQL Server and PostgreSQL are both relational: data lives in tables, you query it with SQL. Day to day, for basic CRUD work, they're close enough that the real differences show up more in licensing, tooling, and a handful of performance or feature details rather than in how you write your queries.
Git and Version Control: The Infrastructure Nobody Notices Until It's Missing
Branches, merge requests, code reviews: the shared language of a team.
What happens when two developers touch the same line of the same file at the same time? Git's answer sits in the commit history: every change to a codebase gets tracked, tied to who made it and when. Branches let you build a feature away from the main codebase, then merge it back in once it's done.
AI Assisted Development: From Voice Assistants to MCP Chatbots
RAG, MCP and STT-LLM-TTS pipelines are now part of my regular toolkit.
Getting a voice assistant to answer a question over the phone takes a few different pieces working together behind the scenes. An STT-LLM-TTS pipeline converts speech to text, sends that text to a language model, then converts the response back to speech. RAG, or Retrieval-Augmented Generation, means the model pulls relevant information from an external source before generating an answer, instead of relying purely on what it learned during training. MCP, the Model Context Protocol, gives an AI model a standard way to connect to outside services, databases or APIs.