<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sarah Streza]]></title><description><![CDATA[Software developer, co-owner of Doki Dreamers, VTuber fan, technomancer, and patron of the arts.]]></description><link>https://sarahstreza.com</link><generator>Sarah Streza</generator><lastBuildDate>Thu, 01 Oct 2026 09:37:24 GMT</lastBuildDate><atom:link href="https://sarahstreza.com/feed.xml" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Oct 2026 09:37:24 GMT</pubDate><atom:link href="https://webmaster.sarahstreza.com/websub" rel="hub"/><item><title><![CDATA[A Brief Reintroduction]]></title><description><![CDATA[<p>My name is Sarah. I am a software engineer, a small business owner, a VTuber fan, a tinkerer, a fan of strange gadgets, a patron of the arts, and a woman. In the past I have been a video creator, a comic book author, and an open source developer. I have also been known by another name and a couple of genders, but as of today, that is no more. Please refer to me exclusively as Sarah and refer to me as she or her.</p>
<p>This process has been going on for several years, and has involved some intense reflection within myself. I would like to use this as a reintroduction and abandon bad habits of the past. If we have fallen apart in recent years, feel free to reach out.</p>
<p>Will that mean I update my website more regularly? Almost certainly not! But you can find me on the same accounts on socials, with newly updated usernames. There will probably also be accounts on the Internet that take a while (or forever) to update properly. That’s just how it goes.</p>
<p>If you have written about my work or we have chatted on a podcast, you are encouraged to update old names where able, but I will in no way be upset if you don’t. And in general, while blatant disrespect is not acceptable, I am very tolerant of good-faith mistakes and slip-ups. We are all human.</p>
<blockquote>
<p>“Risk being seen in all of your glory.” - Jim Carrey</p>
</blockquote>
<p>Thank you for reading and caring about me.</p>]]></description><link>https://sarahstreza.com/2026/10/01/a-brief-reintroduction/</link><guid isPermaLink="false">https://sarahstreza.com/2026/10/01/a-brief-reintroduction/</guid><pubDate>Thu, 01 Oct 2026 08:44:56 GMT</pubDate></item><item><title><![CDATA[What Apple Executives Cared About in the Epic v. Apple Injunction]]></title><description><![CDATA[<a href="https://storage.courtlistener.com/recap/gov.uscourts.cand.364265/gov.uscourts.cand.364265.1508.0_2.pdf">Link</a> <aside>
<p>I am not a lawyer. I am an iOS software engineer who is a law nerd and who handles a lot of contracts. I am also biased against Apple's anticompetitive practices on the App Store for over a decade.</p>
</aside>
<p>Background: On April 30, 2025, the court involved in the Epic v. Apple lawsuit issued a ruling that Apple was blatantly and deliberately acting against their previous injunction, lying under oath, and doing everything to undermine compliance and the spirit of the previous ruling. I ran through the full ruling in threads on <a href="https://indieweb.social/@stevestreza/114429883616926078">Mastodon</a> and <a href="https://bsky.app/profile/did:plc:lglse7cclhd43ipv5gdmaoeh/post/3lo34iugccc2s">Bluesky</a> if you’d like more background.</p>
<p>The main points the judge made:</p>
<ul>
<li>Apple picked a 27% commission vs their 30% App Store fee to prevent developers from being able to choose to leave in practice (because 3% is roughly every credit card processor’s fee)</li>
<li>Apple required developers to give them commissions on ALL sales for 7 days after sending a user to their website</li>
<li>Apple designed the payment link-out button to look like a small text link to make it hard to see and less appealing to tap</li>
<li>Apple only allowed developers to direct to a static URL, which couldn’t include any account-specific credentials, making it less likely that people would complete the process out of the app</li>
<li>Apple designed a warning screen to “scare” users away from clicking the link-out button, with Apple’s designers laughing about how to make it more hostile (the ruling calls this the “scare screen”)</li>
<li>Apple manufactured a string of evidence to try to convince a court that the only inevitable outcome was the one that didn’t require Apple to give up any money or control</li>
<li>Apple improperly put hundreds of thousands of documents under privilege, slowing the legal process by months</li>
</ul>
<p>The ruling is directed at Apple as a whole, but decisions are made by people, and the ruling made it very clear who was involved: Apple’s upper level, going all the way to CEO. But since the framing is around the actions the company took, it’s hard to know who did what. So let’s take a look at which executives were involved in which decisions.</p>
<ul>
<li><strong>Tim Cook</strong> was the tie-breaking vote on whether there should be a commission at all, signing off on 27%. He approved the restrictions on payment links and their hostile design to only show as a small text link, rather than a button, and to only allow a static URL which would stymie passing along a cookie. And he worked on refining the copy of the scare screen. As the CEO, he is of course ultimately responsible for everything, but the court has determined that he actively worked on these.</li>
<li><strong>Luca Maestri</strong> as CFO was driving all of these discussions from a revenue angle. He was the main advocate for a 27% commission, even though others were suggesting lower commissions. He also contributed to the scare screen design.</li>
<li><strong>Alex Roman</strong> is a VP of finance, and he apparently lied under oath to the court, earning a referral to a prosecutor for him and Apple for criminal contempt. He testified that Apple didn’t do any real research on what developers would have to pay if they went on their own, an obvious and provable lie. And he testified that Apple didn’t know what the fee would be, when his boss decided it 6 months earlier. What a guy.</li>
<li><strong>Phil Schiller</strong> appears to be the only executive at Apple who tried to take the L and do the reasonable thing. He was the lone advocate (at least for the handful of people the ruling mentions by name) for a no-commission model and for just complying with the injunction. But he was also involved with the usage of the placement and design of the small text link for directing users away from the app, and for contributing to the anti-patterns of the scare screen. He is at least not responsible for the 27% commission, but he is not innocent here either.</li>
</ul>
<p>Three things stick out to me.</p>
<p>First: the only considerations Apple executives made were for <strong>revenue</strong> and <strong>control</strong>. At no point did the user’s experience enter the picture, except as a hand-wavey gesture towards “safety” when leaving an app. Apple gave up treating developers with decency a decade ago, knowing they have them by the throat and can make them do whatever they want. Legal compliance was asked to be as close to the line as possible, and to stick a toe over if their arrogance made them believe they could get away with it. Beyond that, in every decision, money and power were what they chose, and the ruling includes evidence that this is how they thought when no one was looking.</p>
<p>Second: the hubris is overwhelming. Apple could’ve chosen a number that was similarly high, but not SO high that would’ve made it look obvious. They could’ve allowed for buttons, or toned down the ridiculous scare screen, or cut down their 7-day commission carryover, or any number of things. But they made it so easy to see their intentions, and they left a paper trail. They really could not have more thoroughly engineered a situation that would make them look as deliberately anticompetitive as they have been here.</p>
<p>Third, and arguably most important: the rot went all the way to the top. Tim Cook signed off on all of this, and but for Schiller’s protest over the 27% commission, so did the executives involved. This wasn’t something that was caught up in a committee and escaped the vision of the CEO. He was giving the thumbs up on <em>all of it</em>. If you think any of this is as offensive as the judge did, there are many people to point fingers at, but they all directly lead back to Team Cook.</p>
<p>I resent that Apple has reached this point. If they did it here, with the eyes of a court on them, they are probably thinking this everywhere. Their efforts in the European Union to defy regulators around the Digital Markets Act are probably working along the same lines. If they need to back away from something to make a buck, we have evidence to point to which suggests which decision they would take.</p>
<p>The Apple that would’ve chosen fighting for the customer is gone. It will not be back when the sickness is so deep. I hope that we soon see the end of the era of Tim Cook.</p>]]></description><link>https://sarahstreza.com/2025/04/30/what-apple-execs-cared-about/</link><guid isPermaLink="false">https://sarahstreza.com/2025/04/30/what-apple-execs-cared-about/</guid><pubDate>Thu, 01 May 2025 05:52:00 GMT</pubDate></item><item><title><![CDATA[Framework's February 2025 Event]]></title><description><![CDATA[<a href="https://www.youtube.com/watch?v=-8k7jTF_JCg">Link</a> <p>It’s nice to be excited about a computer company’s products again.</p>
<p><a href="https://frame.work/">Framework</a> held an event today, showing off some new updates for existing products and a couple of new ones as well. I’ve been daily driving their <a href="https://frame.work/laptop16">Framework Laptop 16</a> running <a href="https://nixos.org/">NixOS</a> as my non-work laptop for the last year, and a few nits (and some WAY too loud fans) aside, it’s been a great machine. While I was hoping for some updates to that model, it’s still cool to see where they’re going.</p>
<p>One theme prevalent throughout the event was the use of Ryzen-based APUs that include machine learning processing silicon (which AMD calls <a href="https://www.amd.com/en/technologies/xdna.html">XDNA</a>). If generative AI must exist, I much prefer running it locally, and I really don’t trust OpenAI/Meta/Google/Microsoft/Apple with any data beyond simple Q&#x26;A-type things. That’s still a tech space that requires professional-class hardware today, but it will likely become more accessible over the next few years. I assume this was partly a condition of being a relatively small startup yet getting such access to AMD’s hardware engineers, but it did make the presentation feel a little too much like “we’re trying to impress investors more than fans” energy.</p>
<p>The <a href="https://frame.work/desktop">Framework Desktop</a> was the most interesting reveal. It falls into the growing niche of small-but-mighty desktops like the Mac Studio, built on chips that have fast compute, graphics, and machine learning. The biggest downside is the soldered-on RAM, which AMD apparently couldn’t make socketable in this chip. However, that tradeoff means you get high-performance memory that can support massive models like those needed for high-parameter LLMs. You can also network them together; they showed a cluster of four desktop boards running in tandem, which could theoretically provide 384 GB of memory, enough to run something like DeepSeek-R1 with 4-bit quantization. To be clear, a cluster is a high-end tool for developers and hobbyists, but the desktop itself looks like a viable pre-built or desktop replacement for most people.</p>
<p><figure class="gatsby-resp-image-figure" style="">
    <span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/f99f541739c01a9aa199823b42c32bea/b17f8/framework_desktop_cluster.jpg"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 56.21621621621622%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAAB5tDRUGIv/8QAGxAAAgEFAAAAAAAAAAAAAAAAAQISABARITH/2gAIAQEAAQUCGZq5Y6pexAt//8QAFhEBAQEAAAAAAAAAAAAAAAAAABES/9oACAEDAQE/AYy//8QAFhEBAQEAAAAAAAAAAAAAAAAAABES/9oACAECAQE/AdK//8QAFxAAAwEAAAAAAAAAAAAAAAAAARAgMf/aAAgBAQAGPwLIK//EABoQAQADAAMAAAAAAAAAAAAAAAEAESEQQWH/2gAIAQEAAT8hJsr3I0usLwgo2CwPcMA4/9oADAMBAAIAAwAAABC/P//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxDKn//EABYRAQEBAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPxDCx//EABoQAQEAAwEBAAAAAAAAAAAAAAERACExQYH/2gAIAQEAAT8QCQabKfcMLA6B65aKOHeIGldyZy1zqvuCzuf/2Q=='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="Source: Framework"
        title=""
        src="/static/f99f541739c01a9aa199823b42c32bea/07f3a/framework_desktop_cluster.jpg"
        srcset="/static/f99f541739c01a9aa199823b42c32bea/d7fe6/framework_desktop_cluster.jpg 185w,
/static/f99f541739c01a9aa199823b42c32bea/f4308/framework_desktop_cluster.jpg 370w,
/static/f99f541739c01a9aa199823b42c32bea/07f3a/framework_desktop_cluster.jpg 740w,
/static/f99f541739c01a9aa199823b42c32bea/58406/framework_desktop_cluster.jpg 1110w,
/static/f99f541739c01a9aa199823b42c32bea/be922/framework_desktop_cluster.jpg 1480w,
/static/f99f541739c01a9aa199823b42c32bea/b17f8/framework_desktop_cluster.jpg 1600w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span>
    <figcaption class="gatsby-resp-image-figcaption">Source: Framework</figcaption>
  </figure></p>
<p>Their other laptop announcements were interesting. They teased a new <a href="https://frame.work/laptop12">12-inch convertible laptop/tablet hybrid</a>, which has their first touch screen and stylus support. This is definitely aimed at a different market than their other products, more akin to machines for kids and schools who want repairable hardware. I assume this won’t be a viable replacement for an art tablet or competitive with an Apple Pencil beyond basic writing and diagramming needs, but that would be a great market to start targeting as their stylus tech improves. They talked about some proof-of-concept ideas for more configurable keyboards for the Framework 16, which appears to be some way off.</p>
<p>But of course, their <strong>truly</strong> most exciting reveal…</p>
<p><figure class="gatsby-resp-image-figure" style="">
    <span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/c4a3a67726388f5726852e09b5c75218/12609/translucent_plastics.jpg"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 40.54054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAIB/9oADAMBAAIQAxAAAAHNMpsCH//EABgQAAMBAQAAAAAAAAAAAAAAAAECEgMR/9oACAEBAAEFAq69APo+df/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAEAAwEAAAAAAAAAAAAAAAABABEhYf/aAAgBAQAGPwJBp7NZlz//xAAZEAEAAwEBAAAAAAAAAAAAAAABABEhMVH/2gAIAQEAAT8hEbe0JoRWXAa8z//aAAwDAQACAAMAAAAQi9//xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAEDAQE/EAckNv/EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQIBAT8QV7G5f//EABsQAQACAgMAAAAAAAAAAAAAAAEAESFRQXGx/9oACAEBAAE/EEvQMmKOM7uO9qPa/IYCFLAGntZ//9k='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="Source: Framework"
        title=""
        src="/static/c4a3a67726388f5726852e09b5c75218/07f3a/translucent_plastics.jpg"
        srcset="/static/c4a3a67726388f5726852e09b5c75218/d7fe6/translucent_plastics.jpg 185w,
/static/c4a3a67726388f5726852e09b5c75218/f4308/translucent_plastics.jpg 370w,
/static/c4a3a67726388f5726852e09b5c75218/07f3a/translucent_plastics.jpg 740w,
/static/c4a3a67726388f5726852e09b5c75218/58406/translucent_plastics.jpg 1110w,
/static/c4a3a67726388f5726852e09b5c75218/be922/translucent_plastics.jpg 1480w,
/static/c4a3a67726388f5726852e09b5c75218/12609/translucent_plastics.jpg 3000w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span>
    <figcaption class="gatsby-resp-image-figcaption">Source: Framework</figcaption>
  </figure></p>
<p>Translucent plastics for the screen bezel and the expansion cards. These look gorgeous and will make a fantastic accent to the bottom and sides of a laptop. I am getting some of these as soon as I can. I hope they come to the Framework Laptop 16 <em>very quickly</em>.</p>
<p>While the event itself was pretty great, there were some pieces that were either disappointing or just… off. The lack of updates to the Framework 16 was really the most glaring, though given their startup nature and the fact that it’s their newest mainline product, it’s excusable. It would’ve been nice to get some upgrades this year, maybe another GPU model or quieter fans (dear Framework, please fix the fans, oh my god). The other piece that was a little unsettling was how some of their changes were either targeting investor types or were contrary to their past efforts. While the Desktop had a plausible technical reason for having soldered memory (seemingly driven by AMD requirements), it does mean the device is that much less upgradeable and repairable. The frequent nods to AI and being a Copilot+ PC were seemingly aimed at a less-technical audience. They did have some upgrades for the Framework 13, so hope is not lost, but we’ll have to keep an eye on this.</p>
<p>But overall, it’s good to see Framework still pushing out interesting products that focus on modularity, upgradability, and repairability. The rest of the industry is trying to turn the PC into another appliance you have no control over, and I choose to support those fighting against that trend.</p>]]></description><link>https://sarahstreza.com/2025/02/25/framework-event/</link><guid isPermaLink="false">https://sarahstreza.com/2025/02/25/framework-event/</guid><pubDate>Wed, 26 Feb 2025 02:17:54 GMT</pubDate></item><item><title><![CDATA[Why I Experiment With LLMs]]></title><description><![CDATA[<p>Large language models (LLMs) are a polarizing technology. It seems that no matter who you talk to, they are either magical tools that will bring about machine consciousness and the end of scarcity and human labor, or a worthless autocorrect that steals the work of the world’s creators while boiling the oceans to fill the internet with regurgitated content slop. In many social spaces online, there isn’t much room for nuance between those extremes.</p>
<p>To my mind, both of these views are misguided attempts to influence human behavior. Those on the positive side are either uninformed about their limits or are trying to convince investors to part with their money. On the negative side are people who have associated “AI” with tech companies that have been forcing anti-features, privacy-violating spyware, and needlessly confusing redesigns into their products. In both cases, there is a nugget of truth that has been buried under propaganda, and when that propaganda becomes ideological, the truth becomes whatever fits the ideology.</p>
<p>In practice, the truth is in the middle. The evidence that LLMs are capable of some tasks is overwhelming and incontrovertible. For many people, they have value in brainstorming, summarizing, coding, authoring, roleplaying, natural language processing, and other jobs. But it’s also not a panacea; there are clear limits to what they can do, and questions about accuracy are not unfounded. The machines that generate and power these models consume significant energy, and tracking that consumption and the sources that power them is vital.</p>
<aside>
Also, it must not go unsaid: <strong>The companies who have pioneered large language models as a technology have done so via outright theft and exploitation of the world's creators.</strong> OpenAI, Google, Facebook, Microsoft, Apple, Amazon, Nvidia, Baidu, Tencent, Stability AI, Anthropic, HuggingFace, and other companies have stolen from society and made obscene amounts of money off the back of this theft. We can never forget or forgive the scale of their pillaging. <strong>This is a crime of copyright infringement on a societal scale, and there is no possible adequate restitution for their crimes.</strong>
</aside>
<p>However, despite the plundering that led to the production of these models, the fact remains that they have been produced. There is no putting this toothpaste back into the tube; we have models, you can download them, and they cannot be eliminated. There is no value in breathlessly proselytizing about them, and there is no merit in sticking one’s head in the sand. There is real utility here. An LLM edited this very post, finding three typos and a grammatical error. We would be better served by treating LLMs skeptically and honestly, understanding how to use them, building intuitive mental models about how they work, and knowing how they might be manipulated to produce misleading or incorrect results.</p>
<p>That’s what I seek to do here: learn about LLMs as they are, and share my findings without prejudice about them being evil or being snake oil. For those who belong to the camp of one of the extremes, you are welcome to stay there if you like, but I am not really interested in talking someone in or out of an ideology. For those who do want to think critically about this new technology, I invite you to contribute to this effort as well and provide critique about how I approach these experiments.</p>]]></description><link>https://sarahstreza.com/2025/01/03/why-i-experiment-with-llms/</link><guid isPermaLink="false">https://sarahstreza.com/2025/01/03/why-i-experiment-with-llms/</guid><pubDate>Sat, 04 Jan 2025 04:59:29 GMT</pubDate></item><item><title><![CDATA[Hello Again]]></title><description><![CDATA[<p>It’s been a while, huh.</p>
<p>Looking at the archives, I haven’t updated this site in over four years. Quite a bit has changed in that time: an entire US presidential cycle, my three-and-a-half-year job at Microsoft Teams has come and gone, COVID-19 is still here, I had to say goodbye to our kitty, I bought a house, the entire nature of social media has radically changed, we lived through the boom and bust of NFTs, I played way too much Final Fantasy XIV, I fell down the VTuber rabbit hole, I <a href="https://dokidreamers.com/">joined my partner’s business</a> running behind-the-scenes operations, I’ve started researching and experimenting with large language models and generative coding, and plenty more. I work at <a href="https://kickstarter.com/">Kickstarter</a> now as a senior iOS engineer, because it seems more vital than ever to build tools for creatives to get funding for projects, which also means I’m a <a href="https://kickstarterunited.org/">union member</a> now.</p>
<aside>
<p>Which begs the question: <strong>why was none of this documented here?</strong></p>
<p>The answer lies in me being the kind of nerd who enjoys highly specific and customizable setups. This website is built with <a href="https://www.gatsbyjs.com/">Gatsby.js</a>, an open-source static site generator that turned into a business, got acquired, and then the acquirer left it to rot on the vine. But in that time, they released three major versions, each with separate breaking changes, and while dependency tracking and lockfiles should have prevented issues, they… didn’t. It took months of trying and retrying to update packages and incrementally work back toward a buildable site to just get it to work at all. It was very frustrating, and I don’t recommend anyone build with Gatsby going forward, but I’ve already invested the time in it, so I’ll keep using it for now.</p>
<p>The other problem has to do with the act of deploying. As a developer, I built this entire process around committing a blog post to a Git repository, pushing it to GitLab, letting GitLab’s CI rebuild the website, and then having GitLab CI connect to another server via SSH and sync the files to it. Back in 2021, I switched away from GitLab to Gitea on a server running inside my home. Gitea doesn’t have a CI, but it is very common to use <a href="https://drone.io">Drone</a> instead. So that half of the process needed to be rebuilt, which couldn’t really happen until the Gatsby problem was solved.</p>
</aside>
<p>The good news is that I can build the website again, and I’ve already made a few minor changes, such as <del>burning Twitter off of here</del> updating my social links to point to Mastodon and Bluesky, and adding an automatic dark mode across the site. I have never been a great “blogger,” so I am also planning to adjust the site’s structure and design to be more focused around collections of pages rather than blog posts. For example, I love video games, and I want to organize and write about some of the games I really enjoy; a page about my Warrior of Light in Final Fantasy XIV would be a great archive for my own enjoyment. My website is for me as much as for you.</p>
<p>Given the decaying state of social media, the general fracturing of society along ideological lines, and the ongoing reality of the <a href="https://en.wikipedia.org/wiki/Dead_Internet_Theory">dead internet theory</a>, it feels as good a time as any to try and kick the tires on maintaining my own personal internet garden again. I still believe in the tenets of the <a href="https://indieweb.org/">IndieWeb</a>, and want to support those technologies where I can, along with bridging to the fediverse and maybe run a PDS with the blog content. I want to try to maintain a positive outlook here, but also with a critical eye on systemic and corporate levers of power. I don’t know if I’ll be able to keep it up, but hey. Nothing ever happens without intentionally starting it.</p>
<p>Until then, please consider <a href="/feed.xml">tossing me back</a> on your RSS reader such as <a href="https://feeder.co/">Feeder</a> or <a href="https://netnewswire.com/">NetNewsWire</a>.  Thank you very much!</p>]]></description><link>https://sarahstreza.com/2025/01/01/hello-again/</link><guid isPermaLink="false">https://sarahstreza.com/2025/01/01/hello-again/</guid><pubDate>Wed, 01 Jan 2025 23:00:00 GMT</pubDate></item><item><title><![CDATA[Decrypting TLS Traffic to Debug SwiftNIO with Wireshark]]></title><description><![CDATA[<p><strong>In case anyone is concerned, this is not a security vulnerability in SwiftNIO, TLS, or anything else. This is merely a debugging feature I wanted to make more obvious.</strong></p>
<p>I’ve been somewhat fascinated with <a href="https://github.com/apple/swift-nio">SwiftNIO</a> lately. There’s something magical about getting code to work at the wire protocol level, and SwiftNIO makes it easy to do it safely and efficiently. I’ll save talking about it in much depth here, as I’m still very much figuring that out as I go, but I wanted to share a tip I had to figure out that I couldn’t easily find an answer for without some creative searching. <strong>Note:</strong> This post will be generally useless to you unless you’re already using <code class="language-text">NIOSSLContext</code> and <code class="language-text">TLSConfiguration</code>.</p>
<p>I came across <a href="https://gemini.circumlunar.space/">Project Gemini</a> recently, a simple hypertext protocol without all the tons and tons of baggage that the web has built up over the last few decades, and decided to give it a spin with SwiftNIO. Within a day, I was able to get a basic client implementation up and running, but doing so required some debugging.</p>
<p>Much like HTTP, Gemini runs with a request/response model, and I ran into a problem where I wasn’t sure if the server was receiving my requests, sending a response, or if something in my SwiftNIO code was not working properly. Normally when doing something at the wire protocol level, you would use a tool like <a href="https://www.wireshark.org">Wireshark</a>, but the trick is that Gemini requires ALL traffic to be TLS-encrypted. This means that, on its own, Wireshark can’t break the encryption (which is a very good thing!).</p>
<p>Fortunately, I’m not the only one who has needed to break TLS encryption for debugging reasons. TLS encryption requires both the client and sender to agree on encryption secrets, and if you have those,, Wireshark can decrypt the data. Many tools like <code class="language-text">curl</code> and some browsers support writing these secrets to a file using the environment variable
<a href="https://ec.haxx.se/usingcurl/usingcurl-tls/tls-sslkeylogfile">SSLKEYLOGFILE</a>, but I don’t think SwiftNIO’s TLS library supports this by default.</p>
<p>Instead, SwiftNIO exposes an API to access the important secrets as data. When setting up your <code class="language-text">TLSConfiguration.forClient()</code>, you can pass a closure to <code class="language-text">keyLogCallback</code>. This will get called periodically as part of TLS negotiations, and is equivalnet to the SSKEYLOGFILE output you’d get from <code class="language-text">curl</code> and friends. Just write this to a file somewhere using whatever API you like, e.g. <code class="language-text">FileManager().createFile(...)</code> if running on a Mac and make sure you’re appending and not overwriting. <strong>Make sure not to ship this!</strong></p>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/519f4111ca48ec881b10a337c57e886b/b5a09/wireshark-tls-preferences.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 74.05405405405405%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAACbklEQVR42o1T23KbMBDlNzJ1LpM4tlPHgBDC4EAM5moBgdh+SzqTfkcf+tuZycOpVh177LbT9uHMSgKtzp6za5SPyQevluB+COE/QgSP4PMQTCzghwmyqkWUFFgVtV4H0Up/d/3oBEKBzx8+jM/TKe4md/B9HxMVR6MxhBBYLBYIggDz+VzDdV3Ytg3Hcf4K4/b2FsPhEPFyiYuLC5yfnyMMQ+x2OzRNg+12i5eXF0RR9P8JCev1GtfX1zopsY3jWDNMkgRSSnDO/5lMJyR2o9FIXzw7OzswrKoKWZYhz3MdKblpmrAs64D9niKBKjDG4zEIlJDZTLNdBAtdLrEmLT3P0xr+yobOiPkxe4NeoBLpMkWXu5ixGWazn7i/vz9gf0aYKjPTNMXr66uuhjF2aspqtYJt2RhcDbBhPfqyQ1EVyLMcRVGgLMtD3K9JW5KDKjgxhTSkn64urzC4HKAVyt12i7qtUdc1+q5H27Z4enpS607Lsd9TQtL8t7bZbDawmWI4GCAIA3R9h77vESex1oj0Ep7QbAjc5VoiMoPkOCmZQC+Snp9Uwki9KCuJqlDl5QWyNINcS4QPISzTgsMccMYPLh/3p0Hlkss0HdSDNzc38F0fMpPopGJZd5C5RF02aMpaY0XjN3PQygZvX99Qyxouc/Ujug+p90hDmgZy0LEdeK6nIRQC5XziMFW2GsP9ORfgDocnlCFzjgmfYMZNGKQD9SD1G1EnPYg6UwmOEdomhNLYPjpLVyniNEZmpngzv6AwcxjL5fL9+flZi07C/mnEGDWxwgOzECpQ5GrfNi3W3RqbaY/vw2/YTTbvPwC9UO3aYWhIawAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="wireshark tls preferences"
        title=""
        src="/static/519f4111ca48ec881b10a337c57e886b/50383/wireshark-tls-preferences.png"
        srcset="/static/519f4111ca48ec881b10a337c57e886b/1d79a/wireshark-tls-preferences.png 185w,
/static/519f4111ca48ec881b10a337c57e886b/1efb2/wireshark-tls-preferences.png 370w,
/static/519f4111ca48ec881b10a337c57e886b/50383/wireshark-tls-preferences.png 740w,
/static/519f4111ca48ec881b10a337c57e886b/73caa/wireshark-tls-preferences.png 1110w,
/static/519f4111ca48ec881b10a337c57e886b/b5a09/wireshark-tls-preferences.png 1360w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>Once this file is written somewhere, open Wireshark and go to Preferences. Open the Protocols section and scroll all the way down to TLS. At the bottom of that pane will be a textbox that says something like <code class="language-text">(Pre)-Master-Secret log filename</code>, and here you put the path to the file you wrote out earlier. Wireshark will automatically monitor that file for updates, and with any luck, you should see decrypted traffic start to show up in Wireshark’s logs.</p>
<p>In the end, my bug was that when I was writing the request to the SwiftNIO Channel, it wasn’t flushing it. So ultimately I just had to change <code class="language-text">channel.write(...)</code> to <code class="language-text">channel.writeAndFlush(...)</code> and everything started working. Once Wireshark was decrypting the data, I was able to see that the request was simply never making it to the server I was connecting to, and that it started working just fine with that code change.</p>
<p><strong>Update:</strong> <a href="https://twitter.com/johannesweiss/">Johannes Weiss</a> of the SwiftNIO core team has <a href="https://twitter.com/johannesweiss/status/1328274245076590592">pointed out</a> another approach for capturing packets: NIOWritePCAPHandler. If you add this to your channel pipeline after the SSL handler, you can have it write out .pcap files which can be read by Wireshark or tcpdump. An
<a href="https://github.com/apple/swift-nio-extras/blob/main/Sources/NIOWritePCAPDemo/main.swift">example</a> of this can be found in the <a href="https://github.com/apple/swift-nio-extras">swift-nio-extras</a> repository. I completely missed this when hunting for answers, and this looks like it can be similarly helpful for debugging TLS-encrypted network traffic.</p>]]></description><link>https://sarahstreza.com/2020/11/15/swiftnio-tls-debugging/</link><guid isPermaLink="false">https://sarahstreza.com/2020/11/15/swiftnio-tls-debugging/</guid><pubDate>Mon, 16 Nov 2020 06:38:28 GMT</pubDate></item><item><title><![CDATA[iOS Shortcuts Workflow for Docspell]]></title><description><![CDATA[<a href="https://www.icloud.com/shortcuts/f95494bafede46e19a4b9188fbf9d70f">Link</a> <p>I <a href="https://github.com/awesome-selfhosted/awesome-selfhosted">self-host</a> a lot of the tools and services I use on a daily basis, meaning that rather than relying on iCloud or Dropbox or GitHub, I run a comparable (usually open-source) service on a server I control, either in the cloud or out of a server in my house. One thing that has been missing from that setup has been a tool to manage documents (receipts, tax forms, bank statements, etc). I recently stumbled onto <a href="https://docspell.org/">Docspell</a> and have been trying it out in that role for the last few days. The only problem is that it didn’t have an iOS app to use to upload receipts and documents to it. Rather than try to make an app myself, I saw that there was a <a href="https://docspell.org/docs/webapp/uploading/">simple HTTP POST API</a> for uploading documents, which was compatible with the iOS <a href="https://apps.apple.com/us/app/shortcuts/id915249334">Shortcuts app</a>.</p>
<p>So I built a <a href="https://apps.apple.com/us/app/shortcuts/id915249334">shortcut</a> to do that. When you add it to your Shortcuts app on an iPhone or iPad, it’ll ask you a few questions, like what your upload API URL is and what kind of document it’ll prompt you for (e.g. if you wanted a shortcut specific to receipts). It’ll default to having the name “save to Docspell”, but you can change that to something else like “save a receipt”.</p>
<p>There are four main ways to use this:</p>
<ol>
<li>You can tap it as a button from the Shortcuts app or widgets. It’ll ask you the name of the thing you want, and then prompt you to either select a file or capture some photos with the camera.</li>
<li>You can ask Siri to “save to Docspell” (or whatever you named it), and it’ll prompt you for those same things.</li>
<li>You can use the share button to save stuff from across your device. Attachments in mail, downloaded PDFs, screenshots, or really anything that could be treated as a file. In theory you can even share webpages to it and it should make an archive of the page (though my server times out when I try this).</li>
<li>You can use it as an export target for other workflows, meaning if you wanted to use a Shortcut to generate a PDF, you could then feed it into the Save to Docspell shortcut and upload it there.</li>
</ol>
<p>When you run it without input (#1 and #2 above) it’ll ask whether you want to upload a file or take some photos with the camera. If you take multiple photos, it’ll stitch them into a PDF for upload. All photos will be converted to JPEG, even if your phone is set to save as HEIC by default, and the orientation will be fixed to make sure OCR works. If you select a file, you can use the phone’s file browser to pick one from your device, iCloud, or any storage providers (e.g. Nextcloud) that you might want to export from. And it’ll notify you when the upload is successful, using a message directly from the API, so it can’t fail silently unless there’s a problem on the server. You can also setup multiple copies of the workflow with different public API upload URLs and names, so if you wanted one for receipts and a different one bank statements.</p>]]></description><link>https://sarahstreza.com/2020/10/24/ios-shortcuts-workflow-for-docspell/</link><guid isPermaLink="false">https://sarahstreza.com/2020/10/24/ios-shortcuts-workflow-for-docspell/</guid><pubDate>Sat, 24 Oct 2020 18:02:20 GMT</pubDate></item><item><title><![CDATA[WWDC Should Stay Online-Only]]></title><description><![CDATA[<p>Apple took WWDC online-only this year as a result of COVID-19. After 30-some years of the conference taking place between Santa Clara, San Jose, and San Francisco, there wasn’t precedent for this. While parts of WWDC (namely the sessions) had been easy to access online for several years, others like labs and live events were limited to on-site attendees only.</p>
<p>Last week we found out that, really, not much was missing. The keynote/state of the union still happened at the same times, but were pre-recorded around Apple’s campus. Sessions were released daily during the conference as videos of people talking over slide decks, rather than as presenters on stage in a conference hall. Labs were still held, but were done via teleconference and appointment. Even the <a href="https://developer.apple.com/news/?id=de1ebrx3">Apple Design Awards</a> and the lunch-time special guest events still happened. What was really missing was just the in-person face time from thousands of developers in one place, and the occasional event like the WWDC Bash.</p>
<p>But what was remarkable to me was how much better the week was as a whole. I attended WWDC in person from 2006 to 2015, and remotely since then, and this year’s conference was dramatically improved over both the onsite and online experience. So much so, that <strong>I don’t think WWDC should return as an in-person conference</strong>. Here’s why.</p>
<!--more-->
<p>First, we must acknowledge that <strong>WWDC is not accessible</strong>. Attending WWDC requires luck, financial privilege, and ideally an already-present seat in the industry.</p>
<ul>
<li>Attending at all cost $1,600 just to get a badge, and if you’re not local to the Bay Area, you also need to pay another $1,000 to $3,000 in flights, hotel, and food.</li>
<li>You need a job that allows you to take a week off, which might not be paid.</li>
<li>You need to be able to come to the United States, a country which has had a particularly hostile view to foreigners in recent years.</li>
<li>To make full use out of the time and the culture surrounding the event, you need to be able to manage social anxiety (since you’ll be undirected in a strange place for basically the entire time), be free of alcohol addiction (as many parties and events feature lots of booze, including Apple’s own WWDC Bash), and have the stamina and physical ability to find and attend after hours events going on late into the night for 4-6 days.</li>
<li>And all of this presumes that you can even get a badge, as supplies have been limited to raffles (or through, <em>ahem</em>, other means) since 2013.</li>
</ul>
<p>For those able to succeed in this kind of environment, you’re given access to the WWDC labs, where Apple’s engineers can sit down with you and your code and help you debug problems or point out the exact bugs. Many people consider this to be the “real value” of WWDC. A half hour with an Apple engineer can get critical bugs in iOS fixed, or can help you overcome issues in your app that you’ve struggled with for months. This year, the labs moved online to teleconferences by appointment for anyone with an active developer program. While still limited by slots, it means both more people can apply for those, and more Apple engineers can take part, since they aren’t limited by geography.</p>
<p>Since moving online, the sessions, keynote, and state of the union have been easy to get whether you’re an attendee or not. But this year, <strong>the sessions were better than they’ve ever been</strong>. No demos failed, no clickers were broken, no audiences were punctuating with applause or laughter every few minutes. Presenters spoke softly and slowly to a camera in an office, rather than projecting their voice over a conference hall while managing time and stage pressure. On top of better presentation, the videos were released in a batch each morning which eliminated schedule conflicts; no more competing for the 11 AM and 2 PM time slots. Everything was clearer and easier to understand, and a dozen little improvements like this made a huge difference to the experience.</p>
<p>The one thing we did lose was everything that usually happened around the conference. Live shows like <a href="https://twitter.com/imyke/status/1111311052241809408">Connected LIVE</a>, parties like the <a href="https://www.loopinsight.com/2019/05/22/the-loop-bash-at-wwdc-2019/">Loop Bash</a>, social gatherings like the Night of Dim Sum, parties hosted by tech companies who are recruiting or who want to show off their new framework, and the random interactions you get with other developers in line at the coffee shop, at the burger joint, or at the bar at night. There were Discord servers, Slack rooms, and Twitter threads to keep people connected, but serendipity is a tricky vibe to replicate.</p>
<p>But maybe this is okay. This onsite experience doesn’t scale, as the conference and city can only hold so many people. Perhaps this is an opportunity to <strong>diversify the local conference scene</strong>. There are a number of regional conferences happening all around the world covering iOS, Swift (client- and server-side), and design. A lot of tech companies limit conference attendance to one or two a year, which lots of people reserve for WWDC. By eliminating Apple’s local conference, more people would be able to attend smaller conferences, more companies would have budget to invest in them, and people who could never go to WWDC would have more access to more face-to-face networking. Lots of these are weekend events too, which could make attending easier than the week-long event we have now.</p>
<p>Even if we might want to believe WWDC is The Place where everyone in the scene goes, that just isn’t the case any more. The Apple developer community is massive, and WWDC was not designed for it. The days when we could fit everyone in a Presidio conference hall are long past us. Apple showed this year that an online WWDC is better than an onsite one, and that should be its future.</p>
<p>Finally, a huge round of applause is owed to the people at Apple who orchestrated this in the wake of COVID-19. Event planning is stressful and chaotic when everything is going well, so this must have been a doozy, but it sure didn’t look like it from the outside. Congratulations on pulling it off. 🎉</p>]]></description><link>https://sarahstreza.com/2020/06/29/wwdc-should-stay-online-only/</link><guid isPermaLink="false">https://sarahstreza.com/2020/06/29/wwdc-should-stay-online-only/</guid><pubDate>Mon, 29 Jun 2020 16:00:00 GMT</pubDate></item><item><title><![CDATA[Notice of PGP Key Change]]></title><description><![CDATA[<a href="/stevestreza.pub">Link</a> <p>This is a notice that I have created a new PGP key as of May 19, 2020. The
old key was not compromised, but all future PGP usage should rely on the new
key as of this date. The new key was created in a secure environment and
is trustworthy in all places where the old key was trusted previously.</p>
<!--more-->
<p>The new key:</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">pub   rsa4096/0xC4DC30F85ABC6FA1 2020-05-19 [expires: 2021-06-01]
      Key fingerprint = DFED 4E42 34E7 348C 57D4  6568 C4DC 30F8 5ABC 6FA1</code></pre></div>
<p>The old key:</p>
<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">pub   rsa4096/0x1C2B41FD1FA0B7E6 2016-01-07
      Key fingerprint = 5648 A161 7A0D 25D0 B713  CFC9 1C2B 41FD 1FA0 B7E6</code></pre></div>
<p>To fetch the full key from a public key server, you can do:</p>
<p><code class="language-text">gpg --keyserver keys.openpgp.org --recv-key 'DFED4E4234E7348C57D46568C4DC30F85ABC6FA1'</code></p>
<p>Or:</p>
<p><code class="language-text">gpg --locate-keys steve@stevestreza.com</code></p>
<p>My public key is available from the OpenPGP key server at keys.openpgp.org, the
SKS HKP Keyserver Pool at hkps.pool.sks-keyservers.net, my Keybase.io profile
at <a href="https://keybase.io/stevestreza">https://keybase.io/stevestreza</a>, and of course from my website at
<a href="https://stevestreza.com/stevestreza.pub">https://stevestreza.com/stevestreza.pub</a>.</p>
<p>This message has been <a href="/pgp/key-change-2020-05-19.txt.gpg">signed</a> by both my new and old keys for verification.</p>]]></description><link>https://sarahstreza.com/2020/05/19/notice-of-pgp-key-change/</link><guid isPermaLink="false">https://sarahstreza.com/2020/05/19/notice-of-pgp-key-change/</guid><pubDate>Tue, 19 May 2020 20:52:31 GMT</pubDate></item><item><title><![CDATA[Final Fantasy VII Remake is Looking Incredible]]></title><description><![CDATA[<p>I’ve been hoping for a remake of Final Fantasy VII since the mid-2000s. Since they made a movie out of it with <a href="https://en.wikipedia.org/wiki/Final_Fantasy_VII:_Advent_Children">Advent Children</a>, it seemed like a dream too good to ever come true to see its beautiful dieselpunk world revisited in video game form unencumbered by the technological limits of the PlayStation (and the Super Nintendo it was originally destined for).</p>
<p>When they announced it in 2015, I was ecstatic at how they were presenting it, but certainly had my concerns that they’d ever be able to really pull it off. Shifting away from its turn-based roots to something more action-oriented seem like a huge gamble, one that would require revisiting so many core assumptions about how the game played. The new tone being darker and more intimate would also recontextualize many of the original’s campier vibe. Final Fantasy as a single-player series wasn’t exactly faring well, with the XIII games not prioritizing gameplay as high as cinematic fidelity. And even if you got everything right, you still have to please fans of one of the highest rated games of all time by bringing this work to the present without sacrificing what made it great to begin with.</p>
<p>Time was also not kind to this project. About a year and a half after its announcement, with mostly silence from the producers, its development was effectively <a href="https://www.gematsu.com/2017/05/final-fantasy-vii-remake-development-shifts-external-cooperation-internal-focus">soft-rebooted</a>, citing quality concerns. While it was definitely a good idea to ensure the game was as good as we all wanted, it signaled the game would take even longer to emerge. In the meantime, Final Fantasy XV finally came out… in a sense. Being stuck in development hell for so long, it cut out a bunch of story pieces and moved them to CG movies and anime shows. Additional chapters would keep coming out to fill out the story, and are still being developed to this day. But the game was at least mostly well received, even if I thought it was pretty boring to play, much like the XIII series was for me.</p>
<p>So with all this stacked against it, Final Fantasy VII Remake finally emerged in 2019, three and a half years later, and… <a href="https://blog.us.playstation.com/2019/05/09/a-new-look-at-final-fantasy-vii-remake/">looked incredible</a>. More trailers would come out, people posted hands-on reports of playing it at conventions like PAX West, and it seemed like maybe this was going to work out. It did get delayed, but only by about 5 weeks, which usually indicates some last minute critical bugs slipping past a GM build date.</p>
<p>While the full game won’t be out for another month, yesterday they posted a <a href="https://store.playstation.com/en-us/product/UP0082-CUSA07237_00-FFVIIREMAKETRIAL">free demo</a> of the game. And so far, after running through the demo three times, it looks like <strong>they actually pulled it off</strong>.</p>
<p>They perfectly captured the ambiance of the world and scenes, while modernizing everything about the game itself. Visually, the world is stunning, enriched with detail in every corner. Movement is fluid and natural, and perfectly segues between action, battle, and cutscenes many times throughout. The soundtrack is on another level, reimagining classics from the original with new life. The characters bring soul and charm to the opening reactor attack, cutting through the super serious nature of what you’re doing (even if the writing was a little cheesy at times).</p>
<p>But the battle system is on another level from what I could’ve imagined. This is, in every way, a leap over anything Final Fantasy has ever tried. Each character gets their own fighting style, with special moves and modes to switch between. Cloud is either dancing around with a sword or getting up in the bad guy’s face to deal massive damage. Barret’s much more about long distance and taking out enemies at different vertical levels, which might be the first time we’ve seen that (outside of maybe Tactics). While in battle, you can switch from real-time to mostly paused to select abilities, but you can also set shortcuts mapped to the L1 button, which I believe is very similar to Kingdom Hearts. It also steals the Final Fantasy 13 staggering system to drive down an opponent’s ability to keep fighting.</p>
<p>Abilities are not the fire-and-forget spells of JRPGs past, but rather something that depends a lot on positioning, distance, and timing. If you’re 20 yards away from a bad guy, your skill is going to miss, but if you’re close and another enemy jumps in front of you, you’ll hit both. This helps break the monotony of RPGs where you quickly fall into a rhythm of knowing what your best spells are and spamming them until the battle is over. Each encounter requires situational awareness and competence with your party’s skills. Boring encounters is usually poison for an RPG for me, so this is an incredible thing to feel when playing the demo.</p>
<p>Overall, I’ve played the demo three times and had a blast each time through. There’s still a lot we don’t know about the game, including how other characters will play, how much of the story is covered, and how many episodes there will be or when they’ll be released. But so far, Final Fantasy VII Remake looks like it will be the new benchmark of the JRPG genre. The demo has incredible production and polish to it, and hopefully that carries through the full release. It’s been truly remade, and as a fan of this game since it came out, I cannot wait to play the full thing (in between sprints of Animal Crossing: New Horizons).</p>
<p>Your move, Persona 6.</p>]]></description><link>https://sarahstreza.com/2020/03/03/final-fantasy-7-remake</link><guid isPermaLink="false">https://sarahstreza.com/2020/03/03/final-fantasy-7-remake</guid><pubDate>Tue, 03 Mar 2020 08:23:54 GMT</pubDate></item><item><title><![CDATA[Graphaello: Declarative GraphQL Queries for SwiftUI]]></title><description><![CDATA[<a href="https://github.com/nerdsupremacist/Graphaello">Link</a> <p>This project uses Swift 5’s new <a href="https://nshipster.com/propertywrapper/">property wrappers</a> to dynamically define and run GraphQL queries based on a SwiftUI view, similar to Relay on the web. The result: Instead of writing API connectors and view models and all that, you just say that you want a property to map to a GraphQL field, and the library builds a query for you.</p>]]></description><link>https://sarahstreza.com/2020/02/29/graphaello/</link><guid isPermaLink="false">https://sarahstreza.com/2020/02/29/graphaello/</guid><pubDate>Sat, 29 Feb 2020 20:42:10 GMT</pubDate></item><item><title><![CDATA[The Paywalled Garden: iOS is Adware]]></title><description><![CDATA[<p>Over the years, Apple has built up a portfolio of services and add-ons that you pay for. Starting with AppleCare extended warranties and iCloud data subscriptions, they expanded to Apple Music a few years ago, only to dramatically ramp up their offerings last year with TV+, News+, Arcade, and Card. Their services business, taken as a whole, is quickly becoming massive; Apple reported <a href="https://www.macrumors.com/2020/01/28/apple-services-revenue-12-7-billion-q1-2020/">$12.7 billion in Q1 2020</a> alone, nearly a sixth of its already gigantic quarterly revenue.</p>
<p>All that money comes from the wallets of 480 million subscribers, and their goal is to grow that number to <a href="https://www.reuters.com/article/apple-results/apple-iphone-sales-return-to-growth-pushing-profits-above-expectations-idUSL1N29W11X">600 million</a> this year. But to do that, Apple has resorted to insidious tactics to get those people: ads. Lots and <em>lots</em> of ads, on devices that you pay for. iOS 13 has an abundance of ads from Apple marketing Apple services, from the moment you set it up and all throughout the experience. These ads cannot be hidden through the iOS content blocker extension system. Some can be dismissed or hidden, but most cannot, and are purposefully designed into core apps like Music and the App Store. There’s a term to describe software that has lots of unremovable ads: adware, which what iOS has sadly become.</p>
<p>If you don’t subscribe to these services, you’ll be forced to look at these ads constantly, either in the apps you use or the push notifications they have turned on by default. The pervasiveness of ads in iOS is a topic largely unexplored, perhaps due to these services having a lot of adoption among the early adopter crowd that tends to discuss Apple and their design. This isn’t a value call on the services themselves, but a look at how aggressively Apple pushes you to pay for them, and how that <a href="https://en.wikipedia.org/wiki/Growth_hacking">growth-hack</a>-style design comes at the expense of the user experience. In this post, I’ll break down all of the places in iOS that I’ve found that have Apple-manufactured ads. You can replicate these results yourself by doing a factory reset of an iPhone (backup first!), installing iOS 13, and signing up for a new iCloud account.</p>
<h1>Apple Music</h1>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/8e458e500bb83d1d8a41b174f1c047c7/62060/ios-adware-apple-music-1.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACxUlEQVR42m2RS08TUQCFb9+dPpkOdGb6bqntdFoYWvrS8qiFllJm2jQtRKCVWmrCW3loNLhBg0ZFCUoJDQthoUTUENwoKju3/gATf4UL115poiw8i8nNnXz3nJwDEARRKBQ8Hg8AwOfz4Zdlud7eRDh8gWG8TqeLcrq8tKdYLOj1BqPFbjLZTAR5jjDYCRJYrVaGYRCZXCyRIogMAB7HcZFIp9frgySGNeE4gePk842nb98dPlp/eWticZllniTc30b8QKlUwX/uZkdbs9NmtqobUI5LG41GsVgklUrlcjki/aOd6vbJpy/7O7urszNzXLgWd/0seUBTk5aiaI8/4PYH6BYG15LpdBrGQVEUx3G1Wi3k8yUoWh0c2p2Y2ntzUBwe8QfPr5Wyv/I6oNE0mg3mWSr0oK0nanOhWjyTTlssFiWMpFJBT9iCUCLZWr3/fv/1Vq3WE4t1xfsWh9jvJT9AMUyL4zZ5g1vZ2CRXAR4v1d8PYwuF0JJfL1IsElW3axubm4l4HFajkIgjw2X/yg7AZHK9qoEP/rWdTCahs0ajgbHhE/BGIBDs7e4eHR15PC0aDGtUK5lU3jK1AjQCsU6EaERShUD0F9br9fW26s4yGTI/v7BVfXZ7oXzj5vSPk48vHt5jk/0AMqhQIjizcyaT6ejocDqdNE3D/CRJwsPS4lKhMML1dZVy2YP1tVeP7+5czYGzqsODg4OVSiWbzeby+VwuB5crjo1NTk5Fo7Hu7oudnV3t7cFAMGzS6f4DQwCuBf1TqRQkuYEkm+geHy93xHq8oZDVQdldtJVy4QYTIAhSR+oInIDbYBgG5x0dLaRONVooFi7lIvnr1NxxafpOlHInvKFebzDhC8c8PtpoBeZTwYZIgtDp9YQavXJ5jGVZu93e0tra6nGbHW2+gcq18syhOfLZET9mBj7QfV8d8eXmwG++np+PbR2BUQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple music 1"
        title=""
        src="/static/8e458e500bb83d1d8a41b174f1c047c7/50383/ios-adware-apple-music-1.png"
        srcset="/static/8e458e500bb83d1d8a41b174f1c047c7/1d79a/ios-adware-apple-music-1.png 185w,
/static/8e458e500bb83d1d8a41b174f1c047c7/1efb2/ios-adware-apple-music-1.png 370w,
/static/8e458e500bb83d1d8a41b174f1c047c7/50383/ios-adware-apple-music-1.png 740w,
/static/8e458e500bb83d1d8a41b174f1c047c7/73caa/ios-adware-apple-music-1.png 1110w,
/static/8e458e500bb83d1d8a41b174f1c047c7/536c7/ios-adware-apple-music-1.png 1480w,
/static/8e458e500bb83d1d8a41b174f1c047c7/62060/ios-adware-apple-music-1.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>When you open the Music app for the first time, it shows you an empty library and a bit saying that you can get music from the iTunes Store. So you head over to the search tab (ignoring the “Search By Lyrics” ad for Apple Music), and search for an artist, and find that your library is empty, but that Apple Music search tab sure is full of lots of exciting stuff. You navigate down to the song you want to listen to, and you get greeted with a fullscreen popup ad for Apple Music, one which went out of its way to disable support for iOS 13’s new swipe-to-dismiss gesture.</p>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/81dd664400d831ae9b3123b1764ce21f/62060/ios-adware-apple-music-2.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACL0lEQVR42oWST4/SQBjGy5+wIHT505ZOZ6YtbbfSAgVcAllBjQQWCgISKGVh1URj5OBFE92DXjZGo8bEmBgTv4In734Nj1706LdwlnIgcaNPnjyZefv+5u00paLRKE3T1Fp+v5+kbduKotL0bjAY9OowybjOLJ8rIIhZhmMYDrA8YnkKIaRpmod52e/3K5WKLMs7OzuhUIhUDBYs3DkniVBVeSUjaEpaxAAialse3Ov1clZBkMSMvqdm9TSGSY49ns3vVVvP7KOn12cn7eWj5qJl1SnfWttwx7arZr4kSGVRKSJZ32VElnt4fPfn6sPv1edfi4/f3U8/Vl/eOSfnTG4ctp5crH3Tml8LHWKyeKxVBtPp8GpneK3bbbSu7Dfq5bplWGcMuVg4HCYZiUTIttvtMqkUWQR8vsD6uEQ8Ppu5hXL5UrVa2q8Y+bxuGOqeTgUCgXQ6raqaJMmiKJItgZPJpPcu3o3i8bjrzpvN1mh4s906LFolyypls+bmMUn/Wt7kv2EyuVgs12oHJE0zT6xp+qbDa/oHPJ06goAkKUMsywoxxtI5H2wb9nQGOw6AIhIVhDMIy8QYy/+BN5MTCWcygYmIzMYwExOZqMRcwDxDASBACAEA5CdNrTWZTEwzx/M8x3F0jGZZVlVk99b9hH3Kjd6i8Wt+9IoZv+cv36ZyAKuiBDESACCnkNblYlEoFXUWSAIEpAqAkdWP7jxItJ9zN17K4xdwcMoM3oCD5R/xiWSE8LtHXQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple music 2"
        title=""
        src="/static/81dd664400d831ae9b3123b1764ce21f/50383/ios-adware-apple-music-2.png"
        srcset="/static/81dd664400d831ae9b3123b1764ce21f/1d79a/ios-adware-apple-music-2.png 185w,
/static/81dd664400d831ae9b3123b1764ce21f/1efb2/ios-adware-apple-music-2.png 370w,
/static/81dd664400d831ae9b3123b1764ce21f/50383/ios-adware-apple-music-2.png 740w,
/static/81dd664400d831ae9b3123b1764ce21f/73caa/ios-adware-apple-music-2.png 1110w,
/static/81dd664400d831ae9b3123b1764ce21f/536c7/ios-adware-apple-music-2.png 1480w,
/static/81dd664400d831ae9b3123b1764ce21f/62060/ios-adware-apple-music-2.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>Leaving search, there are three other tabs at the bottom: For You, Browse, and Radio. The “For You” tab is a sneaky ad, offering to help you find new music based on your tastes. Tapping the big red button takes you to a signup screen for Apple Music. Nowhere on this screen was it stated to be a subscription feature.</p>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/61950cb0b70d02b2a5f5f89c189aa0b7/62060/ios-adware-apple-music-3.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADHUlEQVR42mNosYlaG9k1p3B+X/2mnIo9/qUHY1Ir5IWFmZmYWVhYONnZGRkYBAUEvXx8OHj5+ASF+ERFucVEJCWklGTkGVTFZQ0VtBTEFaXElcQlNTj45YPDogrSo2pLsswNDST5BEW5ebk4uepKy7NDIiP9gyLMnbL0XVy0jGfkVjDIScsoKMizsLIwMDAwMzMBSf+AwIm1KUv7ynV11BnAQJSL58icle+rlryZtO5j37qvm05dn7z6QfV8BglxcTUVVSUFWUV5WSV5WVEhAX8/Pz0ddXkZESFBfiDg4eWVERHZNmnx3YLlt/q3vDt648vdV7eWHTrg3sYwZ2LH2cM7D21aeGPnktPzmm5u7shPi5WWVeDjFxAVFRUXFxcRFePi5Fi3aP2e3p27Jmw6NG33gcl7FpQsXt2ynmHxtM4PD6+e37P+2r71e+c0b5xVV16QISkpLSMoLMAvIMDPLy8kJi0h1tc8Y3bjxo0LDqyYtW9K3/Y16y6t3HWboXfqgr33/h+69i40LlNQXk9BwygzNdFUT0dMWFhYRFREWISLnZOLi62zbW5P94Hath2NE3bsPv+6bM1Z/YkHGcLiMisnLs9tmKptZMXKL87EJRjg729tqM/Pz8cLBmxs7GxsTJ09i+r7doXnTZsyZ5NXSFxkw8y4RYcYeHn5JMTEBfj4WZhZ+bgFhHkFggL83R1tgP4EhjMjIzCaGfh4eRKTM8wt7BQV5OXllSRExYwNjSxMzRk4VAzEovO5bf3aiorPLZ56asfcxramMCdroMUgrRDNfHwREREuLi62tvbm5hZm5pZGxiZiYhIMnCb2sn3LueKLl03NvLk898j8nNb27gQXe2EhIaBmJiZQzAMjLCIy0srewcDUTEVdQ1VbR05NTUJGlkFRQ0fT00fV1sHJRj88wC3Mxzo/M8nJxVVFRUVCQkJQQABIqqiqxkZGuyhq+moa+umZuukau2ga6MopMSgqKCorKioA05m4lLSsrICAYEJ8rJuLvYKigpy4pKyYuJiYmIq6WlZU3DpFu51qLtv0PLdouh5SdalSNgUArzzmR7sW3BIAAAAASUVORK5CYII='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple music 3"
        title=""
        src="/static/61950cb0b70d02b2a5f5f89c189aa0b7/50383/ios-adware-apple-music-3.png"
        srcset="/static/61950cb0b70d02b2a5f5f89c189aa0b7/1d79a/ios-adware-apple-music-3.png 185w,
/static/61950cb0b70d02b2a5f5f89c189aa0b7/1efb2/ios-adware-apple-music-3.png 370w,
/static/61950cb0b70d02b2a5f5f89c189aa0b7/50383/ios-adware-apple-music-3.png 740w,
/static/61950cb0b70d02b2a5f5f89c189aa0b7/73caa/ios-adware-apple-music-3.png 1110w,
/static/61950cb0b70d02b2a5f5f89c189aa0b7/536c7/ios-adware-apple-music-3.png 1480w,
/static/61950cb0b70d02b2a5f5f89c189aa0b7/62060/ios-adware-apple-music-3.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>Under Browse, you find a whole selection of songs, artists, playlists, and other general curated music selections. Tapping into basically anything will take you to a fullscreen Apple Music ad.</p>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/e3315b9326829440acc9a8f4df04e6e7/62060/ios-adware-apple-music-4.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC9UlEQVR42mPg4uYGIgYwYGJiApL+Pr5BxsaawuKS4hKSkpJcXFzKykqRERH8/ILi4hKK8gqSklJiomJiImIMGoqKmvLyTEiaPT08YoPsNBRkhQWEhYSE2NnZpKWli4rLxMTElZRUNAyMZJWVlWUVVOWUGETEJWWU1AWllDgFRTkFhJg5efwDAqTlZbn5uJnZWZmY2IDGCYmIxiakSYhLSMnI5Ziadzv6ycrKS8rIMnjl92TPOeKUXJ7Utylz7sm8eUdqm9od1QyclAycNQxNTQS0NDlMdHSjIsLEJYBmSscZWYYa2ivIK8tIyzKkZXT01U/K9bStLutYteHGxCm7uxs7HoX2/gqZ8Txiwo3L9QcPNZw+dbCmJpaHh09fP1DeNFwiu1BWQVlaUpqhOaJsd+fyzVObZ5ZVnezaeKZ6zrTq+nuh/b+Cp7+OnbV62absnIq7dy82NibKysg7OifbuMXoOjrq6uoD/c8QaOioaxcnZ2BrYu4aaxSwyiO8OiVlmUfBFuucxY5ZXu5uQsLChYVZFRXJ0tKKWpoqZiaGhjp6amoaCgpKDAoiYnoiYuoiEixMLIyMjMDg8fDwEJeRADIYmRlZWFiBDH5+/uDgEHFxSSlpWXFxKQkJKSkpGWmgnxeZuf7rmfMip1aLkxcS2x6eXla2XsGeSaH+BSpK8mGhIS0NTclJCWJiEsBABiIZGTkIYlhp4/1/1c5PFZ26MM2+nh5uqf2xdXs7qtYbGhlnZ2ceOXUyJSVeTFRCXk4eGMhAJAvRXK9rscMlZLmFhwInDwPI1Qw+Xl66xjb8YnKSYuLcvHys7BxAtUGhoTxSkoKyMoKyskCSX1ZGBBjPnj72qmrKEtLSQiLC0pKSMjIyYeGh4WGu4iKCYuLifLy8ctLSSirKCWFRiYr66RqmmbpW6VoWWaom3oraDCaGupamBqoqKsAQUJGUFhcTi4qKNDDQA4UJEEhIKomKq2hp5EXFT5O3mKflNMfQfZae62JV+3xFIwCv9LdhS5XB9gAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple music 4"
        title=""
        src="/static/e3315b9326829440acc9a8f4df04e6e7/50383/ios-adware-apple-music-4.png"
        srcset="/static/e3315b9326829440acc9a8f4df04e6e7/1d79a/ios-adware-apple-music-4.png 185w,
/static/e3315b9326829440acc9a8f4df04e6e7/1efb2/ios-adware-apple-music-4.png 370w,
/static/e3315b9326829440acc9a8f4df04e6e7/50383/ios-adware-apple-music-4.png 740w,
/static/e3315b9326829440acc9a8f4df04e6e7/73caa/ios-adware-apple-music-4.png 1110w,
/static/e3315b9326829440acc9a8f4df04e6e7/536c7/ios-adware-apple-music-4.png 1480w,
/static/e3315b9326829440acc9a8f4df04e6e7/62060/ios-adware-apple-music-4.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>In Radio, we finally have something we can tap that doesn’t trigger an Apple Music ad! Beats 1 can be played seemingly without subscribing to Apple Music, and some of the older interviews are playable. I say “some”, because while tapping on that interview of A Boogie Wit Da Hoodie will play, tapping on the entry for A Boogie Wit Da Hoodie under the “In Case You Missed It” section will bring up another fullscreen ad.</p>
<p>As a bonus, it stops whatever you’re playing, as the audio player switches to the track you selected before the server tells it that it can’t be played without a subscription. I think this is a bug more than malice, but it highlights how the app is designed for the subscriber, not the person who doesn’t want Apple Music.</p>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/a80e2dfb0d1c72f82c6cdc83d43b0462/62060/ios-adware-apple-music-5.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACv0lEQVR42i2SW08TURDHt4stvdCz97bb7S5td7d7awtFRAsFC4KFIi29C72JIPpgjDFRiA/4wAOvvhiMGhWVGAzRxFfjNzAmJiYmxA/jUDyZnZzkZOb33/kPNsDwbkSRBMFxnNfrxXG8UChIkmS3O2w2G9Y7BEHUao1wOKooqiKrUVm15JgZUTGGpn0c6/Uij2cAgueDjcb1yanLsqw6XR4IR78rGBRarU48nrQSCSNuWcnEcHJoOJnCwoqpxEfD0ZgoiGJIMo14u90VRIlhfXpEMSKKP8BHZaXVauu6+fjW/ZdbT/ce7OcWKpqmYV5EkjRLEJSHYNwE6/C4ypUyNNcNayKdGb80ocYMuLeabU03Dnff/D06+XZwUm/cURUF8/sDgiAEAjxJMQhRSsa6eXtDHIxG/cITM7NjZlRekmPaWfH+o+fH737tHf6oVTdUVcEEUAsiGY5lOZZhESJrtbphWhRBEnYn7XT32XCKopvNFgjYevhq89Ofic+/JxubBpBhwgghh6Pf6XRChtkWC0WdF724He5nA0eIWG22Ld0o7rwtH/1cePF9rLJmqiqQQ+CBz+cHJhDgq9caEdrXh2E4DlS8ZxXZBNmavrt38P71l2fb95bz+ZhmnD4A3OVyO50uyOfsjlKpHKQ5N4bbbFD5n9xqtmRFXZzJr1wrlWcnx0ZSppnADMNSVS0UkkRxEEKSwgBByNvbDluvHn4NdTrdUqmyVCzmFvLTc/MzV+bAdmxwMCxHT82EsXOcP5Ua6Xa6BCJ6pbBvfWfk7o21xUqlvLqaW1oaHR9PpdNmcggbQCS89fcOKIetrDfqieQwHwwF+CBBUtAUBG+srS9fyFTT2Xr26sp0rp7OTiXPY7RPYLkAw4BTHGToUKlWrXiCZliQw/kDLEVrsnq3u/5Byx5bc0cXCx+H5r/qs9vxzD8VPonAAafc7AAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple music 5"
        title=""
        src="/static/a80e2dfb0d1c72f82c6cdc83d43b0462/50383/ios-adware-apple-music-5.png"
        srcset="/static/a80e2dfb0d1c72f82c6cdc83d43b0462/1d79a/ios-adware-apple-music-5.png 185w,
/static/a80e2dfb0d1c72f82c6cdc83d43b0462/1efb2/ios-adware-apple-music-5.png 370w,
/static/a80e2dfb0d1c72f82c6cdc83d43b0462/50383/ios-adware-apple-music-5.png 740w,
/static/a80e2dfb0d1c72f82c6cdc83d43b0462/73caa/ios-adware-apple-music-5.png 1110w,
/static/a80e2dfb0d1c72f82c6cdc83d43b0462/536c7/ios-adware-apple-music-5.png 1480w,
/static/a80e2dfb0d1c72f82c6cdc83d43b0462/62060/ios-adware-apple-music-5.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>So Browse and For Now are entirely Apple Music ads. Radio has some free content but that largely exists to pull people into Apple Music, and Search will happily pull you in to Apple Music if you tap the button. Almost this entire app serves to be an ad for Apple Music. There <em>is</em> a setting in the Settings app to hide Apple Music (next to an ad for Apple Music, of course), but that only does so much.</p>
<p>The Browse and For Now tabs are hidden, and some of the Apple Music-exclusive stuff in Radio is hidden. But every radio station except for Beats 1 is still present, all which trigger an Apple Music ad. After you quit and restart the Music app, the search bar changes the “Apple Music” search results to “Radio”, but the autocomplete largely populates from Apple Music, and some of the search results can return playlists that take you to Apple Music. It helps, but ads are still there to be stumbled into.</p>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/47bad7039fc440bd8336d7aa74a2b3f7/08688/ios-adware-apple-music-notifications.jpg"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 50.27027027027027%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMCBP/EABYBAQEBAAAAAAAAAAAAAAAAAAADBP/aAAwDAQACEAMQAAABa5GmFUh//8QAGRAAAgMBAAAAAAAAAAAAAAAAAQIAAxEQ/9oACAEBAAEFAgEmVxgu9//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABcQAAMBAAAAAAAAAAAAAAAAABAgIeH/2gAIAQEABj8C0RP/xAAcEAABAwUAAAAAAAAAAAAAAAAhAAERIFFhcaH/2gAIAQEAAT8hgtNimfqalG6P/9oADAMBAAIAAwAAABAPL//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/EKf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPxCH/8QAGxAAAgIDAQAAAAAAAAAAAAAAAREAISBBYXH/2gAIAQEAAT8QJOjT03OORIBKWmvD/9k='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple music notifications"
        title=""
        src="/static/47bad7039fc440bd8336d7aa74a2b3f7/07f3a/ios-adware-apple-music-notifications.jpg"
        srcset="/static/47bad7039fc440bd8336d7aa74a2b3f7/d7fe6/ios-adware-apple-music-notifications.jpg 185w,
/static/47bad7039fc440bd8336d7aa74a2b3f7/f4308/ios-adware-apple-music-notifications.jpg 370w,
/static/47bad7039fc440bd8336d7aa74a2b3f7/07f3a/ios-adware-apple-music-notifications.jpg 740w,
/static/47bad7039fc440bd8336d7aa74a2b3f7/58406/ios-adware-apple-music-notifications.jpg 1110w,
/static/47bad7039fc440bd8336d7aa74a2b3f7/be922/ios-adware-apple-music-notifications.jpg 1480w,
/static/47bad7039fc440bd8336d7aa74a2b3f7/08688/ios-adware-apple-music-notifications.jpg 2500w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>If you subscribe and then cancel, Apple sends <a href="https://9to5mac.com/2019/02/09/apple-music-free-trial-push-notifications/">invasive push notifications</a> asking you to re-susbscribe. These are on by default without a permission request. This is, of course, against the rules they lay out for other developers.</p>
<blockquote>
<p>Push Notifications must not be required for the app to function, and should not be used for advertising, promotions, or direct marketing purposes or to send sensitive personal or confidential information.</p>
</blockquote>
<h1>Apple TV+</h1>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/ca6ce653b878cf7108b794f4c27d9503/62060/ios-adware-apple-tv.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC9klEQVR42mNgQAVMTEzJycmioqIcHBw8PDyMjIxAQT5xqcjICE8n+7TIgIhAn9AA35TEeBMjI5AGISEhc3NzIyMjoB4gNykpycrK2sDA0MLSSkREVEhETMPMNiAwyFBB9ODSprUtaas7K2f1NYd62oE0s7Cw6OrqamhocHNzA7lAmzU1NYWFhCUkJISFRXh5+QQEhWvKCmqzot7cOXF0buuy2swXN45vW9THAFQB1MbCwsrMzMzKCiJTU1PVNbUTU1JcPbw4uHhKy0pnL1m+bv6Ew/Nqt61emBURUhniOL27+fy2aQwiIiJKSkr8/Px8fPwcHJxAV6Snp9s5ugSGRWTmFRroGp0+fer////bl8yYXhHramvOxMwlJCDMxMpbEGnHAAwSXl5eoG+BPufk5ATanJ2d7eLsZmpiZmRopKamkZqW3tDUtm35TC8Hc2ExWWlpBWFhSWExSXNNBQYuLi6gy4Ek0M3sbGxAPzdUVZQVFXdUFk9vrzQ11ZRVUouJS5vSUpnvqetmrKktIyXDxemuwpdkIgmKG2A48fDwcrCzA9lAh+Tk5lk7OIbExMQlRRqb6RpY2ITHJJQWFbpUtNm3zpVLb5fP6FArmmjhHQiNXkYmZiZmFkisNnT2OPvb27oZZMVGJMUnrJ454eqGeTNmTJcMSNfJ7TLI7dTLaVfJ61Ny8GEAauJiZ+PmF+ThF+LiADm7bcJkj7B4JQOzqoK8zKiIRV01H87v7u9oMVORcjLUstDRsNHTtNJW1VCUY2BiYeUSFOEWleQSleISEgVGV2Fpuba2vqKMUpint5+Do42qYkpoUEZ6hqiEpIy8goCQiKCwmJCIuJiICAOHha9IzwG59i3KHVtEeg/whhQlRYSI+6YKZk2Wy+xVzJnAnzlZyjPRy9VVQddUSUNfXUlWT1VGSkKIR0SSgZGVnYlXgIWHn5WHnwmIOHkyUpKU3MMFHEMVXILlXUKFrX017T1jIsNt3D38PFxi/V2SAp28HM3NbJ0AESS62IPTlK8AAAAASUVORK5CYII='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple tv"
        title=""
        src="/static/ca6ce653b878cf7108b794f4c27d9503/50383/ios-adware-apple-tv.png"
        srcset="/static/ca6ce653b878cf7108b794f4c27d9503/1d79a/ios-adware-apple-tv.png 185w,
/static/ca6ce653b878cf7108b794f4c27d9503/1efb2/ios-adware-apple-tv.png 370w,
/static/ca6ce653b878cf7108b794f4c27d9503/50383/ios-adware-apple-tv.png 740w,
/static/ca6ce653b878cf7108b794f4c27d9503/73caa/ios-adware-apple-tv.png 1110w,
/static/ca6ce653b878cf7108b794f4c27d9503/536c7/ios-adware-apple-tv.png 1480w,
/static/ca6ce653b878cf7108b794f4c27d9503/62060/ios-adware-apple-tv.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>The TV app opens with Apple’s standard summary screen, leading with an ad talking about Apple TV+. The home screen is chock full of TV+ ads and ads for shows on TV+. If you have existing iTunes Store shows, or streaming apps like Netflix or Crunchyroll setup, you might see shows you’re watching under the “Up Next” section. But no matter what you have, the Apple TV+ ads are huge and inescapable. Again, the TV app’s notifications is enabled by default with no permission request.</p>
<h1>Apple News+</h1>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/9b16c8af81760743b9cc5a057683a135/62060/ios-adware-apple-news.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADJElEQVR42gEZA+b8ACEaHTMrKD45KkE6MDQyJC4pG3FwcUBBQiopLQwLDAAAAAAAARMTFHJxcV5bW2RlZYCAgHh4eF5eXl5ZWgBKS1FEPUBpXUdfVUdKUDRNVjmIgoFfUU08QDcxMypLTUtPUE87Ozzb2tvr7OzJycnV1dXKysrKysr7/PwAMjEzP0FDV2FkUV1fPUBFNDM5gYKBa3ZIkqFQdYtDREs/h4iL2Nva8fLzwL+/kJCRmJiYoqKikJCQ4+PjACkrLTcxNHQ+SntCTkQyNyksLYWEhnh7a2ZvQXNrU6JvbH5ydIyEgtTKxt7g4LCwsIWFhaOjo9HR0dvb2wA7Oz1LO0B8P0yAQE5VOkE9PkCBgIE1NDkqKTOJfHuUeWk0LjEvIB3Etq/W2NnGxcW7u7u8vLzQ0NDQ0NAA6urq7e3t4Orp4+zr6Orq////xsfHNjY4RUhIVmFhSFRWQURFPT9DqKqsyMfHtLS0rq+vsLCwvb29w8PDAN/h4NfZ2eDh4eTl5d3e3v7//8vKyzQ1N1ZNUHFGUHRKU1RLTjs8PaemprGtrqWhn6eloqWjoKKfnLCvrgDt7u7h4+Pv8PD4+Pj29vb////HxsckJig0JClvLjxuLjw1JSoqLS+goJ9/gWp3d293aWKAeHCZl5Glo6EA6Ofl7u3s6+vr7+/w4uLg7O3swMDAFhYXEBITChQTBhEQFxgYHR0ei4uKR00qOUAgQC4kTUE3V1lSfHx5AHd3b3RybYqGfnx5cHFpX4J8dbq6ug0KAg4LBBINBR4aDQEBAA0NDltbXDIyNT9DQF5mZEdOTTY3Ny8wMQCarqR5iH+JkYh6gXNwZVt6cWu3ubiFhYSko6Obm5p1dHKVlZWJiYldXF0tLzFSRkt6YGdoUlg8Oz0tLjAAmKSfUWJbhpeMfn95MjEwQEFEvb29xcXG8/Pz19XVmJaW3+Df0NDPYWBhIScoTys0hC0/dy09LyotKywtADYwMSgnJyosKiclJB0eHiwnKIKAgTg4OSosKyggISUcHiIjIz49PWNkZC8vMC0zMycxMSgxMTUyNDUyNAzhYqKZ0YCoAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple news"
        title=""
        src="/static/9b16c8af81760743b9cc5a057683a135/50383/ios-adware-apple-news.png"
        srcset="/static/9b16c8af81760743b9cc5a057683a135/1d79a/ios-adware-apple-news.png 185w,
/static/9b16c8af81760743b9cc5a057683a135/1efb2/ios-adware-apple-news.png 370w,
/static/9b16c8af81760743b9cc5a057683a135/50383/ios-adware-apple-news.png 740w,
/static/9b16c8af81760743b9cc5a057683a135/73caa/ios-adware-apple-news.png 1110w,
/static/9b16c8af81760743b9cc5a057683a135/536c7/ios-adware-apple-news.png 1480w,
/static/9b16c8af81760743b9cc5a057683a135/62060/ios-adware-apple-news.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>Another app that has its notifications turned on by default, this is how many people will interact with this service. Tapping notifications doesn’t take you to a web browser, but directly into the News app. If you open a story on one of Apple’s partners like the Wall Street Journal, the screen it takes you often has a large banner ad at the top of the screen for the Apple News+ service. This seems to be intermittent, but it cannot be dismissed, hidden, or disabled.</p>
<p>If you look through the News app itself, you will see a plethora of stories in the Today feed. Some of these will trigger the same ad shown above; there is no indication on the feed itself. Some will actually have a full paywall in front of them preventing access without signing up; these do have a tiny Apple News+ logo beneath them, but it’s far enough below that it almost looks like it belongs to the next section.</p>
<p>And of course, in the dead center of the tab bar, is the News+ tab. Leading off with a large ad at the top of the feed, it lists stories and publications similar to the Today feed. Most of these stories are paywalled, but not all, so people may end up going there and hunting for stories they can read. This tab cannot be hidden, ever.</p>
<h1>Apple Card</h1>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/d346cdc725523d4b04f668ec1a19bd8a/62060/ios-adware-apple-card.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 67.02702702702703%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACw0lEQVR42mNoCnWrTQ3anNMxLSi+JSQixykqPyhBXFqSjYWVgYGBkZERSMrJyYZGxAhJyMnLK6qqqSurqElKyYhLSDP0WNs0urus9s+Ybh/W6RCUquJSFpJc1VBbVFCYkJCQmJiYkZHR2tqSnJIiLatgYmru5Ozi4OisrqGloKjMMMOtvMGvdpJj4NSIpGlxSbFh3TWxBXcf3fv65cuHT5++ffv+////r1+/FOTnSUrJKiopS0nLysjKyysoycopMMyxD1tkE7rI2Hyill2HtlObfWJ7RPqDF0/fPf7w8uqV8yf2v3n77uOH950dHW7uPkAHq6lrArUBnS0tI8fQl139sKHvw8SGVAn5dDmtLx2zJkemXn/04MOLf2/OLr+8u2PSlCknT52c3N0d4Gapqq6ppa0LdDDEfgYvQ7lrfi4TnPO2a0UuU/Ev55ebFBwP1Hzy5PHZ82YuWDD3/LlzL58/z8vNFREVl5NXBFoLtBOCGFxMpc7EenQmTbgRUnrIIquSX2KKX3Tn5Emb12949vQZ0MN///558+plbk62kLAYsk6QZg9X98VRib+rM/a7mO50M97h6LM2PvH2ixdAbX/AABJgeUDNIhiavTy9fIMCUyKdNtp67Ld1OObnuiMrvm/23AVz5y1cuGjZsqWr121ZsWpdSnKSiJgE0J8omoFAmZnVk1FmoajrSwn372IaWyNj5PX1pMTFucCAhYVZQkI8ODhUQlIaXXMnu/oFofgzUlnrRWIWCfqvZLdtCIyWVVWWFBdXUlJSUVYREhaWk5MLCQkFJimgZgiCap7qlFTqXVri3NfkmzXFN369e2VbcJ6wjLiSgqI8CCioKakryisGBQUDbQbGEJAEIqhm37gUj7yUjPi1yTnZBfmZ+xoXTY3Ll1VTlpORlZMFWimnKKusp2UAtllKUUlFW0dXQ1MLohkA/OURgS4sLNMAAAAASUVORK5CYII='); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple card"
        title=""
        src="/static/d346cdc725523d4b04f668ec1a19bd8a/50383/ios-adware-apple-card.png"
        srcset="/static/d346cdc725523d4b04f668ec1a19bd8a/1d79a/ios-adware-apple-card.png 185w,
/static/d346cdc725523d4b04f668ec1a19bd8a/1efb2/ios-adware-apple-card.png 370w,
/static/d346cdc725523d4b04f668ec1a19bd8a/50383/ios-adware-apple-card.png 740w,
/static/d346cdc725523d4b04f668ec1a19bd8a/73caa/ios-adware-apple-card.png 1110w,
/static/d346cdc725523d4b04f668ec1a19bd8a/536c7/ios-adware-apple-card.png 1480w,
/static/d346cdc725523d4b04f668ec1a19bd8a/62060/ios-adware-apple-card.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>After you set up your iPhone, you get a home screen with at least one badged icon, on Wallet. Opening this takes you to a giant ad that’s nearly half the screen for Apple Card. Fortunately it is dismissable. But every time you try to add a credit/debit card to Apple Pay, you are asked if you want to sign up for Apple Card instead.</p>
<h1>Apple Arcade</h1>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/910d649bbababbb6eb85dc2ce920cf72/62060/ios-adware-apple-arcade.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADJElEQVR42gEZA+b8AEZ72H1tYZR2WZd1WZdzaYx7go2GmkEeTT4XRUASPz0OQTgGOjkhYKm5ycDw5YLIvnTGt3PCsLjj3L3p4wBgYWl0Vzp1ZE6gfWSgd3WsXVOUfpFZH1hlGlNvGlqDRW92SXVhQ5C/zdyRwrsue3EGn48AkIZbuqu56NcAbVZDLygqPztCg2RSnXNulHBTpISKfS50gkJ9sjJ5mz2AlHuhsWygk7fBFaWXBJaNAp+UAKCVB52KU7GeAH1mV4BgUrV+XqmMc5acg9C2gNCnpKI4gZM+edRGialqjH1lepE7emyRpQChkBujlDKdigCdkgGhlQiCfQDBkV/alWDwp2SNiqutnZ3/tVviopmnSItiUm+DUXhrWHNcSWJhL1xcj50ApZVLk4dcl4YBnZIBnpICn5IA4aJkyoRbz5N93ad/6616+rFjvZCAQBxNTjNTTzNXTiRQRRpIRAo9U4+XAKSVFZqPE5iOA56RAJ6SAZ6SAKlsQdqYZd2ja+6wZ/GsZO2qZbWPei4UPFA0UlE3V1Q7XFQ8XEIPOVCQlQCmlwKflASimAWfkwGglAGhlQC/e0LRlVd9hZBcgr6piHbRkEurhHQlHFYUWrsjZMEkZcITW748G1dWiY4AmYwmn5Slua1csKoAmIwEjoMAc1o/eFc0cmZ0SW27ZU9Gc1QwhG9wLAw4IQs8KRFCLBJEJgtCQQ1BWHN8AFtSHW9obqWbRo+JBV1XDGFaAHBUOG9OLn1VNIhmQ3lYM3NTMH9wZBkZHRUODhkSExgREhINDhQOFElxbgZfWBlmYBNtZhVoYhBfWgdcVgB0US6FZEWqlYCtmYKghmt+WDKDc2MrLzAbGxoXGRgNDgwFCQkUExdOeHUBXldMjIdfmJdim5gnc2wCWlQAck4riWlMqJiIoZiMm4h0elYxgXBhODk9FRQUEhISDQ0NAwkOIR8kWX58AVhSUomFaJmcZ5iaKW9rA1ZQACUiHyEdGhkTDB0XERcZHBsaGGJeXEQ0MCIdHBoaGhUXGQ8XICwtLVpdXRkfIA0YFwsWEwUVFw4dIxogHvKVLklfcnx0AAAAAElFTkSuQmCC'); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware apple arcade"
        title=""
        src="/static/910d649bbababbb6eb85dc2ce920cf72/50383/ios-adware-apple-arcade.png"
        srcset="/static/910d649bbababbb6eb85dc2ce920cf72/1d79a/ios-adware-apple-arcade.png 185w,
/static/910d649bbababbb6eb85dc2ce920cf72/1efb2/ios-adware-apple-arcade.png 370w,
/static/910d649bbababbb6eb85dc2ce920cf72/50383/ios-adware-apple-arcade.png 740w,
/static/910d649bbababbb6eb85dc2ce920cf72/73caa/ios-adware-apple-arcade.png 1110w,
/static/910d649bbababbb6eb85dc2ce920cf72/536c7/ios-adware-apple-arcade.png 1480w,
/static/910d649bbababbb6eb85dc2ce920cf72/62060/ios-adware-apple-arcade.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>The first three tabs of the App Store app are Apps, Games, and Today. These tabs don’t have much in the way of ads, aside from some Apple Arcade games that might appear in Games and Today. However, Apple Arcade gets an entire tab all to itself, which has a huge in-feed ad for the service, and of course a whole pile of games advertising it. Compared to other games and apps, Apple Arcade games get more prominent visual treatment, larger videos, and bigger download buttons. This tab, like News+, cannot be turned off.</p>
<h1>App Store Search</h1>
<p><span
      class="gatsby-resp-image-wrapper"
      style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 740px; "
    >
      <a
    class="gatsby-resp-image-link"
    href="/static/af652f81c8df62e1642f409e209ccf83/62060/ios-adware-app-store-search.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
    <span
    class="gatsby-resp-image-background-image"
    style="padding-bottom: 65.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADJElEQVR42gEZA+b8ACMqMDE0OS8wMygqLSosLxUaIFhaXjo7QCcoLCcpLSkqLiQmKikuNFlcXykuNjAwNCUmKicnLCUnLBgeJAAxfZk9aX4/PEQyOEMwMzwkKDJnanBYWlVARk88QEs5PUcrMDowNT92gI1Xe502QlErLjclLDYgKDAmLTgAFzZTEjNWGy9NO0pfHjJOCSJFYWl2SWR1N1dtO1ZqPlhsLUphO1hweoB9max/dYNvc3aFbmh0hpCAYWdfAD5MYlBjeUBPY4+UliQ+XU1jfV5od52osYuYo5Wgpp2orGd2hHiElYCKerzLVJuZXrLA4qSusbezg3p7awBbaHl1g5VjanB5f4IiOlLd3d11fIbQ0tTExsq5vsK9w8e0ubzT1tlzfHiTmUeTnmDJ3+2bt6OQkVtzfVwATFxxYXOPM0lbOlFlFC1Fys/Si5GYv8TKtb/Hr6yxs7C2q7a8xMvTfoJ8roJXmYVdz7emmYp5sJBzgXZXABwmLiszOAkUHgsXIhIcJiMqMF1gZkZQWi46QykkKSslLDtDSktTWmhjZHMvJlsnIlooHU0mHmEuJkQkJQALCQoJBQUFAAADAAAFAgIAAABJSkw5T2gMDhEEAwIAAAAAAAANDA5dZ2tLdIYHFBgEBggAAAAAAgUAAwgACkpoD3CgDWiVFWuREmyXBGCMS11mU2iDQVp3RVx2Rlx3Qlp0UGaEVlpQW28/S1Q4UVhBREM1Sk5OPjw+ACqBm0DF7C604jiUhkGhkzWz2lRtdsfM17/N3S04Rig0QrfE1MvW5VRZVHd2W293ZXGlrWh2dIOAjFdbXgA7b3JerLCFqZK5sGiBro5HlZ1ZaGrU0tPS1toVGBwNDxPIztLh5OlYXVVnclhUW1xUcHVZdnSOjX5NVU4AFlxqL5Khb52JlbOKXZ+WE3iPUGRoyMnNusLJDhMZChAWt73DzNDZYmxYlcBXgaFVcHpdXGhIhIqOUVZVACAgIB4iJQ0bJQkZKBMdJRAYHldaXDk6OyQmKBgZGhkaGyYnJzI3PVpcXCYsHicsHyYoIyIkHyMmKBshJEBhHZfN8UXuAAAAAElFTkSuQmCC'); background-size: cover; display: block;"
  ></span>
  <img
        class="gatsby-resp-image-image"
        alt="ios adware app store search"
        title=""
        src="/static/af652f81c8df62e1642f409e209ccf83/50383/ios-adware-app-store-search.png"
        srcset="/static/af652f81c8df62e1642f409e209ccf83/1d79a/ios-adware-app-store-search.png 185w,
/static/af652f81c8df62e1642f409e209ccf83/1efb2/ios-adware-app-store-search.png 370w,
/static/af652f81c8df62e1642f409e209ccf83/50383/ios-adware-app-store-search.png 740w,
/static/af652f81c8df62e1642f409e209ccf83/73caa/ios-adware-app-store-search.png 1110w,
/static/af652f81c8df62e1642f409e209ccf83/536c7/ios-adware-app-store-search.png 1480w,
/static/af652f81c8df62e1642f409e209ccf83/62060/ios-adware-app-store-search.png 3846w"
        sizes="(max-width: 740px) 100vw, 740px"
        style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"
        loading="lazy"
        decoding="async"
      />
  </a>
    </span></p>
<p>And of course, almost anything you search for in the App Store has a large ad at the top of your search results. This isn’t an ad for an Apple-run service, but it is a way they make money by extorting developers and showing you the wrong thing. If you search for a specific app, you will often not see that app in the first slot, unless the developer has paid for the privilege.</p>
<h1>Conclusion</h1>
<p>Apple wants to grow their services business with drastic increases year-over-year. This means they are going to aggressively push more services into more places (including deeper into macOS and tvOS, which are also slowly having adware trickled into them). Apple TV+, News+, Arcade, and Card are all new this year, and are already strongly advertised in iOS. Apple Music has existed for a few years, and its level of advertising in the app is pervasive. As time goes on, these ads are going to get worse, not better.</p>
<p>Of course, Apple has a right to tell users about their services, and try to convince you to subscribe to them. And you might disagree with my assessment that some of these are ads at all. Individually, most of these instances aren’t insidious by themselves. But when you look at them together, they paint a picture of how Apple is making the user experience provably worse to boost growth at all costs.</p>
<p>This issue is not going to get better. Apple is going to expand its services, both breadth and depth, and the adware problem is only going to get worse, unless people call out Apple for what they’re doing. And yet, this issue is rarely talked about, likely because many of the people who cover Apple inevitably subscribe to some or all of these services. Gadgets like smart TVs and ebook readers are frequently criticized for their annoying, invasive advertisements despite their (often large) upfront price. It’s time for the tech community to recognize that Apple is no longer designing their products for a great experience, but as upsells to get you into the paywalled garden.</p>]]></description><link>https://sarahstreza.com/2020/02/17/ios-adware/</link><guid isPermaLink="false">https://sarahstreza.com/2020/02/17/ios-adware/</guid><pubDate>Mon, 17 Feb 2020 16:00:00 GMT</pubDate></item><item><title><![CDATA[My First FPGA Experiments]]></title><description><![CDATA[<p>One of my earliest memories of awe when learning how to program computers as a kid was wondering how the computer takes bits in the CPU and turns them into an image on a screen. When you don’t know how most of the system works, it’s easy to conclude that it is basically magic, and that the knowledge was arcane to the point of being inaccessible without tons of background in engineering and science.</p>
<p>As I grew up, this question never really left my mind, and really grew into the more abstract question of how a computer works at every level. Once you get into the high level of software and languages like C and Swift, you can abstract away a lot of the questions into programming language theory and ignore things like transistors and voltage. But peeling back the curtain to reveal what is going on in the circuitry lies a world that is both simple in its principles and ever complex in the myriad of tricks used to keep this wrangled chaos ticking in utter precision.</p>
<p>I started watching Ben Eater’s <a href="https://www.youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU">incredible YouTube series</a> on building a computer on breadboards a couple years ago. I’ve watched the whole thing end-to-end multiple times, and have built (or tried) a couple of the modules, including the clock and the ALU. I went from knowing very little about electronics to having a fairly broad understanding of how circuits work, at least in theory.</p>
<p>On the other side, I’ve tried writing video game console emulators, notably a Game Boy emulator in Swift which works well enough to understand how a higher level system works with all its pieces put together. The emulator is largely unusable (hence why it doesn’t exist in an open source form) but it can run the start of a couple games, generate some graphics and sound, and process user input. Over the years I’d heard about things like Verilog and VHDL being used to define hardware in code. And in the last year or two I’ve gained an understanding of what FPGAs are (especially thanks to the <a href="https://github.com/MiSTer-devel/Main_MiSTer/wiki">MiSTer project</a> and its focus on cycle-accurate emulation).</p>
<aside>For those unfamiliar with them, an FPGA is a piece of hardware that you can program to behave like a custom piece of silicon. FPGA stands for field-programmable (something you can develop on and write to) gate (like AND/OR/XOR/NOT/etc) array (pile of things running in parallel). This means you can set up a circuit like you would on a breadboard or PCB, but with a hardware description language rather than with chips and wires. The benefits of an FPGA over a microcontroller are that you have an astounding amount of parallel execution and access to tons of I/O lines at fast speeds. But that's not without downsides, namely a drastic increase in complexity and cost, which can definitely be outweighed depending on the application.</aside>
<p>So in my ever expanding pursuit to learn how each piece of the computer works, I’ve picked up an FPGA development board, the <a href="https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&#x26;No=1046">DE10-Nano</a>, and have begun using the <a href="https://www.intel.com/content/www/us/en/software/programmable/quartus-prime/overview.html">Intel Quartus</a> software to learn how to program it using Verilog. So far, I’ve gotten a couple small and ultra-basic projects working, namely getting an LED to blink based on an internal 50MHz clock and a clock divider, and a basic unclocked two-bit <a href="https://en.wikipedia.org/wiki/Adder_(electronics)">adder</a>. As I continue going down this route, I have a number of project ideas I want to try, including:</p>
<ul>
<li>emulating Ben Eater’s breadboard computer</li>
<li>a video generator that outputs something to HDMI</li>
<li>an analog to HDMI video converter and scaler, akin to the <a href="https://videogameperfection.com/products/open-source-scan-converter/">OSSC</a></li>
<li>an HDMI to analog video converter, so I can play PC games like Undertale on my old CRT TV</li>
<li>a Dreamcast VMU clone</li>
<li>a basic graphics card</li>
<li>a <a href="https://riscv.org/">RISC-V</a> CPU</li>
<li>some kind of module for my modular synthesizer</li>
</ul>
<p>Will I be successful at actually building any of these? Who knows! But in the end, I’ll get a few steps closer to understanding how computers truly work at the silicon and chip level. And the journey is definitely more valuable than the destination.</p>]]></description><link>https://sarahstreza.com/2020/02/05/my-first-fpga-experiments/</link><guid isPermaLink="false">https://sarahstreza.com/2020/02/05/my-first-fpga-experiments/</guid><pubDate>Thu, 06 Feb 2020 05:04:27 GMT</pubDate></item><item><title><![CDATA[Microsoft Flight Simulator 2020 In-Depth Preview]]></title><description><![CDATA[<iframe src="//www.youtube.com/embed/MOPIjzzH1G8" /> <a href="https://www.youtube.com/watch?v=MOPIjzzH1G8">Video</a> <p>I’ve never been able to get into a flight simulator before, but I really want to check this one out. This is a fantastic in-depth look at it. Make sure to crank the resolution all the way up.</p>]]></description><link>https://sarahstreza.com/2019/10/09/microsoft-flight-simulator-2020-in-depth-preview/</link><guid isPermaLink="false">https://sarahstreza.com/2019/10/09/microsoft-flight-simulator-2020-in-depth-preview/</guid><pubDate>Wed, 09 Oct 2019 19:37:46 GMT</pubDate></item><item><title><![CDATA[Campaign Diary: Setting Off]]></title><description><![CDATA[<p>The party set off from Neverwinter with the supplies en route to Phandalin. They came across two dead horses in a choke point on the road. Hagnar went to briefly investigate, then returned to the cart, only to be ambushed by two goblins with one more sniping with arrows from the trees. Tarot charmed one, while Thunder cleaved the arm off another, leaving the third to run away as Hagnar sniped it in the back.</p>
<p>Thunder discovered that the horses belonged to Gundren and Sildar, and convinced the goblin Grok to bring them to where they were taken. While distractedly talking to Tarot, Grok failed to point out one of the traps, nearly causing Hagnar to fall into a pit. They arrived at the mouth of a cave, where Grok turned tail and fled.</p>
<p>Peering into the cave, the party noticed it was dark, so Azunyan lit Thunder’s axe bright pink with sparkles. This caught the attention of two goblin guards, who shot arrows at the party from a bunch of nearby thickets, hitting Hagnar. The party took shots at the two goblins, with Tarot slicing one’s throat and the other getting hit with a firebolt from Azunyan and a cleave from Thunder.</p>
<p>Heading into the cave, the group sees three wolves, and tries to tame them. Azunyan puts one briefly to sleep, and goes to calm the others, but one is only made angrier, which leads Thunder to quickly kill it. This drives the other into a rage, and the party decides this is more trouble than it’s worth, and heads deeper into the cave.</p>
<p>After a little while, they see a goblin keeping watch who notices the party and begins running off to alert the rest of the goblins. Thunder whips an axe at him and kills him instantly, knocking him into the river below. They decide to try to climb up a rocky embankment but it collapses, knocking Thunder unconscious as he falls into the river. Tarot tries to pull him out but gets dragged in as well. Hagnar and Azunyan pull him out with rope and they spend a couple hours helping him recover.</p>
<p>They head back into the cave, seeing the wolves, and the now conscious Thunder antagonizes the wolves with a face, which stirs the wolves into a frenzy, causing one to yank loose its chain. The party coerces it out of sight and kills it with a fire bolt from Azunyan and a scimitar shot from Hagnar. Azunyan then calms the other wolf, now all alone, and forms a solid bond with it.</p>]]></description><link>https://sarahstreza.com/campaign-diaries/dungies-and-dargons/1/setting-off/</link><guid isPermaLink="false">https://sarahstreza.com/campaign-diaries/dungies-and-dargons/1/setting-off/</guid><pubDate>Mon, 23 Sep 2019 23:00:00 GMT</pubDate></item><item><title><![CDATA[The Icon Garden Episode 19 SwiftUI and Native Apps]]></title><description><![CDATA[<a href="http://icongardenshow.libsyn.com/episode-19-swiftui-and-native-apps-with-steve-streza">Link</a> <p>I was a guest on <a href="http://www.icongardenshow.com/">The Icon Garden</a> podcast today, talking about the newly announced SwiftUI, how it co-exists with other tools like React Native, and what it means for the future of native apps and cross-platform hybrid apps.</p>
<iframe id="embed_10923193" title="Episode 19: SwiftUI and Native Apps with  Streza" style="border: none" src="//html5-player.libsyn.com/embed/episode/id/10923193/height/90/theme/custom/thumbnail/yes/direction/forward/tdest_id/905201/render-playlist/no/custom-color/000000/" scrolling="no" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="" oallowfullscreen="" msallowfullscreen="" class="adjusted-player" width="100%" height="90"></iframe>]]></description><link>https://sarahstreza.com/2019/08/21/the-icon-garden-podcast-appearance/</link><guid isPermaLink="false">https://sarahstreza.com/2019/08/21/the-icon-garden-podcast-appearance/</guid><pubDate>Wed, 21 Aug 2019 16:43:41 GMT</pubDate></item><item><title><![CDATA[Remote Camera Access Exploit in Zoom for Mac]]></title><description><![CDATA[<a href="https://medium.com/@jonathan.leitschuh/zoom-zero-day-4-million-webcams-maybe-an-rce-just-get-them-to-visit-your-website-ac75c83f4ef5">Link</a> <p>So Zoom runs a web server on your Mac (even after you uninstall the app), and that web server can launch Zoom calls via URLs, and those Zoom calls can default to having your camera open. Which apparently makes it very easy to embed something into a web page (or an ad) in an attempt to trick people into unwittingly opening a video chat.</p>
<p>Remote video exploits are one of the worst case scenarios of security vulnerability, and this is it. It looks like Zoom took over two months to start responding to it from the timeline, and if that’s true, it’s irresponsible security practice.</p>
<p>If you have Zoom installed on your Mac, check the “Patch Yourself” section of the article to block the functionality that allows this.</p>]]></description><link>https://sarahstreza.com/2019/07/09/remote-camera-access-exploit-zoom-mac/</link><guid isPermaLink="false">https://sarahstreza.com/2019/07/09/remote-camera-access-exploit-zoom-mac/</guid><pubDate>Tue, 09 Jul 2019 07:37:25 GMT</pubDate></item><item><title><![CDATA[WebSub and Microformats]]></title><description><![CDATA[<p>As of now my personal website should support <a href="https://websub.rocks/">WebSub</a> on all pages, posts, and the RSS feed (basically everything linked in the <a href="/sitemap.xml">sitemap</a>). If you have the capability to subscribe to pages via WebSub, you should be able to point it at any page on this site and get notified when that page updates. That’s maybe not the most useful on individual pages, but it is useful for the home page, or if you want to be able to subscribe to individual tags or projects.</p>
<p>This should work well with <a href="https://indieweb.org/reader">social readers</a> that let you subscribe to websites, at least in concept. To go with that, I’ve updated the <a href="http://microformats.org/wiki/h-feed">microformats</a> across much of the site to make them accessible to those readers. Things appear alright in <a href="http://pin13.net/mf2/?url=https%3A%2F%2Fstevestreza.com%2F">web-based validators</a> but I’ve been having trouble getting those changes to appear in the readers themselves. Hopefully that will fix itself as caches expire. But it’s one step further down the road of being a good IndieWeb citizen.</p>
<p>Behind the scenes, WebSub support is handled by Webmaster, my custom-built server that integrates with my <a href="/2018/09/29/gatsby-2-upgrade/">Gatsby build system</a>. When GitLab finishes building, it sends a webhook to Webmaster that signals that the site has changed, causing Webmaster to fetch the sitemap and scan the ETag of each file in it for changes. If any of those ETags are different from what’s already known, then that page has changed. The WebSub subscribers for that URL are fetched and notified with the changes. No WebSub hub necessary, but down the road I could switch to one pretty easily.</p>]]></description><link>https://sarahstreza.com/2019/07/07/websub-microformats/</link><guid isPermaLink="false">https://sarahstreza.com/2019/07/07/websub-microformats/</guid><pubDate>Mon, 08 Jul 2019 01:16:55 GMT</pubDate></item><item><title><![CDATA[No title]]></title><description><![CDATA[<p>Checking out the <span class="p-rsvp"><a href="https://2019.indieweb.org/summit" class="u-in-reply-to">IndieWeb Summit</a></span> remotely and working on my personal website today.</p>]]></description><link>https://sarahstreza.com/photos/2019/06/29/indieweb-summit-remote/</link><guid isPermaLink="false">https://sarahstreza.com/photos/2019/06/29/indieweb-summit-remote/</guid><pubDate>Sat, 29 Jun 2019 18:48:58 GMT</pubDate></item><item><title><![CDATA[Noclip Documentary on the Fall and Rise of Final Fantasy XIV]]></title><description><![CDATA[<iframe src="//www.youtube.com/embed/Xs0yQKI7Yw4" /> <a href="https://youtu.be/Xs0yQKI7Yw4">Video</a> <p>With the impending release of the third expansion Shadowbringers, I’ve been rewatching this amazing documentary on Final Fantasy XIV, its very poor launch, and its reconstruction. It’s a fascinating tale, one that has probably never been attempted (and likely never will again).</p>]]></description><link>https://sarahstreza.com/2019/06/21/Noclip-Documentary-on-the-Fall-and-Rise-of-Final-Fantasy-XIV</link><guid isPermaLink="false">https://sarahstreza.com/2019/06/21/Noclip-Documentary-on-the-Fall-and-Rise-of-Final-Fantasy-XIV</guid><pubDate>Fri, 21 Jun 2019 01:21:57 GMT</pubDate></item></channel></rss>