{
    "version": "https://jsonfeed.org/version/1",
    "user_comment": "This feed allows you to read the posts from this site in any feed reader that supports the JSON Feed format. To add this feed to your reader, copy the following URL -- https://bitsplitting.org/feed/json/ -- and add it your reader.",
    "home_page_url": "https://bitsplitting.org",
    "feed_url": "https://bitsplitting.org/feed/json/",
    "title": "Bitsplitting.org",
    "description": "Chasing the impossible with Daniel Jalkut",
    "items": [
        {
            "id": "https://bitsplitting.org/2026/04/01/the-beginning-of-programming-as-well-know-it/",
            "url": "https://bitsplitting.org/2026/04/01/the-beginning-of-programming-as-well-know-it/",
            "title": "The Beginning of Programming as We&#8217;ll Know It",
            "content_html": "<p>In the wake of AI coding assistants like Claude and Codex, which can seemingly perform the equivalent of a day&#8217;s work in a matter of minutes, many of us are wondering if the human role of &#8220;computer programmer&#8221; is coming to an end. Will the AI bots one day do all the programming for us?</p>\n<p>Maybe so, but not yet. At <em>this particular</em> moment, human developers are especially valuable, because of the transitional period we&#8217;re living through. Just a few years ago, AI essentially could not program at all. In the future, a given AI instance may &#8220;program better&#8221; than any single human in history. But for now, real programmers will always win. Why? Because we are uniquely positioned to harness <em>most</em> of the power of AI while augmenting it with human taste, wisdom, and caution, among other qualities that an AI is thus far incapable of possessing.</p>\n<p>There are many examples of stunned programmers who describe how they asked an AI to create an app from scratch and it &#8220;just did it.&#8221; They wrote a few paragraphs clearly defining the functionality and user interface, and let the AI run with it. A few minutes, hours, or days later, and tada! The app is complete. It runs, it performs the tasks required, and the interface &#8220;isn&#8217;t even that bad.&#8221;</p>\n<p>If you interpret these examples to mean that <em>any person</em> can write down <em>any list of requirements</em> along with <em>any user interface specs</em>, and the AI will consistently produce a satisfactory product, then I&#8217;d agree programmers are toast. But in my experience that is not what&#8217;s happening. </p>\n<p>There is a confirmation bias at work here: every developer who has experienced such a remarkable outcome is delighted to share it. It helps to contribute to a mass (human) hallucination that computers really are capable of anything, and really are taking over the world. It&#8217;s exciting! But people are less likely to share all the times the AI failed in some ridiculous way. When it produced thousands of lines of inscrutable code, betrayed a complete lack of knowledge in some field, or spiraled into a loop of deeper and deeper &#8220;stupidity.&#8221; In the same way social networks are filled with photographs that portray a false reality of endlessly joyful vacations, flawless families, and universal good cheer, the AI victory stories we read are not a trustworthy reflection of reality. </p>\n<p>Why am I so confident about this? Because I work with AI every day. I patiently hold its hand, and pull it back when it follows the wrong impulses. I correct its mistakes. I rewrite its code. I sometimes speak to it sternly. I play one AI off another, asking ChatGPT to criticize Claude&#8217;s work, and vice-versa. In my opinion, the <em>majority</em> of code generated by AI systems is not great, but it&#8217;s the great quantity it can create in such a short period of time that makes it so powerful. And that&#8217;s why I go to the trouble to work with it at all. Because <em>it&#8217;s so good</em> at what it&#8217;s good at.</p>\n<p>Speaking of goodness, I share the majority opinion that AI is <em>generally</em> good. That is to say that I believe it will prove to have a positive impact on humanity. It will accelerate productivity in virtually every field, lead to insights in science and medicine, and offer accessibility advantages to millions of people. And yes, it will inevitably &#8220;take the jobs&#8221; of many unsuspecting victims. But as I hinted earlier, the <em>suspecting</em> victims all stand to gain. So be \u2026 suspectful? That doesn&#8217;t sound right. But be wary.</p>\n<p>A mantra I&#8217;ve been repeating to myself lately is that an AI&#8217;s code can not be counted as &#8220;work&#8221; until a human has reviewed it and fixed any problems. If we&#8217;re going to talk about computers replacing humans, then the &#8220;work&#8221; that is done has to meet or exceed the standard that humans have set. We have these standards not just because we&#8217;re fussy, but because they lead to less buggy, higher performance, and more maintainable code.  They&#8217;re not going to take our jobs by writing unreadable functions that are 4-times as long and defy platform conventions. Once they&#8217;ve <em>completely taken over</em>, they can write the code however they like. But for now, they need to abide by human standards.</p>\n<p>And so I repeat that mantra, because I don&#8217;t want to fall into the same trap that I&#8217;m sure many programmers already have: committing AI-generated code without review. And when I say I don&#8217;t want to fall into that trap, I mean I don&#8217;t want to fall into that trap <em>again</em>. Or at least not too many more times. Or not too often.</p>\n<p>The truth is, it&#8217;s hard to avoid falling into that trap because of the illusion of perfection that AI so often projects. People used to talk all the time about Steve Jobs&#8217;s &#8220;reality distortion field.&#8221; It seemed that when he asserted some truth about a technology or product, people would eat it up in the moment, perceiving it all to be both inevitable and true. Only later, after taking a breath and pondering on what was claimed, would they determine he might have been completely bullshitting. He had a real knack for doing that, and AI has it to. </p>\n<p>When I catch myself falling for one an AI&#8217;s bullshit ideas, I have to pull myself out of that reality distortion zone, apply my own wisdom to the task at hand, and set it back on course. Many technologies that seem like magic are, in fact, only useful or practical when a human plays a pivotal role. If, in horse-drawn buggy days, you had loaded a car full of people, pointed it the direction of a destination, and cued the horse to start moving, there&#8217;s <em>a chance</em> they would end up where they wanted to go. In that case, they would rejoice the miracle. The self-driving car is here! Alas, it turns out that as amazing as horses are, they can not be relied upon without the attentive management of a human.</p>\n<p>The time may come, perhaps even soon, when AI takes over programming completely. But in the mean time, a programmer who embraces AI, yet is skeptical about everything it creates, is better-equipped than any comparably-skilled human in programming history. I&#8217;ve written specifically about programmers, but I think this also applies to writers, artists, musicians, and people in every other profession whose products can be described by any stretch as &#8220;creative work.&#8221; Anybody who maintains strict control over the final product may find that AI enhances, rather than replaces, their creativity. The computers will come for all of our jobs eventually, but those of us who refuse or decline to embrace the most powerful creative tools we&#8217;ve ever been given will be the first to fall.</p>\n",
            "date_published": "2026-04-01T18:01:35-04:00",
            "date_modified": "2026-04-01T18:45:01-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2026/02/11/comfort-zone/",
            "url": "https://bitsplitting.org/2026/02/11/comfort-zone/",
            "title": "Comfort Zone",
            "content_html": "<p>Once, in 1994 or so, I\u00a0was sitting in a cafe with friends, and I had the crazy idea that I was going to write my own web browser. I was a college student at the time, and had played with Mosaic and \u2026 well, probably only Mosaic. But had also played with Gopher, and other protocols like SMTP, UUCP, and NNTP. In some ways I was perfectly situated to pursue something great, but I was only 19 years old and had plenty of doubts. Browsers are big. There\u2019s a lot I don\u2019t know. And jeez, on top of everything, I need to finish my schoolwork! As fate would have it, I never ended up building that browser. It wasn\u2019t in my comfort zone.<br />\n\u00a0<br />\nInstead I went to work for Apple. When I say I \u201cwent to work for Apple,\u201d I mean that I threw myself at the mercy of a Cupertino staffing agency, convincing them that I knew the first thing about Macs (I didn\u2019t), and insisting that the only contracts I would take were for Apple. I don\u2019t know why I insisted on Apple except that my good friend, who worked for Apple, had recently hooked me up with a discounted PowerBook Duo 210. The agency connected me to a group within the company that needed a very short-term QA tester. I put on my nicest clothes for the phone call, to improve my confidence, and I got it! It was the best weekend of my working life. To that point.<br />\n\u00a0<br />\nI had a few more short-term assignments before they sent me to an on-site interview with the System 7 Engineering team, where I impressed the manager by describing a binary search method I would use for determining conflicts among classic Mac extensions: \u201cDisable half of them, test. Disable half again, test.&#8221; It was good enough to get me the job. </p>\n<p>I was actually working for a group at Apple! Where? 1 Infinite Loop. At the time, there was no more prestigious address to work at in all of Apple.<br />\n\u00a0<br />\nThe moment I got my foot in the door, I let management know that I was really after an engineering job. \u201cI\u2019m going to be the best QA engineer you&#8217;ve ever seen, but I really want to write code for the Mac.\u201d Or something like that. Having the gall to say something affected things. I got the attention of the Director of the department, who liked my initiative and assigned one of his staff developers to be my mentor. </p>\n<p>My mentor gave me tasks to pursue on my own time, out of work hours. I programmed every night, at home, doing whatever he asked me to. In retrospect he sounds a little sadistic, but I ended up with a text editor written in Motorola 68K Assembly language. It was a learning experience.<br />\n\u00a0<br />\nWhen a new engineering job opened up in that group, I was among the first to know. Of course I applied. And I was interviewed, put through the friendly (though not easy) wringer of justifying my worth to all my co-workers and was ultimately hired. I really cut my teeth in that group. Some of the people I worked with are absolute legends. Every time I felt over my head, I was terrified. Like many people I worried I had made the wrong choice. I was in the wrong job. But inevitably one of my mentors would pull me out, put my head on straight, and teach me to move forward. What a blessing.<br />\n\u00a0<br />\nAt one point I was assigned to a &#8220;special project.&#8221; I won\u2019t give too many details, because I still respect the confidentiality agreement that Apple expects from all its employees. It\u2019s been 25 years since I drew a salary from the company, but I\u2019m still \u201cemployee emeritus.\u201d Anyway, the only detail I\u2019ll share about this special project is that it involved a custom, Apple-made web browser. Before Safari. Or maybe Safari was getting started and I didn\u2019t even know about it yet, but we were going to make a self-contained web browser, expected to run on Mac OS 9. They put me in charge of it. No problem.<br />\n\u00a0<br />\nThat project never went very far. Years later, I wondered if it was, at least in part, because people at higher levels knew about the Safari and WebKit projects. If so, no offense taken! The browser I was asked to create was a billion times more complex than what I had in mind when i dreamed about doing something in that cafe, but far less robust than what Safari ended up being. Still, I did end up \u201cworking on my own web browser\u201d after all.<br />\n\u00a0<br />\nWhen faced with the prospect of making my own web browser in 1994, I said \u201cno&#8221;, or at least I implied \u201cno\u201d by omission. But when faced with so many other challenges over the course of my career, I said \u201cyes.\u201d \u00a0Again and again. I said yes to interviewing at a contract agency. I said yes to interviewing at Apple. I said yes to joining an engineering team. I said yes to making a name for myself. I said yes to working on a weird custom web browser. I said yes working long and hard, and ultimately I said \u201cyes\u201d to a lot of other things in life. And I&#8217;m still not very comfortable getting out of my comfort zone.</p>\n",
            "date_published": "2026-02-11T21:55:19-05:00",
            "date_modified": "2026-02-11T23:02:12-05:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2025/04/30/whither-help-scout/",
            "url": "https://bitsplitting.org/2025/04/30/whither-help-scout/",
            "title": "Whither Help Scout?",
            "content_html": "<p>Three years ago, when I <a href=\"https://bitsplitting.org/2022/07/20/dump-fogbugz/\">abandoned FogBugz</a> after having used it for nearly 20 years, I landed on <a href=\"https://www.helpscout.com\">Help Scout</a>, a fantastic support system offered by a company that seems to have a positive spirit and, cherry on top, is based locally to me in Boston.</p>\n<p>There are few companies I\u2019ve been as happy to spend money with. As a one-person support team, $22/month ($264 paid annually) gets me a reliable service that ticks all the boxes for my needs.</p>\n<p>This simple pricing system was a breath of fresh air compared to many other services, which often require minimum user counts of five or more, have overly-complex user interfaces, or which seem unlikely to remain a going business concern.</p>\n<p>Since I switched to Help Scout, I have been convinced that they are the best at what they do, and that I\u2019d be in a real pickle if I were compelled to switch to anything else.</p>\n<h3>A Real Pickle</h3>\n<p>Over the past few weeks, many Help Scout customers have received notice that our plans will change to a <a href=\"https://www.helpscout.com/pricing/\">new pricing model</a>. Customers who haven\u2019t received notice yet probably will soon. The new system is based on a rolling average of customer interactions. As they cleverly frame it: \u201cthe number of contacts you help each month.\u201d Once notified, customers are granted six-months notice before the changes take effect.</p>\n<p>The problem, for most Help Scout customers, is that the new system increases their monthly costs. A little for some, and <em>a whole lot</em> for others. The closest approximation to my current $22/month plan starts at $50/month and covers an average of 100 customer interactions per month. They\u2019re obviously sensitive to the sticker shock this will produce, so they\u2019re offering a two-year \u201cLoyalty Discount\u201d of about $20/month, reducing my monthly cost to $28.60/month. That&#8217;s still a 30% rise, but coming out to $6, it&#8217;s something I can live with.</p>\n<p>For larger customers, the cost increase could be much worse. Imagine my company employed a three-person support team, handling customer interactions for 500 unique customers per month. Under current Help Scout pricing, I would pay $66/month. Exactly three times the amount I pay today. But under the new pricing structure, the minimum cost is $266/month.</p>\n<p>How do you know which pricing tier you&#8217;ll fall into? Once you receive notice from Help Scout that your plan is changing, you&#8217;ll be able to see a graph of your recent customer interactions on a custom <a href=\"https://secure.Help Scout.net/members/plan-migration/\">plan migration page</a> within your account. For example, my graph shows that I fall comfortably into the 100 customers per month tier:</p>\n<p><img decoding=\"async\" src=\"https://bitsplitting.org/wp-content/uploads/2025/04/ContactsHelped.png\" alt=\"\" title=\"ContactsHelped.png\" border=\"0\" width=\"571\" /></p>\n<p>For new customers, they suggest for estimation purposes that the likely number of &#8220;customers helped&#8221; is around two-thirds the total number of emails you receive. So if you receive 150 emails per month, you might fall under the 100 contact tier, but if receive 200 emails per month, you most likely do not. </p>\n<h3>The Upside</h3>\n<p>The new pricing <em>will</em> benefit some customers. A brand new &#8220;Free&#8221; tier is a fantastic option for new customers who assist fewer than 50 customers per month on average. I fall into this range, so I wondered if this option might suit me. I contacted Help Scout and they agreed that I qualified for the plan, with the exception that I was using more than maximum 100 &#8220;tags&#8221; included in the free tier. I tag some Help Scout issues with GitHub ticket numbers, but if I were willing to delete some tags, I could switch immediately and start paying $22 <em>less</em> per month than I do now. That&#8217;s tempting, but the big problem with the free tier is that it <strong>removes access to the Help Scout API, and the ability to &#8220;Export&#8221; your data</strong>. Restricting data export is <em>very 2005</em>, and I wonder how it will play out in Europe.</p>\n<p>It&#8217;s also possible to imagine customers with a large number of agents assisting a relatively small number of customers. For example, if my imaginary three-person support team handled only 100 unique customers per month, the monthly cost would <em>go down</em> with the new pricing, from $66/month to $50/month. Or $30/month if they provide the same loyalty discount, but I suspect for customers positively affected by the price change, there will be no such discount.</p>\n<p>Finally, customers who lean heavily on Help Scout&#8217;s AI features might see savings. Currently, customers who want to use these features have to pay at least $44/month per user, twice the standard plan. I wouldn&#8217;t know and don&#8217;t care how much these savings might be, because although I am not opposed to AI in general, I don&#8217;t appreciate or employ it in the context of customer support.</p>\n<h3>What To Do?</h3>\n<p>For a customer in my particular position, whose monthly price will go up by $6, the easiest way forward is to do nothing. I&#8217;ll keep enjoying the same glorious product I have enjoyed for the past three years, at only a <em>slightly</em> elevated price. After another two years, we&#8217;ll see how things shake out. I contacted Help Scout about the &#8220;loyalty discount&#8221; and what happens when it expires, and they assured me that they would &#8220;do something&#8221; to keep people in my situation from seeing too much of a price hike. They claim to be aware of a problem there, but just aren&#8217;t sure how to manage it.</p>\n<p>For customers who will see a more painful increase in cost, as with the $66 to $266 spike I contemplated above, I have to imagine they will consider other options. While I maintain that Help Scout is the best at what they do, there <em>are</em>, of course, alternatives. I haven&#8217;t made a thorough evaluation lately, but my pal Paul Kafasis shared a list of potential options put together by <a href=\"https://rogueamoeba.com\">Rogue Amoeba&#8217;s</a> Support Manager Chris Barajas. You might stumble upon something you like while perusing these:</p>\n<ul>\n<li><a href=\"https://www.intercom.com/\">Intercom</a></li>\n<li><a href=\"https://www.helpdesk.com/\">HelpDesk</a></li>\n<li><a href=\"https://crisp.chat/\">Crisp</a></li>\n<li><a href=\"https://front.com/\">Front</a></li>\n<li><a href=\"https://www.zendesk.com/\">Zendesk</a></li>\n<li><a href=\"https://helpcrunch.com/\">HelpCrunch</a></li>\n<li><a href=\"https://www.happyfox.com/\">HappyFox</a></li>\n<li><a href=\"https://www.freshworks.com/freshdesk/\">Freshdesk</a></li>\n<li><a href=\"https://freescout.net/\">FreeScout</a></li>\n</ul>\n<p>That last option, FreeScout, is notable for being open source. Another option that came across my radar is a system called <a href=\"https://zammad.com/\">Zammad</a>, which offers <a href=\"https://zammad.com/en/pricing\">full-service hosting</a> with the same refreshingly-simple &#8220;per user&#8221; pricing I once admired Help Scout for. And like FreeScout, Zammad is also open source. This means that either of these options can be self-hosted on your own server, akin to hosting your own <a href=\"https://wordpress.org\">WordPress</a> installation.</p>\n<p>I don&#8217;t relish the idea of maintaining my own help desk, but with the ever-looming threat of changes in functionality and pricing, for such a critical piece of infrastructure, I am considering it. With the wide-spread adoption of technologies like Docker, which bundle software into self-contained, easily-deployed packages, and services from companies such as Amazon, Microsoft, and Google, which make it easier to host such packages, it has never been easier to maintain a &#8220;self-hosted&#8221;, yet highly reliable web service.</p>\n<h3>Takeaway</h3>\n<p>While I respect Help Scout&#8217;s right and responsibility to manage the destiny of their own business, I think they are making a mistake with these changes.</p>\n<p>It&#8217;s one thing to assert that they are upsetting their current user base. I think they are, but worse, I think they will turn off prospective users as well.</p>\n<p>People don&#8217;t like fluctuating prices. Businesses <em>especially</em> don&#8217;t like fluctuating prices. With Help Scout&#8217;s old business model, it was very easy to understand what you were paying for, and what you would receive. The new system requires work <em>simply to determine if pricing is viable</em>, let alone practical. And once you&#8217;ve settled into a tier, you run the risk of being &#8220;punished&#8221; for helping more customers. The idea that I might one day consider whether to help a customer today, at the cost of sending myself into a higher pricing tier, or helping them tomorrow, and saving a bit of cash, makes me both frustrated and a little sick.</p>\n<p>I suspect that very-large companies will find these changes the most palatable. Not only because at greater scale the pricing is more predictable, but because larger companies have far more expenses, many of which probably dwarf the cost of their Help Desk software. The smaller the company, the more likely Help Desk software is to be one of the main monthly expenses.</p>\n<p>In a private chat, somebody suggested to me that small-time companies like mine are not Help Scout&#8217;s target market. That might well be true, but if it is, I think that is also folly. Most companies with 10, 100, or 1000 customer support agents started as companies with 1, 2, or 3 support agents. Help Scout&#8217;s new &#8220;Free&#8221; tier is a nod to the importance of luring in customers when they&#8217;re small and have little money to spare. They just seem to drop the ball a bit when it comes to taking care of customers at slightly-more-successful levels.</p>\n<p>I am not sure what percentage of customers have been notified so far, but the number seems to be accelerating. I suspect the amount of negative feedback Help Scout receives will also accelerate. Hopefully this will inspire changes that make this transition more palatable for everybody.</p>\n",
            "date_published": "2025-04-30T10:15:39-04:00",
            "date_modified": "2025-04-30T11:02:27-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2023/05/25/apple-intelligence/",
            "url": "https://bitsplitting.org/2023/05/25/apple-intelligence/",
            "title": "Apple Intelligence",
            "content_html": "<p>As <a href=\"https://developer.apple.com/wwdc23/\">WWDC</a> draws near, anticipation of Apple&#8217;s long-rumored VR headset is high. The company is widely expected to announce an impressive, albeit expensive new product at the June 5 Keynote event. In short: people expect Apple to make a strong showing in this field.</p>\n<p>People are justifiably less confident about Apple&#8217;s prospective plans in the area of artificial intelligence (AI), and particularly in the realm of large language models: the technology behind such imagination-captivating products as OpenAI&#8217;s <a href=\"https://chat.openai.com\">ChatGPT</a>, and <a href=\"https://github.com/features/copilot\">GitHub Copilot</a> (which itself uses another OpenAI language model).</p>\n<p>I zeroed in on ChatGPT and Copilot because it&#8217;s easy to imagine the functionality of these services shining in the context of two important Apple products: Siri, and its Xcode developer tools. In fact, technology is advancing so quickly that the absence of <em>something like ChatGPT</em> and <em>something like Copilot</em> in these products seems likely to be viewed as major shortcoming in the near future, if it isn&#8217;t seen that way already.</p>\n<p>The industry-wide excitement around AI is so great that it&#8217;s hard to imagine any company of Apple&#8217;s stature letting a major developer conference come an go without <em>at least mentioning</em> the technology, if not enumerating the specific ways in which they are using it in their products. Most people I know are confident it will be mentioned in the Keynote, but less confident that any news will be Earth-shattering, or even Earth-tickling.</p>\n<p>Which leads me to my somewhat far-fetched prediction for WWDC: Apple <em>will</em> talk about AI, but they won&#8217;t once utter the letters &#8220;AI&#8221;. They will allude to a major new initiative, under way for years within the company. The benefits of this project will make it obvious that it is meant to serve as an answer to comparable efforts being made by OpenAI, Microsoft, Google, and Facebook. During the crescendo to announcing its name, the letters &#8220;A&#8221; and &#8220;I&#8221; will be on all of our lips, and then they&#8217;ll drop the proverbial mic: &#8220;We&#8217;re calling it Apple Intelligence.&#8221; Get it?</p>\n<p>Apple often follows the herd in terms of what they focus their efforts on, but rarely fall into line using the same tired jargon as the rest of the industry. Apple Intelligence will allow Apple to make it crystal clear to the entire world that they&#8217;re taking &#8220;AI&#8221; seriously, without stooping to the level of treating it as a commodity technology. They do this kind of thing all the time with names like AirPort, AirPlay, and AirTags. These marketing terms represent underlying technologies that Apple <em>embraces and extends</em>. Giving them unique names makes them easier to sell, but also gives Apple freedom to blur the lines on exactly what the technology should or shouldn&#8217;t be capable of.</p>\n<p>Apple Intelligence won&#8217;t be as good as ChatGPT or GitHub Copilot, at least not to start with. But it will be Apple&#8217;s. They can frame the pros and cons however they see fit, working their typical marketing magic to make its shortcomings seem less important, if not downright advantageous. And, being an abstraction on the already broad subject of &#8220;AI&#8221;, they can evolve its capabilities over time, gradually improving on it and increasing its brand recognition. In five years, when every other company is still talking about &#8220;AI&#8221;, or whatever other buzzword has taken its place, Apple may well have already incorporated the technology into its own A.I.</p>\n",
            "date_published": "2023-05-25T15:24:44-04:00",
            "date_modified": "2024-06-11T15:12:25-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2023/05/01/52-floppy-pickup/",
            "url": "https://bitsplitting.org/2023/05/01/52-floppy-pickup/",
            "title": "52 Floppy Pickup",
            "content_html": "<p>On the latest <a href=\"https://atp.fm/532\">Accidental Tech Podcast</a>, John reminisced about the early days of the Mac, when a single 3.5&#8243; floppy disk drive was typically used not only to boot a Mac, but also to run any applications, and to save any user data. He described the painstaking process of needing to insert a different disk whenever programs required access to specific executable code or data. Depending on the complexity of a workflow, you might be prompted to swap disks once, twice, or potentially dozens of times.</p>\n<p>The conversation reminded me of one of my first jobs at Apple. I was hired to work as a QA tester with the engineering team that shipped Mac OS system software updates. The first release I worked on was Mac OS 7.5, which was released in 1994. By this time hard drives had become commonplace and the kind of floppy-swapping John described had become a lot less common for most users. But when it came to installing new software onto a Mac, some amount of removable media juggling was usually required.</p>\n<p>Typically at that time, major OS updates were installed from CD-ROM discs. The system used the same basic strategy: it would eject one disc and prompt you to insert another, until the installation process was completed. It was a little tedious, but because CD-ROM discs had a massively higher capacity than floppy disks, it usually only required a few swaps.</p>\n<p>One day during the lead up to finishing System 7.5, my boss brought a massive box full of floppy disks into the lab I worked in. The System 7.5 update was remarkably backward compatible, and supported computers as old as the Macintosh Plus and SE, which <em>did not</em> include a CD-ROM drive. In fact they did not even support the relatively higher density 1.4MB floppy disks of the era. That massive box was the <a href=\"https://archive.org/details/apple-system-7.5-installation-disks-800k-version/mode/2up\">System 7.5 installer</a>, split across 50 or so (as best as I can recall) 800K floppy disks. I was supposed to make sure it worked.</p>\n<p>Another thing John recalled on the show was how some folks got amazingly good at floppy-swapping process, developing a muscle memory for fluidly withdrawing and inserting disks on command. Suffice to say, after testing that 50-floppy install process more than a couple times, my muscle memory was pretty darned good.</p>\n",
            "date_published": "2023-05-01T15:49:25-04:00",
            "date_modified": "2023-05-01T15:52:53-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2023/03/17/spelunking-apples-open-source/",
            "url": "https://bitsplitting.org/2023/03/17/spelunking-apples-open-source/",
            "title": "Spelunking Apple&#8217;s Open Source",
            "content_html": "<p>Since the earliest days of Mac OS X, Apple has complied with the licenses for the dozens of open source components it includes in the OS by posting (sometimes a little belatedly) updated versions of the source code to its <a href=\"https://opensource.apple.com\">Open Source at Apple</a> web page.</p>\n<p>This resource is useful primarily to developers, but may also interest curious technophiles who want to take a peek &#8220;behind the curtain&#8221; to see how much of the magic just beneath our fingertips is made.</p>\n<p>If you visit the page today, you&#8217;ll see a new emphasis on Apple&#8217;s high-level projects, such as <a href=\"https://www.swift.org\">Swift</a> and <a href=\"https://webkit.org\">WebKit</a>. At first glance you might wonder if the extensive list of all the open source projects has been removed from the site.</p>\n<p>There&#8217;s no need to worry: the whole list, indexed by the pertinent platform and OS release to which they belong, is still available on a separate <a href=\"https://opensource.apple.com/releases/\">Releases</a> page. Even better, each of these releases now has a corresponding GitHub repository, hosted in a <a href=\"https://github.com/apple-oss-distributions\">dedicated organization</a> reserved exclusively for open source distributions.</p>\n<p>As great as the old list of distributions by release is, it can be tedious to pinpoint exactly where a particular component&#8217;s source code might live. Sometimes it&#8217;s easy: for example, the source code for the version of the <a href=\"https://www.vim.org\">Vim</a> editor that shipped with macOS 13 is conveniently located in a distribution called <em>vim-136</em>. But other tools can be harder to find. If you were curious about the &#8220;banner&#8221; command, which was historically used to generate ASCII text suitable for printing huge messages at dot matrix printers (!), and which is remarkably still available as a built-in command on every Mac, you&#8217;d have to know to go looking for it in the <em>text_cmds-138</em> release.</p>\n<p>Apple&#8217;s decision to host these releases on GitHub, under a distinct organization, solves the problem. If you want to find the source code to an arcane tool like &#8220;banner&#8221;, just type it into a GitHub search of the organization. If there are too many false hits, as is the case for a common word like banner, try searching on something unique like a term from the command&#8217;s <a href=\"https://en.wikipedia.org/wiki/Man_page\">man page</a>. The banner tool is credited as being authored by Mark Horton, and a search for &#8220;org:apple-oss-distributions Mark Horton&#8221; brings up more hits than I would have guessed (he also contributed to vim and vi, coincidentally), but a reference to the banner man page is the second search result.</p>\n<p>I was inspired to write this blog post by a situation that came up in a programming Slack, where one person asked for &#8220;an API that could list the open ports and their owning processes.&#8221; Another replied that the command-line tool &#8220;lsof&#8221; is up to the task, only the person wasn&#8217;t looking for a command-line tool. Using the knowledge of Apple&#8217;s open source distributions, you could go look for, and find, the <a href=\"https://github.com/apple-oss-distributions/lsof/blob/a26b67d2f0c6600d269f0b33233a2cb4b877b279/lsof/dialects/darwin/libproc/dproc.c#L720\">pertinent source code</a>, and determine <em>which API</em> it was using.</p>\n<p>When questions like these come up, many times the answer comes from a wise old sage who happens to know exactly what you&#8217;re looking for. Other times, Apple&#8217;s increasingly well-indexed open source distributions might be just the ticket.</p>\n",
            "date_published": "2023-03-17T09:37:39-04:00",
            "date_modified": "2023-03-17T09:49:22-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2022/08/16/disciplined-innovation/",
            "url": "https://bitsplitting.org/2022/08/16/disciplined-innovation/",
            "title": "Disciplined Innovation",
            "content_html": "<p>Apple&#8217;s macOS 13 &#8220;Ventura&#8221; beta features a <em>major</em> redesign of the System Preferences application. In addition to renaming it &#8220;System Settings,&#8221; Apple revamped the interface with an organization style that is far more reminiscent of the iOS &#8220;table view&#8221; organization than of the macOS status quo:</p>\n<p><img fetchpriority=\"high\" decoding=\"async\" style=\"display:block; margin-left:auto; margin-right:auto;\" src=\"https://bitsplitting.org/wp-content/uploads/2022/08/SystemSettingsAppearance.png\" alt=\"Screenshot of the macOS 13 Ventura System Settings Appearance tab\" title=\"SystemSettingsAppearance.png\" border=\"0\" width=\"300\" height=\"344\" /></p>\n<p>At first blush, there are apparent advantages to this design. Perhaps most significantly, the resemblance to iOS in both appearance and function may make the interface more navigable, and easier to understand, for users who are more familiar with iOS than with the Mac. The familiar &#8220;stack based&#8221; approach to delving deeper into the details of a particular preference pane has some advantages to the typical Mac approach of presenting detail as modal panels, which sometimes beg to be awkwardly nested in a pile of secondary or tertiary panels.</p>\n<p>On second, third, and many blushes beyond, however, the design of System Settings appears to represent a major regression in overall usability and aesthetics. It has been taking public jabs since the first deveoloper beta, prompting a challenging question from John Gruber <a href=\"https://www.youtube.com/watch?v=WfnvsepVJC0\">in his interview</a> with Apple&#8217;s Greg Joswiak and Craig Federighi. Federighi replied with a compelling argument in favor of unifying the design experience across platforms, and removing historic cruft from the legacy macOS designs. Federighi further complained that Apple was being &#8220;judged for its betas,&#8221; implying that the UI would see significant improvements over the course of the summer.</p>\n<p>We have seen improvements, but by the judgement of most Mac faithful (or at least the loudest among them), these improvements are not enough. Recently, a <a href=\"https://twitter.com/nikitonsky/status/1557357661171204098\">trending Twitter thread</a> by Niki Tonsky reignited criticism, while many people pointed out that as the expected ship date for macOS Ventura draws closer, we are less likely to see dramatic improvements.</p>\n<p>John Gruber returned to the subject in <a href=\"https://daringfireball.net/linked/2022/08/15/ventura-system-settings-tonsky\">a piece yesterday</a>, in which he asserts &#8220;the basic fit and finish of Ventura\u2019s new System Settings is just bad.&#8221; He lays much of the blame for this on SwiftUI, which he further asserts that with SwiftUI &#8220;so many little layout details are apparently hard to get right.&#8221;</p>\n<p>I have heard several people acknowledge that the successful transition to Apple Silicon was accomplished in part by focusing on the underlying architectural change while having the discipline to <em>keep the hardware the same</em>. The thinking is that with such a dramatic change in the underlying technology of the Mac, it would have been reckless to attempt other major hardware changes at the same time. In short: the Apple Silicon transition can be judged as successful on the basis that anybody using such a Mac might not even know they were using a fundamentally different computer design.</p>\n<p>With Apple Silicon, Apple was able pull the proverbial table cloth out from under the exquisite place settings of the Mac, comprising its beloved hardware and software features, while leaving everything standing exactly as it was. That&#8217;s quite an achievement. </p>\n<p>I think that SwiftUI would be judged as a more successful transition if Apple had pulled off a similar stunt. What if they had approached the challenge by making sure, first and foremost, that every Mac and iOS UI component behaved <em>exactly the same</em> as before? Then, as with the Apple Silicon changes, they could leverage the advantages of the new technhology to expand and improve upon the status quo, rather than attempting to replace it.</p>\n<p>By choosing to change the underlying technology while also introducing new UI designs and behaviors, Apple has effectively attempted to pull the tablecloth out from under the place settings, while also pouring tea, cutting the cake, and serving the sandwiches. Messes will get made, some dishes are bound to get broken, and they&#8217;ll take a long time to put back together.</p>\n",
            "date_published": "2022-08-16T15:42:32-04:00",
            "date_modified": "2022-08-23T15:04:42-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2022/07/20/dump-fogbugz/",
            "url": "https://bitsplitting.org/2022/07/20/dump-fogbugz/",
            "title": "Dump FogBugz",
            "content_html": "<p>Once upon a time, there was a fabulous service called <a href=\"https://fogbugz.com\">FogBugz</a>. Well, technically it still exists, but over the past many years, since it was sold off by Fog Creek Software, it has both stagnated and diminished in reliability as a substantial number of us long-time users has grudgingly continued to use it.</p>\n<p>Several months ago, the whiff of abandonment became too great for me to bear any longer, so I devised a plan to migrate my data out of FogBugz, and into more reliably maintained services. FogBugz effectively served as both a customer-service database, and a bug-tracking system. Most apps don&#8217;t strive to achieve this, so I had to plan for two new services to fill the shoes of this app. I settled on <a href=\"https://helpscout.grsm.io/9cjaq3un7qbw\">HelpScout</a> for customer service, and <a href=\"https://github.com/issues\">GitHub Issues</a> for bug-tracking. HelpScout has turned out to be more of a solid home run than GitHub issues, but I&#8217;m happy with both.</p>\n<p>Whether you&#8217;re also looking to transition away from FogBugz, or just want a reliable means of backing up your data, you&#8217;ll need to use the FogBugz API to get your data out. Once you have a structured backup of all your case data and attachments, you&#8217;ll be in a good position to evaluate how you might migrate that data into a format that is suitable for importing to another service.</p>\n<p>I&#8217;ve shared a pair of simple Python scripts on GitHub that will help you to automate dumping your FogBugz data. Simply download my <a href=\"https://github.com/danielpunkass/dumpbugz\">dumpbugz</a> files from GitHub, follow the directions in the README, and you should be left with a &#8220;Cases&#8221; folder that includes all of your data and attachments.</p>\n<p>For my transition to HelpScout and GitHub Issues, I wrote additional scripts to interface with the APIs of those services. Those are not ready for sharing at this point, but I may share them in the future. In any case, I hope the scripts make it easier for you to &#8220;Dump FogBugz&#8221; sooner than later.</p>\n",
            "date_published": "2022-07-20T23:30:35-04:00",
            "date_modified": "2022-09-17T17:24:03-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2022/06/18/purgeable-mac-apps/",
            "url": "https://bitsplitting.org/2022/06/18/purgeable-mac-apps/",
            "title": "Purgeable Mac Apps",
            "content_html": "<p>For months now, I have been scratching my head over a small but persistent number of &#8220;crash reports&#8221; affecting a few of my apps. The issue is most prevalent in <a href=\"https://redsweater.com/marsedit/\">MarsEdit</a>, where I have a handful of users who run into the issue multiple times per day. Luckily, one of these users is my good friend and colleague, <a href=\"https://www.manton.org\">Manton Reece</a>. I&#8217;ve been peppering him with questions about the issue for weeks, while he stoicly puts up with the behavior.</p>\n<p>Even with the assistance of a highly technical friend who can reproduce the issue at will, I had thrown my arms up in despair several times. I put &#8220;crash reports&#8221; in quotes above, because although my in-app crash reporter notices the app abruptly terminates, the system doesn&#8217;t create any obvious artifacts. No crash or hang reports. No &#8220;Quit Unexpectedly&#8221; dialog. The app is just &#8230; gone. I wrote a question in the <a href=\"https://developer.apple.com/forums/thread/707643?page=1#717533022\">Apple Developer Forums</a>, which turned into a kind of de facto diary as I pursued the issue.</p>\n<p>When I started to feel bad about asking Manton to try this, that, and the other thing, I finally asked if he could send me a &#8220;sysdiagnose&#8221; report. If you&#8217;re curious, the easiest way to grab one of these on any Mac is to simply press the Control, Option, Command, Shift, and &#8220;.&#8221; (period) keys at once. You&#8217;ll see the screen flash, an indication the system is starting to collect the reports. A few minutes later the report will be revealed in the Finder: a probably quite large zip archive. Open it up and see the wealth of information about nearly every aspect of the system.</p>\n<p>Yet even with this wealth of information, I was stymied. It wasn&#8217;t until I chanced upon the delightfully pertinent nuggets of information in &#8220;/var/log/com.apple.xpc.launchd/launchd.log&#8221; that I got my first whiff of a clue:</p>\n<pre style=\"white-space:normal;\">\n2022-05-03 09:15:22.088718 (gui/501/application.com.red-sweater.marsedit4.384452971.384452977 [13840]) <Notice>: exited with exit reason (namespace: 15 code: 0xbaddd15c) - OS_REASON_RUNNINGBOARD | &lt;RBSTerminateContext| code:0xBADDD15C explanation:CacheDeleteAppContainerCaches requesting termination assertion for com.red-sweater.marsedit4</pre>\n<p>Here we have a message asserting that MarsEdit <em>was terminated</em>, on purpose, and better still, it includes <em>an explanation</em>! As far as explanations go, &#8220;CacheDeleteAppContainerCaches&#8221; is not much of one, but it did give me something to go on. Searching for the term yielded pertinent results like <a href=\"https://apple.stackexchange.com/questions/434659/apple-mail-and-safari-quit-silently-when-hidden\">this post</a> about Apple Mail and Safari &#8220;suddenly quitting.&#8221; Unfortunately, they all seem to be scratching their heads as much as I am.</p>\n<p>The other thing that jumped out at me from the log was the term &#8220;OS_REASON_RUNNINGBOARD&#8221;. Searching for this results in only a few scant links, all related to Apple&#8217;s <a href=\"https://opensource.apple.com/source/xnu/xnu-6153.41.3/bsd/sys/reason.h\">open source Darwin kernel</a>. However, Searching instead for just &#8220;RunnningBoard&#8221; offered a glimmer of hope. A post on Howard Oakley&#8217;s blog, &#8220;<a href=\"https://eclecticlight.co/2019/11/07/runningboard-a-new-subsystem-in-catalina-to-detect-errors/\">RunningBoard: a new subsystem in Catalina to detect errors</a>&#8220;, includes a particularly succinct description of the eponymous OS subsystem (emphasis mine):</p>\n<blockquote><p>\nCatalina brings several new internal features, a few of which have been documented, but others seem to have slipped past silently. Among the latter is an active subsystem to replace an old service assertiond, <strong>which can cause apps to unexpectedly terminate \u2013 to you and me, crash</strong> \u2013 in both macOS 10.15 and iOS 13: RunningBoard.</p></blockquote>\n<p>Unexpected termination. Yep. To you and me? Crashing. At this point in the story I&#8217;m going to elide several hours of long, tedious, and yet still somehow fun work, wherein I disabled System Integrity Protection on my Mac, so that I could attach to the pertitent system daemons and try to make sense of how, and when, they might decide to unilaterally terminate an app like MarsEdit. While digging deeper into the issue, I remembered that &#8220;explanation&#8221; from the log, CacheDeleteAppContainerCaches, and it reminded me of system maintenance software like <a href=\"https://cleanmymac.com\">CleanMyMac</a>. I normally shy away from these kinds of apps because they are historically known to be overly-aggressive in what they decide to delete. In the name of science, however, I decided to run it, with care, on my Mac.</p>\n<p>Boom! After running CleanMyMac once, MarsEdit, along with Numbers, were suddenly not running anymore. I had finally reproduced the issue on my own Mac for the first time. Anybody who has fixed software bugs, either for a living or as a passion, knows this is the critical first step to really addressing an issue. With some tinkering, I was able to narrow down the reproduction steps to running the &#8220;Free Up Purgeable Space&#8221; action. It turns out this is invokes a system API responsible for trying to delete caches, etc., from a Mac. Normally the system only does this when disk space is critically low, but CleanMyMac gives you the option to exercise the behavior at any time.</p>\n<p>That single log line quoted above turns out to hold another gem of information. The &#8220;code:0xBADDD15C&#8221; looks like it could be an arbitrary hexadecimal value, but it&#8217;s an example of an error code designed to both uniquely identify and suggest a mnemonic clue to the underlying issue. Apple <a href=\"https://developer.apple.com/documentation/xcode/understanding-the-exception-types-in-a-crash-report\">documents many of these codes</a>, which include 0xc00010ff (cool off), 0xdead10cc (deadlock), and 0xbaadca11 (bad call). I searched the system frameworks for this code and found it in the disassembly of &#8220;/System/Library/PrivateFrameworks/CacheDelete.framework&#8221;. Particularly, in an internal function called &#8220;assert_group_cache_deletion&#8221;. It was only after exploring the issue in the forums, did <a href=\"https://developer.apple.com/forums/thread/707643?answerId=717746022#717746022\">Quinn explain</a> that the code in this scenario is a mnemonic for &#8220;bad disk&#8221;. I guess it was easier to spell out than trying to represent &#8220;full disk&#8221;.</p>\n<p>Equipped with all this new information, what can we do about the unexpected terminations? Well, nothing. I do wish Apple&#8217;s framework would try <em>asking nicely</em> if the app would quit, before summarily terminating it, but I guess the thinking is that this functionality should typically only be reached in extenuating circumstances. After learning more about the issue, I confirmed with Manton that his Mac <em>did have low disk space</em>, so I guess it was just the system trying its best to free up space that caused the issue for him.</p>\n<p>The one thing I plan and hope to do as followup is to amend my built-in crash reporter so that it will not prompt the user or report a crash when the app terminates for this reason. I think it should be possible to detect the codes alluded to above, and simply let &#8220;0xBADDD15C&#8221; terminations happen without fanfare.</p>\n",
            "date_published": "2022-06-18T11:55:17-04:00",
            "date_modified": "2022-06-18T12:08:21-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2022/04/19/netnewswire-6-1-for-mac-subscribe-to-feed/",
            "url": "https://bitsplitting.org/2022/04/19/netnewswire-6-1-for-mac-subscribe-to-feed/",
            "title": "NetNewsWire 6.1 for Mac: Subscribe to Feed",
            "content_html": "<p>Nearly ten years ago, inspired by Apple&#8217;s removal of the &#8220;RSS&#8221; button from Safari 6, I released a standalone Safari extension called <a href=\"https://redsweater.com/blog/2624/subscribe-to-feed-safari-extension\">Subscribe to Feed</a>. The extension simply replaced the functionality of having an easy way to subscribe to the RSS feed of any web site you might be viewing.</p>\n<p>This worked great for many years, until Apple&#8217;s ever-increasing security controls changed the behavior of Safari extensions such that they couldn&#8217;t call out to desktop apps (such as a news reader) without requiring approval from the user <em>each and every time</em>. This made the process of subscribing to a feed more cumbersome, albeit still easier than manually searching for the feed URL, copying, and pasting it into an RSS reader app.</p>\n<p>When Brent Simmons <a href=\"https://inessential.com/2019/08/26/netnewswire_5_0_now_available\">resurrected NetNewsWire</a>, I saw it as a perfect opportunity to carry on the mission of the Subscribe to Feed extension. Native applications on the Mac can offer Safari app extensions that extend the browser in ways that are similar to traditional web browser extensions, but which are not subject to the same tedious security restrictions. The idea is that if the user knowingly installs an app <em>and</em> then enables the corresponding extension, they are probably happy to have its functionality performed without warning.</p>\n<p>I implemented a simple version of Subscribe to Feed within NetNewsWire a few years ago, but held off on &#8220;announcing it&#8221; per se, because I was waiting for some pieces to fall together so that I could endorse it as a fully-functional replacement for the old Subscribe to Feed extension. One of my main criteria was that the extension should be useful to people <em>even if they don&#8217;t use NetNewsWire</em>.</p>\n<p>With the <a href=\"https://nnw.ranchero.com/2022/04/16/netnewswire-for-mac.html\">release of NetNewsWire 6.1</a>, the app now has a preference for the Safari extensions so you can choose whether to open feeds in NetNewsWire itself, or <em>in the default news reader</em>.</p>\n<p>So if you are a fan of another RSS app that doesn&#8217;t have its own Safari extension, you can simply install NetNewsWire 6.1, configure the Safari extension to open feeds in your default app, and enjoy the full functionality of the &#8220;Subscribe to Feed&#8221; extension without ever launching NetNewsWire again. Though you might as well give it another look since it&#8217;s there &#8230;</p>\n",
            "date_published": "2022-04-19T13:35:00-04:00",
            "date_modified": "2022-04-19T13:41:50-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2021/11/01/the-talk-show-327-giddy-with-mac-ness/",
            "url": "https://bitsplitting.org/2021/11/01/the-talk-show-327-giddy-with-mac-ness/",
            "title": "The Talk Show 327: Giddy with Mac-ness",
            "content_html": "<p>I had a blast chatting with John Gruber on the <a href=\"https://daringfireball.net/thetalkshow/2021/10/31/ep-327\">latest episode of The Talk Show</a>. The timing worked out perfectly for us to abandon our usual jaded attitudes and just fully dote on the new MacBook Pros.</p>\n",
            "date_published": "2021-11-01T09:13:19-04:00",
            "date_modified": "2021-11-01T09:13:19-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2020/09/19/three-podcasts-and-a-blog/",
            "url": "https://bitsplitting.org/2020/09/19/three-podcasts-and-a-blog/",
            "title": "Three Podcasts and a Blog",
            "content_html": "<p>I&#8217;ve been wanting to create my own crossword puzzles since I was a kid, but never quite got around to it. Earlier this year I decided to renew my commitment, and tweeted a bold claim:</p>\n<blockquote class=\"twitter-tweet\">\n<p lang=\"en\" dir=\"ltr\">Mark my words: within 3 months I&#39;m going to publish my first self-constructed crossword puzzle, and within 3 years I&#39;m going to have one published in the New York Times.</p>\n<p>&mdash; Daniel Jalkut (@danielpunkass) <a href=\"https://twitter.com/danielpunkass/status/1265072881563848705?ref_src=twsrc%5Etfw\">May 26, 2020</a></p></blockquote>\n<p> <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script></p>\n<p>Let&#8217;s see, June, July, August. Yup, I missed that target. But FOUR months later, I&#8217;m ready to catch up, and share the very first puzzle I&#8217;ve ever completed. I call it &#8220;Three Podcasts and a Blog&#8221; because I set out to build a puzzle around the &#8220;theme&#8221; of names of podcasts in the Apple developer/technophile scene. Only after I was almost done with the puzzle did I realize I&#8217;d included one blog that, in fact, has no podcasting counterpart. You&#8217;ll see the clue marked &#8220;oops!&#8221;</p>\n<p>If you want to solve the puzzle, I encourage you to download and use my own Mac app, <a href=\"https://red-sweater.com/blackink/\">Black Ink</a>. If you don&#8217;t have a Mac or would prefer to solve on paper, I&#8217;m also including a PDF so you can download and print it:</p>\n<p><a href=\"https://bitsplitting.org/wp-content/uploads/2020/09/ThreePodcasts-2.puz\" title=\"Three Podcasts Across Lite\">Download Across Lite Puzzle</a></p>\n<p></a></p>\n<p><a href=\"https://bitsplitting.org/wp-content/uploads/2020/09/ThreePodcasts.pdf\" title=\"Three Podcasts PDF\">Download PDF Puzzle</a></p>\n<p>Seeing as this was my first foray into the art of puzzle-crafting, I&#8217;m sure there will be lots of issues with the puzzle. Hopefully it&#8217;s still fun, especially for folks who are acquainted with Apple-related podcasts and blogs. Let me know what you think!</p>\n",
            "date_published": "2020-09-19T18:40:31-04:00",
            "date_modified": "2020-09-19T19:00:56-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2020/02/07/apple-news-encourages-frequent-blogging/",
            "url": "https://bitsplitting.org/2020/02/07/apple-news-encourages-frequent-blogging/",
            "title": "Apple News Encourages Frequent Blogging",
            "content_html": "<p>When <a href=\"https://www.apple.com/apple-news/\">Apple News</a> debuted, I was intrigued to learn that virtually anybody <a href=\"https://www.icloud.com/newspublisher/\">can submit their own blogs</a> for inclusion in the service. Why not allow Bitsplitting, the <a href=\"http://red-sweater.com/blog/\">Red Sweater Blog</a>, and <a href=\"https://indiestack.com\">Indie Stack</a> to be part of this service? For reader who enjoy Apple News, it could serve as a kind of substitute RSS reader.</p>\n<p>Apple did, in fact, accept my news sources, and for the past several years these articles have been available through the service.</p>\n<p>I guess I&#8217;ve dropped the ball a bit as a blogger, though, because this week I received a terse email from Apple:</p>\n<blockquote>\n<p>Dear Daniel Jalkut,</p>\n<p>We noticed that you have not published to your Bitsplitting channel in three months or more. Your channel will be removed in one week.</p>\n<p>Regards,<br />\nThe Apple News Team</p>\n</blockquote>\n<p>Regards, indeed. Apple will drop me in one week if I don&#8217;t publish something, or maybe even if I do; the wording is ambiguous. I&#8217;m a little annoyed at this, but I&#8217;m also a little annoyed at myself for not blogging more frequently, so I guess I&#8217;ll just say: &#8220;thanks, Apple News!&#8221;</p>\n<p><strong>Update:</strong> Manton Reece <a href=\"https://micro.blog/manton/8208097\">notes on Micro.blog</a> that there may be a less encouraging rationale for Apple&#8217;s crackdown on inactive publications:</p>\n<blockquote><p>\n@danielpunkass If you hadn&#8217;t heard, Apple News dropped RSS support for new blogs, and it sounds like they rarely approve personal blogs anymore. Weeding out inactive blogs could be the first step to removing them altogether.\n</p></blockquote>\n",
            "date_published": "2020-02-07T10:05:14-05:00",
            "date_modified": "2020-02-07T10:40:29-05:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2019/10/05/catalinas-custom-keyboard-viewers/",
            "url": "https://bitsplitting.org/2019/10/05/catalinas-custom-keyboard-viewers/",
            "title": "Catalina&#8217;s Custom Keyboard Viewers",
            "content_html": "<p>Long-time Mac users will remember an app called &#8220;Key Caps&#8221;, which later become &#8220;Keyboard Viewer&#8221;, a feature of the Mac that is now accessible via the menu bar&#8217;s &#8220;Input Methods&#8221; item. If you&#8217;ve never played with this, I encourage you to enable it and check it out. Apple has <a href=\"https://support.apple.com/guide/mac-help/use-the-keyboard-viewer-on-mac-mchlp1015/mac\">detailed instructions</a> for configuring the menu and these options.</p>\n<p>I don&#8217;t use the Keyboard Viewer often, but when I do, it&#8217;s a real life-saver. I brought it up recently while I was debugging an issue with keyboard shortcuts in <a href=\"https://red-sweater.com/fastscripts/\">FastScripts</a>, my scripting utility app. The Keyboard Viewer not only reflects every bona fide keystroke you make on a hardware keyboard, but also allows you to simulate keystrokes by tapping on the keys of the on-screen keyboard.</p>\n<p>On macOS 10.15 Catalina, Apple has evidently dramatically overhauled the Keyboard Viewer. I don&#8217;t see any hint of this on the Apple <a href=\"https://www.apple.com/macos/catalina/features/\">marketing sheet</a> for the OS, but this is what the Keyboard Viewer looks like on my Mac now:</p>\n<p><img decoding=\"async\" src=\"https://bitsplitting.org/wp-content/uploads/2019/10/DefaultKeyboard-1.png\" alt=\"NewImage\" title=\"DefaultKeyboard.png\" border=\"0\" width=\"600\" /></p>\n<p>Well, isn&#8217;t that spiffy? But what I really want to talk about is that little Gear Button in the upper right corner of the window. Click it, and this what you get:</p>\n<p><img decoding=\"async\" src=\"https://bitsplitting.org/wp-content/uploads/2019/10/KeyboardPopup.png\" alt=\"Popup menu with various options for customizing keyboards\" title=\"KeyboardPopup.png\" border=\"0\" width=\"277\" height=\"323\" /></p>\n<p>A whole slew of options for tweaking the behavior of the virtual keyboard, and an enticing &#8220;Customize&#8230;&#8221; item at the bottom. When you select it, a dedicated application called &#8220;Panel Editor&#8221; opens up. It&#8217;s essentialy a construction set for building virtual keyboard layouts:</p>\n<p><img decoding=\"async\" src=\"https://bitsplitting.org/wp-content/uploads/2019/10/BitsplittingKeyboard.png\" alt=\"Custom keyboard editor with silly bitsplitting.org keyboard layout\" title=\"BitsplittingKeyboard.png\" border=\"0\" /></p>\n<p>This example is obviously comical, but the point is you can create and layout tappable regions that correspond to whatever keystrokes you desire. The options for configuring these keys even include options to perform multiple keystrokes, open apps, run scripts, etc. It&#8217;s a powerhouse of utility superpowers.</p>\n<p><strong>How did they possibly find time to add all this great functionality in one OS upgrade? They didn&#8217;t.</strong> Folks who are familiar with Apple&#8217;s Accessibility Keyboard have no-doubt recognized my screenshots as being familiar from past OS releases. I personally had never seen it before, but it&#8217;s been hiding in the System Preferences Accessibility tab. What happened in macOS 10.15 Catalina is that Apple has evidently recognized its superiority in all ways to &#8220;Keyboard Viewer&#8221; and allowed the Accessibility Keyboard to simply take its place.</p>\n<p>This is an excellent example of software being designed to assist people with specific needs, yet <em>actually being useful to everybody</em>. That is the heart of accessible software design, and I think we&#8217;ll see more and more &#8220;accessible&#8221; software released from the relative obscurity of the Accessibility tab as we move forward.</p>\n",
            "date_published": "2019-10-05T12:26:15-04:00",
            "date_modified": "2019-10-05T13:39:25-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2019/07/22/a-real-gatekeeper/",
            "url": "https://bitsplitting.org/2019/07/22/a-real-gatekeeper/",
            "title": "A Real Gatekeeper",
            "content_html": "<p><aside><strong>Update:</strong> Since I first published this article, feedback from folks at Apple who should know has led me to believe the issue is not as dire as I laid it out below. The crude &#8220;contracts need to be signed&#8221; error message may be returned for any account type that has not yet agreed to the latest &#8220;Apple Developer Program License Agreement.&#8221; While this contract could change, and require an updated agreement, it seems less likely to change as frequently as the App Store agreement. I believe it was a mistake for me to assume that shipping apps with Developer ID + notarization would require agreeing to &#8220;App Store&#8221; contracts.<br />\n</aside>\n<hr />\n<p>In the years since Apple released the iPhone, with its &#8220;locked-down-by-nature&#8221; approach to application security, the company has progressively chipped away at the freedoms Mac developers have historically had to do, more or less, whatever the heck they wanted.</p>\n<p>With the introduction of the Mac Application Sandbox in 2012, Apple applied an iOS-like mechanism through which applications are entitled only to access their own data, and must explicitly request permission from Apple to access any resources &#8220;outside of their own sandbox.&#8221; At the time, I wrote that while the technology was promising, <a href=\"https://red-sweater.com/blog/2324/fix-the-sandbox\">it left much to be desired</a>.</p>\n<p>Around the same time, they introduced Developer ID, a system for certifying at runtime that a given piece of software has been cryptographically signed by a developer whose identity is known to Apple. Applications that are not signed with Developer ID are allowed to run in macOS, but by default are met with a foreboding warning about the safety of doing so. The component of macOS that is responsible for limiting the launch of software from unknown developers is called &#8220;Gatekeeper.&#8221;</p>\n<p>Last year, in 2018, Apple introduced a new <a href=\"https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution\">notarization service</a>, an expansion of Developer ID functionality. Developers submit their applications to Apple, where they are scanned for known malware, and have their use of specific system technologies vetted. The &#8220;notarization&#8221; on an app allows the system to verify at runtime that a given application passes a baseline safety metric for downloaded software.</p>\n<p>Finally, in 2019, Apple announced that software signed with Developer ID certificates, that is to say all non-Mac App Store software, must also be notarized. The Catalina 10.15 public beta identifies software that has not been notarized as potentially risky because it &#8220;cannot be scanned for malware.&#8221;</p>\n<p>In effect: developers who ship software directly to end-users are now required to notarize their apps.</p>\n<p>While working on the notarization process for my own apps, and a company I work for, I noticed an interesting error from &#8220;altool&#8221;, the command line program that is used to submit binaries to Apple for verification:</p>\n<pre>\n1 package(s) were not uploaded because they had problems:\nError Messages:\nTo use this application, you must first sign in to \niTunes Connect and sign the relevant contracts. (1048)\n</pre>\n<p>The error is easily worked around by logging in to App Store Connect and agreeing to any updates Apple has recently made to their contracts. I&#8217;m so used to more-or-less blindly agreeing to these changes, that it didn&#8217;t sink in for me at first what a potentially major change this is.</p>\n<p>My colleague <a href=\"http://www.hieper.nl\">Patrick Machielse</a> noticed right away what the larger implication is: all Mac software, inside or outside of the Mac App Store, can now be held up by unsigned contract agreements with Apple. In a rush to fix a horrible bug and get it out to customers? Better review that new contract ASAP.</p>\n<p>For the past 35 years, any Mac developer who wanted to ship an update directly to customers could do so by recompiling a binary and distributing it. When macOS 10.15 ships this fall, the status quo will change. Mac developers must register with Apple and sign their products. They must submit their binaries to Apple for notarization. And most significantly of all, they must agree to the terms of Apple&#8217;s App Store developer contracts, even if they don&#8217;t distribute their apps through the App Store.</p>\n",
            "date_published": "2019-07-22T15:44:30-04:00",
            "date_modified": "2019-07-22T23:58:37-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2019/05/24/unloved-patches/",
            "url": "https://bitsplitting.org/2019/05/24/unloved-patches/",
            "title": "Unloved Patches",
            "content_html": "<p>For a long time I have admired the <a href=\"https://wordpress.org\">WordPress</a> project, for developing such a robust blogging platform that is ultimately open, and free, and anybody can contribute improvements to it. I encourage many of my customers to use WordPress with <a href=\"https://red-sweater.com/marsedit/\">MarsEdit</a>, because it seems like a &#8220;safe bet&#8221; going forward.</p>\n<p>My admiration has diminished a bit in the past 7 months because &#8230; I haven&#8217;t succeeded in contributing to it.</p>\n<p>For a long time, I heard reports from my customers that dates were being set wrong in posts to WordPress. The issue in summary is that if you have a draft post on WordPress, changing its status to &#8220;Published&#8221; doesn&#8217;t update the publish date from the time the draft was originally saved.</p>\n<p>I didn&#8217;t really get a handle on this problem until it started affecting me. Sometimes I write the show notes for my podcast, <a href=\"https://coreint.org\">Core Intuition</a>, ahead of the time the podcast actually goes public. In these situations, the blog post has a published date corresponding to the time I first starting writing the post, and when we finally go to publish the podcast, the date remains the same.</p>\n<p>I did the hard work of not only diagnosing the problem in WordPress&#8217;s source code, but also writing a fix, and writing unit tests to confirm the fix. I filed a bug with a patch that will fix the problem for my customers, and any other clients of the WordPress API:</p>\n<p><a href=\"https://core.trac.wordpress.org/ticket/45322\">#45322: Editing a draft post with wp.editPost causes its published date to be set</a></p>\n<p>Shortly after filing the bug, I went to the <a href=\"https://make.wordpress.org/chat/\">WordPress Slack</a> to see what I could do about having my fixes integrated. I was lucky to have a positive response from a couple members of the WordPress team, and my bug fix seemed slated for integration.</p>\n<p>Time passed. I wondered. I didn&#8217;t want to nag the hard-working members of the team, but I also didn&#8217;t want <em>my hard work</em> to have been for naught. Also, my customers, as well as other clients of the WordPress API, would benefit from this.</p>\n<p>It&#8217;s been on my TODO list for 7 months now to &#8220;check in&#8221; with the WordPress team about this. Unfortunately, every time I do, the only thing I&#8217;ve noticed is that nobody substantially responds to my inquiries. I&#8217;m in the dead zone.</p>\n<p>I don&#8217;t think the WordPress team is bad, by any means, but I think this reflects a problem in their process. When somebody comes to your project with a well-thought-out, unit-tested fix, and is met by radio silence? The chances are high that they will never come back again. I have submitted WordPress patches in the past, but after this experience I don&#8217;t know if I will bother submitting them again. That&#8217;s a big change in my perspective on how the WordPress team works, and on how it should work.</p>\n<p>This post is about WordPress, but I think there are lessons for every open source project. Obviously, you can&#8217;t coddle every contributor. Some submissions will be bogus, some will be contrary to the aims of the project. But mine was a clear fix to a defect that affects multiple clients of the API. If it&#8217;s not a clear fix, I&#8217;m at least owed an explanation for why it hasn&#8217;t been committed after 7 months. In. My. Humble. Opinion.</p>\n",
            "date_published": "2019-05-24T17:31:37-04:00",
            "date_modified": "2019-05-24T21:36:46-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2019/05/24/blog-a-little/",
            "url": "https://bitsplitting.org/2019/05/24/blog-a-little/",
            "title": "Blog a Little",
            "content_html": "<p>Over on Twitter today, I was inspired to ask people to write &#8220;just one blog post&#8221; today:</p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p lang=\"en\" dir=\"ltr\">Everybody, join me in writing just one blog post today, to get that independent feeling back. <a href=\"https://t.co/bDFpxiVfqO\">https://t.co/bDFpxiVfqO</a></p>\n<p>&mdash; Daniel Jalkut (@danielpunkass) <a href=\"https://twitter.com/danielpunkass/status/1131915132794286080?ref_src=twsrc%5Etfw\">May 24, 2019</a></p></blockquote>\n<p> <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script> </p>\n<p>Later, it occurred to me that after 10+ years on Twitter, I am privileged to have a substantial following. I thought I would take the opportunity to help promote some folks who don&#8217;t have as much immediate reach:</p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p lang=\"en\" dir=\"ltr\">Did you write a blog post TODAY? Tweet it to me within then next hour, and if it&#39;s not offensive, I will retweet it. Long live the indie/open web!</p>\n<p>&mdash; Daniel Jalkut (@danielpunkass) <a href=\"https://twitter.com/danielpunkass/status/1132003318493065216?ref_src=twsrc%5Etfw\">May 24, 2019</a></p></blockquote>\n<p> <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script> </p>\n<p>I tagged all my retweets to those responses with <a href=\"https://twitter.com/hashtag/LongLiveTheOpenWeb?src=hash\">#LongLiveTheOpenWeb</a>. I think it turned out to be a pretty cool cross-section of bloggers, and I sort of editorialized the kind of blogging that people were doing.</p>\n<p>I think people neglect to write blog posts because the feedback loop is not as tangible as the onslaught of (sometimes mechanical) likes or faves that you can receive on a social network. With blogging, you need a little faith that you will gain an audience. And on the open web, you never know who might come along and expand your audience.</p>\n",
            "date_published": "2019-05-24T16:51:01-04:00",
            "date_modified": "2019-05-24T16:51:01-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2019/05/24/the-mac-open-web/",
            "url": "https://bitsplitting.org/2019/05/24/the-mac-open-web/",
            "title": "The Mac Open Web",
            "content_html": "<p>These days, as the giant social networks behave more and more reprehensibly, many people are looking back to the &#8220;good old days&#8221; of the web, when self-published blogs were the primary means of sharing one&#8217;s thoughts.</p>\n<p>Brian Warren has taken this enthusiasm, and combined it with his nostalgia for another classic resource: the links page. He&#8217;s created a new one called <a href=\"https://macopenweb.com\">Mac Open Web</a>:</p>\n<blockquote><p>A collection of open and indie Mac, iOS, and web apps that help promote the open web.</p></blockquote>\n<p>The solitary page is jam-packed with links to resources for creating and perusing content on &#8220;the open web,&#8221; that is to say &#8220;the web.&#8221; If you&#8217;re sick of Facebook and Twitter owning your experience of what is still a hugely diverse and free global network, then spend some time investing in writing and reading on the web &#8220;the way we used to do it.&#8221;</p>\n",
            "date_published": "2019-05-24T09:24:26-04:00",
            "date_modified": "2019-05-24T09:24:26-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2018/11/15/mac-sandboxing-privileged-file-operations/",
            "url": "https://bitsplitting.org/2018/11/15/mac-sandboxing-privileged-file-operations/",
            "title": "Mac Sandboxing: Privileged File Operations",
            "content_html": "<p>At WWDC 2018, Apple announced with great fanfare that two beloved Mac apps, <a href=\"https://panic.com/transmit/\">Transmit</a> and <a href=\"http://www.barebones.com/products/bbedit/index.html\">BBEdit</a>, would be returning to the Mac App Store.</p>\n<p>Each of these apps had departed the App Store years ago, citing various reasons, but chief among them the limitations of the Mac App Sandbox, which restricts the functionality of apps in the Mac App Store.</p>\n<p>I was curious whether Apple made any specific concessions to these developers, and whether those concessions would be opened up to &#8220;the rest of us&#8221; or not.</p>\n<p>Today, Panic launched <a href=\"https://itunes.apple.com/us/app/transmit-5/id1436522307?mt=12\">Transmit 5 on the Mac App Store</a>. It&#8217;s a free download, and costs $24.99/year after an initial 7-day free trial.</p>\n<p>I downloaded Transmit even though I own a copy of the direct-purchase version. I wanted an answer to my question, which I got, at least partially, by dumping the application binary&#8217;s &#8220;entitlements&#8221;, which represent the sandboxing exceptions that the app has received.</p>\n<p>New to me among the entitlements is &#8220;com.apple.developer.security.privileged-file-operations&#8221;, which is a boolean value set to true for Transmit. I don&#8217;t see any Google results for this key, so I&#8217;m assuming it&#8217;s something new that was added for Panic (and maybe BBEdit), and which may or may not be documented in the future for use by other developers.</p>\n<p>Another interesting entitlement is &#8220;com.apple.security.automation.apple-events&#8221;, which is <a href=\"https://developer.apple.com/documentation/security/com_apple_security_automation_apple-events?language=objc\">documented by Apple</a>, but only in the context of the new &#8220;Hardened Runtime.&#8221; This technology is aimed primarily at developers who are not developing for the Mac App Store, but who want to provide enhanced security for their customers. In that context, I believe this entitlement provides unfettered access to sending AppleEvents, excepting that in Mojave and later the app is still subject to fine-grained system alerts that require user approval for each application that is targeted.</p>\n<p>In short: it appears that Transmit possesses at least two &#8220;official&#8221; entitlements that could be made available, or are perhaps already available, to other developers. One way to find out: add them to your app and submit it for approval!</p>\n<p><strong>Update:</strong> Thanks to Jeff Nadeau for <a href=\"https://twitter.com/jnadeau/status/1063179321987149824\">alerting me</a> to the pertinent API that correlates with the privileged file operations entitlement. <a href=\"https://developer.apple.com/documentation/appkit/nsworkspaceauthorization?language=objc\">NSWorkspaceAuthorization</a> can be used to request privileged file access from the user, and Apple includes a link for <a href=\"https://developer.apple.com/go/?id=workspace-authorization\">requesting access</a> to the entitlement.</p>\n<p><strong>Update 2:</strong> It turns out my intrigue around &#8220;com.apple.security.automation.apple-events&#8221; was ill-founded. I assumed that a sandboxed app could use this entitlement to gain unfettered access to automating other apps, but in the case of a sandboxed app it turns out to work in conjunction with the existing &#8220;com.apple.security.temporary-exception.apple-events&#8221; entitlement, which requires enumeration of specific targets. Thanks to <a href=\"https://twitter.com/lapcatsoftware/status/1063186635603542017\">Jeff Johnson</a> and <a href=\"https://twitter.com/pfandrade_/status/1063189048443973634\">Paolo Andrade</a> for talking me through my misunderstanding of the situation.</p>\n",
            "date_published": "2018-11-15T15:57:21-05:00",
            "date_modified": "2018-11-15T17:46:04-05:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        },
        {
            "id": "https://bitsplitting.org/2018/10/05/terminal-security-profiles/",
            "url": "https://bitsplitting.org/2018/10/05/terminal-security-profiles/",
            "title": "Terminal Security Profiles",
            "content_html": "<p>In macOS Mojave, Apple introduced a number of new security features that impact the day-to-day use of the computer. Activities such as running scripts, or using apps that access private information, are altered now such that users are prompted with one-time permission-granting requests.</p>\n<p>One consequence of these changes is that you can no longer access certain parts of your home directory from the Terminal. Don&#8217;t believe me? Try opening Applications > Utilities > Terminal, and run the following command:</p>\n<pre>\nls ~/Library/Mail\n</pre>\n<p>In all previous macOS releases, this would list the contents of Apple&#8217;s internal Mail files. As a privacy enhancement, access to these files is now restricted unless apps have requested or been proactively granted access.</p>\n<p>If you really wanted to regain access to these files via the Terminal, you have to grant the app &#8220;Full Disk Access.&#8221; This is a new section of the Security &#038; Privacy pane in System Preferences.</p>\n<p>Well, that&#8217;s fine. Now you can &#8220;ls&#8221; anything in your home folder, but <em>absolutely every other thing you run in Terminal</em> can as well. To grant myself the ability to list files in ~/Library/Mail, am I willing to grant the same access to every single thing I&#8217;ll ever run in Terminal?</p>\n<p>This isn&#8217;t earth-shattering: it&#8217;s been the case forever that tools you run in the Terminal have access to &#8220;all your files.&#8221; But the new restrictions in macOS Mojave shine a light on a problem: the bluntness of security restrictions and relaxations with regard to Terminal.</p>\n<p>I&#8217;ve run into a variation of this problem in the past. I use the excellent <a href=\"https://www.tripmode.ch\">TripMode</a> to limit bandwidth usage when I&#8217;m traveling, and tethered to my phone. A consequence of this is that, unless I grant unlimited network access to Terminal, I can&#8217;t perform routine tasks such as pushing <a href=\"https://git-scm.com\">git</a> changes to a server.</p>\n<p>Ideally these permission grants would be applicable at the <em>tool level</em>, rather than at the application level. It would be better if I could say &#8220;let ls access my Mail&#8221; rather than &#8220;let anything I run from Terminal access my Mail.&#8221;</p>\n<p>I don&#8217;t completely understand the limitations there, but I suspect that because commands in the Terminal are running as subprocesses of Terminal, there is some technical challenge to making the permissions apply at such a fine-grained level.</p>\n<p>As an alternative, I wonder if Apple could introduce some kind of &#8220;Security Profiles&#8221; feature for Terminal so that individual windows within the app could be run when different permissions? This could build on Terminal&#8217;s existing support for &#8220;Profiles&#8221; which already support varying Terminal settings dramatically on a per-window basis.</p>\n<p>With Security Profiles, a user would be configure an arbitrary number of named profiles, and security privileges acquired by Terminal would be stored separately for the active profile. Each profile would be considered by the system effectively as a different app. For example, given my uses of Terminal, I might set up a few profiles for the types of work I regularly do:</p>\n<ul>\n<li><strong>Personal</strong>: Everyday productivity tasks including running scripts, editing files in my home directory, etc.</li>\n<li><strong>Administrative</strong>: Tasks that pertain to the overall maintenance of my Mac: examining system logs, delving into configuration files, etc.</li>\n<li><strong>Collaborative</strong>: Tasks that involve installing and running third-party tools that I trust, committing to shared source repositories, etc.</li>\n<li><strong>Experimental</strong>: Tasks that involve installing or running third-party tools that I am not familiar with and do not have a high degree of faith in.</li>\n</ul>\n<p>These are off the top of my head, and just to give an idea of the kinds of profiles that might make sense here. Switching between these modes would also switch the system&#8217;s active list of entitlements for Terminal. If I run a script that accesses my Calendar items from the &#8220;Personal&#8221; profile, the system would prompt me once to ask my permission, but never prompt me again <em>in that profile.</em>  When I switch to &#8220;Experimental&#8221; and run some unfamiliar third-party tool that tries to access my calendar, it would ask permission again for that profile.</p>\n<p>I filed Radar #45042684: &#8220;Support a finer-grained permissions model for Terminal&#8221;, requesting access for this or something like it.</p>\n",
            "date_published": "2018-10-05T11:52:20-04:00",
            "date_modified": "2018-10-05T12:08:54-04:00",
            "author": {
                "name": "Daniel Jalkut"
            }
        }
    ]
}