https://www.pcmag.com/news/apple-lobbies-against-right-to-repair-bill-in-oregon
The modern internet is brutal
It’s 2025. The internet has converged to a single video platform, one search engine, and a few social media giants, surrounded by heaps of ads and propaganda. AI companies have consumed every shred of data the could find in pursuit of automating away not just tedious tasks, but acts of human ingenuity and creativity. Meanwhile, software is leased like college town apartments, and your files are stored hundreds of miles away in the bowels some corporate data center in the cloud.
What’s an exhausted small business owner or distressed digital citizen to do? Does it have to be this way? Where did we go wrong? Are we stuck in this digital hell forever?
No, we aren’t.
The big myth
Companies like Microsoft, Google, Amazon, Apple, and the other tech giants benefit from a prevailing myth: that technology is too hard for the average person to understand, thus big businesses must swoop in and save us from ourselves. After all, they have the expertise and the capital to pay people lots of money to build fancy apps that conceal all the complexity of our computers and smartphones, saving us priceless time and effort. Handling your own data in 2025 isn’t just foolish; if you run a business, it’s fiscally irresponsible!
…or is that just what they want you to think?
Look, I don’t want to pretend that the math, science, and engineering underpinning modern technology are simple. They aren’t. But that’s okay. I don’t understand the intricacies of an internal combustion engine, or a convection oven, but I’m a pretty good driver, and I can bake some decent banana muffins. So, where does this myth come from?
Perhaps, it’s the fault of the big companies themselves? You know, the ones who have a vested financial interest in locking people onto their platforms so they can charge them large sums of money once they’re trapped? The ones who’ve lobbied time and time again against Right to Repair bills , to the point that people are afraid to open up their own hardware to learn how it works?
Yes, building computers and programming software can be very complicated. But managing your data? That’s really not so bad. All you need is a basic understanding of what digital information is, and how computers work with it. This knowledge will open a door to a whole new world of digital freedom and autonomy.
My goal for this blog post series is to help as many people as possible understand the very basics of digital data. Armed with this knowledge, you can make more informed decisions about who gets to access your data, as well as when and how.
Our first step: let’s encode some data!
The foundation of all modern computing (for now, while we’re ignoring quantum computing) is the simplest of ideas: the bit. This is where you’d expect me to define a bit. But that won’t help you learn. Instead, let’s discover it.
Imagine you’re making a list of tasks; perhaps a list of chores to complete around the house. You need some way to track which tasks you’ve completed, and which you haven’t done yet. If you’re writing your list down on paper, you add a checkbox (☐) beside each task. Then, when you complete that task, you’ll add a checkmark (🗹) inside to mark it as done.
This remarkably simple system we’ve invented is an example of an encoding. Encodings are mappings from one set of symbols to another. A good way to think of them is like a secret code; the encoded symbols only make sense to someone who understands their intended meaning.
It’s usually helpful to look at an encoding in a table format, as shown below:
☐ | To Do |
🗹 | Done |
While we’re at it, let’s find some other uses for our checkboxes, by creating additional encodings:
☐ | No |
🗹 | Yes |
☐ | False |
🗹 | True |
☐ | Off |
🗹 | On |
Hey, these little checkboxes are actually pretty versatile! It turns out that there’s a lot of information that we can encode using just one pair of symbols. We call these kinds of encodings binary encodings (binary meaning “two”). Our little two-state checkbox is our bit of information. There’s nothing magical or particularly complicated about bits or binary systems. In fact, we communicate using binaries all the time in our daily life, when we give a head nod or a head shake, or when we flash a thumbs up or a thumbs down.
Now, if I just showed you a checkbox with or without a checkmark, and asked you what it meant, you might guess at one of the above encodings. But without being sure, the checkbox can’t provide you with any useful information. That’s because you need to know both the encoding and its context to actually use the information. The importance of context arises in our daily life examples too. For instance, a head shake might mean “no, don’t do that” or “no, I don’t mind” depending on the words that follow the gesture.
The bit is the foundation of all digital technology today. This is due to the fact that we have, over the past several decades, discovered and engineered extremely efficient and reliable techniques for storing and transmitting bits using electricity. The math and science behind digital electronics and hardware is a whole separate field of study, which I am completely unqualified to explain. Thankfully, we’re studying for our data driver’s license here, not to become a mechanic or auto engineer, so we can move on, trusting that our devices can handle bits properly.
Adding another bit
How far can we stretch our checkbox system? Could we encode something even more useful, like numbers? Let’s try!
☐ | 0 |
🗹 | 1 |
Better than nothing, I guess? I think we’ve hit the limits of what we can do with a single checkbox though. If we want to encode larger numbers, we need additional checkboxes.
☐☐☐ | 0 |
☐☐🗹 | 1 |
☐🗹🗹 | 2 |
🗹🗹🗹 | 3 |
There’s some problems with the method above. First of all, we’re going to need lots and lots of checkboxes if we want to represent large numbers. Plus, we’re not using all the possible combinations of checkbox states. See what I mean?
☐☐☐☐ | 0 |
☐☐☐☐ | 1 |
☐☐☐☐ | 2 |
☐☐☐☐ | 3 |
🗹🗹🗹🗹 | 16 |
☐☐☐☐ | (unused) |
☐🗹☐🗹 | (unused) |
Let’s go back to the drawing board and try a different system. Instead of assigning each checkmark a value of 1, we will assign each checkbox a power of two, then add up all the powers of two that are checked off to determine the encoded number.
☐☐ | 0+0 | 0 | |
☐🗹 | 20 | 0+1 | 1 |
🗹☐ | 21 | 2+0 | 2 |
🗹🗹 | 21+20 | 2+1 | 3 |
This is definitely a bit harder to read, but there are some notable improvements. We only needed two checkboxes to count to three, instead of three boxes. And, we’re using all the possible combinations of two checkboxes to get there, which is much more efficient. How much more efficient? Check out the difference encoding the number 30 using our first method, versus our second:
🗹🗹🗹🗹🗹 |
1×30 | 30 | |
🗹🗹🗹🗹☐ | 24 |
16 |
30 |
If you’re starting to get lost, don’t worry! This is all you need to takeaway:
- With enough bits, we can encode any whole number we can think of.
- By treating our bits as “base-2” digits, we can encode numbers very efficiently.
For convenience, the rest of this article will refer to bits using the standard 0
and 1
symbols instead of our checkbox and checkmark symbols. If you get confused, just imagine them as checkboxes again, and remind yourself what meaning each checkbox has been assigned in each context.
With bits, all data is possible
The ability to encode numbers in bits unlocks a whole new world for us. Now, we can map any data we’d like to numbers, and then map those numbers to bits! Let’s try some examples.
Encoding text
Text is one of the most common categories of information humans want to share. Let’s start with the simplest possible example, by encoding the letters “A”, “B”, “C”, and “D”.
Bin | Num | Text |
---|---|---|
00 | 0 | A |
01 | 1 | B |
10 | 2 | C |
11 | 3 | D |
If we add more bits, we could expand the set of characters in our encoding to encompass letters, punctuation marks, and more! Note that we would also need separate codes for lowercase vs. uppercase letters, and for textual representations of the digits 0-9. Plus, there are “hidden” characters such as spaces between words, and the transitional space from the end of one line to the start of the next.
If you want to study an example of a real text encoding, take a look at the ASCII encoding table .
Encoding color
Most of us interact with our devices visually through a display, where we can create and enjoy rich image and video content. In order to do that, computers must encode information about what colors to show on each pixel of the screen. Let’s invent rudimentary color encoding right now, using just three bits, one for each primary color:
Bin | Num | Encoding | Color | ||
---|---|---|---|---|---|
000 | 0 | ⬛ Black | |||
001 | 1 | 🟦 | 🟦 Blue | ||
010 | 2 | 🟨 | 🟨 Yellow | ||
011 | 3 | 🟨 | 🟦 | 🟩 Green | |
100 | 4 | 🟥 | 🟥 Red | ||
101 | 5 | 🟥 | 🟦 | 🟪 Purple | |
110 | 6 | 🟥 | 🟨 | 🟧 Orange | |
111 | 7 | 🟥 | 🟨 | 🟦 | ⬜ White |
Now, imagine if we took lots of three-bit groups, and we arranged them in a grid:
X | |||
---|---|---|---|
Y | |||
001 | 011 | 010 | |
011 | 010 | 110 | |
010 | 110 | 100 |
X | |||
---|---|---|---|
Y | |||
🟦 | 🟩 | 🟨 | |
🟩 | 🟨 | 🟧 | |
🟨 | 🟧 | 🟥 |
We’ve just reinvented the concept of a bitmap, the technology that forms the basis of many of your favorite image file formats, such as JPEG, PNG and the (in)famous GIF. Of course, real color encodings use groups of bits for each color channel, in order to capture various shades and hues.
Encoding instructions
Our computers need more than data to operate; they need instructions that tell them what we want done to our data. Fortunately, we can encode a set of instructions just as easily as text or colors:
Bin | Num | Operation |
---|---|---|
00 | 0 | + |
01 | 1 | - |
10 | 2 | × |
11 | 3 | ÷ |
Once we have these binary-encoded instructions, we can combine them with our binary-encoded data to perform transformations.
If you’ve ever downloaded and installed a file, you may have been baffled when the download website presented you a choice between several versions, all with horribly confusing names like “x86-64”, “amd64”, “arm”, and “i386”. These labels correspond to the various instruction sets used by different CPUs. To put it plainly, they’re all encodings used to map bits to computer instructions. If you install a program encoded to an instruction set that your computer can’t understand, it won’t be able to run the program at all.
Sidebar: What’s a byte?
A byte is eight bits. That’s it. Working with multiples of eight bits turns out to be really useful in computing. If you want to know more, look it up!
Takeaway: Not all encodings are created equal
Now that we understand bits and binary encodings, we can manage our data more strategically. Just from what we learned above, we can deduce that the binary encoding we choose to store our data in (commonly called the “file format”) can make a huge difference in our ability to own and control our data. For example:
- A file format that offers compression means we can store more data in the same amount of storage space, at the cost of lower quality. For example, a JPEG image takes up less space than a PNG.
- A file format whose encoding rules (called the “specification”) are publicly available and free to use will often have more applications built that can understand it. For example, the ubiquitous CSV file that almost all web apps allow for import and export. Also consider the PDF, which literally stands for “Portable Document Format.”
Take a moment next time you’re opening, saving, sending, or downloading a file. Make note of it’s file type, and ask yourself what you know about it. If you’re curious, look up its history or, if you’re feeling really brave, try to find it’s file specification and read the introductory section where they describe its intended purpose.
Okay, now what?
Hopefully, you found this article informative on it’s own. But don’t worry, there’s a purpose to our intellectual pursuits. In the next entry to this series, I’ll build off the foundation we just established, and share my own strategy for data ownership, with recommendations for small businesses, artists, and everyday users.