Thoropod: how to use it

Thoropod is a Mac app for people who love one podcast and want to know it inside out. You give it a feed, it downloads the episodes, transcribes them on your Mac with whisper.cpp, and asks an AI model to tag each episode along dimensions you define (hosts, guests, topics, recurring bits, whatever matters for that show). You then browse the podcast one tab per dimension, filter across them, and search every word ever said.

Everything stays on your Mac except the analysis step, which sends each transcript to the AI provider you choose (or to a local Ollama, which sends nothing anywhere).

First run

On the first launch Thoropod opens the Setup Wizard. Go through the wizard to set up a transcription model, a speaker detection model, an AI provider and network settings. You can run the wizard any time to change settings, or go right to the application settings.

Install

  1. Open the Thoropod-<version>.dmg and drag Thoropod to Applications.
  2. Thoropod needs macOS 15 or later and runs best on Apple silicon (transcription uses the GPU through Metal).
  3. The app will periodically check for updates.

The trial and the license

Thoropod works for 30 days from its first launch. You can analyze as many new shows as you want during the trial. After the trial period, you can continue to explore shows you've downloaded, but if you want to analyze new shows, or tweak your analysis, you'll need a license.

A license is a key from thoropod.com (THRP-XXXX-XXXX-XXXX-XXXX). Enter it in Settings › License (also Help › Enter License…). One license covers 20 Macs at a time, and up to 5 new ones a month; Release This Mac takes it off one so another can have its place.

First podcast

Click + in the sidebar (or File › Add Podcast…, ⌘N). The sheet opens on the podcasts people have shared at thoropod.com: every one of them transcribed and analyzed already, so the quickest way to see the possibilities is to start there. Podcasts from paid or members-only feeds are listed last, under Need your own subscription: their packages hold the transcripts and analyses but no feed address and no audio. These are really only useful if you have a subscription of your own. Just put your private feed URL in the feed settings of the podcast.

To analyze a podcast yourself, click Add Your Own Favorite…, paste the podcast's feed URL or its website (Thoropod finds the feed link on the page), and click Look Up. Options:

  • Title defaults to the feed's.
  • Private feed is for Patreon-style feeds whose URL contains your personal token. Thoropod never exports or shares that URL.
  • Keep audio files after transcribing. If you want to keep audio locally on your Mac. (a long-running show can take tens of gigabytes).
  • Store in picks the parent folder. Each podcast gets its own subfolder with its database, audio, transcripts, and analysis.

A Getting started strip under the podcast header walks through the next steps and disappears once the podcast has transcripts and analyses (or when you close it).

These options are available in the podcast's Feed tab.

The status box

In the podcast's header, on the right, a box says how far along the podcast is, a line per stage with a count, a percentage, and a mark: an empty circle while work is left, a green check when the stage is done.

  • Downloaded, Transcribed, Speakers found: episodes done, of those with audio. Audio that was discarded after transcription (the Feed tab's setting) counts as downloaded.
  • Analyzed: current are the episodes analyzed with the prompt as it is now; other model those of them that were made by another model than the one you have chosen, as the analyses of a package are, or your own from before you chose another; old prompt those analyzed before the prompt changed; not analyzed the rest. The percentage counts every kind of analyzed. The check is orange when every episode is analyzed but some with an old prompt, green when all are current, and blue when all are current and some are another model's.
  • Speakers named: every speaker of every episode is confirmed (your word, a name or "nobody to name"), probable (a name by voice, not yet confirmed), or unknown. The check is orange when none is unknown, green when all are confirmed. Click the line to go through them in the Speakers Across Episodes window (see Speakers).

Under the box, Show incomplete only helps you see what work is left to do.

Episodes tab

One row per episode with four status columns, headed by the same icons as the toolbar's buttons: audio, transcript, speakers, analysis, and after them a column for each dimension the Analyzer tab shows as one (a rating, a mark, a count of guests); when the window is too narrow for them all, the last of those give way, never the status columns. Hover a dot for its meaning. Double-click a row to play it, or use the play button in the episode panel's Audio tab. Right-click one or more rows for Download, Transcribe, Find Speakers, Analyze, their re-do variants, and Delete for each artifact.

The toolbar has Refresh Feed, Download All, Transcribe All, and Analyze All. Each "All" queues only what is missing, newest first. The Activity bar at the bottom shows what is running, the batch progress, a Stop button, and any failures. Stopping discards the job in progress; nothing half-done is kept.

The panel on the right shows the selected episode in five tabs, on the same line as the podcast's tabs:

  • Notes: the show notes from the feed, with links to the episode page and the audio on the host.
  • Audio: whether the file is on disk, with its full path and size, and Play, Download or Re-download, Delete Audio, and Reveal in Finder.
  • Transcript: the transcribe controls, a find box and the Lines / By speaker switch that stay put while the transcript scrolls under them, and the transcript itself: click a timestamp to play from there, click a speaker's name to identify them.
  • Speakers: the episode's speakers, named and unnamed, with their speaking time; click one to open the Identify Speakers window on them.
  • Analysis: Analyze, Re-analyze, Delete Analysis, Reveal, and the episode's values for every dimension once analyzed.

The player

Play an episode and the player appears at the foot of the sidebar, under the podcasts. It's a pretty standard audio play controller, and it shows live transcription and which speaker is talking.

Transcription

Open Settings › Transcription and download a whisper model. large-v3-turbo is the recommended one: on Apple silicon it does an hour of audio in about a minute, and it is accurate. tiny.en is fast and rough. Pick the model you want and, if the show is always in one language, set it (two-letter code) to skip detection.

Transcribe from the toolbar or the context menu. Episodes without a local file are downloaded first. Transcripts are JSON files in the podcast's transcripts folder.

The Transcripts tab searches every transcript of the podcast, the hits grouped by episode. Click an episode's title and the episode panel opens its transcript at the first hit, the words found in it; click a hit's time and the episode plays from that moment, the panel's transcript scrolled to it as well.

In the episode panel's Transcript tab, Find in transcript finds the words in place: the transcript stays whole, the list scrolls to the first match and highlights it, and the arrows (or Return in the field) step to the next and the previous, "3 of 16" saying where you are. Click a time to play from there.

Speakers

Thoropod can tell who speaks when. Download the speaker models in Settings › Transcription (about 21 MB; they run on the Neural Engine, about a minute per two hours of audio). Then Diarize All in the toolbar, or right-click episodes and choose Find Speakers. Turn on Find speakers after transcribing and every transcription does it on the same pass, which is the way to go when audio is not kept.

The episode panel's Speakers tab lists the speakers found with their speaking time, and its Transcript tab gains a By speaker view: the words grouped into turns under "Speaker 1", "Speaker 2" and so on, numbered by how much each spoke.

Naming them: the Identify Speakers window. Click a speaker in the Speakers tab, or a speaker's name in the transcript, and the window opens on that episode. Analyze the episode first (the window says so at the top if you have not), because the analysis is where most of the name suggestions come from.

The name goes on that episode and the voice is remembered, so every other episode whose voice matches gets the name too, shown with a question mark until you confirm it there. Name the hosts once and they are labelled everywhere; guests stay "Speaker N" until you name them. Settings › Transcription › Voice matching sets how close a voice must be to take a name automatically.

The All Speakers tab lists every named speaker with episodes and speaking time; rename there, merge two names that turned out to be one person, or forget one (their episodes go back to "Speaker N").

Images. Give a speaker an image and the player shows it while they speak: click the square at the left of their row in All Speakers and choose a file, or drop an image file on the row. The menu with the photo icon chooses another or removes it. Thoropod keeps its own copy, scaled down, in the podcast's speakers folder, so the original can be moved or deleted. Any shape works; the player shows the middle of an image that is not square. When two speakers are merged, the one who stays keeps their image, or takes the other's if they had none. Images are yours: they are not part of a package, exported or shared, and whoever imports your package adds their own.

All episodes at once: the Speakers Across Episodes window. Once a podcast is diarized, most of its speakers are guesses waiting for a word, and the voices without a name are the same few people coming back. Open the window from the All Speakers tab, or by clicking the status box's Speakers named line.

  • On the left, the voices, in two lists. Unnamed are the voices nobody has a name for: the app puts the ones that sound alike together, one per episode, so a guest of forty episodes is one line, not forty. Guesses are the named speakers with episodes to confirm. Most talk first puts the people who speak most on top; Most episodes first puts what comes back most often there, which is often a jingle or an advertisement.
  • On the right, the episodes the selected voice is in, the closest match first, with the match as a percentage. Play plays a sample of that speaker in that episode, and stops at its end; press it again for the next sample (the longest turns come first). The check says it is the person, the X says it is not.
  • In the middle, who it is. Type a name, or pick one: first the people the analyses name on those episodes, the one named on most of them on top, leaving out anyone who already has a voice in the episode; then every other speaker, closest voice first. For an unnamed voice the right name is usually the first line ("on 13 of 13").
  • An unnamed voice can be checked and crossed before it has a name; the marks wait, and are carried out the moment you choose one. Or choose the name first and check after. The episodes you did not decide on take the name as a guess when their voice is close enough, and the window moves on to that speaker's guesses.
  • Confirm All confirms every episode without an X. For a speaker's guesses that is often all there is to do.
  • An X on a guess means "not this person": the app never proposes that name for that speaker of that episode again, and proposes the next closest voice if there is one.
  • Nobody to Name is for a jingle, an advertisement, a clip from a film: the voice counts as decided and is left alone.

What you decide is written to the episodes' speaker files at once, and the other episodes are matched again against the voices you confirmed, so the numbers in the status box move as you go.

AI provider

Open Settings › AI Providers and paste an API key for Anthropic or OpenAI, or point Thoropod at a running Ollama. Keys live in your login Keychain and never in a podcast folder or an exported package. Test lists the models the key can use.

For Anthropic, keys created for a single workspace need nothing more. A personal or service-account key that spans several workspaces must name one in the Workspace ID field (Claude Console › Settings › Workspaces, ID column).

No key at all? Pick Copy & Paste as the podcast's provider in its Analyzer tab and name your chatbot as the model. Then Analyze on an episode opens the Analyze with Chatbot window instead of running anything: Copy Prompt puts the prompt and the episode on the clipboard, you paste that into a new chat in ChatGPT, Claude, Gemini, or whatever you use (a new one, so nothing said before colors the answer), copy its whole answer, and Paste Answer keeps it as the episode's analysis, the same as one from a provider. With several episodes chosen the window takes them one after another; Skip passes one. A weekly routine with a package downloaded from thoropod.com is then: refresh, transcribe the new episode, Analyze, one round trip through a chatbot. Long transcripts may be more than a chatbot takes in one message; the Analyzer tab's transcript limit shortens them. The feature is new: Settings › AI Providers › Copy & Paste analysis turns it off, and the provider disappears from the list.

Analyzer tab

This is where a podcast's analysis is designed. The sections come in the order that matters: the model first, because that is where the money goes.

  • Model (required): the provider, the model, its effort, and the transcript limit (long episodes are cut from the start before they go to the model). A paid AI account or a local model that costs nothing; a low-power, low-effort model does well, so try one or two episodes on a cheap one before analyzing an archive.
  • Show description (recommended): who the hosts are, the format, recurring segments. It goes at the top of the prompt and helps the model read an episode.
  • Dimensions (strongly recommended): each has a key (its JSON name), a label, a kind, an instruction in your words, and an optional allowlist. The kind is People (names, spelled consistently), Terms (short noun phrases: topics, works, places, running bits), Number, or True/False. A Number dimension is one number per episode, such as the star rating the hosts give the film, or nothing when the episode gives none: say what the number is and its scale in the instruction ("the star rating the hosts give, out of five"), and the prompt asks for a bare number. A True/False dimension is a question answered for each episode ("whether the hosts cried at any point"), true or false, or nothing when the episode does not say. Their tabs show each value with how many episodes have it, numbers in order of size. Any dimension can Show as a column in the episode list: the number for a Number dimension, a mark for a True/False one (✅ and ❌ unless you choose other emoji, or words, in the editor), the count of values for any other (three guests, seven topics), with the column sortable like the rest, so best-rated first is a click. With an allowlist the model may only pick from your values, which keeps a tab tidy (for example, a fixed set of segment names). A people dimension also says whether its names are offered when naming speakers: on for hosts, guests, and panelists, off for people who are merely talked about, such as authors. Such a dimension of people talked about (Actors, Artists) can Leave out the people on the episode: a name the model returns there is dropped when the same episode has it among its hosts, guests, or panelists. That happens as each analysis arrives; for the episodes analyzed before, a line under the dimension list says how many names are concerned and Remove Them… takes them out. Double-click a dimension (or use Edit…) to change it in a sheet; nothing applies until you save, so a half-typed instruction never reaches the prompt.
  • Episode types (optional): how to tell what type an episode is, in your words. Name the types and what gives each one away ("Draft: the title says Draft", "Book Club: the show notes name the book", "Regular: everything else"). The directions go in the prompt and the model returns one type per episode. It is told to look in the title, the show notes, and the transcript, that what you say about the title or the show notes counts most, and to infer the type from the transcript only as a last resort. Changing the directions changes the prompt, so the episodes analyzed before are stale until you re-analyze them. The Type tab renames and merges like any other, for the day the model spells a type two ways. Title rules (under the directions) need no model: one rule per line, Label: text the title contains; Mini: FH Mini makes every episode with "FH Mini" in its title a Mini, analyzed or not. A line without a colon is the label and the text at once. The Type tab shows a title rule's type when one matches, else the model's answer, else the feed's type (Episode, Bonus, Trailer).
  • Prompt: the assembled prompt is shown; you can replace it with your own.

Once an episode has its speakers, the model reads the transcript as one line per speaker turn with the names you gave ("Dan McCoy: …"), which makes hosts and guests far easier for it to get right; the episode's Analysis tab says "with speakers" on such analyses.

Analyze sends every transcribed episode that has no analysis. When you change the prompt, earlier analyses count as stale: the Episodes tab marks them with an orange clock and the Analyzer tab offers Re-analyze stale, since analysis costs money. When you change only the model, or the analyses came in a package that was made with another one, nothing is stale: those episodes have a blue check, which says that they were analyzed with your prompt by another model. They stay as they are unless you analyze them again. The Activity bar keeps a running tally of tokens and an estimated cost for the session.

With Anthropic or OpenAI, several episodes are analyzed at once, since each one only waits on the service: four unless Settings › AI Providers says otherwise (lower it if the provider answers with rate-limit errors; Thoropod retries those, but slowly). A local Ollama model has your Mac's GPU to itself, so its analyses run one at a time, like transcription. The Activity bar lists every episode being analyzed.

Before you press either button, the Run section says what the job would send: the size of the text the model will read (the prompt, then each episode's title, date, show notes, and transcript, cut at the limit), the input tokens that comes to, and the cost at the provider's list prices with the chosen model (a local model says "no cost"). Thoropod measures each episode's text as soon as it can: after a transcript lands, after its speakers are found, and whenever you name or rename a speaker, since the names are part of the text. Until an episode is measured its size is guessed from its length, and the line says how many are still guesses. The token count is a rule of thumb of four characters a token until some episodes have been analyzed with the chosen model; from then on it is calibrated on their real counts, and the line says so.

Dimension tabs

Every visible dimension gets a tab of tiles, one per value, with its episode count. Click tiles to filter; Any matches episodes with at least one selected value, All requires every one. Selections combine across tabs and also filter the Episodes tab; the chips bar shows what is active.

Select one tile and Rename… to fix a spelling, or several and Merge… to fold variants into one name ("Dan" and "Dan McCoy"). The files are rewritten, and the old spellings become aliases of the name you chose: whenever a later analysis (a better model, a new prompt) returns one of them, the episode is tagged with the canonical name instead. Matching ignores case, accents, and spacing.

Aliases… shows the dimension's rules: each canonical name with its aliases. Edit a canonical name (the old one becomes an alias), add or remove aliases, add a rule by hand, or delete one. Save rewrites the existing analyses to match. Removing an alias only stops future mapping; the merged files keep the canonical name. Aliases travel in a package.

Sharing an analyzer package

Package › Export Package… in the toolbar writes <Podcast>.thoropod.zip: the analyzer settings, every transcript, analysis, and diarization, and the named speakers. Speaker images are not shared, nor are any API keys you use for analysis. For a private podcast, no feed URL, no audio URLs, and no URL-shaped identifiers.

You can directly use a package you made or a friend made with Import Package in the sidebar (or File › Import Package…). A package is always a new podcast. It is never merged into one you have, so a show can sit in your library several times, each a different look at it: yours, and what others made of it. The sheet reads the package and fills in the feed when the package carries one; episodes are matched by id, then by audio URL, then by title and date, and episodes the feed no longer lists are created from the package (title, date, audio link when the package has one) so their transcripts and analyses show up. Turn that off in the sheet and those files are kept aside in the podcast folder under import-unmatched instead.

A package without a feed (one from a private podcast carries none, and a feed can move hosts, or a podcast can shut down), still becomes a podcast: the package's episodes, transcripts, and analyses, and its art, but there will be nothing to play and nothing to refresh. It opens on its Feed tab: enter your own subscription's address, look it up, and Use This Feed. The feed's episodes then take the place of the package's where they are the same episode (by id, audio address, or title and date), keeping their transcripts and analyses, and episodes the package did not have are added. Until then Refresh Feed is greyed out and the episodes have no audio. Generally speaking, you can import a podcast package, verify the feed is correct, download audio and you now have a full local version of the show.

A package brings its analyzer: the description and the dimensions its maker set up, which become the new podcast's. The sheet shows the prompt that comes with the package, which is what the app will send to a model with every episode you analyze from then on, so read it as you would anything someone hands you to send to an AI model. It also says which model the package was analyzed by. The model you go with is your choice, the same one or another: new episodes are analyzed on your Mac, with your key. The package's analyses stay as they are; made by another model than yours, they have a blue check. A package directly from another person replaces the app's prompt with text its maker wrote; the sheet says so. As with anything, make sure you know and trust the source before running prompts into AI models. Packages from thoropod.com do not override the application prompt.

Sharing with thoropod.com

thoropod.com has a directory of podcasts that people have shared, for anyone to download into the app. To add yours, choose Package › Share with thoropod.com… in the toolbar.

  • What is shared. The analyses always: they are what a shared package is for, so a podcast needs analyzed episodes before it can be shared. Transcripts are your choice: they are most of a package's size, and without them whoever downloads the package transcribes the episodes on their own Mac. Speakers are your choice too: who speaks when, and the named speakers with their voices. Always with it are the analyzer's settings (never a key), the list of episodes, and the podcast's art. Never with it are the speakers' images, nor a prompt you wrote yourself in place of the app's: a shared package goes with the prompt the app assembles from your dimensions, which whoever downloads it can read part by part.
  • Shared by is the name the directory shows beside your package. The note is for whoever reviews it.
  • The license. Sharing needs a license (Settings › License): If you upload new versions of a package, the newer ones supersede previous ones.
  • A private feed stays private. The package says nothing of where the feed, the audio, or the art is; whoever downloads it needs a subscription of their own and connects the package to their feed. Its title often carries your name ("Private to …"): the reviewer edits the title before the podcast is listed, so that no name of yours is shown, and the directory's address for it comes from the edited title.

The package is sent in parts, so a dropped connection costs one part, and Try Again after a failure sends only what is missing. When it has arrived, thoropod.com examines it and it waits for review: a person looks at every package before it is published, and nothing is public until then. Open the sheet again to see how it stands: waiting, published (with a button to its page), or not published, with the reason. A human person reviews uploaded packages, so please be patient.

There are some limits to shared packages, so if your package is too large or you have too many in the queue, you may have to wait before sending more. Again, a human person administers the shared directory, so please be patient. Remember, you can always share a package zip directly with a friend.

Sharing the work with other Macs

Thoropod on one Mac can send transcription, speaker identification, and analysis to Thoropods on other Macs on the same network. Each Mac runs one job at a time; the strongest free one gets the next job, and the Mac you are sitting at keeps working too. Everything travels over your local network: the audio for transcription and speaker finding, the transcript and speakers for analysis. Feed and audio links never leave the Mac that has them.

On a Mac that should do work for others (Settings › Network › This Mac):

  1. Turn on Accept jobs from other Thoropods. macOS asks whether Thoropod may find and connect to devices on the local network; allow it, on this Mac too, or the others will never see it (the status line will say so). It may also ask whether Thoropod may accept incoming connections; allow that as well. A question dismissed by mistake is in System Settings › Privacy & Security › Local Network.
  2. Mark the work allowed. Transcription needs the same whisper model installed as the Mac sending the work; speaker finding needs the speaker models; analysis is only ever sent for a local Ollama model, and runs with this Mac's Ollama. A podcast analyzed with Anthropic or OpenAI keeps its analyses at home, several at once, since another Mac would add nothing but a hop. Make sure each Thoropod instance is configured with data models needed, and local LLMs if needed.
  3. Enter a shared secret. Every Mac must have the same one.

On the Mac with the podcast (the Network window: the toolbar's network button, Window › Network, or ⇧⌘N):

  1. Turn on Send work to other Thoropods. The first scan asks for permission to find devices on the local network; allow it, or nothing will be found.
  2. The list shows every Thoropod found: version (with an update badge when it is behind yours or speaks another protocol, in which case it is not used), hardware, what it offers, whether it is idle or busy (and for whom), and when it last answered. Under each one, Send here has a checkbox per kind of job: untick the kinds that Mac should not get, so speaker finding can go to every Mac, transcription only to the ones with big GPUs, and analysis only to the ones with the memory for a local model. A kind the Mac does not accept is greyed out. Untick all three to keep a Mac out. A Mac on another network, or one Bonjour cannot see, goes in by address (host or host:port).
  3. Enter the same shared secret, in Settings › Network.

Then Transcribe All, Diarize All, or Analyze All as usual. The Activity bar shows the job running here and one line per job running elsewhere, with each remote's name and progress; the Network window's Sent out section lists them with when each went out, and under each remote the job it is doing for you. Results land in your podcast folder as if they had been made here; speakers found elsewhere are matched against the names you have given. Stop cancels the jobs on the other Macs too.

If a remote stops answering for ten minutes, forgets the job, or takes longer than the limit in Give up after, the job comes back to the front of the queue and goes to another Mac, or runs here after the second time. The Activity bar says so.

On a Mac that is working for another, the Activity bar shows the job at the bottom of the window: who sent it, the episode, and how far it has come. Decline stops it there when you need the Mac back; the Mac that sent it puts the episode back in its queue and runs it elsewhere, or itself.

Note that farming out AI model analysis doesn't make sense if you are using a cloud service like Anthropic or OpenAI. Thoropod automatically runs up to 4 remote jobs in parallel for Anthropic or OpenAI models. If you would like Thoropod to support other cloud models, please contact support.

Where things live

~/Library/Application Support/Thoropod/ holds library.json (the list of podcasts), models/ (whisper models, shared), and one folder per podcast. Note that you can also choose a different folder to store podcasts. You may want to store them on an external disk, for example. These are the files for each podcast:

<podcast>/
  podcast.store        the database (episodes and their state)
  analyzer.json        dimensions, prompt, provider and model
  speakers.json        the named speakers and their voices
  audio/               downloaded episodes
  transcripts/         one JSON per episode
  analysis/            one JSON per episode
  diarization/         one JSON per episode: who speaks when
  speakers/            the images of named speakers, if any (yours only: not in packages)
  artwork.jpg          the art a package brought, for a podcast made from one without a feed
  import-unmatched/    package files that matched no episode, if any

Jobs other Macs send here are kept under remote-jobs/ beside the library while they run and for a day after, then removed.

Reveal in Finder in the toolbar opens any of these. A podcast can live elsewhere (an external drive): choose the folder when adding it. The app's own settings (AI keys, whisper and speaker models, network) are behind the gear in the sidebar's toolbar, or Thoropod › Settings….

When something goes wrong

  • A feed refuses access (HTTP 401 or 403). A private feed's link has probably expired or been revoked; get a fresh one from the provider and add the podcast again.
  • Not enough disk space. Downloads stop before they start when the volume is nearly full. Free space, or turn off "Keep audio files" in the podcast's Feed tab.
  • The API key was rejected. Check it in Settings › AI Providers and use Test.
  • Rate limited or overloaded. Thoropod waits and retries a few times on its own, for as long as the provider asks when it says; the Activity bar shows the countdown and the provider's own words. Stop cancels the wait. To find the limit you are hitting, open Settings › AI Providers: Provider errors shows the last refusal, and Reveal Log opens logs/providers.log beside the library, where every one is kept in full: the provider's message, the headers that name the limit (Anthropic's anthropic-ratelimit-…-limit and -remaining, OpenAI's x-ratelimit-…, and retry-after), the request id, and what Thoropod did. A limit on tokens per minute wants fewer analyses at once (the setting above it); a limit on requests per day or a spend cap is set on the provider's own console.
  • A model was not found. Pick one from the list in the Analyzer tab (the Fetch button asks the provider for the current names).
  • Transcription is slow or wrong. Check the model in Settings › Transcription; large-v3-turbo is the one to use on Apple silicon. Set the language if detection picks the wrong one.
  • Another Mac does not appear in the Network list. On that Mac, Settings › Network must say "visible on the network"; if it says other Thoropods cannot see it, allow Thoropod under System Settings › Privacy & Security › Local Network there. The Network window says so too when this Mac is the one without the permission. Both Macs must be on the same network (a guest Wi-Fi network is not). A Mac that cannot be found can still be added by address (name.local or its IP).
  • The other Macs are listed but every one is unreachable. When the Network window says macOS is refusing Thoropod's connections, the network is fine and the other Macs are running: macOS has stopped letting this copy of Thoropod connect to them, which can happen some hours after an update, when it goes back to holding the permission for the copy that was replaced. Check that Thoropod is on under System Settings › Privacy & Security › Local Network, eject any Thoropod disk image, and restart this Mac.
  • Install Thoropod in Applications rather than running it from the disk image. macOS keeps a separate Local Network entry for every place an app runs from, so each mount of the image adds a "Thoropod" row under Privacy & Security and starts without permission.

Failures are listed in the Activity bar and on the episode's status dot; hover for the message. Re-running Download All, Transcribe All, or Analyze All picks failed episodes up again.