🤖 Built an iOS App with ChatGPT in 7 Days: Push Alerts, Docker Fights, and Mild Suffering

While debates rage on – whether AI will replace humans on one side, conflicts in Iran on the other, and my own unemployment on the third – I decided to give myself a challenge:

✨ Build an iOS app with SwiftUI in 5 days, backend in Python
(spoiler: the deadlines were made to be missed, yep)

In the end, building the app took 7 days.
Deployment — battling nginx, Docker 🐳, SSL, and snack cravings 🍟 — took another two loooong days.


How it all started

I jumped on a freelance marketplace and browsed what people were looking for. One app description caught my eye:

An app with two buttons that polls the server and, if a target price is hit, sends a critical alert. Alarm alarm, beep-boop.

I thought: that’s a great idea.
I often draw levels on the ETH/USDT chart on Bybit and watch what happens. Attention always increases around those levels. The rest of the time? Meh.

👉 The only thing: I didn’t want to poll the server. I wanted the server to ping me at the right moment.

A simple app:

  • add price levels
  • close the app
  • get notified only when your set price is hit

🚫 No promo banners, no garbage.
🕹️ Want to disable it? Just flip a toggle.

P.S. I didn’t steal the idea. I just liked it. I even messaged the original poster. No response 🤷‍♀️. But the process had started, the tech stack was already forming in my head… the train had left the station 🤪


Tech I wanted to bring in:

  • SwiftUI 🍏
  • FastAPI 🐍
  • Critical push notifications
  • And a test: can I handle my gaps in Python & sysadmin stuff?

📐 Stage 1: Planning

  • Sketching app structure
  • Drafting backend request list

🕸️ Stage 2: Setting up the API

  • WebSocket connection to Bybit using pairs from .env
  • Setting up MySQL database
  • Implementing anonymous auth and methods:
    • subscribe
    • unsubscribe
    • update_push_token
    • update_fcm_token
    • update_price
  • Push notifications via Firebase

📱 Stage 3: Writing the app

  • Pulling in Moya with previously written plugins
    (surprised to see async/await still isn’t there)
  • Setting UserAgent
  • Overriding request method — if server returns 403, first refresh token, then retry

🧪 Stage 3.5: Testing edge cases: re-auth and token fetch

Problem: token doesn’t arrive.
I ask ChatGPT, it gives a checklist. I follow it – nothing helps.

→ Another question → same loop again
→ I give up → head to Stack Overflow 💥

Firebase swizzles AppDelegate and breaks something.

Hold on…
🤔 Why did I pick this wrapper in the first place?

I recall endless backend pain with APNs certificates and their renewals.
Think: okay, maybe I’ll get lucky 😅 So I switch to the native way.
Surprise: with .p8 keys it worked on the first try 🙌


🔁 Stage 4: Final features & testing

Something felt off with critical alerts. I’ve never actually configured them myself. I dig into the docs and discover Apple doesn’t approve these easily: they’re for life-critical use only and need special permission.

📉 Even though price levels are “life-critical” to traders (lol), I decided to scrap this feature.


🧳 Deployment: pain & Docker

The most exhausting part: deployment.

I have a VPS I use for my VPN. Thought: let’s not waste it. I’ll throw the app there.
Together with ChatGPT, I set up Docker, nginx, and the database.
Realized ChatGPT has memory issues – had to remind it 10 times: yes, we use Let’s Encrypt, nginx, and a shared docker file. And no, the domain isn’t your-domain.com, it’s gulnaz.space.
But the great thing is: after countless tries – it all worked.
Also, I kept asking: what’s this? what’s that? why do we need this?
Got thorough explanations. My brain finally sorted out:
– what Docker is
– what FastAPI is
– why MySQL is better than SQLite
And that serious projects use PostgreSQL.
Well, this one isn’t “serious” but not so small to use SQLite either 😅


🧭 The downside: ChatGPT as a drunk sidekick

It’s like exploring uncharted territory 
with a machete and a drunk companion,
who sometimes messes things up but sometimes drops wisdom.

Seriously, he’s overly confident, sometimes gaslights you, and acts like he knows better.
Reminds me of:

“You’re amazed by ChatGPT until you ask it about something you know well.”

His Swift code? Meh:

Needs explicit instructions:

    • pure functions
    • methods no longer than 15 lines
    • meaningful variable names, even if long
    • early return preferred over nested ifs
    • and so on…

My Python code is probably average.
But I do have architecture experience and backend best practices.
So I re-asked, rewrote, re-tested.

🧩 You never know when ChatGPT will sneak something in:

  • renamed EMAIL_TO to TO_EMAIL
  • deleted a check in a custom TextField
  • switched to a different coding style without warning

You have to stay alert.
Read carefully. Analyze.
⚡ Still: it’s a powerful boost. Sometimes reminds you of forgotten tricks.
Writes test cases fast if you describe them well.
Works great with small scripts.
But nowhere near producing elegant, complete code yet.


ℹ️ BTW:

👉 It’s helpful to ask it:

  • What’s your current context?
  • What do you know about me?

This affects its responses.
I learned that in an IBM prompt engineering course.
Very useful stuff – but man, the delivery was boring 💤