My Podcasting Setup - Recording Software

Part of the My Podcasting Workflows series

I’ve talked about the hardware I use for podcasting, but what about the other tools of the trade? Obviously the first step to creating a podcast is to record one, and in my case, that’s all about software.

The Company You Keep

If there’s one name podcasters who use Macs tend to be very familiar with, it’s Rogue Amoeba. I don’t know if Rogue Amoeba set out to be the go-to people for podcasting on the Mac, but they’ve certainly achieved it. For me, all of their software is indispensable, but there’s one application in particular that you pretty much have to have – Audio Hijack.

Audio Hijack

Audio Hijack bills itself as the “Record Any Audio” application, and that’s exactly what it is. If there’s an app on your Mac that makes noise, Audio Hijack can record it.1

The beauty of Audio Hijack is that it sets up audio recording chains that can include effects, noise removal, peak limiting, and more, and it allows for granular control over whether audio sources get combined into a track or each record their own separate tracks. Each specific setup like this can be saved as a session, so you can always have a session appropriate to whatever kind of recording you want to do.

For example, here’s my Friends with Brews Audio Hijack session.

Friends with Brews Audio Hijack Session

This session records my mic, which comes in through an Elgato Wave XLR interface, increases the volume, denoises, and ramps down the treble a little bit, because I have a nasally voice.

It also records my soundboard, which is provided courtesy of another Rogue Amoeba app called Farrago, and saves that to its own track.

Finally, it records whatever VOIP app I’m using for the podcast as a backup recording of my co-host(s). Peter and I use FaceTime to talk to each other for Friends with Brews, unless our friend Adam Bell is on, and then we use Zoom.

The VOIP call recording is strictly a backup. We each record our own end locally for the best sound and I combine those tracks in my editor, a process I’ll describe in a separate post sometime soon.

Audio Hijack is very versatile in terms of output file format and quality, and also in terms of file naming.

As I mentioned, you can save recording configurations as sessions. Here are all of my currently saved Audio Hijack sessions for recording various podcasts and Mac apps. Episode 18 of Friends with Brews wasn’t really the last time Adam was on the podcast and we used zoom (it was episode 39, I think) but apparently I forgot to rename that session. Anyway, you get the idea.

Audio Hijack Session List

Farrago

I mentioned Farrago earlier. Farrago is an amazing soundboard application that lets you store, perform minor edits on, and trigger audio sound clips – in other words, it’s a soundboard!

Farrago is how I play the “Friends? With BREWS?!” clip at the beginning of every podcast, as well as the “Hi, Peter!” and other clips that I like to annoy people with during various podcasts. I have a TON of Farrago sets with sounds from all kinds of stuff.

Vic Hudson and I used to do tv show related podcasts for BubbleSort TV, and those sound clips came in super handy. We’d usually set up sections of the podcast by playing clips from specific scenes, which really added to the shows. It also means they’re inserted live into the recordings (although we made sure they were on their own tracks for easier audio leveling and editing reasons) so they wouldn’t have to be edited in later, AND so the co-host could hear them and we’d both be on the same page about the conversation to follow.

Farrago Sound Sets

By the way, if you guessed that I recorded every single one of those tv show and movie clips using Audio Hijack, you’re correct!

Loopback

”But Scott!” you say. “Just because you’re playing a sound clip in Farrago on your Mac doesn’t mean your cohosts can automatically hear them, does it?!?” Great question. The answer is no. No, it does not. Enter Loopback.

Because you’re such a doggone great guesser, maybe you surmised that Loopback is Yet. Another. App. By. Rogue Amoeba.

YES! IT IS! And it’s amazing, so back off! It’s not my fault they make all the best podcasting and audio routing and recording related software for the Mac!

Loopback does a lot of things, but simply put, it lets you combine audio sources into one or to pass audio from one application to another. The first use case is how my co-hosts can hear my soundboard – I have a Loopback device that combines my mic with Farrago. I can then set THAT as the input to my VOIP app of choice, such as FaceTime or Zoom or Skype, and then everyone on the other end(s) of the call can hear my soundboard coming from me exactly the same as they can hear me talking.

This Loopback device looks a lot like this – in fact, exactly like this:

Loopback Device with Mic and Farrago

Usually, even though each app can have its own inputs and outputs separate from the system settings, I just set my system settings to the output I want (my Elgato Wave XLR, which my podcasting headphones are plugged into) and the input that I want (my Loopback input source that combines my mic and Farrago).

SoundSource System Audio Settings

Then I set my VOIP app de jour to use system settings for input and output.

FaceTime Video and Audio Settings

And, So

And THAT, my friends, is over 1000 words on software that I use to record the podcast. It’s not complete, because I have a few helper utilities that prepare the way, as John Siracusa might say, but I’ll save those for another post.

So topics you have to look forward to in this series in the future are helper utility apps that prepare the way for recording, apps I use during the editing process, what exactly my editing process actually entails, and finally, how I get all that published and ready for YOU to listen to, in the case of Friends with Brews especially.

You can bet on it. But maybe you shouldn’t. Just saying. Never bet unless the outcome is already certain. And then always only bet a dollar.

Footnotes

  1. It can actually even record apps that don’t make noise, but that’s probably an exercise best reserved for the metaphysicians of the world.

The Push I Needed to Implement Link Posts

Part of the Astro series

Thanks entirely to Tiffany White, I finally implemented something that’s been on my site to-do list for some time, but that I’ve never gotten around to actually doing until now: link posts.

You’ve seen link posts before, certainly so if you read a lot of Mac related blogs like Daring Fireball, SixColors, or MacStories. The idea is the title of the post links to an article on another site, and then you add some commentary and maybe quote part of the article in your post.

A link post on SixColors

Tiffany created an issue on my site repo asking if I’d setup link post support in Astro yet. I had it on my to-do list, namely in my Obsidian kanban board for this site, but I hadn’t done it yet because I haven’t really wanted to link to too many external articles here. But Tiffany creating an issue for me gave me the motivation to figure out how I would do it.

In order to add the URL that the post title should link to, I decided to add a front matter item called link:

---
title: "How to use Raycast and how it compares to Spotlight and Alfred"
description: Raycast compared to Spotlight and Alfred.
date: "2023-07-28T09:00:00-08:00"
link: "https://www.theverge.com/23170431/raycast-how-to-macos-search-extensions-alfred-spotlight"
keywords: ["mac", "raycast", "apps", "utility", "alfred", "spotlight"]
slug: "raycast"
---

Because I’m using Astro Content Collections, I also needed to add this to my collection schema. Not all posts will have a link front matter item, so it needs to be optional.

src/content/config.ts
import { z, defineCollection } from "astro:content";
export const collections = {
posts: defineCollection({
schema: z.object({
title: z.string(),
description: z.string(),
link: z.string().optional(),
date: z.string().transform((str) => new Date(str)),
keywords: z.string().array(),
}),
}),
};

Zod allows for optional entries, so links is defined as a z.string().optional().

The Astro Code for Link Post Titles

The rest of the work is done in a new component for creating the blog post title called PostTitle.astro.

src/components/PostTitle.astro
---
import config from "config";
import { Icon } from "astro-icon/components";
import path from "path";
import { titleCase } from "./utilities/StringFormat.js";
const { post } = Astro.props;
---
<a
href={post.data.link
? post.data.link
: new URL(
path.join(config.get("posts.path"), post.slug),
config.get("url"),
)}
>
{post.data.link ? <Icon name="ion:ios-link" /> : ""}
{titleCase(post.data.title)}
</a>
<style>
[data-icon] {
width: 1em;
margin-bottom: -0.3rem;
}
</style>

I check for the existence of the link front matter value in two places: one for creating the href for the post title, and the other to decide whether or not to show the link icon next to the post title indicating that this is a link post.

If post.data.link exists, I use that as the href for the title link, otherwise I use the url of my blog post as the href so that my blog post links to itself as usual.

Now in my Post.astro component which creates the blog post layout, I call my PostTitle component instead of just creating the title in Post.astro itself.

src/components/Post.astro
---
import type { CollectionEntry } from "astro:content";
import config from "config";
import { Icon } from "astro-icon/components";
import path from "path";
import { postdate } from "../components/utilities/DateFormat.js";
import PostTitle from "./PostTitle.astro";
interface Props {
post: CollectionEntry<"posts">;
}
const { post } = Astro.props;
const { Content } = await post.render();
---
<article>
<header>
<h1>
<PostTitle post={post} />
</h1>
<div class="time">
<Icon name="bi:calendar2-week-fill" />
<time datetime={post.data.date}>
<a
href={new URL(
path.join(config.get("posts.path"), post.slug),
config.get("url"),
)}
>
{postdate(post.data.date)}
</a>
</time>
</div>
</header>
<Content />
</article>

This is the result:

A link post on scottwillsey.com

Before implementing PostTitle to create link post titles when appropriate, I just created the title directly in Post.astro with the following:

<!-- old way of creating post title -->
<a
href={new URL(
path.join(config.get("posts.path"), post.slug),
config.get("url"),
)}
>
{titleCase(post.data.title)}
</a>

As you can see, it’s just a subset of what’s now in PostTitle.astro, namely just the portion that assumes the post title should just link back to the post itself. But you can see how easy it was to go from that to the new PostTitle component that can handle both link posts and regular posts.

Improvements

That’s it! There are still some improvements to be made. Besides just showing the link icon next to the title of a link post, I probably want to change the color of the title slightly and maybe change the post background color very subtly to indicate that it’s not just the usual site post.

I also plan to make quote sections a little more stylish by adding some nice quote marks around them to offset them just a little bit more than they already are.

How to Use Raycast and How It Compares to Spotlight and Alfred

Raycast

Part of the Raycast series

I’m linking to a year-old article on The Verge because I just started using Raycast today. Prior to this, I was using Alfred. I was leery of Raycast because of the subscription model for pro features as well as concern over privacy issues, but it incorporates so much of what I was using other menubar apps for in addition to Alfred that it won me over in less than an hour of testing.

Typing Window into Raycast gives you a whole host of commands that let you manage the shape and size of the app you’re currently using. You can maximize it, set it to cover the left half of the screen, make it smaller, and more. There’s also a built-in notes app for jotting down quick thoughts into a floating window. There’s even a command built into Raycast that makes a shower of confetti appear on your screen.

This was a big one for me. I have tried several different window managers and JUST switched from Lasso to Moom yesterday before discovering today that I could customize Raycast’s window functions to do all this for me in a much nicer way.

So far, I’m sold on Raycast.

My Podcasting Setup – the Hardware

Part of the My Podcasting Workflows series

My friend Donnie Adams asked me on Mastodon if I’ve ever written anything about my podcasting setup and recording and editing workflow. The answer is… I don’t think so. Even if I did, whatever I wrote is out of date and not online anymore anyway. So in 2023, here’s my basic podcasting setup hardware.

My computer desk with MacBook Pro, Studio Monitor, and accessories

Mic

Mics are very subjective, and a mic that works well for one voice might not work well for others. In addition, the type of mic you get should also suit your recording environment. Many a relatively inexpensive condenser mic has been the go-to mic de jour for beginning podcasters, and condensers are not good for noisy environments. You need a quiet, non-echo-ey room for a condenser mic.

My mic is the Shure Beta 87A. I like the fact that it has the benefits of a condenser mic while also having good drop-off so that it doesn’t pick up every spec of dust hitting something somewhere in outer space.1

My Shure Beta 87A

Personally I don’t recommend USB mics and I don’t recommend most of the mics marketed towards podcasters. Don’t get a Yeti. Don’t get a Snowball. Don’t get a Rode Podcaster or Procaster.2

Regardless of what mic you use, learn how it works in terms of proximity effect and positioning, use a pop filter and preferably a boom arm, and don’t bump it or move it while recording. Also find a way to mute the mic for when you need to clear your throat or make other noises. Depending on who’s doing your editing, you may find all that in the episode if you’re not careful.3

Mic Stand

The best stand for a mic is a boom arm, which keeps the mic off the desk, isolates it from bumps and vibrations, and makes it easy to position where you need it to get the best sound for your recording.

I think I’m currently using an Innogear mic stand. I’m not sure because I ordered a couple around the same time, one for me and one for my daughter. This is the nicer looking of the two in my order history, so that’s the one I’ll point out.

In the past I’ve had some bigger, heavier duty ones, but anything that can hold a 3 lbs or so will be fine.

Audio Interface

If you’re using an XLR mic and not a USB one, which is my recommendation, you’ll need an audio interface. Believe it or not, for podcasting or streaming, I’m not going to recommend some traditional interface with lots of knobs and features. I’m recommending the relatively inexpensive Elgato Wave XLR.

With a capacitive touch-to-mute function, plenty of gain, software settings including clipping prevention and other effects, this is a great value for the price. Previously I used a Tascam US-2x2, and I can’t be happier that I ditched it for the Elgato. It’s just nicer to use for podcasting and has plenty of clean gain.

If you do in-person recording with a co-host, you may need an interface with multiple mic inputs. If not, the Elgato Wave XLR is perfect for podcasting.

My Elgato Wave XLR audio interface

Computer

My computer is a 14” 2021 MacBook Pro M1 Pro with 16 GB of RAM, a 1TB SSD, 10 core CPU, and 16 core GPU. Those memory, SSD, and CPU/GPU specs are the absolute minimum I would ever go with, but for the money this is by far the most amazing computer I’ve ever owned. It eats giant number-crunching chores for breakfast and never gets hot. The only time I can warm it up even remotely is when generating transcripts of podcast episodes with MacWhisper.

My 14" 2021 MacBook Pro M1 Pro

When I have 5 or 6 tracks of audio in Logic Pro, all split up with silences stripped, it can get really slow to respond to selections and movements, especially for longer episodes. I attribute this to the 16GB of RAM. Previously I had 32GB in my iMac, but that was because I could add and remove RAM with ease. That’s obviously not the case with the MacBook Pro, so go for as much as you can afford.

I absolutely love the 14” form factor, by the way. I was tempted to go larger but this Mac is the nicest combination of size and utility I’ve ever had in a laptop. You get very good edge to edge use of the screen, it’s high resolution, and it has the most beautiful monitor Apple makes, in my opinion. It’s simply lovely to use for hours on end.

Monitor

My external monitor is the Apple Studio Display. There’s not much to say about it. It’s beautiful and big and it hangs on an Ergotech Heavy Duty Freedom Arm VESA mount.

Before the current MacBook Pro, I had a 5k 27” iMac and this display is very much like that one except it has more usable area and it doesn’t have the huge chin and the giant foot hanging off it. I had it mounted on the same VESA arm the Studio Display is on, but the Studio Display is lighter and doesn’t jiggle when I type like the iMac wanted to do sometimes.

Look, I don’t know why PCs continue to have such horrendous monitors (especially the built-in laptop screens) and trick people into thinking 4k is amazing, but the 5k Apple Studio Display quality is the minimum I’ll accept for an external monitor.

Keyboard

I love my clacky keyboard. It’s a Keychron K2 wireless (but I run it wired) with an Artifact Bloom Series Ocean Wave Keycap Set from Drop.com. I have some other custom keycaps but I love the blue of these, especially with the keyboard set to a light blue backlight.

My Keychron K2 with Ocean Wave keycap set

Mouse and Trackpad

It’s really important to stress this – you don’t have to use the horrible Apple mouse. Yes, yes, I know, and I tried to like it too. But it’s ergonomically disastrous and it’s functionally stupid.

My mouse is the Logitech M720 Triathlon bluetooth mouse, and I love it.

In order to keep the ability to use macOS gestures, I also have an Apple Magic Trackpad in white, and I love that too.

The mouse sits to the right of the keyboard and the trackpad to the left.

USB/Thunderbolt Hub

Docking the Mac and having it connect to all my accessories is simple. I have the CalDigit Thunderbolt 4 Element Hub. It’s got all the bandwidth needed for the Apple Studio Display with 4 Thunderbolt 4/USB4 ports and 4 USB-A ports. The same single connector that connects all my devices to my MacBook Pro also powers the computer so I don’t even have to bust out the MagSafe.

For the price, I think it’s one of the best out there. You could get a TS4 if you really want to go nuts, but I couldn’t quite justify it.

Standing Desk

My standing desk is a FLEXISPOT 55 x 28 Inches Standing Desk with electrical height adjustment motor. It’s black, it has lots of space, and it’s clean underneath which allows easy mounting of hub mounts and cable management items. I do use it in standing configuration quite often, and almost always while podcasting.

That’s All, Folks

That’s pretty much it for my hardware. Next time I’ll get into software, and then later we can talk about workflows, editing processes, and other things that will help make your podcast excellent.

Footnotes

  1. That would be quite a feat since sound doesn’t travel in space.

  2. The Rode Podcaster and Procaster look tempting, but they have really muddy midrange. For voices like mine, they’re the absolute worst mic for way more money than is reasonable.

  3. If YOU are the editor, there’s no excuse for not editing that out. Anything that bothers you will definitely bother others, and a lot of things that don’t bother you will bother others.

Fastmarks and Safari Bookmark Descriptions

In my last post, I talked about the bizarre world of Safari bookmark descriptions and how to edit them, and I justified this weird tangent on my part by the fact that I want to use Fastmarks for searching for and opening bookmarks.

Fastmarks is a blazing fast, keyboard shortcut driven utility for searching bookmarks. And it’s stupendously quicker than accessing bookmarks any other way I’ve tried, including online services, even with integrated plugins and apps.

The problem I had though was that, as I mentioned last time, I intended to pseudo-tag my bookmarks by putting keywords in the bookmark descriptions. Safari supports bookmark descriptions, although it does its best to hide them. Sadly, I discovered that Fastmarks doesn’t use description data for searching bookmarks.

At least, it didn’t. Until I emailed the Fastmarks developer, Tyler Hall of Retina Studio, who promptly sent me a test build with descriptions indexed in Fastmarks along with the previously searched bookmark title and URL.

It’s glorious.

Now I can edit bookmark descriptions and throw some keywords in at the end, like this:

Safari bookmark description with my keywords added

And searching for any of those keywords will bring up the bookmark in my Fastmarks search results.

Fastmarks search for a keyword

By the way, not only is Tyler clearly a superior human based upon the utilities he codes, he also was super open and responsive to the idea of adding descriptions to the Fastmarks search index. Once again, an indie Mac developer shows what makes the Mac great - people who care about the platform and about user experience.

Editing Safari Bookmark Descriptions in macOS

Yesterday I learned about a really cool way to edit Safari bookmark descriptions in macOS. I understand this immediately opens up questions like “why would you want to?” and “why are you even using Safari bookmarks at all?“. I will answer those questions, but first let me show you how to edit Safari bookmark descriptions. 🙂

When you think of editing Safari bookmarks, you may immediately think of going to the Bookmarks menu and choosing “Edit Bookmarks” (or typing the Opt-Cmd-B keyboard shortcut to do the same thing). I did too, but this won’t let you edit bookmark descriptions. It will only let you edit bookmark names and URLs, as you can see in the image below.

Bookmarks Editor View

Instead, use the View menu and choose “Show Bookmarks in Sidebar” or type Ctrl-Cmd-1 to show your Safari bookmarks in normal bookmarks view. Double-click on a bookmarks folder, and you’ll see all of the bookmarks in the folder presented in mini-preview style with an image representation, name and description.

Bookmarks Folder Preview View

Here, you can right-click on any bookmark and choose to edit the name, the address, or the description.

Bookmark Edit Menu

Great! You can edit bookmark descriptions. So what? My answer to that is yet another convoluted Scott Willsey trail of starting at one point and winding up at entirely another.

Once upon a time, namely now, there existed a little private indie Mac app developer called Retina Studio. Retina Studio are the makers of a wonderful little app that I discovered somehow, maybe through Snazzy Labs, maybe not, called TextBuddy. TextBuddy is an amazing app and I highly recommend it, but it’s another app of Retina Studio’s that is the point of this bookmark conversation: Fastmarks, which I tried after purchasing TextBuddy.

Fastmarks is all about searching and opening your browser bookmarks quickly. Despite the fact that this post is about Safari bookmarks, Fastmarks can also search bookmarks from Chrome, Edge, Brave, and Firefox, as well as iCloud tab groups and Hookmark bookmarks. It’s keyboard shortcut driven, and it’s way faster than either Safari bookmarks or the solution I was using for bookmarks, Raindrop.io.

Searching bookmarks with Fastmarks

The downside to using browser bookmarks as opposed to something like Raindrop, though, is that Raindrop is all about categorization and organization. Yes, there are categories, but also tags, so that any given bookmark can fit across several topic domains, as makes sense. Also any description information you add is readily available while searching bookmarks in Raindrop.

I realized quickly that switching to Fastmarks and Safari bookmarks would mean losing tags, and I didn’t like that. In addition, although I could put bookmarks into category-like folders in Safari, Fastmarks doesn’t show or care about that. So basically in order to use Fastmarks, I not only have to rely on putting bookmarks in my browsers again, but I also lose my precious organizational metadata.

My solution, I thought, would be to just add keywords equivalent to tags to the bookmark descriptions. This is where the procedure above for editing Safari bookmark descriptions was to come in handy. And it did. It’s just that apparently Fastmarks doesn’t use the description metadata for search results.

Wah, wah, wah…

So now my current plan is to just add the keywords to the ends of my bookmark titles, in alphabetical order. In fact, if you look at the first image in this post closely, you’ll see I’ve already started that process. This will make it so I still get the incredible speed of Fastmarks, but also the increased likelihood of finding what I’m looking for that comes with tags and other extra metadata.

Fastmarks isn’t perfect – I really wish it would let me specify for it to match whole words from my search in any order instead of only matching in the order they appear in the bookmark name,1 and I wish I could use regular expressions to search bookmarks with – but it’s fast and I’m going to give it a proper try as my bookmark search solution.

Footnotes

  1. Fastmarks does have fuzzy searching, but it matches every character in a search and quickly becomes a problem of building a bigger haystack than with non-fuzzy searching.

Adding to Allowed Tags in Sanitize-Html

Part of the Astro series

Because I include full body text in my RSS feed, I use an html sanitizer called sanitize-html to sanitize, escape, and encode everything in the item body. One thing I didn’t realize until today is that by default, it strips out img tags. I knew that images were missing from my posts when viewed in RSS readers, but I thought this was due to me using relative URLs for them and not including the full URL including domain name. This may actually still matter, but it turns out my images never got that far, because sanitize-html was removing them whenever my RSS feed was rebuilt.

The good news is, there’s an easy way around this because sanitize-html provides an easy way to add tags to those allowed, and their documentation even includes the img tag example:

const clean = sanitizeHtml(dirty, {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]),
});

Here’s the entirety of my original Astro RSS template before I realized this:

src/pages/rss.xml.js
import rss from "@astrojs/rss";
import { getCollection } from "astro:content";
import sanitizeHtml from "sanitize-html";
import MarkdownIt from "markdown-it";
import config from "config";
import { rfc2822, year } from "../components/utilities/DateFormat";
import { globalImageUrls } from "../components/utilities/StringFormat";
const parser = new MarkdownIt();
export async function get(context) {
let posts = await getCollection("posts");
posts = posts.sort(
(a, b) => new Date(b.data.date).valueOf() - new Date(a.data.date).valueOf()
);
return rss({
title: config.get("title"),
description: config.get("description"),
site: context.site,
xmlns: {
atom: "http://www.w3.org/2005/Atom/",
dc: "http://purl.org/dc/elements/1.1/",
content: "http://purl.org/rss/1.0/modules/content/",
},
items: posts.map((post) => ({
title: post.data.title,
link: `${config.get("url")}${post.slug}`,
pubDate: rfc2822(post.data.date),
description: post.data.description,
content: sanitizeHtml(parser.render(post.body)),
})),
});
}

Fixing it is as easy as modifying the content section like this:

content: sanitizeHtml(parser.render(post.body), {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]),
});

In my case I run all this through yet another custom function called globalImageUrls, which just takes relative URLs from the post body and converts them to absolute urls including the domain:

content: globalImageUrls(
sanitizeHtml(parser.render(post.body), {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]),
})
),

That function is in a utility file called StringFormat.js and looks look this:

src/components/utilities/StringFormat.js
export function globalImageUrls(str) {
let baseUrl = config.get("url");
let regex =
/<img src="\/images\/([^"]+)\/([^"]+\.(?:jpg|jpeg|gif|png))"(?: alt="([^"]*)")?\s?\/?>/g;
return str
.replaceAll(regex, '<img src="' + baseUrl + '/images/$1/$2" alt="$3" />')
.replaceAll("//images", "/images");
}

Anyway, if you use sanitize-html be aware that this is its list of allowed tags by default:

allowedTags: [
"address", "article", "aside", "footer", "header", "h1", "h2", "h3", "h4",
"h5", "h6", "hgroup", "main", "nav", "section", "blockquote", "dd", "div",
"dl", "dt", "figcaption", "figure", "hr", "li", "main", "ol", "p", "pre",
"ul", "a", "abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn",
"em", "I", "kbd", "mark", "q", "rb", "rp", "rt", "rtc", "ruby", "s", "samp",
"small", "span", "strong", "sub", "sup", "time", "u", "var", "wbr", "caption",
"col", "colgroup", "table", "tbody", "td", "tfoot", "th", "thead", "tr"
],