The normalization of unproductive environments

One of the biggest challenges we face at Tuist is that teams have normalized working without data. They stack decisions that erode productivity, then throw resources at the symptoms rather than understanding the cause.

If system APIs where awaitable

Swift’s async/await concurrency is a game-changer, but to fully leverage it, foundational APIs need to be designed with concurrency in mind.

Why you need the -ObjC flag

In this blog post, I explain why you might need to set the -ObjC flag in the OTHER_LDFLAGS build setting of your Xcode project.

Starting therapy next week

2023 was a year of many challenges in my life. Next week I'm going to start mental therapy with a psychologist.

What if XCTest a concept akin to Elixir's processes?

Erlang processes are a powerful concept that allows you to mock dependencies without introducing dependency injection. In this post, I share my thoughts on how XCTest could adopt a similar concept.

Implicitness in Xcode and SPM. Why Apple?

Apple embraced implicitness in some areas of the build system, and it's causing headaches to developers. In this post, I share my thoughts on the topic and how we are planning to address it in Tuist.

Swift Packages default to supporting all platforms

Swift Package Manager defaults to supporting all platforms when they don't specify any. This is a problem for tooling like Tuist that integrates Swift Packages as Xcode project targets.

Hitting memory limits deploying Vapor apps to Fly

Deploying a Vapor app to Fly encountered unexpected issues. Swift's linter requires more memory than Fly's 2048 MB limit. Scaling via fly scale didn't solve the problem. Workaround: built locally with Docker, then pushed to Fly's image registry for deployment.

Community-driven and organization-driven open source

Yesterday, while reading about Rust and its package manager, Cargo , I realized how diverse the list of Crates (packages) for building CLIs is compared to Swift, and made me think about the connection between that and how Rust and Swift are…

The role of flexibility in scaling up Xcode projects

I often wonder why Apple continues to build features that are closed into Xcode, for example Swift Package Manager's integration. While some developers might see that as something positive, because that means it can be seamlessly integrated…

Tuist and the Swift Package Manager

It's common to see developers wondering why they should use Tuist instead of the Swift Package Manager (SPM) for modeling their projects. I think it's normal. It happened to me a few times too. Some of them even made me wonder if I should c…

Tackling technical debt in Tuist

I've recently spent a lot of time in Tuist tackling technical debt. It'd been a while since the last time I have to pause some other work for weeks to do something that would be beneficial for the long-term of the project. This time the wor…

From iOS engineer to a T-profiled techie

One of the things that excited me the most about the opportunity to join Shopify back in 2018 was the opportunity to grow and learn from the challenges and the talent of the company. When I joined, my background was mainly iOS development w…

Generation of Swift interfaces to access resources

Many of you might already be familiar with SwiftGen ; a tool that generates Swift code to access resources in a type-safe manner. Having a type-safe API is something that Android developers have had for a long time, and that Apple has never…

A standard CLI for Xcode projects

There’s an idea that I’d love Tuist to move towards: provide a CLI that is standard across all the projects defined using Tuist. This is not a new idea; we can see it in frameworks like Rails that thanks to being opinionated about the struc…

Evolving Tuist's architecture

I'm flying back from Tokyo and took the opportunity to code a bit on Tuist. Since I don't have Internet connection to get distracted with, I decided to work on something that doesn't require Internet connection: improving the project archit…

Signing with Xcode on CI

Today, I worked on automating the release process of Angle on CI. At first, I thought it'd be a straightforward task, but it turned out not to be so. Most Xcode projects don't have to deal with this because they use Match , which abstracts…

Moving Pods to Packages

Today, I decided to move all Angle 's dependencies that were defined as CocoaPods Pods to Swift Packages. It was my first-hand experience with Xcode's integration with the Swift Package Manager so here are my thoughts: I had no issues. I we…

What's coming to Tuist

A Monday blog post with some reflections about the current state of Tuist and its future.

Project generation

This blog post describes the advantages of dynamic over static Xcode projects, and how Tuist leverages project generation to help teams overcome the challenges associated to scaling up projects.

Adding error tracking to a CLI written in Swift

Trying to add error tracking to Tuist, I realized how the process is not very straightforward. This blog post describes the process that I followed to help other Swift developers add error tracking to their CLI tools.

All you need is tools (talk)

This post contains the video of the talk that I gave at AltConf about why I think it's important investing into tooling and some tips to build great tools.

Speaking at AltConf

A brief post talking about my experience speaking at AltConf 2019 in San Jose.

Abstracting Info.plist files

On this blog post I talk about an idea that I'm pondering for Tuist. In the aim of abstracting implementation details from Xcode projects, I think there's an opportunity for Tuist to abstract `Info.plist` files which are barely modified by developers after they get created.

Xcode updates are fun

On this blog post I talk about Xcode updates and how painful they can sometimes be.

Reliably installing Xcode

I started developing a tool, install-xcode that aims to help developers to install and upgrade versions of Xcode easily. In this blog post I talk about the motivation behinds building it and some design principles that I'm embrazcing.

Interacting with Xcode projects in Swift

This blog post is an introduction to the format of Xcode projects and xcodeproj, a Swift library that helps read and update Xcode projects in Swift. The post contains a few hands-on examples for developers to experiment with the library.

All you need is tools

In this post I talk about why investing in good tooling is crucial for projects to move steadily.

Open source mindfulness

Not being mindful when contributing and maintaining open source projects might lead to burnout or low self-steem. In this blog post I talk about some principles that I applied to have a healthier relationship with the open source.

Open Source

In this blog post I talk about why I work on open source projects and what are the most important elements for me when starting an open source community.

Linting your Xcode projects with xclint

In this post I talk about a tool I've been working on that allows you to check the state of your Xcode projects, finding missing references and duplicated files.

Consistent vs convenient

I analyze in this post why some decisions that we make in our projects might turn into bad viruses that spread all over the code base.

Modular Xcode projects

This post presents some elementary concepts of how Xcode projects are structured, and introduces an structural approach to build modular Xcode apps.

Composable UIs

Build UIs based on reusable components that you can compose in more complex hierarchies.

Divide and conquer

How modularizing your apps is helping us to scale our Xcode app.

Programación Reactiva en Swift: Parte 1, Introducción

Con la llegada de Swift y la introducción de interesantes operadores, conceptos funcionales, y la seguridad de tipos el paradigma de programación reactiva ha cobrado especial importancia en el desarrollo de apps. En comparación con la progr…

Swift and Objective-C playing together

Start using Swift in your Objective-C projects. Avoid some headaches with these useful tips and advices for the communication layer between your Objective-C code base and your future Swift implementations