{"id":49914257,"url":"https://github.com/drkenreid/steam-stats-visualized","last_synced_at":"2026-05-16T15:03:30.211Z","repository":{"id":347214784,"uuid":"1193208761","full_name":"DrKenReid/steam-stats-visualized","owner":"DrKenReid","description":"🎮 Spotify Wrapped, but for your Steam library. Paste your profile, get roasted.","archived":false,"fork":false,"pushed_at":"2026-03-27T14:51:51.000Z","size":434,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-27T14:58:12.744Z","etag":null,"topics":["data-science","data-visualization","gaming","plotly","portfolio","python","steam","steam-api","streamlit"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DrKenReid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T01:34:54.000Z","updated_at":"2026-03-27T14:51:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DrKenReid/steam-stats-visualized","commit_stats":null,"previous_names":["drkenreid/steam-stats-visualized"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/DrKenReid/steam-stats-visualized","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DrKenReid%2Fsteam-stats-visualized","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DrKenReid%2Fsteam-stats-visualized/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DrKenReid%2Fsteam-stats-visualized/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DrKenReid%2Fsteam-stats-visualized/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DrKenReid","download_url":"https://codeload.github.com/DrKenReid/steam-stats-visualized/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DrKenReid%2Fsteam-stats-visualized/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33107564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-science","data-visualization","gaming","plotly","portfolio","python","steam","steam-api","streamlit"],"created_at":"2026-05-16T15:03:28.987Z","updated_at":"2026-05-16T15:03:30.134Z","avatar_url":"https://github.com/DrKenReid.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎮 Steam Stats Visualized\n\n**Spotify Wrapped, but for your Steam library.** Paste your profile, get roasted.\n\n\u003e *\"You own 665 games. You've played 344. The other 321 are just... vibes.\"*\n\n\u003c!-- TODO: Replace with deployed Streamlit URL --\u003e\n\u003c!-- [![Open in Streamlit](https://static.streamlit.io/badges/streamlit_badge_black_white.svg)](https://steam-stats-visualized.streamlit.app) --\u003e\n\n![Python](https://img.shields.io/badge/Python-3.11+-blue?logo=python\u0026logoColor=white)\n![Streamlit](https://img.shields.io/badge/Streamlit-1.55-FF4B4B?logo=streamlit\u0026logoColor=white)\n![License](https://img.shields.io/badge/License-MIT-green)\n\n---\n\n## ✨ Features\n\n| Feature | Description |\n|---------|-------------|\n| 🎭 **Gaming Personality** | Are you \"The Hoarder\", \"The Completionist\", or \"The One-Game Andy\"? |\n| 🏆 **Top 10 Games** | Interactive bar chart of your most-played games with roast commentary |\n| 🎮 **Game Meme References** | ~50 game-specific memes (Factorio: \"The factory must grow\" 🏭) |\n| 💻 **Platform Breakdown** | Windows / Mac / Linux / Steam Deck playtime donut chart |\n| 💀 **Backlog of Shame** | How many games you've never touched, with appropriate judgment |\n| 📊 **Playtime Distribution** | Histogram showing the classic \"200 games under 1 hour\" pattern |\n| 🎯 **Genre Breakdown** | Treemap of your library by genre |\n| 💰 **Cost Per Hour** | Best and worst value games in your library |\n| 💸 **Most Expensive Unplayed** | The priciest game you've never opened |\n| 🏅 **Achievement Stats** | Completion rates across your top games |\n| 🕹️ **Recently Played** | What you've been up to in the last 2 weeks |\n| 📤 **Social Sharing** | Share buttons (Twitter, Reddit, Facebook, LinkedIn) on every section |\n\n## 📸 Screenshots\n\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand\u003c/summary\u003e\n\n### Gaming Personality + Profile\n![Profile](assets/screenshots/v2_01_personality.png)\n\n### Top 10 Games + Platform Breakdown\n![Top 10](assets/screenshots/v2_02_top10_platform.png)\n\n### Backlog of Shame + Playtime Distribution\n![Backlog](assets/screenshots/v2_03_backlog_histogram.png)\n\n### Genre Breakdown + Cost Analysis\n![Genre](assets/screenshots/v2_04_genre_cost_expensive.png)\n\n### Achievement Stats + Recently Played\n![Achievements](assets/screenshots/v2_05_achievements_recent.png)\n\n\u003c/details\u003e\n\n## 🚀 Try It\n\n\u003c!-- TODO: Add deployed URL --\u003e\n\u003c!-- **[Use it live →](https://steam-stats-visualized.streamlit.app)** --\u003e\n\nOr run locally:\n\n```bash\n# Clone\ngit clone https://github.com/drkenreid/steam-stats-visualized.git\ncd steam-stats-visualized\n\n# Install dependencies\npip install -r requirements.txt\n\n# Add your Steam API key (free: https://steamcommunity.com/dev/apikey)\ncp .streamlit/secrets.toml.example .streamlit/secrets.toml\n# Edit .streamlit/secrets.toml with your key\n\n# Run\nstreamlit run app.py\n```\n\nOr with Docker:\n\n```bash\ndocker build -t steam-stats .\ndocker run -p 8501:8501 steam-stats\n```\n\nOr with Make:\n\n```bash\nmake run     # Start the app\nmake test    # Run tests\n```\n\n## 🏗️ Architecture\n\n```\nsteam-stats-visualized/\n├── app.py                    # Streamlit UI — layout, sections, share buttons\n├── src/\n│   ├── steam_api.py          # Steam API client (Web API + Store API), caching\n│   ├── analytics.py          # Data processing, metrics, commentary, personality\n│   └── charts.py             # Plotly chart builders (dark theme)\n├── notebooks/\n│   └── exploration.ipynb     # Data science EDA walkthrough\n├── tests/\n│   └── test_analytics.py     # Unit tests for analytics functions\n├── .streamlit/\n│   ├── config.toml           # Dark theme configuration\n│   └── secrets.toml.example  # API key template\n├── assets/screenshots/       # App screenshots\n├── requirements.txt\n├── Dockerfile\n├── Makefile\n└── LICENSE (MIT)\n```\n\n### Design Decisions\n\n- **Streamlit** over Flask/React: Zero-friction deployment, Python-native, free hosting via Streamlit Community Cloud. The app IS the repo.\n- **Plotly** over Matplotlib: Interactive charts that users can hover, zoom, and explore. Dark theme consistency.\n- **No database**: All data fetched live from Steam APIs. Caching via `@st.cache_data` (1-hour TTL) to avoid hammering rate limits.\n- **No OAuth**: Users paste a profile URL — no login required. Works with any public Steam profile.\n- **Humor-driven**: The goal is shareability. People share things that make them laugh, not bar charts.\n\n### Steam APIs Used\n\n| Endpoint | Purpose |\n|----------|---------|\n| `ISteamUser/ResolveVanityURL` | Convert vanity name → Steam ID |\n| `ISteamUser/GetPlayerSummaries` | Profile info, avatar, account age |\n| `IPlayerService/GetOwnedGames` | Full game list with playtime + platform breakdown |\n| `IPlayerService/GetRecentlyPlayedGames` | Last 2 weeks activity |\n| `ISteamUserStats/GetPlayerAchievements` | Per-game achievement progress |\n| `store.steampowered.com/api/appdetails` | Genre tags, pricing (rate-limited) |\n\n## 🧪 Testing\n\n```bash\npytest tests/ -v\n```\n\n10 unit tests covering analytics functions (stats calculation, commentary generation, cost-per-hour, account age formatting).\n\n## 📓 Data Science Notebook\n\nThe `notebooks/exploration.ipynb` notebook walks through the data exploration process:\n- Fetching and cleaning Steam API data\n- Statistical observations about gaming patterns\n- Genre analysis methodology\n- Playtime distribution analysis\n\nThis is the \"portfolio piece\" — showing the data science thinking behind the visualizations.\n\n## 🤝 Contributing\n\nPRs welcome! Some ideas:\n- Add more game meme references (see `GAME_MEMES` dict in `analytics.py`)\n- Friend comparison (side-by-side stats)\n- Gaming timeline (scatter plot of when games were last played)\n- Shareable summary card (PNG export)\n- More gaming personalities\n\n## 📄 License\n\nMIT — do whatever you want with it.\n\n---\n\n*Built with [Streamlit](https://streamlit.io), [Plotly](https://plotly.com), and questionable life choices.*\n\n## Related\n\n- [Letterboxd Roasted](https://github.com/DrKenReid/Letterboxd-Roasted) — Spotify Wrapped for your Letterboxd\n- [Debt Payoff Simulator](https://github.com/DrKenReid/Debt-Payoff-Simulator) — compare debt repayment strategies\n- [kenreid.co.uk/data_science](https://www.kenreid.co.uk/data_science.html) — all projects, publications, and CV\n\n## Author\n\n**Ken Reid** — Data Scientist, photographer, and avid reader.\n\n- [kenreid.co.uk](https://www.kenreid.co.uk) — Portfolio \u0026 blog\n- [@kenreid.co.uk](https://bsky.app/profile/kenreid.co.uk) — Bluesky\n- [@DrKenReid](https://github.com/DrKenReid) — GitHub\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrkenreid%2Fsteam-stats-visualized","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdrkenreid%2Fsteam-stats-visualized","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrkenreid%2Fsteam-stats-visualized/lists"}