Building the Shipping Container for Developer Toolchains

I’ve been thinking a lot about automation in software projects lately, particularly where the opportunities for a better developer experience lie. I believe many current limitations stem from how we answer the where , what , and how of auto…

Fluidity as DNA

The other day I was chatting with a developer who has been following Tuist for many years, and she was positively surprised by how much Tuist has changed over the years. She made me think that we don’t know what shape Tuist will have in yea…

A Tiny Nudge Can Move an Industry

One of the traits of my personality that I consider positive, yet sometimes frustrating, is that I spend a lot of time observing how things evolve. I tend to think in trajectories. In the context of Tuist, that means thinking about how we c…

What My Family's Cafe Taught Me About B2B Sales

We, developers, commonly believe that the only requisite for one of our creations to be sold is to make it awesome and valuable. While that might work in some cases where you press the right psychological triggers, the chances that those ar…

Thin Environment Layers for an Agentic Future

What is an environment from a developer's perspective?  A place where code is built and tested. We've evolved from having just local environments where we develop and test code, and production environments where we make our apps access…

Cache for any Xcode project

Today was an important day at Tuist. We released a major redesign of our marketing site and a caching solution that works with any Xcode projects, and we couldn't be more proud of our 4-person team pulling this off . We are building the com…

AI and the Craft of Building Products

There’s a camp of people who think that AI will lead to the Internet being filled with slop content and projects. While I think there’s some truth to it, I believe it would come from the same profile of people who would have published low-q…

Substance Over Spectacle: How We Share Tuist

When you build a company or a product, one of the things you have to decide is how to market yourself. This isn't just about getting people to know what your company does, it's also about the values you stand for. Tuist builds on an open so…

Why iOS Teams Are Flying Blind (And How to Fix It)

If you’ve developed apps with Xcode for a while, you might have noticed how little to no observability teams have over their setup. This is fine when you’re just getting started, but when the project reaches a certain scale, the lack of dat…

The Case for Dynamic CI Pipelines

Something I've been thinking about lately is how static CI pipelines are, and how this makes it challenging to work in large codebases and monorepos, where you can easily be constrained by the resources of a single machine and might want to…

Tuist Is Not What You Think It Is

Something great about having chosen Tuist as a name for a product is that we have a high ceiling in terms of the product definition we can come up with. Unfortunately, we have a floor that we need to raise too, and that's people's perceptio…

The False Choice Between Enterprise Sales and Great Products

Have you ever avoided using a product because its enterprise-first, sales-driven approach compromised every aspect of the user experience? This has happened to me countless times, and I always wondered if striking a balance would be difficu…

Standards Over Lock-in: Why We're Building Tuist Differently

As part of building Tuist , we experience firsthand the sheer volume of proprietary decisions and formats that Xcode and its surrounding toolchain have baked in. From build systems that output their own data formats to test runners that ins…

Listen to your pools

At Tuist, we’ve been experiencing sporadic database query drops here and there. It became routine for me to start my day sifting through AppSignal errors related to dropped queries, spending hours trying to debug them. At times, I wondered…

The Two Dimensions of Mobile Development Infrastructure

As part of shaping Tuist , and especially in the context of where Tuist can leverage LLMs to bring value to the ecosystem with features like Tuist QA , we like to think of the problem space as two dimensions: platforms and lifecycle . Tuist…

Testing your iOS apps at a low cost using LLMs

We have just built Agentic QA at Tuist, Tuist QA , and started doing some early testing with users. Since solutions built on LLMs started popping up, the team looked at the technology and the solutions that used it with curiosity and starte…

Namespace gets macOS environment DX right

After years of painful Mac mini management for CI, we discovered Namespace - an API-first service that makes macOS environments elastic and developer-friendly. Perfect for building Tuist QA and beyond.

Selling Developer Tools to Developers is Challenging

Selling developer tools to developers is challenging. We are not that keen to pay for tools. Our programming language is free, as are the web frameworks and libraries we use to build our apps. Why pay for a tool? Having a conversation with…

Finding Balance: Hosted Services vs Self-Hosting

I’ve had back-and-forth moments between using hosted services or hosting them myself. At times I felt zero trust and energy to host my own instances of apps that I’d use, like CloudNext. I’d also lean on local-first solutions that gave me a…

My Terrible Experience with Germany's Health System

A runner's knee injury in Berlin exposed Germany's healthcare failures: misdiagnoses, dismissive doctors, and months of inadequate treatment forced expensive surgeries in Spain to prevent permanent disability.

On Markets and ICPs

Reflecting on Tuist’s evolution from mobile dev tools to open infrastructure. The mobile developer market has constraints, but we’re building beyond productivity—creating self-hostable infrastructure that scales with app success, not just team size.​​​​​​​​​​​​​​​​

You can't build a Grafana

Tuist plans to offer Grafana dashboards for every project, inspired by Fly.io, giving developers full access to their metrics and build data.

The market

When Grammarly buys an email company, it's not about product synergy—it's about entering new markets, acquiring customers, and expanding beyond their name.

The coming disruption of Apple developer tooling

GitHub Actions and commoditized Mac infrastructure providers like Namespace are disrupting the stagnant Apple developer tooling market, enabling innovative alternatives to traditional pipeline-centric CI solutions.

On mental health

A candid reflection on recent mental health struggles

On enthusiasm

In this blog post I reflect on the role of the “creator” that has emerged in the digital economy.

Navigating anxiety

My personal journey through anxiety after experiencing layoffs, entrepreneurship challenges, and a serious injury - and how I'm learning to cope.

~AI~Vibe-first businesses

In this blog post I share my thoughts about this trend of AI-first companies, and what I believe they really mean with it.

Full-time entertainers

I'm tired of social network dynamics, and I'm working towards jumping off the train (again).

Inviting ecosystems

In this blog post I talk about how Apple's non-inviting ecosystem has hindered innovation.

Tuist's plans

This is an stream of thoughts around the future of Tuist.

Mobile CI is plateauing

In this blog post I share how we might be on the verge of a revolution in mobile CI.

Dogfood if you can

If you can dogfood your product, do it. It's a great way to build a better product.

The missing commoditization

I talk about the lack of innovation in the Apple ecosystem and how Tuist is reimagining developer experiences.

Tuist is evolving

In this blog post I talk about how Tuist is evolving and how some mental models are transitioning.

Whom do you trust?

It's hard to trust solutions in the tech industry these days. In this blog post I talk about my disillusionment with the tech industry and how I make decisions about the technologies I use.

From CLI to platform

We are evolving Tuist from a CLI to a platform and in this blog post I share some thoughts on how we are doing it.

Us or them

Focusing on others over self-promotion is a powerful way to build a company.

The paradox of OSS

In this post, we discuss the paradox of open-source software and how you can support its sustainability.

Programming languages are just tools

I'm working on seeing programming languages as tools to solve problems, and not engaging in comparing and commenting on how one programming language is better than the other.

Growth, growth, growth

Growth is a metric many businesses aspire to, but it's not the model that we align with at Tuist. We believe in prioritizing people's joy over growth.

I am out of X

I find it a hostile place for my mental health and society and I don't want to contribute to it.

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.

Small but sexy

The tech industry is obsessed with hyper-growth, but at Tuist, we prioritize quality over quantity. We are committed to building a product that sparks joy, investing in design, and embracing simplicity. Our focus on standards and open-source contributions drives our long-term growth.

Brains are complex

In this blog post I reflect on the complexity of the brain and how I'm trying to be nice with mine.

Makers and takers

In this blog post I reflect on Dries Buytaert's piece about balancing makers and takers in open source, and how it relates to Tuist.

Monkey brain

My brain is juggling too many programming languages and paradigms. It's time to focus on the essentials.

On taking shortcuts to build communities

This post is about building communities around products and how many companies take shortcuts by throwing money at the problem. It's not about money, but about building for the community without expecting anything in return.

The missing narrow waist in CI

It’s time for innovation to happen in the CI space through the narrow waist that Dagger brings to the table.

About mental health

This post is a follow-up on my previous post about mental health. I talk about how I'm trying to establish limits to protect my mental health and how that's needed to build a healthy company.

Open design

Working in the open fosters diverse ideas. At Tuist, we're embracing open design and welcoming Asmit Malakannawar to help shape our vision.

Where do I see myself in 10 years?

This blog post reflects on the importance of living a simple life and the impact of social media on our definition of success.

DX vendor locking

In a world where companies are increasingly locking us into their ecosystems, it's important to invest in tools and standards that allow us to craft software the way we want.

Exploring commercial OSS

This post touches on the models we looked at to draw inspiration to make Tuist financially viable.

What is urgent?

With many things competing for our attention, what is truly urgent?

Falling behind

In this blog post I reflect on this feeling of falling behind that I've been experiencing lately.

When you are open

While many companies see openness as a business risk, I see it as an opportunity to build a different type of company.

The technology does matter

The decision of which technology to use in a project can have a significant impact. In this blog post I talk about the impact that Elixir is having in Tuist.

It's a marathon

With Tuist we are running a marathon, not a sprint. It's time to regain patience and perseverance.

A different company

As we shape Tuist’s future, we are committed to true open source, embracing standards, and simplifying developers’ lives. It’s not just business

BREAKME.md

BREAKME.md is a new convention across Tuist repositories to keep track of breaking changes that we would like to introduce in the future.

Parallelism and programming languages

In this blog post I touch on the subject of parallelism in programming languages and how to achieve it without compromising the ergonomy of the language and the complexity of the programs.

Lazy-learning

Learning for the sake of learning might not be the most effective way to learn. I'm trying a new approach: lazy-learning.

Website redesign

I redesigned my website to make it visually simpler and added new pages.

Emotional breakdowns

In this blog post I talk about a recent emotional breakdown that I had and how I'm processing it.

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.

Meeting developers where they are

In this blog post I reflect on why I believe not more organizations are adopting Bazel and why Tuist is taking a different approach.

The non-technological open source problem

Open-source sustainability is hard, and while it’s necessary to have the tools to reward and pay contributors for their work, the problem requires more of us, developers, speaking out loud about the importance of contributing to the software that we depend on.

When you become infrastructure

A reflection on the importance of maintaining the open-source projects that become the infrastructure for many companies.

Thoughts on Open-Source

In this post, I share my thoughts on open source and how it aligns with my principles. I also talk about the different models that I've seen in the industry and how I'd like to see it evolve.

Elixir scales better

In this blog post, I talk about the scaling challenges we faced with Rails, and why we decided to transition to Elixir.

Gain back attention

In this post, I reflect on how the digital world has hijacked my attention and what I'm doing to gain it back.

It takes a lot of determination

The world needs more people who are determined to make a difference. In this post, I share my thoughts on the importance of determination and how it has helped me in my life.

It's not about what, but how

In this post, I share my thoughts on the challenges of building something new and how it's important to focus on the 'how' rather than the 'what.'

JavaScript DX without JavaScript

In this post, I explore the idea of having a platform-agnostic and technology-agnostic compiler that can be plugged in as an in-code backend for rendering purposes in any other stack (Rails, Phoenix, Express).

Incremental Xcode workflows across environments

Xcode struggles to achieve incremental builds within the same environment. What about across environments? Not even close. Tuist is working on bringing incremental builds and test execution to Xcode projects across environments.

Xcode is too magic

Xcode is a great tool for beginners, but it makes it hard for developers to understand what's going on under the hood and optimize their workflows.

XCBundles

Xcode doesn't have a native container for bundling resources for different platforms and architectures. But nothing stops us from creating our own for Tuist.

Gifting OSS

Navigating the dynamics of Open Source Software (OSS) and sustainability in the tech industry.

I'm allergic to complexities

I like understanding complexities to simplify them. In this post, I share some examples of complexities that I'm intentionally avoiding because they are complex and therefore not fun.

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.

I'm sick

Cieza, my hometown, is a beautiful place, but it's also a toxic environment that makes me sick. In this post, I reflect on my connection with this city and the Spanish culture.

Type safety but at which cost?

Type safety, while important, can be overrated and lead to over-engineering. In this post, I share my thoughts on the topic.

JavaScript-owned state and accessibility

WAI-ARIA attributes are a great layer to persist application state and make the website accessible. However, the convenience of JavaScript APIs to store state makes them store all the state in JavaScript, making the websites less accessible.

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.

Swinging back to positivity

2023 was a year full of micro-traumas that led me to a negative mindset. In this blog post, I talk about how I'm working on swinging back to positivity.

Open-sourcing the lightning_css Elixir package

In this blog post I talk about the motivations that led me to build and open-source lightning_css, an Elixir package to bring a more advanced CSS bundler to Elixir and Phoenix projects.

On mental health

In this blog post I open myself about recent mental breakdowns and how I'm dealing with them.

Peeling layers

This blog post contains a recent reflection over the often over-abstracted web platform, and how powerful it's become, making many of the normalized abstractions feel unnecessary.

Ensuring a smooth workshop experience

In preparation for a workshop that I'm conducting in Swiftable (Buenos Aires), I came up with an idea to ensure a smooth experience following the workshop

Balancing mastery and sustainability

Juggling roles in Tuist, from coding to community support, taught the delicate balance between mastery and sustainability in open-source projects.

Dear Bitrise

Read my personal take on Bitrise's actions against Tuist, and how we're rallying as a community to uphold our values and vision.

From side project to sustainable tool

Tuist, now 6 years old, has become essential for organizations using Xcode. While initially a side project, its popularity surged. To ensure sustainability, we're introducing paid features alongside free ones, navigating challenges like unauthorized forks and finding the right business model.

Recalibrating Mental Models in Elixir Programming

Navigating through Elixir requires a rethinking of traditional OOP mental models, inviting a shift towards domain-centric thinking. Embracing Elixir's functional paradigm offers intriguing challenges and a rewarding, fresh perspective on problem-solving in programming.

We do it for the community

Embarking on a nuanced journey with Tuist, facing ethical dilemmas & aiming for sustainability, I invite you to be part of our personal tech story.

Reclaiming Mental Peace: My Personal Odyssey

Battling daily mental fatigue, I embarked on a personal journey to rediscover clarity. Through exercise, mindful task management, and self-reflection, I'm finding my way back.

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.

Static imports with ESM and startup time

When building a Command-line interface (CLI) with Javascript and ESM to run on NodeJS , one can end up with a CLI that's slow to launch (above hundreds of milliseconds). It's common for developers to use static imports at the top of the sou…

An explicit build graph with Nx for a better DX

When I started doing Javascript more actively, something that got my attention was the absence of a build system that allowed declaring a build graph explicitly. Most of the time, developers combine package.json scripts with shell operators…

Hot-reloading and ESM

While building Gestalt , I realized that many web frameworks don’t move away from CommonJS because their usage of modules in ESM would lead to a slower hot-reloading experience. This is primarily due to how module graphs are loaded with ESM…

Growing as a Staff Developer

A couple of months ago, I reached Shopify 's Senior Staff Developer level. They were exciting news and excellent proof that Shopify continues to be a place for growth. Yet they pushed me out of my comfort zone, throwing me into a new realm…

Typing file-system paths in Typescript

Learn about an NPM package that we published recently, typed-file-system-path, that adds primitives to work with file-system paths more safely using types.

On learning Elixir

As you might have noticed, I’ve been learning Elixir for the past few weeks. Why? You might wonder. I’m a programming languages nerd. I like learning about how different languages solve the same challenges, which gives me new perspectives a…

On finding passion in devising developer experiences

What am I professionally? I don't have a clear answer. I used to say I was an iOS developer with a passion for Swift , but that's no longer true. Shopify turned me into a more generalist developer and, more importantly, helped me see techno…

Modular projects, Typescript, and developer experience

Have you tried to set up a modular Typescript project with multiple NPM packages? It's painful. Typescript tried to solve that with project references , an API to declare the project graph to Typescript for it to build the packages in the c…

On embracing my chaos

Over the past few years, I’ve tried and failed many times at giving my chaotic self some order — something that inevitably made me feel anxious . I tried to organize myself using todo apps. I always used any random piece of paper that I fou…

Mitigating 'delete node_modules'

If you've worked in the Javascript ecosystem, you might already be familiar with the "delete node_modules" solution commonly suggested on StackOverflow and GitHub Issues. People make fun of it, but it's a frustrating scenario that…

But they are developers too

I often hear a statement when justifying decisions in building developer tools: but they are developers too. It bugs me a ton because it throws all the developers into the same bag and assumes that they know what you know. If we want to bui…

CLIs are products too

Over the years of working on command-line interface tools I observed that they are not often perceived as products. Consequently, organizations don't embrace the same principles as UI-oriented products, which leads to complex tools designed…

Javascript, ESM, and tools

I'm using Javascript, Typescript, and Node a lot these days as part of my work at Shopify and Gestalt and I'm really loving it. In particular, its module system because it allows extensibility in ways it'd be more challenging with compiled…

Users don't care about your web app's portable binary

We, software crafters, naturally tend to distance ourselves from users led by excitement for technological cycles and innovation. Our industry is full of examples. For instance, the crypto trend is an excellent example of that. No one can o…

OSS and extrinsic motivators

More and more, we see open-source projects being backed by investment rounds . It's positive for the projects because they can innovate faster and sustain themselves by paying people to work on it full-time, making money one of the main dri…

Platform-dependent CLIs

I'm a firm believer that shaping products as developer platforms is an amazing idea to let developers from all over the world make your product diverse . Otherwise, you have products like Facebook and Apple 's that work great in California…

On evolving opinions

I recently came across a tweet that suggested me to undo my blog post on Web3 after sharing some bad things I'd uncovered in the technology. I couldn't understand why an undo and not a follow-up . I see opinions as alive entities that evolv…

Migrated to SvelteKit

I migrated this blog to SvelteKit . I did it to consolidate everything I had learned about the framework, and be able to SSR static pages with dynamic content. For example, I'll be able to collect data from external sources like GitHub and…

Adapting to a platform

In a simplistic way, we can see web frameworks as convenient functions that take your app as input and return deployable artifacts. GatsbyJS generates static HTML, CSS, and Javascript that platforms like Netlify know how to deploy. Rails ge…

I want to be rich

It's been a while since I started reading more about personal finances and investments. My primary motivation was to escape the tempting treadmill of scaling up costs as the income increases. It's never late to learn about it, but the earli…

The React chain

I’ve been thinking a lot lately about the role React plays when building a web app. Companies like GitHub and Shopify , both very successful software companies, introduced React recently in areas where it makes sense . This led me to the qu…

On cutting off some dopamine dependency

Over time, my relationship with the Internet has turned me into a dopamine-dependent. I’ve reached a point when my body often has a physical presence in the offline world throughout the day, but my brain wanders in the online space. Should…

Great solutions for the wrong problems

As you might know, I’m a curious person. That leads me to reading about challenges tech companies run into and the solutions that they come up with, and connecting them with similar problems with the aim of forming mental models. Why React…

Developer platforms and diversity

If we think about how tech companies build products these days, we'll realize many present a single model that they push onto the world . Companies like Facebook and Twitter model for how social interactions happen on the Internet. Others l…

Spain, it's not time to be reunited (yet)

As some of you might know, we’ve been in Barcelona looking for a flat to relocate from Berlin for the past few weeks. A few things happened during the COVID19 pandemic that prompted us to think about whether we wanted to stay in Berlin long…

A future note to self about Omniauth

Every time I try to set up Omniauth on a Rails codebase I run into the same issue: Not found. Authentication passthru And every time I have to spend a fair amount of time understanding what's causing the error. Luckiy it won't have anymore…

./dev

One of the things that I appreciate as a developer is having a consistent experience across projects . As you probably know, this is often not the case when running a project locally. Some ask you to run yarn run ios . Others prefer an exec…

Seabolt support for M1

As part of building Chimera , an AppleOS tool for capturing networked knowledge, thoughts, and ideas, I encountered an issue trying to set up Neo4j on an M1 laptop (i.e. arm64 architecture) . It turns out that Seabolt , the connector that n…

Some Rust thoughts

A while ago, I started reading about the Rust programming language out of curiosity. Many things fascinated me about the language. It has a powerful dependency manager similar to the Swift Package Manager but more thoroughly designed. Unlik…

Planning open-source work

One of the things that I find the hardest when building open-source software is planning the work . On one side, there are all these new features and improvements that you'd like to build. On the other side, there are PRs to review, tickets…

Contributors' first experience

When building open-source software, getting external contributions is usually one of the most difficult things. Most of the times developers are busy working on their projects, and they are hesitant to devote time to another project. That's…

What I learned as a manager

As you might know, Shopify allowed me to try the people management track and become an engineering manager. I've been doing that for the past two years. Along the process I learned a lot and made so many mistakes and I don't regret having g…

Propose, prototype, and build

One of the things I like about Shopify is an internal tool called Vault . It's the backbone of the organization. You can find people, navigate the report structure, find answers for your questions, follow projects and share updates with the…

Back to Jekyll

I recently changed my stand in regards to the technologies that I use when building software. In particular, I decided to minimize the amount of Javascript that I use in my projects. In my experience, Javascript is usually synonym of indire…

Swinging the pendulum back to engineering

Over the past two years, I've been engineering manager at Shopify . I managed the Mobile Tooling and React Native Foundations teams over here. I'm grateful that Shopify allowed me to experience what being a manager is like. I learned that p…

Focused Xcode projects

A while ago, and inspired by Facebook's internal tooling, we added a new command to Tuist, tuist focus . As it names says, it's intended to be used when you want to work on a given target. If you have a project of, let's say 300 targets, yo…

On not having focus

One of the things that I struggle a lot with these days is focus . Because of that, I realized I cannot longer do deep and focused work. I spend my days context-switching all the time, and although I've got used to it, I don't like it. Ther…

Tuist 2.0 and next

As we are approaching the release of Tuist 2.0, I started thinking what's next for the project. The focus until 1.0 was around project generation. We provided developers with a graph-based project generation that abstracts away Xcode's intr…

Building mental models

As you probably know, I started building Buildify , an open-source and AGPL-3-based tool for deployments. Like I did with Tuist , I'm in the process of building mental models around the business domain. It's one of the hardest steps, and th…

ViteJS and Rails

I recently had to set up a React frontend for a Rails app, and I decided to use ViteJS instead of Webpack . What's interesting about ViteJS is that in development, it uses ES modules instead of smashing all your Javascript into a single fil…

Learning Rust

I became weirdly excited for Rust lately. It's a programming language that I've been planning to learn for some time and I finally set out to learn it. It's just the beginning of my learning process but I have to say I like the openness of…

Migrating documentation to Docusaurus

Writing a project's documentation is not as exciting as coding, but over the years I got to understand the key role of documentation in the developer experience. Shopify for instance has a team dedicated to maintain our internal documentati…

TailwindCSS or Theme-UI

I’ve been using TailwindCSS a lot lately. I like the fact that styles are contained within the HTML elements through classes. You can copy and paste an element styled with Tailwind and you can be certain it’ll look the same. Unlike other st…

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…

Open source, people, and happiness

When looked from the consumer standpoint, open source often reads as software publicly available that I can check out, use, and improve. However, there’s more than that. In a world where everyone seems to be obsessed with building the next…

Data-driven open source

Yesterday, we announced that Tuist has now stats that allows us to understand how users use the tool and therefore, invest our time working on Tuist more wisely. As expected, there were some negative reactions to this: Oh! I’m glad that I c…

Building Tuist as a platform

Having seen Shopify acting as an e-commerce platform that developers can extend made me think whether the same idea would be applicable to Tuist. What if instead of us trying to codify all different workflows and configurations, we gave dev…

Tuist and JS bundlers

I think there are a lot of similarities between Tuist and JS bundlers. First, they both are functions that take input and return an output. In the case of a JS bundler, it takes Javascript or any variation of it, and converts it into Javasc…

Owning your workflows

The more I work with Javascript and Ruby, the more I realize how empowering it is to design your workflows. Having worked with Xcode and Swift for many years, I was used to Apple dictating your working style. You need to debug an issue? Thi…

Focusing on the problems

One of the things that I noticed when building tools for developers, either through Tuist or my work at Shopify, is that we developers tend to get incredibly excited about what our new idea would enable, and put the need or problem aside. I…

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…

Decision records

One of the things I've been terrible at is at keeping decisions records in projects . It happens often working on Tuist that I come across something that I need to know why it was done in a particular way and I can't remember. It also happe…

Scaling up an open-source project

One thing that I've been struggling a lot with lately is the amount of distractions that come with the growth of an open-source project. In the case of Tuist , those distractions have come in the shape of notifications on GitHub, mentions o…

Reflecting on 3 years at Shopify

A few days ago, it was my 3rd anniversary at Shopify, and I've got the idea of sharing in a short blog post what are the things that I like from Shopify and that allowed me to grow: Great mission: The company has a clear and realistic missi…

The beauty of a standard command line interface

There's something beautiful in entering a directory that contains a project and knowing how to interact with it. It's like being part of a communication where the terminal is the channel and you both know the language. You know that build w…

My first RFC in the React Native project

Today I created an RFC for the first time in the repository. I've pondering a bunch of ideas for a long time regarding how the experience building React Native apps could be improved and I finally gave them a structure and formalized them.

My tech stack in 2020

I'm a bit reflective today; I guess because we are approaching the end of this so-odd year. Therefore, I'd like to share what has been my preferred tech stack in 2020 and what most likely continue to be in 2021. React for building web front…

Sparking joy working with Xcode

I learned by working with Ruby and Ruby on Rails during my time at Shopify that using tools and programming languages that spark joy is crucial for developers' motivation. Even though we developers love to understand complexities, we enjoy…

Tree-shaking Xcode projects

Tree-shaking is a concept inspired by Javascript and used by Tuist to generate lean Xcode projects that are processed and compile faster.

Module caching in Xcode projects

Bazel and Buck is the solution large companies have adopted to make Xcode build fast. However, it's complex and not accessible to medium and small companies. In this blog post, I share the approach Tuist is taking and how it's inspired by tools the community is already using.

Growing Tuist's community

In this blog post, I share my experience building the Tuist community. I talked about the things that have worked well, and the areas where there's still some room for improvement.

The exciting adventure of building a web app

I’ve been playing lately with building a web app that complements Tuist with some features that require storing state in a server. Since I have a mobile development background, being familiar with Swift, iOS, and very recently React Native,…

Generating Typescript code from a GraphQL schema

Today, I learned about a tool called GraphQL Code Generator turns a GraphQL schema into typed models and utilities for interacting with a GraphQL API. In my case, I'm using it in a React application where I'm using Apollo as the client. Usi…

What I like from Ruby and Rails

The more I use Ruby and Rails, the more I like it. I’ve played with Typescript lately, and it continues to feel heavy: parenthesis and brackets everywhere, layers on indirection through tools to accommodate the Javascript to the browser or…

Modularization in open source projects

I recently came across a blog post from Shopify where they share how they are componentize the main Rails application into smaller pieces with clearly defined boundaries and loose coupling between them. This made me think about the uFeature…

Finding focus

One of the things that I struggle a lot with these days is having focus. Despite my several attempts to mitigate distractions, they always find their way to make it into my attention span. The result of that is that I feel stressed, and whe…

Pairing sessions to introduce people to Tuist and open-source

I recently started having pairing sessions with developers interested in contributing to open-source; it’s something that usually intimidates people, but that becomes easier if someone guides you through the first contribution. You have a p…

Thinking in terms of problems

One of the things that I find the most challenging these days when building tools for developers is thinking in terms of problems . Very often Tuist's users ask for features that they have seen in Xcode and that they'd like to see in Tuist…

The beauty of not expecting something in return

Yesterday I had a thought-provoking chat with an acquaintance. He thinks that when we connect with someone is because they are a means to achieve goals - for example a business partnership. He was, in fact, trying to do that with me, and I…

A shift towards product development

Working on building tools for developers has helped me realize that what I like even more than coding is going through the product thinking process. That's why I'm so engaged building Tuist , and recently Galaxy . I used to be excited by pl…

Streamlining app development

One thing that I noticed after Shopify 's commitment to React Native is that it foster a culture of turning ideas into mobile apps. Doing app development is no longer a thing that only mobile developers do. In hindshight, it was a good comp…

Transitive React Native dependencies

Today I learned about how dependencies are organized by NPM and Yarn. Let's say we have the following scenario of dependencies: A -> B -> C (3.2.1) - A -> C (1.2.3) Javascript dependency managers will structure the dependencies fol…

WWDC's FOMO

I'm avoiding opening Twitter these days. It makes me a bit anxious receiving WWDC news through people racing to be the first one to publish the clickbait-type of tweet. I used to have energy to be part of that race and not suffering from FO…

First thoughts on Sorbet

We started using Sorbet to add types to Galaxy's codebase . Types are great to catch type-related issues statically, and prevent them from blowing up on production. This tiny blog-post contains my impressions using it for the first time: So…

Working on new features or tackling technical debt

One of the things that I find the hardest when working on Tuist these days is finding a good balance between adding new features and tackling technical debt. The most exciting part is always building new things. Indeed, yesterday I came acr…

Add and remove footer using NSBox

If you use macOS, you have probably realized many apps have the following UI component on their settings: I had to add one of those to the settings view of Angle , and then I realized that it's not a pre-defined component that you can drag…

My first coding video on Youtube

I never thought I'd end up doing this, but today I just recorded an uploaded a video to Youtube that is meant to be the first of a series about Tuist . I recorded myself with Photo Booth, the screen and the voice using Quicktime, and edited…

To build, or not to build

These days I'm a rollercoaster of emotions ― I guess as a result of COVID19 and spending so much time at home. In particular, these days I'm thinking a lot about Tuist and my devotion for it. I really like building it, working on building s…

Graphed knowledge

Most of the note-taking apps that we can find out there are designed around the same organization principle: notes are linearly organized and grouped into higher-lever abstractions that are folders. Unfortunately, our knowledge is not linea…

Cognitive overhead

Bootstrapping and publishing an app to the App Store is not a straightforward process. I tried to do it myself yesterday and a lazy me got stuck when I had to create signing artifacts, write automation scripts, and set up things on the App…

Catching crashes at launch time on Android React Native apps

One thing that I noticed about React Native is that with the setup that most teams have on CI launch-time crashes can go unnoticed . Those crashes often happen when the contract between React Native and native is not met. That scenario is n…

Control and innovation

I saw a tweet this morning where the author was hoping for Apple to announce a new product in the domain of CI. Apple acquired BuddyBuild two years ago and since then, they seem to have working on something secret that they'll release at so…

Anxiety-free working

I feel it really hard to work these days without feeling anxious. A Slack ping here, an interesting tweet there, some emails to answer, articles to read that are piling up... With that set up, not only I can't concentrate, but I deliver poo…

Keeping it simple

If there's something that characterizes my approach to problem solving these days is simplicity. Working on acquiring a product mind-set in the last 2 years has helped me realize how obsessed we, developers, are with configurability. Why is…

Diving into Nix

At Shopify , the dev-infra team has been working on using Nix from one of our internal tools, dev . The tool is responsible for setting up the developers' environment, as well as providing a standard CLI for automation for projects like Rai…

We need more crafters

I think the technology industry needs more crafters. People that have a genuine and lasting love for what they do . Our industry is filling with people that are constantly trying to catch the latest trend, or create the newest product/proje…

A better signing experience in Xcode

A few days ago, Marek decided to take on a proposal that I made for Tuist a while ago, management of certificates and provisioning profiles . As it happened with the definition of dependencies, dealing with certificates and provisioning pro…

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…

Seeking inmutability

I recently opened up this PR on Tuist that turns models that represent the projects into structs. For some reason, which I don't remember, I had the not-so-brilliant idea of defining them as classes. While that has been working fine, they d…

Social anxiety

I keep falling into the same trap over and over: believing that I should be active in social media to be connected to others and have a prosper professional future. My relationship with them is a rollercoaster. There are times when I neglec…

Wrapping up 2019

Following every year's tradition, I'm writing a wrap-up post for this year, 2019. 2019 has been the year when María José and I got married . I proposed to her in January and celebrated the wedding in September. I have no words to describe h…

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…

Working on a new website for Tuist

An update on what I'm up to these days with Tuist. In particular, I talk about the new website that I'm designing and implementing for the project.

Creating experiences

Picked up my phone and dumped some thoughts on why I'm so engaged and excited to build Tuist.

I am X

This is a short reflection around something that it's common in our industry, professionals labelling themselves and limiting their area of influence.

Static site generators

In this blog post I talk about what traits I expect a static site generator to have, and why I believe Gatsby is a more suitable option than other alternatives in the industry.

Better relative paths

We are providing a new API from Tuist to define relative paths and this blog post describes the motivation behind it and the solution that we are adopting.

Project description helpers

In this blog post I talk about a beautiful abstraction which Alex and I came up with to push Tuist's awesomeness even further.

Abstractions

In this blog post I talk about abstractions in the Xcode projects domain and how Tuist leverages the concept to conceptually compress intricacies of Xcode projects that developers are often confronted with.

Keeping up with dependencies updates

A brief reflection on Dependabot, a tool that was recently acquired by GitHub and that helps automate the process of updating dependencies on your GitHub repositories.

What's coming to Tuist

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

A period of changes

Dumping some thoughts on what the last month have been for me in my personal and professional life.

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.

Derived Info.plist files

In this mini-post I talk about some recent work that I've done in Tuist to support defining Info.plist files in the manifest file.

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.

The urge to be the first

Just an observation of a trend that I've seen in our industry: developers rushing to be the gain the label of expert in a given technology.

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.

Open source and trust

Trust is key for open source projects to thrive. In this blog post I explain what trust has meant for Tuist.

Software and people

A reflection on what's one of the most important things to me when building software, the people that make it possible.

All you need is tools

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

What a psychologist helped me realize

It's been a few months going through a therapy that has helped me understand how my brain works and where the stress that I used to experience came from.

GitHub workspaces using email

With this simple tweak I managed to have a notifications-free GitHub dashboard with workspaces right on my email.

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.

On having focus

I'm struggling to have focus nowadays. In this post I describe why it's so hard for me to focus, and the things that I'm doing to overcome the problem.

Hallo Ruby, wie geht's?

It's been a long time since the last time I coded something on Ruby. In this blog post I talk about why I started using it again, and how it feels after spending a few years working with a compiled language like Swift.

I gave up using Medium

I gave up using Medium and here are the reasons that led me to make the decission.

The hermeticism and rigidity of Xcode and its projects

Xcode and its projects are not as flexible as they could be, which makes it hard for companies to optimize their workflows and processes. In this post I'll analyze some of the things that I would improve from its build system and projects.

Random thoughts a Friday night in Ottawa

I sat down after work and thought about some things that have been in my mind for some time. I wrote them in this blog post that if I have to summarize it, it talks about minimalism, open source, egno, and career paths.

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.

Moving back to Berlin

A brief retrospective on what my life has been in the last few months and my thougts on my move to Berlin.

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.

Wrapping up 2016

The year is almost over. In this post I summarize everything that happened this year and my new year resolutions.

Developing tools for developers

Learnings from being a core developer and providing other teams with the tools that they need for their daily work.

Stepping off the social world

I became addicted to social networks. What's addicted for me? Opening apps like Facebook , Twitter and Instagram from time to time and scrolling on their home page up and down for minutes. I was at that point when unconsciously ended up ope…

Be Reactive my friend

Article that explains the benefits of reactive programming in the iOS world.

Boy Scouts rule with Danger

Post where I explain how Danger helped us at SoundCloud to apply the programming Boy Scouts rule to our workflow

Marcheta en la vida

Mi experiencia de haber salido a vivir fuera de España y las lecciones aprendidas

Xcode scripts to rule them all

Set of normalized scripts very useful for Xcode projects. Individual contributors will be familiar with them after they clone the project.

States - The source of truth

Overview of states in iOS apps, how we tipically handle them, current challenges with states and how to overcome them

Rewriting SugarRecord, 2.0

I explain in this post how was the process of rewriting SugarRecord, a CoreData/Realm wrapper for Swift.

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…

Why Open Source helps you to become a better developer

Most of developers haven't tried creating an Open Source component before. Since I apply it to every of my projects I feel the results and development process has improved a lot. In this article I will describe why it's so important

My first Apple Watch impressions

After a day using Apple Watch I would like to share my impressions with the new Apple toy and why I wouldn’t buy the first version

Modularize your mobile projects

Learn how to split your app components in different bundles instead of dealing with an unique bundle that packages the whole app

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

Codemotion experience

After two days of Codemotion I would like to share my experience in my first time in a developers event like that one

Github as your project management tool

Github is a powerful Git platform commonly used between the developers community. It offers features like issues, labels, milestones, releases, that used properly might help you to manage not only your technical repos but different aspects around your project like design, ideas, ...

Leaving Redbooth

I took de decision to leave Redbooth and join to a new adventure. I explain here the reasons, everything I learned from there and my expectations for 8fit

Setup your iOS Projects for testing

Learn how to setup your iOS for testing using the most popular testing libraries and how to integrate your project tests in the development flow.