Delivered-To: tjphuhs@gmail.com
Received: by 2002:a5d:4bca:0:b0:451:8158:aa77 with SMTP id l10csp2146228wrt;
        Tue, 12 May 2026 08:42:23 -0700 (PDT)
X-Received: by 2002:ac8:59d3:0:b0:50d:a6a0:8f04 with SMTP id d75a77b69052e-514a0b6f5d7mr210729921cf.42.1778600543309;
        Tue, 12 May 2026 08:42:23 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1778600543; cv=none;
        d=google.com; s=arc-20240605;
        b=EtVcAKrwsuARkdSVwF3SoGStdNw0ZbBw6sQDS+h1MuKg6U6GhTJHKmQda/QzGR/3wz
         V1LuO1yMXqK+RhbqylbQ8DzxkBr/cUQ1HAtmVLqfSBK0wE4hxb3PK4/XsPc4lxg31FOE
         RydyG7fAfsv1HN5iYUkI9HK6w3EqGYhp6/qKgmkkwvptWg/31+/JJDGGYK9BvlVbZ7y5
         SMfL1ptHdGJkMURv3GI+aFTIDNc6zicJnmQ3t57sqQYaR/7atOa7nH4h4czj1Lu5Kyfm
         Bo6CeFjKGh1vbNuCeosFN1m6YKIy9M2jcOx4/9n2IvYnip++mSl/x8aO0c5YfZ8G7T7S
         zqpg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605;
        h=list-unsubscribe-post:list-unsubscribe:list-post:list-id
         :list-archive:list-url:list-owner:reply-to:in-reply-to:references
         :sender:feedback-id:date:message-id:to:from:subject:mime-version
         :dkim-signature:dkim-signature;
        bh=5rj25x7Pd25YT+SzLvuRpr9Su4zAHhylWqV4BC17kug=;
        fh=9zP21OW67FFZD2VV42mGudo540Qp4aalMWxJB5kMYug=;
        b=kii6Qk8tDRsiqIkpcgipm2E4SiHolwHhTlFSXQtNsXDklDMLo4OKXljFpaNiGZOiS5
         cgkmgVqcq9yl0kED3xQc2ti0QksUkBkmG4zAtskRQzmSL3u5HIgXkM1pRQiQlOsGsrCQ
         aGjB374pEWK4AUFqrSyLdPsb/Q0n3bWE1HdEaQwFy9L0NGGIi+SbZZc0xyqju4Y47tzV
         t3bf7L53z9g9MPFUF4rKDvLlt20pPbgUtJ4dACvdAk9RNexryFhrQT3rZ20Myj0BR4xD
         Y7+dheAKH+GnxRFElgB0A1jsQD06XLpGMERwkO9KcCdhpvgrORMKFW849R+X3jinim7W
         u9hg==;
        dara=google.com
ARC-Authentication-Results: i=1; mx.google.com;
       dkim=pass header.i=@mg-d1.substack.com header.s=k1 header.b=eZgNvtpG;
       dkim=pass header.i=@mailgun.org header.s=mg header.b=hLVHlkcl;
       spf=pass (google.com: domain of bounce+30b528.39b08c6-tjphuhs=gmail.com@mg-d1.substack.com designates 159.112.244.52 as permitted sender) smtp.mailfrom="bounce+30b528.39b08c6-tjphuhs=gmail.com@mg-d1.substack.com";
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=substack.com
Return-Path: <bounce+30b528.39b08c6-tjphuhs=gmail.com@mg-d1.substack.com>
Received: from v552.v5375b7fa.use4.send.mailgun.net (v552.v5375b7fa.use4.send.mailgun.net. [159.112.244.52])
        by mx.google.com with UTF8SMTPS id d75a77b69052e-5148e920ff5si158421001cf.385.2026.05.12.08.42.22
        for <tjphuhs@gmail.com>
        (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
        Tue, 12 May 2026 08:42:23 -0700 (PDT)
Received-SPF: pass (google.com: domain of bounce+30b528.39b08c6-tjphuhs=gmail.com@mg-d1.substack.com designates 159.112.244.52 as permitted sender) client-ip=159.112.244.52;
Authentication-Results: mx.google.com;
       dkim=pass header.i=@mg-d1.substack.com header.s=k1 header.b=eZgNvtpG;
       dkim=pass header.i=@mailgun.org header.s=mg header.b=hLVHlkcl;
       spf=pass (google.com: domain of bounce+30b528.39b08c6-tjphuhs=gmail.com@mg-d1.substack.com designates 159.112.244.52 as permitted sender) smtp.mailfrom="bounce+30b528.39b08c6-tjphuhs=gmail.com@mg-d1.substack.com";
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=substack.com
DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg-d1.substack.com; q=dns/txt; s=k1; t=1778600542; x=1778607742;
 h=List-Unsubscribe-Post: List-Unsubscribe: List-Post: List-Id: List-Archive: List-Owner: Reply-To: In-Reply-To: References: Sender: Sender: Date: Message-Id: To: To: From: From: Subject: Subject: Content-Type: Mime-Version: X-Feedback-Id;
 bh=5rj25x7Pd25YT+SzLvuRpr9Su4zAHhylWqV4BC17kug=;
 b=eZgNvtpGWDsx8FTP2zX3w12qWleGApHmP3ENztOUVJhNCiX7UM313SSV+k0w10eF29cdqFKZkqZJs0k2MViepvVk9MtzLlObGCcQYk73Q7xiGlJJoJSpEHocKAK7FufuvGGVoVMT0vgIKdjVZjN/WS9E+udE6Jy62jDCufmwDq4=
DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mailgun.org; q=dns/txt; s=mg; t=1778600542; x=1778607742;
 h=List-Unsubscribe-Post: List-Unsubscribe: List-Post: List-Id: List-Archive: List-Owner: Reply-To: In-Reply-To: References: Sender: Sender: Date: Message-Id: To: To: From: From: Subject: Subject: Content-Type: Mime-Version: X-Feedback-Id;
 bh=5rj25x7Pd25YT+SzLvuRpr9Su4zAHhylWqV4BC17kug=;
 b=hLVHlkclavol6etm2hXHFhfcd7GH50Qf8tpOh8bJ4X/lzbHlj4lcslJeYs/T/csNhuF6sbTI/OMdBKggkv12raZdBvL2adzpKciKzeBSgYUszegdLHY0hqRHlbnHqV9rhO0XULGOhw2rnYXv2WvqeIGMTnHRPiG1oAqu89bwXeE=
X-Mailgun-Sid: WyIxMWU0ZSIsInRqcGh1aHNAZ21haWwuY29tIiwiMzliMDhjNiJd
X-Feedback-Id: postmaster@mg-d1.substack.com:post:614a1297c57bbbe25fa40e08:mailgun
Received: by 7ee78f1e78ec2b9302730224d448874be20debbd454be5fad3892d29b3acf271 with HTTP
 id 6a034a5ede7939c20e99e104; Tue, 12 May 2026 15:42:22 GMT
X-Mailgun-Sending-Ip: 159.112.244.52
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="4ab31664e347ebfd114edecc807314f5068de783ab49fc95df7282a7b955"
Subject: How Figma Upgraded Data Pipeline from Multi-Day Latency to Real-Time
From: ByteByteGo <bytebytego@substack.com>
To: tjphuhs@gmail.com
X-Mailgun-Tag: post
X-Mailgun-Track-Clicks: false
Message-Id: <20260512153103.3.ffd3ae7cd4369ba0@mg-d1.substack.com>
Date: Tue, 12 May 2026 15:31:03 +0000
Feedback-Id: post-193057411:cat-post:pub-817132:substack
Sender: ByteByteGo <bytebytego@substack.com>
References: <post-193057411@substack.com>
In-Reply-To: <post-193057411@substack.com>
Reply-To: ByteByteGo
 <reply+36xw1v&4iwoe6&&8e0a1ebc94346fc7ae0a6eefa42823fe269f3ee87bd3a854ecf109d1ed869195@mg1.substack.com>
List-Owner: <mailto:bytebytego@substack.com>
List-Url: <https://blog.bytebytego.com/>
List-Archive: <https://blog.bytebytego.com/archive>
List-Id: <bytebytego.substack.com>
List-Post: <https://blog.bytebytego.com/p/how-figma-upgraded-data-pipeline>
List-Unsubscribe: <https://blog.bytebytego.com/action/disable_email/disable?token=eyJ1c2VyX2lkIjoyNzM2MjIzOTgsInBvc3RfaWQiOjE5MzA1NzQxMSwiaWF0IjoxNzc4NjAwNTQyLCJleHAiOjE4MTAxMzY1NDIsImlzcyI6InB1Yi04MTcxMzIiLCJzdWIiOiJkaXNhYmxlX2VtYWlsIn0.a-ZCuoaxPSiRfjwXqTGXMvz8CVx9PtHUKgJUofWM4bA&all_sections=true>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
X-Mailgun-Variables: {"category": "post", "email_generated_at": "1778600542423", "is_freemail":
 "true", "post_audience": "everyone", "post_id": "193057411", "post_type":
 "newsletter", "pub_community_enabled": "true", "publication_id": "817132",
 "subdomain": "bytebytego", "user_id": "273622398"}

--4ab31664e347ebfd114edecc807314f5068de783ab49fc95df7282a7b955
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

View this post on the web at https://blog.bytebytego.com/p/how-figma-upgrad=
ed-data-pipeline

Harness engineering for agentic code review (Sponsored) [ https://substack.=
com/redirect/ba4d0cbb-1659-42ea-835a-00e16b4b9ee2?j=3DeyJ1IjoiNGl3b2U2In0.s=
VDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Zs ]
Underneath every review sits a purpose-built, independent context engine. I=
t=E2=80=99s the layer that decides what the agent actually sees before a si=
ngle token of generation happens.
Purpose-built because code review demands a different context than chat or =
autocomplete: placing the relevant context fragments assembled for each rev=
iew.
The engine assembles inputs across four planes:
Sandbox. Cloned repo, dependency analysis, multi-repo context and linters/S=
AST (ESLint, Semgrep) running on the change.
Review instructions. Your coding guidelines, AGENTS.md, path, and AST-scope=
d rules, tone, and learnings from past reviews.
Integrations. MCP tools, issue trackers (Jira, Linear), CI/CD failures, and=
 web search.
LLMs. Routing across OpenAI and Anthropic.
In 2020, Figma=E2=80=99s data synchronization architecture was about five l=
ines of logic. A cron job ran once a day, queried every row from a database=
 table, dumped it into S3, and loaded it into Snowflake.
It was straightforward, easy to reason about, and it worked.
Three years later, that same simplicity was costing Figma millions of dolla=
rs a year and leaving their analytics team looking at data that was already=
 days old by the time they could query it.
For reference, Figma is a collaborative design platform where teams create,=
 prototype, and iterate on user interfaces together in real time. If you=E2=
=80=99ve used a modern app or website, there=E2=80=99s a high chance the sc=
reens were designed in Figma or that Figma was part of the workflow.
Since its early days, the product has expanded well beyond its core design =
tool. FigJam added collaborative whiteboarding in 2021. Dev Mode launched i=
n 2023 to bridge the gap between designers and developers. Figma Make broug=
ht AI-powered app prototyping into the mix. The company also localized for =
the Brazilian, Japanese, Spanish, and Korean markets.
All of that growth meant an explosion in the volume and complexity of data =
flowing through Figma=E2=80=99s systems every day.
In this article, we will learn what happened as Figma grew and how its engi=
neering team handled the growth in terms of the data pipeline issues.
Disclaimer: This post is based on publicly shared details from the Figma En=
gineering Team. Please comment if you notice any inaccuracies.
When SELECT * Becomes Your Bottleneck
Figma=E2=80=99s original data pipeline did what=E2=80=99s called a full syn=
c. Every run copied the entire contents of a database table, regardless of =
how much had actually changed since the last run. If a table had ten millio=
n rows and only fifty changed that day, the pipeline still copied all ten m=
illion. When tables are small, this is fast and cheap.
To start with, Figma=E2=80=99s production databases were hosted on Amazon R=
DS PostgreSQL and served live user traffic. Every time someone opens a file=
, saves a change, or loads a project, those databases handle the request. R=
unning heavy analytical queries on these same databases, things like comput=
ing company-wide KPIs or analyzing usage trends across millions of users, w=
ould compete with live traffic and slow down the product. So like most comp=
anies at this scale, Figma maintains a separate analytics warehouse in Snow=
flake, a database built specifically for these kinds of large, complex quer=
ies. The catch is that data has to get from one to the other. That transfer=
 is the synchronization pipeline.
But Figma=E2=80=99s tables didn=E2=80=99t stay small.
As mentioned, between 2021 and 2025, they launched FigJam, Dev Mode, Figma =
Make, and expanded localization to serve the Brazilian, Japanese, Spanish, =
and Korean markets. The user base grew rapidly, and so did the data.
By 2023, daily synchronization tasks were taking around six hours to comple=
te. The largest tables took several days. To make things worse, the pipelin=
e required dedicated database replicas just to handle the export load witho=
ut affecting production traffic. Those replicas alone cost millions of doll=
ars annually.
Figma evaluated three options to handle this:
They could keep the existing system, but sync delays and replica costs made=
 that untenable.
They could add parallelism to speed up the full copies, but this was a band=
-aid that wouldn=E2=80=99t scale as tables continued to grow.
Or they could overhaul the pipeline entirely.
They chose the overhaul, committing to incremental synchronization. Instead=
 of copying entire tables every run, they=E2=80=99d capture only what chang=
ed and apply those changes to the destination. The concept is simple, but t=
he execution is not.
Incremental Synchronization
Incremental synchronization flips the model. Rather than asking =E2=80=9Cwh=
at does the whole table look like right now?=E2=80=9D it asks =E2=80=9Cwhat=
 changed since last time?=E2=80=9D Only the inserts, updates, and deletes s=
ince the last sync get transferred and applied. For a table with ten millio=
n rows where fifty changed, you=E2=80=99re now moving fifty rows instead of=
 ten million.
The mechanism that makes this possible is called Change Data Capture, or CD=
C. Every database keeps an internal log of every write operation, known as =
the write-ahead log, for its own crash-recovery purposes. CDC reads that lo=
g and converts it into a stream of change events. This does not add overhea=
d to the database, and we are piggybacking on bookkeeping that the database=
 is already doing.
The diagram below shows how CDC works on a high-level:
Those change events need somewhere to go. Figma uses Kafka, a distributed s=
treaming platform that acts as a buffer between the production database and=
 Snowflake.
As CDC captures changes, it publishes them to Kafka topics, one topic per t=
able. Snowflake then consumes from those topics at its own pace. This decou=
pling ensures that the production database doesn=E2=80=99t need to know or =
care whether Snowflake is online, busy, or behind. It just writes events to=
 Kafka, and Kafka holds onto them until the consumer is ready. If Snowflake=
 goes down for maintenance, no data is lost. The events queue up in Kafka a=
nd get processed once Snowflake comes back.
One point to note, however, is that the stream only captures changes from t=
he moment you start listening. It doesn=E2=80=99t contain the full history =
of the table. So on day one, the destination database is empty, and the cha=
nge stream only knows about changes happening right now. There is a need fo=
r a starting point.
That starting point is a snapshot. In this approach, we take a full copy of=
 the table at a specific moment in time, then start applying changes from b=
efore that moment forward. Here=E2=80=99s why the timing matters. For examp=
le, Ssy Figma kicks off a snapshot export at 2:00 AM, and the export takes =
two hours to complete. During those two hours, users are still active. Reco=
rds are being created, updated, and deleted. The snapshot finishes at 4:00 =
AM, but it only reflects the state of the table as of 2:00 AM. If the chang=
e stream starts capturing events at 4:00 AM, every change between 2:00 and =
4:00 AM is lost. The destination table will be missing two hours of data, w=
ith no error to flag the gap. To avoid this, Figma ensures the Kafka CDC st=
ream=E2=80=99s start offset precedes the snapshot timestamp. That overlap m=
eans some events will be duplicates of what=E2=80=99s already in the snapsh=
ot, but duplicates can be handled during the merge step. Missing data canno=
t.
Figma also had to decide whether to buy an off-the-shelf solution or build =
its own setup. They evaluated vendor options seriously and found three prob=
lems:
Generic CDC tools couldn=E2=80=99t leverage Amazon RDS-specific APIs, like =
the ability to export snapshots directly to S3 without maintaining a separa=
te database replica.
Vendor pricing at Figma=E2=80=99s scale came out to five to ten times more =
than an in-house build.
The tools they evaluated couldn=E2=80=99t reliably handle Figma=E2=80=99s d=
ata volume, which was still growing.
Therefore, they assembled their pipeline from lower-level components:
Amazon RDS handles snapshot exports to S3.
Kafka streams the CDC events.
Snowflake stored procedures perform the incremental merge, in other words, =
applying the stream of changes to bring the destination tables up to date.
Merge jobs run on a configurable schedule, defaulting to every three hours.
See the diagram below:
That three-hour default is a deliberate design choice, not a limitation. Mo=
re frequent merges mean fresher data but higher Snowflake compute costs. Fi=
gma lets teams override the default where it matters. Their billing pipelin=
e, for example, runs on 30-minute merge cycles. Each team pays only for the=
 freshness they actually need.
Trust But Verify
Building the pipeline is half the job. The other half is knowing whether it=
=E2=80=99s actually working correctly.
Data pipelines can fail in ways multiple ways that don=E2=80=99t produce er=
rors. For example:
A partial failure during a snapshot export
A misconfigured CDC connector
An unexpected data format from the source.
These issues don=E2=80=99t crash the pipeline. They just produce wrong data=
=2E And wrong data in an analytics ware=
house leads to wrong KPIs, wrong busin=
ess decisions, and a slow erosion of trust in the entire data platform.
Figma=E2=80=99s answer to this scenario is quite rigorous. They built a ded=
icated validation workflow that clones the live base table, runs the entire=
 bootstrap process independently into a temporary schema, aligns both copie=
s to the same point in time using CDC data, and then compares them cell by =
cell. This runs weekly for every table in the pipeline. Most teams settle f=
or row-count checks or sampling. Figma treats its analytical warehouse with=
 the same correctness guarantees you=E2=80=99d expect from a production dat=
abase.
The reason this approach works is independence. If a bug exists somewhere i=
n the main pipeline, say a CDC connector silently drops certain types of up=
date events, any validation that reuses the same pipeline path would inheri=
t the same bug. The corrupted data would match the corrupted check, and eve=
rything would look fine. By bootstrapping a completely separate copy throug=
h an independent process and comparing the two, Figma guarantees that an er=
ror in one path can=E2=80=99t silently pass the other=E2=80=99s checks.
Figma also built a zero-downtime re-bootstrap capability by versioning all =
bootstrap artifacts except the final user-facing view. When schemas evolve,=
 or a full re-bootstrap is needed, the new version is built in parallel and=
 promoted via an atomic view update. Live queries are never disrupted.
The other piece that holds it all together is automation. Figma structured =
its automation into two tiers:
First-level automations handle the actual execution. You give them a table =
name, and they run the bootstrap or validation and alert if something goes =
wrong.
Second-level automations sit above and decide when to trigger the first tie=
r. A controller workflow checks every few hours for new tables that need on=
boarding. A dispatcher workflow kicks off validation for each table weekly.
The system is largely self-operating, and developers get involved only when=
 alerts fire.
The payoff came early. One week into testing in their staging environment, =
the automated re-bootstrap routine caught a severe failure mode. Had it rea=
ched production, it would have triggered a site-wide outage lasting at leas=
t twenty minutes. The old system, a daily cron job with no automated valida=
tion, could never have caught this.
Conclusion
The numbers tell the story quite clearly:
Data freshness went from 30-plus hours to under three hours, with the optio=
n to configure it down to minutes.
The pipeline handles tables over ten times larger than the old system could=
 manage, with consistent and predictable performance.
Eliminating the dedicated export replicas produced multimillion-dollar annu=
al savings.
Operations have seen zero major incidents during and after launch.
Beyond raw performance, the rebuild unlocked new capabilities.
For example, a sync-on-demand CLI tool lets developers trigger immediate sy=
nchronization outside the regular schedule. CDC data is now exposed to end =
users, so developers can query the full change history of any entity and no=
t just its current state. During incident response, this means questions li=
ke =E2=80=9Cshow me every change to this user=E2=80=99s record in the last =
48 hours=E2=80=9D get answered in minutes.
However, this project took a significant investment of time, effort, and re=
sources.
The new system is much more complex than a daily cron job. Figma compensate=
d with aggressive automation and validation, but that=E2=80=99s additional =
complexity layered on top. Ultimately, this tradeoff was worth it at Figma=
=E2=80=99s scale.
References:
From multi-day latency to near real-time insights: Figma=E2=80=99s Data Pip=
eline Upgrade [ https://substack.com/redirect/23749fa2-9497-492b-b01e-1af96=
c716931?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Zs=
 ]
Change Data Capture [ https://substack.com/redirect/80f02142-8c58-4185-ad1e=
-988cd85270a9?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZi=
fRB-Zs ]

Unsubscribe https://substack.com/redirect/2/eyJlIjoiaHR0cHM6Ly9ibG9nLmJ5dGV=
ieXRlZ28uY29tL2FjdGlvbi9kaXNhYmxlX2VtYWlsP3Rva2VuPWV5SjFjMlZ5WDJsa0lqb3lOek=
0yTWpJek9UZ3NJbkJ2YzNSZmFXUWlPakU1TXpBMU56UXhNU3dpYVdGMElqb3hOemM0TmpBd05UU=
XlMQ0psZUhBaU9qRTRNVEF4TXpZMU5ESXNJbWx6Y3lJNkluQjFZaTA0TVRjeE16SWlMQ0p6ZFdJ=
aU9pSmthWE5oWW14bFgyVnRZV2xzSW4wLmEtWkN1b2F4UFNpUmZqd1hxVEdYTXZ6OENWeDlQdEh=
VS2dKVW9mV000YkEiLCJwIjoxOTMwNTc0MTEsInMiOjgxNzEzMiwiZiI6dHJ1ZSwidSI6MjczNj=
IyMzk4LCJpYXQiOjE3Nzg2MDA1NDIsImV4cCI6MjA5NDE3NjU0MiwiaXNzIjoicHViLTAiLCJzd=
WIiOiJsaW5rLXJlZGlyZWN0In0.iXX2Rfg9CjsPdpjJFw2OgUPYHO4frYGHsH4QwwIy8kA?
--4ab31664e347ebfd114edecc807314f5068de783ab49fc95df7282a7b955
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

<html lang=3D"en" dir=3D"ltr" style=3D"scrollbar-width: thin;scrollbar-colo=
r: rgb(219,219,219)rgb(255,255,255);"><head><meta charset=3D"utf-8"><title>=
How Figma Upgraded Data Pipeline from Multi-Day Latency to Real-Time</title=
><style>
@media (max-width: 1024px) {
  .typography .pullquote-align-left,
  .typography.editor .pullquote-align-left,
  .typography .pullquote-align-right,
  .typography.editor .pullquote-align-right,
  .typography .pullquote-align-wide,
  .typography.editor .pullquote-align-wide,
  .typography .pullquote-align-center,
  .typography.editor .pullquote-align-center {
    float: none;
    margin: 0 auto;
    width: 100%;
    max-width: 100%;
  }
}
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
  .typography .markup table.image-wrapper img,
  .typography.editor .markup table.image-wrapper img,
  .typography .markup table.kindle-wrapper img,
  .typography.editor .markup table.kindle-wrapper img {
    max-width: 550px;
  }
}
@media (min-width: 1024px) {
  .typography:not(:has(#toc)) .captioned-image-container figure:has(> a.ima=
ge2-offset-left),
  .typography.editor:not(:has(#toc)) .captioned-image-container figure:has(=
> a.image2-offset-left) {
    margin-left: var(--image-offset-margin);
  }
  .typography:not(:has(#toc)) .captioned-image-container figure:has(> a.ima=
ge2-offset-right),
  .typography.editor:not(:has(#toc)) .captioned-image-container figure:has(=
> a.image2-offset-right) {
    margin-right: var(--image-offset-margin);
  }
}
@media (min-width: 1300px) {
  .typography .captioned-image-container figure:has(> a.image2-offset-left)=
,
  .typography.editor .captioned-image-container figure:has(> a.image2-offse=
t-left) {
    margin-left: var(--image-offset-margin);
  }
  .typography .captioned-image-container figure:has(> a.image2-offset-right=
),
  .typography.editor .captioned-image-container figure:has(> a.image2-offse=
t-right) {
    margin-right: var(--image-offset-margin);
  }
}
@media (max-width: 1024px) {
  .typography,
  .typography.editor {
    /* Disable offset on mobile/tablet */
  }
  .typography .captioned-image-container figure:has(> a.image2-align-left),
  .typography.editor .captioned-image-container figure:has(> a.image2-align=
-left),
  .typography .captioned-image-container figure:has(> a.image2-align-right)=
,
  .typography.editor .captioned-image-container figure:has(> a.image2-align=
-right) {
    float: none;
    margin: 1em auto;
    max-width: 100%;
    width: auto;
    padding: 0;
  }
  .typography .captioned-image-container figure:has(> a.image2-align-left.t=
hefp),
  .typography.editor .captioned-image-container figure:has(> a.image2-align=
-left.thefp),
  .typography .captioned-image-container figure:has(> a.image2-align-right.=
thefp),
  .typography.editor .captioned-image-container figure:has(> a.image2-align=
-right.thefp) {
    margin: 1em auto;
  }
  .typography .captioned-image-container figure:has(> a.image2-offset-left)=
,
  .typography.editor .captioned-image-container figure:has(> a.image2-offse=
t-left),
  .typography .captioned-image-container figure:has(> a.image2-offset-right=
),
  .typography.editor .captioned-image-container figure:has(> a.image2-offse=
t-right) {
    margin: 1em auto;
  }
  .typography .captioned-image-container figure:has(> a.image2-align-left) =
=2Eimage2-inset,
  .typography.editor .captioned-image-container figure:has(> a.image2-align=
-left) .image2-inset,
  .typography .captioned-image-container figure:has(> a.image2-align-right)=
 .image2-inset,
  .typography.editor .captioned-image-container figure:has(> a.image2-align=
-right) .image2-inset {
    display: block;
    justify-content: initial;
  }
}
@media (max-width: 768px) {
  .typography .markup div.sponsorship-campaign-embed,
  .typography.editor .markup div.sponsorship-campaign-embed {
    margin-top: 24px;
    margin-bottom: 24px;
  }
  .typography .markup div.sponsorship-campaign-embed:first-child,
  .typography.editor .markup div.sponsorship-campaign-embed:first-child {
    margin-top: 0px;
  }
}
@media screen and (max-width: 650px) {
  .typography .markup div.youtube-overlay,
  .typography.editor .markup div.youtube-overlay,
  .typography .markup div.vimeo-overlay,
  .typography.editor .markup div.vimeo-overlay {
    display: none !important;
  }
}
@media screen and (max-width: 370px) {
  .typography .markup div.tiktok-wrap,
  .typography.editor .markup div.tiktok-wrap {
    width: calc(95vw - 32px);
    height: calc((95vw - 32px - 2px) / 0.485714);
  }
}
@media screen and (max-width: 650px) {
  .typography .markup div.embedded-publication-wrap .embedded-publication.s=
how-subscribe,
  .typography.editor .markup div.embedded-publication-wrap .embedded-public=
ation.show-subscribe {
    padding: 24px;
  }
}
@media screen and (max-width: 650px) {
  .typography .markup div.subscription-widget-wrap .subscription-widget.sho=
w-subscribe,
  .typography.editor .markup div.subscription-widget-wrap .subscription-wid=
get.show-subscribe,
  .typography .markup div.subscription-widget-wrap-editor .subscription-wid=
get.show-subscribe,
  .typography.editor .markup div.subscription-widget-wrap-editor .subscript=
ion-widget.show-subscribe,
  .typography .markup div.captioned-button-wrap .subscription-widget.show-s=
ubscribe,
  .typography.editor .markup div.captioned-button-wrap .subscription-widget=
=2Eshow-subscribe {
    padding: 0px 24px;
  }
}
@media screen and (max-width: 650px) {
  .typography .markup div.subscription-widget-wrap .subscription-widget.sho=
w-subscribe .subscription-widget-subscribe .button,
  .typography.editor .markup div.subscription-widget-wrap .subscription-wid=
get.show-subscribe .subscription-widget-subscribe .button,
  .typography .markup div.subscription-widget-wrap-editor .subscription-wid=
get.show-subscribe .subscription-widget-subscribe .button,
  .typography.editor .markup div.subscription-widget-wrap-editor .subscript=
ion-widget.show-subscribe .subscription-widget-subscribe .button,
  .typography .markup div.captioned-button-wrap .subscription-widget.show-s=
ubscribe .subscription-widget-subscribe .button,
  .typography.editor .markup div.captioned-button-wrap .subscription-widget=
=2Eshow-subscribe .subscription-widget-subscribe .button {
    padding: 10px 12px;
    min-width: 110px;
  }
}
@media (max-width: 650px) {
  .typography .markup .twitter-embed,
  .typography.editor .markup .twitter-embed,
  .typography .markup .tweet,
  .typography.editor .markup .tweet {
    padding: 12px;
  }
}
@media (max-width: 650px) {
  .typography .markup .twitter-embed .tweet-text,
  .typography.editor .markup .twitter-embed .tweet-text,
  .typography .markup .tweet .tweet-text,
  .typography.editor .markup .tweet .tweet-text {
    font-size: 14px;
    line-height: 20px;
  }
}
@media (max-width: 650px) {
  .typography .markup .twitter-embed .tweet-photos-container.two,
  .typography.editor .markup .twitter-embed .tweet-photos-container.two,
  .typography .markup .tweet .tweet-photos-container.two,
  .typography.editor .markup .tweet .tweet-photos-container.two,
  .typography .markup .twitter-embed .tweet-photos-container.three,
  .typography.editor .markup .twitter-embed .tweet-photos-container.three,
  .typography .markup .tweet .tweet-photos-container.three,
  .typography.editor .markup .tweet .tweet-photos-container.three,
  .typography .markup .twitter-embed .tweet-photos-container.four,
  .typography.editor .markup .twitter-embed .tweet-photos-container.four,
  .typography .markup .tweet .tweet-photos-container.four,
  .typography.editor .markup .tweet .tweet-photos-container.four {
    height: 200px;
  }
}
@media (max-width: 650px) {
  .typography .markup .twitter-embed a.expanded-link .expanded-link-img,
  .typography.editor .markup .twitter-embed a.expanded-link .expanded-link-=
img,
  .typography .markup .tweet a.expanded-link .expanded-link-img,
  .typography.editor .markup .tweet a.expanded-link .expanded-link-img {
    max-height: 180px;
  }
}
@media (max-width: 650px) {
  .typography .markup .twitter-embed a.expanded-link .expanded-link-descrip=
tion,
  .typography.editor .markup .twitter-embed a.expanded-link .expanded-link-=
description,
  .typography .markup .tweet a.expanded-link .expanded-link-description,
  .typography.editor .markup .tweet a.expanded-link .expanded-link-descript=
ion {
    display: none;
  }
}
@media screen and (max-width: 650px) {
  .typography .markup .apple-podcast-container,
  .typography.editor .markup .apple-podcast-container {
    width: unset;
  }
}
@media (max-width: 420px) {
  .typography .markup .install-substack-app-embed img.install-substack-app-=
embed-img,
  .typography.editor .markup .install-substack-app-embed img.install-substa=
ck-app-embed-img {
    margin: 0 auto 16px auto;
  }
}
@media (max-width: 420px) {
  .typography .markup .install-substack-app-embed .install-substack-app-emb=
ed-text,
  .typography.editor .markup .install-substack-app-embed .install-substack-=
app-embed-text {
    margin: 0 0 12px 0;
    max-width: 100%;
    width: auto;
    text-align: center;
  }
}
@media (max-width: 420px) {
  .typography .markup .install-substack-app-embed .install-substack-app-emb=
ed-link,
  .typography.editor .markup .install-substack-app-embed .install-substack-=
app-embed-link {
    display: flex;
    justify-content: center;
  }
}
@media screen and (min-width: 481px) {
  .share-button-container {
    height: 38px;
  }
}
@media screen and (min-width: 481px) {
  .share-button-container a.comment {
    height: 38px;
    line-height: 38px;
    padding-right: 10px;
  }
}
@media screen and (max-width: 480px) {
  .share-button-container .separator {
    display: block;
    margin: 0;
    height: 8px;
    border-left: none;
  }
}
@media screen and (max-width: 480px) {
  .share-button-container a.share.first img {
    padding-left: 0;
  }
}
@media screen and (min-width: 481px) {
  .share-button-container a.mobile {
    display: none !important;
  }
}
@media screen and (min-width: 541px) {
  .settings-add-pub-modal-wrapper .container .add-recommending-pub-modal-co=
ntainer {
    padding: 36px;
    height: 680px;
  }
}
@media screen and (min-width: 541px) {
  .settings-add-pub-modal-wrapper .container .add-recommending-pub-modal-co=
ntainer .footer {
    position: absolute;
    bottom: 36px;
    margin: 0px;
  }
}
@media screen and (max-width: 650px) {
  .header-anchor-parent {
    display: none;
  }
}
@media screen and (max-width: 768px) {
  .post {
    padding: 16px 0 0 0;
  }
}
@media screen and (max-width: 650px) {
  .post .post-header .post-label {
    margin-top: 8px;
  }
}
@media screen and (max-width: 650px) {
  .post .post-header .meta-author-wrap.alternative-meta .meta-right-column =
=2Epost-meta {
    margin-top: 6px;
  }
}
@media screen and (max-width: 650px) {
  .post .footer-facepile-container {
    height: 64px;
    padding: 0 16px;
    display: flex;
    align-items: center;
    justify-content: flex-start;
    width: 100%;
  }
}
@media screen and (max-width: 650px) {
  .post .post-footer.use-separators {
    justify-content: center;
  }
}
@media screen and (max-width: 650px) {
  .post .post-footer.next-prev {
    height: 64px;
    justify-content: space-between;
    box-sizing: border-box;
  }
}
@media screen and (max-width: 650px) {
  .post-contributor-footer .post-contributor-bio-table {
    display: block;
  }
  .post-contributor-footer .post-contributor-bio-table-row {
    display: flex;
    flex-direction: row;
  }
  .post-contributor-footer .post-contributor-bio-userhead-cell,
  .post-contributor-footer .post-contributor-bio-body-cell {
    display: block;
  }
  .post-contributor-footer .post-contributor-bio-body-cell {
    flex-grow: 1;
  }
  .post-contributor-footer .post-contributor-bio-body-table {
    display: block;
  }
  .post-contributor-footer .post-contributor-bio-body-table-row {
    display: block;
  }
  .post-contributor-footer .post-contributor-bio-copy-cell,
  .post-contributor-footer .post-contributor-bio-controls-cell {
    display: block;
  }
  .post-contributor-footer .post-contributor-bio-copy-cell {
    margin: 0 0 16px 0;
  }
  .post-contributor-footer .post-contributor-bio-controls-cell {
    width: auto;
  }
  .post-contributor-footer .post-contributor-bio-controls {
    margin: auto;
  }
  .post-contributor-footer .post-contributor-bio-controls .button.primary {
    width: 100%;
  }
  .post-contributor-footer .post-contributor-bio-text {
    font-size: 14px;
  }
}
@media screen and (min-width: 768px) {
  .post-silhouette {
    padding: 32px 0;
  }
}
@media screen and (max-width: 650px) {
  .post-silhouette .post-silhouette-title {
    margin-top: 10.44225025px;
    height: 120px;
  }
}
@media screen and (max-width: 650px) {
  .post-silhouette .post-silhouette-meta {
    width: 75%;
  }
}
@media screen and (max-width: 650px) {
  .post-silhouette .post-silhouette-meta.with-byline-image {
    margin: 20px 0;
  }
}
@media screen and (max-width: 650px) {
  .use-theme-bg .post-meta.alternative-meta .post-meta-item,
  .post-meta.alternative-meta .post-meta-item {
    padding-right: 16px;
  }
}
@media screen and (max-width: 370px) {
  .use-theme-bg .post-meta.alternative-meta .post-meta-item,
  .post-meta.alternative-meta .post-meta-item {
    font-size: 14px;
  }
}
@media screen and (max-width: 650px) {
  .use-theme-bg .post-meta.alternative-meta .post-meta-item.guest-author-pu=
blication,
  .post-meta.alternative-meta .post-meta-item.guest-author-publication {
    display: none;
  }
}
@media screen and (max-width: 370px) {
  .post-meta .post-meta-item .post-meta-button {
    height: 36px !important;
    /* important to override in-line height style on emails */
  }
  .post-meta .post-meta-item .post-meta-button .meta-button-label {
    display: none;
  }
  .post-meta .post-meta-item .post-meta-button > svg {
    margin-right: 0;
  }
}
@media screen and (max-width: 370px) {
  .post-meta .post-meta-item {
    font-size: 12px;
  }
}
@media screen and (max-width: 650px) {
  .post .floating-subscribe-button {
    bottom: 20px;
    right: 20px;
  }
}
@media (max-width: 1024px) {
  body .pullquote-align-left,
  body .pullquote-align-right,
  body .pullquote-align-wide,
  body .pullquote-align-center {
    float: none;
    margin: 0 auto;
    width: 100%;
    max-width: 100%;
  }
}
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
  body .markup table.image-wrapper img,
  body .markup table.kindle-wrapper img {
    max-width: 550px;
  }
}
@media (min-width: 1024px) {
  body:not(:has(#toc)) .captioned-image-container figure:has(> a.image2-off=
set-left) {
    margin-left: var(--image-offset-margin);
  }
  body:not(:has(#toc)) .captioned-image-container figure:has(> a.image2-off=
set-right) {
    margin-right: var(--image-offset-margin);
  }
}
@media (min-width: 1300px) {
  body .captioned-image-container figure:has(> a.image2-offset-left) {
    margin-left: var(--image-offset-margin);
  }
  body .captioned-image-container figure:has(> a.image2-offset-right) {
    margin-right: var(--image-offset-margin);
  }
}
@media (max-width: 1024px) {
  body {
    /* Disable offset on mobile/tablet */
  }
  body .captioned-image-container figure:has(> a.image2-align-left),
  body .captioned-image-container figure:has(> a.image2-align-right) {
    float: none;
    margin: 1em auto;
    max-width: 100%;
    width: auto;
    padding: 0;
  }
  body .captioned-image-container figure:has(> a.image2-align-left.thefp),
  body .captioned-image-container figure:has(> a.image2-align-right.thefp) =
{
    margin: 1em auto;
  }
  body .captioned-image-container figure:has(> a.image2-offset-left),
  body .captioned-image-container figure:has(> a.image2-offset-right) {
    margin: 1em auto;
  }
  body .captioned-image-container figure:has(> a.image2-align-left) .image2=
-inset,
  body .captioned-image-container figure:has(> a.image2-align-right) .image=
2-inset {
    display: block;
    justify-content: initial;
  }
}
@media (max-width: 768px) {
  body .markup div.sponsorship-campaign-embed {
    margin-top: 24px;
    margin-bottom: 24px;
  }
  body .markup div.sponsorship-campaign-embed:first-child {
    margin-top: 0px;
  }
}
@media screen and (max-width: 650px) {
  body .markup div.youtube-overlay,
  body .markup div.vimeo-overlay {
    display: none !important;
  }
}
@media screen and (max-width: 370px) {
  body .markup div.tiktok-wrap {
    width: calc(95vw - 32px);
    height: calc((95vw - 32px - 2px) / 0.485714);
  }
}
@media screen and (max-width: 650px) {
  body .markup div.embedded-publication-wrap .embedded-publication.show-sub=
scribe {
    padding: 24px;
  }
}
@media screen and (max-width: 650px) {
  body .markup div.subscription-widget-wrap .subscription-widget.show-subsc=
ribe,
  body .markup div.subscription-widget-wrap-editor .subscription-widget.sho=
w-subscribe,
  body .markup div.captioned-button-wrap .subscription-widget.show-subscrib=
e {
    padding: 0px 24px;
  }
}
@media screen and (max-width: 650px) {
  body .markup div.subscription-widget-wrap .subscription-widget.show-subsc=
ribe .subscription-widget-subscribe .button,
  body .markup div.subscription-widget-wrap-editor .subscription-widget.sho=
w-subscribe .subscription-widget-subscribe .button,
  body .markup div.captioned-button-wrap .subscription-widget.show-subscrib=
e .subscription-widget-subscribe .button {
    padding: 10px 12px;
    min-width: 110px;
  }
}
@media (max-width: 650px) {
  body .markup .twitter-embed,
  body .markup .tweet {
    padding: 12px;
  }
}
@media (max-width: 650px) {
  body .markup .twitter-embed .tweet-text,
  body .markup .tweet .tweet-text {
    font-size: 14px;
    line-height: 20px;
  }
}
@media (max-width: 650px) {
  body .markup .twitter-embed .tweet-photos-container.two,
  body .markup .tweet .tweet-photos-container.two,
  body .markup .twitter-embed .tweet-photos-container.three,
  body .markup .tweet .tweet-photos-container.three,
  body .markup .twitter-embed .tweet-photos-container.four,
  body .markup .tweet .tweet-photos-container.four {
    height: 200px;
  }
}
@media (max-width: 650px) {
  body .markup .twitter-embed a.expanded-link .expanded-link-img,
  body .markup .tweet a.expanded-link .expanded-link-img {
    max-height: 180px;
  }
}
@media (max-width: 650px) {
  body .markup .twitter-embed a.expanded-link .expanded-link-description,
  body .markup .tweet a.expanded-link .expanded-link-description {
    display: none;
  }
}
@media screen and (max-width: 650px) {
  body .markup .apple-podcast-container {
    width: unset;
  }
}
@media (max-width: 420px) {
  body .markup .install-substack-app-embed img.install-substack-app-embed-i=
mg {
    margin: 0 auto 16px auto;
  }
}
@media (max-width: 420px) {
  body .markup .install-substack-app-embed .install-substack-app-embed-text=
 {
    margin: 0 0 12px 0;
    max-width: 100%;
    width: auto;
    text-align: center;
  }
}
@media (max-width: 420px) {
  body .markup .install-substack-app-embed .install-substack-app-embed-link=
 {
    display: flex;
    justify-content: center;
  }
}
@media screen and (min-width: 500px) {
  body .header a.logo {
    width: 42px;
    height: 42px;
    border-radius: 12px;
  }
}
@media screen and (max-width: 420px) {
  body .subscription-receipt table:first-of-type .subscription-amount .subs=
cription-discount {
    width: 72px !important;
  }
}
@media screen and (min-width: 481px) {
  body .share-button-container {
    height: auto;
  }
}
@media screen and (max-width: 480px) {
  body .share-button-container .separator {
    display: block !important;
    margin: 0 !important;
    height: 8px !important;
    border-left: none !important;
  }
}
@media screen and (max-width: 650px) {
  .digest .item .post-meta-item.audience {
    display: none;
  }
}
@media screen and (min-width: 500px) {
  .digest-publication .logo img {
    width: 42px;
    height: 42px;
    border-radius: 8px;
  }
}
@media screen and (max-width: 650px) {
  .comments-page .container .comment-list .collapsed-reply {
    margin-left: calc(10 + 32px - 24px);
  }
}
@media screen and (max-width: 650px) {
  .comment > .comment-list {
    padding-left: 24px;
  }
}
@media screen and (max-width: 650px) {
  .finish-magic-login-modal .modal-content .container {
    padding: 24px 0;
  }
}
@media (max-width: 650px) {
  .reader2-text-b3 {
    line-height: 24px;
  }
}
@media screen and (max-width: 650px) {
  .reader2-text-h4 {
    line-height: 24px;
  }
}
@media screen and (min-width: 541px) {
  .user-profile-modal {
    padding-left: 12px;
    padding-right: 12px;
  }
}
@media screen and (max-width: 650px) {
  .subscribe-widget form.form .sideBySideWrap button.rightButton {
    padding: 10px 12px;
  }
}
@media screen and (min-width: 541px) {
  .pub-icon:hover .logo-hover,
  .feed-item-icon:hover .logo-hover {
    display: block;
  }
}
@media screen and (max-width: 650px) {
  .post-ufi.single-full-width-button .post-ufi-button-wrapper {
    width: 100%;
    padding: 16px;
  }
  .post-ufi.single-full-width-button .post-ufi-button-wrapper:empty {
    display: none;
  }
  .post-ufi.single-full-width-button .post-ufi-button {
    width: 100%;
    justify-content: center;
  }
}
@media screen and (max-width: 768px) {
  .file-embed-wrapper {
    padding: 0;
  }
}
@media screen and (max-width: 768px) {
  .file-embed-wrapper-editor {
    padding: 0;
  }
}
@media screen and (max-width: 768px) {
  .file-embed-wrapper-editor:active {
    padding: 0;
  }
}
@media only screen and (max-width: 650px) {
  .file-embed-button.wide,
  .file-embed-error-button.wide {
    display: none;
  }
}
@media only screen and (min-width: 630px) {
  .file-embed-button.narrow,
  .file-embed-error-button.narrow {
    display: none;
  }
}
@media screen and (min-width: 541px) {
  .audio-player-wrapper .audio-player {
    min-width: 500px;
  }
}
@media screen and (max-width: 650px) {
  .audio-player-wrapper .audio-player .audio-player-progress {
    border-left-width: 16px;
    border-right-width: 16px;
  }
}
@media screen and (max-width: 650px) {
  .audio-player-wrapper .audio-player .audio-player-progress .audio-player-=
progress-bar .audio-player-progress-bar-popup {
    top: -54px;
  }
}
@media screen and (max-width: 650px) {
  .audio-player-wrapper-fancy .audio-player .audio-player-progress {
    border-left-width: 16px;
    border-right-width: 16px;
  }
}
@media screen and (max-width: 650px) {
  .audio-player-wrapper-fancy .audio-player .audio-player-progress .audio-p=
layer-progress-bar .audio-player-progress-bar-popup {
    top: -54px;
  }
}
@media (min-width: 250px) {
  .audio-player-wrapper-fancy .audio-player {
    padding: 32px;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group {
    display: flex;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group .button:last-of-type=
 {
    display: block;
  }
}
@media (min-width: 300px) {
  .audio-player-wrapper-fancy .audio-player .btn-group {
    display: block;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group .button:first-of-typ=
e {
    display: block;
  }
}
@media (min-width: 350px) {
  .audio-player-wrapper-fancy .audio-player .audio-player-substack-logo {
    display: block;
  }
  .audio-player-wrapper-fancy .audio-player .audio-player-title {
    margin-top: 16px;
  }
  .audio-player-wrapper-fancy .audio-player .audio-player-hero-image-contai=
ner {
    padding-top: 15%;
    width: 15%;
    display: block;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group .button:first-of-typ=
e {
    display: block;
  }
  .audio-player-wrapper-fancy .audio-player .audio-player-substack-logo {
    display: block;
  }
}
@media (min-width: 350px) {
  .audio-player-wrapper-fancy .audio-player .audio-player-hero-image-contai=
ner {
    padding-top: 25%;
    width: 25%;
    display: block;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group {
    display: flex;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group .button:first-of-typ=
e {
    display: block;
  }
}
@media (min-width: 400px) {
  .audio-player-wrapper-fancy .audio-player .audio-player-hero-image-contai=
ner {
    padding-top: 40%;
    width: 40%;
  }
}
@media (max-width: 400px) {
  .audio-player-wrapper-fancy .audio-player .btn-group {
    margin-top: 12px;
  }
  .audio-player-wrapper-fancy .audio-player .btn-group .button {
    font-size: 13px;
    padding: 6px 12px;
    height: auto;
    margin-top: 10px;
  }
}
@media (min-width: 600px) {
  .audio-player-wrapper-fancy .audio-player .audio-player-hero-image-contai=
ner {
    padding-top: 55%;
    width: 55%;
  }
}
@media (max-width: 650px) {
  .poll-editor-modal {
    min-width: calc(100% - 20px);
  }
}
@media (max-width: 750px) {
  .poll-embed .poll-anchor-target .poll-anchor-copy-button {
    left: 8px;
    top: 45px;
  }
}
@media not all and (min-resolution: 0.001dpcm) {
  @supports (-webkit-appearance: none) {
    p a:not(.primary.button),
    .post p:not(.button-wrapper) a:not(.primary.button),
    .footnote a.footnote-anchor:not(.primary.button),
    .thread-head .markup p:not(.button-wrapper) a:not(.primary.button) {
      color: #7756e3;
      text-decoration: none;
    }
    p a:not(.primary.button):hover,
    .post p:not(.button-wrapper) a:not(.primary.button):hover,
    .footnote a.footnote-anchor:not(.primary.button):hover,
    .thread-head .markup p:not(.button-wrapper) a:not(.primary.button):hove=
r {
      text-decoration: underline;
    }
  }
}</style></head><body class=3D"email-body" style=3D"font-kerning: auto;--im=
age-offset-margin: -120px;"><img src=3D"https://eotrx.substackcdn.com/o/37d=
b86acf3aae582/p.gif?token=3DeyJtIjoiPDIwMjYwNTEyMTUzMTAzLjMuZmZkM2FlN2NkNDM=
2OWJhMEBtZy1kMS5zdWJzdGFjay5jb20-IiwidSI6MjczNjIyMzk4LCJyIjoidGpwaHVoc0BnbW=
FpbC5jb20iLCJkIjoibWctZDEuc3Vic3RhY2suY29tIiwicCI6MTkzMDU3NDExLCJ0IjoibmV3c=
2xldHRlciIsImEiOiJldmVyeW9uZSIsInMiOjgxNzEzMiwiYyI6InBvc3QiLCJmIjp0cnVlLCJw=
b3NpdGlvbiI6InRvcCIsImlhdCI6MTc3ODYwMDU0MiwiZXhwIjoxNzgxMTkyNTQyLCJpc3MiOiJ=
wdWItMCIsInN1YiI6ImVvIn0.aCC1ifhPGim_IjD0Sb8l06aS2EA5SPv7rlvwI8INmX0" alt=
=3D"" width=3D"1" height=3D"1" border=3D"0" style=3D"height:1px !important;=
width:1px !important;border-width:0 !important;margin-top:0 !important;marg=
in-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;p=
adding-top:0 !important;padding-bottom:0 !important;padding-right:0 !import=
ant;padding-left:0 !important;"/><div class=3D"preview" style=3D"display:no=
ne;font-size:1px;color:#333333;line-height:1px;max-height:0px;max-width:0px=
;opacity:0;overflow:hidden;">In this article, we will learn what happened a=
s Figma grew and how its engineering team handled the growth in terms of th=
e data pipeline issues.</div><div class=3D"preview" style=3D"display:none;f=
ont-size:1px;color:#333333;line-height:1px;max-height:0px;max-width:0px;opa=
city:0;overflow:hidden;">&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; =
&#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp;=
 &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#84=
7; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &=
#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; =
&#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847=
; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#=
173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &=
#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847;=
 &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#1=
73;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#=
8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; =
&nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#17=
3;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8=
199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &=
nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173=
;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#81=
99; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &n=
bsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;=
&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#819=
9; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nb=
sp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&=
#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199=
; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbs=
p; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#=
847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199;=
 &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp=
; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#8=
47; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; =
&#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp;=
 &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#84=
7; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &=
#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; =
&#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847=
; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#=
173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &=
#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847;=
 &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#1=
73;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#=
8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; =
&nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#17=
3;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8=
199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &=
nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173=
;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#81=
99; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &n=
bsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;=
&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#819=
9; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nb=
sp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&=
#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199=
; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbs=
p; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#=
847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199;=
 &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp=
; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#8=
47; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; =
&#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp;=
 &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#84=
7; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &=
#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; =
&#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847=
; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#=
173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &=
#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847;=
 &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#1=
73;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#=
8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; =
&nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#17=
3;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8=
199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &=
nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173=
;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#81=
99; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &n=
bsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;&#847; &nbsp; &#8199; &#173;=
</div><table class=3D"email-body-container" role=3D"presentation" width=3D"=
100%" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tbody><tr><td></td>=
<td class=3D"content" width=3D"550"></td><td></td></tr><tr><td></td><td cla=
ss=3D"content" width=3D"550" align=3D"left"><div style=3D"font-size: 16px;l=
ine-height: 26px;max-width: 550px;width: 100%;margin: 0 auto;overflow-wrap:=
 break-word;"><table role=3D"presentation" width=3D"100%" border=3D"0" cell=
spacing=3D"0" cellpadding=3D"0"><tbody><tr><td align=3D"right" style=3D"hei=
ght:20px;"><table role=3D"presentation" width=3D"auto" border=3D"0" cellspa=
cing=3D"0" cellpadding=3D"0"><tbody><tr><td style=3D"vertical-align:middle;=
"><span class=3D"pencraft pc-reset reset-IxiVJZ tw-font-body tw-text-ssm tw=
-text-substack-secondary" style=3D"font-family: SF Pro Text, -apple-system,=
 system-ui, BlinkMacSystemFont, Inter, Segoe UI, Roboto, Helvetica, Arial, =
sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;font-size: 1=
3px;color: unset;list-style: none;text-decoration: unset;margin: 0;"><div c=
lass=3D"pencraft pc-reset align-right-VJbKw5 size-12-mmZ61m reset-IxiVJZ" s=
tyle=3D"list-style: none;color: unset;text-align: right;font-size: 12px;lin=
e-height: 16px;text-decoration: unset;margin: 0;"><span class=3D"pencraft p=
c-reset reset-IxiVJZ" translated=3D"" style=3D"list-style: none;color: unse=
t;text-decoration: unset;margin: 0;">Forwarded this email? <a class=3D"penc=
raft pc-reset decoration-underline-ClTkYc reset-IxiVJZ" href=3D"https://sub=
stack.com/redirect/2/eyJlIjoiaHR0cHM6Ly9ibG9nLmJ5dGVieXRlZ28uY29tL3N1YnNjcm=
liZT91dG1fc291cmNlPWVtYWlsJnV0bV9jYW1wYWlnbj1lbWFpbC1zdWJzY3JpYmUmcj00aXdvZ=
TYmbmV4dD1odHRwcyUzQSUyRiUyRmJsb2cuYnl0ZWJ5dGVnby5jb20lMkZwJTJGaG93LWZpZ21h=
LXVwZ3JhZGVkLWRhdGEtcGlwZWxpbmUiLCJwIjoxOTMwNTc0MTEsInMiOjgxNzEzMiwiZiI6dHJ=
1ZSwidSI6MjczNjIyMzk4LCJpYXQiOjE3Nzg2MDA1NDIsImV4cCI6MjA5NDE3NjU0MiwiaXNzIj=
oicHViLTAiLCJzdWIiOiJsaW5rLXJlZGlyZWN0In0.aswNtjgo1dFBkfiihlk2IxTv9HCjOdeMa=
Ll3Dt-pD1Q?" style=3D"list-style: none;color: unset;text-decoration: unset;=
margin: 0;-webkit-text-decoration-line: underline;text-decoration-line: und=
erline;">Subscribe here</a> for more</span></div></span></td></tr></tbody><=
/table></td></tr></tbody></table><div class=3D"post typography" dir=3D"auto=
" style=3D"--image-offset-margin: -120px;padding: 32px 0 0 0;font-size: 16p=
x;line-height: 26px;"><div class=3D"post-header" role=3D"region" aria-label=
=3D"Post header" style=3D"font-size: 16px;line-height: 26px;"><h1 class=3D"=
post-title published title-X77sOw" dir=3D"auto" style=3D"direction: auto;te=
xt-align: start;unicode-bidi: isolate;color: rgb(54,55,55);font-family: 'SF=
 Pro Display',-apple-system-headline,system-ui,-apple-system,BlinkMacSystem=
Font,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Sego=
e UI Emoji','Segoe UI Symbol';font-weight: bold;-webkit-font-smoothing: ant=
ialiased;-moz-osx-font-smoothing: antialiased;-webkit-appearance: optimizel=
egibility;-moz-appearance: optimizelegibility;appearance: optimizelegibilit=
y;margin: 0;line-height: 36px;font-size: 32px;"><a href=3D"https://substack=
=2Ecom/app-link/post?publication_id=3D=
817132&post_id=3D193057411&utm_source=
=3Dpost-email-title&utm_campaign=3Demail-post-title&isFreemail=3Dtrue&r=3D4=
iwoe6&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTgsInBvc3RfaWQiOjE5MzA1NzQxMSwiaWF0I=
joxNzc4NjAwNTQyLCJleHAiOjE3ODExOTI1NDIsImlzcyI6InB1Yi04MTcxMzIiLCJzdWIiOiJw=
b3N0LXJlYWN0aW9uIn0.ysvQESGwWPnILoHPcsf7vXlLgzgBP5F1-uBKLhH5sPo" style=3D"c=
olor: rgb(54,55,55);text-decoration: none;">How Figma Upgraded Data Pipelin=
e from Multi-Day Latency to Real-Time</a></h1><table class=3D"post-meta" ro=
le=3D"presentation" width=3D"100%" border=3D"0" cellspacing=3D"0" cellpaddi=
ng=3D"0" style=3D"margin: 1em 0;height: 20px;align-items: center;"><tbody><=
tr><td><table role=3D"presentation" width=3D"auto" border=3D"0" cellspacing=
=3D"0" cellpadding=3D"0"><tbody><tr><td><table role=3D"presentation" width=
=3D"auto" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tbody><tr><td s=
tyle=3D"vertical-align:middle;"><div class=3D"pencraft pc-reset color-prima=
ry-zABazT line-height-20-t4M0El font-meta-MWBumP size-11-NuY2Zx weight-medi=
um-fw81nC transform-uppercase-yKDgcq reset-IxiVJZ meta-EgzBVA custom-css-em=
ail-post-author" style=3D"list-style: none;font-size: 11px;line-height: 20p=
x;text-decoration: unset;color: rgb(54,55,55);margin: 0;font-family: 'SF Co=
mpact',-apple-system,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',=
Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Seg=
oe UI Symbol';font-weight: 500;text-transform: uppercase;letter-spacing: .2=
px;"><a class=3D"pencraft pc-reset color-primary-zABazT line-height-20-t4M0=
El font-meta-MWBumP size-11-NuY2Zx weight-medium-fw81nC transform-uppercase=
-yKDgcq reset-IxiVJZ meta-EgzBVA" style=3D"list-style: none;color: rgb(54,5=
5,55);margin: 0;font-size: 11px;line-height: 20px;font-family: 'SF Compact'=
,-apple-system,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto=
,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI =
Symbol';font-weight: 500;text-transform: uppercase;letter-spacing: .2px;tex=
t-decoration: none" href=3D"https://substack.com/@bytebytego399569">ByteByt=
eGo</a></div></td></tr></tbody></table></td></tr><tr><td><table role=3D"pre=
sentation" width=3D"auto" border=3D"0" cellspacing=3D"0" cellpadding=3D"0">=
<tbody><tr><td style=3D"vertical-align:middle;"><div class=3D"pencraft pc-r=
eset color-secondary-ls1g8s line-height-20-t4M0El font-meta-MWBumP size-11-=
NuY2Zx weight-medium-fw81nC transform-uppercase-yKDgcq reset-IxiVJZ meta-Eg=
zBVA" style=3D"list-style: none;font-size: 11px;line-height: 20px;text-deco=
ration: unset;color: rgb(119,119,119);margin: 0;font-family: 'SF Compact',-=
apple-system,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,H=
elvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Sy=
mbol';font-weight: 500;text-transform: uppercase;letter-spacing: .2px;"><ti=
me datetime=3D"2026-05-12T15:31:03.724Z">May 12</time></div></td></tr></tbo=
dy></table></td></tr></tbody></table></td><td align=3D"right"><table role=
=3D"presentation" width=3D"auto" border=3D"0" cellspacing=3D"0" cellpadding=
=3D"0"><tbody><tr><td style=3D"vertical-align:middle;"><a href=3D"https://s=
ubstack.com/@bytebytego399569"><img class=3D"custom-css-email-avatar avatar=
-QIQ5yR" src=3D"https://substackcdn.com/image/fetch/$s_!U1Ej!,f_auto,q_auto=
:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.c=
om%2Fpublic%2Fimages%2Fc9941c68-e5b7-4b93-be75-df7cc4ffef02_504x540.png" st=
yle=3D"box-sizing: border-box;max-width: 550px;border: none;vertical-align:=
 middle;width: 40px;height: 40px;min-width: 40px;min-height: 40px;object-fi=
t: cover;margin: 0px;display: inline;border-radius: 50%" width=3D"40" heigh=
t=3D"40"></a></td></tr></tbody></table></td></tr></tbody></table><table cla=
ss=3D"email-ufi-2-top" role=3D"presentation" width=3D"100%" border=3D"0" ce=
llspacing=3D"0" cellpadding=3D"0" style=3D"border-top: 1px solid rgb(0,0,0,=
=2E1);border-bottom: 1px solid rgb(0,0,=
0,.1);min-width: 100%;"><tbody><tr hei=
ght=3D"16"><td height=3D"16" style=3D"font-size:0px;line-height:0;">&nbsp;<=
/td></tr><tr><td><table role=3D"presentation" width=3D"100%" border=3D"0" c=
ellspacing=3D"0" cellpadding=3D"0"><tbody><tr><td><table role=3D"presentati=
on" width=3D"auto" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tbody>=
<tr><td style=3D"vertical-align:middle;"><table role=3D"presentation" width=
=3D"38" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tbody><tr><td ali=
gn=3D"center"><a class=3D"email-icon-button" href=3D"https://substack.com/a=
pp-link/post?publication_id=3D817132&post_id=3D193057411&utm_source=3Dsubst=
ack&isFreemail=3Dtrue&submitLike=3Dtrue&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTg=
sInBvc3RfaWQiOjE5MzA1NzQxMSwicmVhY3Rpb24iOiLinaQiLCJpYXQiOjE3Nzg2MDA1NDIsIm=
V4cCI6MTc4MTE5MjU0MiwiaXNzIjoicHViLTgxNzEzMiIsInN1YiI6InJlYWN0aW9uIn0.D_X5y=
83G74obiYMA88R_Atjos2pYl3Uq_QaJnTUUxg4&utm_medium=3Demail&utm_campaign=3Dem=
ail-reaction&r=3D4iwoe6" style=3D"font-family: system-ui,-apple-system,Blin=
kMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Em=
oji','Segoe UI Emoji','Segoe UI Symbol';display: inline-block;font-weight: =
500;border: 1px solid rgb(0,0,0,.1);border-radius: 9999px;text-transform: u=
ppercase;font-size: 12px;line-height: 1;padding: 9px 0;text-decoration: non=
e;color: rgb(119,119,119);min-width: 38px;box-sizing: border-box;width: 38p=
x"><img class=3D"icon" src=3D"https://substackcdn.com/image/fetch/$s_!PeVs!=
,w_36,c_scale,f_png,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack=
=2Ecom%2Ficon%2FLucideHeart%3Fv%3D4%26h=
eight%3D36%26fill%3Dnone%26stroke%3D%2=
523808080%26strokeWidth%3D2" width=3D"18" height=3D"18" style=3D"border: no=
ne;vertical-align: middle;max-width: 18px" alt=3D""></a></td></tr></tbody><=
/table></td><td width=3D"8" style=3D"min-width:8px;"></td><td style=3D"vert=
ical-align:middle;"><table role=3D"presentation" width=3D"38" border=3D"0" =
cellspacing=3D"0" cellpadding=3D"0"><tbody><tr><td align=3D"center"><a clas=
s=3D"email-icon-button" href=3D"https://substack.com/app-link/post?publicat=
ion_id=3D817132&post_id=3D193057411&utm_source=3Dsubstack&utm_medium=3Demai=
l&isFreemail=3Dtrue&comments=3Dtrue&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTgsInB=
vc3RfaWQiOjE5MzA1NzQxMSwiaWF0IjoxNzc4NjAwNTQyLCJleHAiOjE3ODExOTI1NDIsImlzcy=
I6InB1Yi04MTcxMzIiLCJzdWIiOiJwb3N0LXJlYWN0aW9uIn0.ysvQESGwWPnILoHPcsf7vXlLg=
zgBP5F1-uBKLhH5sPo&r=3D4iwoe6&utm_campaign=3Demail-half-magic-comments&acti=
on=3Dpost-comment&utm_source=3Dsubstack&utm_medium=3Demail" style=3D"font-f=
amily: system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helveti=
ca,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';=
display: inline-block;font-weight: 500;border: 1px solid rgb(0,0,0,.1);bord=
er-radius: 9999px;text-transform: uppercase;font-size: 12px;line-height: 1;=
padding: 9px 0;text-decoration: none;color: rgb(119,119,119);min-width: 38p=
x;box-sizing: border-box;width: 38px"><img class=3D"icon" src=3D"https://su=
bstackcdn.com/image/fetch/$s_!x1tS!,w_36,c_scale,f_png,q_auto:good,fl_progr=
essive:steep/https%3A%2F%2Fsubstack.com%2Ficon%2FLucideComments%3Fv%3D4%26h=
eight%3D36%26fill%3Dnone%26stroke%3D%2523808080%26strokeWidth%3D2" width=3D=
"18" height=3D"18" style=3D"border: none;vertical-align: middle;max-width: =
18px" alt=3D""></a></td></tr></tbody></table></td><td width=3D"8" style=3D"=
min-width:8px;"></td><td style=3D"vertical-align:middle;"><table role=3D"pr=
esentation" width=3D"38" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"><=
tbody><tr><td align=3D"center"><a class=3D"email-icon-button" href=3D"https=
://substack.com/app-link/post?publication_id=3D817132&post_id=3D193057411&u=
tm_source=3Dsubstack&utm_medium=3Demail&utm_content=3Dshare&utm_campaign=3D=
email-share&action=3Dshare&triggerShare=3Dtrue&isFreemail=3Dtrue&r=3D4iwoe6=
&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTgsInBvc3RfaWQiOjE5MzA1NzQxMSwiaWF0IjoxNz=
c4NjAwNTQyLCJleHAiOjE3ODExOTI1NDIsImlzcyI6InB1Yi04MTcxMzIiLCJzdWIiOiJwb3N0L=
XJlYWN0aW9uIn0.ysvQESGwWPnILoHPcsf7vXlLgzgBP5F1-uBKLhH5sPo" style=3D"font-f=
amily: system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helveti=
ca,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';=
display: inline-block;font-weight: 500;border: 1px solid rgb(0,0,0,.1);bord=
er-radius: 9999px;text-transform: uppercase;font-size: 12px;line-height: 1;=
padding: 9px 0;text-decoration: none;color: rgb(119,119,119);min-width: 38p=
x;box-sizing: border-box;width: 38px"><img class=3D"icon" src=3D"https://su=
bstackcdn.com/image/fetch/$s_!_L14!,w_36,c_scale,f_png,q_auto:good,fl_progr=
essive:steep/https%3A%2F%2Fsubstack.com%2Ficon%2FLucideShare2%3Fv%3D4%26hei=
ght%3D36%26fill%3Dnone%26stroke%3D%2523808080%26strokeWidth%3D2" width=3D"1=
8" height=3D"18" style=3D"border: none;vertical-align: middle;max-width: 18=
px" alt=3D""></a></td></tr></tbody></table></td><td width=3D"8" style=3D"mi=
n-width:8px;"></td><td style=3D"vertical-align:middle;"><table role=3D"pres=
entation" width=3D"38" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tb=
ody><tr><td align=3D"center"><a class=3D"email-icon-button" href=3D"https:/=
/substack.com/redirect/2/eyJlIjoiaHR0cHM6Ly9vcGVuLnN1YnN0YWNrLmNvbS9wdWIvYn=
l0ZWJ5dGVnby9wL2hvdy1maWdtYS11cGdyYWRlZC1kYXRhLXBpcGVsaW5lP3V0bV9zb3VyY2U9c=
3Vic3RhY2smdXRtX21lZGl1bT1lbWFpbCZ1dG1fY2FtcGFpZ249ZW1haWwtcmVzdGFjay1jb21t=
ZW50JmFjdGlvbj1yZXN0YWNrLWNvbW1lbnQmcj00aXdvZTYmdG9rZW49ZXlKMWMyVnlYMmxrSWp=
veU56TTJNakl6T1Rnc0luQnZjM1JmYVdRaU9qRTVNekExTnpReE1Td2lhV0YwSWpveE56YzROak=
F3TlRReUxDSmxlSEFpT2pFM09ERXhPVEkxTkRJc0ltbHpjeUk2SW5CMVlpMDRNVGN4TXpJaUxDS=
npkV0lpT2lKd2IzTjBMWEpsWVdOMGFXOXVJbjAueXN2UUVTR3dXUG5JTG9IUGNzZjd2WGxMZ3pn=
QlA1RjEtdUJLTGhINXNQbyIsInAiOjE5MzA1NzQxMSwicyI6ODE3MTMyLCJmIjp0cnVlLCJ1Ijo=
yNzM2MjIzOTgsImlhdCI6MTc3ODYwMDU0MiwiZXhwIjoyMDk0MTc2NTQyLCJpc3MiOiJwdWItMC=
IsInN1YiI6ImxpbmstcmVkaXJlY3QifQ.wiTojRezRAPYi9IO3q-QNgTKaKCyiOVDldtByMbGeY=
A?&utm_source=3Dsubstack&utm_medium=3Demail" style=3D"font-family: system-u=
i,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-s=
erif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';display: inline=
-block;font-weight: 500;border: 1px solid rgb(0,0,0,.1);border-radius: 9999=
px;text-transform: uppercase;font-size: 12px;line-height: 1;padding: 9px 0;=
text-decoration: none;color: rgb(119,119,119);min-width: 38px;box-sizing: b=
order-box;width: 38px"><img class=3D"icon" src=3D"https://substackcdn.com/i=
mage/fetch/$s_!ubXF!,w_36,c_scale,f_png,q_auto:good,fl_progressive:steep/ht=
tps%3A%2F%2Fsubstack.com%2Ficon%2Fnotes__NoteRestackIcon%3Fv%3D4%26height%3=
D36%26fill%3Dnone%26stroke%3D%2523808080%26strokeWidth%3D2%26strokeLinecap%=
3Dround%26strokeLinejoin%3Dround" width=3D"18" height=3D"18" alt=3D"" style=
=3D"max-width: 550px;border: none !important;vertical-align: middle;"></a><=
/td></tr></tbody></table></td></tr></tbody></table></td><td align=3D"right"=
><table role=3D"presentation" width=3D"auto" border=3D"0" cellspacing=3D"0"=
 cellpadding=3D"0"><tbody><tr><td style=3D"vertical-align:middle;"><table r=
ole=3D"presentation" width=3D"auto" border=3D"0" cellspacing=3D"0" cellpadd=
ing=3D"0"><tbody><tr><td align=3D"center"><a class=3D"email-button-outline"=
 href=3D"https://open.substack.com/pub/bytebytego/p/how-figma-upgraded-data=
-pipeline?utm_source=3Demail&redirect=3Dapp-store&utm_campaign=3Demail-read=
-in-app" style=3D"font-family: system-ui,-apple-system,BlinkMacSystemFont,'=
Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI E=
moji','Segoe UI Symbol';display: inline-block;font-weight: 500;border: 1px =
solid rgb(0,0,0,.1);border-radius: 9999px;text-transform: uppercase;font-si=
ze: 12px;line-height: 12px;padding: 9px 14px;text-decoration: none;color: r=
gb(119,119,119);"><div class=3D"email-button-spacer" style=3D"font-size: 16=
px;line-height: 26px;display: inline-block;vertical-align: middle;max-width=
: 0;min-height: 18px;"></div><span class=3D"email-button-text" style=3D"ver=
tical-align: middle;margin-right: 4px">READ IN APP</span><img class=3D"icon=
 text-icon" src=3D"https://substackcdn.com/image/fetch/$s_!ET-_!,w_36,c_sca=
le,f_png,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Ficon=
%2FLucideArrowUpRight%3Fv%3D4%26height%3D36%26fill%3Dnone%26stroke%3D%25238=
08080%26strokeWidth%3D2" width=3D"18" height=3D"18" style=3D"min-width: 18p=
x;min-height: 18px;border: none;vertical-align: middle;margin-right: 0;marg=
in-left: 0;max-width: 18px" alt=3D""></a></td></tr></tbody></table></td></t=
r></tbody></table></td></tr></tbody></table></td></tr><tr height=3D"16"><td=
 height=3D"16" style=3D"font-size:0px;line-height:0;">&nbsp;</td></tr></tbo=
dy></table></div></div><div class=3D"post typography" dir=3D"auto" style=3D=
"--image-offset-margin: -120px;padding: 32px 0 0 0;font-size: 16px;line-hei=
ght: 26px;"><div class=3D"body markup" dir=3D"auto" style=3D"text-align: in=
itial;font-size: 16px;line-height: 26px;width: 100%;word-break: break-word;=
margin-bottom: 16px;"><h2 class=3D"header-anchor-post" style=3D"position: r=
elative;font-family: 'SF Pro Display',-apple-system-headline,system-ui,-app=
le-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'=
Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight: bold;-we=
bkit-font-smoothing: antialiased;-moz-osx-font-smoothing: antialiased;-webk=
it-appearance: optimizelegibility;-moz-appearance: optimizelegibility;appea=
rance: optimizelegibility;margin: 1em 0 0.625em 0;color: rgb(54,55,55);line=
-height: 1.16em;font-size: calc(1.625em * 1);margin-top: 0;"><a href=3D"htt=
ps://substack.com/redirect/ba4d0cbb-1659-42ea-835a-00e16b4b9ee2?j=3DeyJ1Ijo=
iNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Zs" style=3D"color: r=
gb(54,55,55);text-decoration: underline;">Harness engineering for agentic c=
ode review (Sponsored)</a></h2><div class=3D"captioned-image-container-stat=
ic" style=3D"font-size: 16px;line-height: 26px;margin: 32px auto;"><figure =
style=3D"width: 100%;margin: 0 auto;"><table class=3D"image-wrapper" width=
=3D"100%" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" data-component-n=
ame=3D"Image2ToDOMStatic" style=3D"mso-padding-alt: 1em 0 1.6em;"><tbody><t=
r><td style=3D"text-align: center;"></td><td class=3D"content" align=3D"lef=
t" width=3D"1456" style=3D"text-align: center;"><a class=3D"image-link" tar=
get=3D"_blank" href=3D"https://substack.com/redirect/ba4d0cbb-1659-42ea-835=
a-00e16b4b9ee2?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZ=
ifRB-Zs" style=3D"position: relative;flex-direction: column;align-items: ce=
nter;padding: 0;width: auto;height: auto;border: none;text-decoration: none=
;display: block;margin: 0;"><img class=3D"wide-image" data-attrs=3D"{&quot;=
src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/=
093afca2-a742-49e0-a152-22a85a661568_3240x3780.png&quot;,&quot;srcNoWaterma=
rk&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;=
height&quot;:1699,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot=
;bytes&quot;:618537,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&=
quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://go.bytebytego.co=
m/Coderabbit_051226&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quo=
t;:true,&quot;internalRedirect&quot;:&quot;https://blog.bytebytego.com/i/19=
3057411?img=3Dhttps%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2=
Fimages%2F093afca2-a742-49e0-a152-22a85a661568_3240x3780.png&quot;,&quot;is=
Processing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" al=
t=3D"" width=3D"550" height=3D"641.7925824175824" src=3D"https://substackcd=
n.com/image/fetch/$s_!COML!,w_1100,c_limit,f_auto,q_auto:good,fl_progressiv=
e:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimage=
s%2F093afca2-a742-49e0-a152-22a85a661568_3240x3780.png" style=3D"border: no=
ne !important;vertical-align: middle;display: block;-ms-interpolation-mode:=
 bicubic;height: auto;margin-bottom: 0;width: auto !important;max-width: 10=
0% !important;margin: 0 auto;"></a></td><td style=3D"text-align: center;"><=
/td></tr></tbody></table></figure></div><p style=3D"margin: 0 0 20px 0;colo=
r: rgb(54,55,55);line-height: 26px;font-size: 16px;">Underneath every revie=
w sits a purpose-built, independent context engine. It&#8217;s the layer th=
at decides what the agent actually sees before a single token of generation=
 happens.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-heigh=
t: 26px;font-size: 16px;">Purpose-built because code review demands a diffe=
rent context than chat or autocomplete: placing the relevant context fragme=
nts assembled for each review.</p><p style=3D"margin: 0 0 20px 0;color: rgb=
(54,55,55);line-height: 26px;font-size: 16px;">The engine assembles inputs =
across four planes:</p><ul style=3D"margin-top: 0;padding: 0;"><li style=3D=
"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(5=
4,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-box;padding-=
left: 4px;font-size: 16px;margin: 0;">Sandbox. Cloned repo, dependency anal=
ysis, multi-repo context and linters/SAST (ESLint, Semgrep) running on the =
change.</p></li><li style=3D"margin: 8px 0 0 32px;mso-special-format: bulle=
t;"><p style=3D"color: rgb(54,55,55);line-height: 26px;margin-bottom: 0;box=
-sizing: border-box;padding-left: 4px;font-size: 16px;margin: 0;">Review in=
structions. Your coding guidelines, AGENTS.md, path, and AST-scoped rules, =
tone, and learnings from past reviews.</p></li><li style=3D"margin: 8px 0 0=
 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);line-he=
ight: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font-s=
ize: 16px;margin: 0;">Integrations. MCP tools, issue trackers (Jira, Linear=
), CI/CD failures, and web search.</p></li><li style=3D"margin: 8px 0 0 32p=
x;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);line-height=
: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font-size:=
 16px;margin: 0;">LLMs. Routing across OpenAI and Anthropic.</p></li></ul><=
p class=3D"button-wrapper" data-attrs=3D"{&quot;url&quot;:&quot;https://go.=
bytebytego.com/Coderabbit_051226&quot;,&quot;text&quot;:&quot;Try For Free&=
quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name=
=3D"ButtonCreateButton" style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);li=
ne-height: 26px;font-size: 16px;text-align: center;cursor: pointer;border-r=
adius: 4px;"><a class=3D"button primary" href=3D"https://substack.com/redir=
ect/ba4d0cbb-1659-42ea-835a-00e16b4b9ee2?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85=
v8kfdamY0krRXGMy3p768BWtuZifRB-Zs" style=3D"font-family: system-ui,-apple-s=
ystem,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Appl=
e Color Emoji','Segoe UI Emoji','Segoe UI Symbol';display: inline-block;box=
-sizing: border-box;cursor: pointer;border: none;border-radius: 8px;font-si=
ze: 14px;line-height: 20px;font-weight: 600;text-align: center;margin: 0;op=
acity: 1;outline: none;white-space: nowrap;color: #ffffff !important;text-d=
ecoration: none !important;background-color: #7756e3;padding: 12px 20px;hei=
ght: auto;"><span style=3D"color: #ffffff;text-decoration: none;">Try For F=
ree</span></a></p><div style=3D"font-size: 16px;line-height: 26px;"><hr sty=
le=3D"margin: 32px 0;padding: 0;height: 1px;background: rgb(0,0,0,.1);borde=
r: none;"></div><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-he=
ight: 26px;font-size: 16px;text-align: justify">In 2020, Figma&#8217;s data=
 synchronization architecture was about five lines of logic. A cron job ran=
 once a day, queried every row from a database table, dumped it into S3, an=
d loaded it into Snowflake.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54=
,55,55);line-height: 26px;font-size: 16px;text-align: justify">It was strai=
ghtforward, easy to reason about, and it worked.</p><p style=3D"margin: 0 0=
 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-align: =
justify">Three years later, that same simplicity was costing Figma millions=
 of dollars a year and leaving their analytics team looking at data that wa=
s already days old by the time they could query it.</p><p style=3D"margin: =
0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-alig=
n: justify">For reference, Figma is a collaborative design platform where t=
eams create, prototype, and iterate on user interfaces together in real tim=
e. If you&#8217;ve used a modern app or website, there&#8217;s a high chanc=
e the screens were designed in Figma or that Figma was part of the workflow=
=2E</p><p style=3D"margin: 0 0 20px 0;co=
lor: rgb(54,55,55);line-height: 26px;=
font-size: 16px;text-align: justify">Since its early days, the product has =
expanded well beyond its core design tool. FigJam added collaborative white=
boarding in 2021. Dev Mode launched in 2023 to bridge the gap between desig=
ners and developers. Figma Make brought AI-powered app prototyping into the=
 mix. The company also localized for the Brazilian, Japanese, Spanish, and =
Korean markets.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line=
-height: 26px;font-size: 16px;text-align: justify">All of that growth meant=
 an explosion in the volume and complexity of data flowing through Figma&#8=
217;s systems every day.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55=
,55);line-height: 26px;font-size: 16px;text-align: justify">In this article=
, we will learn what happened as Figma grew and how its engineering team ha=
ndled the growth in terms of the data pipeline issues.</p><p style=3D"margi=
n: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-a=
lign: justify"><em>Disclaimer: This post is based on publicly shared detail=
s from the Figma Engineering Team. Please comment if you notice any inaccur=
acies.</em></p><h2 class=3D"header-anchor-post" style=3D"position: relative=
;font-family: 'SF Pro Display',-apple-system-headline,system-ui,-apple-syst=
em,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple C=
olor Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight: bold;-webkit-fo=
nt-smoothing: antialiased;-moz-osx-font-smoothing: antialiased;-webkit-appe=
arance: optimizelegibility;-moz-appearance: optimizelegibility;appearance: =
optimizelegibility;margin: 1em 0 0.625em 0;color: rgb(54,55,55);line-height=
: 1.16em;font-size: calc(1.625em * 1);">When SELECT * Becomes Your Bottlene=
ck</h2><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26p=
x;font-size: 16px;text-align: justify">Figma&#8217;s original data pipeline=
 did what&#8217;s called a full sync. Every run copied the entire contents =
of a database table, regardless of how much had actually changed since the =
last run. If a table had ten million rows and only fifty changed that day, =
the pipeline still copied all ten million. When tables are small, this is f=
ast and cheap.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-=
height: 26px;font-size: 16px;text-align: justify">To start with, Figma&#821=
7;s production databases were hosted on Amazon RDS PostgreSQL and served li=
ve user traffic. Every time someone opens a file, saves a change, or loads =
a project, those databases handle the request. Running heavy analytical que=
ries on these same databases, things like computing company-wide KPIs or an=
alyzing usage trends across millions of users, would compete with live traf=
fic and slow down the product. So like most companies at this scale, Figma =
maintains a separate analytics warehouse in Snowflake, a database built spe=
cifically for these kinds of large, complex queries. The catch is that data=
 has to get from one to the other. That transfer is the synchronization pip=
eline.</p><div class=3D"captioned-image-container-static" style=3D"font-siz=
e: 16px;line-height: 26px;margin: 32px auto;"><figure style=3D"width: 100%;=
margin: 0 auto;"><table class=3D"image-wrapper" width=3D"100%" border=3D"0"=
 cellspacing=3D"0" cellpadding=3D"0" data-component-name=3D"Image2ToDOMStat=
ic" style=3D"mso-padding-alt: 1em 0 1.6em;"><tbody><tr><td style=3D"text-al=
ign: center;"></td><td class=3D"content" align=3D"left" width=3D"1456" styl=
e=3D"text-align: center;"><a class=3D"image-link" target=3D"_blank" href=3D=
"https://substack.com/redirect/8b6ff4f5-a662-4124-b0a4-c5dfc328af10?j=3DeyJ=
1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Zs" style=3D"posi=
tion: relative;flex-direction: column;align-items: center;padding: 0;width:=
 auto;height: auto;border: none;text-decoration: none;display: block;margin=
: 0;"><img class=3D"wide-image" data-attrs=3D"{&quot;src&quot;:&quot;https:=
//substack-post-media.s3.amazonaws.com/public/images/48641814-0011-44b5-81e=
5-d031311c05d0_1938x1246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fu=
llscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot=
;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:118020,&qu=
ot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&q=
uot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quo=
t;:false,&quot;internalRedirect&quot;:&quot;https://blog.bytebytego.com/i/1=
93057411?img=3Dhttps%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%=
2Fimages%2F48641814-0011-44b5-81e5-d031311c05d0_1938x1246.png&quot;,&quot;i=
sProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" a=
lt=3D"" width=3D"550" height=3D"353.57142857142856" src=3D"https://substack=
cdn.com/image/fetch/$s_!AWAB!,w_1100,c_limit,f_auto,q_auto:good,fl_progress=
ive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fima=
ges%2F48641814-0011-44b5-81e5-d031311c05d0_1938x1246.png" style=3D"border: =
none !important;vertical-align: middle;display: block;-ms-interpolation-mod=
e: bicubic;height: auto;margin-bottom: 0;width: auto !important;max-width: =
100% !important;margin: 0 auto;"></a></td><td style=3D"text-align: center;"=
></td></tr></tbody></table></figure></div><p style=3D"margin: 0 0 20px 0;co=
lor: rgb(54,55,55);line-height: 26px;font-size: 16px;text-align: justify">B=
ut Figma&#8217;s tables didn&#8217;t stay small.</p><p style=3D"margin: 0 0=
 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-align: =
justify">As mentioned, between 2021 and 2025, they launched FigJam, Dev Mod=
e, Figma Make, and expanded localization to serve the Brazilian, Japanese, =
Spanish, and Korean markets. The user base grew rapidly, and so did the dat=
a.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px=
;font-size: 16px;text-align: justify">By 2023, daily synchronization tasks =
were taking around six hours to complete. The largest tables took several d=
ays. To make things worse, the pipeline required dedicated database replica=
s just to handle the export load without affecting production traffic. Thos=
e replicas alone cost millions of dollars annually.</p><p style=3D"margin: =
0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-alig=
n: justify">Figma evaluated three options to handle this:</p><ul style=3D"m=
argin-top: 0;padding: 0;"><li style=3D"margin: 8px 0 0 32px;mso-special-for=
mat: bullet;"><p style=3D"color: rgb(54,55,55);line-height: 26px;margin-bot=
tom: 0;box-sizing: border-box;padding-left: 4px;font-size: 16px;margin: 0;t=
ext-align: justify">They could keep the existing system, but sync delays an=
d replica costs made that untenable.</p></li><li style=3D"margin: 8px 0 0 3=
2px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);line-heig=
ht: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font-siz=
e: 16px;margin: 0;text-align: justify">They could add parallelism to speed =
up the full copies, but this was a band-aid that wouldn&#8217;t scale as ta=
bles continued to grow.</p></li><li style=3D"margin: 8px 0 0 32px;mso-speci=
al-format: bullet;"><p style=3D"color: rgb(54,55,55);line-height: 26px;marg=
in-bottom: 0;box-sizing: border-box;padding-left: 4px;font-size: 16px;margi=
n: 0;text-align: justify">Or they could overhaul the pipeline entirely.</p>=
</li></ul><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: =
26px;font-size: 16px;text-align: justify">They chose the overhaul, committi=
ng to incremental synchronization. Instead of copying entire tables every r=
un, they&#8217;d capture only what changed and apply those changes to the d=
estination. The concept is simple, but the execution is not.</p><h2 class=
=3D"header-anchor-post" style=3D"position: relative;font-family: 'SF Pro Di=
splay',-apple-system-headline,system-ui,-apple-system,BlinkMacSystemFont,'S=
egoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Em=
oji','Segoe UI Symbol';font-weight: bold;-webkit-font-smoothing: antialiase=
d;-moz-osx-font-smoothing: antialiased;-webkit-appearance: optimizelegibili=
ty;-moz-appearance: optimizelegibility;appearance: optimizelegibility;margi=
n: 1em 0 0.625em 0;color: rgb(54,55,55);line-height: 1.16em;font-size: calc=
(1.625em * 1);text-align: justify">Incremental Synchronization</h2><p style=
=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16=
px;text-align: justify">Incremental synchronization flips the model. Rather=
 than asking &#8220;what does the whole table look like right now?&#8221; i=
t asks &#8220;what changed since last time?&#8221; Only the inserts, update=
s, and deletes since the last sync get transferred and applied. For a table=
 with ten million rows where fifty changed, you&#8217;re now moving fifty r=
ows instead of ten million.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54=
,55,55);line-height: 26px;font-size: 16px;text-align: justify">The mechanis=
m that makes this possible is called Change Data Capture, or CDC. Every dat=
abase keeps an internal log of every write operation, known as the write-ah=
ead log, for its own crash-recovery purposes. CDC reads that log and conver=
ts it into a stream of change events. This does not add overhead to the dat=
abase, and we are piggybacking on bookkeeping that the database is already =
doing.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: =
26px;font-size: 16px;text-align: justify">The diagram below shows how CDC w=
orks on a high-level:</p><div class=3D"captioned-image-container-static" st=
yle=3D"font-size: 16px;line-height: 26px;margin: 32px auto;"><figure style=
=3D"width: 100%;margin: 0 auto;"><table class=3D"image-wrapper" width=3D"10=
0%" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" data-component-name=3D=
"Image2ToDOMStatic" style=3D"mso-padding-alt: 1em 0 1.6em;"><tbody><tr><td =
style=3D"text-align: center;"></td><td class=3D"content" align=3D"left" wid=
th=3D"1456" style=3D"text-align: center;"><a class=3D"image-link" target=3D=
"_blank" href=3D"https://substack.com/redirect/67e43983-c456-4d78-9cf5-44a4=
db1a6892?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Z=
s" style=3D"position: relative;flex-direction: column;align-items: center;p=
adding: 0;width: auto;height: auto;border: none;text-decoration: none;displ=
ay: block;margin: 0;"><img class=3D"wide-image" data-attrs=3D"{&quot;src&qu=
ot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5070bf=
1f-f0ea-414f-9d35-1276cefc933d_2086x2572.png&quot;,&quot;srcNoWatermark&quo=
t;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height=
&quot;:1795,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes=
&quot;:231950,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:=
&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&=
quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.b=
ytebytego.com/i/193057411?img=3Dhttps%3A%2F%2Fsubstack-post-media.s3.amazon=
aws.com%2Fpublic%2Fimages%2F5070bf1f-f0ea-414f-9d35-1276cefc933d_2086x2572.=
png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offse=
t&quot;:false}" alt=3D"" width=3D"550" height=3D"678.0563186813187" src=3D"=
https://substackcdn.com/image/fetch/$s_!aa_c!,w_1100,c_limit,f_auto,q_auto:=
good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.co=
m%2Fpublic%2Fimages%2F5070bf1f-f0ea-414f-9d35-1276cefc933d_2086x2572.png" s=
tyle=3D"border: none !important;vertical-align: middle;display: block;-ms-i=
nterpolation-mode: bicubic;height: auto;margin-bottom: 0;width: auto !impor=
tant;max-width: 100% !important;margin: 0 auto;"></a></td><td style=3D"text=
-align: center;"></td></tr></tbody></table></figure></div><p style=3D"margi=
n: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-a=
lign: justify">Those change events need somewhere to go. Figma uses Kafka, =
a distributed streaming platform that acts as a buffer between the producti=
on database and Snowflake.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,=
55,55);line-height: 26px;font-size: 16px;text-align: justify">As CDC captur=
es changes, it publishes them to Kafka topics, one topic per table. Snowfla=
ke then consumes from those topics at its own pace. This decoupling ensures=
 that the production database doesn&#8217;t need to know or care whether Sn=
owflake is online, busy, or behind. It just writes events to Kafka, and Kaf=
ka holds onto them until the consumer is ready. If Snowflake goes down for =
maintenance, no data is lost. The events queue up in Kafka and get processe=
d once Snowflake comes back.</p><p style=3D"margin: 0 0 20px 0;color: rgb(5=
4,55,55);line-height: 26px;font-size: 16px;text-align: justify">One point t=
o note, however, is that the stream only captures changes from the moment y=
ou start listening. It doesn&#8217;t contain the full history of the table.=
 So on day one, the destination database is empty, and the change stream on=
ly knows about changes happening right now. There is a need for a starting =
point.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: =
26px;font-size: 16px;text-align: justify">That starting point is a snapshot=
=2E In this approach, we take a full co=
py of the table at a specific moment i=
n time, then start applying changes from before that moment forward. Here&#=
8217;s why the timing matters. For example, Ssy Figma kicks off a snapshot =
export at 2:00 AM, and the export takes two hours to complete. During those=
 two hours, users are still active. Records are being created, updated, and=
 deleted. The snapshot finishes at 4:00 AM, but it only reflects the state =
of the table as of 2:00 AM. If the change stream starts capturing events at=
 4:00 AM, every change between 2:00 and 4:00 AM is lost. The destination ta=
ble will be missing two hours of data, with no error to flag the gap. To av=
oid this, Figma ensures the Kafka CDC stream&#8217;s start offset precedes =
the snapshot timestamp. That overlap means some events will be duplicates o=
f what&#8217;s already in the snapshot, but duplicates can be handled durin=
g the merge step. Missing data cannot.</p><p style=3D"margin: 0 0 20px 0;co=
lor: rgb(54,55,55);line-height: 26px;font-size: 16px;text-align: justify">F=
igma also had to decide whether to buy an off-the-shelf solution or build i=
ts own setup. They evaluated vendor options seriously and found three probl=
ems:</p><ul style=3D"margin-top: 0;padding: 0;"><li style=3D"margin: 8px 0 =
0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);line-h=
eight: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font-=
size: 16px;margin: 0;text-align: justify">Generic CDC tools couldn&#8217;t =
leverage Amazon RDS-specific APIs, like the ability to export snapshots dir=
ectly to S3 without maintaining a separate database replica.</p></li><li st=
yle=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color:=
 rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-box;pa=
dding-left: 4px;font-size: 16px;margin: 0;text-align: justify">Vendor prici=
ng at Figma&#8217;s scale came out to five to ten times more than an in-hou=
se build.</p></li><li style=3D"margin: 8px 0 0 32px;mso-special-format: bul=
let;"><p style=3D"color: rgb(54,55,55);line-height: 26px;margin-bottom: 0;b=
ox-sizing: border-box;padding-left: 4px;font-size: 16px;margin: 0;text-alig=
n: justify">The tools they evaluated couldn&#8217;t reliably handle Figma&#=
8217;s data volume, which was still growing.</p></li></ul><p style=3D"margi=
n: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-a=
lign: justify">Therefore, they assembled their pipeline from lower-level co=
mponents:</p><ul style=3D"margin-top: 0;padding: 0;"><li style=3D"margin: 8=
px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);l=
ine-height: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;=
font-size: 16px;margin: 0;text-align: justify">Amazon RDS handles snapshot =
exports to S3.</p></li><li style=3D"margin: 8px 0 0 32px;mso-special-format=
: bullet;"><p style=3D"color: rgb(54,55,55);line-height: 26px;margin-bottom=
: 0;box-sizing: border-box;padding-left: 4px;font-size: 16px;margin: 0;text=
-align: justify">Kafka streams the CDC events.</p></li><li style=3D"margin:=
 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55)=
;line-height: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4p=
x;font-size: 16px;margin: 0;text-align: justify">Snowflake stored procedure=
s perform the incremental merge, in other words, applying the stream of cha=
nges to bring the destination tables up to date.</p></li><li style=3D"margi=
n: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,5=
5);line-height: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: =
4px;font-size: 16px;margin: 0;text-align: justify">Merge jobs run on a conf=
igurable schedule, defaulting to every three hours.</p></li></ul><p style=
=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16=
px;text-align: justify">See the diagram below:</p><div class=3D"captioned-i=
mage-container-static" style=3D"font-size: 16px;line-height: 26px;margin: 3=
2px auto;"><figure style=3D"width: 100%;margin: 0 auto;"><table class=3D"im=
age-wrapper" width=3D"100%" border=3D"0" cellspacing=3D"0" cellpadding=3D"0=
" data-component-name=3D"Image2ToDOMStatic" style=3D"mso-padding-alt: 1em 0=
 1.6em;"><tbody><tr><td style=3D"text-align: center;"></td><td class=3D"con=
tent" align=3D"left" width=3D"1456" style=3D"text-align: center;"><a class=
=3D"image-link" target=3D"_blank" href=3D"https://substack.com/redirect/c50=
65c68-5d21-40b9-a1c3-be24a8ca01ab?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdam=
Y0krRXGMy3p768BWtuZifRB-Zs" style=3D"position: relative;flex-direction: col=
umn;align-items: center;padding: 0;width: auto;height: auto;border: none;te=
xt-decoration: none;display: block;margin: 0;"><img class=3D"wide-image" da=
ta-attrs=3D"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws=
=2Ecom/public/images/85e21def-74c8-411a=
-a7a1-c4b35ed6b178_2404x1334.png&quot;=
,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSiz=
e&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1456,&quot;resizeWidt=
h&quot;:null,&quot;bytes&quot;:151537,&quot;alt&quot;:null,&quot;title&quot=
;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;b=
elowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&qu=
ot;:&quot;https://blog.bytebytego.com/i/193057411?img=3Dhttps%3A%2F%2Fsubst=
ack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85e21def-74c8-411a-a7a1=
-c4b35ed6b178_2404x1334.png&quot;,&quot;isProcessing&quot;:false,&quot;alig=
n&quot;:null,&quot;offset&quot;:false}" alt=3D"" width=3D"550" height=3D"30=
5.2197802197802" src=3D"https://substackcdn.com/image/fetch/$s_!aeFj!,w_110=
0,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-po=
st-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85e21def-74c8-411a-a7a1-c4b35=
ed6b178_2404x1334.png" style=3D"border: none !important;vertical-align: mid=
dle;display: block;-ms-interpolation-mode: bicubic;height: auto;margin-bott=
om: 0;width: auto !important;max-width: 100% !important;margin: 0 auto;"></=
a></td><td style=3D"text-align: center;"></td></tr></tbody></table></figure=
></div><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26p=
x;font-size: 16px;text-align: justify">That three-hour default is a deliber=
ate design choice, not a limitation. More frequent merges mean fresher data=
 but higher Snowflake compute costs. Figma lets teams override the default =
where it matters. Their billing pipeline, for example, runs on 30-minute me=
rge cycles. Each team pays only for the freshness they actually need.</p><h=
2 class=3D"header-anchor-post" style=3D"position: relative;font-family: 'SF=
 Pro Display',-apple-system-headline,system-ui,-apple-system,BlinkMacSystem=
Font,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Sego=
e UI Emoji','Segoe UI Symbol';font-weight: bold;-webkit-font-smoothing: ant=
ialiased;-moz-osx-font-smoothing: antialiased;-webkit-appearance: optimizel=
egibility;-moz-appearance: optimizelegibility;appearance: optimizelegibilit=
y;margin: 1em 0 0.625em 0;color: rgb(54,55,55);line-height: 1.16em;font-siz=
e: calc(1.625em * 1);text-align: justify">Trust But Verify</h2><p style=3D"=
margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;t=
ext-align: justify">Building the pipeline is half the job. The other half i=
s knowing whether it&#8217;s actually working correctly.</p><p style=3D"mar=
gin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text=
-align: justify">Data pipelines can fail in ways multiple ways that don&#82=
17;t produce errors. For example:</p><ul style=3D"margin-top: 0;padding: 0;=
"><li style=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=
=3D"color: rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: bor=
der-box;padding-left: 4px;font-size: 16px;margin: 0;text-align: justify">A =
partial failure during a snapshot export</p></li><li style=3D"margin: 8px 0=
 0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);line-=
height: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font=
-size: 16px;margin: 0;text-align: justify">A misconfigured CDC connector</p=
></li><li style=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p sty=
le=3D"color: rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: b=
order-box;padding-left: 4px;font-size: 16px;margin: 0;text-align: justify">=
An unexpected data format from the source.</p></li></ul><p style=3D"margin:=
 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-ali=
gn: justify">These issues don&#8217;t crash the pipeline. They just produce=
 wrong data. And wrong data in an analytics warehouse leads to wrong KPIs, =
wrong business decisions, and a slow erosion of trust in the entire data pl=
atform.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height:=
 26px;font-size: 16px;text-align: justify">Figma&#8217;s answer to this sce=
nario is quite rigorous. They built a dedicated validation workflow that cl=
ones the live base table, runs the entire bootstrap process independently i=
nto a temporary schema, aligns both copies to the same point in time using =
CDC data, and then compares them cell by cell. This runs weekly for every t=
able in the pipeline. Most teams settle for row-count checks or sampling. F=
igma treats its analytical warehouse with the same correctness guarantees y=
ou&#8217;d expect from a production database.</p><p style=3D"margin: 0 0 20=
px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-align: jus=
tify">The reason this approach works is independence. If a bug exists somew=
here in the main pipeline, say a CDC connector silently drops certain types=
 of update events, any validation that reuses the same pipeline path would =
inherit the same bug. The corrupted data would match the corrupted check, a=
nd everything would look fine. By bootstrapping a completely separate copy =
through an independent process and comparing the two, Figma guarantees that=
 an error in one path can&#8217;t silently pass the other&#8217;s checks.</=
p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;fon=
t-size: 16px;text-align: justify">Figma also built a zero-downtime re-boots=
trap capability by versioning all bootstrap artifacts except the final user=
-facing view. When schemas evolve, or a full re-bootstrap is needed, the ne=
w version is built in parallel and promoted via an atomic view update. Live=
 queries are never disrupted.</p><p style=3D"margin: 0 0 20px 0;color: rgb(=
54,55,55);line-height: 26px;font-size: 16px;text-align: justify">The other =
piece that holds it all together is automation. Figma structured its automa=
tion into two tiers:</p><ul style=3D"margin-top: 0;padding: 0;"><li style=
=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: rg=
b(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-box;paddi=
ng-left: 4px;font-size: 16px;margin: 0;text-align: justify">First-level aut=
omations handle the actual execution. You give them a table name, and they =
run the bootstrap or validation and alert if something goes wrong.</p></li>=
<li style=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"=
color: rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-=
box;padding-left: 4px;font-size: 16px;margin: 0;text-align: justify">Second=
-level automations sit above and decide when to trigger the first tier. A c=
ontroller workflow checks every few hours for new tables that need onboardi=
ng. A dispatcher workflow kicks off validation for each table weekly.</p></=
li></ul><div class=3D"captioned-image-container-static" style=3D"font-size:=
 16px;line-height: 26px;margin: 32px auto;"><figure style=3D"width: 100%;ma=
rgin: 0 auto;"><table class=3D"image-wrapper" width=3D"100%" border=3D"0" c=
ellspacing=3D"0" cellpadding=3D"0" data-component-name=3D"Image2ToDOMStatic=
" style=3D"mso-padding-alt: 1em 0 1.6em;"><tbody><tr><td style=3D"text-alig=
n: center;"></td><td class=3D"content" align=3D"left" width=3D"1456" style=
=3D"text-align: center;"><a class=3D"image-link" target=3D"_blank" href=3D"=
https://substack.com/redirect/bc0090bd-a3bb-4c43-aacc-c7add95f84cf?j=3DeyJ1=
IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Zs" style=3D"posit=
ion: relative;flex-direction: column;align-items: center;padding: 0;width: =
auto;height: auto;border: none;text-decoration: none;display: block;margin:=
 0;"><img class=3D"wide-image" data-attrs=3D"{&quot;src&quot;:&quot;https:/=
/substack-post-media.s3.amazonaws.com/public/images/4cae3d9f-2766-4de2-b45b=
-397ae875d137_2944x2020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;ful=
lscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:999,&quot;=
width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:238200,&quo=
t;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&qu=
ot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot=
;:false,&quot;internalRedirect&quot;:&quot;https://blog.bytebytego.com/i/19=
3057411?img=3Dhttps%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2=
Fimages%2F4cae3d9f-2766-4de2-b45b-397ae875d137_2944x2020.png&quot;,&quot;is=
Processing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" al=
t=3D"" width=3D"550" height=3D"377.3695054945055" src=3D"https://substackcd=
n.com/image/fetch/$s_!cubB!,w_1100,c_limit,f_auto,q_auto:good,fl_progressiv=
e:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimage=
s%2F4cae3d9f-2766-4de2-b45b-397ae875d137_2944x2020.png" style=3D"border: no=
ne !important;vertical-align: middle;display: block;-ms-interpolation-mode:=
 bicubic;height: auto;margin-bottom: 0;width: auto !important;max-width: 10=
0% !important;margin: 0 auto;"></a></td><td style=3D"text-align: center;"><=
/td></tr></tbody></table></figure></div><p style=3D"margin: 0 0 20px 0;colo=
r: rgb(54,55,55);line-height: 26px;font-size: 16px;text-align: justify">The=
 system is largely self-operating, and developers get involved only when al=
erts fire.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-heig=
ht: 26px;font-size: 16px;text-align: justify">The payoff came early. One we=
ek into testing in their staging environment, the automated re-bootstrap ro=
utine caught a severe failure mode. Had it reached production, it would hav=
e triggered a site-wide outage lasting at least twenty minutes. The old sys=
tem, a daily cron job with no automated validation, could never have caught=
 this.</p><h2 class=3D"header-anchor-post" style=3D"position: relative;font=
-family: 'SF Pro Display',-apple-system-headline,system-ui,-apple-system,Bl=
inkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color =
Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight: bold;-webkit-font-sm=
oothing: antialiased;-moz-osx-font-smoothing: antialiased;-webkit-appearanc=
e: optimizelegibility;-moz-appearance: optimizelegibility;appearance: optim=
izelegibility;margin: 1em 0 0.625em 0;color: rgb(54,55,55);line-height: 1.1=
6em;font-size: calc(1.625em * 1);text-align: justify">Conclusion</h2><p sty=
le=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: =
16px;text-align: justify">The numbers tell the story quite clearly:</p><ul =
style=3D"margin-top: 0;padding: 0;"><li style=3D"margin: 8px 0 0 32px;mso-s=
pecial-format: bullet;"><p style=3D"color: rgb(54,55,55);line-height: 26px;=
margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font-size: 16px;m=
argin: 0;text-align: justify">Data freshness went from 30-plus hours to und=
er three hours, with the option to configure it down to minutes.</p></li><l=
i style=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"co=
lor: rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-bo=
x;padding-left: 4px;font-size: 16px;margin: 0;text-align: justify">The pipe=
line handles tables over ten times larger than the old system could manage,=
 with consistent and predictable performance.</p></li><li style=3D"margin: =
8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);=
line-height: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px=
;font-size: 16px;margin: 0;text-align: justify">Eliminating the dedicated e=
xport replicas produced multimillion-dollar annual savings.</p></li><li sty=
le=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"color: =
rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-box;pad=
ding-left: 4px;font-size: 16px;margin: 0;text-align: justify">Operations ha=
ve seen zero major incidents during and after launch.</p></li></ul><p style=
=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16=
px;text-align: justify">Beyond raw performance, the rebuild unlocked new ca=
pabilities.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-hei=
ght: 26px;font-size: 16px;text-align: justify">For example, a sync-on-deman=
d CLI tool lets developers trigger immediate synchronization outside the re=
gular schedule. CDC data is now exposed to end users, so developers can que=
ry the full change history of any entity and not just its current state. Du=
ring incident response, this means questions like &#8220;show me every chan=
ge to this user&#8217;s record in the last 48 hours&#8221; get answered in =
minutes.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,55,55);line-height=
: 26px;font-size: 16px;text-align: justify">However, this project took a si=
gnificant investment of time, effort, and resources.</p><p style=3D"margin:=
 0 0 20px 0;color: rgb(54,55,55);line-height: 26px;font-size: 16px;text-ali=
gn: justify">The new system is much more complex than a daily cron job. Fig=
ma compensated with aggressive automation and validation, but that&#8217;s =
additional complexity layered on top. Ultimately, this tradeoff was worth i=
t at Figma&#8217;s scale.</p><p style=3D"margin: 0 0 20px 0;color: rgb(54,5=
5,55);line-height: 26px;font-size: 16px;text-align: justify"><strong>Refere=
nces:</strong></p><ul style=3D"margin-top: 0;padding: 0;margin-bottom: 0;">=
<li style=3D"margin: 8px 0 0 32px;mso-special-format: bullet;"><p style=3D"=
color: rgb(54,55,55);line-height: 26px;margin-bottom: 0;box-sizing: border-=
box;padding-left: 4px;font-size: 16px;margin: 0;"><a href=3D"https://substa=
ck.com/redirect/23749fa2-9497-492b-b01e-1af96c716931?j=3DeyJ1IjoiNGl3b2U2In=
0.sVDxRtmZ85v8kfdamY0krRXGMy3p768BWtuZifRB-Zs" style=3D"color: #7756e3;text=
-decoration: none;">From multi-day latency to near real-time insights: Figm=
a&#8217;s Data Pipeline Upgrade</a></p></li><li style=3D"margin: 8px 0 0 32=
px;mso-special-format: bullet;"><p style=3D"color: rgb(54,55,55);line-heigh=
t: 26px;margin-bottom: 0;box-sizing: border-box;padding-left: 4px;font-size=
: 16px;margin: 0;"><a href=3D"https://substack.com/redirect/80f02142-8c58-4=
185-ad1e-988cd85270a9?j=3DeyJ1IjoiNGl3b2U2In0.sVDxRtmZ85v8kfdamY0krRXGMy3p7=
68BWtuZifRB-Zs" style=3D"color: #7756e3;text-decoration: none;">Change Data=
 Capture</a></p></li></ul></div></div><div class=3D"postscript-placeholder"=
 style=3D"margin: 32px 0 0;width: 100%;box-sizing: border-box;font-size: 16=
px;line-height: 26px;"></div><table class=3D"email-ufi-2-bottom" role=3D"pr=
esentation" width=3D"100%" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"=
 style=3D"border-top: 1px solid rgb(0,0,0,.1);border-bottom: 1px solid rgb(=
0,0,0,.1);min-width: 100%;"><tbody><tr height=3D"16"><td height=3D"16" styl=
e=3D"font-size:0px;line-height:0;">&nbsp;</td></tr><tr><td><table class=3D"=
email-ufi-2-row" role=3D"presentation" width=3D"100%" border=3D"0" cellspac=
ing=3D"0" cellpadding=3D"0" style=3D"border-bottom: 1px solid rgb(0,0,0,.1)=
;"><tbody><tr><td width=3D"95%"><table class=3D"email-button-outline-wrappe=
r-full-width" role=3D"presentation" width=3D"auto" border=3D"0" cellspacing=
=3D"0" cellpadding=3D"0" style=3D"width: 95%;margin: 0 auto;"><tbody><tr><t=
d align=3D"center"><a class=3D"email-button-outline full-width" href=3D"htt=
ps://substack.com/app-link/post?publication_id=3D817132&post_id=3D193057411=
&utm_source=3Dsubstack&utm_medium=3Demail&utm_content=3Dshare&utm_campaign=
=3Demail-share&action=3Dshare&triggerShare=3Dtrue&isFreemail=3Dtrue&r=3D4iw=
oe6&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTgsInBvc3RfaWQiOjE5MzA1NzQxMSwiaWF0Ijo=
xNzc4NjAwNTQyLCJleHAiOjE3ODExOTI1NDIsImlzcyI6InB1Yi04MTcxMzIiLCJzdWIiOiJwb3=
N0LXJlYWN0aW9uIn0.ysvQESGwWPnILoHPcsf7vXlLgzgBP5F1-uBKLhH5sPo" style=3D"fon=
t-family: system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helv=
etica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbo=
l';display: inline-block;font-weight: 500;border: 1px solid rgb(0,0,0,.1);b=
order-radius: 9999px;text-transform: uppercase;font-size: 12px;line-height:=
 12px;padding: 9px 14px;text-decoration: none;color: rgb(119,119,119);width=
: 100%;padding-left: 0;padding-right: 0;"><img class=3D"icon" src=3D"https:=
//substackcdn.com/image/fetch/$s_!rmYa!,w_36,c_scale,f_png,q_auto:good,fl_p=
rogressive:steep/https%3A%2F%2Fsubstack.com%2Ficon%2FLucideShare%3Fv%3D4%26=
height%3D36%26fill%3Dnone%26stroke%3D%2523808080%26strokeWidth%3D2" width=
=3D"18" height=3D"18" style=3D"margin-right: 8px;min-width: 18px;min-height=
: 18px;border: none;vertical-align: middle;max-width: 18px" alt=3D""><span =
class=3D"email-button-text" style=3D"vertical-align: middle;">Share</span><=
/a></td></tr></tbody></table></td></tr><tr height=3D"16"><td height=3D"16" =
style=3D"font-size:0px;line-height:0;">&nbsp;</td></tr></tbody></table></td=
></tr><tr height=3D"16"><td height=3D"16" style=3D"font-size:0px;line-heigh=
t:0;">&nbsp;</td></tr><tr><td><table role=3D"presentation" width=3D"100%" b=
order=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tbody><tr><td><table role=
=3D"presentation" width=3D"auto" border=3D"0" cellspacing=3D"0" cellpadding=
=3D"0" style=3D"margin:0 auto;"><tbody><tr><td style=3D"vertical-align:midd=
le;"><table role=3D"presentation" width=3D"auto" border=3D"0" cellspacing=
=3D"0" cellpadding=3D"0"><tbody><tr><td align=3D"center"><a class=3D"email-=
button-outline" href=3D"https://substack.com/app-link/post?publication_id=
=3D817132&post_id=3D193057411&utm_source=3Dsubstack&isFreemail=3Dtrue&submi=
tLike=3Dtrue&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTgsInBvc3RfaWQiOjE5MzA1NzQxMS=
wicmVhY3Rpb24iOiLinaQiLCJpYXQiOjE3Nzg2MDA1NDIsImV4cCI6MTc4MTE5MjU0MiwiaXNzI=
joicHViLTgxNzEzMiIsInN1YiI6InJlYWN0aW9uIn0.D_X5y83G74obiYMA88R_Atjos2pYl3Uq=
_QaJnTUUxg4&utm_medium=3Demail&utm_campaign=3Demail-reaction&r=3D4iwoe6" st=
yle=3D"font-family: system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',R=
oboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Sego=
e UI Symbol';display: inline-block;font-weight: 500;border: 1px solid rgb(0=
,0,0,.1);border-radius: 9999px;text-transform: uppercase;font-size: 12px;li=
ne-height: 12px;padding: 9px 14px;text-decoration: none;color: rgb(119,119,=
119);"><img class=3D"icon" src=3D"https://substackcdn.com/image/fetch/$s_!P=
eVs!,w_36,c_scale,f_png,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubs=
tack.com%2Ficon%2FLucideHeart%3Fv%3D4%26height%3D36%26fill%3Dnone%26stroke%=
3D%2523808080%26strokeWidth%3D2" width=3D"18" height=3D"18" style=3D"margin=
-right: 8px;min-width: 18px;min-height: 18px;border: none;vertical-align: m=
iddle;max-width: 18px" alt=3D""><span class=3D"email-button-text" style=3D"=
vertical-align: middle;">Like</span></a></td></tr></tbody></table></td><td =
width=3D"8" style=3D"min-width:8px;"></td><td style=3D"vertical-align:middl=
e;"><table role=3D"presentation" width=3D"auto" border=3D"0" cellspacing=3D=
"0" cellpadding=3D"0"><tbody><tr><td align=3D"center"><a class=3D"email-but=
ton-outline" href=3D"https://substack.com/app-link/post?publication_id=3D81=
7132&post_id=3D193057411&utm_source=3Dsubstack&utm_medium=3Demail&isFreemai=
l=3Dtrue&comments=3Dtrue&token=3DeyJ1c2VyX2lkIjoyNzM2MjIzOTgsInBvc3RfaWQiOj=
E5MzA1NzQxMSwiaWF0IjoxNzc4NjAwNTQyLCJleHAiOjE3ODExOTI1NDIsImlzcyI6InB1Yi04M=
TcxMzIiLCJzdWIiOiJwb3N0LXJlYWN0aW9uIn0.ysvQESGwWPnILoHPcsf7vXlLgzgBP5F1-uBK=
LhH5sPo&r=3D4iwoe6&utm_campaign=3Demail-half-magic-comments&action=3Dpost-c=
omment&utm_source=3Dsubstack&utm_medium=3Demail" style=3D"font-family: syst=
em-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sa=
ns-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';display: in=
line-block;font-weight: 500;border: 1px solid rgb(0,0,0,.1);border-radius: =
9999px;text-transform: uppercase;font-size: 12px;line-height: 12px;padding:=
 9px 14px;text-decoration: none;color: rgb(119,119,119);"><img class=3D"ico=
n" src=3D"https://substackcdn.com/image/fetch/$s_!x1tS!,w_36,c_scale,f_png,=
q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Ficon%2FLucide=
Comments%3Fv%3D4%26height%3D36%26fill%3Dnone%26stroke%3D%2523808080%26strok=
eWidth%3D2" width=3D"18" height=3D"18" style=3D"margin-right: 8px;min-width=
: 18px;min-height: 18px;border: none;vertical-align: middle;max-width: 18px=
" alt=3D""><span class=3D"email-button-text" style=3D"vertical-align: middl=
e;">Comment</span></a></td></tr></tbody></table></td><td width=3D"8" style=
=3D"min-width:8px;"></td><td style=3D"vertical-align:middle;"><table role=
=3D"presentation" width=3D"auto" border=3D"0" cellspacing=3D"0" cellpadding=
=3D"0"><tbody><tr><td align=3D"center"><a class=3D"email-button-outline" hr=
ef=3D"https://substack.com/redirect/2/eyJlIjoiaHR0cHM6Ly9vcGVuLnN1YnN0YWNrL=
mNvbS9wdWIvYnl0ZWJ5dGVnby9wL2hvdy1maWdtYS11cGdyYWRlZC1kYXRhLXBpcGVsaW5lP3V0=
bV9zb3VyY2U9c3Vic3RhY2smdXRtX21lZGl1bT1lbWFpbCZ1dG1fY2FtcGFpZ249ZW1haWwtcmV=
zdGFjay1jb21tZW50JmFjdGlvbj1yZXN0YWNrLWNvbW1lbnQmcj00aXdvZTYmdG9rZW49ZXlKMW=
MyVnlYMmxrSWpveU56TTJNakl6T1Rnc0luQnZjM1JmYVdRaU9qRTVNekExTnpReE1Td2lhV0YwS=
WpveE56YzROakF3TlRReUxDSmxlSEFpT2pFM09ERXhPVEkxTkRJc0ltbHpjeUk2SW5CMVlpMDRN=
VGN4TXpJaUxDSnpkV0lpT2lKd2IzTjBMWEpsWVdOMGFXOXVJbjAueXN2UUVTR3dXUG5JTG9IUGN=
zZjd2WGxMZ3pnQlA1RjEtdUJLTGhINXNQbyIsInAiOjE5MzA1NzQxMSwicyI6ODE3MTMyLCJmIj=
p0cnVlLCJ1IjoyNzM2MjIzOTgsImlhdCI6MTc3ODYwMDU0MiwiZXhwIjoyMDk0MTc2NTQyLCJpc=
3MiOiJwdWItMCIsInN1YiI6ImxpbmstcmVkaXJlY3QifQ.wiTojRezRAPYi9IO3q-QNgTKaKCyi=
OVDldtByMbGeYA?&utm_source=3Dsubstack&utm_medium=3Demail" style=3D"font-fam=
ily: system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica=
,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';di=
splay: inline-block;font-weight: 500;border: 1px solid rgb(0,0,0,.1);border=
-radius: 9999px;text-transform: uppercase;font-size: 12px;line-height: 12px=
;padding: 9px 14px;text-decoration: none;color: rgb(119,119,119);"><img cla=
ss=3D"icon" src=3D"https://substackcdn.com/image/fetch/$s_!ubXF!,w_36,c_sca=
le,f_png,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Ficon=
%2Fnotes__NoteRestackIcon%3Fv%3D4%26height%3D36%26fill%3Dnone%26stroke%3D%2=
523808080%26strokeWidth%3D2%26strokeLinecap%3Dround%26strokeLinejoin%3Droun=
d" width=3D"18" height=3D"18" alt=3D"" style=3D"margin-right: 8px;min-width=
: 18px;min-height: 18px;max-width: 550px;border: none !important;vertical-a=
lign: middle;"><span class=3D"email-button-text" style=3D"vertical-align: m=
iddle;">Restack</span></a></td></tr></tbody></table></td></tr></tbody></tab=
le></td><td align=3D"right"><table role=3D"presentation" width=3D"auto" bor=
der=3D"0" cellspacing=3D"0" cellpadding=3D"0"><tbody><tr></tr></tbody></tab=
le></td></tr></tbody></table></td></tr><tr height=3D"16"><td height=3D"16" =
style=3D"font-size:0px;line-height:0;">&nbsp;</td></tr></tbody></table><div=
 class=3D"footer footer-ZM59BM" style=3D"color: rgb(119,119,119);text-align=
: center;font-size: 16px;line-height: 26px;padding: 24px0;"><div style=3D"f=
ont-size: 16px;line-height: 26px;padding-bottom: 24px"><p class=3D"pencraft=
 pc-reset color-secondary-ls1g8s size-12-mmZ61m reset-IxiVJZ small meta-B2b=
qa5" style=3D"list-style: none;font-family: system-ui,-apple-system,BlinkMa=
cSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji=
','Segoe UI Emoji','Segoe UI Symbol';padding-bottom: 0;font-size: 12px;line=
-height: 16px;margin: 0;color: rgb(119,119,119);text-decoration: unset;">&#=
169; 2026 <span>ByteByteGo</span><br>548 Market Street PMB 72296, San Franc=
isco, CA 94104 <br><a href=3D"https://substack.com/redirect/2/eyJlIjoiaHR0c=
HM6Ly9ibG9nLmJ5dGVieXRlZ28uY29tL2FjdGlvbi9kaXNhYmxlX2VtYWlsP3Rva2VuPWV5SjFj=
MlZ5WDJsa0lqb3lOek0yTWpJek9UZ3NJbkJ2YzNSZmFXUWlPakU1TXpBMU56UXhNU3dpYVdGMEl=
qb3hOemM0TmpBd05UUXlMQ0psZUhBaU9qRTRNVEF4TXpZMU5ESXNJbWx6Y3lJNkluQjFZaTA0TV=
RjeE16SWlMQ0p6ZFdJaU9pSmthWE5oWW14bFgyVnRZV2xzSW4wLmEtWkN1b2F4UFNpUmZqd1hxV=
EdYTXZ6OENWeDlQdEhVS2dKVW9mV000YkEiLCJwIjoxOTMwNTc0MTEsInMiOjgxNzEzMiwiZiI6=
dHJ1ZSwidSI6MjczNjIyMzk4LCJpYXQiOjE3Nzg2MDA1NDIsImV4cCI6MjA5NDE3NjU0MiwiaXN=
zIjoicHViLTAiLCJzdWIiOiJsaW5rLXJlZGlyZWN0In0.iXX2Rfg9CjsPdpjJFw2OgUPYHO4frY=
GHsH4QwwIy8kA?" style=3D"color: #7756e3;text-decoration: none;"><span style=
=3D"color: rgb(119,119,119);text-decoration: underline;">Unsubscribe</span>=
</a></p></div><p class=3D"footerSection-EHR0jG small powered-by-substack" s=
tyle=3D"padding: 0 24px;font-size: 12px;line-height: 20px;margin: 0;color: =
rgb(119,119,119);font-family: system-ui,-apple-system,BlinkMacSystemFont,'S=
egoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Em=
oji','Segoe UI Symbol';padding-bottom: 0;margin-top: 0;"><a href=3D"https:/=
/substack.com/redirect/2/eyJlIjoiaHR0cHM6Ly9zdWJzdGFjay5jb20vc2lnbnVwP3V0bV=
9zb3VyY2U9c3Vic3RhY2smdXRtX21lZGl1bT1lbWFpbCZ1dG1fY29udGVudD1mb290ZXImdXRtX=
2NhbXBhaWduPWF1dG9maWxsZWQtZm9vdGVyJmZyZWVTaWdudXBFbWFpbD10anBodWhzQGdtYWls=
LmNvbSZyPTRpd29lNiIsInAiOjE5MzA1NzQxMSwicyI6ODE3MTMyLCJmIjp0cnVlLCJ1IjoyNzM=
2MjIzOTgsImlhdCI6MTc3ODYwMDU0MiwiZXhwIjoyMDk0MTc2NTQyLCJpc3MiOiJwdWItMCIsIn=
N1YiI6ImxpbmstcmVkaXJlY3QifQ.BDYBK_HNTDkJTQe7BZDFvTys4hr8apfuOq-RpTDjl-w?" =
style=3D"color: #7756e3;text-decoration: none;display: inline-block;margin:=
 0 4px;"><img src=3D"https://substackcdn.com/image/fetch/$s_!LkrL!,w_270,c_=
limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2F=
img%2Femail%2Fpublish-button%402x.png" srcset=3D"https://substackcdn.com/im=
age/fetch/$s_!wgfj!,w_135,c_limit,f_auto,q_auto:good,fl_progressive:steep/h=
ttps%3A%2F%2Fsubstack.com%2Fimg%2Femail%2Fpublish-button.png, https://subst=
ackcdn.com/image/fetch/$s_!LkrL!,w_270,c_limit,f_auto,q_auto:good,fl_progre=
ssive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Femail%2Fpublish-button%402x.=
png 2x, https://substackcdn.com/image/fetch/$s_!KjtY!,w_405,c_limit,f_auto,=
q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Femail%2=
Fpublish-button%403x.png 3x" width=3D"135" alt=3D"Start writing" height=3D"=
40" style=3D"max-width: 550px;border: none !important;vertical-align: middl=
e;"></a></p></div></div></td><td></td></tr></tbody></table><img src=3D"http=
s://eotrx.substackcdn.com/o/63a5c07be84a231f/p.gif?token=3DeyJtIjoiPDIwMjYw=
NTEyMTUzMTAzLjMuZmZkM2FlN2NkNDM2OWJhMEBtZy1kMS5zdWJzdGFjay5jb20-IiwidSI6Mjc=
zNjIyMzk4LCJyIjoidGpwaHVoc0BnbWFpbC5jb20iLCJkIjoibWctZDEuc3Vic3RhY2suY29tIi=
wicCI6MTkzMDU3NDExLCJ0IjoibmV3c2xldHRlciIsImEiOiJldmVyeW9uZSIsInMiOjgxNzEzM=
iwiYyI6InBvc3QiLCJmIjp0cnVlLCJwb3NpdGlvbiI6ImJvdHRvbSIsImlhdCI6MTc3ODYwMDU0=
MiwiZXhwIjoxNzgxMTkyNTQyLCJpc3MiOiJwdWItMCIsInN1YiI6ImVvIn0.PtVPmZT4BtN1sun=
IYXioeY9tjEDFURVpVzIFfvOF0wY" alt=3D"" width=3D"1" height=3D"1" border=3D"0=
" style=3D"height:1px !important;width:1px !important;border-width:0 !impor=
tant;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !imp=
ortant;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !=
important;padding-right:0 !important;padding-left:0 !important;"/><img widt=
h=3D"1" height=3D"1" alt=3D"" src=3D"https://email.mg-d1.substack.com/o/eJx=
MkE1uwyAQRk8TdrX4MWAvOIs1wMShtcGCIZVvXznJoovZvJGenr4AhGuppztKIxadmj2fgmHohL=
WT4VyPkuEOaVtWzFiBMC5A_76jVOzhjPHcgJlhVFYoK4X2Gmc9ySDAa-1ZcpJLw7WQQivB1aCG-=
z0qQBviqMzsgd9Gvq9fUQyt-0YQfoZQdpbacq_4SnBUO7KrdIEeE-aADp9Yz5I_OEUnZsW1HYV4=
EzoPdBl_24ZEWNnR_RLKvvec6Fwwg98wfsTdbykApZIv0SSsUJJVR9_Hoz_abeTrVfGqat3HskP=
Kzp-E162F0XvF3rBeAmmVkVLNE3s6-RcAAP__XW53CA"></body></html>
--4ab31664e347ebfd114edecc807314f5068de783ab49fc95df7282a7b955--
