Skip to content

Case study — Sports media & stats

The Layout – a scores, stats and fantasy app for ultimate frisbee

The Layout is our own product: scores, stats, fantasy and coaching tools for six ultimate leagues and federations, designed, built and run in-house by Altius.

leagues and federations in one app: UFA, USA Ultimate, PUL, WUL, WFDF and EUF
6
completed games with final scores, going back to the UFA’s 2012 season
120K+
tournaments with results, from USA Ultimate sectionals to world championships
2,600+

Overview

One app for a sport with scattered data

The Layout is a scores, stats and tools app for ultimate frisbee, live at thelayout.app. It's our own product, not a client engagement: Hunter May, our lead software engineer, designed and built it in-house starting in May 2026, and the studio runs it. Ultimate's results are spread across the Ultimate Frisbee Association (UFA), USA Ultimate (USAU), the Premier Ultimate League (PUL), the Western Ultimate League (WUL), the World Flying Disc Federation (WFDF) and the European Ultimate Federation (EUF), and each publishes in its own format. The Layout brings all six into one database and builds scores, standings, brackets, player profiles, fantasy and coaching tools on top, on the web and in a native mobile app. It is independent and not affiliated with any of these organizations.

Client
The Layout
Industry
Sports media & stats
Year
2026
Services
Web App DesignMobile App DesignMVP DevelopmentCustom SoftwareHosting & DevOps

The challenge

What had to change.

  1. 01 — Problem

    Ultimate's results live on six separate sites. Each publishes in its own format, from a public API to results pages and an interactive dashboard, and no two share team or player IDs.

    Solution

    One ingestion pipeline per source, each mapping its data into a shared schema on its own schedule. Scrapers stop rather than write when a page that should have results comes back empty, so a redesign upstream can't wipe good data.

  2. 02 — Problem

    The same player can turn up in the UFA, in USA Ultimate club and college events, in the PUL or WUL, and at world championships, but the sources share no player ID.

    Solution

    A shared server function assembles each player's career from every league into one cached profile, used by both the website and the mobile app. Careers are matched on normalized names, the one key every source has.

  3. 03 — Problem

    On a busy weekend, more than a dozen USA Ultimate events are live at once. Syncing them one after another took far longer than a serverless function is allowed to run.

    Solution

    The live job hands each event its own sync run, in parallel, and returns in seconds. It runs every 3 minutes Thursday to Sunday and every 30 minutes midweek, and picks up pools and seeds up to a week before play starts.

Process

How we built it.

01 — Discovery

Starting with one league

The first version, in May 2026, covered a single league: UFA scores from the league's public API, with USA Ultimate and international tabs stubbed for later. Each league added after that started with the same questions: what the source publishes, how often it changes, what it leaves out, and where its names disagree with the others. Those answers decide what each league's pages show, and what they leave blank rather than guess.

Discovery — artifacts

02 — Design

Two themes, one calm system

We designed two themes from the start. Field is light and athletic, with generous whitespace and a coral accent. Broadcast is a dark scoreboard look with condensed display type for dense data. Fans can switch between them anywhere in the app. A later restyle, Editorial Calm, replaced hairline borders with floating cards, pill controls and italic display headings across both themes. Every screen is designed for the phone first, with a floating tab bar at the bottom.

Design — artifacts

03 — Data pipelines

Six sources, each on its own schedule

The pipelines run on Postgres, serverless functions and pg_cron. Live UFA games are polled every 30 seconds in season, USA Ultimate events refresh every 3 minutes on tournament weekends, and WFDF events every 15 minutes. PUL results sync hourly on game days, and EUF results hourly around its events. The WUL source needs a headless browser, so it runs as a scheduled GitHub Action. Daily jobs discover new events, every scheduled call carries a timeout, and failed runs are written to a health log.

Data pipelines — artifacts

04 — Apps

The web app, then native

The web app runs on Next.js and Vercel. The native app is built with Expo and React Native on the same Postgres database and shared server functions, so a player profile is assembled once for both. Its rule is strict parity: every screen matches the website's mobile view, with a native tab bar as the one exception. The app has Apple and Google sign-in, and is in beta testing on iOS and Android.

Apps — artifacts

Core features

What it does.

  1. 01

    Every league, one place

    Scores, schedules, standings and team pages for all six leagues, with full pool and bracket views for USA Ultimate and world championship events, USA Ultimate's own rankings, and box scores wherever a league publishes them. The home page leads with whatever is in season, and typo-tolerant search finds any team, player or tournament.

  2. 02

    One profile per player, across leagues

    A player's careers from every league sit on one page, with champion banners, career totals, season-by-season stats and game logs. The Thread maps the teammates a player has shared a roster with, and the connections they lead to.

  3. 03

    Fantasy ultimate with a live draft room

    Private fantasy leagues with invite codes and links, a live snake draft with a pick clock, head-to-head or total-points scoring, trades with a commissioner veto, waivers and league chat. Scoring runs on the same pipelines that feed the scores pages, and an hourly job carries a team's roster forward if its manager forgets to set one.

  4. 04

    Tools for coaches, games for fans

    The Playbook is a coach's whiteboard: drag seven players onto a field, start from formation presets, animate plays step by step and attach a reference video. Teams share a playbook with a roster, lines and per-play personnel. In 12-0, fans spin a random UFA, PUL or WUL team-season seven times, take one player from each, and get a simulated 12-game record. A perfect 12-0 comes up in about 2% of UFA drafts.

Technology

Built with.

  • Next.js
  • React Native
  • Expo
  • PostgreSQL
  • TypeScript
  • React
  • Tailwind CSS
  • Vercel
  • pg_cron
  • Expo Router
  • NativeWind
  • TanStack Query
  • GitHub Actions
  • Playwright
  • Resend
  • UFA API

The outcome

What we build when we're the client

The Layout is live at thelayout.app with scores and stats for six leagues, fantasy, the Playbook, 12-0 and a UFA card game, and its native app is in beta testing on iOS and Android. Because we run it ourselves, we deal with the same problems our clients do: sources that change without notice, load that peaks on tournament weekends, and app store rules. What we learn running it goes into the work we do for clients.

More work

Keep exploring.

Golden Capital – a website, dealer portal and CRM for equipment financing

We designed and built Golden Capital's website, an invite-only portal where equipment dealers track their deals, and the internal CRM that carries each deal to funding.

Client
Golden Capital
Industry
Commercial equipment financing
Stack
Next.js · React · TypeScript · Tailwind CSS · shadcn/ui · PostgreSQL
  • Website, dealer portal and internal CRM, designed and built by Altius
  • Invite-only portal with multi-factor sign-in and a full audit log
  • OCR-first document intake, with AI only where OCR falls short

Have something similar in mind?

Tell us where things stand today. We’ll come back within a day with questions, a rough approach, and a straight answer on fit.