Skip to content
DevMeme
5366 of 7435
When “just one JSON” morphs into a full-blown microservice spaghetti
API Post #5885, on Feb 12, 2024 in TG

When “just one JSON” morphs into a full-blown microservice spaghetti

Why is this API meme funny?

Level 1: The Overkill Delivery Service

Imagine you want to send a message to your friend who lives next door. You could simply walk over and hand it to them, right? But instead, picture this: you write the message on a piece of paper and decide to use a special delivery service. You call a courier, show them your ID, and give them the note. The courier takes it to a big office building where they log the message in a book, make a photocopy for backup, and put the copy in a file cabinet just in case. Then they put your note in an envelope, put that envelope in a box, and send it on a truck to a mail processing center. At the center, a worker takes it out, puts it in another envelope, and sends it with a whole team of messengers (on bikes, trucks, maybe even a plane) that eventually deliver it to your friend’s house – perhaps with a security guard checking ID at your friend’s door before handing it over. Finally, your friend gets the message and says, “Why didn’t you just give it to me directly?”

That sounds silly and way too complicated, right? You just wanted to deliver one little message! This is exactly what the meme is joking about. In software, the “one JSON” is like that little message. And the crazy whiteboard diagram is like the over-the-top delivery route with all those extra steps and people involved. It’s funny because it’s an overkill solution – doing something in a hilariously complicated way when it could be simple.

The image shows a developer standing next to a whiteboard filled with a wild sketch of boxes and arrows. He looks a bit defeated, as if saying, “I can’t believe we need all THIS just to send one tiny thing.” The joke is really about how engineers sometimes turn a simple task into a huge project. It’s like using an entire parade of elephants, acrobats, and marching bands to deliver a single postcard. Sure, the postcard gets delivered, but wow, that was way more complex (and probably confusing) than anyone expected! The humor comes from recognizing that contrast – the tiny request versus the giant, tangled system built to make it happen – and maybe a gentle reminder not to make things harder than they need to be.

Level 2: JSON Jungle Gym

Let’s break this down in simpler terms. The meme shows a tweet saying: “it’s just sending one json from one service to another how hard can it be?” with a picture of a whiteboard absolutely full of a complicated diagram. If you’re a junior developer or new to these concepts, here’s what’s going on:

JSON – short for JavaScript Object Notation – is a common data format used for APIs. It’s basically text structured like {"key": "value"} pairs, easy for computers and humans to read. So, sending “one JSON” means sending a piece of data (perhaps a request or a message) from one program (Service A) to another program (Service B). In a perfect world, Service A would just call Service B’s API (Application Programming Interface) directly with this data and that’s that. An API is like a contract or address: it defines how one software can talk to another (often via web requests, like an HTTP call).

However, in real-world companies – especially those using a microservice architecture – things aren’t so straightforward. A microservice architecture means the application is split into many small, specialized services rather than one big application. Each microservice usually has a single responsibility (for example: one service just for user authentication, another just for product info, another for sending notifications, etc.). This approach has benefits: teams can work independently, and services can scale individually. But it also means lots of moving parts. And those parts need to communicate over a network, which introduces complexity. It’s like replacing one big factory with many little workshops that must coordinate – suddenly you need a lot of messaging and coordination between them.

The whiteboard diagram in the image is a humorous exaggeration of such a system. We see many boxes and bubbles (representing different microservices or components) connected by arrows (representing data flows or dependencies). The labels on them are silly on purpose – names like “CLOGGER”, “BINGO”, “RACCOON” – to emphasize how, in a big system, service names often sound like an inside joke or code names. In many companies, teams pick project names that might be random or thematic (animals, fruits, mythology, etc.). So don’t worry if “OMEGA STAR” or “Papaya” confuse you – they’re meant to be confusing and illustrate how hard it is for anyone new to untangle this web.

Despite the funny names, each of those probably corresponds to a real-world function:

  • Authentication/ID Service: One box has an acronym “IDP” (Identity Provider). Likely one of the steps needed to send the JSON is authenticating – ensuring the request is authorized. So a service checks tokens or credentials.
  • Logging/Monitoring: The box named “CLOGGER” hints at logging. In an enterprise system, every interaction might be logged for debugging or compliance. So when Service A sends JSON to Service B, the event is recorded by a logging service.
  • Data Transformation/Aggregation: The “SIMPLEX AGGREGATOR” could be a service that combines or simplifies data. Maybe Service A’s JSON isn’t in the exact shape Service B needs, so this aggregator service reformats it or adds missing pieces by calling other services.
  • Database & Replication: The cylinder labeled “BREAD REPLICA” represents a database (cylinders are the universal diagram icon for a database). A “replica” means a copy of the database, usually used for backup or spreading read load. So the system likely writes some data as part of this JSON exchange, and it’s getting replicated to another database for safety or reporting.
  • Cloud Infrastructure: The mention of “EKS” means they’re using Amazon’s Elastic Kubernetes Service – essentially running these microservices on a Kubernetes cluster in the cloud. So the diagram includes parts of the infrastructure: not just the apps themselves, but where they live (in Docker containers orchestrated by Kubernetes). That adds layers like deployment configurations, scaling rules, etc., which are invisible in the code but very real in architecture.

In simpler terms, the reason sending one JSON becomes a jungle gym of steps is because each concern (security, data format, reliability, scaling, etc.) gets handled by a different piece of the system. This is often by design: you don’t want one service doing too many things. But it can feel like overkill when you step back and look at all the pieces involved.

For example, imagine you want to send a message to a friend. Monolith approach: you write a note and hand it directly to them – done. Microservice approach: you write the note, then give it to a postal worker (service) who knows the route. But first, you go to a notary (another service) to verify your identity. Then the postal service sends it to a regional center (maybe an aggregator hub) that sorts messages, then it gets delivered to your friend’s mailbox. Meanwhile, copies of the note are stored in a filing cabinet (database) in case it gets lost, and a security camera (logging service) records the whole process. By the end, a simple delivery turned into a whole process pipeline. In software terms, each step was useful (identity verified, message reliably delivered, backups kept, process recorded), but to the question “Wasn’t I just sending one thing?”, the answer is yes, plus a dozen support systems around it. That’s why the tweet is humorous — it’s highlighting this contrast.

We also see the developer in the photo looking a bit fed up. That’s a mood every developer hits eventually. They started with a straightforward task and now they’re staring at a whiteboard of doom, thinking “how did it come to this?”. The phrase “microservice spaghetti” is actually used in the meme title, and it’s perfect: the system’s diagram looks tangled like a bowl of spaghetti. This term “spaghetti” in programming generally describes code or designs that are entangled and hard to follow. Here it’s architectural spaghetti – no single clear path, just a lot of twisty passages for that poor JSON to traverse.

As a junior dev, what can you take away from this? For one, simple-sounding tasks can hide complex requirements. If someone says “just do X”, be aware that “X” might involve validating data, handling errors, ensuring security, and fitting into existing systems. It’s also a lighthearted warning: be cautious of over-engineering. Yes, we want robust designs, but it’s easy to get carried away and build an overly complex solution for a basic problem. The meme exaggerates to make the point: sometimes we add so many layers that we lose sight of the original simplicity. It’s a fine balance – part of growing as a developer is learning which layers are truly necessary and which are just extra complication. Seeing the humor in this means you’re recognizing that balance.

Level 3: Microservice Hydra

From a senior engineer’s perspective, this meme elicits a knowing groan. It’s a spot-on satire of microservice architecture scope creep. What started as a seemingly simple integration – “just send a JSON from one service to another” – ballooned into a hydra of interconnected microservices (cut off one head, and two more pop up!). The whiteboard in the image is crammed with boxes, arrows, and fantastical service names (CLOGGER, RACCOON, OMEGA STAR, etc.), comically illustrating the phenomenon of an ever-expanding internal service zoo. The humor lands because anyone who’s worked on a large system knows how a straightforward task can trigger a chain reaction of dependencies.

Why is this funny? Because we’ve all heard someone underestimate a project with the famous last words, “How hard can it be?” In reality, even tasks that sound trivial often involve mucking through layers of integration pain. Senior devs recognize the tweet’s scenario: an innocent request for a new feature or API integration reveals an underbelly of complexity. Perhaps Service A and Service B weren’t originally designed to talk directly. Maybe Service A’s data isn’t exactly what Service B expects, so you create a Simplex Aggregator service to transform or aggregate data (the whiteboard even literally has a box labeled “SIMPLEX AGGREGATOR”, likely a tongue-in-cheek name for something meant to simplify the data exchange). Then you realize you need an auth service in between (can’t just send data without verifying identity and permissions – enter some IDP service, possibly the cryptically named “LMAIDP” on the board). Oh, and don’t forget logging and monitoring: compliance or debugging demands that every inter-service call is recorded, so you add a logging pipeline (CLOGGER – a comical name hinting at clogged logs or “cloud logger”). Each addition is sensible on its own – you need security, you need observability, you need data consistency – but together they form the spaghetti cluster we see. The meme is essentially pointing at an over-engineered solution and laughing, because it’s both absurd and painfully relatable.

In practice, this kind of architecture scope creep often happens due to well-intentioned architecture principles. For instance, separation of concerns and single-responsibility might have led the team to break the “one JSON transfer” into multiple microservices, each handling one piece: one service for formatting the JSON, another for validating it, a third for routing it, etc. Over time you end up with dozens of microservices where one would arguably do. There’s a sardonic saying among seasoned devs: “We solved the problems of a monolith by replacing them with the problems of a distributed monolith.” In other words, instead of one big application, you now have many small apps tightly coupled by their data flows – a distributed monolith. The diagram’s chaotic arrows and loops (even an ominous “HELL ROOM” component) hint that this system is so tightly intertwined that modifying one service or data contract might break others, the same fragility a monolith has, only now spread out over network calls and deployment pipelines. It’s monolithic dependency hiding in microservice clothing.

Let’s talk about those whimsical service names and what they imply, because that’s a huge part of the joke. In real organizations, internal services often have codenames (sometimes random like animals or fruits – here we have “RACCOON”, “Papaya” – and sometimes aspirational like “OLYMPUS” or mysterious like “OMEGA STAR”). To an outsider or a new team member, these names are meaningless – it’s an internal service zoo. On the whiteboard, RACCOON might be a caching service (raccoons hoard things?), Papaya could be an internal data API (maybe part of a fruit-named series of services), and OMEGA STAR sounds like a grand central service or library. The humor is that the diagram is so overloaded with jargon and in-jokes that it satirizes how convoluted corporate systems become. The poor developer standing in front of this whiteboard looks understandably overwhelmed (or downright defeated) – a mood many of us recognize when tracing a simple request through a maze of microservices and databases. It’s making fun of the cognitive overload that modern distributed architectures often impose on engineers.

Zooming out, what real-world scenarios lead to this “microservice spaghetti”? A common one is when a company eagerly adopts a microservice architecture for flexibility and scalability, but without proper governance. Every team starts spawning its own services, each with its own database, its own API versions, and sometimes even its own tech stack. Over a couple of years, you end up with a tangled dependency graph: Service A calls B, B calls C and D, D writes to database E, triggers event F… on and on. The simple act of sending a JSON likely meant dealing with API versioning – maybe Service B expects a slightly different JSON schema than what A sends. Instead of changing both services simultaneously (which would require coordinating deployments – oh no, we’re “agile”! /s), they introduce a versioned API or a translation layer. Now we have to maintain multiple JSON versions (e.g., v1 vs v2 of the API) to ensure backwards compatibility. This is a classic architecture trade-off: you preserve uptime and decouple release cycles, at the cost of even more complexity in code and testing. The meme’s exaggerated architecture diagram likely includes such layers and versioned paths, even if not explicitly labeled.

Another factor is organizational. Conway’s Law famously states that systems mirror the communication structures of the organizations that build them. If five different teams are involved in “sending one JSON”, you might get five different services on that diagram, each owned by a team, stitched together. Team A owns the sender service, Team B owns the receiver, Team C owns the authentication system, Team D owns the logging/monitoring tools, and maybe Team E owns an “App Platform” (notice the drawing has “APP PLATFORM (MICROSERV)” noted – this hints at an internal platform team providing common microservice infrastructure). Each team, working in parallel, introduces their own piece of the puzzle. The result can be an over-engineered architecture where no single person or team fully understands the whole flow – and that’s exactly what that bewildering whiteboard conveys. The tweet’s author (and everyone laughing at it) has been in those meetings where a supposedly simple design discussion ends with a whiteboard that looks like the schematic of a warp drive.

The business reality can also be to blame for such over-engineering. Maybe reliability requirements or scale requirements forced the team’s hand. “One JSON” could be fine at 100 requests/day, but at 10,000/second with five nines uptime, you start needing load balancers, clusters, retries, failover instances. Hence you see “EKS” on the diagram – Amazon’s Elastic Kubernetes Service – implying this simple JSON is actually flying through a Kubernetes-orchestrated cluster of containers. When you involve Kubernetes (often jokingly abbreviated as K8s), you’re dealing with pods, deployments, services, ingress controllers… a whole microservice habitat that must be configured (likely with countless YAML files). The presence of EKS basically screams: we containerized and deployed each microservice on the cloud, adding layers of DevOps complexity. Now there’s not just the code to send JSON, but also infrastructure as code (Terraform scripts, Helm charts, etc.) behind every box on that whiteboard. Seasoned engineers chuckle (or maybe cringe) at this because they know the operational burden that comes with this territory. More services = more things that can fail. Did all those arrows get proper circuit breakers (a pattern to stop cascading failures)? Is there a distributed trace ID tagging the JSON’s journey so that when something goes wrong, you can pinpoint which hop died? Often these things are added after the fact, usually after an incident in the middle of the night.

Speaking of nighttime incidents, the meme resonates with the on-call horror stories. The cynical veteran in me thinks: “Sure, it’s easy – until it’s 3 AM and that ‘one JSON’ is stuck somewhere in this maze, and you’re frantically grepping logs across six services named after cute animals and Greek gods.” The diagram even has a box named “HELL ROOM” – probably a humorous way of labeling some chaotic module or maybe an actual chatroom where developers gather during an outage (and it feels like hell). The drawing is a bit hyperbolic, but not by much – real production architectures can feel exactly like this when you’re trying to trace a bug or a latency spike. That’s why the tweet hits home: it spotlights the absurdity with a dash of dark humor.

In summary, at the senior perspective, this meme is a commentary on over-engineered microservice ecosystems. It highlights how easily a simple task can become a tangled web of services due to genuine needs (scalability, decoupling, fault tolerance, team autonomy) and sometimes less-genuine ones (overzealous architects, shiny new tech for its own sake). The spaghetti diagram and the deadpan tweet text capture the dichotomy between expectation and reality. Expectation: one quick JSON hand-off. Reality: an integration nightmare of microservices, each necessary for some requirement, but collectively comic in complexity. Every senior dev chuckles because we’ve all lived through that moment of, “It was supposed to be simple… now look at this!” – it’s both cathartic and cautionary.

Level 4: Architectural Spaghettification

At the deepest technical level, this meme is poking fun at the inherent complexity of distributed systems lurking beneath a simple task. “Just send one JSON from one service to another – how hard can it be?” turns out to be a microcosm of distributed computing reality. In theory, sending a JSON (a lightweight data format, JavaScript Object Notation) from Service A to Service B should be a trivial remote procedure call. But the moment you distribute components across networks, you’ve opened Pandora’s box of computer science theory: CAP theorem, network fallacies, and concurrency quirks all begin to spaghettify that simple request.

Consider the fundamental constraints: the CAP theorem tells us a distributed system can’t simultaneously have perfect Consistency, Availability, and Partition tolerance. This “one JSON” journey forces an architectural choice. Do we make the call synchronous and strongly consistent (risking downtime if Service B is unavailable), or do we go asynchronous for availability (accepting eventual consistency)? Either choice invites complexity. Many architectures lean towards eventual consistency, adding message queues or retry logic so that if Service B isn’t responding, the JSON will eventually get delivered. But those queues and retries are additional moving parts – one more box on that whiteboard spaghetti. If we require strong consistency (for example, a transaction spanning microservices), we might attempt a distributed transaction or a Saga pattern of coordinated steps. That’s even more infrastructure – an orchestrator service or a complex choreography of events. Suddenly, the “simple” JSON has to navigate consensus protocols or compensate for partial failures.

The eight fallacies of distributed computing haunt every arrow in that diagram. The tweet’s naive question ignores fallacy #1: The network is reliable. In practice, networks drop packets and services crash at 3 AM. To counter this, architects add retry loops, ack mechanisms, and failover services – each one a new component (perhaps that’s what “HELL ROOM” or the little gravestone icons on the diagram are hinting at, a tongue-in-cheek nod to dead messages or failure tombstones). Fallacy #2: Latency is zero. A JSON over the network faces real latency. To mask this, you might buffer requests via an event stream or use a content delivery network for caching, which again means more boxes and arrows. Fallacy #3: Bandwidth is infinite. Large JSON or high throughput? Better introduce a compression service or a throttle – more complexity. And of course, the network is secure (fallacy #4) – clearly not, so you front the JSON call with an authentication/authorization service (perhaps that mysterious “LMAIDP” box is an IDP, Identity Provider, responsible for login tokens). Each fundamental truth of distributed systems that the naive question sweeps aside demands its pound of flesh in architecture.

This chaotic whiteboard is essentially a Rube Goldberg machine for delivering a JSON – a byzantine contraption solving a simple task via a chain of indirect steps. Ironically, each added step exists to handle a real-world concern defined by distributed systems theory. For example, you see a cylinder labeled “Bread Replica” – the classic database replication component. In a distributed design, you often maintain replica databases for reliability and read scalability. That cylinder suggests our “one JSON” might involve writing to a primary DB (“Papaya” perhaps) and propagating to a replica for redundancy. This hints at consensus algorithms or asynchronous replication under the hood: perhaps a Write-Ahead Log shipping updates, or a Paxos/Raft-like agreement among nodes to ensure the JSON data isn’t lost. And those quirky gravestone icons on the diagram? In real distributed logs (like Kafka), tombstone records mark deletions – a nerdy hint that even deletion or error-handling events are part of the story. In other words, the meme illustrates how a straightforward data exchange triggers a need for distributed consensus, data replication, and fault tolerance mechanisms to keep things correct and resilient.

At this level, the humor lands on an almost tragic truth: accidental complexity grows from fundamental limits of computation. Monoliths (single, in-process systems) sidestep many of these issues – a function call in a monolith doesn’t need a retry queue or an auth token on the wire. But once you split responsibilities into microservices, you're in the realm of distributed algorithms and formal guarantees (or lack thereof). We’ve essentially taken a problem that is Turing-complete (the system can do anything) and distributed its state and logic over a network – gaining scalability and team autonomy at the cost of wrestling with the math and physics of distributed computing. The meme exaggerates the result: one JSON bouncing through a non-deterministic labyrinth of services, each box arguably born from a whitepaper or a best-practice to solve a specific distributed challenge. The joke is equal parts humor and grim recognition: even the simplest distributed request can unravel into a Rube Goldberg architecture once you account for every edge-case and theoretical limitation.

Description

Screenshot of a tweet from the verified account “terminally onλine eng… (@tekbog)” with the text: “it's just sending one json from one service to another how hard can it be?”. Below the tweet is a photo of a whiteboard packed with a chaotic architecture sketch. Boxes, circles, clouds and gravestone icons are connected by arrows in every direction, labelled with whimsical service names like “CLOGGER”, “BINGO”, “SQUIRT”, “LMAIDP”, “RACCOON”, “OMEGA STAR”, “EKS”, “APP PLATFORM (MICROSERV)”, “SIMPLEX AGGREGATOR”, “HELL ROOM”, “OLYMPUS”, “Papaya”, and a cylinder marked “BREAD REPLICA”. A blurred developer stands to the right, dwarfed by the diagram’s tangle of dependencies. The visual gag highlights how a supposedly simple JSON hand-off balloons into an over-engineered, cloud-native, multi-service labyrinth - something every senior engineer has seen evolve out of scope

Comments

24
Anonymous ★ Top Pick Somewhere between “curl -d” and prod we accidentally invented our own Kafka-on-REST-on-Lambda-on-EKS legacy
  1. Anonymous ★ Top Pick

    Somewhere between “curl -d” and prod we accidentally invented our own Kafka-on-REST-on-Lambda-on-EKS legacy

  2. Anonymous

    Somewhere in that diagram is a Kafka cluster that nobody remembers why we added, three different retry mechanisms because 'the first two didn't handle edge cases,' and a service called RACCOON that was supposed to be temporary but now handles 40% of production traffic and nobody dares to touch it

  3. Anonymous

    Ah yes, the classic 'just send JSON between services' - the distributed systems equivalent of 'just draw the rest of the owl.' What starts as a simple HTTP POST somehow metastasizes into a Kafka cluster, three message queues, a service mesh, read replicas, and a whiteboard that looks like a conspiracy theorist's cork board. By the time you've added circuit breakers, retry logic, schema validation, distributed tracing, and figured out why service LMNOP occasionally returns 418 I'm a Teapot, you've essentially recreated the entire OSI model but with more YAML. The real kicker? That 'simple JSON' now has 47 different versions across your services because nobody wanted to coordinate a breaking change during Q4

  4. Anonymous

    In enterprise speak, 'just send JSON' translates to provisioning EKS, wiring a mesh, adding authn/z, a schema registry, idempotency keys, retries with jitter, circuit breakers, trace propagation, DLQs - and a runbook

  5. Anonymous

    One JSON transfer? Sure - after it barters with Gary, dodges the MQ raccoon, and petitions EKS for a mercy port-forward

  6. Anonymous

    “Just send a JSON” is how you accidentally invent an ESB, a schema registry, idempotent retries with backoff, distributed tracing, and three Kubernetes namespaces - right before the PR title becomes “Initial migration.”

  7. @Araalith 2y

    It can be even more fun: - green deployment - autoscaling - cross-regional resources (such as database replicas) - proper authorization with all claims/features - idempotent retries on failure - logs, metrics, and monitoring - infrastructure as code Want it harder? Ensure the protection of PII and compliance with all relevant policies. After 3-6 months of development, you'll finally be able to "send one json from one service to another." P. S.: I'm sure I forgot something in the list. Bring your pain, please.

    1. dev_meme 2y

      - proper permissions, connectivity with load balancers and their configuration within the cloud (though using cloud shit itself instead of good ol' vps/bare metal is a pain itself)

      1. @Araalith 2y

        Oh, ofc resources permissions and rates (say "hello" to cross-regional again). LB is a part of K8s nowadays, if you don't mean DR. And how could I have forgotten about disaster recovery...

    2. @NaNmber 2y

      Here are some more from gpt - Thorough Testing: Unit, integration, e2e, and load tests because the mantra "it works on my machine" doesn't quite cut it in professional settings. - Multiple Environments: Development, staging, QA – each meticulously crafted to never quite replicate the production environment. - Secrets Management: Where passwords and API keys go to avoid becoming public domain. Better safe than sorry. - Developer Experience (DX): Enhance the developer workflow with tools and documentation, turning the ordeal into something bearably productive. - Automated Rollbacks: Implement failsafes to gracefully revert changes post-deployment, because sometimes the best way to move forward is to take a step back. - API Rate Limiting: Incorporate sensible rate limits to protect your services from being overwhelmed. - Data Encryption & Privacy: Encrypt data in transit and at rest, honoring user privacy and regulatory mandates, because trust is your application's foundation. - Error Handling & Graceful Degradation: Design your system to fail gracefully, ensuring that even when things go south, the user experience doesn't plummet with it. - Automated Canary Releases: Gradually roll out changes to a small subset of users, because testing in production is the new extreme sport, but it's better with a safety net.

      1. @Araalith 2y

        Sure thing, unit tests and integration tests are must-haves. Dev/QA/Canary environments too. Vaults are somewhat optional, but if we are talking about two different services, some kind of common configuration (e.g., auth key) should be stored in a secret vault. Privacy is already included in PII and related policies.

  8. @hannybu 2y

    Nobody told about that shit first time that i saw json :c

  9. dev_meme 2y

    Haha, json, just move strings, sounds like a great fun

  10. @LonelyGayTiger 2y

    Eww json, protobufs are the way to go.

    1. @qtsmolcat 2y

      Ew protobuf, just gzip raw text

      1. @LonelyGayTiger 2y

        The problem with any text format is that you have to parse it. Even if you have a library to parse it for you, it still has to be parsed. Which is kinda dumb.

        1. @qtsmolcat 2y

          Protobuf also needs to be parsed 🤔

          1. @LonelyGayTiger 2y

            How so?

            1. @qtsmolcat 2y

              Typo. But protobuf generally requires using some sort of library which is still parsing it under the hood.

              1. @LonelyGayTiger 2y

                It's just raw data, the library is effectively just providing type data and pointer offsets. Not actually parsing the data. The data is already in the desired format. You dont have to convert from string to int, it's just already an int.

                1. @purplesyringa 2y

                  protobuf has varints, it's literally not "already an int"...

                  1. @qtsmolcat 2y

                    Everything's binary at some point

                    1. @purplesyringa 2y

                      So?..

                      1. @qtsmolcat 2y

                        It's a joke :)

Use J and K for navigation