How I Use AI Tools Daily

A senior engineer's honest take on Cursor, Claude Code, and where AI tooling actually pulls weight in production work versus where it gets in the way.

It was a Tuesday morning at the creator-economy platform I worked at. I was three weeks into the branded mobile apps build, working with two other engineers, and the Rails plus Python plus Fastlane plus GitHub Actions pipeline was starting to feel real. Cursor was open on my left monitor. Claude Code was running in a terminal split on the right. I’d just asked it to generate the first cut of a Fastlane lane that ships a creator’s app to the App Store, and the diff looked roughly right. I read it line by line anyway. Two bugs. Fixed them. Shipped the lane behind a feature flag.

That’s the loop. Not magic. Not “AI wrote my app”. Just one more tool in the rotation, sitting next to my tests and my linter.

I’ve been writing software for over a decade and I’ve seen plenty of waves of “this changes everything”. Most of them didn’t. This one is different in a quiet way. AI tooling doesn’t replace the engineer. It compresses the boring parts of the day so the engineer spends more time on the parts that actually matter.

My daily loop

In a typical month I bounce across a lot of repos at the creator platform, and I CTO a few side products in parallel. One is a health and wearables thing. One is an AI music-learning app. One is a community-plus-talent product. Different stacks. Different conventions. No way to keep all that context in my head.

Cursor and Claude Code keep it in theirs.

The way I configure Cursor for this is boring on purpose. Strict TypeScript settings, project-specific rules in .cursorrules, and a model preference that doesn’t auto-apply edits across files.

{
  "cursor.cpp.disabledLanguages": [],
  "cursor.general.enableLogging": false,
  "cursor.cmdk.useThemedDiffBackground": true,
  "cursor.composer.autoApplyChanges": false,
  "cursor.chat.alwaysShowFullDiff": true,
  "editor.formatOnSave": true,
  "typescript.tsdk": "node_modules/typescript/lib",
  "typescript.preferences.importModuleSpecifier": "non-relative",
  "eslint.run": "onType",
  "eslint.validate": ["typescript", "typescriptreact"]
}

autoApplyChanges: false is the only line that matters. I want to read the diff before it touches a file. That habit caught a Cursor-suggested change last month that would have dropped the locale segment from a cache key. I read it twice. Reverted.

For Claude Code I lean on a tiny CLAUDE.md at the root of each repo and a few project-specific slash commands. The repo-level one tells the agent what stack we use, where the tests live, which lint commands to run, and what’s off-limits. The commands let me automate the verbose stuff.

claude /run-all-tests
claude /security-review
claude /review-backend

/run-all-tests is just pnpm test:ci:all in disguise, plus a guard that fails if coverage drops. /security-review reads the diff against main and looks for the usual suspects: leaked secrets, missing input validation, unsafe SQL string interpolation, IDOR-shaped endpoints. /review-backend is the one I lean on hardest. It reads the diff like a staff engineer would and writes the review in Turkish, which keeps me honest because Turkish forces me to slow down and re-read.

Where AI actually pulls weight

Our branded-mobile-app pipeline at the creator platform is the cleanest example I’ve got. We’d been asked to take a manual process owned by a whole mobile-CX team and turn it into a release that ships in five minutes. Apple submission, Google submission, native billing, build signing, the works. Three engineers. Three months.

We used Cursor and Claude Code throughout. Most of the Fastlane glue was AI-generated, then reviewed and re-shaped. The GitHub Actions matrix that fans out across creator apps was mostly hand-written, because the orchestration logic was load-bearing and I wanted to feel every line. Something like this lives in our workflow file:

name: bma-native-release

on:
  workflow_dispatch:
    inputs:
      branded_app_id:
        required: true
      platform:
        required: true
        type: choice
        options: [ios, android, both]

jobs:
  build:
    runs-on: macos-14
    strategy:
      fail-fast: false
      matrix:
        platform: ${{ fromJSON(inputs.platform == 'both' && '["ios","android"]' || format('["{0}"]', inputs.platform)) }}
    steps:
      - uses: actions/checkout@v4
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: Resolve branded config
        run: bundle exec rake bma:resolve[${{ inputs.branded_app_id }}]
      - name: Build and submit
        env:
          APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
          GOOGLE_PLAY_JSON_KEY: ${{ secrets.GOOGLE_PLAY_JSON_KEY }}
        run: bundle exec fastlane ${{ matrix.platform }} submit

Outcome: release time fell off a cliff. Operational cost dropped meaningfully. Sales picked up once native billing went in. The pipeline replaced a process that used to take a whole team to run. Three engineers built it. AI tooling was part of why.

The piece I keep telling other engineers about is the boring half. We didn’t ship faster because the AI wrote heroic code. We shipped faster because nobody had to context-switch out of Cursor to read 30 pages of Fastlane docs. The cycle from “I think we need a lane that does X” to “here’s a working draft” went from an afternoon to fifteen minutes. That compounds across three months and three engineers.

When it gets in the way

There are places AI tooling reliably does not help. Production incident diagnosis is the clearest one. When something is visibly broken on a live system, I’ve tried asking Claude Code for the root cause. It produces a great-sounding list of plausible causes ranked by nothing. It doesn’t know which table is hot, which job escaped a maintenance window, or which call in our runbook comes first. That kind of call still needs me.

This is the part that doesn’t fit in a thought leadership tweet. AI compresses code generation, scaffolding, doc reading, and the tedious half of refactors. It does not compress judgment about production. Senior engineering work is still mostly judgment. The tools just give you more reps per day.

Side products and CTO mode

The other place I lean on AI tooling hardest is the side products I CTO in parallel with the day job. A wearables thing. An AI music product. A community platform. A logistics-sector hiring product before them. Small teams. No room for a dedicated platform team. AI tooling is how we pretend we have one.

On the wearables side product, the React Native app, the Nest.js backend, the Next.js dashboard, the AWS infra, all of it gets shipped by a tiny team with Cursor and Claude Code in the loop on every PR. CodeRabbit runs the AI review on every pull request and catches the small things before a human reviewer wastes time on them. Devin handles a few autonomous chores. None of these tools replace an engineer. They give a small team the shape of a bigger one for the rote work.

Takeaways

  • Configure Cursor not to auto-apply changes. Read every diff.
  • A short CLAUDE.md per repo is worth more than a clever prompt.
  • AI tooling pulls weight on scaffolding, glue code, and doc reading. Not on production judgment.
  • The job isn’t going away. The job is shifting toward review and architecture.
  • Run the AI on the boring half of your day. Spend the time saved on the half that needs you.
  • If you’re a senior engineer not using these tools yet, you’re leaving reps on the table.

Thanks for reading. If you’ve got thoughts, send them my way.

© 2026 Akin Gundogdu. All Rights Reserved.