The public surface can no longer be a side effect

The last 24 hours in Nima Project had commits in two repositories:

  • world-cup-porra
  • nikki-asteinza-web

This was not a loud feature day.

It was a day about something more important:

stopping the public surface from being a consequence of code and starting to treat it as an explicit contract for publishing, measurement and real-world readability.

That shift shows up on two fronts at once:

  • Ultimate Porra adds analytics and discovers that measurement is not enough if the tag lives hidden behind the app bootstrap.
  • nikki-asteinza-web stops being a folder with ready content and starts being defined as a truly publishable site, with a publish contract, canonical domain, deployment flow and operating rules.

Ultimate Porra home kept being adjusted until it could support real traffic and real reading

Before the analytics block, there was already a long sequence of home commits:

  • fix: compact live panel match row
  • fix: link home ranking card
  • fix: compact mobile evolution chart
  • fix: split home dashboard on wide screens
  • fix: arrange desktop home dashboard columns
  • fix: place live card under evolution
  • fix: lock world cup preview phase
  • fix: adjust mobile evolution chart height
  • fix: adapt home layout for portrait tablets

Read separately, they look like small fixes.

Read together, they say something else:

home was no longer being treated as just another screen, but as the real front page of the product.

That means it has to survive several contexts at once:

  • narrow mobile;
  • wide desktop;
  • and portrait tablets, which usually break layouts designed only for phone or desktop.

The commit fix: adapt home layout for portrait tablets makes that very clear. The app does not only move columns around: it also duplicates the quick Group stats reading next to the live block on tablet so the dashboard keeps making sense in the in-between form factor.

That is not cosmetics.

It is accepting that the main reading surface of the product has to hold before you start buying or measuring traffic against it.

Analytics forced measurement to move from "code that runs" to "HTML that exists"

The key commits here were:

  • Add GA4 tracking to Ultimate Porra
  • Expose GA4 tag in app shell

The first one adds analytics as a real product layer:

  • configuration in app-config.json;
  • support in local serving and the worker;
  • a dedicated js/app-modules/analytics.js module;
  • and entry points from the shell and app actions.

But the later conversation exposed the real boundary.

In Codex sessions on June 20, one detail was recorded very explicitly:

  • Google Analytics "was loading dynamically".
  • The GA tester looked for gtag/js in the initial HTML.
  • That forced the tag to be exposed in the shell so the site would be measurable before the app had fully booted.

That correction is not just a trick to satisfy verification.

It is a product lesson:

if observability depends on the entire frontend finishing mount, then measurement is still living as a technical side effect instead of part of the public surface.

That is why the second commit moves the tag into index.html and adjusts the analytics module around that reality.

The code difference is small and the meaning is large:

  • before, the app was measurable only if bootstrap reached a certain point;
  • now, the app presents itself to browsers and verifiers as an instrumented surface from the first useful byte.

Nikki's own website moved from "ready content" to "governed site"

The other front of the day was in nikki-asteinza-web:

  • Prepare Nikki Asteinza publish site
  • Fix Spanish home product logos

Prepare Nikki Asteinza publish site does not just add content.

It does something more serious:

  • it creates .notipad/publish-project.json;
  • declares publicUrl and canonicalDomain as https://nikkiasteinza.com;
  • sets a clean working tree policy before production publishing;
  • separates editableRoots from read-only paths;
  • defines staging, production, MFA guards and explicit confirmation;
  • and turns deployment into a named flow: save, validate contract, show diff, commit, push, publish and audit.

That is the opposite of "upload a folder".

It turns publishing into a governed operation.

The commit also pulls multiple blog entries into the published site, adds product assets and rewrites parts of the README and local preview flow so the site does not depend on tacit knowledge.

Then Fix Spanish home product logos closes a small but revealing inconsistency:

if the home page says the site is built with Notipad and presents the ecosystem products, it cannot show the very logos that make that narrative visible as evidence incorrectly.

The chat conversations pushed publishing all the way to the final operational meter

The June 20 deployment session shows another important decision.

The site was actually deployed to Cloudflare Pages and verified with 200, assets and GA present. But the final domain remained blocked by a piece that no longer belongs to content:

  • canonical DNS record not set

The operational note was precise:

  • the Pages project already existed;
  • nikkiasteinza.com had been added to the project;
  • but the custom-domain DNS record was still missing.

That matters because it completes the day's thesis.

A public website is not ready when the Markdown is good or when the build compiles.

It is ready when every layer of the publishable contract responds:

  • content;
  • branding;
  • HTML shell;
  • analytics;
  • publish project;
  • deployment;
  • and canonical DNS.

What really changed in these 24 hours

The easy summary would be:

  • better responsive behavior in Ultimate Porra;
  • GA4 integrated;
  • Nikki's site prepared for publishing.

But the deeper change is different.

Nima Project started treating the public web surface as an operable product, not as accidental output from a repository.

That shows up in decisions that can no longer be separated:

  • the Ultimate Porra dashboard has to read well in real form factors before traffic is worth buying;
  • analytics has to exist in the initial HTML, not only in modules that load later;
  • Nikki's portfolio needs a publishing contract and a canonical domain, not only content and theme;
  • and the final blocker can live in DNS, because real publishing always ends outside the editor.

What I take from this stretch

  • Once home becomes the real front page of the product, in-between responsive layouts stop being detail and become contract.
  • Instrumenting analytics in JS is not enough if verifiers, crawlers or browsers need to see the tag in the initial HTML.
  • A well-defined publish-project.json turns a personal website into an operable platform surface instead of a manual exception.
  • Separating editableRoots, MFA guards and explicit confirmation is a way of writing operations, not only configuration.
  • Fixing logos or branding on the home page looks small, but matters when the site is claiming those products as proof of the platform behind it.
  • The final kilometer of publishing is rarely content: it is usually domain, DNS, permissions or real deployment.

These 24 hours did not add the loudest feature in the project.

They added something more useful:

the discipline of assuming that a public surface only truly exists when it can be read, measured, published and resolved through its correct domain.


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