This isn't a release announcement. Ghostty 1.0 is out. You can download it and read about it on the Ghostty website. This is a personal reflection on the project.
After nearly two years of development and private beta testing1, I’m excited to share that Ghostty 1.0 will be publicly released in December 2024 as an open-source project under the MIT license.
My wife and I have pledged $300,0001 to the Zig Software Foundation (ZSF).
Zig supports tagged unions1 and the Zig compiler will error if you switch on a tagged union without handling all possible cases. This is a great feature because it helps you avoid bugs when new cases are added to the union. Many languages support similar functionality.
Zig has a very powerful feature called comptime. Comptime lets you run Zig code at compile time. This isn't a special macro language or AST manipulation; it is just standard Zig code that runs at compile time. The only real limitation is that comptime code can't have side effects (no syscalls, no IO, etc.).
I'm excited to share that I've joined Polar as an advisor. The opening text of the Polar website at the time of writing is "Get paid coding on your passion." This is a deeply personal mission to me. I want to share some of my personal history and how it led to becoming an advisor for Polar.
Copy and paste "🧑🌾" in your terminal emulator. How many cells forward did your cursor move? Depending on your terminal emulator, it may have moved 2, 4, 5, or 6 cells1. Yikes. This blog post describes why this happens and how terminal emulator and program authors can achieve consistent spacing for all characters.
I've had the experience of using GitHub as a maintainer for very large open source projects (1000+ contributors), as an engineer for very large closed source corporate projects, and everything smaller. Through those experiences up to today, GitHub pull requests is where I spend almost all of my time while on GitHub, and to me its also unfortunately the most frustrating part of GitHub.
Hello! Welcome to the fourth official devlog for Ghostty 👻!
This is the text format of a talk I did for Zig Showtime. If you'd rather watch the video, you can find it on YouTube: Zig Showtime: Ghostty. The video also includes a Q&A session at the end which I did not include in this post.
Hello! Welcome to the third official devlog for Ghostty 👻!
Hello! Welcome to the second official devlog for Ghostty 👻!
An inaugural devlog for Ghostty 👻! Ghostty is the terminal emulator I've been working on as a side project since 2021. I recently shared that Ghostty exists and since then there's been a ton of interest in it!
Whether it's building a new project from scratch, implementing a big feature, or beginning a large refactor, it can be difficult to stay motivated and complete large technical projects. A method that works really well for me is to continuously see real results and to order my work based on that.
Building a native GUI for a cross-platform application is a decades old problem. Nowadays, most people just don't and fallback to using a non-native experience such as Electron instead.
I've noticed a consistent point of confusion whenever prompt engineering is discussed and I believe the confusion stems from two distinct ways of using a language model: interactive prompting and transactional prompting. Prompt engineering is primarily about transactional prompting, and a considerable amount of confusion or negativity arises when an individual tries to apply it to interactive prompting.
Nix is a powerful cross-platform package management tool. The benefits of Nix are far reaching, but one big benefit is that once you adopt Nix, you can get a consistent environment across development (on both Linux and Mac), CI, and production.
"Prompt Engineering" emerged from the growth of language models to describe the process of applying prompting to effectively extract information from language models, typically for use in real-world applications.
Every 10 or so years, a platform shift begins. 17 years ago, Amazon kicked off a platform shift with the release of S3 and EC2 under the Amazon Web Services (AWS) umbrella. This resulted in a shift best summarized as "cloud-native," fundamentally changing the way we build and deliver software worldwide from small individuals to the largest global companies.
As a relatively new member of adult society, and an absolute infant of the business world, I didn't think much about bank choice. I figured: you put money in, you take money out, they're all the same. I also figured a local branch of a global bank is just a fungible tentacle of the giant banking machine, so also... who cares. Both incorrect assumptions, but let's relive and rediscover the effect of these assumptions as I did.
As a frequent open source maintainer and contributor, I’m often asked: where do you start? How do you approach a new project with the goal of making meaningful changes? How can you possibly understand the internals of a complex project?
Zig has a built-in build system for building projects. It runs on every platform Zig supports and is capable of building everything from simple executables and libraries to complex, multi-artifact, multi-step projects. This page will dive into how the internals of the Zig build system works.
The next compiler stage after “AstGen” is “Sema.” Sema is responsible for taking the ZIR output from the AstGen stage and producing AIR. AIR, which stands for “Analyzed Intermediate Representation” is a fully typed intermediate representation, whereas ZIR is an untyped intermediate representation. AIR can then be lowered directly to machine code.
After building the abstract syntax tree (AST), the next step in many compilers is to generate an intermediate representation (IR). Whereas the AST is a tree, the IR usually begins creating a sequence of instructions for various blocks of a program (a file, a function, etc.). This sequence of instructions format can be more easily analyzed for optimization and conversion to executable machine code.
Parsing is the next step in the compilation pipeline following tokenization. Parsing is responsible for constructing an abstract syntax tree from a stream of tokens. I’ve previously written about how Zig converts a stream of bytes (source) into a stream of tokens.
Tokenization is the first step in a typical compiler pipeline. Tokenization is the process of converting a stream of bytes (the programming language syntax) into a stream of tokens.
For years, the primary bottleneck for virtual machine based development environments with Vagrant has been filesystem performance. CPU differences are minimal and barely noticeable, and RAM only becomes an issue when many virtual machines are active.
For the past two months, I've been heads down working on something new. There is still a lot of work left, but I believe it's time to show everyone what I've been up to. Today, I'm announcing Packer: an open source tool for creating machine images for multiple platforms.
Before even installing Vagrant or seeing how it works, it is important to understand the high-level workflow of Vagrant in an actual working environment. These principles are collectively known as the "Tao of Vagrant." The following is an excerpt from Vagrant: Up and Running.
Someone asked me recently to share some previous work I had done. As I looked back at my personal history, and reflected on what I've done successfully, it was clear to me that I'm definitely working on things I'm meant to be working on. Automation has been my passion since the very beginning.
Vagrant 1.1+ no longer supports RubyGems as an installation method. Instead, you must install Vagrant 1.1+ using pre-made packages or installers. For folks used to the gem-based installation, this has caused a mixture of confusion and disdain. In this post, I enumerate my reasons for abandoning RubyGems, and why it is better for the Vagrant community long-term.
No, not the company or the fruit. APPLE is an acronym ingrained into every Apple store employee before they ever even step on the retail floor. And it has continued to guide me ever since.
The "new normal" is what I've named a phenomenon I've seen multiple times in my life. It's an event where your perception of normality is changed by the people surrounding you. Consequently, your ambitions and chance of achieving those ambitions change as well. Actively seeking a new normal can steer you in a direction you never thought you'd take.