{"id":56525,"date":"2025-03-27T09:50:18","date_gmt":"2025-03-27T12:50:18","guid":{"rendered":"https:\/\/manualdousuario.net\/?p=56525"},"modified":"2025-04-08T08:18:47","modified_gmt":"2025-04-08T11:18:47","slug":"vibe-coding","status":"publish","type":"post","link":"https:\/\/manualdousuario.net\/en\/vibe-coding\/","title":{"rendered":"Vibe coding on Apple Shortcuts"},"content":{"rendered":"<p>With progress on large language models (LLMs) stalling, techbros in the industry have had to come up with new ways to signal progress and keep billions of investors\u2019 dollars flowing while \u201cartificial general intelligence\u201d (sic) remains nowhere in sight.<\/p>\n<p>This led to the emergence of nonsense such as the new \u201cmagic\u201d version of ChatGPT that\u2019s supposedly great at \u201ccreative writing,\u201d autonomous \u201cagents,\u201d and more models that can \u201cthink\u201d or \u201creason.\u201d (All in quotes because these simulations are, at best, mediocre and often non-functional.)<\/p>\n<p>Amid the parade of new applications for generative AI, \u201cvibe coding\u201d emerged \u2014 a term coined in February by Andrej Karpathy, co-founder of OpenAI.<\/p>\n<p>In broad terms, vibe coding is a complete abstraction of software development. Instead of writing\u2026 code, the developer writes prompts in natural language to an AI, describing the software it hopes to achieve. The AI then spits out code which, if it doesn\u2019t meet expectations, is reworked in the same way: with more natural language instructions given to the AI. In this setup, the developer essentially becomes a guesser. In the end \u2014 and with some luck \u2014 the session wraps up with a working application.<\/p>\n<p>Programming is a powerful skill, even outside contexts like startups and world-changing ideas.<\/p>\n<p><!--more-->I love this 2020 post by Robin Sloan: <a href=\"https:\/\/www.robinsloan.com\/notes\/home-cooked-app\/\">\u201cAn app can be a home-cooked meal.\u201d<\/a> It encapsulates and perfectly illustrates the idea of using software for simpler, more limited purposes; an app for your family, a routine that streamlines specific tasks at work, or even a more sophisticated Excel spreadsheet. It\u2019s the antithesis of corporate software, full of arbitrary incentives and objectives that often clash with what users (you and I) expect. Above all, it can be both fun and deeply satisfying.<\/p>\n<p>That said, it\u2019s not that I\u2019m against vibe coding. On the contrary, I\u2019m not. The issue is that it promises a lot, and that promise doesn\u2019t hold up \u2014 something <a href=\"https:\/\/pivot-to-ai.com\/2025\/03\/18\/guys-im-under-attack-ai-vibe-coding-in-the-wild\/\">a guy recently discovered<\/a> after buying into the idea and creating a SaaS with Cursor, an AI-powered editor that claimed to built its software with \u201czero hand written code,\u201d only to go public in a panic two days later. \u201cguys, I\u2019m under attack\u2026 random thing are (sic) happening.\u201d<\/p>\n<p>In just two days, vibe coding can turn into a real bad trip.<\/p>\n<p>&#42;&#42;&#42;<\/p>\n<p>Writing about technology sometimes puts me in an awkward spot. I can write in English, but not code; and when I write about code in English, it leads some people to mistakenly assume that I know how to write code.<\/p>\n<p>I don\u2019t know how to code. I understand a bit of logic and can do simple things, like tweaking the layout of this site by fiddling with simple languages like HTML and CSS, and even dabbling superficially with JavaScript and PHP. I don&#8217;t get much beyond that. It\u2019s a shame. There are plenty of tasks in everyday life that, if I knew the basics of an accessible language like Python or Go, I might be able to create.<\/p>\n<p>That\u2019s why I really like Apple\u2019s Shortcuts app. It\u2019s an easy automation tool for the uninitiated yet powerful for those in the know \u2014 in other words, it&#8217;s for people like me.<\/p>\n<p>I have about a dozen shortcuts that I use daily on my computer to speed up repetitive tasks.<\/p>\n<p>The oldest and most-used shortcut converts text written in Markdown (a markup language for formatting text) into HTML (another markup language, the universal language of the web, read by browsers).<\/p>\n<p>Before diving into Shortcuts, I used a couple of shell scripts built on pandoc. They work, of course. The advantage of Shortcuts is a more flexible workflow. Instead of copying the text, opening the terminal, and running the command, I set up a keyboard shortcut in Shortcuts (how meta is that?): I select the text, press <kbd>Command + Shift + D<\/kbd>, and ta-da!, my converted HTML text goes straight to the clipboard.<\/p>\n<p>Another neat trick that I find really useful: <kbd>Command + Shift + X<\/kbd> counts the words and characters of the selected text.<\/p>\n<figure id=\"attachment_56527\" aria-describedby=\"caption-attachment-56527\" style=\"width: 1440px\" class=\"wp-caption alignnone\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/manualdousuario.net\/wp-content\/uploads\/2025\/03\/atalho-markdown-html.png\" alt=\"Screenshot of a shortcut, from the Shortcuts app, showing the steps to convert text from Markdown to HTML.\" width=\"1440\" height=\"877\" class=\"size-full wp-image-56527\" \/><figcaption id=\"caption-attachment-56527\" class=\"wp-caption-text\">Shortcut that converts text from Markdown to HTML. Image: Manual do Usu\u00e1rio.<\/figcaption><\/figure>\n<p>As you can see in the screenshot above, these shortcuts are simple \u2014 they\u2019re built visually by dragging blocks (\u201cactions,\u201d as Apple calls them) into a logical sequence.<\/p>\n<p>The real power of Shortcuts comes through when dealing with more complex tasks. For instance, running shell scripts within a shortcut.<\/p>\n<p>One I\u2019ve been using compresses (or \u201cminifies\u201d) the theme\u2019s stylesheet for my WordPress, Portuguese-written blog, which helps the site load faster at the expense of code readability. To get the best of both worlds, I keep a normal file (<code>style.css<\/code>) and then minify it (<code>style.min.css<\/code>) before sending it back to the server.<\/p>\n<p>For a long time, I used a web app to do this. It wasn\u2019t the most time \u2014 consuming process, but it could be faster.<\/p>\n<p>I discovered a package called <a href=\"https:\/\/github.com\/tdewolff\/minify\">Minify<\/a> that does the job in the terminal. After installing it, I created a shortcut to enjoy the benefits of Shortcuts, like having an option in the context menu and in macOS&#8217;s Spotlight.<\/p>\n<p>I also have one that downloads videos from sites like YouTube with the help of <a href=\"https:\/\/github.com\/yt-dlp\/yt-dlp\">yt-dlp<\/a>. It\u2019s much better than using those ad-riddled sites.<\/p>\n<p>My latest adventure was accessing the Buttondown API via Shortcuts\u2014a concept that came to me after reading the post <a href=\"https:\/\/buttondown.com\/blog\/newsletter-api-for-beginners\">\u201cHow (and Why) Non-Technical People Should Learn to Use an API.\u201d<\/a> (Hey, that\u2019s me!)<\/p>\n<p>Whenever someone becomes a paying subscriber to my pt_BR blog, I add a tag to their record in Buttondown so they receive a welcome message with subscription instructions and start getting subscriber-exclusive emails.<\/p>\n<p>You can probably guess what I did, right? Instead of logging onto the site, searching for the new subscriber\u2019s email, and manually tagging them clicking around with my mouse, I just run the shortcut and answer a few questions \u2014 what\u2019s the email? What tags should be added? What\u2019s their name? The subscription amount? The payment method?<\/p>\n<figure id=\"attachment_56528\" aria-describedby=\"caption-attachment-56528\" style=\"width: 1440px\" class=\"wp-caption alignnone\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/manualdousuario.net\/wp-content\/uploads\/2025\/03\/atalho-buttondown-api.png\" alt=\"Shortcut of the homonymous Apple app that makes use of the Buttondown API.\" width=\"1440\" height=\"989\" class=\"size-full wp-image-56528\" \/><figcaption id=\"caption-attachment-56528\" class=\"wp-caption-text\">It&#8217;s pretty much a mini-app. Image: Manual do Usu\u00e1rio.<\/figcaption><\/figure>\n<p>&#42;&#42;&#42;<\/p>\n<p>I imagine that the audience for Shortcuts is relatively small. Apple, despite the merit of offering something like this, doesn\u2019t really devote a lot of attention to it. With every major OS update, random things break, and those who use the app more intensively <a href=\"https:\/\/www.reddit.com\/r\/shortcuts\/comments\/109qkwt\/is_it_just_me_or_is_shortcuts_very_broken\/\">often complain<\/a> about this neglect.<\/p>\n<p>Still, Shortcuts serves as a kind of missing link between non-programmers and programmers \u2014 a facilitator for various tasks much like Excel is in the corporate world.<\/p>\n<p>Creating little programs that solve everyday problems \u2014 whether through vibe coding or using Shortcuts \u2014 is empowering, as long as your expectations aren\u2019t too high. Overly inflated expectations always lead to frustration. You\u2019re not going to build a SaaS or a company on something cobbled together with spit and duct tape, or an app made in ChatGPT. Not even close. But you can definitely create some really cool and useful stuff, and who knows \u2014 it might just spark the idea for even bolder, higher-flying projects.<\/p>\n<p>This reflection inspired by vibe coding and Shortcuts also makes me question the need to disclose the AI helping when it&#8217;s just a means to an end rather than the goal itself.<\/p>\n<p>A poem or even an article like this one is an end in itself: the benefit (be it utility, pleasure, distraction, or whatever) comes from the reading experience. An app or even a structured text, like a corporate financial report, is just a means. If AI can help achieving it, so be it.<\/p>\n<p>Just as I don\u2019t include a disclaimer about using macOS\u2019s spell checker in every text I post here, there\u2019s no need to reveal that a piece of software was developed with some help from AI. Sure, you can if you want. What I\u2019m questioning is the moral imperative to be transparent about it \u2014 that getting caught using ChatGPT to write a JavaScript function is somehow an ethical sin.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Amid the parade of new applications for generative AI, \u201cvibe coding\u201d emerged \u2014 a term coined in February 2025 by Andrej Karpathy, co-founder of OpenAI.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"episode_type":"","audio_file":"","podmotor_file_id":"","podmotor_episode_id":"","cover_image":"","cover_image_id":"","duration":"","filesize":"","filesize_raw":"","date_recorded":"","explicit":"","block":"","itunes_episode_number":"","itunes_title":"","itunes_season_number":"","itunes_episode_type":"","_locale":"en_US","_original_post":""},"categories":[1575],"tags":[1818,1833],"_links":{"self":[{"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/posts\/56525"}],"collection":[{"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/comments?post=56525"}],"version-history":[{"count":3,"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/posts\/56525\/revisions"}],"predecessor-version":[{"id":56530,"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/posts\/56525\/revisions\/56530"}],"wp:attachment":[{"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/media?parent=56525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/categories?post=56525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualdousuario.net\/wp-json\/wp\/v2\/tags?post=56525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}