Wait for the finale. Then binge.
A local-first TV and movie tracker for people who watch a season at a time.
ShowTrack is built around one idea: you watch a show once its whole season has finished airing. So the dashboard waits for the finale, then surfaces the season as ready to binge. One tap marks it done, and the Airing page counts down to each finale rather than tracking single episodes.
"4 seasons are complete and waiting. Tap the ring when you finish one."
It runs on your Windows desktop and Android phone from one codebase, keeps everything in a local database, and only reaches the internet to fetch show data from TheMovieDB. Nothing about your library leaves your devices.
Watch episode by episode instead? A single setting flips the dashboard to surface anything with a new episode, no waiting for the finale.
Watching
- A season-first dashboard with an "Up next" pick, complete seasons ready to binge, and one-tap season marks with undo
- A dedicated Anime tab, detected from TMDB and kept season-first
- An Airing page that groups shows by the month their current season becomes bingeable
Your library
- Movies with watch dates, rewatch counts, favorites and a watchlist
- Search TMDB to add anything; posters and metadata cache locally
- One-time import from a TV Time export
- Backup the whole library to one JSON file; restoring only ever adds, never deletes
Across your devices
- Two-way sync between desktop and phone over your home network, no cloud (see below)
- Turn off any page or dashboard section you do not use
- Custom window title, tile sizes, navigation order and more, all optional
- Download the latest release.
ShowTrack-...-setup.exeinstalls it (recommended).ShowTrack-...-portable.exeis a single file, no install. It needs Microsoft Edge WebView2, which ships with Windows 11 and current Windows 10.- The first launch may show a Windows SmartScreen warning because the app is not code-signed. Choose More info, then Run anyway.
- Add a TMDB key. ShowTrack asks for a free TMDB API key on first run and validates it. All metadata and posters come from TMDB.
- Bring your history (optional). Coming from TV Time? Export your data, then import it once from Settings.
Updates are built in: Settings > Maintenance > Check for updates. Installed copies update through the installer; portable copies replace themselves in place.
Two-way sync over your local network. No account, no cloud, nothing leaves your Wi-Fi.
- On the desktop: Settings > Phone sync, turn it on, then Show pairing code. The sync server runs only while the desktop app is open.
- On the phone: Settings > Sync with desktop. Enter this PC's address (find it with
ipconfig, for example192.168.1.20:47810) and the 6-digit code. The code is single use and valid for 5 minutes. - Pairing copies the whole desktop library to the phone. After that the phone syncs on its own each time you open it, or on demand with Sync now.
What happens under the hood is in How sync works.
Tauri 2 + Rust + SvelteKit (Svelte 5), one codebase for Windows and Android, pnpm workspace.
pnpm install
pnpm tauri devcd src-tauri && cargo test # unit + engine tests
TVTIME_EXPORT=path\to\export.html cargo test real_export -- --ignored # parse a real export
$env:TMDB_KEY="..."; cargo test tmdb_live -- --ignored # live TMDB smoke testpnpm tauri build --no-bundle # exe at src-tauri/target/release/showtrack.exe
pnpm tauri build --bundles nsis # Windows installer under target/release/bundle/nsis/Never run a bare cargo build --release; it skips the frontend embed. .cargo/config.toml
remaps this machine's paths out of release binaries so shipped exes carry no local
filesystem layout; adjust the prefixes if you build from a different setup.
# once per shell:
$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"
$env:ANDROID_HOME = "$env:LOCALAPPDATA\Android\Sdk"
$env:NDK_HOME = "<newest dir under $env:ANDROID_HOME\ndk>"
pnpm tauri android dev # dev loop on the connected phone
pnpm tauri android build --target aarch64 # signed arm64 release APKUniversal builds are slow and wedge-prone, so target aarch64. The Gradle project is
src-tauri/gen/android (open it in Android Studio). Signing key material lives in
src-tauri/gen/android/showtrack-release.keystore, with its path and passwords in
keystore.properties beside it. Both are gitignored; keep them safe.
- Change tracking. Every mark or state change appends to the
oplogtable. Sync exchanges ops both ways with last-write-wins per field. Before applying anything the phone pushes, the desktop takes a rolling database backup (keeps 5) in<app-data>/backups/. - Security model. The 6-digit code mints a 32-byte bearer token, compared in constant time. No TLS by design (home LAN, Wi-Fi link encryption); no mDNS, so the IP is entered by hand. The server binds to the chosen port (default 47810) only while the app is open and the toggle is on.
If you re-run pnpm tauri android init
It regenerates src-tauri/gen/android and will overwrite these hand-edits, so re-apply them:
app/build.gradle.kts: thesigningConfigsand releasesigningConfigblockapp/src/main/res/values/colors.xml:showtrackBg(#07090F)app/src/main/res/values/themes.xmlandvalues-night/themes.xml: the four dark-chrome itemsapp/src/main/java/com/nokama/showtrack/MainActivity.kt: the system-bar insets listener (Android 15 forces edge-to-edge; without it the app draws under the status bar) plus theonWebViewCreateoverride that disables the native scrollbars (they draw above the tab bar)app/src/main/AndroidManifest.xml:android:screenOrientation="portrait"on the activity- Launcher icon: the
res/mipmap-*pngs,res/mipmap-anydpi-v26/ic_launcher.xml, and theic_launcher_backgroundcolor (#07090F) inres/values/colors.xml. Legacy pngs come fromsrc-tauri/icons/android/; adaptive foregrounds areicons/icon.pngscaled to 85% on a transparent canvas (tauri icon's own foreground is full-bleed on white, which clips badly)
MIT. See LICENSE.
This product uses the TMDB API but is not endorsed or certified by TMDB.