
Deploy Typesense Podcasts
Episode and transcript search with timestamps
typesense-railway
Just deployed
Deploy and Host self hosted Typesense Podcasts (Podcast Transcript Search) on Railway
This template runs Typesense 30 behind Caddy on Railway, wired for spoken-word search: an episodes collection plus transcript chunks that map hits to timestamps. Built for podcast teams that want deep links to the exact sentence.
About Hosting Typesense Podcasts open-source software on Railway (self hosted Typesense template)
The template runs Shinyduo/typesense-railway: a Typesense 30 image behind a small Caddy proxy on Railway's PORT that forwards to Typesense on 127.0.0.1:8118. Episodes and transcript chunks live on your own volume, set through TYPESENSE_DATA_DIR.
Railway covers TLS, the public domain, restarts, and the volume mount. You still own the data: swap TYPESENSE_API_KEY for a long random value right after deploy and hand clients scoped search-only keys.
Why Deploy Typesense Podcasts, the Algolia alternative on Railway (Railway Free Trial)
Algolia never lets you own the index, and Grow meters requests plus every record stored. Here you pay Railway compute and a volume, keep timestamped transcript chunks in your own project, with no per-search bill, and start on Railway's free trial credit.
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying Typesense Podcasts on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.
Railway vs Other Hosting Providers and VPS for Typesense Podcasts self hosting
A transcript index lives or dies on RAM and disk staying attached, so compare hosts on setup time.
| Provider | What You Get with Railway | What You Get with the Other Provider |
|---|---|---|
| DigitalOcean | Volume, HTTPS domain, and a Caddy-fronted Typesense container from one repo. | A Droplet, then Docker, Caddy, firewall rules, and mounts by hand. |
| AWS | A volume-backed service, though ALB, TLS, and task definitions come first. | Deep VPC control and more knobs for one search node. |
| Hetzner | A managed volume and domain on a usage-based bill. | Cheap raw CPU and RAM, but you own the proxy and backups. |
Common Use Cases for hosted Typesense Podcasts
- Timestamp deep links from a transcript hit. A listener searches a half-remembered phrase, lands on a chunk, and the app builds
audio_url#t=start_secondsso playback jumps straight to that sentence. Chunk around 30-60 seconds so every hit maps to a usable moment. - One row per episode, not per chunk. A query can match a dozen chunks in the same episode. Use
group_by=episode_idwithgroup_limit=3to collapse them, then pull$episodes(title,show,published_at)through the reference onepisode_id. - Show and guest browse pages. On the episodes collection,
facet_by=show,guests,topicswithsort_by=published_at:descgives you a browsable archive;filter_by=published_at:>1735689600keeps it to recent drops. Misspelled guest names still resolve through typo tolerance.
Dependencies for Typesense Podcasts Docker hosted on Railway
Podcast search grows two ways: shows, and transcript chunks inside each episode. Attach a Railway volume and a long random admin key first; Typesense holds the index in memory, and losing either means re-importing everything.
Deployment Dependencies for Managed Typesense Podcasts Service (Podcast Search)
The Shinyduo/typesense-railway build runs a Typesense 30 image behind Caddy on Railway's PORT (8080), forwarding to 127.0.0.1:8118. CORS is off, so browser clients need a proxy.
Implementation Details for Typesense Podcasts (Using Typesense official docker image)
Model episodes (id, show, title, published_at, guests, topics, audio_url) and transcript_chunks (episode_id with reference: 'episodes.id', start_seconds, end_seconds, speaker, text). Use search-only scoped keys from /keys.
How does Typesense Podcasts compare against other search engines for podcast and transcript search platforms
The schema is where these engines split. Timestamp ranges, group_by=episode_id, and a reference back to episodes do the real work; the rest is table stakes.
Typesense Podcasts vs Algolia (Algolia Alternative)
- Per-query vs per-record bills: Algolia Grow charges on searches and stored records; chunking a 90-minute episode into 60-second windows inflates both. Typesense charges neither.
- Where Algolia wins: InstantSearch widgets, analytics, and neural tuning are more polished, with no server to babysit.
- Deep links stay yours: both return highlighted fragments; you still assemble
audio_url#t=start_seconds.
Typesense Podcasts vs Meilisearch
- Grouping and joins:
group_by=episode_idwithgroup_limit=3andinclude_fields=$episodes(title,show,published_at)collapses chunk hits into one row per episode. Meilisearch can collapse chunks with a distinct attribute, but it has no equivalent of this reference join. - Where Meilisearch wins: lighter setup and a friendlier dashboard for hand-editing documents.
Typesense Podcasts vs Elasticsearch
- Ops weight: Elasticsearch's aggregations and percolation outrun transcript search, but you inherit JVM heap tuning for a dataset that fits in RAM.
- Where Elasticsearch wins: if a cluster already runs your logs, a podcast index is cheap to add.
Typesense Podcasts vs OpenSearch
- Typo-tolerant latency: one in-memory node answers misspelled guest names in milliseconds, no shard planning required.
- Where OpenSearch wins: snapshot, security, and plugin tooling many teams already standardized on, plus managed offerings.
How to use Typesense Podcasts (the OSS Podcast Search)?
- Swap
TYPESENSE_API_KEYfor a long random value, then mint a search-only key via/keys(actionsdocuments:search). - Create
episodes, thentranscript_chunkswithepisode_iddeclaredfacet: trueandreference: 'episodes.id', since references can't be added later. - Import episodes first, then 30-60 second chunks as JSONL with
?action=upsert. - Query chunks with
query_by=text,group_by=episode_id,group_limit=3,include_fields=$episodes(title,show). - Deep-link each hit to
audio_url#t=start_secondsso playback resumes at the match; the default snippet shows the matched words. - Facet browse pages on episodes with
facet_by=show,guests,topics, and chunk hits withfacet_by=speaker(copy show onto chunks to facet hits by show); typo tolerance absorbs misspelled guest names.
How to self host Typesense Podcasts on other VPS Services (Typesense Podcasts self hosting guide)
On a plain VPS you own the firewall, TLS and restarts.
Clone the Repository
No app to build; to reuse the template's Caddy wrapper, clone it:
git clone https://github.com/Shinyduo/typesense-railway.git
cd typesense-railway
Install Dependencies
Docker and curl. Transcripts come from Whisper upstream; Typesense only indexes text.
docker pull typesense/typesense:30.2
Configure Environment Variables
export TYPESENSE_API_KEY=$(openssl rand -hex 32)
export TYPESENSE_DATA_DIR=/srv/typesense-data
mkdir -p $TYPESENSE_DATA_DIR
Save that key. Lose the admin key and you rebuild every collection.
Start the Typesense Podcasts Application
docker run -d --name typesense-podcasts -p 8108:8108 \
-v $TYPESENSE_DATA_DIR:$TYPESENSE_DATA_DIR \
typesense/typesense:30.2 --data-dir $TYPESENSE_DATA_DIR \
--api-key=$TYPESENSE_API_KEY
Import episodes before chunks.
Official Pricing of Typesense Podcasts (Typesense Podcasts pricing)
The software itself is free: Typesense is GPL-3.0 open source, so there is no license line on your bill, only the box it runs on. Want managed? Typesense Cloud bills by the hour for the RAM and vCPU you pick plus bandwidth, with no per-search fee; check its pricing page for current numbers.
Typesense Podcasts cloud vs self hosted comparison (Pricing, features, costs, and more)
A transcript archive is many short chunks, so document count, not audio hours, drives RAM and cost.
Monthly cost of self hosting Typesense Podcasts on Railway
On Railway you pay compute plus volume, nothing per query. Keep the typesense/typesense:30.2 image and a volume for persistence; the Caddy proxy in front adds negligible cost.
System Requirements for Hosting Typesense Podcasts on a VPS
In-memory search means RAM sized to the dataset: budget for every transcript chunk, and more if you add the built-in ts/all-MiniLM-L12-v2 embedding field, which runs on the service CPU and RAM.
Frequently Asked Questions (FAQs)
How big should transcript chunks be in Typesense Podcasts?
Aim for 30-60 second windows: long enough to hold a thought, short enough that each hit maps to one timestamp. Store start_seconds and end_seconds as int32 next to the text.
Can a result jump to the exact spoken line?
Yes. Link the hit as audio_url#t=start_seconds and any player that honors the fragment will seek there. Show why it matched with highlight_full_fields=text.
Why does group_by=episode_id fail on transcript_chunks?
A group_by field needs facet: true, and the reference to episodes.id cannot be bolted on later with an alter. Recreate the collection instead.
How do I keep the admin key out of the browser?
Swap TYPESENSE_API_KEY for your own long random value right after deploy, then issue search-only keys from /keys with actions ['documents:search'].
Does deleting an episode clean up its chunks?
Yes. The reference cascade-deletes them by default, so a takedown leaves no orphan rows.
Do hybrid searches need more RAM?
The built-in ts/all-MiniLM-L12-v2 model runs on this service's CPU and RAM, so size memory up before enabling query_by=text,embedding.
Template Content
typesense-railway
Shinyduo/typesense-railway