<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ky Decker</title><description>Dispatches from the world wide web.</description><link>https://ky.fyi</link><item><title>Do I belong in tech anymore?</title><link>https://ky.fyi/posts/ai-burnout</link><guid isPermaLink="true">https://ky.fyi/posts/ai-burnout</guid><description>On quitting, the spread of AI, and the loss of an ideal.</description><pubDate>Fri, 24 Apr 2026 18:11:49 GMT</pubDate><content:encoded>&lt;p&gt;Two weeks ago, I quit my job.&lt;/p&gt;
&lt;p&gt;It wasn’t a bad job, not by most metrics. It ticked the boxes a job is supposed to tick: good pay. Health insurance. Remote work. Time off. Nice coworkers.&lt;/p&gt;
&lt;p&gt;I worked as our org’s only design engineer and maintainer of our design system. My job was to build components, to polish the final product that went out into the world, and to bridge gaps between design and engineering. During my time, I doubled surface coverage of our components, chipped away at bugs, and fixed accessibility issues. I published documentation. I administered twice-yearly surveys which indicated high satisfaction from the team—up significantly compared to when I began. I was doing good work.&lt;/p&gt;
&lt;p&gt;And yet, work was rendering me increasingly miserable. I questioned myself. Why am I here? Does any of this work actually matter? And if I stop caring about the quality of my work… will anyone notice? (An uncomfortable thought.)&lt;/p&gt;
&lt;p&gt;I knew I was tired, but I wasn’t sure if I wanted to quit. I took a week off to consider it, and told myself: if you still want to leave at the end of this week, hand in your resignation.&lt;/p&gt;
&lt;p&gt;The following Monday, I handed in my resignation. I felt immediate relief. I had nothing else lined up, but I knew I needed to go. I’m unsure when (or if) I’ll return to full-time tech work.&lt;/p&gt;
&lt;p&gt;What happened?&lt;/p&gt;
&lt;figure class=&quot;full&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/broken-phone.C77rr-ie_4RH8K.webp&quot; alt=&quot;A hand holds an iPhone with a shattered glass exterior.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1260&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Not long after quitting, my phone dropped and shattered.&lt;/strong&gt; Photo by the author.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;the-psychic-toll-of-ai&quot;&gt;The psychic toll of AI&lt;/h2&gt;
&lt;p&gt;Consider the following scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You join a meeting with a coworker. Your coworker has enabled an AI tool to automatically take notes and summarize the meeting. They do not ask for consent to turn it on. The tool mischaracterizes what you discuss.&lt;/li&gt;
&lt;li&gt;A team lead adds an AI chatbot to a Slack channel. Anyone can tag the bot to answer questions about the company’s products. Coworkers tag the chatbot many times a day. You never see someone check that the bot’s responses are correct.&lt;/li&gt;
&lt;li&gt;An engineer adds 12,000 lines of code affecting your app’s authentication. They ask that it be reviewed and merged same-day. Another engineer enlists a “swarm” of AI agents to review the code. The code merges with no one having read the full set of changes.&lt;/li&gt;
&lt;li&gt;A designer is tasked with exploring a new feature. They prompt an AI tool for an interactive prototype. Design crit is spent analyzing visual details in the generated prototype, with minimal discussion of core ideas, goals, or tradeoffs.&lt;/li&gt;
&lt;li&gt;One of your pull requests has been open for a few days. You ask other engineers to leave a code review. Minutes later, an engineer pastes a review that was generated by an AI tool. There are no additional thoughts of their own.&lt;/li&gt;
&lt;li&gt;You point an engineer to the relevant section of a library’s docs in order to request a feature. They tell you that the feature request is not possible, and send a screenshot of their chat with an AI tool as proof.&lt;/li&gt;
&lt;li&gt;Documents and code are being generated faster than team members can review. You get the feeling that most people have stopped reading altogether.&lt;/li&gt;
&lt;li&gt;Organization leadership has mandated that each person adopt new AI tools to “uplevel” themselves and their team.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I encountered each of these scenarios over the past few years, and each one left me wondering: do I raise an issue about AI here? Do I ask my coworker to disable their note-taking tool, or do I allow them to record me? (Where does the data go? Who is reading it? Do we retain knowledge in the same way without manual note-taking?) Do I voice concerns over unread code entering the codebase, and the consequences of that pattern for institutional knowledge-building? Do I ask others on the design team to delay prototyping until later in the design process? Is it already too late to ask? Has the team already shipped the code, already designed the feature, already moved onto the next task? If someone requests my review on a pull request that was clearly vibe coded, do I review the code and write comments as usual, or send it back to them for self-review? Would initiating these discussions result in interpersonal stress? Should I just let things slide? Would I become known as a “difficult” coworker for pushing back on AI use? Does any of it really matter? Does anyone really care?&lt;/p&gt;
&lt;p&gt;All of these questions consumed energy. Whether I decided to confront them or not was moot: they left me tired and alienated either way. AI had hooked its tendrils into every corner of my work life. Even if I, personally, abstained from most AI usage, I was steeped in an environment which made it impossible to avoid. Pushing back felt futile.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;I prefer to avoid AI usage for ethical, practical, and financial reasons.&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ethically:&lt;/strong&gt; Generative AI tools, powered by &lt;a href=&quot;https://www.jll.com/en-us/insights/market-outlook/data-center-outlook&quot;&gt;data centers&lt;/a&gt; which consume &lt;a href=&quot;https://www.eesi.org/articles/view/data-centers-and-water-consumption&quot;&gt;vast amounts of water&lt;/a&gt; and &lt;a href=&quot;https://www.selc.org/news/elon-musks-xai-facility-is-polluting-south-memphis/&quot;&gt;pollute our environment&lt;/a&gt;, are built on the collective &lt;a href=&quot;https://imagegeneratorlitigation.com/&quot;&gt;theft of the works of millions of artists&lt;/a&gt;, developers, &lt;a href=&quot;https://authorsguild.org/news/authors-sue-grammarly/&quot;&gt;authors&lt;/a&gt;, and other creatives, supercharge &lt;a href=&quot;https://www.stimson.org/2026/ai-in-the-age-of-fake-imagined-content/&quot;&gt;the spread of disinformation&lt;/a&gt; and &lt;a href=&quot;https://newsocialist.org.uk/transmissions/ai-the-new-aesthetics-of-fascism/&quot;&gt;fascism&lt;/a&gt;, have repeatedly provoked &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC12712562/&quot;&gt;psychosis&lt;/a&gt; and &lt;a href=&quot;https://www.npr.org/sections/shots-health-news/2025/09/19/nx-s1-5545749/ai-chatbots-safety-openai-meta-characterai-teens-suicide&quot;&gt;suicide&lt;/a&gt;, and &lt;a href=&quot;https://doi.org/10.1016/j.techsoc.2024.102719&quot;&gt;concentrate wealth in fewer hands&lt;/a&gt; while providing cover for &lt;a href=&quot;https://theconversation.com/meta-and-microsoft-have-joined-the-tech-layoff-tsunami-but-is-ai-really-to-blame-281436&quot;&gt;widespread layoffs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practically:&lt;/strong&gt; I have found that AI tools overcomplicate implementations and that cleaner, simpler solutions can often be written by hand. &lt;a href=&quot;https://terribleminds.com/ramble/2025/05/21/repeat-after-me-ai-doesnt-know-anything/&quot;&gt;AI doesn’t “know” anything&lt;/a&gt;, and is &lt;a href=&quot;https://www.youtube.com/watch?v=bZJ7A1QoUEI&quot;&gt;making life worse for open source maintainers&lt;/a&gt;. Overreliance on AI risks &lt;a href=&quot;https://cacm.acm.org/news/the-ai-deskilling-paradox/&quot;&gt;deskilling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Financially:&lt;/strong&gt; I dislike sending money to large corporations when alternatives include &lt;a href=&quot;https://developer.mozilla.org/en-US/&quot;&gt;learning the skill for free&lt;/a&gt; and &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;contributing to open source&lt;/a&gt; projects. Tokens are currently &lt;a href=&quot;https://www.theverge.com/ai-artificial-intelligence/917380/ai-monetization-anthropic-openai-token-economics-revenue&quot;&gt;heavily subsidized and likely to become more expensive&lt;/a&gt;, so I would prefer not to make a habit of using them.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I use AI tools sparingly for assistance while refactoring code in languages I understand. I occasionally use it to help compose command line arguments for tools like &lt;code&gt;ffmpeg&lt;/code&gt;. I never use AI to generate images, video, or prose.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;The explosion of AI has played a significant role in my own burnout. Worse, it feels inescapable. Few tech organizations are taking a principled stance against AI use.&lt;/p&gt;
&lt;p&gt;But AI use is only one part of broader social trends within tech that leave me questioning whether I should remain here.&lt;/p&gt;
&lt;h2 id=&quot;the-loss-of-an-ideal&quot;&gt;The loss of an ideal&lt;/h2&gt;
&lt;p&gt;When I started full-time design and dev work in the 2010s, tech was generally understood to be a progressive place. This was peak “&lt;a href=&quot;https://www.youtube.com/watch?v=0tLEszJs7hc&quot;&gt;fun tech job&lt;/a&gt;” era, with magazines publishing glossy covers about life at Google. Apple had a gay CEO!&lt;/p&gt;
&lt;p&gt;The web was still in flux; as a designer, the prospect of shaping sites into more usable forms excited me. Usability and user-centered design were hot topics. Budding federal organizations like &lt;a href=&quot;https://en.wikipedia.org/wiki/18F&quot;&gt;18F&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/United_States_Digital_Service&quot;&gt;United States Digital Service&lt;/a&gt; were embarking on meaningful technology-enabled civic work.&lt;/p&gt;
&lt;p&gt;After Trump’s first election, people recoiled with shock and disbelief. How could this happen? Many organizations distanced themselves from the administration and reiterated their commitment to equality. Then, the COVID-19 pandemic hit, alongside a surge of protests for racial justice. There was a glimpse of unity. Biden was elected and swiftly proclaimed a return to “normal”.&lt;/p&gt;
&lt;p&gt;“Normal” landed us where we are now: the second Trump administration, more flagrantly corrupt and cruel than the first. Protests surge (larger than ever!) amidst a quieter type of elite resignation. The words “equity” and “inclusion” are no more.&lt;/p&gt;
&lt;p&gt;Tech organizations have now given up on pushing back against an unethical and violent administration, deciding that it is in their best business interest to flatter the president’s ego with &lt;a href=&quot;https://www.youtube.com/shorts/0O9QhwIkj5w&quot;&gt;gold trophies&lt;/a&gt; and &lt;a href=&quot;https://www.wired.com/story/tech-ceos-donald-trump-white-house/&quot;&gt;pandering praise&lt;/a&gt;. Elon Musk and the “Department of Government Efficiency” took a sledgehammer to 18F and replaced it with &lt;a href=&quot;https://www.chrbutler.com/the-national-design-studio-is-a-scam&quot;&gt;National Design Studio&lt;/a&gt;, a propaganda shop whose main talent is building &lt;a href=&quot;https://ethanmarcotte.com/wrote/a-notional-design-studio/&quot;&gt;expensive and inaccessible landing pages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Leaders at Google have abandoned former climate pledges as they work to build &lt;a href=&quot;https://www.wired.com/story/a-new-google-funded-data-center-will-be-powered-by-a-massive-gas-plant/&quot;&gt;new data centers powered by natural gas turbines&lt;/a&gt; which emit more carbon than the entire city of San Francisco. Other tech CEOs smile for photos alongside war criminals.&lt;/p&gt;
&lt;figure class=&quot;inset&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/guillermo-rauch-tweet.BKzN2e6o_ZJqIga.webp&quot; alt=&quot;A tweet from Guillermo Rauch, who posts: &amp;quot;Enjoyed my discussion with PM Netanyahu on how AI education and literacy will keep our free societies ahead. We spoke about AI empowering everyone to build software and the importance of ensuring it serves quality and progress. Optimistic for peace, safety, and greatness for Israel and its neighbors.&amp;quot; Attached is a photo of Rauch posing with Benjamin Netanyahu. Posted September 29, 2025.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;560&quot; height=&quot;775&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Guillermo Rauch, CEO of Vercel, poses with Benjamin Netanyahu, prime minister of Israel.&lt;/strong&gt; The International Criminal Court has issued an &lt;a href=&quot;https://www.icc-cpi.int/defendant/netanyahu&quot;&gt;arrest warrant&lt;/a&gt; for Netanyahu for “war crimes of starvation as a method of warfare and of intentionally directing an attack against the civilian population.” &lt;a href=&quot;https://x.com/rauchg/status/1972669025525158031&quot;&gt;Original tweet&lt;/a&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I keep asking myself:&lt;/p&gt;
&lt;p&gt;What happened to the principles that were professed a decade ago? To address climate change? To reduce racial, gender, and economic inequality? To “&lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_be_evil&quot;&gt;don’t be evil&lt;/a&gt;”?&lt;/p&gt;
&lt;p&gt;Were these principles abandoned, or were they merely born of convenience?&lt;/p&gt;
&lt;p&gt;Has tech always been like this? Was I just blind to it before?&lt;/p&gt;
&lt;p&gt;When I say that I am burnt out I do not mean simply that I am tired. I’m referring to the “&lt;a href=&quot;https://aworkinglibrary.com/writing/loss-of-an-ideal&quot;&gt;emotional experience of political defeat&lt;/a&gt;”:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Burnout in Freudenberger’s articles from this period is not just defined in terms of physical tiredness as a result of doing too many things; rather, it emerges from emotional investment in a cause and from the disappointments that arise when flaws in a political project become apparent. Freudenberger’s concept not only describes physical exhaustion but also acknowledges the need to deal with anger caused by grief brought about by the “loss of an ideal.” Burnout in the context of social justice projects thus often involves a process of mourning, according to Freudenberger. Returning to his earlier writings on burnout makes it clear that when understood as a malaise arising from politically committed activities, burnout cannot be equated with tiredness or stress.&lt;/p&gt;
&lt;cite&gt;Hannah Proctor, Burnout, p. 92&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;p&gt;I love designing and building things for the web, but I’m mourning an industry that does not share the ideals I once thought it did.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;I understand why people use AI. Life can be difficult and confusing. Prompting the machine is so alluring—it answers with such certainty! How could it be wrong? (And even if it is a little wrong, well… hasn’t it saved time? Does it need to be perfect?) The temptation is real.&lt;/p&gt;
&lt;p&gt;I don’t blame people for opting to use tools that promise quick, convenient solutions to problems. We all operate under capitalism. Many of us have &lt;a href=&quot;https://en.wikipedia.org/wiki/Bullshit_Jobs&quot;&gt;bullshit jobs&lt;/a&gt; where the goal is not, in fact, to make something good, or even to learn, but to simply make money to pay rent and medical expenses. To hopefully find a little joy on the side. The whole system is broken; AI alone didn’t break it, but it is widening the cracks.&lt;/p&gt;
&lt;p&gt;I guess what I’m trying to say is I wish none of us had to live like this. I would like to imagine a future that does not look like this.&lt;/p&gt;
&lt;p&gt;Ironically, what I’ve gained from AI is a deeper appreciation for human communication, in all its messy imperfection. The point of a code review is not simply for good code to make it into a codebase, but to build institutional knowledge as people debate and iterate and compromise, slow as it may be. &lt;a href=&quot;/posts/embrace-friction&quot;&gt;Friction is good.&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&quot;inset&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/human-communication.D7nSTj_3_Z119BFh.webp&quot; alt=&quot;A tweet from Hazel Weakly, who posts: &amp;quot;The two hardest problems in Computer Science are 1. Human communication, 2. Getting people in tech to believe that human communication is important&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;560&quot; height=&quot;282&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Human communication is difficult.&lt;/strong&gt; &lt;a href=&quot;https://bsky.app/profile/hazelweakly.me/post/3maqbzkdkyk2h&quot;&gt;Original post&lt;/a&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;where-do-i-go-from-here&quot;&gt;Where do I go from here?&lt;/h2&gt;
&lt;p&gt;No matter how rapidly technology changes, I am coalescing around some core beliefs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Things that are worth doing are worth doing well.&lt;/li&gt;
&lt;li&gt;Things that are done well require time and effort.&lt;/li&gt;
&lt;li&gt;You make meaning through the doing.&lt;/li&gt;
&lt;li&gt;Ideas are common; effort is not.&lt;/li&gt;
&lt;li&gt;There are no shortcuts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am, as it stands, without a job. Recovering from burnout will take time. Thankfully, I have savings that afford me the privilege to take that time. I’m distancing myself from social media and news, at least for a little while. At some point, I will need to decide if I want to remain in this industry, and if so, where to go next.&lt;/p&gt;
&lt;p&gt;In the meantime, I’m going to the gym. (Crossfit, weirdly.) I’m learning more about &lt;a href=&quot;https://www.syntorial.com/&quot;&gt;how synthesizers work&lt;/a&gt; and I’m generating different sounds. I’m &lt;a href=&quot;https://glass.photo/kydecker&quot;&gt;looking at birds&lt;/a&gt;. I’m looking at my cat. I’m continuing to build &lt;a href=&quot;https://namesake.fyi&quot;&gt;tools to help trans people&lt;/a&gt; with legal name changes. I’m spending time with friends.&lt;/p&gt;
&lt;p&gt;Eventually I will find new work. Who knows where.&lt;/p&gt;</content:encoded></item><item><title>Mapping where districts start and end</title><link>https://ky.fyi/posts/boundaries-map</link><guid isPermaLink="true">https://ky.fyi/posts/boundaries-map</guid><description>Helping BetaNYC map and query New York City&apos;s civic boundaries.</description><pubDate>Tue, 13 Feb 2024 05:53:27 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beta.nyc/&quot;&gt;BetaNYC&lt;/a&gt; is a non-profit civic tech organization which builds tools and hosts public events to increase access to civic data and demystify government processes. I joined BetaNYC for 8 weeks during Summer 2022 as a Civic Innovation Fellow.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/manhattan-municipal-building.B5M1cwfi_2gWfFL.webp&quot; alt=&quot;A low-angle shot of the Manhattan Municipal
Building.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2048&quot; height=&quot;1365&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;BetaNYC operates out of the Manhattan Municipal Building at 1 Centre
Street.&lt;/strong&gt; Technologists work alongside urban planners and other city
professionals. Photo by Mattia Panciroli via
&lt;a href=&quot;https://flic.kr/p/bPBHUc&quot;&gt;Flickr&lt;/a&gt;, 2012.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;the-challenge&quot;&gt;The challenge&lt;/h2&gt;
&lt;p&gt;Every day, you cross dozens of invisible borders: city council districts, school districts, police precincts, fire battalions, senate districts, zip codes, and more. These borders, although invisible, affect your life in important ways. Who collects your trash? Who represents you? Who arrives to care for you if you’re injured? To answer these questions, it helps to know exactly where boundaries begin and end—and how they overlap.&lt;/p&gt;
&lt;p&gt;BetaNYC maintains an open source web app called &lt;a href=&quot;https://boundaries.beta.nyc/&quot;&gt;NYC Boundaries Map&lt;/a&gt;. First launched in 2018, the Boundaries Map allows anyone to view and explore overlapping jurisdictional boundaries within the city. The map is commonly used by city council staff and community boards in order to direct feedback from constituents to the correct department.&lt;/p&gt;
&lt;p&gt;The Boundaries Map helps answer questions like, “which school districts does this community board serve?”, “which sanitation district do I contact about the trash at 2nd Avenue and East 14th Street?”, and “what police precinct am I in right now?”&lt;/p&gt;
&lt;p&gt;The map was not pleasant to use.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/boundaries-map-initial.DsiOwX-O_Zc7oWE.webp&quot; alt=&quot;The NYC Boundaries Map as of June 2022.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2796&quot; height=&quot;1390&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The original Boundaries Map.&lt;/strong&gt; 13 separate boundaries render with 13
separate border colors and labels. A rainbow spaghetti of geographic data.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Working together with &lt;a href=&quot;https://github.com/zhik&quot;&gt;Zhi&lt;/a&gt;, we noted several usability issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Toggling on more than two districts quickly made the map illegible.&lt;/li&gt;
&lt;li&gt;Boundaries on the map itself were not interactive.&lt;/li&gt;
&lt;li&gt;The map’s implementation in &lt;a href=&quot;https://leafletjs.com/&quot;&gt;Leaflet&lt;/a&gt; resulted in rasterized borders and labels, which looked blurry on HiDPI screens.&lt;/li&gt;
&lt;li&gt;Viewing overlaps required a complex sequence of “querying” boundaries by selecting an administrative region and then selecting which district to intersect with, and the query itself was slow to execute.&lt;/li&gt;
&lt;li&gt;The map required frequent manual zooming and panning, since it did not adapt automatically to queries.&lt;/li&gt;
&lt;li&gt;Searching for an address required pre-selecting a borough.&lt;/li&gt;
&lt;li&gt;Viewing additional metadata about a district required leaving the app and searching Google.&lt;/li&gt;
&lt;li&gt;The app was desktop-only.&lt;/li&gt;
&lt;li&gt;Visual design polish was generally lacking.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Additionally, there was no frontend framework in use (!) and I felt there was an opportunity to modernize and speed up development by adding one.&lt;/p&gt;
&lt;h2 id=&quot;research-and-build&quot;&gt;Research and build&lt;/h2&gt;
&lt;p&gt;With a solid list of usability tickets to address, I got to work sketching ideas for how we might fit things together.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/sketchbook.BgwpZZrh_2imxb.webp&quot; alt=&quot;A sketchbook containing several small ideas for maps and
dropdowns.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4509&quot; height=&quot;3400&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Sketching ideas.&lt;/strong&gt; I explored how we might combine location search,
district browsing, and overlap browsing within a single interface.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Without delay, we dove into code. After quick exploration with various frontend libraries, I installed &lt;a href=&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt; and &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind&lt;/a&gt;, which would allow us to build more advanced functionality more easily. We moved from Leaflet to &lt;a href=&quot;https://www.mapbox.com/&quot;&gt;Mapbox&lt;/a&gt; since it offered us exciting opportunities to interact with the map directly.&lt;/p&gt;
&lt;p&gt;We scheduled video calls with some frequent users of the Boundaries Map in order to better understand how they were using the tool and what could be improved. We shared our work-in-progress prototype for feedback. The participants were excited to be a part of the process and helped validate assumptions we had made.&lt;/p&gt;
&lt;h2 id=&quot;outcomes&quot;&gt;Outcomes&lt;/h2&gt;
&lt;p&gt;After a few short weeks, we announced the updated app.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;div class=&quot;video-wrapper&quot;&gt;&lt;video autoplay loop muted playsinline preload=&quot;none&quot; poster=&quot;/video/boundaries-map-poster.png&quot;&gt;&lt;source src=&quot;/video/boundaries-map.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The new Boundaries Map.&lt;/strong&gt; The updated app features overlaps on hover,
direct interaction with the map, a unified navigation bar, and clearer
information hierarchy.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The new map automatically zooms and pans to the selected boundary. It displays boundary overlaps on hover, allows single-click filtering by clicking any boundary, and supports mobile viewing. It links to the relevant webpage for a district when available, so users can find things like phone numbers for city council members. And it now allows users to share URLs for filtered views, and export overlap data to JSON for analysis in other tools.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.beta.nyc/2022/09/07/summer-associates-wrap-up/&quot;&gt;Read the announcement&lt;/a&gt; or &lt;a href=&quot;https://boundaries.beta.nyc/?&quot;&gt;explore boundaries&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;reflections&quot;&gt;Reflections&lt;/h2&gt;
&lt;p&gt;I had never worked with mapping technology before, so it was fun to learn about how to wield geospatial data using Mapbox. (Huge thanks to &lt;a href=&quot;https://github.com/zhik&quot;&gt;Zhi&lt;/a&gt; sharing his knowledge of GeoJSON and Shapefiles!) Svelte and Tailwind were also new frameworks for me, and this project helped me get more familiar with their capabilities.&lt;/p&gt;
&lt;p&gt;With extra time, I’d explore how to improve mobile navigation, since touchscreens can’t support the same hover interactions as desktop. I’d also explore whether it’s worth introducing color to the base map to more clearly communicate the locations of parks, water, and other regions. (Boundaries Map is &lt;a href=&quot;https://github.com/BetaNYC/nyc-boundaries&quot;&gt;open source&lt;/a&gt;, so maybe I’ll get to these one day! Or maybe you, my reader, can make contributions of your own.)&lt;/p&gt;
&lt;p&gt;BetaNYC introduced me to the city’s vast library of &lt;a href=&quot;https://opendata.cityofnewyork.us/&quot;&gt;open data&lt;/a&gt;, and I’ve continued to think about other possibilities for design and technology to surface public data for good.&lt;/p&gt;</content:encoded></item><item><title>Building Commonplace</title><link>https://ky.fyi/posts/commonplace</link><guid isPermaLink="true">https://ky.fyi/posts/commonplace</guid><description>A design system for care teams at Cityblock.</description><pubDate>Sat, 13 Jan 2024 05:13:17 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cityblock.com/&quot;&gt;Cityblock&lt;/a&gt; is a health company which got its start within Google’s &lt;a href=&quot;https://www.sidewalklabs.com/&quot;&gt;Sidewalk Labs&lt;/a&gt;. Teams of clinicians and other health professionals provide in-community care to people on Medicare and Medicaid to improve health for an often-neglected population.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;div style=&quot;padding:56.25% 0 0 0;position:relative;&quot;&gt;&lt;iframe src=&quot;https://player.vimeo.com/video/796683739?badge=0&amp;amp;autopause=0&amp;amp;player_id=0&amp;amp;app_id=58479&quot; allow=&quot;autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;border:none&quot; title=&quot;Cityblock Member Stories: Andre&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;script src=&quot;https://player.vimeo.com/api/player.js&quot;&gt;&lt;/script&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Andre, a Cityblock member, tells his story.&lt;/strong&gt; Via 
&lt;a href=&quot;https://vimeo.com/796683739&quot;&gt;Cityblock on Vimeo&lt;/a&gt;, 2023.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;To support care teams and the members they serve, Cityblock builds and maintains a tool called &lt;strong&gt;Commons&lt;/strong&gt;. I joined Cityblock in February 2019 as a Product Designer and recognized a need for a more systematic approach to design. Over the following two years, I built and expanded a design system in Figma and React. I named it &lt;strong&gt;Commonplace&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-challenge&quot;&gt;The challenge&lt;/h2&gt;
&lt;p&gt;Cityblock was less than two years old, but Commons already offered a sprawling set of features, including: tracking member status, charting member acuity, coordinating member outreach, storing and editing core demographics, viewing health history, scheduling events, managing tasks for individuals and teams, creating and administering health assessments with automated scoring, texting members… all that, and more planned.&lt;/p&gt;
&lt;p&gt;All of these features converged in an interface that looked like this:&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/initial.vEzOHtYW_1Qt4VT.webp&quot; alt=&quot;The Cityblock dashboard. There are many different styles, colors, and
fonts.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3360&quot; height=&quot;2100&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The appearance of Commons when I joined Cityblock.&lt;/strong&gt; Here, in the
right-hand drawer, a user is composing a progress note about the current
member. The varying colors, typography, and hierarchy make the interface
difficult to understand. All member data displayed in this case study is
notional.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Although there were some underlying commonalities and shared language throughout the product, &lt;strong&gt;the design was not scaling to meet the needs of its users or developers.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A lack of systemization was leading to longer development times, more time spent on undifferentiated work, more bugs in the product, and a user experience that was inconsistent and confusing. These problems would only worsen as Cityblock grew.&lt;/p&gt;
&lt;h2 id=&quot;mapping-the-territory&quot;&gt;Mapping the territory&lt;/h2&gt;
&lt;p&gt;Together with Cityblock’s Director of Design, &lt;a href=&quot;https://www.nevesrodrigues.com/&quot;&gt;Neves&lt;/a&gt;, we catalogued the available views. I conducted a product audit, clicking through and taking screenshots of every view, dialog, drawer, and dropdown within Commons. The images were then organized into folders for future reference.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;div class=&quot;video-wrapper&quot;&gt;&lt;video autoplay loop muted playsinline preload=&quot;none&quot; poster=&quot;/video/product-audit-poster.png&quot;&gt;&lt;source src=&quot;/video/product-audit.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;A product audit.&lt;/strong&gt; We captured screenshots from every corner of Commons
and organized them in folders corresponding to the app’s information
architecture.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The product audit helped us understand the current state of Commons, and it ushered in an essential archival practice for the future. Throughout my tenure at Cityblock, I would continue to catalogue product interfaces at least once a year.&lt;/p&gt;
&lt;p&gt;Following the product audit, we created an &lt;a href=&quot;https://bradfrost.com/blog/post/interface-inventory/&quot;&gt;interface inventory&lt;/a&gt;, collecting all variations and permutations of each component and displaying a collage of those permutations on a large poster board.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/inventory.yRIJ3CFE_1cLXG3.webp&quot; alt=&quot;A black foam board with several sheets of paper pinned to it. Each sheet of
paper displays a component name and a collection of variations on that
component observed in the product.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1784&quot; height=&quot;1339&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The interface inventory.&lt;/strong&gt; The product audit screenshots were used to
create a collage of each component’s variations. How many header styles can
you count?&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;This inventory allowed us to more easily spot inconsistencies and discuss how best to resolve them across the system.&lt;/p&gt;
&lt;h2 id=&quot;laying-foundations&quot;&gt;Laying foundations&lt;/h2&gt;
&lt;p&gt;Once the interface inventory was complete, we focused on design foundations—typography, color, and spacing. All components rest on top of these three primitives, and we wanted to get the essentials right.&lt;/p&gt;
&lt;h3 id=&quot;typography&quot;&gt;Typography&lt;/h3&gt;
&lt;p&gt;Care teams at Cityblock are given small Chromebooks to take with them around the city. They use their Chromebooks to access Commons in many locations: the office, at community hubs, in members’ homes, and in their car or on the subway.&lt;/p&gt;
&lt;p&gt;As we laid out a typographic scale and compared different typefaces, we made sure to test text on the Chromebook’s low-DPI display in a variety of real-world, less-than-ideal lighting conditions, in order to ensure that Commons was legible in every setting.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/low-contrast-typography.DWuD7gXS_ZdhL7s.webp&quot; alt=&quot;A screen within Commons&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3360&quot; height=&quot;2100&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Low-contrast typography within Commons.&lt;/strong&gt; Many views contained small,
light text which was difficult to read under ideal conditions, and
practically impossible in others. All data is notional.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;With Cityblock’s brand designer, &lt;a href=&quot;https://www.linkedin.com/in/minji-lee-ba045518/&quot;&gt;Minji&lt;/a&gt;, we tested various typefaces for the product before landing on &lt;a href=&quot;https://commercialtype.com/catalog/graphik&quot;&gt;Graphik&lt;/a&gt; for its legibility and understated friendliness. All text colors within the new design system would adhere to &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum&quot;&gt;WCAG AA&lt;/a&gt; or &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced&quot;&gt;AAA&lt;/a&gt; contrast ratios.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/typography.By97b-EE_Z1UeX3m.webp&quot; alt=&quot;The Commonplace typographic scale, using the font,
Graphik.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3840&quot; height=&quot;2160&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The typographic scale.&lt;/strong&gt; The base unit is set to 16 pixels and most header
sizes scale up from there using
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units#ems_and_rems&quot;&gt;&lt;code&gt;rem&lt;/code&gt;&lt;/a&gt;.
After experimentation, we decided to break this scale for the body size (15
pixels) and small text (13 pixels) in order to maintain medium-high data
density.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;color&quot;&gt;Color&lt;/h3&gt;
&lt;p&gt;When considering colors in Commons, we prioritized pure function, accessibility and contrast, relation to the brand, and coherence as a whole.&lt;/p&gt;
&lt;p&gt;I also examined the use of color in film to portray two separate settings—the hospital and the home.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;div class=&quot;two-up&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/hospital-palette.cn4IXU-K_Z1Q4Ff.webp&quot; alt=&quot;A collage of various hospital settings portrayed in film and
TV.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1440&quot; height=&quot;1080&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/_astro/home-palette.BhhfsY6-_Z22nDw0.webp&quot; alt=&quot;A collage of various &amp;quot;home&amp;quot; settings portrayed in film and TV.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1440&quot; height=&quot;1080&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Colors of the hospital, and colors of home.&lt;/strong&gt; What feelings do these scenes evoke?&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The hospital blue-greens are distinctly clinical, down to the robes worn by patients and doctors, and feel somber and sterile. “Home” tones, in contrast, emit a warm, welcoming glow. I wrote at the time, “Cityblock should feel less like the hospital, and more like home.”&lt;/p&gt;
&lt;p&gt;This led to guiding principles:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Guiding Principles for Color in Commons&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Color gently.&lt;/strong&gt; Opt for soft, subdued tones. Avoid highly-saturated, electric colors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use high contrast elements sparingly.&lt;/strong&gt; What is the one action on any given view that deserves attention?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skew warm.&lt;/strong&gt; Do not tint neutrals blue.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;And the resulting palette, defined as matching Figma styles and CSS variables:&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/colors.Cr8fVxx9_GOX1y.webp&quot; alt=&quot;The Commonplace color palette with matching variables in
CSS.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3840&quot; height=&quot;2160&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The color palette.&lt;/strong&gt; Colors are arranged along a spectrum from 100 (light)
to 900 (dark). Some colors are aliased with a semantic name, so developers
don’t need to remember that icons are &lt;code&gt;--color-neutral-600&lt;/code&gt;. They can just
use &lt;code&gt;--color-icon&lt;/code&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;spacing&quot;&gt;Spacing&lt;/h3&gt;
&lt;p&gt;We agreed to use an 8 pixel grid for all components, and we agreed on specific fixed widths for sidebars while leaving the rest of the app responsive to scale with the browser.&lt;/p&gt;
&lt;h2 id=&quot;building-components&quot;&gt;Building components&lt;/h2&gt;
&lt;p&gt;Once foundations were in place, primitives were set up both in Figma and as CSS Variables in the codebase, and we were able to quickly and easily replace all existing hex codes with new color variables, replace existing padding, margin, widths, and heights with the new spacing scale, and swap out the typography.&lt;/p&gt;
&lt;p&gt;Then began the long and steady process of building and replacing components one-by-one. Create a new &lt;code&gt;Button&lt;/code&gt;. Test it. Swap out all existing buttons and delete all existing styles. Merge in the changes. Pick a new component, rinse and repeat.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/components.CmYBJ78E_Z1JIB37.webp&quot; alt=&quot;Components displayed in Figma and in code.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3840&quot; height=&quot;2160&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Commonplace components.&lt;/strong&gt; Each component in the codebase included unit
tests, a Storybook story, and &lt;a href=&quot;https://jsdoc.app/about-getting-started&quot;&gt;JSDoc
comments&lt;/a&gt; for each prop in order to
provide in-context documentation within VS Code.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Component work took place over the course of many months, alongside other feature work I was involved in. It took place largely independently, although I continued to collaborate with &lt;a href=&quot;https://www.nevesrodrigues.com/&quot;&gt;Neves&lt;/a&gt; for visual and interaction design feedback, researchers like &lt;a href=&quot;https://www.linkedin.com/in/amberhamptongreene/&quot;&gt;Amber&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/taylorjmaynard/&quot;&gt;Taylor&lt;/a&gt; for user insights, and engineers like &lt;a href=&quot;https://www.zamiang.com/&quot;&gt;Brennan&lt;/a&gt;, &lt;a href=&quot;https://aster.fyi/&quot;&gt;Aster&lt;/a&gt;, and &lt;a href=&quot;http://www.craigspaeth.com/&quot;&gt;Craig&lt;/a&gt; for code review.&lt;/p&gt;
&lt;p&gt;We chose an incremental approach—rather than building and shipping an entirely new design system all at once—in order to maintain forward momentum, bug test along the way, and enable new features to be built with new components as quickly as possible.&lt;/p&gt;
&lt;h2 id=&quot;outcomes&quot;&gt;Outcomes&lt;/h2&gt;
&lt;p&gt;By January 2020, most views within Commons used Commonplace components. &lt;strong&gt;Responses from engineers and care team members were overwhelmingly positive.&lt;/strong&gt; Bug reports decreased, new features became easier to build, and engineers got to spend more time on differentiated work and less time fiddling with CSS.&lt;/p&gt;
&lt;p&gt;Despite the addition of new components, several thousand lines of code had been deleted since the start of the project due to the reusability and modular nature of the design system—a meaningful reduction in complexity and technical debt.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;before-after data-astro-cid-67ggu7zt=&quot;true&quot;&gt;&lt;div class=&quot;container&quot; data-astro-cid-67ggu7zt&gt;&lt;img src=&quot;/_astro/action-plan-before.ZjE6W9CK_ZvFcAW.webp&quot; alt=&quot;The action plan in Commons before the introduction of Commonplace.&quot; data-astro-cid-67ggu7zt=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3306&quot; height=&quot;2170&quot; class=&quot;image image-before&quot;&gt;&lt;img src=&quot;/_astro/action-plan-after.DaWzusR__Z26GCHc.webp&quot; alt=&quot;The action plan in Commons after the introduction of Commonplace.&quot; data-astro-cid-67ggu7zt=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3306&quot; height=&quot;2170&quot; class=&quot;image image-after&quot;&gt;&lt;input type=&quot;range&quot; min=&quot;0&quot; max=&quot;100&quot; value=&quot;50&quot; class=&quot;slider&quot; aria-label=&quot;Percentage of before photo shown&quot; data-astro-cid-67ggu7zt&gt;&lt;div class=&quot;slider-line&quot; data-astro-cid-67ggu7zt&gt;&lt;/div&gt;&lt;div class=&quot;slider-button&quot; aria-hidden=&quot;true&quot; data-astro-cid-67ggu7zt&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; data-astro-cid-67ggu7zt&gt;&lt;path d=&quot;M9 6 3 12 9 18V6ZM15 18 21 12 15 6V18Z&quot; data-astro-cid-67ggu7zt&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/before-after&gt;&lt;script type=&quot;module&quot; src=&quot;/opt/buildhome/repo/src/components/BeforeAfter.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Member action plan, before (early 2019) and after (early 2020).&lt;/strong&gt; More
information is available at a glance, without drilling down into cards and
accordions.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;before-after data-astro-cid-67ggu7zt=&quot;true&quot;&gt;&lt;div class=&quot;container&quot; data-astro-cid-67ggu7zt&gt;&lt;img src=&quot;/_astro/member-table-before.DKCX4Uk9_Z21cNNA.webp&quot; alt=&quot;The member table in Commons before the introduction of Commonplace.&quot; data-astro-cid-67ggu7zt=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3306&quot; height=&quot;2170&quot; class=&quot;image image-before&quot;&gt;&lt;img src=&quot;/_astro/member-table-after.DoDwFhAD_Yna4P.webp&quot; alt=&quot;The member table in Commons after the introduction of Commonplace.&quot; data-astro-cid-67ggu7zt=&quot;true&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3306&quot; height=&quot;2170&quot; class=&quot;image image-after&quot;&gt;&lt;input type=&quot;range&quot; min=&quot;0&quot; max=&quot;100&quot; value=&quot;50&quot; class=&quot;slider&quot; aria-label=&quot;Percentage of before photo shown&quot; data-astro-cid-67ggu7zt&gt;&lt;div class=&quot;slider-line&quot; data-astro-cid-67ggu7zt&gt;&lt;/div&gt;&lt;div class=&quot;slider-button&quot; aria-hidden=&quot;true&quot; data-astro-cid-67ggu7zt&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; data-astro-cid-67ggu7zt&gt;&lt;path d=&quot;M9 6 3 12 9 18V6ZM15 18 21 12 15 6V18Z&quot; data-astro-cid-67ggu7zt&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/before-after&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Member table, before (early 2019) and after (early 2020).&lt;/strong&gt; We aimed to
main medium-high data density, helpful for our care staff, while making the
UI feel more approachable and calm.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Around this time, I gave a company-wide talk about design systems, a concept which was unfamiliar to many people outside of the tech team. There was palpable excitement over seeing the drastic comparisons of before and after screens.&lt;/p&gt;
&lt;p&gt;I would continue to contribute design and code toward Commonplace until my departure in July 2021.&lt;/p&gt;
&lt;h2 id=&quot;reflections&quot;&gt;Reflections&lt;/h2&gt;
&lt;p&gt;Care teams at Cityblock do difficult, meaningful work, and it’s essential that the technology we build for them respects their time and energy. I’m proud of the way I was able to help transform Cityblock’s approach to design and engineering, and (hopefully) reduce stress for our hard-working care teams.&lt;/p&gt;
&lt;p&gt;Health tech is a complex space, and I still see dozens of ways that Commons could be streamlined. A design system is only as strong as the features it’s used to build, but where a design system ends and product features begin isn’t always clear. There is always more to do.&lt;/p&gt;
&lt;p&gt;As I write this, in February 2024, &lt;strong&gt;I’ve just &lt;a href=&quot;https://www.linkedin.com/posts/evadecker_its-been-awhile-but-im-excited-to-be-back-activity-7166518870042730496-bUhd?utm_source=share&amp;amp;utm_medium=member_desktop&quot;&gt;returned to Cityblock&lt;/a&gt; to help level up design systems again.&lt;/strong&gt; After 3 years’ absence, the system foundations I put in place have held up well. Some areas have flourished, others have remained the same, and a few weeds have sprouted, but it’s a wonderful feeling to see the work you put so much effort into continue to endure.&lt;/p&gt;</content:encoded></item><item><title>Building data-driven design systems</title><link>https://ky.fyi/posts/data-driven</link><guid isPermaLink="true">https://ky.fyi/posts/data-driven</guid><description>How I scaled Scribe&apos;s design system to help serve over 6 million users.</description><pubDate>Tue, 08 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;In June 2024, I joined &lt;a href=&quot;https://scribe.com&quot;&gt;Scribe&lt;/a&gt; as its first (and only) Design Engineer. Scribe’s VP of Design, &lt;a href=&quot;https://www.tonygines.com/&quot;&gt;Tony Gines&lt;/a&gt;, had hired me to take the existing design system and improve its consistency, polish, and accessibility.&lt;/p&gt;
&lt;p&gt;Scribe is a tool—commonly used through a &lt;a href=&quot;https://scribe.com/install/install-extension&quot;&gt;browser extension&lt;/a&gt;—which allows users to record clicks and keystrokes to automatically generate step-by-step guides. It’s commonly used for creating things like product tutorials and standard operating procedures (SOPs), and is used by over 600,000 businesses, including &lt;a href=&quot;https://scribe.com/customers&quot;&gt;94% of the Fortune 500&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-problem&quot;&gt;The problem&lt;/h3&gt;
&lt;p&gt;Scribe’s design system, called Stylus, was beginning to show cracks. The system was built on a solid foundation using &lt;a href=&quot;https://www.radix-ui.com&quot;&gt;Radix UI&lt;/a&gt; and &lt;a href=&quot;https://tailwindcss.com&quot;&gt;Tailwind&lt;/a&gt;. But as the company expanded, without a dedicated maintainer, issues had emerged:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fragmented documentation&lt;/strong&gt; made it unclear what capabilities the system had and how it was intended to be used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Low adoption&lt;/strong&gt; meant that teams often defaulted to building new, one-off components, rather than contributing back to the system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconsistent component APIs&lt;/strong&gt; and a lack of strategy around tokens caused inconsistencies that affected the user experience and damaged trust.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility issues&lt;/strong&gt;—like low-contrast text, missing focus rings, and unclickable checkbox labels—prevented certain users from accessing Scribe altogether.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had built &lt;a href=&quot;/posts/commonplace&quot;&gt;previous design systems&lt;/a&gt; and I knew how to address these problems. But I wanted to go a step further and quantify how much the design system improved over time. I wanted to foster a practice of regularly assessing the state of the design system, soliciting feedback and critique from every team member.&lt;/p&gt;
&lt;h2 id=&quot;taking-a-pulse-design-system-surveys&quot;&gt;Taking a pulse: design system surveys&lt;/h2&gt;
&lt;p&gt;The month I joined, I wrote and sent a survey to every engineer, designer, and product manager. I would administer and synthesize this same survey every six months during my tenure.&lt;/p&gt;
&lt;p&gt;In the survey, I asked participants to rate six statements (like “Stylus documentation helps answer most questions that arise.”) on a 5-point &lt;a href=&quot;https://en.wikipedia.org/wiki/Likert_scale&quot;&gt;Likert scale&lt;/a&gt;, plus rate overall quality on a scale of ten. Low ratings prompted open-ended feedback that fed directly into design system priorities.&lt;/p&gt;
&lt;figure class=&quot;popout inset&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/predictability-response.B5F1PZt7_dCp6k.webp&quot; alt=&quot;Respondents asked for greater consistency for prop names across components and allowing more components to use element slots over string props to allow for greater customization and composability. Overall, satisfaction remains high.
Responses: What would help Stylus components work more predictably?
Some components like the table would be better with stronger defaults or more behaviors implemented (e.g., sticky header row, right aligning/locale formatting numeric columns)
Components are fairly predictable / easy to parse
Generally incorporating warning and error states, and expanding components to take in Elements rather than only strings
Tables (for example) has multiple versions
Having all the props be the same across stylus components (like size, variant, etc)
I&apos;m neutral because I haven&apos;t used Stylus enough to get much signal either way.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2054&quot; height=&quot;1956&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Survey results.&lt;/strong&gt; One part of a much larger Notion doc which synthesized all data alongside open-ended responses. Here, team members request various ways to make the system more predictable.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;results-18-months-later&quot;&gt;Results, 18 months later&lt;/h2&gt;
&lt;p&gt;Here are the trends that emerged from four surveys, collected over nearly two years, along with some of the actions that drove the changes and free responses from survey participants.&lt;/p&gt;
&lt;h3 id=&quot;meeting-feature-needs&quot;&gt;Meeting feature needs&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;I can use existing Stylus components for most new features.&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value positive&quot; data-astro-cid-524mpnjh&gt;Up 10%&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,186.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,135)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,83.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;1&lt;/text&gt;&lt;text transform=&quot;translate(0,186.5)&quot; y=&quot;0.32em&quot;&gt;2&lt;/text&gt;&lt;text transform=&quot;translate(0,135)&quot; y=&quot;0.32em&quot;&gt;3&lt;/text&gt;&lt;text transform=&quot;translate(0,83.5)&quot; y=&quot;0.32em&quot;&gt;4&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:950ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:18.281612607199236px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;18.281612607199236&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:18.281612607199236px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;18.281612607199236&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:17.350451577603952px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;17.350451577603952&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:17.350451577603952px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;17.350451577603952&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:16.359032633914385px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;16.359032633914385&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:15.293881025767934px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;15.293881025767934&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:11.400193421607682px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;11.400193421607682&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:11.400193421607682px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;11.400193421607682&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:11.400193421607682px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;11.400193421607682&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:11.400193421607682px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;11.400193421607682&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,83.5C48,83.5,122.39,74.186,159.536,73.69C196.544,73.197,233.526,82.137,270.464,80.471C307.681,78.791,382,63.472,382,63.472&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;73.69047619047618&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;80.47058823529413&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;63.4722222222222&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,83.5)&quot; y=&quot;0.32em&quot;&gt;4.0&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,73.69047619047618)&quot; y=&quot;0.32em&quot;&gt;4.2&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,80.47058823529413)&quot; y=&quot;0.32em&quot;&gt;4.1&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,63.4722222222222)&quot; y=&quot;0.32em&quot;&gt;4.4&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;/opt/buildhome/repo/src/content/posts/data-driven/RatingDistributionChart.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;p&gt;The share of people using existing components for most new features increased by 10% thanks to &lt;strong&gt;improved teamwide communication&lt;/strong&gt; about design system updates, &lt;strong&gt;better documentation&lt;/strong&gt;, and &lt;strong&gt;preemptive updates to support new product features&lt;/strong&gt; (for example, I led the addition of dark mode support across our design system to anticipate the launch of a new product feature that prominently used dark colors).&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“This is probably one of the best looking component libraries i’ve ever worked with”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h3 id=&quot;predictability&quot;&gt;Predictability&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;Stylus components generally work the way I expect them to.&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value positive&quot; data-astro-cid-524mpnjh&gt;Up 12%&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,186.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,135)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,83.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;1&lt;/text&gt;&lt;text transform=&quot;translate(0,186.5)&quot; y=&quot;0.32em&quot;&gt;2&lt;/text&gt;&lt;text transform=&quot;translate(0,135)&quot; y=&quot;0.32em&quot;&gt;3&lt;/text&gt;&lt;text transform=&quot;translate(0,83.5)&quot; y=&quot;0.32em&quot;&gt;4&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:950ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:20px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:20px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:19.233687939614086px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;19.233687939614086&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:14.727922061357855px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;14.727922061357855&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:13.618950038622252px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;13.618950038622252&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:13.618950038622252px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;13.618950038622252&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:12.392304845413264px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;12.392304845413264&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:9.348469228349535px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;9.348469228349535&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:7.196152422706632px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;7.196152422706632&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:7.196152422706632px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;7.196152422706632&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,77.441C48,77.441,122.217,58.729,159.536,53.684C196.375,48.704,233.43,47.427,270.464,47.147C307.584,46.866,382,52.028,382,52.028&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;77.44117647058826&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;53.68421052631581&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;47.147058823529406&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;52.0277777777778&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,77.44117647058826)&quot; y=&quot;0.32em&quot;&gt;4.1&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,53.68421052631581)&quot; y=&quot;0.32em&quot;&gt;4.6&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,47.147058823529406)&quot; y=&quot;0.32em&quot;&gt;4.7&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,52.0277777777778)&quot; y=&quot;0.32em&quot;&gt;4.6&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;12% more people reported that components work the way they expect—often thanks to changes stemming from prior survey feedback! &lt;strong&gt;Consolidating Tailwind configs&lt;/strong&gt; into a single source of truth helped considerably, along with &lt;strong&gt;favoring composition instead of configuration&lt;/strong&gt; for complex components.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“Stylus is great to use, enjoy that ai coding tools have no problem using our design system, appreciate all the great work!”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h3 id=&quot;naming&quot;&gt;Naming&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;Stylus component, token, and property names make sense to me.&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value positive&quot; data-astro-cid-524mpnjh&gt;Up 11%&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,186.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,135)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,83.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;1&lt;/text&gt;&lt;text transform=&quot;translate(0,186.5)&quot; y=&quot;0.32em&quot;&gt;2&lt;/text&gt;&lt;text transform=&quot;translate(0,135)&quot; y=&quot;0.32em&quot;&gt;3&lt;/text&gt;&lt;text transform=&quot;translate(0,83.5)&quot; y=&quot;0.32em&quot;&gt;4&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:950ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:20px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:18.664761795905925px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;18.664761795905925&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:17.2127765851133px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;17.2127765851133&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:13.783766072743587px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;13.783766072743587&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:12.757057484009543px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;12.757057484009543&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:12.757057484009543px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;12.757057484009543&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:11.621404708847278px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;11.621404708847278&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:6.810702354423639px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;6.810702354423639&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,68.353C48,68.353,122.218,49.057,159.536,45.553C196.376,42.093,233.441,47.495,270.464,47.147C307.596,46.798,382,43.444,382,43.444&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;68.3529411764706&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;45.552631578947384&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;47.147058823529406&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;43.44444444444445&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,68.3529411764706)&quot; y=&quot;0.32em&quot;&gt;4.3&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,45.552631578947384)&quot; y=&quot;0.32em&quot;&gt;4.7&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,47.147058823529406)&quot; y=&quot;0.32em&quot;&gt;4.7&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,43.44444444444445)&quot; y=&quot;0.32em&quot;&gt;4.8&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Naming clarity increased by 11% as I worked to extract and &lt;strong&gt;reuse shared prop types&lt;/strong&gt;, &lt;strong&gt;extend (rather than redeclare) native HTML props&lt;/strong&gt;, and &lt;strong&gt;establish global naming patterns&lt;/strong&gt; like prefixing boolean props with &lt;code&gt;is&lt;/code&gt;, &lt;code&gt;has&lt;/code&gt;, or &lt;code&gt;should&lt;/code&gt;.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“Thanks for constant improvements to an already excellently defined design system”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h3 id=&quot;saving-time&quot;&gt;Saving time&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;Stylus saves me time on work that would otherwise take longer.&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value steady&quot; data-astro-cid-524mpnjh&gt;Steady&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,186.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,135)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,83.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;1&lt;/text&gt;&lt;text transform=&quot;translate(0,186.5)&quot; y=&quot;0.32em&quot;&gt;2&lt;/text&gt;&lt;text transform=&quot;translate(0,135)&quot; y=&quot;0.32em&quot;&gt;3&lt;/text&gt;&lt;text transform=&quot;translate(0,83.5)&quot; y=&quot;0.32em&quot;&gt;4&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:950ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:18.908055859299036px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;18.908055859299036&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:18.33473383351454px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;18.33473383351454&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:17.123024907502508px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;17.123024907502508&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:11.761870601839528px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;11.761870601839528&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:9.561512453751254px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;9.561512453751254&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:8.17394906513032px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;8.17394906513032&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:8.17394906513032px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;8.17394906513032&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:8.17394906513032px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;8.17394906513032&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,47.147C48,47.147,122.389,41.239,159.536,39.725C196.543,38.217,233.482,36.5,270.464,38.059C307.636,39.626,382,49.167,382,49.167&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;47.147058823529406&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;39.72500000000002&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;38.05882352941174&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;49.16666666666665&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,47.147058823529406)&quot; y=&quot;0.32em&quot;&gt;4.7&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,39.72500000000002)&quot; y=&quot;0.32em&quot;&gt;4.8&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,38.05882352941174)&quot; y=&quot;0.32em&quot;&gt;4.9&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,49.16666666666665)&quot; y=&quot;0.32em&quot;&gt;4.7&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Time savings held roughly steady across the four surveys. While I made progress in many areas, some metrics were good from the start.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“I cannot tell you how much time Stylus saves me!! And any time I’ve had an issue and brought it up Ky is super speedy at proposing and making a fix, 10/10.”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h3 id=&quot;documentation&quot;&gt;Documentation&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;Stylus documentation helps answer most questions that arise.&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value positive&quot; data-astro-cid-524mpnjh&gt;Up 40%&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,186.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,135)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,83.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;1&lt;/text&gt;&lt;text transform=&quot;translate(0,186.5)&quot; y=&quot;0.32em&quot;&gt;2&lt;/text&gt;&lt;text transform=&quot;translate(0,135)&quot; y=&quot;0.32em&quot;&gt;3&lt;/text&gt;&lt;text transform=&quot;translate(0,83.5)&quot; y=&quot;0.32em&quot;&gt;4&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:950ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:19.29384061094941px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;19.29384061094941&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:18.557591798140397px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;18.557591798140397&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:13.163126113028762px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;13.163126113028762&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:13.163126113028762px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;13.163126113028762&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:13.163126113028762px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;13.163126113028762&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:13.163126113028762px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;13.163126113028762&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:13.163126113028762px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;13.163126113028762&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:10.646920305474705px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;10.646920305474705&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:10.646920305474705px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;10.646920305474705&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:9.060180864974626px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;9.060180864974626&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:9.060180864974626px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;9.060180864974626&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:6.9923017660270625px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;6.9923017660270625&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,122.882C48,122.882,121.393,78.096,159.536,65.475C195.648,53.527,233.354,48.427,270.464,47.147C307.509,45.869,382,57.75,382,57.75&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;122.88235294117646&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;65.47500000000002&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;47.147058823529406&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;57.75&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,122.88235294117646)&quot; y=&quot;0.32em&quot;&gt;3.2&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,65.47500000000002)&quot; y=&quot;0.32em&quot;&gt;4.3&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,47.147058823529406)&quot; y=&quot;0.32em&quot;&gt;4.7&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,57.75)&quot; y=&quot;0.32em&quot;&gt;4.5&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I led writing and publishing &lt;strong&gt;public, reader-friendly docs&lt;/strong&gt; using &lt;a href=&quot;https://starlight.astro.build&quot;&gt;Starlight&lt;/a&gt;, which significantly increased team members’ ability to answer questions about the design system. Since docs existed as Markdown in the codebase, this also &lt;strong&gt;improved agentic access&lt;/strong&gt; for developers using LLMs. I minimized drift by &lt;strong&gt;automatically populating API reference&lt;/strong&gt; tables based on JSDoc comments and TypeScript types and &lt;strong&gt;cross-linking resources&lt;/strong&gt; from Figma to code to the docs and back.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“The new docs are gamechanger! I reference them every day.”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h3 id=&quot;collaboration&quot;&gt;Collaboration&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;Stylus helps design and engineering roles collaborate more effectively.&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value positive&quot; data-astro-cid-524mpnjh&gt;Up 20%&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,186.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,135)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,83.5)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;1&lt;/text&gt;&lt;text transform=&quot;translate(0,186.5)&quot; y=&quot;0.32em&quot;&gt;2&lt;/text&gt;&lt;text transform=&quot;translate(0,135)&quot; y=&quot;0.32em&quot;&gt;3&lt;/text&gt;&lt;text transform=&quot;translate(0,83.5)&quot; y=&quot;0.32em&quot;&gt;4&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:50ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:345ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:655ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:950ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;186.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1000ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;135&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:18.908055859299036px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;18.908055859299036&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:15.09692375196198px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;15.09692375196198&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:14.347898130260637px;--delay:150ms&quot; class=&quot;bg-dot&quot; r=&quot;14.347898130260637&quot; cy=&quot;83.5&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:12.693593464148083px;--delay:755ms&quot; class=&quot;bg-dot&quot; r=&quot;12.693593464148083&quot; cy=&quot;83.5&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:11.761870601839528px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;11.761870601839528&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:10.731282501307987px;--delay:100ms&quot; class=&quot;bg-dot&quot; r=&quot;10.731282501307987&quot; cy=&quot;135&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:9.561512453751254px;--delay:1050ms&quot; class=&quot;bg-dot&quot; r=&quot;9.561512453751254&quot; cy=&quot;83.5&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:8.17394906513032px;--delay:705ms&quot; class=&quot;bg-dot&quot; r=&quot;8.17394906513032&quot; cy=&quot;135&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:8.17394906513032px;--delay:445ms&quot; class=&quot;bg-dot&quot; r=&quot;8.17394906513032&quot; cy=&quot;83.5&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:6.365641250653994px;--delay:395ms&quot; class=&quot;bg-dot&quot; r=&quot;6.365641250653994&quot; cy=&quot;135&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,80.471C48,80.471,122.036,45.144,159.536,42.3C196.205,39.519,233.461,62.552,270.464,62.294C307.616,62.036,382,40.583,382,40.583&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;80.47058823529413&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;42.30000000000001&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;62.294117647058805&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;40.58333333333335&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,80.47058823529413)&quot; y=&quot;0.32em&quot;&gt;4.1&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,42.30000000000001)&quot; y=&quot;0.32em&quot;&gt;4.8&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,62.294117647058805)&quot; y=&quot;0.32em&quot;&gt;4.4&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,40.58333333333335)&quot; y=&quot;0.32em&quot;&gt;4.8&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Sentiments around collaboration improved by 20% owing to &lt;strong&gt;reduced discrepencies between Figma and code&lt;/strong&gt;, and a culture of &lt;strong&gt;encouraging new contributions&lt;/strong&gt; to the design system from folks across all teams.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“Adoption and product / design alignment are quite strong here at scribe and its made using the library super easy. Keep it up!”&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;“This is one of the better component libraries and collaborative experience between design engineers and product engineers Ive seen making development much quicker! Its a great dev experience being able to consume from our stylus library but also having the ability to dig into components to make suggestions / changes with quick review turn around.”&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;“Reviews are always constructive and quickly guide or enable an engineer to help improve the library.”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h3 id=&quot;overall&quot;&gt;Overall&lt;/h3&gt;
&lt;div&gt;&lt;div class=&quot;rating-chart float right&quot; data-astro-cid-524mpnjh&gt;&lt;h3 class=&quot;title&quot; data-astro-cid-524mpnjh&gt;Overall, how would you rate the quality of Stylus?&lt;/h3&gt;&lt;p class=&quot;change&quot; data-astro-cid-524mpnjh&gt;&lt;span class=&quot;change-value positive&quot; data-astro-cid-524mpnjh&gt;Up 20%&lt;/span&gt; over 18 months&lt;/p&gt;&lt;div class=&quot;plot&quot; data-astro-cid-524mpnjh&gt;&lt;svg xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 430 300&quot; height=&quot;300&quot; width=&quot;430&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; font-family=&quot;system-ui, sans-serif&quot; fill=&quot;currentColor&quot; class=&quot;plot-d6a7b5&quot;&gt;&lt;style&gt;:where(.plot-d6a7b5) {
  --plot-background: white;
  display: block;
  height: auto;
  height: intrinsic;
  max-width: 100%;
}
:where(.plot-d6a7b5 text),
:where(.plot-d6a7b5 tspan) {
  white-space: pre;
}&lt;/style&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;x-axis tick&quot;&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(48,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(159.53649635036496,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(270.4635036496351,270)&quot; /&gt;&lt;path d=&quot;M0,0L0,6&quot; transform=&quot;translate(382,270)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,9)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;x-axis tick label&quot;&gt;&lt;text transform=&quot;translate(48,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2024&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(159.53649635036496,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;text transform=&quot;translate(270.4635036496351,270)&quot;&gt;&lt;tspan y=&quot;0.71em&quot; x=&quot;0&quot;&gt;Jun&lt;/tspan&gt;&lt;tspan dy=&quot;1em&quot; x=&quot;0&quot;&gt;2025&lt;/tspan&gt;&lt;/text&gt;&lt;text transform=&quot;translate(382,270)&quot; y=&quot;0.71em&quot;&gt;Dec&lt;/text&gt;&lt;/g&gt;&lt;g stroke=&quot;var(--gray-7)&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot; aria-label=&quot;y-axis tick&quot;&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,238)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,196.8)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,155.6)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,114.4)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,73.19999999999999)&quot; /&gt;&lt;path d=&quot;M0,0L-6,0&quot; transform=&quot;translate(0,32)&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(-9,0)&quot; font-variant=&quot;tabular-nums&quot; font-size=&quot;14&quot; text-anchor=&quot;end&quot; fill=&quot;var(--gray-11)&quot; aria-label=&quot;y-axis tick label&quot;&gt;&lt;text transform=&quot;translate(0,238)&quot; y=&quot;0.32em&quot;&gt;5&lt;/text&gt;&lt;text transform=&quot;translate(0,196.8)&quot; y=&quot;0.32em&quot;&gt;6&lt;/text&gt;&lt;text transform=&quot;translate(0,155.6)&quot; y=&quot;0.32em&quot;&gt;7&lt;/text&gt;&lt;text transform=&quot;translate(0,114.4)&quot; y=&quot;0.32em&quot;&gt;8&lt;/text&gt;&lt;text transform=&quot;translate(0,73.19999999999999)&quot; y=&quot;0.32em&quot;&gt;9&lt;/text&gt;&lt;text transform=&quot;translate(0,32)&quot; y=&quot;0.32em&quot;&gt;10&lt;/text&gt;&lt;/g&gt;&lt;rect height=&quot;270&quot; width=&quot;430&quot; y=&quot;0&quot; x=&quot;0&quot; stroke=&quot;var(--gray-6)&quot; fill=&quot;none&quot; aria-label=&quot;frame&quot; /&gt;&lt;g fill=&quot;var(--gray-6)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:1px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:40ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;196.8&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:80ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;155.6&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:120ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;114.4&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:160ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;73.19999999999999&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:200ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:295ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:335ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;196.8&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:375ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;155.6&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:415ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;114.4&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:455ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;73.19999999999999&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:605ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:645ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;196.8&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:685ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;155.6&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:725ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;114.4&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:765ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;73.19999999999999&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:900ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;238&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:940ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;196.8&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:980ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;155.6&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1020ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;114.4&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1060ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;73.19999999999999&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:1px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;1&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g fill=&quot;var(--gray-5)&quot; aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--target-r:20px;--delay:805ms&quot; class=&quot;bg-dot&quot; r=&quot;20&quot; cy=&quot;32&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:19.162326606420663px;--delay:120ms&quot; class=&quot;bg-dot&quot; r=&quot;19.162326606420663&quot; cy=&quot;114.4&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:18.281612607199236px;--delay:415ms&quot; class=&quot;bg-dot&quot; r=&quot;18.281612607199236&quot; cy=&quot;114.4&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:18.281612607199236px;--delay:1100ms&quot; class=&quot;bg-dot&quot; r=&quot;18.281612607199236&quot; cy=&quot;32&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:15.293881025767934px;--delay:80ms&quot; class=&quot;bg-dot&quot; r=&quot;15.293881025767934&quot; cy=&quot;155.6&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:15.293881025767934px;--delay:1020ms&quot; class=&quot;bg-dot&quot; r=&quot;15.293881025767934&quot; cy=&quot;114.4&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:15.293881025767934px;--delay:455ms&quot; class=&quot;bg-dot&quot; r=&quot;15.293881025767934&quot; cy=&quot;73.19999999999999&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:12.854408404799491px;--delay:725ms&quot; class=&quot;bg-dot&quot; r=&quot;12.854408404799491&quot; cy=&quot;114.4&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:12.854408404799491px;--delay:495ms&quot; class=&quot;bg-dot&quot; r=&quot;12.854408404799491&quot; cy=&quot;32&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:11.400193421607682px;--delay:765ms&quot; class=&quot;bg-dot&quot; r=&quot;11.400193421607682&quot; cy=&quot;73.19999999999999&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:11.400193421607682px;--delay:1060ms&quot; class=&quot;bg-dot&quot; r=&quot;11.400193421607682&quot; cy=&quot;73.19999999999999&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:9.675225788801976px;--delay:375ms&quot; class=&quot;bg-dot&quot; r=&quot;9.675225788801976&quot; cy=&quot;155.6&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:0ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;238&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:685ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;155.6&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:980ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;155.6&quot; cx=&quot;382&quot; /&gt;&lt;circle style=&quot;--target-r:7.4272042023997455px;--delay:160ms&quot; class=&quot;bg-dot&quot; r=&quot;7.4272042023997455&quot; cy=&quot;73.19999999999999&quot; cx=&quot;48&quot; /&gt;&lt;/g&gt;&lt;g stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; fill=&quot;none&quot; aria-label=&quot;line&quot;&gt;&lt;path class=&quot;mean-line&quot; pathlength=&quot;1&quot; d=&quot;M48,132.711C48,132.711,122.089,102.656,159.536,90.857C196.254,79.288,233.165,65.609,270.464,62.358C307.327,59.145,382,71.032,382,71.032&quot; /&gt;&lt;/g&gt;&lt;g aria-label=&quot;dot&quot;&gt;&lt;circle style=&quot;--i:0&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;132.7111111111111&quot; cx=&quot;48&quot; /&gt;&lt;circle style=&quot;--i:1&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;90.85714285714289&quot; cx=&quot;159.53649635036496&quot; /&gt;&lt;circle style=&quot;--i:2&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;62.357894736842084&quot; cx=&quot;270.4635036496351&quot; /&gt;&lt;circle style=&quot;--i:3&quot; class=&quot;mean-dot&quot; r=&quot;3&quot; cy=&quot;71.03157894736843&quot; cx=&quot;382&quot; /&gt;&lt;/g&gt;&lt;g transform=&quot;translate(0,-16)&quot; font-weight=&quot;bold&quot; font-size=&quot;16&quot; fill=&quot;var(--gray-12)&quot; aria-label=&quot;text&quot;&gt;&lt;text style=&quot;--i:0&quot; class=&quot;mean-label&quot; transform=&quot;translate(48,132.7111111111111)&quot; y=&quot;0.32em&quot;&gt;7.6&lt;/text&gt;&lt;text style=&quot;--i:1&quot; class=&quot;mean-label&quot; transform=&quot;translate(159.53649635036496,90.85714285714289)&quot; y=&quot;0.32em&quot;&gt;8.6&lt;/text&gt;&lt;text style=&quot;--i:2&quot; class=&quot;mean-label&quot; transform=&quot;translate(270.4635036496351,62.357894736842084)&quot; y=&quot;0.32em&quot;&gt;9.3&lt;/text&gt;&lt;text style=&quot;--i:3&quot; class=&quot;mean-label&quot; transform=&quot;translate(382,71.03157894736843)&quot; y=&quot;0.32em&quot;&gt;9.1&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Survey feedback is important, but it skews toward developer experience over end user experience. To counter this, I made sure to &lt;strong&gt;supplement internal surveys with user-centeric metrics&lt;/strong&gt;, like performance testing with &lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/overview/&quot;&gt;Lighthouse&lt;/a&gt;, accessibility testing with &lt;a href=&quot;https://playwright.dev&quot;&gt;Playwright&lt;/a&gt; and &lt;a href=&quot;https://github.com/dequelabs/axe-core&quot;&gt;axe-core&lt;/a&gt;, and visual regression testing with &lt;a href=&quot;https://www.chromatic.com&quot;&gt;Chromatic&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I supplemented the sentiment-driven survey data with quantitative data from &lt;a href=&quot;https://omlet.dev&quot;&gt;Omlet&lt;/a&gt;, a tool which runs static analysis on a codebase to determine how many times a component is used, how many times a prop is used, and how coverage changes over time. Thanks to insights from Omlet and a lot of deleted code, &lt;strong&gt;component coverage increased from 37% to 52% over 6 months&lt;/strong&gt;.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;“Keep crushing it! So appreciate your work”&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;“Y’all deserve ALL the kudos”&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;h2 id=&quot;reflections&quot;&gt;Reflections&lt;/h2&gt;
&lt;p&gt;Building a design system is a perpetual fight against entropy—the tendency of any sufficiently complex system to devolve into chaos. Taking a regular pulse helps the team stay focused on building what’s important.&lt;/p&gt;
&lt;p&gt;I’m proud of how I was able to help shape Scribe’s design system and team culture. It wouldn’t have been possible without the contributions and feedback of all my teammates along the way!&lt;/p&gt;
&lt;p&gt;A design system is never done, but we can always push ourselves a little further on the road to “better”. Here’s to measuring—and acting on—what matters.&lt;/p&gt;</content:encoded></item><item><title>Design outside the computer</title><link>https://ky.fyi/posts/design-outside-the-computer</link><guid isPermaLink="true">https://ky.fyi/posts/design-outside-the-computer</guid><description>Your digital UI can come from the physical world.</description><pubDate>Mon, 20 May 2024 17:30:34 GMT</pubDate><content:encoded>&lt;p&gt;This weekend, I added a new feature to my site. It’s an old-school kind of webpage—something I’ve always wanted to create, but never really had the tools for until now.&lt;/p&gt;
&lt;p&gt;It’s a &lt;a href=&quot;/guestbook&quot;&gt;guestbook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the guestbook, anyone can write and publish a short message accompanying a name and optional URL. Once submitted, the message gets published to the top of the page for everyone to see. That’s it—no likes, no shares, no threads. Nothing fancy.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/guestbook.CIP8h4rP_Z1Lc8Fp.webp&quot; alt=&quot;A collection of notecards with monospace text on them.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2880&quot; height=&quot;1420&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;The guestbook.&lt;/strong&gt; People have already written kind things and drawn snails.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/astro-db/&quot;&gt;Astro DB&lt;/a&gt;, recently released, made it a breeze to spin up a database and implement publishing, even for a backend novice like me. But this post isn’t about how to implement a guestbook. (UX developer &lt;a href=&quot;https://ryantrimble.com/&quot;&gt;Ryan Trimble&lt;/a&gt; already wrote a &lt;a href=&quot;https://ryantrimble.com/blog/creating-a-guestbook-with-astro-db/&quot;&gt;great tutorial&lt;/a&gt; for that!) It’s about how invigorating it can be to design digital UI when you step away from your computer.&lt;/p&gt;
&lt;p&gt;I didn’t want to build just any plain stream of messages and text—I wanted to create something that felt warm, personable, and tactile—like signing a real book. To accomplish that, I first did something important: I shut my laptop.&lt;/p&gt;
&lt;h2 id=&quot;the-death-of-texture&quot;&gt;The death of texture&lt;/h2&gt;
&lt;p&gt;The world around us is full of texture. From the bark of an elm tree to the weave of a linen blanket… even the body of a MacBook isn’t completely smooth. Most digital spaces, in contrast, are textureless. Flat expanses of nothingness, stretching into a grainless void.&lt;/p&gt;
&lt;p&gt;Our interfaces used to be more textured. During the heydey of &lt;a href=&quot;https://en.wikipedia.org/wiki/Skeuomorph#Virtual_examples&quot;&gt;skeuomorphism&lt;/a&gt; in the late 2000s, designers prided themselves on being able to craft realistic-looking wood grain, leather, glass, and other effects.&lt;/p&gt;
&lt;p&gt;In 2013, Apple released iOS 7, featuring a redesigned user interface which, under Jony Ive, fully embraced flat design, bringing a swift death to the iPhone’s skeuomorphism. The vast majority of digital spaces soon followed suit.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;div class=&quot;two-up&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/ios6.BSAAYVVU_lqlby.webp&quot; alt=&quot;The home screen of iOS 6.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;640&quot; height=&quot;1136&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/_astro/ios7.xkh0RJYz_Z1TvFFY.webp&quot; alt=&quot;The home screen of iOS 7.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;640&quot; height=&quot;1136&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;iOS 6 (left) and iOS 7 (right).&lt;/strong&gt; iOS 7’s flat design effectively killed skeuomorphic design trends across the industry. Images from &lt;a href=&quot;https://arstechnica.com/gadgets/2013/09/death-to-textures-ios-6-and-ios-7-compared-in-pictures/&quot;&gt;Ars Technica&lt;/a&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Although the usability of the digital landscape has improved greatly over the past decade, I can’t help but feel like the web lost a little bit of its soul when everything got flattened. So much of the web today feels boring, samey, and soulless.&lt;/p&gt;
&lt;h2 id=&quot;real-life-objects-can-live-on-your-website&quot;&gt;Real-life objects can live on your website&lt;/h2&gt;
&lt;p&gt;Let’s push that pendulum back the other direction! A bit, at least. Let’s give the web some soul. Let’s give it some &lt;strong&gt;texture&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;How do you add texture? You could browse for Photoshop packs and fiddle with layers and blend modes to emulate real life. Or, you could grab some paper, scissors, and markers, and go craft in your living room on a nice Spring day.&lt;/p&gt;
&lt;p&gt;The second option is way more fun.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/notecard-progress.BNYzWoh9_xx4ve.webp&quot; alt=&quot;Two stamps sit beside small rectangular piece of cream-color card stock. There is a red stamp on the paper with a hand holding a match alight.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1812&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Crafting cards.&lt;/strong&gt; Stamps from &lt;a href=&quot;https://www.caseyrubberstamps.com/&quot;&gt;Casey Rubber Stamps&lt;/a&gt; in NYC.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I spent an afternoon cutting out same-sized rectangles of card stock and doodling on them with whatever drawing tools I had around. Highlighters, pencil, crayons. Washi tape. Some ORAL stickers I stole from the queer health clinic. Every card is a little bit different.&lt;/p&gt;
&lt;p&gt;I scanned in the cards using a flatbed scanner, cleaned up the images in Photoshop, and optimized them for web. Now all these physical objects have a digital home. :)&lt;/p&gt;
&lt;h2 id=&quot;tips-for-bringing-physical-media-into-digital-ui&quot;&gt;Tips for bringing physical media into digital UI&lt;/h2&gt;
&lt;p&gt;Working with physical media is rewarding. Quirks of the medium show up in ways that would require large effort to reproduce digitally—the edges I cut are not quite straight; the lines I drew are not perfectly even. Sometimes the ink smudged. It’s okay! Desirable, even.&lt;/p&gt;
&lt;p&gt;But translating media into digital space takes care to show up and perform well. Here are a few tips if you’re thinking of bringing real-life objects into your digital designs.&lt;/p&gt;
&lt;h3 id=&quot;know-how-your-layout-will-flow-and-reflow&quot;&gt;Know how your layout will flow and reflow&lt;/h3&gt;
&lt;p&gt;Before starting, ask yourself: will text need to wrap to multiple lines? Will the element grow, or is it a static size? Does the design need to adapt to mobile? The more flexible the size of your elements, the more difficult it may be to craft physical media to support them.&lt;/p&gt;
&lt;p&gt;When designing cards for the guestbook, I decided to design around a consistent 4:3 aspect ratio. For this, you can use &lt;code&gt;aspect-ratio&lt;/code&gt; in CSS, which has coverage in &lt;a href=&quot;https://caniuse.com/?search=aspect-ratio&quot;&gt;94% of browsers used globally&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;/_astro/ec.kz0jn.css&quot;/&gt;&lt;script type=&quot;module&quot; src=&quot;/_astro/ec.0vx5m.js&quot;&gt;&lt;/script&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;.notecard&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; / &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;.notecard {  aspect-ratio: 4 / 3;}&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Enforcing a static aspect ratio means we need to be thoughtful about how much text a user can enter. How wide is each line of text? How many total characters can the content area support?&lt;/p&gt;
&lt;p&gt;We can use the &lt;code&gt;ch&lt;/code&gt; unit in CSS to define the maximum width of the text. The &lt;code&gt;ch&lt;/code&gt; unit is equal to the width of the character &lt;code&gt;0&lt;/code&gt; in the selected font, and since we’re using a monospace font where all characters are the same width, we can use &lt;code&gt;ch&lt;/code&gt; to display exactly 28 characters per line.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;.notecard&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;.content&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;28&lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;ch&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;.notecard .content {  width: 28ch;}&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;We want to allow users to draw ASCII art and other fun things, too. To do that, we need to preserve whitespace for entries and prevent long lines of unbroken text from overflowing the container.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;.notecard&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;.content&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;28&lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;ch&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;/* Preserve whitespace */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line highlight ins&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#004fa9;--1:#79B8FF&quot;&gt;white-space&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#004fa9;--1:#79B8FF&quot;&gt;pre-wrap&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;/* Break long lines of text */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line highlight ins&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#004fa9;--1:#79B8FF&quot;&gt;overflow-wrap&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#004fa9;--1:#79B8FF&quot;&gt;break-word&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;.notecard .content {  width: 28ch;  /* Preserve whitespace */  white-space: pre-wrap;  /* Break long lines of text */  overflow-wrap: break-word;}&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;We can enforce these limits in our HTML for form submission:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;textarea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;Leave a message, write a poem, draw some ASCII art...&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;required&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line highlight mark&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#613aa9;--1:#c2a8f3&quot;&gt;rows&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line highlight mark&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#613aa9;--1:#c2a8f3&quot;&gt;cols&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;28&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line highlight mark&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#613aa9;--1:#c2a8f3&quot;&gt;maxlength&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;140&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;textarea&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;&lt;textarea  name=&amp;quot;content&amp;quot;  placeholder=&amp;quot;Leave a message, write a poem, draw some ASCII art...&amp;quot;  required  rows=&amp;quot;5&amp;quot;  cols=&amp;quot;28&amp;quot;  maxlength=&amp;quot;140&amp;quot;&gt;&lt;/textarea&gt;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;We can also tell the form to preserve implicit newlines on submission with &lt;code&gt;wrap=&amp;quot;hard&amp;quot;&lt;/code&gt;, which will guarantee that even if we change our CSS in the future or decide to display guestbook entries somewhere else, handcrafted ASCII art will remain intact.&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;textarea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;placeholder&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;Leave a message, write a poem, draw some ASCII art...&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;required&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;rows&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;cols&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;28&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;maxlength&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;140&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line highlight ins&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#613aa9;--1:#c2a8f3&quot;&gt;wrap&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;hard&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;textarea&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;&lt;textarea  name=&amp;quot;content&amp;quot;  placeholder=&amp;quot;Leave a message, write a poem, draw some ASCII art...&amp;quot;  required  rows=&amp;quot;5&amp;quot;  cols=&amp;quot;28&amp;quot;  maxlength=&amp;quot;140&amp;quot;  wrap=&amp;quot;hard&amp;quot;&gt;&lt;/textarea&gt;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;There are a few other details to take care of, like showing a warning message when there’s no room left for text, but the above code takes care of the basic setup for a fixed-size, fixed-length textarea.&lt;/p&gt;
&lt;h3 id=&quot;use-a-flatbed-scanner&quot;&gt;Use a flatbed scanner&lt;/h3&gt;
&lt;p&gt;Dedicated scanners are cheap nowadays, and produce better results than photography. There are two types of scanners: CIS scanners have a very shallow focus, while CCD scanners have a &lt;a href=&quot;http://www.microscopy-uk.org.uk/mag/artjan13/dw-scanner-type.html&quot;&gt;wider depth of field&lt;/a&gt;. (I used a $60 &lt;a href=&quot;https://www.amazon.com/Canon-CanoScan-Lide-Slim-Scanner/dp/B07G5YBS1W?th=1&quot;&gt;CIS scanner&lt;/a&gt; for this project, but if I needed to buy a new scanner today it would be a CCD!)&lt;/p&gt;
&lt;p&gt;I’ve found that 300 DPI is enough resolution for retina displays. Through trial and error, I also learned that putting a contrasting backdrop behind your documents will make it much easier to isolate the subject in tools like Photoshop after scanning.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/magic-wand.Qu8OHY5R_Z1dlhwk.webp&quot; alt loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1794&quot; height=&quot;1532&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Use a dark backdrop.&lt;/strong&gt; A contrasting backdrop makes documents easier to isolate using tools like the magic wand.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;be-mindful-of-color-contrast-and-file-size&quot;&gt;Be mindful of color contrast and file size&lt;/h3&gt;
&lt;p&gt;Image backgrounds make it more difficult to measure &lt;a href=&quot;https://contrast.tools/&quot;&gt;accessible color contrast&lt;/a&gt; ratios for text on top; don’t make any backgrounds too high-contrast. If you realize a shade you used was too dark, you can adjust contrast settings after scanning your images in. If there are any busy elements in your object, try to position them in a spot where text is unlikely to overlap. For the guestbook, I put the loudest elements in the margins, away from text.&lt;/p&gt;
&lt;p&gt;The downside to working with images can be increased bandwidth. Use a command line tool like &lt;a href=&quot;https://optipng.sourceforge.net/&quot;&gt;optipng&lt;/a&gt; to losslessly compress files, or a build tool like Astro’s &lt;a href=&quot;https://docs.astro.build/en/guides/images/&quot;&gt;&lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt;&lt;/a&gt; to handle it for you. There’s no use in designing beautiful objects if a massive file size will prevent them from ever being seen!&lt;/p&gt;
&lt;h3 id=&quot;incorporate-some-randomness&quot;&gt;Incorporate some randomness&lt;/h3&gt;
&lt;p&gt;The real world isn’t often aligned in perfect 90 degree angles; your interface doesn’t have to align to the grid, either. Consider incorporating some variation in how you position elements, for example, by using Astro’s &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#definevars&quot;&gt;&lt;code&gt;define:vars&lt;/code&gt;&lt;/a&gt; style directive to pass variables into CSS:&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;// Rotate each notecard randomly between 3 and -3 degrees&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;randomRotation&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;`${&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;Math&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;}deg`&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;// Offset each notecard randomly between 12 and -12 pixels&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;randomTranslateX&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;`${&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;Math&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#BF3441;--1:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;}px`&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#032F62;--1:#9ECBFF&quot;&gt;&amp;quot;notecard&amp;quot;&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#616972;--1:#99A0A6&quot;&gt;&amp;lt;!-- Notecard contents --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;define:vars&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;={{ rotation: randomRotation, translateX: randomTranslateX }}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#6F42C1;--1:#B392F0&quot;&gt;.notecard&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;transform&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#AE4B07;--1:#FFAB70&quot;&gt;--translateX&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;rotate&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#005CC5;--1:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#AE4B07;--1:#FFAB70&quot;&gt;--rotation&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;--0:#1E7734;--1:#85E89D&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;--0:#24292E;--1:#E1E4E8&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;copy&quot;&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;button title=&quot;Copy to clipboard&quot; data-copied=&quot;Copied!&quot; data-code=&quot;---// Rotate each notecard randomly between 3 and -3 degreesconst randomRotation = `${Math.random() * 6 - 3}deg`;// Offset each notecard randomly between 12 and -12 pixelsconst randomTranslateX = `${Math.random() * 24 - 12}px`;---&lt;div class=&amp;quot;notecard&amp;quot;&gt;  &lt;!-- Notecard contents --&gt;&lt;/div&gt;&lt;style define:vars={{ rotation: randomRotation, translateX: randomTranslateX }}&gt;  .notecard {    transform: translateX(var(--translateX)) rotate(var(--rotation));  }&lt;/style&gt;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h3 id=&quot;have-fun&quot;&gt;Have fun!&lt;/h3&gt;
&lt;p&gt;Embrace experimentation and the freedom of designing without a screen. There are so many potential areas to bring physical objects into digital experiences. It isn’t always called for or necessary, but for the right moment, a touch of real, physical texture can go a long way toward making an experience that’s a joy to use.&lt;/p&gt;
&lt;p&gt;Now go off and draw your own UI. Don’t forget to &lt;a href=&quot;/guestbook&quot;&gt;sign the guestbook&lt;/a&gt; before you go.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Shout out to &lt;a href=&quot;https://leanrada.com&quot;&gt;Lean Rada&lt;/a&gt;, whose &lt;a href=&quot;https://leanrada.com/guestbook/&quot;&gt;guestbook&lt;/a&gt;—discovered through the CSS JOY &lt;a href=&quot;/webrings&quot;&gt;webring&lt;/a&gt;—offered inspiration for the themable index card format. Lean’s even includes customizable fonts, colors, and stickers! Check it out.&lt;/p&gt;</content:encoded></item><item><title>Embrace friction</title><link>https://ky.fyi/posts/embrace-friction</link><guid isPermaLink="true">https://ky.fyi/posts/embrace-friction</guid><description>On letterpress, tech, and the power of going slow.</description><pubDate>Mon, 08 Dec 2025 17:26:21 GMT</pubDate><content:encoded>&lt;p&gt;This weekend, I attended a letterpress course at the &lt;a href=&quot;https://centerforbookarts.org/&quot;&gt;Center for Book Arts&lt;/a&gt; in NYC. I love working with and reading about typography, but until now, most of my interactions with type have been mediated through a digital display. I was thrilled to get physical. To touch the type!&lt;/p&gt;
&lt;p&gt;We learned about the &lt;a href=&quot;https://en.wikipedia.org/wiki/Vandercook&quot;&gt;Vandercook proof press&lt;/a&gt;, an imposing steel machine from the early 20th century. We selected typefaces from the Center’s many cases of lead type. And over the span of two days, each of us set a page of text to print.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/vandercook-presses.CrhsOL-o_ZaiXzU.webp&quot; alt=&quot;Three proof presses are lined up against the windows within a brick-walled studio in New York. Against cans of paint and cases of metal type are visible.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2560&quot; height=&quot;1920&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Vandercook proof presses.&lt;/strong&gt; Located at the Center for Book Arts.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Letterpress is slow, methodical work. Instructor &lt;a href=&quot;https://www.sarahnicholls.com/&quot;&gt;Sarah Nicholls&lt;/a&gt; says it “reshapes your relation to time.” Every letter, space, and detail is placed individually, entire forms composed by hand. Nicholls uses letterpress as the final step in her editing process—it forces deep consideration of every word’s purpose.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/letterpress-workstation.B6oIUeJs_Z17sq5C.webp&quot; alt=&quot;A letterpress workstation shows a wooden case full of metal characters of type.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1800&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Letterpress workstation.&lt;/strong&gt; On the left, a case of 18pt Caslon #540 lead type. Above, a reference using the &lt;a href=&quot;https://en.wikipedia.org/wiki/California_job_case&quot;&gt;California job case&lt;/a&gt; layout. On the right, a metal galley plate and composition stick, where type is being arranged.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Setting each character within the composition stick, you feel the shape of words. Physically, yes, but linguistically, too. There is a poetry to the shapes that form language. I felt this intimately, setting Ursula K. Le Guin’s translation of the twenty-five hundred year-old &lt;a href=&quot;https://en.wikipedia.org/wiki/Tao_Te_Ching&quot;&gt;Tao Te Ching&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I composed my page, letter by letter, I thought about friction. Friction shapes our relation to a system. It is difficult to set type in letterpress, so I say less, with more intention. It is easy to type on a computer, so I say more. If I wanted to set this blog post in letterpress, it would take me a week or more. Would I use all of these words?&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;div class=&quot;two-up&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/taoing-preprint.CW7I6oqc_sPlRS.webp&quot; alt=&quot;Blocks of text are arranged and tied with twine. The blocks rest in the corner of a metal tray called a galley.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3022&quot; height=&quot;4030&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/_astro/vandercook-press.BPT4nvfR_smxae.webp&quot; alt=&quot;The blocks of text are arranged in the center of the metal bed on the Vandercook press, positioned securely by steel blocks.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3024&quot; height=&quot;4032&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Setting type for print.&lt;/strong&gt; Blocks are arranged individually on a composition stick, then moved to a galley before being placed and secured on the Vandercook press for printing.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Tools like ChatGPT take friction(-lessness) to a new extreme, where even writing is not required: only a rough impulse about the result you want. What do we lose when we abandon taking time to shape language? What meaning is made from pressing buttons on a text extrusion machine?&lt;/p&gt;
&lt;p&gt;New technology often prizes itself on being “frictionless”. But is lack of friction always a worthwhile goal? Thoughtfulness requires time. Learning requires time. Friction, ever obstinate, forces us to slow down. When we slow down, we may discover things that are easy to miss when zooming by at quicker speeds.&lt;/p&gt;
&lt;p&gt;In a world that constantly demands we move faster and be more productive, there is joy to be found in doing less, more slowly, with greater intent.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/taoing.6VJtbasj_cQK83.webp&quot; alt=&quot;Taoing. The way you can go isn&apos;t the real way. The name you can say isn&apos;t the real name. Heaven and earth begin in the unnamed: name&apos;s the mother of the ten thousand things. So the unwanting soul sees what&apos;s hidden, and the ever-wanting soul sees only what it wants. Two things, one origin, but different in name, whose identity is mystery. Mystery of all mysteries! The door to the hidden.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3024&quot; height=&quot;4032&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Taoing, from Tao Te Ching by Lao Tzu, translated by Ursula K. Le Guin.&lt;/strong&gt; Title set in &lt;a href=&quot;https://fontsinuse.com/typefaces/6/lydian&quot;&gt;Lydian Condensed Bold&lt;/a&gt;, 48pt. Text set in &lt;a href=&quot;https://fontsinuse.com/typefaces/5488/caslon-no-471-and-540&quot;&gt;Caslon #540&lt;/a&gt;, 18pt.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The penultimate line of “Taoing” ends with an exclamation point. After carefully arranging the preceding sixteen lines, letter by letter, over two days, placing that exclamation point exploded like a firework inside of me.&lt;/p&gt;
&lt;p&gt;Bang! I felt it.&lt;/p&gt;
&lt;p&gt;I felt it because I was going slow enough to notice.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;The Center for Book Arts offers many &lt;a href=&quot;https://shop.centerforbookarts.org/collections/workshops&quot;&gt;workshops&lt;/a&gt; for letterpress, risograph printing, book binding, and more. I sincerely recommend taking a class if you’re in the NYC area. I will definitely be returning.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;Edit, December 10: After publishing, I came across a related article by &lt;a href=&quot;https://tante.cc/about/&quot;&gt;tante&lt;/a&gt; about friction, AI, loneliness, and touch:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;[…] friction is not just “things not working properly”, it can also be read as &lt;em&gt;being touched&lt;/em&gt;. Just as crowded spaces create friction by other people being in my way while moving, a process with friction makes me feel other people’s work, their point of view and how it differs from mine, makes me feel their needs and wants. Friction is part of what being in, being part of society &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;
&lt;cite&gt;&lt;a href=&quot;https://tante.cc/2025/07/30/friction-and-not-being-touched/&quot;&gt;Friction and not being touched&lt;/a&gt;&lt;/cite&gt;
&lt;/blockquote&gt;&lt;p&gt;It’s worth reading in full.&lt;/p&gt;&lt;/aside&gt;
&lt;aside&gt;&lt;p&gt;Edit, March 25: I’ve encountered a few more articles on the topic of friction:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://artificialbureaucracy.substack.com/p/kill-chain&quot;&gt;Kill Chain&lt;/a&gt; by Kevin Baker examines Palantir’s Project Maven and its role in the deaths of 175-180 Iranian schoolgirls during a February 2026 attack by the US.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://matthiasott.com/notes/the-shape-of-friction&quot;&gt;The Shape of Friction&lt;/a&gt; by Matthias Ott muses on “working with the nature, the ‘grain’ of a material rather than against it.” and says “Professional work always has friction.” The writing is a response to Dave Rupert’s piece &lt;a href=&quot;https://daverupert.com/2026/03/people-are-not-friction/&quot;&gt;People are not friction&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I’ve started an Are.na channel to collect other examples of &lt;a href=&quot;https://www.are.na/ky-decker/friction-in-systems-software&quot;&gt;friction in systems/software&lt;/a&gt;.&lt;/p&gt;&lt;/aside&gt;</content:encoded></item><item><title>Making Genderswap.fm</title><link>https://ky.fyi/posts/genderswap</link><guid isPermaLink="true">https://ky.fyi/posts/genderswap</guid><description>On creating a catalogue of song covers.</description><pubDate>Sat, 02 Mar 2024 05:40:50 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;In 2021, I read the novel &lt;em&gt;&lt;a href=&quot;https://hardcover.app/books/paul-takes-the-form-of-a-mortal-girl&quot;&gt;Paul Takes the Form of a Mortal Girl&lt;/a&gt;&lt;/em&gt; by Andrea Lawlor. Early in the book, Paul gushes about his love of gender-swapped covers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some covers deliver the age-old simple pleasures of drag—knowledge, the opportunity to investigate the simulacra and make comparisons, that obscure little frisson of dissonance. Take Joan Baez singing “Virgil Kane is my name… like my father before me, I’m a working man” (which, of course, is originally from The Band’s “The Night They Drove Old Dixie Down)” or Cait O’Riordan from the Pogues crooning, “My name is Jock Stewart, I’m a canny gun man” (from the traditional “I’m a Man You Don’t Meet Every Day”). Joan Baez’s contralto can, if you squint your ears, pass as a farm-boy tenor; Cait O’Riordan’s chalky delivery might be that of a rich ponce.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I listened to each cover and original, enamored with how lyrics could completely transform under another artist’s tone, tempo, and gender.&lt;/p&gt;
&lt;p&gt;I began compiling Paul’s songs into a playlist, and then I added more of my own. And more. And more. For another two years.&lt;/p&gt;
&lt;h2 id=&quot;the-challenge&quot;&gt;The challenge&lt;/h2&gt;
&lt;p&gt;As my covers playlist grew, so did the tedium of managing it in Spotify. I kept all covers alphabetized (by hand), and I maintained two separate playlists—one for both &lt;a href=&quot;https://open.spotify.com/playlist/5YQ4AyxQ6DeDxKJgSryAU2?si=68e701a76c854e5c&quot;&gt;covers and originals&lt;/a&gt;, and another for &lt;a href=&quot;https://open.spotify.com/playlist/50iUGmY3cSUETCHGfUgf6a?si=f078e27420334399&quot;&gt;covers only&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;div class=&quot;video-wrapper&quot;&gt;&lt;video autoplay loop muted playsinline preload=&quot;none&quot; poster=&quot;/video/adding-spotify-poster.png&quot;&gt;&lt;source src=&quot;/video/adding-spotify.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Difficulties organizing in Spotify.&lt;/strong&gt; The interface makes it challenging
to organize songs within large playlists. (Sorting by title exists, but it’s
unreliable here—John Denver’s “Take Me Home, Country Roads” deserves to live
beside Judy Collins’s “Leaving on a Jet Plane/Take Me Home Country Roads”.)&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;After managing this playlist for two years, I decided to build a custom solution to host and catalogue covers. I named it &lt;a href=&quot;https://genderswap.fm/&quot;&gt;Genderswap.fm&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;laying-foundations&quot;&gt;Laying foundations&lt;/h2&gt;
&lt;p&gt;This personal project was my first time working directly on the backend. Thankfully, &lt;a href=&quot;https://supabase.com/&quot;&gt;Supabase&lt;/a&gt;—an open source alternative to Google’s &lt;a href=&quot;https://firebase.google.com/&quot;&gt;Firebase&lt;/a&gt;—made it easy to get started.&lt;/p&gt;
&lt;p&gt;I experimented with alternative data structures and landed on a two table model: one table for &lt;code&gt;songs&lt;/code&gt;, and one table for &lt;code&gt;covers&lt;/code&gt;, which links two &lt;code&gt;song&lt;/code&gt; rows together along with extra metadata about their relation.&lt;/p&gt;
&lt;figure class=&quot;inset&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/schema.DPAI0mFB_BaPj9.webp&quot; alt=&quot;A visualization of the database schema for
Genderswap.fm.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;600&quot; height=&quot;628&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Database schema.&lt;/strong&gt; This is the shape of the data for Genderswap.fm.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I decided to use &lt;a href=&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt; and SvelteKit for my application framework. I had previously used Svelte in my build for the &lt;a href=&quot;/projects/boundaries-map&quot;&gt;NYC Boundaries Map&lt;/a&gt;, and the addition of SvelteKit made it easy to manage routing, server-side rendering, and API requests. I set up a Spotify Developer account and used the &lt;a href=&quot;https://github.com/spotify/spotify-web-api-ts-sdk&quot;&gt;Spotify Web API TypeScript SDK&lt;/a&gt; to make it easy for users to search for and enter songs. I also added &lt;a href=&quot;https://melt-ui.com/&quot;&gt;Melt UI&lt;/a&gt;, a Svelte-based component library, to help build the submission form.&lt;/p&gt;
&lt;h2 id=&quot;ideation&quot;&gt;Ideation&lt;/h2&gt;
&lt;p&gt;For the design, I knew I wanted to allow users to browse by pairs of songs shown together. It wouldn’t be too different from browsing “by album” in any other music tool, but rather than displaying a single album for each result, I’d display original/cover pairs.&lt;/p&gt;
&lt;p&gt;From there, users could tap in to view the details of a cover, and listen to the original and the cover side-by-side, with notes about their differences.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;div class=&quot;two-up&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/sketch-1.Dttzs15d_Z2ejOo9.webp&quot; alt=&quot;Detail page and form field sketches.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2263&quot; height=&quot;3217&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/_astro/sketch-2.BXL8zliX_17SeDV.webp&quot; alt=&quot;Search and filtering sketches.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2263&quot; height=&quot;3217&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Exploratory sketches.&lt;/strong&gt; Ideating around the display of albums, how to structure the submission form, and how to surface filters. I still hadn’t figured out what I would ask users to tag manually, and what I could tag automatically using Spotify’s API.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;finding-a-design-language&quot;&gt;Finding a design language&lt;/h2&gt;
&lt;p&gt;To communicate the way these covers remix sound, reinterpret lyrics, and reconfigure meaning, I established a visual motif to thread its way through the app: two objects, overlapping and askew. Sharing space, but different.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/album-grid.B9DFoSNV_22WXaO.webp&quot; alt=&quot;A grid of albums and covers displayed on
Genderswap.fm&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1600&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Overlapping visual motif.&lt;/strong&gt; Intentional overlapping groups the original
and cover as a single unit. The cover album is larger and foregrounded for
emphasis.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Typography is set in &lt;a href=&quot;https://www.kometa.xyz/typefaces/labil-grotesk/&quot;&gt;Labil Grotesk&lt;/a&gt;, a queer font which topples over itself, unable to rest upright, mirroring the off-kilter elements elsewhere in the app.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/typography.C4_WCEeY_1jXBLl.webp&quot; alt=&quot;Header typography for a detail page within the app. The text reads: Sonata
No. 8 in C Minor, Op. 13 “Pathétique”: II. Adagio cantabile. Jun Fukamachi
covering Ludwig van Beethoven&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2128&quot; height=&quot;827&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Labil Grotesk in use.&lt;/strong&gt; I love the way the ‘O’ falls over, ready to roll
off the screen.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;While the topsy-turvy contextual alternates were enabled for page-level headings, I disabled them for smaller text to prioritize legibility.&lt;/p&gt;
&lt;h2 id=&quot;little-big-features&quot;&gt;Little big features&lt;/h2&gt;
&lt;p&gt;As with all my work, I looked for opportunities to introduce small but meaningful details.&lt;/p&gt;
&lt;div class=&quot;two-col popout&quot;&gt;&lt;figure&gt;&lt;div class=&quot;video-wrapper&quot;&gt;&lt;video autoplay loop muted playsinline preload=&quot;none&quot; poster=&quot;/video/tag-filtering-poster.png&quot;&gt;&lt;source src=&quot;/video/tag-filtering.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Automated tagging.&lt;/strong&gt; Covers are automatically tagged with attributes
like “sadder” or “more danceable”, and you can search and filter by tag.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;p&gt;&lt;img src=&quot;/_astro/readable-urls.DuATiheP_Z2sxyKk.webp&quot; alt=&quot;A collection of three browser URL boxes with associated titles. The URLs
are nicely formatted with hyphens and human readable text. The titles are
formatted like &amp;quot;Cat Power&apos;s cover of Sea Of Love by Phil Phillips &amp;amp; The
Twilights.&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1004&quot; height=&quot;470&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Readable URLs and page titles.&lt;/strong&gt; Share human-readable URLs which
accommodate diacritics and non-Latin characters.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;p&gt;&lt;img src=&quot;/_astro/covered-as.B4GTmf2P_Z1DHE4m.webp&quot; alt=&quot;&amp;quot;Girls Just Wanna Have Fun&amp;quot; covered as &amp;quot;Girls Just Wanna Have
Some&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1272&quot; height=&quot;362&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;“Covered as…”&lt;/strong&gt; Conditionally see when a cover’s title diverges from
the original.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;p&gt;&lt;img src=&quot;/_astro/earlier-release.1OKeT_KL_ZSq9Cl.webp&quot; alt=&quot;The user has selected ABBA&apos;s Dancing Queen from ABBA Gold. A banner says
there&apos;s an earlier release, and prompts the user to choose the album
Arrival, which was released 32 years
earlier.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1404&quot; height=&quot;944&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Earlier release prompting.&lt;/strong&gt; Behind the scenes, the app will search for
earlier album releases for your original song. If one is found, it’ll
prompt you to update your submission.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;p&gt;&lt;img src=&quot;/_astro/og-image.B1yH_JjH_LOGtF.webp&quot; alt=&quot;A text message with a preview of the album art and page
title.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1170&quot; height=&quot;882&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Rich social previews.&lt;/strong&gt; Custom Open Graph images generated using
&lt;a href=&quot;https://github.com/vercel/satori&quot;&gt;Satori&lt;/a&gt; and
&lt;a href=&quot;https://github.com/lovell/sharp&quot;&gt;Sharp&lt;/a&gt; display a cover’s title, album
art, and tags.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;p&gt;&lt;img src=&quot;/_astro/just-titles.Dm7J4QNA_Z17dy2t.webp&quot; alt=&quot;A list of titles displaying remaster dates and other non-title info
scratched out by a red marker.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1206&quot; height=&quot;502&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Just the titles.&lt;/strong&gt; Remaster dates, “(Featured on…)”, “[From the
Movie…]”, and other cruft is stripped out, leaving only the artistic
title.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;div class=&quot;video-wrapper&quot;&gt;&lt;video autoplay loop muted playsinline preload=&quot;none&quot; poster=&quot;/video/confetti-poster.png&quot;&gt;&lt;source src=&quot;/video/confetti.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Celebrate contribution.&lt;/strong&gt; Confetti erupts after each new submission. 🎉&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;p&gt;&lt;img src=&quot;/_astro/saved-name.goFqxgBu_Zgh3Rv.webp&quot; alt=&quot;&amp;quot;An input with the label &amp;quot;Your first name (optional)&amp;quot;. The input is
prefilled with the name &amp;quot;Eva&amp;quot;.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;964&quot; height=&quot;408&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Pre-filled name for repeat submissions.&lt;/strong&gt; Entered names will be
pre-filled for future submissions on the same device.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;div class=&quot;video-wrapper&quot;&gt;&lt;video autoplay loop muted playsinline preload=&quot;none&quot; poster=&quot;/video/paste-link-poster.png&quot;&gt;&lt;source src=&quot;/video/paste-link.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;Paste links into search.&lt;/strong&gt; Title too hard to type? Just copy and paste
the Spotify link.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://genderswap.fm&quot;&gt;Explore covers&lt;/a&gt;, get a &lt;a href=&quot;https://genderswap.fm/random&quot;&gt;random cover&lt;/a&gt;, or &lt;a href=&quot;https://genderswap.fm/new&quot;&gt;submit your own&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;outcomes&quot;&gt;Outcomes&lt;/h2&gt;
&lt;p&gt;I didn’t have any massive ambitions for this app—it was mostly a way for me to learn new technology, and see if I could manage my covers library in a way that felt a little more natural. In that sense, it was a success!&lt;/p&gt;
&lt;p&gt;After finishing the first version of the app, I emailed it to Andrea Lawlor, sharing how &lt;em&gt;Paul Takes the Form&lt;/em&gt; had inspired me. A few days later, I received this reply:&lt;/p&gt;
&lt;figure class=&quot;inset&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/andrea-lawlor-email.Zr84yoTf_pA9fu.webp&quot; alt=&quot;&amp;quot;Andrea Lawlor email to me, 2:45PM: Whoa this is THE COOLEST thing I have
EVER SEEN IN MY LIFE. Thank you!
Wow!&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;585&quot; height=&quot;224&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.anderlawlor.com/&quot;&gt;Andrea Lawlor&lt;/a&gt;’s reply.&lt;/strong&gt; You heard it
here, folks. The coolest thing ever.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I was overjoyed. Thanks, Andrea. Thanks, Paul.&lt;/p&gt;
&lt;p&gt;Genderswap.fm is now showcased on &lt;a href=&quot;https://madewithsvelte.com/genderswap-fm&quot;&gt;Made with Svelte&lt;/a&gt; and the &lt;a href=&quot;https://utopia.fyi/showcase&quot;&gt;Utopia.fyi Showcase&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;reflections&quot;&gt;Reflections&lt;/h2&gt;
&lt;p&gt;There are many improvements I’d still love to make to the app. At the top of the list is an &lt;a href=&quot;https://github.com/kydecker/genderswap.fm/issues/7&quot;&gt;in-app audio player&lt;/a&gt;. I’d also like &lt;a href=&quot;https://github.com/kydecker/genderswap.fm/issues/133&quot;&gt;better search&lt;/a&gt;, and a way to &lt;a href=&quot;https://github.com/kydecker/genderswap.fm/issues/16&quot;&gt;automatically generate and sync the Genderswap.fm database to a Spotify playlist&lt;/a&gt;. I track &lt;a href=&quot;https://github.com/kydecker/genderswap.fm/issues&quot;&gt;all issues and ideas on GitHub&lt;/a&gt;, and contributions are welcome.&lt;/p&gt;
&lt;p&gt;I learned a lot building this out. The backend is not as scary as it seems, and I taught myself that it’s possible for me to build a full-stack app from start to finish! There’s still more to learn, and I hope to continue working on this project when I have time.&lt;/p&gt;</content:encoded></item><item><title>To build gentler technology, practice trauma-informed design</title><link>https://ky.fyi/posts/trauma-informed-design</link><guid isPermaLink="true">https://ky.fyi/posts/trauma-informed-design</guid><description>Understanding trauma helps craft gentler user experiences.</description><pubDate>Thu, 13 May 2021 04:00:00 GMT</pubDate><content:encoded>&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Note, July 2026:&lt;/strong&gt; This article was originally published &lt;a href=&quot;https://medium.com/care-code/to-build-gentler-technology-practice-trauma-informed-design-3b4ad34a9f0b&quot;&gt;on Medium&lt;/a&gt; while working as a designer at &lt;a href=&quot;https://www.cityblock.com&quot;&gt;Cityblock&lt;/a&gt; in 2021. On reflection, there are aspects of this I would rewrite or scope down. For posterity, I’m republishing it here as originally written.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;When I was sixteen, YouTube outed me. My mom walked into my bedroom one day and hit me with a question that stopped my heart:&lt;/p&gt;
&lt;p&gt;“Are you gay?”&lt;/p&gt;
&lt;p&gt;She told me that she and my younger brother had used my computer to visit YouTube and saw videos. She wanted to know where the videos came from. She wanted to know if I was gay.&lt;/p&gt;
&lt;p&gt;I’d feared this moment for so long, and I wasn’t ready.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/confederate-flags.nYoWx7U__ZKaKG4.webp&quot; alt=&quot;A pickup truck in a grocery store parking lot with three confederate flags strapped to the back.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;2000&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;A truck with several confederate flags near my childhood home in Horse Shoe, North Carolina.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I grew up in a Southern Appalachian town called Horse Shoe, where I drove past Confederate flags every day on my way to school. I spent most of my early teens trying to “pray the gay away” in earnest. Driven by fear and self-loathing, I repressed any emotion or expression which could’ve brought on the wrath of a high school boy or the scorn of an adult.&lt;/p&gt;
&lt;p&gt;As a teenager, the internet was my solace. I didn’t know any queer people in my 600-person school, and I had no adults in my life who were outwardly LGBT+. In the physical world I was closeted and stoic. In the digital world, I found people like me, and it made me feel less alone.&lt;/p&gt;
&lt;p&gt;I knew these worlds needed to stay separate. There were real, physical risks if my parents discovered my online activity: they might kick me out, or send me to conversion therapy, or worse. I diligently scrubbed my browsing history, used alternate email addresses, and waited until late at night—when my parents were more likely to be asleep—to watch vlogs and chat.&lt;/p&gt;
&lt;p&gt;But it only takes one slip-up. I hadn’t thought about the YouTube recommendations.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/obedience-is-better.DzSC1hqo_7Nkvc.webp&quot; alt=&quot;A small brick church is visible with a plastic sign out front reading &amp;quot;obedience is better&amp;quot;.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;2000&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;&lt;p&gt;A church in Horse Shoe proclaims, “OBEDIENCE IS BETTER”.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I’d planned to come out to my parents eventually. I just didn’t want to do it then, in that way. I wanted to do it on my own terms.&lt;/p&gt;
&lt;p&gt;When my mom asked if I was gay, I faced a choice. I could deny it, which might keep me safe for awhile. Or I could tell the truth and pay the price.&lt;/p&gt;
&lt;p&gt;Through tears, I told the truth.&lt;/p&gt;
&lt;hr/&gt;
&lt;aside&gt;&lt;p&gt;LinkedIn informs you that three strangers viewed your profile and one of them asked to connect. Duolingo prompts you to start a new lesson—it’s been six days since you practiced German. WhatsApp says your message was seen, but nobody’s replied. You receive twelve new likes on an Instagram post. There’s a Swipe Surge on Tinder! Facebook recommends &lt;a href=&quot;https://www.youtube.com/watch?v=LoyfunmYIpU&amp;amp;pbjreload=102&quot;&gt;people you may know&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Can you spot the potential harm in these interactions?&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;Two years ago, I joined &lt;a href=&quot;https://www.cityblock.com/&quot;&gt;Cityblock&lt;/a&gt;. Alongside psychiatrists, social workers, and other specialists, I work to provide care to people with complex health needs.&lt;/p&gt;
&lt;p&gt;An undercurrent of trauma runs through the populations we serve. To counter this we practice trauma-informed care. Trauma-informed care is a framework for minimizing harm through understanding trauma and its effects and proactively working to prevent re-traumatization.&lt;/p&gt;
&lt;blockquote class=&quot;pull&quot;&gt;&lt;p&gt;Rather than asking, “what is wrong with you?” a trauma-informed approach asks, “what has happened to you?”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As I learned about trauma-informed care I began to wonder, &lt;strong&gt;what would technology look like if it recognized trauma as a force in all our lives?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Over the past six months, I’ve interviewed care teams at Cityblock to understand how they confront trauma. They’ve shared tips on technique and language, and shared stories. Together we’ve explored how we might design technology from a trauma-informed lens.&lt;/p&gt;
&lt;h2 id=&quot;trauma-informed-design-is-the-practice-of-building-systems-which-reduce-harm-and-foster-healing&quot;&gt;Trauma-informed design is the practice of building systems which reduce harm and foster healing&lt;/h2&gt;
&lt;p&gt;There are six principles for a trauma-informed approach:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Safety&lt;/li&gt;
&lt;li&gt;Trustworthiness and Transparency&lt;/li&gt;
&lt;li&gt;Peer Support&lt;/li&gt;
&lt;li&gt;Collaboration and Mutuality&lt;/li&gt;
&lt;li&gt;Empowerment, Voice, and Choice&lt;/li&gt;
&lt;li&gt;Cultural, Historical, and Gender Issues&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These principles were developed by the Substance Abuse and Mental Health Services Administration (SAMHSA) and the American Psychiatric Association to address in-person care, but we can adapt them to a digital context.&lt;/p&gt;
&lt;p&gt;Before that, however, it’s important to talk about what trauma is and how it affects the brain.&lt;/p&gt;
&lt;h3 id=&quot;trauma-is-an-experience-that-overwhelms-someones-ability-to-cope&quot;&gt;Trauma is an experience that overwhelms someone’s ability to cope&lt;/h3&gt;
&lt;p&gt;Trauma can occur as a result of violence, sexual abuse, physical abuse, loss, terrorism, natural disaster, and other emotionally harmful experiences. It may be a single moment, or a pattern of events spread out over months, years, or generations. It affects anyone.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Trauma affects the way that you view the world and the way that you view yourself.
&lt;cite&gt;Rob Jordan, Behavioral Health Specialist at Cityblock&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Trauma exists as an embodied, measurable force. It rewires neural pathways. It manifests through avoidance, nightmares, flashbacks, anxiety, dissociation, hypervigilance, and intrusive memories.&lt;/p&gt;
&lt;h3 id=&quot;tech-can-frustrate-stressed-out-brains&quot;&gt;Tech can frustrate stressed-out brains&lt;/h3&gt;
&lt;p&gt;Imagine this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Someone presents you with new information. You register what you’ve been told, but before long, you can’t remember what it was. Was it important?&lt;/li&gt;
&lt;li&gt;Images, words, shapes, and motion don’t always appear “present”. They’re somehow detached from reality. You struggle to recall them.&lt;/li&gt;
&lt;li&gt;It’s hard to categorize objects. What goes where?&lt;/li&gt;
&lt;li&gt;When filling out a form or something that requires accuracy, you often make errors and don’t spot them until you’re told.&lt;/li&gt;
&lt;li&gt;Staying focused is a challenge. You often feel unmotivated to start and complete tasks. Small distractions can wreck your concentration.&lt;/li&gt;
&lt;li&gt;Tiny things can provoke strong anger or fear or make you unable to move. Later, you may tell yourself that your response wasn’t rational, but this doesn’t prevent it from happening again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is life for many people with a history of trauma, and it presents serious obstacles to everyday use of technology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minor frustrations for non-traumatized brains may present serious obstacles for traumatized ones.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This happens because extreme stress changes the brain’s structure. It decreases the volume of the anterior cingulate cortex — which deals with attention, error detection, and motivation — and the volume of the hippocampus, which helps encode verbal declarative memory.&lt;/p&gt;
&lt;figure class=&quot;feature&quot;&gt;&lt;div class=&quot;two-up&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/healthy-brain.BaFAOMU__Z2enCn5.webp&quot; alt=&quot;Imaging of a healthy brain shows highlights around the cerebellum.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;862&quot; height=&quot;594&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/_astro/ptsd-brain.BaaohzDS_2iqpzH.webp&quot; alt=&quot;Imaging of a post-traumatic stress brain shows additional highlights around the anterior cingulate, amygdala, and hippocampus.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;862&quot; height=&quot;594&quot;&gt;&lt;/p&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;On the left: a healthy brain shows most activity (red and white) in the cerebellum. On the right: A PTSD brain shows changes to the anterior cingulate cortex, the amygdala, and the hippocampus. &lt;a href=&quot;https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0129659&quot;&gt;Source&lt;/a&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In addition, the amygdala — the brain’s fear response center—becomes overactive, making &lt;a href=&quot;https://www.youtube.com/watch?v=py8deTlxNco&quot;&gt;higher-level thinking&lt;/a&gt; much more difficult.&lt;/p&gt;
&lt;p&gt;These changes to the brain are visible in people with PTSD, but PTSD is only one subset of trauma, which affects the brain, body, and spirit in many ways.&lt;/p&gt;
&lt;h3 id=&quot;trauma-informed-design-is-accessible-design&quot;&gt;Trauma-informed design is accessible design&lt;/h3&gt;
&lt;p&gt;The physical world can inform our approach to designing digital spaces. In the 1960s, 70s, and 80s, people who use wheelchairs waged a campaign to require cities to build &lt;a href=&quot;https://99percentinvisible.org/episode/curb-cuts/&quot;&gt;curb cuts&lt;/a&gt;—the ramp connecting sidewalks to street-level. Without them, the six-inch drop made cities unnavigable.&lt;/p&gt;
&lt;p&gt;The Americans with Disabilities Act was passed in 1990, making accessibility a requirement for all public spaces. It wasn’t long before parents with strollers, postal workers with mail carts, and kids on bicycles realized how helpful curb cuts could be for them, too.&lt;/p&gt;
&lt;p&gt;By prioritizing those with the greatest need, trauma-informed design improves life for everyone.&lt;/p&gt;
&lt;h2 id=&quot;six-principles-for-trauma-informed-design&quot;&gt;Six principles for trauma-informed design&lt;/h2&gt;
&lt;p&gt;We can get close to trauma-informed solutions by simply practicing “&lt;a href=&quot;https://www.vitsoe.com/us/about/good-design&quot;&gt;good design&lt;/a&gt;.” Many design patterns exist in direct response to the quirks and limitations of human cognition. Intuitive organization, &lt;a href=&quot;https://www.nngroup.com/videos/jakobs-law-internet-ux/&quot;&gt;familiar interaction patterns&lt;/a&gt;, intentional use of &lt;a href=&quot;https://www.nngroup.com/articles/principles-visual-design/&quot;&gt;visual principles&lt;/a&gt;, and the ability to &lt;a href=&quot;https://www.nngroup.com/articles/working-memory-external-memory/&quot;&gt;offload working memory&lt;/a&gt; all make people feel calmer and more in control.&lt;/p&gt;
&lt;p&gt;Even small frustrations and cognitive burdens drain our ability to make informed, healthy choices.&lt;/p&gt;
&lt;p&gt;“The least frustrating design,” says Rob, “is going to be trauma-informed.”&lt;/p&gt;
&lt;p&gt;While researching, I asked friends and family to share moments when technology has hurt them and when it has helped. Their thoughts, anonymized, are quoted in each section below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/safety.BLeMjlDE_Z2vozRH.webp&quot; alt=&quot;An illustration of two hands surrounding a heart.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4200&quot; height=&quot;2400&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;safety&quot;&gt;Safety&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Dating apps automatically pulling info from Facebook has allowed people to find me on other platforms and say, hey, we didn’t match, but *hey*, I *really* liked you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A band member I follow shared a brutal video on Instagram and I literally felt ill. Like visceral, horrible. I had to swipe up to get it out of my phone’s frame.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.noonlight.com/&quot;&gt;Noonlight&lt;/a&gt; and iPhone’s &lt;a href=&quot;https://support.apple.com/en-us/HT208076&quot;&gt;SOS feature&lt;/a&gt; give me peace of mind knowing I have a modern-day Life Alert built into the thing I carry around with me everywhere.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To help people with a history of trauma, “safety is the first priority,” says &lt;a href=&quot;https://www.nytimes.com/2021/03/18/style/loretta-staples-ui-design.html&quot;&gt;Loretta Staples&lt;/a&gt;, Behavioral Health Specialist at Cityblock. “Oftentimes, traumatized people do not feel safe in their own body. I try to create a holding environment, one where the person feels not smothered, but contained.”&lt;/p&gt;
&lt;p&gt;She continues, &lt;strong&gt;“I never say, ‘this is a safe space.’ I don’t have the power to make that declaration.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The systems that we design should counter abuse, permit making safe mistakes, promote privacy by default, and moderate content to prevent the spread of hate speech and disinformation.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Recommendations:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conduct abusability testing.&lt;/strong&gt; “From Zoombombing to discriminatory chatbots, we track abuses across a wide range of platforms,” states &lt;a href=&quot;https://platformabuse.org/&quot;&gt;platformabuse.org&lt;/a&gt;. Building with good intent isn’t enough to stop abuse. But understanding common patterns and mitigations makes it possible to prevent abuse from happening.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support making (and fixing) mistakes.&lt;/strong&gt; Humans are fallible and distractible. If someone makes a mistake, provide an easy way to undo or fix it, paying close attention to the tone that’s used to &lt;a href=&quot;https://www.nngroup.com/articles/error-message-guidelines/&quot;&gt;communicate the error&lt;/a&gt;. Permanency is stress-inducing; impermanence fosters psychological safety.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default to privacy.&lt;/strong&gt; Say there’s third-party integration you share data with. Do you ask for consent from users before sharing their data? &lt;a href=&quot;https://archive.uie.com/brainsparks/2011/09/14/do-users-change-their-settings/&quot;&gt;Fewer than 5% of people change the default settings&lt;/a&gt;, so make sure default sharing settings promote privacy and safety.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moderate content thoughtfully.&lt;/strong&gt; In digital spaces, profound harm can come from other users; preventing trauma requires placing limits on what users can say and do. &lt;a href=&quot;https://santaclaraprinciples.org/&quot;&gt;The Santa Clara Principles on Transparency and Accountability in Content Moderation&lt;/a&gt; outline three principles for fair content moderation. Additionally, the Forum on Information and Democracy’s &lt;a href=&quot;https://web.archive.org/web/20211128134433/https://informationdemocracy.org/wp-content/uploads/2020/11/ForumID_Report-on-infodemics_101120.pdf&quot;&gt;Report on Infodemics&lt;/a&gt; lists “250 recommendations on how to rein in a phenomenon that threatens democracies and human rights, including the right to health.”&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/transparency.C_UlpQ2D_Z2b5NuM.webp&quot; alt=&quot;An illustration of two overlapping semitransparent circles.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4200&quot; height=&quot;2400&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;trustworthiness-and-transparency&quot;&gt;Trustworthiness and transparency&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;I feel spied on. It’s weird if you show up to, say, a hotel, and the concierge knows all about your personal life. That’s what some products in tech feel like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Whenever I search something on Google and then I see an ad for that on Instagram, I wonder, if they know that about me, what else do they know? It makes me feel vulnerable and exposed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Diagnostic and Statistical Manual of Mental Disorders mentions “a sense of foreshortened future” as a symptom of trauma. Trauma damages trust, and a &lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4166378/&quot;&gt;lack of trust warps the experience of time itself&lt;/a&gt;, states a 2014 study. Survivors of trauma often strongly believe that bad things — like dying early, or suffering rejection — are sure to befall them.&lt;/p&gt;
&lt;p&gt;“Trust has been violated with many individuals with a history of trauma,” says Rob.&lt;/p&gt;
&lt;p&gt;Broken trust is difficult to rebuild. But we can work to promote trust by practicing transparency. Don’t exploit or manipulate people. Don’t ask for unnecessary information. Eliminate black boxes. And let people know ahead of time when you’re planning to roll out big changes.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Recommendations:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don’t exploit people or the environment.&lt;/strong&gt; This should go without saying: any technology which depends on the exploitation of people or places cannot be trauma-informed. This includes advertising, which sells our attention without consent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid &lt;a href=&quot;https://deceptive.design&quot;&gt;deceptive patterns&lt;/a&gt;.&lt;/strong&gt; Deceptive patterns are “tricks used in websites and apps that make you do things that you didn’t mean to, like buying or signing up for something.” They can take a variety of forms, like misdirection, ads disguised as content, or items snuck into your basket before checkout. Common among them? They manipulate people to benefit a business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t ask for unnecessary information.&lt;/strong&gt; If you ask for something like “gender” on a registration form, consider first whether that information is essential to know — if it’s not, remove it. If it is, plainly state why you need it and how you’ll use it. Apple has begun requiring developers to disclose &lt;a href=&quot;https://developer.apple.com/app-store/app-privacy-details/&quot;&gt;privacy information&lt;/a&gt; to users in the App Store. App “nutrition labels” will help inform people about what data companies have access to. Do you do the same within your product?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eliminate &lt;a href=&quot;https://tuftsobserver.org/whats-in-an-algorithm-the-problem-of-the-black-box/&quot;&gt;algorithmic black boxes&lt;/a&gt;.&lt;/strong&gt; “Why was I shown this?” is a question that anyone should be able to answer. Since Instagram changed the feed from chronological to algorithmic in 2016, people have repeatedly asked to bring back the previous time-based ordering — which so far, Instagram has refused to do. Algorithmic ordering offers Instagram a way to quietly hide and reorder content — but to whose benefit? Without insight into how the algorithm works, it’s impossible to know.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prepare people for change.&lt;/strong&gt; Imagine returning home one day to find that your landlord had sold all your furniture, bought new stuff, and arranged it completely differently. This happens in technology daily. If you need to swap out some furniture or move things around, give a heads up. Gradual, incremental change is generally preferable to sweeping redesigns.&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;
&lt;h3 id=&quot;peer-support&quot;&gt;Peer support&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A trans friend reached out to me for help. They wanted me to report a pre-transition photo of them so it would be taken down quickly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;There are some small Discord servers I’m a part of that are cute and fun, despite all being strangers. Decentralized platforms allow for these subcultures [to form] that don’t have anywhere else to congregate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I’m using a piece of technology, peer support is about communicating and working together with people like me to understand and work through any problems I may encounter.&lt;/p&gt;
&lt;p&gt;It’s important for tech systems to allow for public critique, emphasize shared humanity, and contextualize data to encourage informed reactions.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Recommendations:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support peer discussion and public critique.&lt;/strong&gt; Give people the chance to provide feedback on the technology you build. Developers of electronic health records like EPIC attach &lt;a href=&quot;https://www.politico.com/story/2015/09/doctors-barred-from-discussing-safety-glitches-in-us-funded-software-213553#ixzz3lqiv1mv4&quot;&gt;gag orders&lt;/a&gt; to contracts with hospital systems which prevent doctors from critiquing or discussing problems with the software. Doctors aren’t allowed to post screenshots—even &lt;a href=&quot;https://www.epstudiossoftware.com/epic-bullying/&quot;&gt;satirical&lt;/a&gt; ones—and these intense restrictions can lead to fatal results for patients.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emphasize shared humanity.&lt;/strong&gt; On the internet, it’s easy to type things we’d never consider saying to someone in real life. Are there changes you could make to humanize the way peers engage? In 2016, Nextdoor rolled out a new reporting flow which &lt;a href=&quot;https://web.archive.org/web/20240819211757/https://blog.nextdoor.com/2016/08/24/reducing-racial-profiling-on-nextdoor/&quot;&gt;reduced posts containing racial profiling by 75%&lt;/a&gt; by requiring reports to be specific. How can you remind people that there’s a person on the other side of the screen?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contextualize data.&lt;/strong&gt; Apps like Citizen and Nextdoor have driven &lt;a href=&quot;https://www.vox.com/recode/2019/5/7/18528014/fear-social-media-nextdoor-citizen-amazon-ring-neighbors&quot;&gt;a rise in fear about crime&lt;/a&gt;, even as crime has fallen to &lt;a href=&quot;https://www.pewresearch.org/fact-tank/2020/11/20/facts-about-crime-in-the-u-s/&quot;&gt;its lowest level in decades&lt;/a&gt;. People are superstitious. When presenting data, consider whether the degree of focus on that data matches the degree of the problem in real life.&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/collaboration.B6DL1a16_Z2l6OQq.webp&quot; alt=&quot;Two arrows pointing toward each other around the edges of a rectangle.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4200&quot; height=&quot;2400&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;collaboration-and-mutuality&quot;&gt;Collaboration and mutuality&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[The Q&amp;amp;A platform] Stack Exchange has a meta discussion board where anyone can post feature requests and leave comments on announcements before a new release. Engaging the community really helps build a strong platform that everyone can help shape.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[3D creation tool] Blender is open source. The community is amazing, and enough people (and corporations) donate that they’re able to pay for full-time staff.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While the previous principle is about enabling people who use your technology to empathize and work together, collaboration and mutuality is about working as equals with the people you’re building for.&lt;/p&gt;
&lt;p&gt;“People aren’t data sets,” notes Loretta. “People are highly-edited presentations of self.” And despite the language often used in tech, &lt;a href=&quot;http://www.ted-hunt.com/USERS-PEOPLE.html&quot;&gt;people aren’t “users”&lt;/a&gt;—people are people.&lt;/p&gt;
&lt;p&gt;By collaborating with the people you build technology for, solutions improve. You use familiar language, avoid assumptions and judgement, weed out guilt and shame, and recognize that the things you want to do—as a designer, an engineer, or a product or business leader—are not always the things that others want or need.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Recommendations:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Listen and co-create.&lt;/strong&gt; When interacting with Cityblock members, Social Worker Charlotte Christopher notes the importance of coming up with meaning together rather than prescribing what must be done. “I’ll say, ‘I see a note about depression in your chart,’ rather than, ‘I see you’re depressed.’ Both people are learning, even if it’s on a different level.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use familiar, &lt;a href=&quot;https://www.cdc.gov/ncbddd/disabilityandhealth/materials/factsheets/fs-communicating-with-people.html&quot;&gt;people-first language&lt;/a&gt;.&lt;/strong&gt; Use words that a person uses to refer to themselves. It may not always be technically accurate, but it’s language that’s comfortable and familiar. At Cityblock, I’ve been on a mission to replace every instance of the words “the member” with a member’s preferred name, as a constant reminder of their individuality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid assumptions and value judgements.&lt;/strong&gt; When Cityblock updated the list of areas a care team might focus on with a member, we cut out all negative value judgements. For example, “Substance Abuse” evolved to “Substance Use”, and “Poor Housing Conditions” became simply “Housing”. Not only are these labels more respectful, they expand possibilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t guilt or shame.&lt;/strong&gt; Many marketing sites use a tactic called &lt;a href=&quot;https://www.nngroup.com/articles/shaming-users/&quot;&gt;confirmshaming&lt;/a&gt; to increase conversion rates, presenting a choice like “sign me up” against “no thanks, I hate saving money.” Don’t do this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t create false urgency.&lt;/strong&gt; After hearing the ping of a notification, it’s common for anxiety to spike. What’s this message about? Is this something bad? Can I look at this now? Do I need to respond? Think hard about which notifications are truly urgent. Cut the rest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mind “engagement” versus addiction.&lt;/strong&gt; Dissociation is common in individuals with a history of trauma. Can your product be used mindlessly? Infinite scroll and new content on every refresh make it easy to lose track of time. Intentionally adding friction — like paginating content instead of scrolling — can increase awareness of time spent.&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/choice.D7ydwaEi_ZAxs21.webp&quot; alt=&quot;A series of checkboxes, all checked.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4200&quot; height=&quot;2400&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;empowerment-voice-and-choice&quot;&gt;Empowerment, voice, and choice&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;When I reactivated my Instagram after deactivating it several months ago, every person I ever tagged was re-notified, including my exes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The ‘so-and-so viewed you’ notifications on LinkedIn don’t tell me much besides someone keeps obsessively looking at my page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s really lovely to be able to say ‘I don’t want to interact with this person’ and make them (sort of) disappear through hiding/blocking them. [There are] lots of people from my childhood I want nothing to do with…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Trauma is often the result of being out of control in a situation. Thus, it’s critical to give people the power to change things—whether that means deleting their account, revoking consent, or adjusting what appears and what doesn’t.&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Recommendations:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support the right to relocate.&lt;/strong&gt; Can people download their data? Can they delete it from your system at their request? Can they transfer it to a competitor? Avoid &lt;a href=&quot;https://en.wikipedia.org/wiki/Vendor_lock-in&quot;&gt;vendor lock-in&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always allow opting out.&lt;/strong&gt; When designing forms, there may be questions people aren’t comfortable answering. Present the ability to respectfully decline. If anyone ever wants to quit your service or modify the terms they initially chose, let them. “Consent on Monday doesn’t mean consent on Tuesday,” says Charlotte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build thoughtful settings and preference panes.&lt;/strong&gt; Where is the locus of control between the designer and the user? User-controlled settings help redistribute power. Do people have the ability to disable features they don’t want or need, or enable ones which could improve accessibility and comfort? There’s a balance—providing too many settings can overwhelm, too.&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/culture.D-KOcDZJ_Z14eIVx.webp&quot; alt=&quot;Two hands holding a globe.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4200&quot; height=&quot;2400&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;cultural-historical-and-gender-issues&quot;&gt;Cultural, historical, and gender issues&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Pregnancy apps are super normative and make a lot of assumptions. I don’t need to know that my baby is the size of an apple. I need to know where to find a midwife near me, or what to do when this part of my body hurts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m very sensitive to weight loss-centered language with fitness or activity apps. I just want a numberless food tracker!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[Planned Parenthood’s period tracker] &lt;a href=&quot;https://www.plannedparenthood.org/get-care/spot-on-period-tracker&quot;&gt;Spot On&lt;/a&gt; never assumes you identify as a woman, want to get pregnant, have tits, etc. A lot of period trackers make fertility their main focus, so Spot On was a relief.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;People from different backgrounds go about the world differently. If people from different backgrounds aren’t a part of creating your technology, you’re going to miss things. You might miss an algorithm amplifying bias, or the impact of metrics on self-worth. Your language might unintentionally exclude certain people.&lt;/p&gt;
&lt;p&gt;Charlotte observes, “everybody wants to be known, but nobody wants to be labeled.”&lt;/p&gt;
&lt;aside&gt;&lt;p&gt;&lt;strong&gt;Recommendations:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build diverse organizations.&lt;/strong&gt; A 43 year-old Black man, a 67 year-old trans woman, a 32 year-old undocumented immigrant, and a 28 year-old cisgender male all have different lived experiences and relations to trauma. They’ll each offer different insights into how your technology might succeed or fail, and what notions of “success” or “failure” even are.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch out for algorithmic bias.&lt;/strong&gt; If you’re training an algorithm, what data is it based on? Does that data perpetuate current day injustice? A &lt;a href=&quot;https://www.nature.com/articles/d41586-019-03228-6&quot;&gt;2019 study&lt;/a&gt; found that an algorithm used in health systems across the US was “less likely to refer black people than white people who were equally sick to programs that aim to improve care for patients with complex medical needs.” The algorithm’s dataset included many doctors who systemically assigned lower risk scores to Black patients. Encoding those decisions in an algorithm perpetuated bias.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beware of vanity metrics.&lt;/strong&gt; Likes, comments, followers, and other social metrics can weasel their way into measures of self-worth. Negative self-image is one common response to trauma — consider whether you’re quantifying the value of a person, and what the implications of that are.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid seen states and read receipts.&lt;/strong&gt; Seen states and read receipts can heighten anxiety and hypervigilance by causing individuals to question whether the seeing-of is a response of its own. They take something implicit and private and make it explicit and public. Hypervigilance or the feeling of “being watched” can also decrease the feeling of safety.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write inclusive, assumption-free language.&lt;/strong&gt; It’s common for health organizations to use the phrase “women’s health” as a way to talk about things like menstruation, pregnancy, and pap smears. Yet “women’s health” as a label disregards the significant number of trans men who may need to discuss these topics. Is there language you use which makes assumptions about people? See if you can adopt a more inclusive alternative.&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;
&lt;h2 id=&quot;putting-theory-into-practice&quot;&gt;Putting theory into practice&lt;/h2&gt;
&lt;h3 id=&quot;trauma-informed-design-is-difficult-work&quot;&gt;Trauma-informed design is difficult work&lt;/h3&gt;
&lt;p&gt;It’s often easier, both technically and organizationally, to barrel forward with a new feature or product without implementing things like user settings, consent-based workflows, privacy safeguards, and algorithmic transparency.&lt;/p&gt;
&lt;p&gt;Technologists have an enormous responsibility to create systems of interaction which respect individuals and promote healing.&lt;/p&gt;
&lt;p&gt;When we move fast and break things, sometimes the things we break are humans. This work is difficult because it’s worthwhile.&lt;/p&gt;
&lt;h3 id=&quot;design-is-not-enough&quot;&gt;Design is not enough&lt;/h3&gt;
&lt;p&gt;This isn’t a framework you can slap on at the end of the project and call yourself trauma-informed. You have to step back and look at the business model itself to ask whether it exploits or perpetuates harm to individuals, groups, or ecosystems. A business model which relies on selling user data is not safe or transparent, no matter how clean the interface is. A business model which exacerbates inequality will also exacerbate trauma.&lt;/p&gt;
&lt;p&gt;Trauma-informed design requires asking questions and establishing a dialogue, not prescribing answers. If you’re used to moving quickly, adopting a trauma-informed approach will likely slow you down. This is good. It means you and your team are taking time to answer difficult questions about how your technology affects the well-being of others.&lt;/p&gt;
&lt;p&gt;Through trauma-informed design, we can create a future where technology respects our attention. One that’s quietly supportive, not presumptive or over-helpful. One where we’re free to move between platforms without guilt. One where we know our data isn’t sold at our expense. Where we feel safe. Seen, but not watched.&lt;/p&gt;
&lt;p&gt;“Mistakes will be made,” Charlotte says. “But it’s important for someone to believe they will be heard.” Keep feedback loops open, co-create meaning, and above all?&lt;/p&gt;
&lt;p&gt;“Be more gentle.”&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;After I was outed, things got difficult for a while. I remember locking myself in my room and sobbing into a pillow and feeling deeply alone. I remember feeling exposed and unprepared.&lt;/p&gt;
&lt;p&gt;Compared to other kids, I was lucky. I wasn’t kicked out of the house. I wasn’t taken out of school or sent to conversion therapy. Although this was before a &lt;a href=&quot;https://itgetsbetter.org/&quot;&gt;marketing campaign&lt;/a&gt; would tell me so, it did get better.&lt;/p&gt;
&lt;p&gt;My parents eventually came around. With my sister, my mom attended a protest against &lt;a href=&quot;https://en.wikipedia.org/wiki/North_Carolina_Amendment_1&quot;&gt;Amendment One&lt;/a&gt; in North Carolina. A year after coming out, my digital and physical worlds merged more fully: my parents got to meet my first boyfriend, who came to visit from South Carolina. We’d met on those message boards.&lt;/p&gt;
&lt;figure class=&quot;popout&quot;&gt;&lt;p&gt;&lt;img src=&quot;/_astro/gay-lol.BVuEldi7_Z2dqOjw.webp&quot; alt=&quot;Ky poses and throws up a peace sign while standing in front of the Horseshoe First Baptist Church, which reads, &amp;quot;God Defines Marriage, 1 Man, 1 Woman&amp;quot;.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;2000&quot;&gt;&lt;/p&gt;&lt;figcaption&gt;Emboldened after a return home from college, I pose beside a church sign in 2015.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I doubt that the designers and engineers working on YouTube in the 2000s expected their recommendation algorithm to out a Southern teen. Yet it did.&lt;/p&gt;
&lt;p&gt;What if those YouTube recommendations hadn’t been there? Would history have taken a different course? I can’t know for sure, but I do know that for everything I build now, I want my designs to be trauma-informed.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Special thanks to Ari Rosner, Blithe Parsons, Charlotte Christopher, Jon Marquez, Juliana Ekong, Lon Binder, Loretta Staples, Maria Boncyk, Neves Rodrigues, Owen Tran, Pooja Mehta, Rob Jordan, Taylor Maynard, Toyin Ajayi, and many other friends and colleagues who contributed to this article.&lt;/p&gt;</content:encoded></item></channel></rss>