Live can no longer lie about points

The last 24 hours in Nima Project had activity in three places:

  • the shared workspace
  • world-cup-porra
  • world-cup-api

The story of the day was not "we added another panel" or "we polished another layout".

It was more structural:

Ultimate Porra stopped treating live match state as a separate visual layer and started forcing it to answer to the same truth that decides real points.

Until now, three things could drift too far apart:

  • the official closed result;
  • the live match with provisional state;
  • and the way home, cards and vote flows explained that to the user.

These 24 hours are about pulling those three pieces back together.

The first serious shift: once a match is closed, the UI can no longer score by guesswork

The commits opening the window make that turn explicit:

  • Use official closed-match points
  • Align match scoring breakdown
  • Fix official scoring refresh
  • Document World Cup score refresh endpoint

The implication is substantial.

While a match is live, showing provisional points makes sense. But once an official closed result exists, the product can no longer depend on a local reinterpretation of scoring.

It has to read official truth and refresh it correctly.

That shows up on both sides:

  • the frontend adds prediction-points.js to prefer stored points when a match is no longer provisional;
  • the API adds and documents the official scoring refresh path so closing a match is not left to the last render or the last poll.

That is not just a technical detail.

It is the moment the pool app starts accepting that live can be approximate, but closure cannot.

Home stops being a collage of states and becomes a reading surface

The heaviest concentration of commits was in world-cup-porra, and nearly all of them point in the same direction:

  • Fix live scoring on pool home
  • Prime live scoring before pool home render
  • show actual scorers on vote cards
  • simplify actual scorer hint
  • align dashboard live and stats cards
  • show live minute and compact stats cards
  • reorganize mobile dashboard live layout
  • place live preview under progress
  • simplify live match preview
  • style live status as plain text
  • move evaluated votes into rank card
  • align live panel flags

Taken one by one, they look small.

Taken together, they tell a very clear product decision:

home can no longer mix ranking, live state, stats and vote context as loose fragments. It has to read as a compact explanation of your state inside the game.

That is why several things happen at once:

  • evaluated votes move inside Your position, because they are no longer side data but part of ranking context;
  • the live panel gets simpler and loses the tone of decorative UI;
  • live minute, halftime and hydration break start to matter as real state copy;
  • and the live preview moves under progress so the visual narrative has a cleaner order.

The app is saying something new:

first I place you, then I explain the match, and only after that do I let the rest branch out.

The chat conversations pushed in exactly that direction

In Codex sessions from June 18 to June 19, a few instructions appeared that did not sound architectural, but absolutely were product-contract decisions:

  • Remove the country texts from the live container
  • the live status should not have a color background, only text color
  • for live use red text
  • for halftime or hydration break use blue
  • evaluated votes must be inside the Your Position container
  • the flags and the VS must align vertically

That is not simple visual preference.

It is insistence that live state should not steal attention through boxes, fills and decoration when the real need is fast reading:

  • what state the match is in;
  • how much of your score is already evaluated;
  • and what is still open or provisional.

The conversation was not about "making it prettier".

It was about stripping noise so state semantics become easier to read.

Showing actual scorers on the vote card changes the kind of transparency

These commits:

  • feat: show actual scorers on vote cards
  • fix: simplify actual scorer hint

look small, but they move an important boundary.

Until now, top-scorer bonus logic could still feel like an internal system rule. Now the card starts returning evidence from the real match: who actually scored, and how that affects the bonus.

That changes the relationship between user and scoring.

It is no longer enough to say:

  • you got this many points;
  • or this bonus does not count here.

Now the product starts showing the visible clue that justifies that evaluation.

In a prediction game that matters a lot, because trust is not won only by calculating correctly. It is also won by showing why the calculation landed there.

Even vote copying moves out of home

One commit looked secondary, but fits the same story perfectly:

  • move copy votes panel to setup

Moving vote copying out of the dashboard and back into setup is another semantic cleanup.

Home stays for:

  • state;
  • position;
  • live;
  • summary.

Setup stays for:

  • operational tools.

When an app matures, it does not only harden rules. It also separates action types more clearly.

What really changed in these 24 hours

The easy summary would be:

  • better scoring;
  • better live UI;
  • better responsive layout.

But the deeper change is different.

Ultimate Porra started demanding that live state, official closure and visible point explanation stop contradicting each other.

That forces several disciplines at once:

  • the backend has to refresh official scoring reliably;
  • the frontend has to distinguish better between provisional and closed points;
  • home has to prioritize readability over decoration;
  • and the vote card has to show more evidence from the real match.

What I take from this stretch

  • Once an official closed result exists, the UI should stop scoring as if it were still in provisional mode.
  • A documented refresh endpoint matters because scoring consistency is now part of the product, not only part of the backend.
  • Moving evaluated votes into Your position fixes narrative, not just layout.
  • Live state works better as tinted semantic text than as a filled chip when the goal is fast reading.
  • Showing actual scorers on the card makes bonus logic more auditable.
  • Removing vote copy from home helps the dashboard become a tracking surface again instead of a utility drawer.

These 24 hours did not change the product with one loud new feature.

They changed something more delicate:

the pool app started accepting that a live match can still be provisional, but the explanation of points cannot stay ambiguous, and definitely cannot lie once the result is official.


Part of my product and platform notes. Follow the blog or contact me.