It took me a few months to embrace the Cursor hype, and I regret not being an early adopter of the future of coding.

As soon as I learned about Windsurf, I dived the day after.

I used it to create the project Whispering, an easy way to use OpenAI's Whisper model for on-device speech-to-text inference:

GitHub - rudrankriyam/Whispering
Contribute to rudrankriyam/Whispering development by creating an account on GitHub.

Here is my first prompt:

Create an Xcode project called "Whispering" which will be a SwiftUI macOS project. It will be a full fledged project.

Here are the steps it followed:

  • Created a new folder using mkdir
  • Created a dummy Xcode project with a project.pbxproj,
  • Created a proper  .gitignore for Swift project,
  • Finally created a README.md with some basic project information

Then it told me that the best way to create a new Xcode project is through Xcode itself, as it will correctly set up all the necessary project files and configurations, and gave me the instructions for the same:

Here's what you need to do:

Open Xcode
Click "Create a new Xcode project" (or File > New > Project)
Choose "macOS" as the platform
Select "App" under Application
Click "Next"
Fill in the following details:
Product Name: Whispering
Team: Your development team
Organization Identifier: Your organization identifier (e.g., com.yourdomain)
Interface: SwiftUI
Language: Swift
Storage: None
Make sure "Create Git repository" is unchecked (since we already have one)
Click "Next"
Choose the location as /Users/rudrankriyam/Downloads/Whispering
Click "Create"

I have grown adamant over the months that I am not too fond of Xcode 16.x, so I asked it to use XcodeGen to create the project's structure and run the command in the chat itself.

First, it checked if XcodeGen is installed and installs it if needed:

which xcodegen

Then, it created the project.yml to define the Xcode project structure and relevant files for a SwiftUI app.

Finally, it ran the command to generate the project:

xcodegen generate

⚙️  Generating plists...
⚙️  Generating project...
⚙️  Writing project...
Created project at /Users/rudrankriyam/Downloads/Whispering/Whispering.xcodeproj

When I got some parts of the app working, there were some errors as it used AVAudioSession which is not available in macOS. I added the prompt to use xcodebuild so that after every conversation, it reruns the project:

Now, let's build the project for macOS using xcodebuild:

Ran terminal command
~/Downloads/Whispering
$ xcodebuild -scheme Whispering -configuration Debug -destination platform=macOS build

When there is a failure, it checks for the output automatically and fixes it:

I see the build failed due to some macOS compatibility issues. Let me fix those and try again:

    public static let record: AVAudioSession.Category
                      ^
/Users/rudrankriyam/Downloads/Whispering/Sources/ContentView.swift:90:58: error: 'default' is unavailable in macOS
            try audioSession.setCategory(.record, mode: .default)
                                                         ^~~~~~~
AVFAudio.AVAudioSession.Mode:3:23: note: 'default' has been explicitly marked unavailable here
    public static let `default`: AVAudioSession.Mode
                      ^
/Users/rudrankriyam/Downloads/Whispering/Sources/ContentView.swift:91:30: error: 'setActive' is unavailable in Swift
            try audioSession.setActive(true)
                             ^~~~~~~~~
AVFAudio.AVAudioSession:4:15: note: 'setActive' has been explicitly marked unavailable here
    open func setActive(_ active: Bool) throws
              ^

SwiftDriverJobDiscovery normal arm64 Emitting module for Whispering (in target 'Whispering' from project 'Whispering')

SwiftDriverJobDiscovery normal arm64 Compiling WhisperingApp.swift (in target 'Whispering' from project 'Whispering')

--- xcodebuild: WARNING: Using the first of multiple matching destinations:
{ platform:macOS, arch:arm64, id:00006000-001C18191198801E, name:My Mac }
{ platform:macOS, arch:x86_64, id:00006000-001C18191198801E, name:My Mac }
** BUILD FAILED **


The following build commands failed:
	SwiftCompile normal arm64 /Users/rudrankriyam/Downloads/Whispering/Sources/ContentView.swift (in target 'Whispering' from project 'Whispering')
	SwiftCompile normal arm64 Compiling\ ContentView.swift /Users/rudrankriyam/Downloads/Whispering/Sources/ContentView.swift (in target 'Whispering' from project 'Whispering')
	Building project Whispering with scheme Whispering and configuration Debug
(3 failures)

This is not available in other AI IDEs (yet, at the time of writing this post). It automatically made the necessary changes:

I see the build failed due to some macOS compatibility issues. Let me fix those and try again:

It ran the project again:

Now let's try building and running the app again:

Ran terminal command
~/Downloads/Whispering
$ xcodebuild -scheme Whispering -configuration Debug -destination platform=macOS build

Great! The build was successful. Let me explain the changes I made to make the app macOS compatible:

Removed iOS-specific code:
Removed AVAudioSession setup since it's iOS-only

And I was just sitting there like a spectator while it did the job for me!

Working with External Packages

My next step was to add the external package WhisperKit to add the transcription service easily.

It failed miserably to add relevant related code, and I understand that the Claude 3.5 Sonnet is not trained on it.

To assist the model, I use this neat trick of changing the "g" to "u" when working with open-source projects:

https://uithub.com/rudrankriyam/WhisperKit-Sample

This provides me with the hierarchy of the file structure and the contents of individual files.

Adding this LLM context into the chat helped me create the initial MVP of the project!

Moving Forward

I am still in awe of this agentic flow because it is magical.

The next post will discuss how I add a new feature to my app using external documentation and an API service.

Happy windsurfing!

String Catalog

String Catalog - App Localization on Autopilot

Push to GitHub, and we'll automatically localize your app for 40+ languages, saving you hours of manual work.

Tagged in: