6 ms·
Show HN: Faceoff – A terminal UI for following NHL games
Faceoff is a TUI app written in Python to follow live NHL games and browse standings and stats. I got the inspiration from Playball, a similar TUI app for MLB games that was featured on HN.
The app was mostly vibe-coded with Claude Code, but not one-shot. I added features and fixed bugs by using it, as I spent way too much time in the terminal over the last few months.
Try it out with `uvx faceoff` (requires uv).
- divbzero 6mo agoRelated: Playball – Watch MLB games from a terminal - https://news.ycombinator.com/item?id=45451577 https://news.ycombinator.com/item?id=45451577 - Oct 2025 (146 comments) Playball: Watch MLB games from the comfort of your own terminal - https://news.ycombinator.com/item?id=37591070 https://news.ycombinator.com/item?id=37591070 - Sept 2023 (1 comment) Playball: Watch MLB games from the comfort of your own terminal - https://news.ycombinator.com/item?id=21653981 https://news.ycombinator.com/item?id=21653981 - Nov 2019 (42 comments)
- j45 6mo agoDifferent sport though, but neat visualizations.
- freedomben 6mo agoNice, I've now created dozens of little personal tools like this now :-) This is IMHO the killer AI feature for personal use. So many utlities I never would have spent time on are now within reach. Even just non-trivial bashrc aliases and functions
- vcf 6mo agoYeah, I completely agree. It's awesome to be able to build anything you want (as long as it's not too complex). I, too, have at least a dozen, and I usually don't share, but with the playoffs starting, I felt others could enjoy this one.
- cr125rider 6mo agoSuper fun! Nice job shipping!
- embedding-shape 6mo ago> It's awesome to be able to build anything you want (as long as it's not too complex). That's the thing. It was always awesome, as long as it wasn't too complex. The only thing that changed for me what was "too complex".
- zawakin 6mo agoSame — similar pile accumulating, and GitHub has fallen way behind. I keep going back and forth on whether a monorepo is the right answer or if it'd just make the sprawl more legible without actually helping. How are you organizing yours?
- nullsanity 6mo ago[dead]
- vcf 6mo agoOne repo per project. It makes it easier when I want to share or make public. I have 100+ repos in my account and I don’t find that cumbersome.
- j45 6mo agoThe missing interface from sports.
- rangersny1 6mo agoNice! In practice, how far behind the TV broadcast does it end up being?
- vcf 6mo agoNot too much, but it’s using a Rest API, so it also depends on the refresh rate (default 30 seconds, configurable with cli argument).
- brewdad 6mo agoThat’s not bad. One of my favorite times is college football season with a big game on say, ABC. You quickly learn who it watching OTA, who is watching on cable and who has YoutubeTV based on the different reaction times after a big play.
- james-clef 6mo agoWicked. Who is your team?
- vcf 6mo agoGo Habs Go!
- bradley_taunt 6mo agoBooooo! (From a Senators fan…)
- embedding-shape 6mo ago> Acknowledgments - This project was inspired by Playball, a similar terminal application for following MLB baseball games. Should've gone for something generalized that could handle a bunch of different games, instead of just another sport, so someone caring about multiple sports don't need multiple TUIs :)
- vcf 6mo agoDifferent sports have different ways to present the data. But most importantly, the data availability differs a lot between leagues, so there’s a benefit to having separate tools. I, for one, would not want to maintain an app for all sports.
- bpev 6mo agonot terminal, but fwiw: https://plaintextsports.com https://plaintextsports.com
- prh8 6mo agoHaving long ago built an app that does gamecasts for multiple sports, similar to what you get from ESPN, every sport is completely different. There's almost nothing that matches up, except for the very basic concept of a box score. Even play by play has enough differences to be vastly different
- embedding-shape 6mo agoI never once built an app for gamecasts, any sport, but even I do realize that sports are different... Not sure what made you(s) believe I'm suggesting the exact same UI for all the sports.
- itsnh98 6mo agoGo Habs!
- cyberax 6mo agoWhat next? Perhaps a small scripting language to run on the side of the terminal? You know, just to make some simple automations possible, nothing super-special.
- _doctor_love 6mo agosettle down
- yuppiepuppie 6mo agoNice! I was thinking about doing something like this but for cycling, however one of the biggest PIA about building products for sports is all the gating of data. Does the NHL really provide an API for all games? That's nice...
- vcf 6mo agoI had the same thought, went ahead when I found an existing Python module to access the API.
- stackskipton 6mo agoOfficially no, but there is undocumented API (if you are commercial, they provide documentation and support) that is public without authentication.
- redanddead 6mo agothe more I think about it, the more it's actually so weird that the leagues don't have APIs
- Shalomboy 6mo agoThe request definitely comes from the leagues' broadcast partners, right? They would want as many eyeballs concentrated in as few places as possible so they can sell ads for more.
- captn3m0 6mo agoLink to the API Client is incorrect at the bottom: https://github.com/nhl-stats-api-client https://github.com/nhl-stats-api-client instead of https://github.com/liahimratman/nhl-api-client https://github.com/liahimratman/nhl-api-client
- vcf 6mo agoThanks, fixed!
- jlongman 6mo agonIce! Does it have player in-game stats like TOI and +/-? This reminds me of that f1 tui… https://github.com/JustAman62/undercut-f1 https://github.com/JustAman62/undercut-f1 or https://github.com/IAmTomShaw/f1-race-replay https://github.com/IAmTomShaw/f1-race-replay. The one I’m thinking of syncs with kodi for delayed playback “live” stats.
- vcf 6mo agoNot player stats, only team stats. I'll have to see if player-level stats are available in the API.
- ipaddr 6mo agoDo the endpoints still work? https://api-web.nhle.com/v1 https://api-web.nhle.com/v1 Keeping upto date endpoints for sport scores is the most difficult challenge.
- vcf 6mo agoI took the lazy way out and use a dependency for that. I’ll look into it and see if I can either push a fix upstream or reimplement myself.
- mooktakim 6mo agoIt's like the reinvention of Teletext
- LeoPanthera 6mo agoWhich still exists in many European countries.
- forestingfisher 6mo agoI think a teletext-like central information service for terminals would see use, because sometimes you just want to check the weather and news without being spammed with a billion ads and JavaScript
- zephyrwhimsy 6mo ago[dead]
- zephyrwhimsy 6mo ago[dead]
- mallahan 6mo agoThis is great. I recently asked AI how many software devs played hockey. It estimated 25k - 50k globally. It also called it a 'prestige sport' which never occurred to me (what with all the guys with missing teeth). But the cost of playing is getting significant. Still the most fun sport to play and watch. Thanks for this - TUI is awesome.
- deleted 6mo ago[deleted]
- deleted 6mo ago[deleted]
- dionian 6mo agoNot a hockey fan but i absolutely love this
- pukaworks 6mo ago[dead]
- worldsavior 6mo agoNHL? What are we, Canadians?
- vrr044 6mo ago[dead]
- jiexiang 6mo ago[dead]
- duncangh 6mo agoI love this - watching the hurricanes game right now! Autorefresh would be nice and then it looks like a small bug in the faceoff percentage as they both say 100% which shouldn't be possible at any point in the game. Also would be sick to be able to enter the team and roster detail page from within the game detail page. But I love this so much and appreciate you for building it :D edit the face off percentage is still a little off it's updated to show this 87% - 67%. Also followed you on twitter and github.
- vcf 6mo agoThanks! I will look into these bugs, it’s a PIA because you can only debug those while there is a live game… Same with auto-refresh, it should work but for some reason it’s inconsistent.
- roxana_haidiner 6mo agoIt looks interesting, but you can create this with any database, like mysql and create relations between tables, right?
- paolatauru 6mo agocurious how you handle the NHL feed latency. the undocumented API can be anywhere from 30s to 2 minutes behind the ice. do you poll on a fixed interval or do something smarter to keep it snappy
- scarface74 6mo agoI just looked at it. It’s kind of interesting. It’s the type of thing that I have thought about. But wouldn’t have done before AI.
- lucy_hnatchuk 6mo agoSweet NHL TUI, Vincent! Live scores + standings in terminal? Hockey nerd's dream. Textual + NHL API = perfection. Installed via uvx—game on!
- testiam 6mo agoit's super cool