iOS project
Build a REST-API-backed tracker with async/await networking
A native iOS thin client over a REST API — the actual daily shape of the job, graded on whether errors are surfaced instead of silently swallowed.
The brief
Build an app that tracks something against a real or mock REST API (job applications is a fine choice, matching the concept of the Android version but built natively). Use async/await for networking, implement pagination, and handle loading, error, and empty states fully — errors must be surfaced to the user, not silently caught and ignored.
Suggested stack
What you hand in
- A public GitHub repository with the app and a README
- The README documents the API contract used (real or mocked) and the architecture
- A short note on how a simulated network failure was tested and what the UI shows for it
Grading happens against the rubric below, so read it before you start — not after.
How this is graded
Published in advance and weighted out of 100. Nothing here is a surprise.
async/await is used correctly, and errors from a failed request are surfaced in the UI, not caught and discarded.
Loading, error, and empty states are all implemented and visually distinct.
Networking logic lives outside the View (e.g. in a view model), so calls aren't fired directly from the View's body on every re-render.
Loading more items appends correctly without duplicating entries, even if a refresh overlaps with a load-more call.
No console errors or crashes, no broken layout, no leftover placeholder text or commented-out code.
Why this project is worth your weekend
- Like the Android equivalent, this is the actual daily shape of most iOS jobs — a thin client over a REST API — more than any local-only app.
- Silently swallowed errors (a caught error that does nothing) are a real, common iOS bug, and this project is specifically designed to surface whether the candidate handles them.
- A clean separation between networking and views is what makes the app testable, which interviewers ask about directly.
Where people lose points
- Catching a network error and doing nothing with it, leaving the UI stuck on a loading spinner forever.
- Calling URLSession directly inside a SwiftUI View's body instead of through a view model, causing repeated calls on every re-render.
- Pagination that appends duplicate items when a refresh overlaps with a load-more call.
Other iOS projects
Two or three of these turn an empty resume into a portfolio.
Built it? Get it scored against this rubric.
Submit your work and get a score on every criterion above, written feedback, and three resume bullets you can use straight away.