Tag: iOS

  • The 15-Minute iOS Project

    The 15-Minute iOS Project

    šŸ‘‹ Introduction

    For the past several months I’ve been building personal iOS apps to
    keep my skills current during my job search. I’d like to share a tool
    I’ve built that makes setting up a professional-grade iOS project take
    only minutes.

    šŸ• The Time Saving Inspiration

    In the past when working on personal projects I tended to use a
    simple Git repository and do everything manually. It worked ok, even
    though sometimes in my excitement to push I’d forget to run the unit
    tests. However, once you’ve lived with professional automation that
    enforces code quality it is hard to go back. It’s such a huge
    productivity boost and helps prevent one from making simple mistakes and
    speeds up one’s development process.

    However, I’ve found myself spending valuable time building out the
    same automation frameworks and tooling each time I set up a new iOS
    project. Setting up a project with CLI scripts, linting, code
    formatting, GitHub CI, and all the configuration files that make for a
    professional-grade project used to take hours of time. Last weekend I
    spent part of a day with Claude Code and came up with a GitHub Template
    Repository called SwiftProjectTemplate
    that aims for zero-configuration setup of new iOS projects, complete
    with GitHub CI workflow, code lint, code formatting, and build and test
    automation.

    🧰 The Professional
    iOS Developer Tech Stack

    There are certainly many ways to configure and organize a
    professional tech stack for iOS development. Below is what I prefer to
    use, and it is definitely CLI-centric. It might not be for everyone,
    especially if you prefer GUI dev tools.

    šŸ“‚ File Structure

    My biggest pet peeve about Xcode’s new project wizard is that it
    gives you a really basic folder structure. A good iOS project has
    well-organized folders for keeping files together. SwiftProjectTemplate
    is very opinionated about using the MVVM
    pattern and automatically sets up a directory structure for you like
    so:

    MyAwesomeApp/
    ā”œā”€ā”€ MyAwesomeApp/
    │   ā”œā”€ā”€ Models/              # Data models and Core Data entities
    │   ā”œā”€ā”€ Views/               # SwiftUI views and UI components
    │   ā”œā”€ā”€ ViewModels/          # Business logic and view state
    │   ā”œā”€ā”€ Services/            # Network, persistence, business services
    │   ā”œā”€ā”€ Extensions/          # Swift extensions and utilities
    │   └── Helpers/             # Helper functions and utilities
    ā”œā”€ā”€ MyAwesomeAppTests/       # Unit tests (mirrors main structure)
    ā”œā”€ā”€ MyAwesomeAppUITests/     # UI tests
    └── scripts/                 # Development automation scripts

    šŸŗ Homebrew

    I rely on a bunch of tools from Homebrew to keep the project organized and
    the code clean. Using a Brewfile allows one to easily
    specify the required tools and install them.

    āš™ļø XcodeGen

    My biggest frustration with Xcode has always been its project format.
    Merging changes from multiple users can be a serious pain, and if you do
    it wrong you can lose files or make the project file unreadable. XcodeGen solves that by
    using a simple YAML project.yml configuration file to
    automatically generate the Xcode project.

    šŸŽØ SwiftFormat

    Everyone has their code style preferences. SwiftFormat
    allows one to configure how code should be formatted, and check/enforce
    the code style. It can also fix simple formatting issues around
    structure and spacing.

    šŸ” SwiftLint

    A related tool that helps enforce consistent syntax and best
    practices is SwiftLint.
    This tool allows one to configure standards for code syntax, clarity,
    complexity, and consistency.

    ✨ xcbeautify

    As a power command line user I appreciate readable output and logs.
    Xcode is quite verbose and xcbeautify helps
    make the copious Xcode build and test logs more user-friendly.

    šŸ“„ yq

    My preferred format for configuration files is YAML, which is just as expressive as JSON
    but a little easier on the eyes for us humans. The CLI command yq is a powerful tool for
    parsing YAML files and pulling data out of it so you can supercharge
    one’s scripts and automation.

    🦾 GitHub CLI

    GitHub provides a powerful command-line tool called gh for interacting with GitHub. I find
    it particularly useful for automating GitHub actions, debugging, and
    resolving errors in one’s CI workflow.

    šŸ“ VSCode + Markdownlint

    I tend to use VSCode for
    all of my coding/editing beyond Swift and Xcode. It is a lightweight IDE
    that has a ton of functionality and extensions. The markdownlint
    extension makes editing Markdown easier by highlighting syntax/style
    issues and providing informative warnings. The SwiftProjectTemplate repo
    includes a .markdownlint.json that silences some common
    warnings about style that occur when writing a more compact style of
    Markdown (which I’ve found AI agents like to use).

    šŸ’» iTerm2

    VSCode and macOS have their own terminals for entering commands, but
    once the scrollback buffer fills up the terminal starts jumping around
    and behaving oddly. If you’ve got a long-running Claude Code session you
    will encounter this highly annoying bug. I prefer to use iTerm2, which has superior configuration,
    customization, and scrollback buffer options than the built-in macOS
    Terminal. Increase your scrollback size to something huge like 500,000
    lines (or unlimited) and enjoy using the terminal again!

    šŸ”Ø Xcode

    I tend to prefer using the latest Xcode tools and Swift version, so
    by default (as of this writing) the SwiftProjectTemplate will target iOS
    18.0, Xcode 15.4, and Swift 5.10. I find it useful to use the latest
    tools, especially when creating a new project! However, I included the
    flexibility to configure different versions for those with specific use
    cases.

    šŸ—‚ļø GitHub

    SwiftProjectTemplate automatically configures a GitHub PR template
    and CI workflow. It’s great having a consistent format for one’s pull
    requests, and it serves as a good reminder to follow best practices when
    merging code. (You did remember to test your code, right?) The CI
    workflow leverages a suite of scripts that are part of the repository
    and make the sometimes complicated CLI commands easier. It should work
    out of the box and SwiftProjectTemplate will generate a minimal iOS
    project with tests that should build and pass the full CI suite of
    quality gates.

    šŸ¤– CLI Scripts

    The repo contains a ./scripts directory with helper
    scripts for common CLI operations (build, test, lint, format), as well
    as a Git hook for pre-commit validation, and a ā€œpreflightā€ script to
    easily do an automated validation on-demand. This is also where the
    setup.sh script lives, which bootstraps one’s project.

    The really cool script though is simulator.sh which is a
    helper tool for the complicated xcrun simctl command–which
    I can never remember how to use, and has complicated arguments. This
    script makes it easy to find which simulators are available (by device,
    OS, and arch), as well as configure the default
    simulator to use for app tests and UI tests. It will write out a
    simulator.yml config file in the root of the project, which
    the test.sh and ui-test.sh scripts will read
    (via yq) in order to execute tests using one’s preferred
    simulator!

    I have found this to be a real time saver, especially when
    configuring one’s GitHub CI workflow, as the simulators available on the
    GitHub runner might be different from what are in your local
    environment.

    šŸ¤– Collaborating With an AI
    Agent

    One of my favorite ways to leverage AI agents is building automation
    infrastructure–especially CLI scripts. I am no expert on
    bash, awk, sed, and the myriad of
    obscure CLI tools with their myriad of complicated arguments and
    configuration options. What once might have taken me hours of googling
    to get a basic script working can now be accomplished in minutes, and
    achieve a sophisticated and user-friendly CLI command (complete with
    --help documentation and clear, verbose arguments, and
    informative feedback).

    I’ve been using Claude Code for a while because I am partial to the
    CLI interface, and it doesn’t tie you to any specific editor.

    Using Claude I’ve been able to easily set up GitHub workflows.
    Leveraging the gh CLI tool to debug workflow issues reduces
    the amount of trial-and-error commits and workflow runs–a time consuming
    and clunky way to debug one’s CI.

    šŸŖ„ Using Xcode’s Project
    Wizard

    SwiftProjectTemplate will generate a minimal iOS app–it doesn’t
    really do much. If you want a more fully-featured jumping off point I’d
    still recommend using Xcode’s new project wizard. Turn off the ā€œCreate
    Git repository on my Macā€ option and then copy the generated files over,
    preserving your repository’s existing folder structure.

    šŸš€ Contributing to the
    Developer Community

    What started as a personal productivity tool has become something I’m
    excited to share with the broader iOS community. By turning
    SwiftProjectTemplate into a GitHub Template Repository, any developer
    can bootstrap a fully-configured professional iOS project in
    minutes.

    The real win isn’t just individual time savings—it’s raising the
    baseline quality for iOS projects everywhere. When setup friction
    disappears, developers spend more time on what matters: building great
    apps. New developers get professional-grade tooling from day one, and
    experienced developers can focus on innovation rather than
    infrastructure.

    There’s also an environmental consideration that’s increasingly
    important: AI resource efficiency. Rather than every
    developer burning through thousands of AI tokens recreating the same
    project setup, we can solve it once and share the solution. As AI
    becomes central to development workflows, being thoughtful about when
    and how we use these computationally intensive tools matters for both
    cost and carbon
    impact
    .

    Setting up a professional iOS project used to mean hours of
    configuration before writing your first line of app code. Now it takes
    15 minutes—and you only need to figure it out once.

    Ready to try it? Check out SwiftProjectTemplate
    and start your next iOS project the right way.


    Nicholas Hart is a software engineer and technical writer passionate
    about sharing knowledge and helping others learn. You can find more of
    my work at:


  • The Manager Who Never Stopped Coding: My Next Chapter

    The Manager Who Never Stopped Coding: My Next Chapter

    Labor Day Reflections

    Labor Day has come and gone, school has started, and Summer is over
    (even though we haven’t hit the autumnal equinox just yet). This was a
    special Labor Day this year because my unemployment insurance ran out.
    I’ve had a few job opportunities nearly go to an offer, but am still on
    the hunt after 6 months.

    The job market for a software engineering manager is rough–tougher
    than I’ve ever seen it. I’m starting to apply for individual contributor
    roles and contract/consulting roles, just to broaden my options.

    Rediscovering My Love for
    Code

    I successfully launched Sonos’ first B2B SaaS product last year, but
    I didn’t spend as much time writing code as I would have liked. I’m a
    great manager, enjoy coaching, and helping my employees grow their
    careers, but I also love to write code. In my last role I had to spend
    much more time managing–not just my team, but filling in for a busy (or
    missing) Product Manager, and coordinating with stakeholders across
    business units. While I was able to learn a new tech stack sufficiently
    to review code and guide technical decisions, I had a humbling moment in
    a recent interview where I struggled to build an app from scratch.

    As I’ve been working on personal software projects and exploring AI
    agents I’ve enjoyed learning tech stacks like Ruby/Rails, Flutter,
    deepening my understanding of Typescript, and getting up to speed on all
    the latest in iOS development. I’ve done more personal coding in the
    past few months than I have over the prior nine years as a manager.

    I’ve realized that I love technical leadership and I can use my
    skills to help move a team forward as an individual contributor. I’m now
    considering both management and senior IC roles. For IC roles I’m
    focusing on iOS and mobile, which is still my ā€œfirst loveā€ in
    programming–and where I think I can best demonstrate my technical
    expertise when it comes to a coding interview.

    The ā€œYay! Code!ā€ Philosophy

    While iOS is still my preferred stack, one thing I have demonstrated
    over the course of my career is that I can pick up any new tech stack
    required. When I first started mobile development it was on Symbian. In
    college I learned how to code in Ada. My first AI code was written in
    Lisp. When I developed Windows apps it was using C++ and COM. I’ve
    delivered apps for Windows, Mac, Linux, iOS, Android, frontend, backend,
    and firmware. I’m what one of my former mentors referred to as a ā€œYay!
    Code!ā€ kind of engineer. When presented with a new technology I love to
    dive in, learn how to use it, and deliver something great.

    This is such an exciting moment in tech with the rise of AI and
    agentic coding. With an AI agent as a partner (sort of like a junior dev
    with an encyclopedic memory of reference material), it is easier than
    ever to pick up a new tech stack. AI can’t write an app by itself, but
    it can help with some of the tedious boilerplate and ā€œplumbingā€ code. It
    makes for a helpful SDET, which can help automate your processes, write
    helper scripts, and set up your CI/CD workflow. It’s like having a
    junior pair programmer at your side. I don’t know about these ā€œ10xā€
    coding claims I read about, but AI can certainly help an experienced
    software engineer/architect leverage their expertise and deliver much
    faster.

    Leading Through Change

    The other interesting thing about this period is how rapidly the
    industry is changing. People have all sorts of predictions about the
    direction things are heading, whether there’s a bubble about to burst,
    etc. The one thing I know for certain is that we are in a ā€œVUCAā€ period
    (Volatility, Uncertainty, Complexity, and Ambiguity). I have led teams
    through periods like this in the past–from the rise of broadband
    Internet, to the ubiquity of mobile computing, plus cloud computing
    connecting it all. Whether as a manager or a seasoned engineer I have
    the experience, empathy, and resilience to help lead teams through the
    quickly changing landscape.

    What I’m Looking For

    My next role needs to be about the opportunity, not the title. I am a
    technical leader and I like to be close to the code. I want to be
    inspired by the company culture and the people I work with. I want to
    build new experiences that solve problems for customers. I love mobile,
    but understand that great mobile experiences extend beyond the
    phone/tablet and require deep integrations with other systems. I don’t
    want to be held back by platform limitations–I want to dive in and add
    new features to a backend system to unblock my team. If this sounds like
    the kind of manager or staff/principal engineer you need on your
    software team, I’d love to connect!