More from Jim Nielsen’s Blog
Authentication on the web is a complicated problem. If you’re going to do it yourself, there’s a lot you have to take into consideration. But odds are, you’re building an app whose core offering has nothing to do with auth. You don’t care about auth. It’s an implementation detail. So rather than spend your precious time solving the problem of auth, you pay someone else to solve it. That’s the value of SaaS. What would be the point of paying for an authentication service, like workOS, then re-implementing auth on your own? They have dedicated teams working on that problem. It’s unlikely you’re going to do it better than them and still deliver on the product you’re building. There’s a parallel here, I think, to building stuff in the browser. Browsers provide lots of features to help you deliver good websites fast to an incredibly broad and diverse audience. Browser makers have teams of people who, day-in and day-out, are spending lots of time developing and optimizing new their offerings. So if you leverage what they offer you, that gives you an advantage because you don’t have to build it yourself. You could build it yourself. You could say “No thanks, I don’t want what you have. I’ll make my own.” But you don’t have to. And odds are, whatever you do build yourself, is not likely to be as fast as the highly-optimized subsystems you can tie together in the browser. And the best part? Unlike SasS, you don’t have to pay for what the browser offers you. And because you’re not paying, it can’t be turned off if you stop paying. @view-transition, for example, is a free API that’ll work forever. That’s a great deal. Are you taking advantage? Email · Mastodon · Bluesky
I have a standing desk that goes up and down via a manual crank. I’ve had it for probably ten years. Every time I raise or lower that thing, it gets my blood pumping. I often think: “I should upgrade to one of those standing desks that goes up and down with the push of a button.” Then there’s the other voice in my head: “Really? Are you so lazy you can’t put your snacks down, get out of your comfy chair, in your air conditioned room, and raise or lower your desk using a little elbow grease? That desk is just fine.” While writing this, I get out of my chair, star the timer, and raise my desk to standing position. 35 seconds. That’s the cost: 35 seconds, and an elevated heart rate. As I have many times over the last ten years, I recommit to keeping it — mostly as a reminder that it’s ok to do some things manually. Not everything in my life needs to be available to me at the push of a button. Email · Mastodon · Bluesky
(I present to you my stream of consciousness on the topic of casing as it applies to the web platform.) I’m reading about the new command and commandfor attributes — which I’m super excited about, declarative behavior invocation in HTML? YES PLEASE!! — and one thing that strikes me is the casing in these APIs. For example, the command attribute has a variety of values in HTML which correspond to APIs in JavaScript. The show-popover attribute value maps to .showPopover() in JavaScript. hide-popover maps to .hidePopover(), etc. So what we have is: lowercase in attribute names e.g. commandfor="..." kebab-case in attribute values e.g. show-popover camelCase for JS counterparts e.g. showPopover() After thinking about this a little more, I remember that HTML attributes names are case insensitive, so the browser will normalize them to lowercase during parsing. Given that, I suppose you could write commandFor="..." but it’s effectively the same. Ok, lowercase attribute names in HTML makes sense. The related popover attributes follow the same convention: popovertarget popovertargetaction And there are many other attribute names in HTML that are lowercase, e.g.: maxlength novalidate contenteditable autocomplete formenctype So that all makes sense. But wait, there are some attribute names with hyphens in them, like aria-label="..." and data-value="...". So why isn’t it command-for="..."? Well, upon further reflection, I suppose those attributes were named that way for extensibility’s sake: they are essentially wildcard attributes that represent a family of attributes that are all under the same namespace: aria-* and data-*. But wait, isn’t that an argument for doing popover-target and popover-target-action? Or command and command-for? But wait (I keep saying that) there are kebab-case attribute names in HTML — like http-equiv on the <meta> tag, or accept-charset on the form tag — but those seem more like legacy exceptions. It seems like the only answer here is: there is no rule. Naming is driven by convention and decisions are made on a case-by-case basis. But if I had to summarize, it would probably be that the default casing for new APIs tends to follow the rules I outlined at the start (and what’s reflected in the new command APIs): lowercase for HTML attributes names kebab-case for HTML attribute values camelCase for JS counterparts Let’s not even get into SVG attribute names We need one of those “bless this mess” signs that we can hang over the World Wide Web. Email · Mastodon · Bluesky
I’ve written previously about reloading a document using only HTML but that got me thinking: What are all the values you can put in an anchor tag’s href attribute? Well, I looked around. I found some things I already knew about, e.g. Link protocols like mailto:, tel:, sms: and javascript: which deal with specific ways of handling links. Protocol-relative links, e.g. href="//" Text fragments for linking to specific pieces of text on a page, e.g. href="#:~:text=foo" But I also found some things I didn’t know about (or only vaguely knew about) so I wrote them down in an attempt to remember them. href="#" Scrolls to the top of a document. I knew that. But I’m writing because #top will also scroll to the top if there isn’t another element with id="top" in the document. I didn’t know that. (Spec: “If decodedFragment is an ASCII case-insensitive match for the string top, then return the top of the document.”) href="" Reloads the current page, preserving the search string but removing the hash string (if present). URL href="" resolves to /path/ /path/ /path/#foo /path/ /path/?id=foo /path/?id=foo /path/?id=foo#bar /path/?id=foo href="." Reloads the current page, removing both the search and hash strings (if present). Note: If you’re using href="." as a link to the current page, ensure your URLs have a trailing slash or you may get surprising navigation behavior. The path is interpreted as a file, so "." resolves to the parent directory of the current location. URL href="." resolves to /path / /path#foo / /path?id=foo / /path/ /path/ /path/#foo /path/ /path/?id=foo /path/ /path/index.html /path/ href="?" Reloads the current page, removing both the search and hash strings (if present). However, it preserves the ? character. Note: Unlike href=".", trailing slashes don’t matter. The search parameters will be removed but the path will be preserved as-is. URL href="?" resolves to /path /path? /path#foo /path? /path?id=foo /path? /path?id=foo#bar /path? /index.html /index.html? href="data:" You can make links that navigate to data URLs. The super-readable version of this would be: <a href="data:text/plain,hello world"> View plain text data URL </a> But you probably want data: URLs to be encoded so you don’t get unexpected behavior, e.g. <a href="data:text/plain,hello%20world"> View plain text data URL </a> Go ahead and try it (FYI: may not work in your user agent). Here’s a plain-text file and an HTML file. href="video.mp4#t=10,20" Media fragments allow linking to specific parts of a media file, like audio or video. For example, video.mp4#t=10,20 links to a video. It starts play at 10 seconds, and stops it at 20 seconds. (Support is limited at the time of this writing.) See For Yourself I tested a lot of this stuff in the browser and via JS. I think I got all these right. Thanks to JavaScript’s URL constructor (and the ability to pass a base URL), I could programmatically explore how a lot of these href’s would resolve. Here’s a snippet of the test code I wrote. You can copy/paste this in your console and they should all pass 🤞 const assertions = [ // Preserves search string but strips hash // x -> { search: '?...', hash: '' } { href: '', location: '/path', resolves_to: '/path' }, { href: '', location: '/path/', resolves_to: '/path/' }, { href: '', location: '/path/#foo', resolves_to: '/path/' }, { href: '', location: '/path/?id=foo', resolves_to: '/path/?id=foo' }, { href: '', location: '/path/?id=foo#bar', resolves_to: '/path/?id=foo' }, // Strips search and hash strings // x -> { search: '', hash: '' } { href: '.', location: '/path', resolves_to: '/' }, { href: '.', location: `/path#foo`, resolves_to: `/` }, { href: '.', location: `/path?id=foo`, resolves_to: `/` }, { href: '.', location: `/path/`, resolves_to: `/path/` }, { href: '.', location: `/path/#foo`, resolves_to: `/path/` }, { href: '.', location: `/path/?id=foo`, resolves_to: `/path/` }, { href: '.', location: `/path/index.html`, resolves_to: `/path/` }, // Strips search parameters and hash string, // but preserves search delimeter (`?`) // x -> { search: '?', hash: '' } { href: '?', location: '/path', resolves_to: '/path?' }, { href: '?', location: '/path#foo', resolves_to: '/path?' }, { href: '?', location: '/path?id=foo', resolves_to: '/path?' }, { href: '?', location: '/path/', resolves_to: '/path/?' }, { href: '?', location: '/path/?id=foo#bar', resolves_to: '/path/?' }, { href: '?', location: '/index.html#foo', resolves_to: '/index.html?'} ]; const assertions_evaluated = assertions.map(({ href, location, resolves_to }) => { const domain = 'https://example.com'; const expected = new URL(href, domain + location).toString(); const received = new URL(domain + resolves_to).toString(); return { href, location, expected: expected.replace(domain, ''), received: received.replace(domain, ''), passed: expected === received }; }); console.table(assertions_evaluated); Email · Mastodon · Bluesky
After shipping my work transforming HTML with Netlify’s edge functions I realized I have a little bug: the order of the icons specified in the URL doesn’t match the order in which they are displayed on screen. Why’s this happening? I have a bunch of links in my HTML document, like this: <icon-list> <a href="/1/">…</a> <a href="/2/">…</a> <a href="/3/">…</a> <!-- 2000+ more --> </icon-list> I use html-rewriter in my edge function to strip out the HTML for icons not specified in the URL. So for a request to: /lookup?id=1&id=2 My HTML will be transformed like so: <icon-list> <!-- Parser keeps these two --> <a href="/1/">…</a> <a href="/2/">…</a> <!-- But removes this one --> <a href="/3/">…</a> </icon-list> Resulting in less HTML over the wire to the client. But what about the order of the IDs in the URL? What if the request is to: /lookup?id=2&id=1 Instead of: /lookup?id=1&id=2 In the source HTML document containing all the icons, they’re marked up in reverse chronological order. But the request for this page may specify a different order for icons in the URL. So how do I rewrite the HTML to match the URL’s ordering? The problem is that html-rewriter doesn’t give me a fully-parsed DOM to work with. I can’t do things like “move this node to the top” or “move this node to position x”. With html-rewriter, you only “see” each element as it streams past. Once it passes by, your chance at modifying it is gone. (It seems that’s just the way these edge function tools are designed to work, keeps them lean and performant and I can’t shoot myself in the foot). So how do I change the icon’s display order to match what’s in the URL if I can’t modify the order of the elements in the HTML? CSS to the rescue! Because my markup is just a bunch of <a> tags inside a custom element and I’m using CSS grid for layout, I can use the order property in CSS! All the IDs are in the URL, and their position as parameters has meaning, so I assign their ordering to each element as it passes by html-rewriter. Here’s some pseudo code: // Get all the IDs in the URL const ids = url.searchParams.getAll("id"); // Select all the icons in the HTML rewriter.on("icon-list a", { element: (element) => { // Get the ID const id = element.getAttribute('id'); // If it's in our list, set it's order // position from the URL if (ids.includes(id)) { const order = ids.indexOf(id); element.setAttribute( "style", `order: ${order}` ); // Otherwise, remove it } else { element.remove(); } }, }); Boom! I didn’t have to change the order in the source HTML document, but I can still get the displaying ordering to match what’s in the URL. I love shifty little workarounds like this! Email · Mastodon · Bluesky
More in literature
A time ago, I wrote a thing that felt like stumbling into a delightful discovery: On Foraging Mushrooms at Cheesman Park Sometimes I’ll amend a post, with updates from a later time, sometimes it’s easier to just make a separate part 2. Everything continues delightfully with picking them up from the grass I already walk around in regularly (frisbee, walking/scooting through or near the park). I’ve now encountered them far beyond {local park} I’ve now seen the same fruiting body in similar configurations in parks all around Denver. I’ll add a map screenshot. It feels like any time it rains even a little bit, and/or there is a bit of chilly weather (relative to the summer lately) or in many other conditions, these mushrooms will sprout. Anywhere there’s wood to metabolize. Mulch works, but it seems to particularly favor the root balls of long-gone trees, where there’s nothing above ground remaining. Sometimes I’ve made a guess and said “I think when it rains enough, mushrooms sprout right here: 👇” and it’s been correct. Other times I’ve simply noticed them in the grass along side of wherever I happen to be. Sometimes I see something that might be the caps in the distance, and i’ll go check and indeed, button mushrooms. Other times it’s a napkin. Improvements at cooking with 🍄 I’ve upped my bulk food prep game. I’ve always loved the instant pot, and now I have an even easier method. I could give it it’s own blog post, perhaps. I used to do a lot more chopping of things before steaming it into a meal in an instant pot. Then I’d use an immersion blender to blend it all together. Sometimes I’d use the blender before starting the instant pot, it all depended. Now I dump basically whole vegetables into the pot, washed but not cut (i’ll crack some things like carrots in my hands so they fit better), and cook it whatever amount of time the longest item needs. I might also cook soft stuff in, even the whole time (like dropping whole mushrooms into the pot before cooking everything for 50 minutes) or I’ll cook the whole thing slightly less (45 minutes), then open it up and add the ‘delicate stuff’ (like mushrooms, tomatoes, onion, garlic, still all whole or cut in half like once) and cook it 5 more minutes. Then everything gets spiced again, and then I use an immersion blender to blend/mix it all together. cooked Chickpeas can be added at the end after immersion blending to bring in some texture, ditto a few blocks of crumbled up tofu. If the tofu got a little sauté and tossed in the soup… damn. This method is much less work/time than it took before where i’d do more chopping/cubing of ingredients, sauté’ing some stuff before adding the bulk and cooking it. Sometimes the bottom of the contents would burn before the instant pot would get to pressure. So, this new method (whole plants placed loose into the container, some water, cook for as long as needed by the longest item (dry beans, squash) and then immersion blend. It’s all been excellent for me. ‘soy boy dinner’, some could call it. It’s conceptually similar (identical?) to beans/rice/sausage that I would cook for myself when I was a kid, and ate meat, but a bit more customized to my current personal preferences. I can make it delicious, and it makes a ton of food all at once. As always, I pour a big thing of olive oil over the whole thing when serving up in a bowl. An ongoing source of enjoyment and practical value I’ve now had exclusively fresh, free, delicious mushrooms from local parks now, for years, and feel reasonably changed by it. observation is a big part of curiosity, interest. Reading books by people who see some things so well and then write about it, of course changes ones own sense of observation. 1 I’m glad to have encountered cool books like this book about moss and this book about beavers, and this book about plants. I notice that if I’m doing my normal barefoot hill sprints thing, I can sometimes easily tell through my feet where I’ll find mushrooms. I continue to enjoy cooking with them, find them nourishing in all the normal ways, and of course stepping outside of capitalism is delightful. Bulk storage last year, ahead of the winter, after encountering surprisngly huge amounts of mushrooms, on a whim, I decided to try some bulk storage. the bulk storage I did for myself easily lasted through the winter, even though the winter was super dry. Turned out that mushrooms grew throughout the winter, especially in sunny spots, anytime there would be a bit of snow followed by warm-enough temps. So even after I opened my first bag of dried mushrooms that I stored in the freezer, I didn’t get very far through it before fresh mushrooms were popping up in the grass again and I’d go back to fresh mushrooms. The bag would go back in the freezer. Then I’d use up the fresh ones I got, go back to the dried ones. Last winter was very dry, but not super cold, so there were not many mushrooms growing throughout the winter, but again, I was surprised that there were any. Since last winter, I’ve made a few improvements to the process. I’ve gotten better at bulk storage. I’ll cook them at a lower temperature a bit longer in time (usually 220-240 f) and having a rack under them probably would make it go even better. I can pile them high on a baking sheet and turn them a few times: i’ll two sheets at a time, they can be condensed to a single sheet after the first bit of drying. Eventually, they’re fully dried and can be bagged and frozen. It takes a few hours. lower temperatures get closer to what a normal dehumidifier would do (140 degrees, maybe) but it takes too long for this large volume of mushrooms to get cooked down at that temperature. I finally got around to weighing the before and after weight of the mushrooms, and indeed the finished weight is exactly 10% of the pre-cook weight. The mass is about the same diminishment, so one can fit like three baking sheets of mushrooms, many pounds worth, into a small bag. In two stops at the park, I picked up enough mushrooms that, by the time I’d finished baking them down and storing in the freezer, I had enough mushrooms that I could not encounter another fresh mushroom at the park until next summer, and I wouldn’t bottom out the supply. two trips to the park, and I wasn’t even trying. I could have gotten 100 lbs of mushrooms both days, with just a few canvas bags. Here’s a photo. Up top is a container of about 2.5 pounds of mushrooms. The smallest of those bags contains the dried-out end result. The smallest bag has three containers worth of mushrooms in it. This represents perhaps 40 pounds of fresh mushrooms. Mushrooms contain every essential amino acid, and are as complete a protein as any animal flesh or excretion. I was still eating eggs for a while after I started eating mushrooms, and even after I began getting mushrooms for free. I noticed not liking that I was participating in the exploitation of animals (I’d been reducing my participation in it at a subconcious level for a time) but I was obviously paying for it every time I spent my own money on it. And ‘dairy’ and ‘eggs’ are the same as the rest. So any participation was close enough to full participation, and implied the correctness of the frame, which is low key ‘you/it/she low-key deserved what happened’, and it’s voluntary. There’s not even a health claim to be made for it. What I hope for you and mushrooms I want something for you, too. I write these things for me, sure, and even younger versions of me. I wonder where else around colorado these mushrooms grow. I suspect they may grow widely. and where besides colorado. If they grow widely like this, how many other people could slip a little of the shackles of human exploitation (capitalism) and entitlement to the exploitation of animals. and why not both-ish? at least the animals, but if one escapes a bit of capitalism, please certainly also have already freed other beings from your direct exploitation. (consuming individual animals, her excretions) what I hope for you and scooters This easy, whimsical, “oh look at me finding little fruits in the fairy circles as I prance about barefoot” energy is enabled entirely by a very particular vehicle. A scooter. 🛵 My scooter is very similar to this particular vehicle: HHH 200cc scooter Here’s a normal-enough vibe. I see something that looks like maybe mushrooms somewhere, pull the scooter up right next to them. I can ride my scooter directly to the mushroom, put the kickstand down, place the mushrooms inside the bag I store in my scooter bucket anyway, as if a basket of them had been dumped on the ground, hop back on the scooter, and take home the extra 2-20 lbs in the container I’d had in my scooter already. I can ride around anywhere easily with it, and never have to park it far from my destination. I love bicycles, truly, and yet I find denver to be too damn dangerous to use with a bicycle. Because of the entitlement of drivers, and ‘bad’/irresponsible/obedient-to-random-rules-from-supremacists road design, margins of safety and comfort just don’t quite work for me, getting around on a bicycle. I resent that, though. I loved the time of my life that I was using my bike a lot. And as soon as I got my first moped, I never rode that bike again. I’ll have another bike some day, and i’ll ride it, probably/maybe even around Denver, in some limited situations. But not at night, not if I needed to carry stuff, not if i’ll have to deal with cars/car traffic very much. buying scooters There’s been nice innovations in scooters in the USA recently! I got my scooter for $3200 in 2022 from a company based in Taiwan named Sym. Now in 2026 I’ve seen the same vehicle at the shop, also new, for $4400. On the other side of the strait of Taiwan are some quality manufacturers. One could get a similar version of the vehicle I have for $1600. It’ll show up in a week on a wood pallet, and all it needs is the front tire attached, and the handlebars attached. A friend got this scooter, it was super easy to put together. It costs more on HHH’s website directly, delivery is included. Amazon has it $400 cheaper, with a $400 delivery fee. Same either way. I was shocked at how easy the whole “buy a scooter off a website and assemble it” process was. Next time I’m getting a scooter, that’s what I’m going to do. To get my current scooter in the older way, I had to travel to a dealer in one vehicle, get dropped off, then drive the new other vehicle home. But having a brand new scooter dropped off at your house? amazing. And so cheap. It comes in a wood crate and uses metric bolts. I think most of the bolts on the crate (and handlebars) needed a 10mm socket and the front tire used a 17mm socket. A metric socket set like this is all one needs to do all the maintenance it’ll need, too. 2 Long ago I wrote a thing about scooters, since they’ve had such an impact on me, of course, how could I not, and then I could refer other folks to that page. I need to do a part 2. Any 125cc scooter from HHH also is great. One friend of mine has a 170cc scooter from them (the tank 200, obtained via facebook marketplace) and another friend has a 150 that is also lovely, obtained directly from HHH. The 150 size scooters have a 125cc engine, the 200 size scooters have a 170 cc engine. I don’t know why this is how it is. So, cheers to that. One of them gets to use the scooter now instead of an e-bike. One of them uses it instead of a regular car. Both are thrilled with the improvements. and if we all find it to be this way, maybe you will too. reducing car domination and capitalism and animal exploitation all at the same time? A scooter feels like an escape from car domination, and a way to obtain many interesting experiences (and to obtain instant free, ready-to-consume food). Foraging mushrooms feels like decapitalizing a certain portion of my food, and thus my life. Capitalism is so exploitative and coercive. How nice to reduce it’s footprint in my life. Speaking of exploitation and coercion… I cannot help think that people (me, I am people) could eat free mushrooms and replace any part of their diet that was animal flesh with mushrooms. (or tofu, or chickpeas, or store bought mushrooms, it doesn’t have to be foraged mushrooms obv), and in doing so doing escape participation in yet another exploitative system. I liked escaping capitalism via foraging, even when I was still participating in entitlement to animal exploitation. Now that I’ve Even without mushrooms, though, I would want for the same end result. The abundance of free mushrooms seems like a cool point to pass through on a stance towards the non-exploitation of animals, and a lesser exploitation of human animals (self and others). Resources The Light Eaters The Sexual Politics of Meat: A Feminist-Vegetarian Critical Theory Gathering Moss: A Natural and Cultural History of Mosses Foraging Mushrooms from Cheesman Park (part 1) Mycorrhizal Planet: How Symbiotic Fungi Work with Roots to Support Plant Health and Build Soil Fertility Footnotes after reading a book about moss I began carrying a pocket magnifying glass and guess what? the outside is even more interesting to me now. ↩ When I got my first scooter, and at first on my second scooter, I’d let the scooter dealer do the oil changes. Now I do them myself, for the same reason I cut my own hair. It’s so convenient to do it when I want, where I want, and I’m good/good enough at it. Sometimes I can do it in 10 minutes using a plastic container I fetch from my own trashcan. It takes exactly one container of oil (it’s like 957mil or something) and I pour the discard oil back into that same now-empty container, and drop the waste oil off at a mechanics shop when convenient. It took a while and was not as easy the first few times I did it as it is now. The only cost is a container of 10w-30 or 10w-40 oil which is usually $8 or so. And I began doing the transmission oil myself too, and belt and rollers. None of it felt trivial the first time I did it, but now I’m much better at it, and can do it in a pretty low-mess, clean, fast-enough way. I feel very independent and cost-effective, having a car-like vehicle that can go 55 mph, can carry multiple people, can carry stuff, but has a 1.5 gallon gas tank, weighs only 240 lbs, and I can do all of/most of the maintenance myself, as someone who doesn’t give a shit about cars and has always disliked dealing with stuff like that. I will do the brake pads myself for the first soon, too. There’s many youtube videos about how to do anything, and the vehicle is so simple even ‘big’ car maintenance tasks are simple with the scooter. ↩
If you take a scene from a horror movie and add funny music, the killer suddenly looks hilarious. Isn’t it strange that that happens?
Ridgeline subscribers — Hello! It’s me, Craig Mod. I’m doing an event with David Marx in Tokyo this Friday night (17th) at Tiger Mountain, a small, hip bookshop. The in-person tix are all sold out, but it will be livestreamed, and there are still tickets for that bit. It costs about seven bucks, and would make the small bookshop running it super happy to sell more tickets! (Although I realize the timezone difference is terrible for most readers …)
The golden window of tech may have expired. In 2010, I came across a video of Mick Jagger being interviewed (text version here). It was for a re-release of Exile on Main Street with 10 new tracks. During the interview he says this: But I have a take on that — people only made money out of records for a very, very small time. When The Rolling Stones started out, we didn’t make any money out of records because record companies wouldn’t pay you! They didn’t pay anyone! Then, there was a small period from 1970 to 1997, where people did get paid, and they got paid very handsomely and everyone made money. But now that period has gone. So if you look at the history of recorded music from 1900 to now, there was a 25-year period where artists did very well, but the rest of the time they didn’t. In 2009, I had just started to recover or find my footing from the dot-com bust and the 2008 recession. I wondered about the tech industry’s longevity and resilience then, having experienced my first taste of startup life from 2000-2002. After which, I did my best to navigate what it meant to be a maker on the internet, before it figured out how to make money. I certainly didn’t make any for a number of years. What Jagger said has stuck with me ever since. I often come back to this when I think about any industry or vocation — how long do people really make money doing a thing? Tech feels that way now, again — that for a decade or more, coming out of 2008, people started to make money hand over fist, and tech was rosy, optimistic and all blue skies. We believed we could shape a utopian future, but eventually extracting value came calling, and has always been at the core of capitalism. And tech is a capitalist endeavor. Today, streaming has lobotomized all earnings for musical artists, which has led to heavy touring schedules and lucrative reunions capitalizing on fanbases that have only become even more endeared to the artists of their youth or formative years. Audiences are willing to dole out hundreds of dollars to see their favorite artists perform for hours in an arena or venue. We’re at an inflection point again, facing a different kind of existential threat. The younger generation will chalk this up to how tech is today, while those of us with decades in this industry and the long view of experience have either accepted it, made good money from it and retired, or are fighting the good fight. Is that period gone for tech too? And if so, what’s the equivalent of touring? → This looks better on the web → Reply via email Thanks for reading and using RSS!
it’s been going well for me.