Open to software engineering roles

Maria Alftaih

Software Engineer

I build backends that turn awkward data into something people can actually use — a 1.4 GB catalogue file into a sub-20 ms search, a bank's statement PDF into what your spending really did, a column of logged numbers into a trend worth reading. Java, Python and SQL, with a bias towards clean data models and code that survives being read six months later.

Istanbul, Türkiye maroosf@gmail.com Arabic · English
01 — About

Backend-leaning, detail-driven

A short version of who I am and how I work.

I am a Software Engineering graduate from Bahçeşehir University in Istanbul, with a foundation in Java and Python and a focus on web development, system design and secure application practices.

The three projects below started as somebody's real problem, and each took a different stack to solve. Candela turned a 1.4 GB catalogue file that Excel refused to open into a search a lighting distributor now runs on every day. Personal Finance Ledger answers a question bank statements cannot — whether spending truly rose, or whether the lira simply moved. SnapTrack turns a column of hand-logged numbers into trends that are actually worth reading. Python, Java and Swift; the same shape of problem underneath.

I like designing the data model first, keeping the boundaries between layers honest, writing tests for the logic that will bite you, and shipping things that run on a real server behind HTTPS rather than only on my laptop.

Based in
Istanbul, Türkiye
Degree
B.S. Software Engineering, 2026
Core stack
Java · Python · SQL
Also works with
Spring Boot · FastAPI · React · PostgreSQL · Docker
Status
Open to full-time roles
02 — Skills

What I work with

Tools I have used to build and ship the projects below, plus the fundamentals behind them.

Languages

JavaPythonSQLSwiftTypeScriptJavaScriptHTML / CSS

Data & storage

PostgreSQLSQLiteSQLAlchemyFlywayFTS5 searchSchema designETL pipelines

Backend & web

Spring BootFastAPIReactREST APIsJinja templatesAuth & sessionsSwiftUI

Cloud & DevOps

AWSDockerDocker ComposePlaywrightGitLinuxsystemdCaddy / HTTPS

Engineering practice

System designRequirements engineeringOOPData structuresUnit testingProperty-based testingTestcontainersCI pipelinesAgile

Security-aware

scrypt (n=2¹⁷)Session handlingRole-based accessAPI keysHoneypot research
03 — Projects

Selected work

Three systems I designed and built end to end — data model, backend, interface and deployment.

Candela catalogue search results page
Python · FastAPI · SQLite · FTS5 · Docker

Candela — Product & Document Catalogue

A catalogue search system for lighting distributors. It ingests BMEcat 2005 / ETIM product data together with the manufacturer's PDF documents and builds a single SQLite database with full-text search on top, served through a small web interface.

In production

Candela was written for ENDA, a lighting distributor in Turkey, and runs there as the internal catalogue for the TRILUX range they represent. That installation is the reason the project exists — every feature was built against a real feed and real daily use, not designed speculatively.

On the 5th of each month it picks up TRILUX's new price list by itself: downloading it through the manufacturer portal, rebuilding the database and relinking the catalogues without anyone touching the server.

That instance is private — it holds a licensed dealer price list — so the public demo below is the same code running on a fully fictional dataset.

30,736products in production
2.96METIM attributes
~1.06 GBsingle SQLite file
< 20 mstypical search
  • Streaming ETL — the multi-gigabyte XML is parsed with iterparse, holding one product in memory at a time, so memory use stays flat regardless of file size.
  • Search that fits the domain — exact matching on article number / EAN plus prefix full-text search over descriptions and series, via two FTS5 external-content indexes with diacritic folding.
  • Searches inside the PDFs — documents are indexed page by page and returned as highlighted excerpts, with catalogue-to-product links that open a brochure at the right page.
  • Multi-brand and bilingual — a new brand is added by dropping a directory in, with no code changes; German and English product text are both stored behind an EN/DE switch.
  • Deployed, not just written — ships as Docker Compose; the app binds to localhost only and a reverse proxy terminates TLS in front of it. The monthly refresh signs into the manufacturer portal with Playwright, and accounts use per-person roles with scrypt-hashed passwords.
Live demo Source code

The demo runs on an invented brand with generated documents — no manufacturer's real data. Sign-in details are in the README.

Personal Finance Ledger overview: this month in real terms, year-on-year comparison, top categories and budget alerts
Java 21 · Spring Boot · PostgreSQL · React · TypeScript

Personal Finance Ledger

A self-hosted tool for understanding what you actually spend, built for Turkish credit card statements and Turkish inflation. It imports statements from PDF, works out which lines are the same purchase printed twice, sorts spending into categories you control, and reports in real terms.

The point of it

In an economy running at thirty per cent a year, comparing this March with last March in lira tells you almost nothing. Spending ₺30,959 this August against ₺24,540 a year ago looks like a 26% blowout — adjusted for inflation it is a 4% cut. That second number is the one worth knowing, and it is the one this reports.

225tests, 4 modules
0deps in the domain core
2 + CSVbank formats parsed
Java 21sealed types, records
  • Reading a table out of a PDF — PDFBox flattens columns into an indistinguishable word stream, so the importer keeps x-coordinates and derives each column from where its header label starts. Two bank layouts (Garanti BBVA, Yapı Kredi) that differ in every way that matters, plus a CSV fallback.
  • Money is a type, not a double — a BigDecimal and a Currency, scale fixed at 2, throwing on cross-currency arithmetic instead of coercing. It crosses the JSON boundary as a string, so the browser cannot quietly turn it back into a float.
  • Turkish is a hostile locale — i↔İ and ı↔I mean "TITLE".toLowerCase() returns tıtle on a tr-TR machine and every string match silently stops working. Matching folds with Locale.ROOT, display with tr-TR, and a test asserts the trap is real.
  • Deduplication with a hard constraint — consecutive statements reprint the days they share, but two identical purchases on the same day are legitimate, so a unique key would erase real spending. jqwik property tests pin the invariants: deduplicating a statement against itself is a no-op, and merge order does not matter.
  • Real terms, not the headline rate — reports divide CPI index levels rather than adding the annual percentage, which is the easy mistake and answers a different question. The index lives in a local table, so producing a report never makes a network call.
  • A boundary the build enforces — Maven Enforcer bans Spring, JPA and Hibernate from the domain and import modules transitively, checked in CI on every push; integration tests run against a real PostgreSQL image under Testcontainers rather than H2, and CI fails if they were skipped.
Live demo Source code

Every figure in the demo is generated data, and the instance is read-only.

SnapTrack person detail screen with charts
SwiftUI · FastAPI · SQLAlchemy · pytest

SnapTrack — iOS App & Analytics API

A full-stack iOS application for tracking a small circle of friends' Snapchat snapscores over time and turning that history into readable trends. A SwiftUI client talks to a FastAPI backend over HTTPS; every score is entered manually, so the app never touches a Snapchat account.

2 tiersiOS + API, one repo
4 chartstrend + activity views
pytestAPI & stats suites
  • Analytics layer — a dedicated stats module derives 7- and 30-day increases, daily averages and week-over-week and month-over-month percentage change from raw timestamped entries.
  • Charts that stay readable — Swift Charts line and bar views for the score trend plus daily, weekly and hourly activity, auto-scaled to the value range.
  • Clean API design — FastAPI routers split by concern (scores, stats, users) over SQLAlchemy models, with Pydantic schemas at the boundary and a shared API key required on every endpoint.
  • Tested and deployable — pytest suites cover both the API surface and the statistics maths, and the repo ships a systemd unit and a Caddy config for real deployment.
  • Thoughtful client behaviour — on-device local notifications on a randomised schedule with follow-ups, built on @Observable view models and no push server at all.
04 — Background

Education & credentials

Where the fundamentals came from.

September 2022 — July 2026

B.S. Software Engineering

Bahçeşehir University — Beşiktaş, Istanbul

  • Coursework across object-oriented programming, data structures, databases, software architecture and system design.
  • Delivered term projects in Java and Python covering design, implementation, testing and documentation.

Certificates

MAT3026 Probability and Statistics (2025-2026 Fall) Bahçeşehir University · January 2026
What is Data Science? IBM · September 2025
Requirements Specifications: Goals and Conflict Analysis University of Colorado System · May 2024
Requirements Elicitation: Artifact and Stakeholder Analysis University of Colorado System · May 2024
Requirements Gathering for Secure Software Development University of Colorado System · April 2024

Languages

Arabic Native
English Bilingual / full professional

Outside of work

ReadingMusicTravel Security researchOpen source
05 — Contact

Let's build something

I am currently looking for a full-time software engineering role. The fastest way to reach me is email — I read everything and reply.