Friday, December 19, 2025

The Step-by-Step Strategy of Including a New Characteristic to My IOS App with Cursor


I vibe-coding to create web sites and IOS apps. I have already got two apps reside on the App Retailer.

My first app was Brush Tracker, which helps you monitor your each day brushing habits, keep constant, and maintain your enamel clear by way of small motivational nudges. I additionally wrote an article on your complete means of constructing the app and delivery it to the App Retailer.

Just lately, I made a decision so as to add a brand new function to Brush Tracker: a calendar-like grid that exhibits the consumer’s month-to-month brushing consistency. On this article, I’ll stroll you thru how I applied this function utilizing Cursor and some guide changes I made.

Preliminary immediate

What I had in thoughts was much like the grids you see in habit-tracking apps or the contribution graph on GitHub.

I began with the Plan Mode of Cursor, which I’ve discovered extremely environment friendly when including a brand new function or making a giant change. You outline the function or clarify the duty and Cursor generates an in depth implementation plan.

Right here is the precise immediate I used within the Plan Mode to get began:

I need to add a calendar-like grid to trace days consumer full brushings. Make the grid with squares the place every sq. represents a day in a month. The preliminary state of the squares within the grid are black. Paint the sq. with inexperienced if the consumer completes all of the brushings, with gentle inexperienced if the consumer partially full the brushings. For instance, consumer units the each day brushings rely as 2. In the event that they full one brushing in a day, the sq. ought to be gentle inexperienced. In the event that they full two brushings in day, the sq. for that day ought to be inexperienced. The grid ought to be accessible by urgent a calendar icon on the highest left of the display.

Cursor requested me two inquiries to make clear some particulars earlier than finalizing the implementation plan. I actually appreciated this step as a result of it’s reassuring to see Cursor search clarification as a substitute of constructing assumptions by itself.

The 2 questions Cursor requested:

  • Ought to the calendar grid present solely the present month, or permit navigation between months?
  • Ought to we begin monitoring from immediately ahead, or additionally present previous days (which might be black)?

I instructed Cursor to permit navigation between months and to show the earlier days of the month in black. Then, Cursor created a markdown file outlining an in depth implementation plan.

The plan explains intimately how the function might be applied and in addition features a checklist of actionable todo gadgets.

Cursor’s TODO gadgets:

  • Lengthen BrushModel to trace historic each day brushing knowledge with persistence
  • Create CalendarGridView part with month grid and color-coded squares
  • Add calendar icon button to prime left of ContentView
  • Combine CalendarGridView with ContentView utilizing sheet presentation

Subsequent, I requested Cursor to implement the plan. It additionally permits for modifying the plan earlier than execution, however I wished to stay with Cursor’s authentic define as-is.

The implementation labored on the very first strive, and I used to be capable of take a look at the function immediately within the Xcode simulator. Nevertheless, the design was horrible:

Be aware: All photos used on this article embody screenshots from my app, Brush Tracker.

Xcode simulator not contains date and time settings, so I modified the system date on my Mac to check how the grid colours up to date throughout completely different days.

I didn’t like this fashion in any respect. So I requested Cursor to revamp the grid utilizing the next immediate:

We have to change the design of the grid. What I take into account is one thing like Github contributions grid. Additionally, don’t present the day values within the squares representing days.

This immediate didn’t work as I’d hoped. The one change it made was eradicating the day numbers:

Subsequent, I shared a pattern picture of the grid fashion I need and requested Cursor to make an analogous design.

The brand new design was nearer to what I had in thoughts but it surely had structural points. The squares had been too small and didn’t scale properly throughout the format:

So there are two fundamental issues with this design:

  1. Every month comprises 42 squares (not representing the times in any month).
  2. Squares are too small.

I requested Cursor to repair the primary downside with this immediate:

Within the present implementation, there are 42 squares in November and December. Squares within the grid characterize days in a month so the variety of squares have to be equal to the variety of days in that month.

The opposite downside was less complicated and I might remedy it by adjusting some parameter values. As an illustration, the scale of the squares within the grid could be modified by the squareSize parameter:

struct DaySquare: View {
    let isToday: Bool
    let isCurrentMonth: Bool
    let brushCount: Int
    let brushesPerDay: Int
    
    non-public let squareSize: CGFloat = 8 // change this parameter

Right here is how the grid takes care of I modified the sq. dimension to 32:

The opposite downside that could possibly be solved by adjusting parameter values is the padding between rows.

Within the screenshot above, there appears to be no house between rows. This may be modified by rising padding between rows.

I additionally need to have 8 squares (i.e. days) in a row and alter the house between rows.

All of those could be carried out within the following code snippet:

            // Calendar grid - smaller GitHub fashion
            LazyVGrid(columns: Array(repeating: GridItem(.versatile(), spacing: 0.2), rely: 8), spacing: 0) {
                ForEach(Array(calendarDays.enumerated()), id: .offset) { index, dayInfo in
                    DaySquare(
                        isToday: dayInfo.isToday,
                        isCurrentMonth: dayInfo.isCurrentMonth,
                        brushCount: dayInfo.brushCount,
                        brushesPerDay: mannequin.brushesPerDay,
                        dimension: 32
                    )
                    .padding(.backside, 3)
                }
            }
  • spacing controls the house between squares in a row
  • padding controls the house between rows
  • rely controls the variety of squares in a row

After enjoying round with these parameter values within the code snippet above, I acquired the next grid:

If the consumer completes all brushings in a day, she will get a shiny inexperienced. In case of partial completion, the sq. for that day is coloured with pale inexperienced. The opposite days are proven in black and the present day is indicated with a white body.

After implementing the function to maintain monitor of previous days, it appeared pure so as to add notifications for streaks. I requested Cursor to do that utilizing the next immediate:

Add notifications for when the consumer accomplished all brushings for 10, 20, and 30 days. Additionally, add a month notification for when the consumer completes all days in a month. Notifications ought to be encouraging and motivating.

The grid I created is just not the very best design but it surely’s adequate to ship the message. When a consumer seems at this grid, she instantly will get an concept of her enamel brushing frequency.

With the assistance of Cursor and a few guide tweaks, I used to be capable of implement and ship this function in just a few hours. On the time of writing this text, this model continues to be in App Retailer evaluate. By the point you learn the article, it could be distributed. Right here is the App Retailer hyperlink to Brush Tracker in case you’d like to try it or check out the app.

Thanks for studying! In case you have any suggestions concerning the article or the app, I’d love to listen to your ideas.

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles

PHP Code Snippets Powered By : XYZScripts.com