Evidence ledger
One row per claim in Rent the store, own the layer in front of it: ten years of Figma: who published it, what grade it carries, when it was written, when the link was last checked, and the quote or figure it rests on. Nothing in the guide is cited from memory, so anything not in this table is not in the guide.
Dig: Rent the store, own the layer in front of it: Figma's architecture, 2016 to 2026. Research date: 2026-10-17. All rows checked 2026-10-17.
Retrieval limitation, stated up front. This session's egress policy blocked direct HTTP
fetches to every host: curl to www.figma.com was refused by the proxy with a 403 on CONNECT,
and WebFetch could not resolve DNS. Two channels worked. The first was search-engine retrieval,
which returns excerpts and quoted fragments of a page rather than the whole document. The second
was anonymous git reads of public GitHub repositories (redis/redis, pgbouncer/pgbouncer,
evanw/skew) through the session's git proxy. So rows graded source were read first-hand from
git history: commit hashes, authors, dates, messages, PR head refs, and ancestry checks against
the default branch. Every other row rests on retrieved excerpts of the primary page. Quotes below
are reproduced only where the retrieval returned them as quotation; otherwise the row says
"(retrieved summary)". The HTTP link check in verify.mjs could not run from this session, so
links are recorded as indexed, not re-fetched. Where a date was not visible in the excerpt, the
row says how it was bounded.
Grading notes. Figma has published no formal ADRs. Two blog posts are graded adr because
each names the rejected alternatives and the stated reason for rejecting them (the 2019
multiplayer post rejects OT and "true" CRDTs; the 2024 sharding post rejects CockroachDB, TiDB,
Spanner, Vitess and NoSQL). The 2019 plugin-security update is graded postmortem because it is
Figma's own account of a sandbox-escape class of vulnerability, its containment (publishing
halted) and its structural fix. The SEC S-1 is graded casestudy because it is the only
audited production-scale figure in the set.
| # | Org | Title | Tier | Published | Checked | URL | Claim taken | Supporting quote or figure |
|---|---|---|---|---|---|---|---|---|
| 1 | Figma (Evan Wallace) | WebAssembly cut Figma's load time by 3x | blog | 2017-06 | 2026-10-17 | https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/ | The editor engine is C++ cross-compiled to asm.js, then to WebAssembly; load time fell 3x | "drop-in replacement for asm.js that is more efficient in every way"; parses "around 20x faster than asm.js"; title figure 3x (retrieved excerpt) |
| 2 | Figma | Rust in production at Figma | blog | 2018-05 | 2026-10-17 | https://www.figma.com/blog/rust-in-production-at-figma/ | Multiplayer server rewritten TypeScript to Rust because GC and memory overhead blocked per-document isolation | server "written in TypeScript"; garbage collector caused performance issues; a Node process per document had too high VM memory overhead; "each document lives exclusively on one specific worker" (retrieved summary) |
| 3 | Figma | Rust in production at Figma | blog | 2018-05 | 2026-10-17 | https://www.figma.com/blog/rust-in-production-at-figma/ | Rust compression crates from Servo caused document data loss; Figma reverted to a mature C library | both Servo-derived libraries "had minor problems that caused document data loss" (retrieved summary) |
| 4 | Figma (Evan Wallace) | How Figma's multiplayer technology works | adr | 2019-10 | 2026-10-17 | https://www.figma.com/blog/how-figmas-multiplayer-technology-works/ | Server-authoritative sync; OT rejected; CRDT-inspired but not a true CRDT; last-writer-wins per property | "Since Figma isn't a text editor, we didn't need the power of OTs and could get away with something less complicated"; "inspired by something called CRDTs" |
| 5 | Jamsocket | You might not need a CRDT | blog | n.d. | 2026-10-17 | https://jamsocket.xyz/blog/you-might-not-need-a-crdt | Quotes Wallace on why a central authority removes CRDT overhead | "our server is the central authority, we can simplify our system by removing this extra overhead and benefit from a faster and leaner implementation" (quoted from Figma) |
| 6 | Figma | How to build a plugin system on the web and also sleep well at night | blog | 2019-08 | 2026-10-17 | https://www.figma.com/blog/how-we-built-the-figma-plugin-system/ | First sandbox attempt was an iframe; plugins talk to the app through whitelisted messages | iframe considered "the closest thing to a standard sandboxing solution"; security "guaranteed by browser vendors" (retrieved summary) |
| 7 | Figma | An update on plugin security | postmortem | 2019-10 | 2026-10-17 | https://www.figma.com/blog/an-update-on-plugin-security/ | Realms-shim sandbox had escape bugs; Figma halted plugin publishing and changed the stack to remove the class | "several independent vulnerabilities were recently discovered with the Realms shim that could have allowed code inside the sandbox to escape"; "a fundamental change to our technology stack to prevent this class of bug" |
| 8 | GitHub Advisory DB | GHSA-7cg8-pq9v-x98q: realms-shim sandbox breakout | source | 2019-10 | 2026-10-17 | https://github.com/advisories/GHSA-7cg8-pq9v-x98q | Upstream advisory, critical, versions before 1.2.1 | "versions of realms-shim prior to 1.2.1 are vulnerable" |
| 9 | Agoric | Realms-shim security updates | blog | 2019-10-02 | 2026-10-17 | https://agoric.com/realms-shim-security-updates/ | Four security-critical bugs fixed upstream | "four security-critical bugs were discovered and fixed"; realms-shim-1.2.0 and SES-0.6.3 "released 02-Oct-2019" |
| 10 | Figma | Postmortem: Service disruption on January 21-22, 2020 | postmortem | 2020-01 | 2026-10-17 | https://www.figma.com/blog/post-mortem-service-disruption-on-january-21-22-2020/ | Day 1: one long-running expensive query saturated the single database's CPU | "[6:54 AM PST] We discover a long-running, expensive query that has been causing elevated database CPU. After cancelling this query, performance returns to normal." |
| 11 | Figma | Postmortem: Service disruption on January 21-22, 2020 | postmortem | 2020-01 | 2026-10-17 | https://www.figma.com/blog/post-mortem-service-disruption-on-january-21-22-2020/ | Day 2: write IOPS and lock contention, not CPU; fixed by disabling a background process and an emergency engine upgrade | "increase in write IOPS and lock contention. However, in contrast to the previous day, database CPU is lower than normal"; "restart the database to apply settings to temporarily disable a background process; upgrade the database to a version we had already tested in our staging environment" |
| 12 | Figma | Postmortem: Service disruptions on June 6 & 7 2022 | postmortem | 2022-06 | 2026-10-17 | https://www.figma.com/blog/postmortem-service-disruptions-on-june-6-and-7-2022/ | Four disruptions; Engine CPU at 100% on a cluster-mode-enabled ElastiCache node | "we were using up 100% of the Engine CPU of a Cluster-Mode Enabled ElastiCache node" |
| 13 | Figma | Postmortem: Service disruptions on June 6 & 7 2022 | postmortem | 2022-06 | 2026-10-17 | https://www.figma.com/blog/postmortem-service-disruptions-on-june-6-and-7-2022/ | Trigger was pub/sub load on CME; loaded files kept working, new opens and collaboration failed | "high Publish / Subscribe workloads can trigger a sudden and sustained spike in Engine CPU utilization"; "files that were already loaded continued to work, but it wasn't possible for users to open new files or collaborate with others"; "There was no data loss" |
| 14 | Figma | Postmortem: Service disruptions on June 6 & 7 2022 | postmortem | 2022-06 | 2026-10-17 | https://www.figma.com/blog/postmortem-service-disruptions-on-june-6-and-7-2022/ | Mixed cluster modes in production; recovery by moving traffic to new clusters after a slow failover | "running two instances of ElastiCache—one with Cluster-Mode Enabled (CME) and another with Cluster-Mode Disabled (CMD)"; failover slower than expected, traffic redirected to new ElastiCache clusters (retrieved summary) |
| 15 | redis/redis | Sharded pubsub implementation (#8621), commit 9f8885760 | source | 2022-01-03 | 2026-10-17 | https://github.com/redis/redis/pull/8621 | Sharded pub/sub landed upstream in 7.0 (first tag 7.0-rc1); co-authored by an AWS engineer | git: 9f8885760 2022-01-03 Harkrishn Patro | Sharded pubsub implementation (#8621); "Co-authored-by: Harkrishn Patro harkrisp@amazon.com"; git tag --contains first = 7.0-rc1 |
| 16 | Redis | Redis Pub/Sub documentation | vendor | n.d. | 2026-10-17 | https://redis.io/docs/latest/develop/pubsub/ | Classic cluster pub/sub propagates each message to every node; sharded pub/sub confines it to the shard | sharded pub/sub "restricts the propagation of messages to be within the shard of a cluster" compared with global Pub/Sub "where each message propagates to each node" |
| 17 | Figma | The growing pains of database architecture | casestudy | 2023-04 | 2026-10-17 | https://www.figma.com/blog/how-figma-scaled-to-multiple-databases/ | Through 2020 one large RDS Postgres held most metadata at 65%+ peak CPU; chose vertical partitioning by table | "still using a single, large Amazon RDS database to persist most of our metadata"; "upwards of 65% CPU utilization during peak traffic"; "vertically partition the database by table(s)" |
| 18 | Figma | The growing pains of database architecture | casestudy | 2023-04 | 2026-10-17 | https://www.figma.com/blog/how-figma-scaled-to-multiple-databases/ | Each vertical move cost about 30 s of partial availability; horizontal sharding deferred because managed options were not Postgres-compatible | "~30 second period of partial availability impact (~2% of requests dropped)"; "Many popular managed solutions are not natively compatible with Postgres" (retrieved excerpt) |
| 19 | Figma | How Figma's databases team lived to tell the scale | adr | 2024-03-14 | 2026-10-17 | https://www.figma.com/blog/how-figmas-databases-team-lived-to-tell-the-scale/ | Rejected CockroachDB, TiDB, Spanner, Vitess and NoSQL; sharded the existing RDS Postgres behind DBProxy | evaluated "CockroachDB, TiDB, Spanner, and Vitess"; not sensible for a small team "to re-implement a generic horizontally sharded database"; "our nine month journey to horizontally shard Figma's Postgres stack" (retrieved summary + quote) |
| 20 | Figma | How Figma's databases team lived to tell the scale | adr | 2024-03-14 | 2026-10-17 | https://www.figma.com/blog/how-figmas-databases-team-lived-to-tell-the-scale/ | Vertical partitioning ran out because the smallest unit is a table; colos, logical sharding via views before physical moves | smallest unit of vertical partitioning "a single table"; colos share a shard key; logical sharding via Postgres views (retrieved summary) |
| 21 | Simon Willison | How Figma's databases team lived to tell the scale (link note) | blog | 2024-03-14 | 2026-10-17 | https://simonwillison.net/2024/Mar/14/how-figmas-databases-team-lived-to-tell-the-scale | Dates the sharding post | dated 14th March 2024 |
| 22 | pganalyze (Lukas Fittl) | How Figma built DBProxy for sharding Postgres | blog | 2024-03 | 2026-10-17 | https://pganalyze.com/blog/5mins-postgres-figma-dbproxy-sharding-postgres | Independent Postgres-specialist reading of DBProxy: query parsing, routing, between app and PgBouncer | DBProxy "sits between the application and PgBouncer"; parses and routes sharded queries (retrieved summary) |
| 23 | Figma | LiveGraph: real-time data fetching at Figma | blog | 2021-10 | 2026-10-17 | https://www.figma.com/blog/livegraph-real-time-data-fetching-at-figma/ | Subscriptions are driven by the Postgres replication stream, not polling; built as a query layer on existing Postgres | "provide live updates in the order of milliseconds by reading the database replication stream"; polling "multiply the load on the database beyond what we were comfortable with" |
| 24 | Figma (Arushi Bandi, Rudi Chen, Slava Kim) | Keeping it 100(x) with real-time data at scale | blog | n.d. (after 2023 vertical partitioning) | 2026-10-17 | https://www.figma.com/blog/livegraph-real-time-data-at-scale/ | Sharding broke LiveGraph's global-order assumption; stopgap merged streams; replaced by invalidation-based cache sharded by query hash | implementation "relied on a globally ordered stream of updates"; stopgap "combined all replication streams into one"; "a global invalidation-based cache sharded by query hash" (retrieved summary) |
| 25 | @Scale | LiveGraph: scaling real-time data access (talk) | talk | n.d. | 2026-10-17 | https://atscaleconference.com/videos/livegraph-scaling-real-time-data-access/ | When first built LiveGraph served 500k WAU on a single Postgres; now a subscribe-able distributed query cache | abstract: built when Figma had "500,000 weekly active users and only a single Postgres instance"; "subscribe-able distributed query cache". No timestamp available; abstract only |
| 26 | Figma (Darren Tsung) | Making multiplayer more reliable | blog | 2022-10 | 2026-10-17 | https://www.figma.com/blog/making-multiplayer-more-reliable/ | Checkpoint every 30-60 s to S3 replaced as sole durability by a per-file journal with sequence numbers; 95% of edits saved within 600 ms | checkpoint "every 30 to 60 seconds"; journal "asynchronously written to as multiplayer accepts incoming changes"; "95% of edits to a Figma file get saved within 600ms" |
| 27 | Figma | Figma on X announcing the journal post | blog | 2022-10 | 2026-10-17 | https://x.com/figma/status/1584655238417764352 | The journal tags Rust and DynamoDB | "here's the 🔐 to our journal ... @rustlang @dynamodb" |
| 28 | Figma (Ian VonSeggern) | How we migrated onto K8s in less than 12 months | blog | 2024-08-08 | 2026-10-17 | https://www.figma.com/blog/migrating-onto-kubernetes/ | ECS to EKS; ECS lacked StatefulSets and Helm; scoped to core changes with the user abstraction kept | etcd on ECS needed "a custom wrapper around the etcd container startup, which proved fragile and hard to maintain" (retrieved summary) |
| 29 | InfoQ | Figma moves from ECS to Kubernetes | blog | 2024-09 | 2026-10-17 | https://www.infoq.com/news/2024/09/figma-ecs-kubernetes-eks | Stated motivations: CNCF ecosystem, cost, developer experience, resiliency | "the CNCF ecosystem, cost savings, improved developer experience, and increased resiliency" (retrieved summary) |
| 30 | Figma | The evolution of Figma's mobile engine: compiling away our custom programming language | blog | 2024-05 | 2026-10-17 | https://www.figma.com/blog/figmas-journey-to-typescript-compiling-away-our-custom-programming-language/ | Skew retired by a Skew-to-TypeScript transpiler; hard to hire for, cut off from tooling | Skew hard for new hires, hard to integrate, no external tooling (retrieved summary) |
| 31 | Simon Willison | Figma's journey to TypeScript | blog | 2024-05-04 | 2026-10-17 | https://simonwillison.net/2024/May/4/figmas-journey-to-typescript/ | WebAssembly removed Skew's performance case; transpiler let migration run while teams shipped | (retrieved summary) |
| 32 | evanw/skew | Skew repository history | source | 2015-03-15 to 2024-02-20 | 2026-10-17 | https://github.com/evanw/skew | 858 commits; last code change 2021-03-04; only a README edit since | git: first commit a75460f 2015-03-15; a4edb99 2021-03-04 Evan Wallace update "build.py" for python 3; df456e7 2024-02-20 Evan Wallace Update README.md; git rev-list --count HEAD = 858 |
| 33 | Figma | Speeding up file load times, one page at a time | blog | 2024 | 2026-10-17 | https://www.figma.com/blog/speeding-up-file-load-times-one-page-at-a-time/ | Multiplayer's QueryGraph sends only the requested page plus read dependencies; slowest loads 33% faster | QueryGraph sends "the requested page to the client, along with any required read dependencies"; slowest load times improved 33% (retrieved summary) |
| 34 | Figma (Alex Ringle, Luke Anderson) | Figma rendering: powered by WebGPU | blog | 2025-10 (bounded by repost 2025-10-20) | 2026-10-17 | https://www.figma.com/blog/figma-rendering-powered-by-webgpu/ | Renderer moved from WebGL to WebGPU while keeping a WebGL path | WebGPU for compute shaders, avoiding WebGL "bug-prone global state"; keep "WebGL compatibility while adding WebGPU" (retrieved summary) |
| 35 | Figma | From multi-day latency to near real-time insights: Figma's data pipeline upgrade | blog | n.d. | 2026-10-17 | https://www.figma.com/blog/figmas-data-pipeline-upgrade/ | Daily batch sync replaced by in-house CDC to Kafka, one topic per table, into Snowflake | daily synchronization tasks "started taking hours or even days to complete"; CDC service "publishes Postgres changes to one topic per table in Kafka" (retrieved summary) |
| 36 | Figma (Kevin Lin) | Figma's next-generation data caching platform | blog | 2026 (on or before 2026-05-05) | 2026-10-17 | https://www.figma.com/blog/figmas-next-generation-data-caching-platform/ | FigCache: stateless RESP proxy in front of ElastiCache; motivated by connection limits and the June 2022 incident; six nines claimed | "scalability and reliability gaps in our Redis platform were a growing threat to Figma's site availability"; "act as a connection multiplexer, isolating connection scalability on Redis clusters from connections created by Redis clients"; "achieved six nines of uptime" since 2H 2025 |
| 37 | InfoQ | Figma builds in-house Redis proxy to hit six nines uptime | blog | 2026-05-05 | 2026-10-17 | https://www.infoq.com/news/2026/05/figma-redis-figcache/ | FigCache built on ResPC, Figma's Go RPC framework over RESP; in production since 2H 2025 | "stateless service built on ResPC" (retrieved summary) |
| 38 | Figma (Lihao He, Tim Goh, Mehant Baid) | PGKeeper: building the bouncer we needed for Postgres | blog | 2026 (on or before 2026-05-06) | 2026-10-17 | https://www.figma.com/blog/pgkeeper-building-the-bouncer-we-needed-for-postgres/ | PgBouncer replaced by a Go gRPC pooler with priority admission (CoDel) and fair sharing; PGCat evaluated | "PgBouncer's single-threaded architecture imposed a ceiling on vertical scalability"; "no way to prioritize critical traffic above misbehaving, lower-priority traffic"; load-tested at 3x peak QPS; database SLO above 99.99% since rollout (daily.dev summary) |
| 39 | Postgres Weekly | Issue #647 | blog | 2026-05-06 | 2026-10-17 | https://postgresweekly.com/issues/647 | Dates PGKeeper; PGCat evaluated first | "Figma outgrew PgBouncer, evaluated PGCat, and ended up building its own pooler (PGKeeper) with Go and PGX" |
| 40 | pgbouncer/pgbouncer | Add PgBouncer peering support (#666) | source | 2023-04-20 | 2026-10-17 | https://github.com/pgbouncer/pgbouncer/pull/666 | Upstream's scale-out answer was multiple processes plus peering, not threads | git: 8bdfc6f 2023-04-20 Jelte Fennema | Add PgBouncer peering support (#666); de33cd0 2024-05-06 ... rolling restarts using so_reuseport (#902) |
| 41 | pgbouncer/pgbouncer | Multithread mode PR (#1386) | source | 2025-09-28 to 2026-08-27 | 2026-10-17 | https://github.com/pgbouncer/pgbouncer/pull/1386 | A multithread mode exists as an unmerged PR; an earlier attempt (#1244) is also unmerged | git: refs/pull/1386/head = 12 commits not on master, 2025-09-28 gyang193 | Support multithread mode to 2026-08-27 Merge branch 'master' into multithread-on-main; merge-base --is-ancestor false for #1386 and #1244 as of 2026-10-17 |
| 42 | Figma, Inc. | Form S-1 | casestudy | 2025-07 | 2026-10-17 | https://www.sec.gov/Archives/edgar/data/1579878/000162828025033742/figma-sx1.htm | Renewed AWS agreement (2025-05-31): minimum $545M over five years | renewed agreement "entered into on May 31, 2025"; minimum spend "of $545 million in cloud hosting services over the next five years" (retrieved excerpt) |
| 43 | Duckbill | Figma's $300k daily AWS bill isn't the scandal you think it is | blog | 2025-07 | 2026-10-17 | https://www.duckbillhq.com/blog/figmas-300k-daily-aws-bill-isnt-the-scandal-you-think-it-is/ | About $109M a year, roughly 12% of $821M revenue | "about $109 million annually, or roughly 12% of their $821 million in rolling revenue" (retrieved summary) |
| 44 | Postgres FM | Episode 100: To 100TB, and beyond! (Sammy Steele, Figma; with Notion and Adyen) | talk | 2024 | 2026-10-17 | https://postgres.fm/episodes/to-100tb-and-beyond | Figma's databases tech lead discussing sharded Postgres operation alongside Notion and Adyen | guest list only from retrieved page; no timestamped claim available |
| 45 | Shapiro, Preguiça, Baquero, Zawirski | Conflict-free replicated data types (SSS 2011, INRIA RR-7687) | paper | 2011 | 2026-10-17 | https://hal.sorbonne-universite.fr/inria-00609399v1 | CRDTs guarantee convergence without a coordinator; the overhead Figma removed exists to serve the no-authority case | INRIA research report RR-7687, 2011; LNCS 6976 pp. 386-400 |
| 46 | Nichols, Jacobson | Controlling Queue Delay (ACM Queue 10(5)) | paper | 2012-05 | 2026-10-17 | https://people.engr.tamu.edu/xizhang/ECEN619/research_papers/ACM_COMMUNICATIONS_2012_2208917.2209336_Controlling_Queue_Delay_Van_Jacobson.pdf | CoDel drops on sojourn time, not queue length; the mechanism PGKeeper's first admission stage borrows | CoDel "uses a packet's sojourn time (time in queue)" (ns-3 description of the paper's algorithm) |