Melih Kan Delft, NL

Second year, BSc Data Science & AI, Leiden · everything here was built next to coursework

Last month about 900 people downloaded an app I wrote alone, to help them drive home.

SilaWay is a companion for the sıla yolu — the long drive families make from Western Europe back to Türkiye by car. Fifteen tools on a bounded loop, four autonomous systems behind it, one engineer. The interesting part isn't what it knows. It's what it does when it doesn't.

  • ~165,000 lines TypeScript
  • 886 commits
  • 2 months
  • 4 autonomous systems
silaway · travel agent · tool loop

Kapıkule'de sıra ne kadar? Bu akşam mı geçsem, sabaha mı bıraksam?

How bad is the queue at Kapıkule? Cross tonight, or leave it to the morning?

    getBorderStatus returns

    Flip it. Same question, same tools — one of these two answers gets someone stuck at a border with a sleeping kid in the back.

    Sole engineer · Jun 2026 → present

    SilaWay

    silaway.app · live on the App Store & Google Play

    ~900downloads
    last month

    Not one agent — four autonomous systems, each with its own failure mode, cost profile and schedule. They don't share a runtime; they share a contract. Pick one and take it apart.

    Fifteen tools, and a loop that is allowed to stop

    Voice and text, streaming. Routing, border forecasts, fuel, weather, and place-finding from vague language — “şu benzinlikten sonra sağda bir yer vardı” has to resolve to coordinates.

    Every tool answers through the same versioned envelope, so the model never sees a bare number. It sees a number and what that number is worth — and the wording it is allowed to use follows from that. Pick one and read the last line first.

    All fifteen tools on the loop. The input schemas and the system prompt stay in the app.

    planning the drive

    the road ahead

    finding somewhere

    putting it on the screen

    Shared by all four systems

    An agent with an open loop is an open wallet.

    All model traffic goes through one Cloudflare Worker. No API key ever reaches the device, spend is capped per user and globally, and every call is accounted for in D1 — 24 migrations of accounting, because the alternative is finding out at the end of the month.

    deviceno key JWT Workerkey · caps · D1 key model
    Pull the app apart and you find no credential in it. There is nothing on the device worth stealing.
    this user18 / 60
    global, today$4.12 / $40.00

    Serving. Turn 18 of 60 — the loop has room.

    Illustrative limits. The real ones live in the Worker, with an admin dashboard on top.

    Open source · MIT · npm test

    agent-harness

    github.com/MelihKan/agent-harness

    9modules,
    9 suites

    SilaWay is closed source, so I extracted the unglamorous half: the part that has nothing to do with prompts or models, and everything to do with what happens when a tool returns nonsense, when a stream is cut mid-tool-call, when the user cancels. Every module in this list exists because something went wrong first. Click one.

      Team project · May 2026 · Node core API + Python FastAPI matching service

      Dostly

      AI companion & matching app — the mobile client, and work on the API behind it

      3platforms,
      1 codebase

      Nobody fills in a form. You talk to Dostie, and the profile falls out of the conversation — a pipeline reads what was said, builds a profile from it and proposes matches. I built the client half of that loop, on one Expo codebase shipping to iOS, Android and web. Watch it happen, then cut the connection.

      live21:04
      Dostieonline
      Write something…

      profile, extracted from the conversation

      0% complete

        A field only appears once something was said that supports it, and a later message merges with the earlier one rather than overwriting it — a person who codes until 2am and runs at dawn is not a contradiction to be resolved, it is two facts. values stays empty for the whole conversation, because nothing in it was about values. Cut the connection halfway: the messages queue, the chat drops to polling, and the profile keeps filling.

        Delft, Netherlands

        Melih

        Turkish (native) · English (B2) · Leiden, class of 2028

        2products shipped,
        one of them alone

        Shipped in

        TypeScript

        The language I've actually put in front of users. Two products, one of them written alone.

        Backend

        • Cloudflare Workers, D1, Durable Objects, KV
        • Firebase Functions & Firestore
        • Google Cloud Run, Cloud Tasks
        • REST, SSE, WebSockets

        Client

        • React Native, Expo
        • React
        • EAS build & OTA release pipelines

        How I work

        • Claude Code, daily driver
        • Codex
        • MCP servers
        • Multi-agent workflows, subagent fan-out

        The part I'd rather you heard from me

        Python is coursework level. I've never owned one in production.

        I've built a client against a FastAPI service and shipped the contract between us. I have not been the person who gets paged when that service falls over. It's the gap I most want to close, and I'd rather take a job where I'm the least comfortable person in the room than one where I already know the answer.

        {
          "v": 2,
          "tool": "assess_candidate",
          "status": "partial",
          "data": { "lang": "python", "level": "coursework" },
          "confidence": 0.35,
          "freshness_s": 0,
          "note": "never owned a service in this language"
        }

        Internships, part-time engineering work, or a problem you think I'd like

        Get in touch

        Delft, Netherlands · studying in Leiden

        I read
        everything