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…
Recent writing
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…
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…
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…
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…
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…
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…
Guillermo from Vercel recently shared on X that Vercel stopped hiring in Spain, describing the process as challenging. The post sparked considerable discussion, with many offering support and speculation about potential causes like tax comp…
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…
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…
We developers have a unique ability to create things with code, which has been recently accelerated with the proliferation of all sorts of agents. This is great, building solutions with software has never been so accessible, but this abilit…
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…
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…
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…
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…
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…
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…
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…
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. 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…
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…
Hola, I'm Pedro Piñera
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.
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.
Tuist plans to offer Grafana dashboards for every project, inspired by Fly.io, giving developers full access to their metrics and build data.
We chose authentic community growth over acquisition offers, prioritizing our garden’s original spirit and sustainable development over rapid expansion through external partnerships.
AI coding tools lock you out of your code. We’re building Tuist Ignite: local-first development where you chat to build but own everything.
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.
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.
Some thoughts on how Tuist could enable agentic building of apps
A step-by-step guide to configuring PeerTube with Cloudflare R2 for reliable video storage and streaming, including migration tips and troubleshooting.
This is my stream of thought on why mobile CI will have to redefine itself.
A candid reflection on recent mental health struggles
In this blog post I reflect on the role of the “creator” that has emerged in the digital economy.
My personal journey through anxiety after experiencing layoffs, entrepreneurship challenges, and a serious injury - and how I'm learning to cope.
The Swift compiler optimizations are becoming so costly that Apple needs to rethink its approach to the build system.
If we want more innovation in the mobile developer tooling space, we need to commoditize macOS containers.
In this blog post I share my thoughts about this trend of AI-first companies, and what I believe they really mean with it.
I'm tired of social network dynamics, and I'm working towards jumping off the train (again).
In this blog post I talk about how Apple's non-inviting ecosystem has hindered innovation.
This is an stream of thoughts around the future of Tuist.
Software commoditizes fast. Without an economic moat, open source and giants like Amazon can erode value. Build a community-driven ecosystem to endure.
In this blog post I share how we might be on the verge of a revolution in mobile CI.
In this blog post I share why today nightly builds are the wrong solution to the problem, and the alternative that we are proposing.
Learn how to use Docker from your Forgejo Actions pipeline.
If you can dogfood your product, do it. It's a great way to build a better product.
The appearance of Lynx is an invitation for UI frameworks to support mobile development.
How AI can help you maintain your open source project.
You'd better own your community.
China has learned to localize their products and services to fit the needs of their target audience.
In this blog post I unfold the journey of Tuist from an open source tool to an open core business.
What are we waiting to help Swift app development teams be productive?
Learn how to easily build and test your Swift packages in the host OS, macOS, and Linux.
It's time to rethink the CI market.
My experience with healthcare in Germany.
I talk about the lack of innovation in the Apple ecosystem and how Tuist is reimagining developer experiences.
I talk about where we think the value of Tuist lies, and how that's evolving towards a sustainable business model.
In this blog post I talk about how Tuist is evolving and how some mental models are transitioning.
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.
I just realized Mise has the ingredients to make reproducing issues a breeze, and this is how you can leverage it.
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.
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.
Some thoughts on how to treat logging and UI in a Swift CLI.
Focusing on others over self-promotion is a powerful way to build a company.
In this post, we discuss the paradox of open-source software and how you can support its sustainability.
Open source business models are the future of software development.
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 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.
Learn how to configure a Hetzner server as a Forgejo runner to run CI/CD jobs for your projects hosted on Codeberg.
How I choose the technology I use
How I choose the technology I use
I find it a hostile place for my mental health and society and I don't want to contribute to it.
A guide to setting up a self-managed Woodpecker CI on a Hetzner server for continuous deployment of a website hosted on Codeberg.
Swift’s async/await concurrency is a game-changer, but to fully leverage it, foundational APIs need to be designed with concurrency in mind.
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.
Trying to process concurrent tasks in a non-concurrent brain can be exhausting. Here's how I manage it.
In this blog post I reflect on the complexity of the brain and how I'm trying to be nice with mine.
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.
My brain is juggling too many programming languages and paradigms. It's time to focus on the essentials.
I reflect on the recent WordPress and WP Engine controversy and how it relates to the open-source world.
I reflect on the complexity of Swift's concurrency model and how it could have been avoided.
“I’d never thought that I could use my iPad beyond reading with it.
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.
It’s time for innovation to happen in the CI space through the narrow waist that Dagger brings to the table.
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.
I admire Pieter Levels for focusing on what matters. My motivation is intrinsic, and while money is important, it’s not my sole goal.
Working in the open fosters diverse ideas. At Tuist, we're embracing open design and welcoming Asmit Malakannawar to help shape our vision.
In this post, I explore the idea of a fully open Tuist platform.
This blog post reflects on the importance of living a simple life and the impact of social media on our definition of success.
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.
Automate the continuous release of releasable changes with git-cliff and CI.
This post touches on the models we looked at to draw inspiration to make Tuist financially viable.
With many things competing for our attention, what is truly urgent?
A healthy relationship with technology is possible if we embrace openness.
Learn about the new PBXObject types introduced in Xcode 16 to support synchronized groups.
Fix the not found keychain item issue by making the keychain the system default
In this blog post I share how stories help people connect with the products they use.
Is JavaScript necessary to enable atomic and reusable components on the web?
In this blog post I reflect on this feeling of falling behind that I've been experiencing lately.
While many companies see openness as a business risk, I see it as an opportunity to build a different type of company.
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.
With Tuist we are running a marathon, not a sprint. It's time to regain patience and perseverance.
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 is a new convention across Tuist repositories to keep track of breaking changes that we would like to introduce in the future.
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.
Learning for the sake of learning might not be the most effective way to learn. I'm trying a new approach: lazy-learning.
I redesigned my website to make it visually simpler and added new pages.
In this blog post I talk about a recent emotional breakdown that I had and how I'm processing it.
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.
In this blog post I share the principles that we embrace at Tuist to build a future-proof productivity platform for app developers.
In this blog post I reflect on why I believe not more organizations are adopting Bazel and why Tuist is taking a different approach.
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.
A reflection on the importance of maintaining the open-source projects that become the infrastructure for many companies.
In this blog post I share how we used Cloudflare Workers to connect AppSignal with Incident.io.
Proprietary solutions are a dime a dozen, but standards will outlast them all.
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.
Ruby proved not to be the most suitable runtime for apps that are IO-heavy. We evaluated Swift, but ultimately decided on Elixir for various reasons.
In this blog post, I talk about the scaling challenges we faced with Rails, and why we decided to transition to Elixir.
In this post, I reflect on how the digital world has hijacked my attention and what I'm doing to gain it back.
Schemes in Xcode have an option to run tests in parallel, but if your code isn't designed for it, you are in for a world of pain.
In this post, I share my thoughts on protecting my creative energy and how I'm doing it.
In this post, I share my thoughts on global state and how it's future debt.
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.
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.'
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).
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 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.
Apple might have found a legal loophole to charge users for hardware issues caused by software updates.
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.
Navigating the dynamics of Open Source Software (OSS) and sustainability in the tech industry.
In this post, I talk about how global state in CLIs can make your test suite flaky and how to solve it to scale your test suite.
Non-deterministic tool versions across environments is a common source of headaches in development teams. In this post, I share how Mise can help you solve it.
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.
2023 was a year of many challenges in my life. Next week I'm going to start mental therapy with a psychologist.
In this post, I talk about how I'm feeling about my contributions to the open-source community.
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, while important, can be overrated and lead to over-engineering. In this post, I share my thoughts on the topic.
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.
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.
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.
We engineers are vulnerable to getting attached to solutions instead of problems. In this post, I share my experience with this and how I'm trying to change it.
In this post, I share what I expect from a knowledge management app.
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.
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.
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.
In this blog post I open myself about recent mental breakdowns and how I'm dealing with them.
I shared a bit of a reflection on what are the issues with current Apple's tooling touching on some of the points that I presented in my Swiftable 2023 talk.
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.
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
Juggling roles in Tuist, from coding to community support, taught the delicate balance between mastery and sustainability in open-source projects.
Read my personal take on Bitrise's actions against Tuist, and how we're rallying as a community to uphold our values and vision.
Exploring native Swift macro support in Tuist to simplify and accelerate Xcode project builds.
We're removing Ruby from Tuist, integrating everything into Xcode, replacing Fourier with bash scripts, and rewriting tests in Swift for ease.
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.
Tuist provides solutions to challenges in large-scale app development overlooked by Apple. It's a foundation for developers, promising simplicity and a future filled with actionable insights.
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.
Embarking on a nuanced journey with Tuist, facing ethical dilemmas & aiming for sustainability, I invite you to be part of our personal tech story.
Apple's focus on simplifying basic tasks may overshadow the challenges of complex operations. Developers, often uninformed due to lack of data, face hard choices: pivot to alternatives or revamp systems.
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.
Exploring Elixir's Mox for mocking reveals boilerplate code issues. A new package, modulex, aims to streamline this process.
In a world where money often takes the front seat, how do we balance the joy of craftsmanship with the need for financial stability? Here's a personal reflection on the intersection of passion, craft, and monetary pursuits.
From its inception in 2018, Tuist has grown through passion and dedication, now embarking on new horizons.
Tackled 'request/2 undefined' error in Ueberauth setup for Digestfully, sharing solution here.
Exploring Elixir, I discovered the power of concurrency-oriented programming
Buckle up for a hilarious adventure in Ruby installation! Unravel the mysteries of rtx, Homebrew, and secret environment variables.
Embarking on a tech-venture adventure; creating value, chasing joy, and conquering challenges.
Tailwind: A game-changer for web styling, with seamless integration into Swift server projects using SwiftyTailwind.
Fly CLI + Docker on M1/M2 architecture caused issues, so I switched to GitHub Actions for deployment. No more problem!
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.
Learn how to easily configure VSCode to use your preferred alternative shell installation like ZSH or Fish instead of the default profiles.
Implementing Sign in with Apple on a macOS app using JWT and Phoenix. Learn how to generate a client secret for web authentication.
I share the investigation into Visual Studio Code not loading Typescript and the solution I found - enabling the @builtin typescript extension.
Some notes on what changes I'm introducing to my learning system.
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…
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…
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…
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…
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.
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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.
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…
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 is a concept inspired by Javascript and used by Tuist to generate lean Xcode projects that are processed and compile faster.
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.
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.
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,…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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 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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
In this blog post I talk about a recent decision that we made to start using reactive programming to model asynchronous tasks in 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.
Picked up my phone and dumped some thoughts on why I'm so engaged and excited to build Tuist.
This is a short reflection around something that it's common in our industry, professionals labelling themselves and limiting their area of influence.
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.
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.
In this blog post I talk about a beautiful abstraction which Alex and I came up with to push Tuist's awesomeness even further.
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.
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.
A Monday blog post with some reflections about the current state of Tuist and its future.
Dumping some thoughts on what the last month have been for me in my personal and professional life.
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.
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.
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.
In this blog post, I talk about my experience using one of Foundation's APIs, Process.
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.
A random reflection about Tuist and why I'm so glad working on it.
This is a short story of how Xcode projects can end up being very complex and hard to maintain.
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.
A brief post talking about my experience speaking at AltConf 2019 in San Jose.
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.
On this blog post I talk about Xcode updates and how painful they can sometimes be.
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.
I've been avoiding macOS development for no reason. This blog post is a short reflection on why I think I've been doing it.
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.
Trust is key for open source projects to thrive. In this blog post I explain what trust has meant for Tuist.
In this post, I explain how we are able introduce changes and release new versions of Tuist with the confidence of not introducing bugs or breaking things.
A reflection on what's one of the most important things to me when building software, the people that make it possible.
Short reflection on how beneficial it can be turning negativism into something positive.
Some comments on what's the state of art of macOS handling deeplinks.
Tuist is my most beloved open source project. In this blog post I touch on the motivations that led me to build it.
A retrospective on what 2018 has been
In this post I talk about why investing in good tooling is crucial for projects to move steadily.
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.
With this simple tweak I managed to have a notifications-free GitHub dashboard with workspaces right on my email.
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.
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.
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.
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 and here are the reasons that led me to make the decission.
I gave up using Medium and here are the reasons that led me to make the decission.
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.
Because sometimes Xcode cannot install your apps, and you have to figure out why.
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.
A retrospective on what 2017 has been
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.
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.
This post presents some elementary concepts of how Xcode projects are structured, and introduces an structural approach to build modular Xcode apps.
This post introduces an approach to share testing data and mocks from your frameworks to other frameworks that might need them for testing purposes.
A command line tool written in Swift for copying the frameworks from your project to the output frameworks directory.
Because readability might compromise productivity.
Read, update and write your Xcode projects from Swift
A brief retrospective on what my life has been in the last few months and my thougts on my move to Berlin.
Build UIs based on reusable components that you can compose in more complex hierarchies.
How modularizing your apps is helping us to scale our Xcode app.
The year is almost over. In this post I summarize everything that happened this year and my new year resolutions.
Learn how handy protocol extensions can be, when used in a frameworks architecture.
Learnings from being a core developer and providing other teams with the tools that they need for their daily work.
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…
Article that explains the benefits of reactive programming in the iOS world.
Organize your app in small features that you
Introduction post for the last library that I've been working on, Szimpla.
One of posts that tells about the migration from a monolithic architecture based in single target to have multiple reusable Frameworks.
In a world where social networks are moving relationships to the Internet people is becoming more disconnected.
Post where I explain how Danger helped us at SoundCloud to apply the programming Boy Scouts rule to our workflow
Post that explains how to automate review tasks with the help of the tool Danger
Mi experiencia de haber salido a vivir fuera de España y las lecciones aprendidas
Set of normalized scripts very useful for Xcode projects. Individual contributors will be familiar with them after they clone the project.
Overview of states in iOS apps, how we tipically handle them, current challenges with states and how to overcome them
Very simple script to keep your Carthage version updated without depending on Brew.
I explain in this post how was the process of rewriting SugarRecord, a CoreData/Realm wrapper for Swift.
Quick introduction to what Functional Programming in Swift is from the simple perspective of functions
These are the steps I followed to create a Mutable Collection Property for ReactiveCocoa. Very useful if you want to get events about changes produced in a collection
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…
Reactive is magic, transform your API responses into streams of data and you'll se how easy is to build for example paginated API requests
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
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
Custom solution to have full control over your hybrid apps bundling the content locally and controlling updates
Learn how to split your app components in different bundles instead of dealing with an unique bundle that packages the whole app
Learn how useful might be giving some steps on mobile (Android/iOS) launching mobile solutions with web knowledge and with the same mobile native experience as any other app
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
After two days of Codemotion I would like to share my experience in my first time in a developers event like that one
Talk I gave in the Redbooth HQ office for NSBarcelona with the iOS team talking about the VIPER architecture
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, ...
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
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.