The open, local-first football workbench.
Run locally · Roadmap · Contribute
Follow a match, explore a season, or trace a player's career. Halfspace brings fixtures, lineups, stats, odds, and connected football profiles into one desktop workspace.
Bring your own Sportmonks token. Fetched data stays on your machine, ready for fast browsing and available when you're offline.
- Follow matchday. Live scores, upcoming fixtures, and recent results in a rolling calendar.
- Go inside a match. Previews, pressure charts, event timelines, pitch lineups, commentary, statistics, broadcast listings, and odds.
- Connect the dots. Move between competitions, teams, players, coaches, referees, and venues. Explore season statistics, squads, leaderboards, and transfer histories along the way.
You'll need Node.js 22.12 or newer, pnpm 11.1.2, and your own Sportmonks Football API token.
git clone https://github.com/tbleckert/halfspace.git
cd halfspace
pnpm install
pnpm devAdd your token when the app opens. Available leagues and data depend on your Sportmonks plan and add-ons. Settings shows what your token can access; an included feature may still have no data for a particular league or fixture.
For macOS DMG/ZIP builds, see the alpha release guide. Tester releases require Developer ID signing and Apple notarization; an explicit unsigned command is available for local packaging checks.
The north star is complete Sportmonks Football coverage: every endpoint and every supported include should have a useful place in Halfspace.
- Local-first desktop app with personal Sportmonks tokens and offline browsing.
- macOS packaging and a manual signing/notarization workflow for Apple silicon and Intel.
- Personal first-run setup with token guidance, available competitions, optional team pins, and TV country selection.
- Today-focused Matchday with featured games, live updates, upcoming fixtures, and recent results.
- My teams on Matchday, with a card per pinned team showing its upcoming game and previous result, plus direct team and match links.
- Dedicated Fixtures browser with week navigation and a date picker.
- Searchable team directory with country and competition browsing, local team pins, and sidebar shortcuts.
- Searchable player directory with country browsing, profile cards, and cached pages.
- Competition browsing by country and team season histories with direct historical-season links.
- Global live-score ticker with direct links into every match in play.
- Competition pages with standings, qualification and relegation places, linked form, season selection, and complete season team lists.
- Complete competition and team season schedules with stage navigation and competition rounds.
- Season referee and venue directories with linked profiles.
- Standings adjustments with reported points, calculation direction, and active status.
- Knockout brackets with two-leg ties, aggregate results, and tournament progression.
- Round-by-round league tables with season selection and offline history.
- Live league tables with in-play standings and automatic updates.
- Team pages with current competitions, fixtures, squad profiles, and transfer history.
- Transfer hub with latest updates, date ranges, paginated browsing, and linked player and club profiles.
- Team and player transfer rumours with sources, reported likelihood, and paginated browsing.
- Historical team squads with season selection and offline browsing.
- Current team injuries and suspensions with linked player profiles.
- Team rivalries with direct links to rival clubs.
- Team rankings with reported ranking systems, positions, and points.
- Referee profiles and recent match appointments, linked from fixture officials.
- Referee season statistics with reported disciplinary totals and per-match averages.
- Player pages with match records and career history, plus coach and venue profiles.
- Richer profiles with player birthplace, preferred foot and registrations, linked coach playing careers, referee background, club socials, and venue maps.
- Pending transfers on player Career pages, separate from completed moves and rumours.
- Team, player, and coach honours with competition, season, club, and reported placing.
- Season statistics for competitions, teams, and players.
- Competition stage and round statistics, with stage-specific player leaderboards.
- Cross-league team and player comparisons with entity-specific season selection, independent records, and per-90 player radars.
- Independent home/away team comparisons using reported season splits.
- Season player leaderboards for goals, assists, yellow cards, and red cards.
- Fixture previews, event timelines, pitch lineups, match statistics, and pre-match odds.
- Match statistics by period, including first- and second-half views.
- Match expected goals, xG on target, non-penalty xG, and expected points where available.
- Pre-match result, both-teams-to-score, goal-total, and correct-score probabilities.
- Provider-reported formations, group context, and aggregate ties with links between legs.
- Fixture weather and match-specific absences with linked player profiles.
- Match facts with team, category, and scope filters in fixture previews.
- Predicted lineups on the shared pitch before confirmed team sheets are available.
- Expected starting XIs and benches, with forecast selection and confirmed lineup precedence.
- Football news with competition and season browsing, article readers, and fixture previews and reports.
- Match-aware Game view combining pressure, key statistics, and the event timeline.
- Fixture pressure charts with goal and red-card markers, exact values, and live updates.
- Match trends for possession, shots, shots on target, and corners, with period selection and live updates.
- Live match commentary with key-event filtering and offline history.
- Fixture Preview TV guides with country-specific broadcast listings.
- Country-based TV Guide with live and upcoming matches and broadcaster links.
- Broadcaster pages with paginated upcoming and past schedules and match-specific broadcast regions.
- Competition Team of the Week with season and round browsing.
- Pre-match and in-play odds explorer with market and bookmaker comparison.
- Subscription overview showing plans, add-ons, and feature access for your token.
- Global search across matches and football profiles, including referees, with cached results.
- Competition quick access and navigation prefetching.
- Saved team and player comparisons with complete season, club, and home/away context.
- Personal Views with starter layouts, manual block editing, local saving, duplication, competition and season switching, and undo. Optional OpenAI composition and conversational edits bring fixtures, standings, and player leaders together.
The next milestone is an installable macOS alpha: help people connect their account, follow their teams, and return on another matchday. Use feedback from the first testers to focus subsequent football features and design passes.
- Signed macOS alpha validated on clean installations and a five-person usability pilot.
- Complete referee appointment history beyond the recent six-month window.
- Deeper in-play analysis.
- Premium odds and deeper bookmaker coverage.
- Deeper comparison and analysis tools built on the local data foundation.
- Advanced custom views with connected team and player data, comparisons, interactive filters, and trustworthy analysis as Sportmonks coverage grows.
- Dedicated design passes across football views.
- Shareable image exports of comparisons and other football views for social media.
- Complete Sportmonks endpoint and include coverage.
Checked items describe the features available today, not exhaustive API coverage. Every addition should stay local-first, with typed requests, durable caching, and natural links between entities. Keep complete Sportmonks coverage as the long-term goal, selecting near-term endpoint work around these user journeys. Build new football features with reusable queries and presentation components so they can also power personal views. Sharing and image exports follow once the visual design is settled.
An endpoint or include is considered covered when its data can be fetched safely, cached locally, reached through the interface, and understood in the context of the related entities.
Track endpoint and include coverage.
Built with Electron, React + TypeScript, shadcn/ui + Tailwind, TanStack Router, and Dexie/IndexedDB, with electron-vite for development and builds.
Electron's main process handles token storage and Sportmonks requests. The renderer reads cached football data from IndexedDB and refreshes it in the background.
Run pnpm check for type checks, tests, lint, formatting, and coverage validation.
Run pnpm build for a production build.
When shipping endpoint or include support, update docs/sportmonks-coverage.json and run
pnpm coverage. Commit the generated report and badge alongside the implementation. CI runs
pnpm check and pnpm build on pull requests and pushes to main, rejecting stale coverage
artifacts. The README badge reads the generated file on main.
The Refresh Sportmonks catalog workflow checks the official documentation every Monday at 05:17 UTC and can also be run manually from Actions. Changes open or update one draft PR with the upstream catalog, report, and badge; declared product support is never changed automatically. If upstream changes invalidate a declaration, the workflow fails for manual review.
The refresh needs Settings → Actions → General → Allow GitHub Actions to create and approve
pull requests enabled. It uses the built-in GITHUB_TOKEN; no Sportmonks token or personal
access token is needed. The workflow does not approve or merge PRs.
Review the draft and mark it Ready for review to trigger PR checks. GitHub does not trigger CI when its built-in token creates or updates a PR, so the refresh runs checks and builds before opening it. Later updates return the PR to draft. The badge updates after the PR is merged, subject to GitHub and Shields caching.
Bug reports, football use cases, and focused pull requests are welcome. Pick something from the
roadmap or open an issue to discuss a larger change. Keep cached browsing fast, link related
entities, and run pnpm check before submitting your work.
For interface work, follow the design guide for the visual style, shared patterns, and motion behavior.
MIT.
