Language and access can no longer stay implicit
The last 24 hours in Nima Project had commits in three repositories:
world-cup-porrapublish-servicenikki-asteinza-web
This was not a heavy backend day or a single loud feature push.
It was a day about making two things explicit that could still remain half implicit until now:
which language a published surface defaults to, and under which real rules a user enters a game.
Both conversations of the day pointed straight at that:
- in
Ultimate Porra, copy could no longer keep mixingpublic/privatewithfree/paid; - in
Notipad Publish, the site could no longer keep publishing as if default locale, analytics and alternates were just output details.
Ultimate Porra had to split visibility, price and access model
The conversation that pushed this block was very specific.
In a Codex session on June 20, the product correction was stated clearly:
- the phrase
Paid pools = private for your groupwas no longer accurate; - there will also be paid public pools;
- and the website had to stop implying that
publicmeansfreeor thatpaidalways meansprivate.
That nuance became product in fix: refine home and voting card layout.
The commit does not only touch layout.
It also rewrites the entry surface for games:
Public gamesstops presenting itself asOpen to play without codeand starts sayingNo code: some are free and some require a pass.Join with codebecomes semantically and visually restricted toprivate invite-only games.Create private gamenow explicitly saysInvite-only for your group.- and each card gets a precise subtitle:
Open to join,Public with pass,Private invite-onlyorPrivate with pass.
That looks like copy.
But it is not only copy.
It is a product-model correction:
game visibility and game access model can no longer be inferred from each other.
Public means people can discover it.
With pass means there is an economic or entitlement condition to enter.
With code means entry depends on a private invitation.
When those axes are mixed carelessly, the product promises one thing while the real flow executes another.
The entry UX stopped hiding the datum users actually share
The second world-cup-porra commit was Add invite code copy control to entry cards.
Here too the follow-up conversation was precise:
- the change was deployed;
- production was checked to confirm
entry-code-copywas served; - and the real
data-action="copy-code"control was verified as part of the card surface.
The importance of that small move is larger than it looks.
Until now, the private game still depended on the user remembering that the code existed and knowing where to retrieve it.
With this commit:
- the code stops living as hidden data;
- it becomes a primary action inside the card;
- and the entry card stops being only a summary and becomes an operable surface.
It is the same thesis as the previous block, applied to interaction:
if access depends on a code, the product has to treat that code as a first-class visible, copyable object, not as a detail buried in a side flow.
Notipad Publish started treating bilingual output as a publish contract
The other front of the day was in publish-service with Support bilingual Notipad publishing.
That commit makes several moves at once:
- the default locale stops resolving to
esby inertia and starts preferringenwhen available; - the published
titlestarts resolving from localized SEO data instead of one generic string; brand,contact,actionButtonandanalyticsare pushed into the publish contract as first-class fields;- published pages are sorted by
logicalPathand locale order so alternates and output stay deterministic; - Google Analytics is injected into the published HTML
head; - and the default page can redirect to the Spanish version when the browser actually signals Spanish preference.
That changes something important.
Until now, the bilingual site could exist as duplicated content in es and en folders while too many decisions were still being resolved late.
After this commit, publish starts assuming that:
- default locale matters;
- variant order matters;
- analytics has to exist in published HTML;
- and language alternation cannot depend only on folder convention.
Again, this is not a minor technical detail.
It is the shift from we have content in two languages to we have a bilingual public surface with readable output rules.
Nikki's own website aligned itself with that new truth
The complementary commit in nikki-asteinza-web was Update Nikki publish locale and blog.
Its role was to close the distance between new platform capability and the configuration of the real site:
site-config.jsonchangesdefaultLocalefromestoen;- the
READMEnow documents that the default locale no longer lives inSrc/content/esbut inSrc/content/en; .notipad/order.jsonpicks up the previous blog post in both languages;- and the site updates its indexes and internal order so published output matches the new publish logic.
That matters because it avoids a common trap:
having a platform capable of publishing correctly in two languages while the real site is still anchored to older assumptions.
Nikki's website no longer only contains bilingual content.
It now also declares which language is the default and lets publish operate on that decision consistently.
What really changed in these 24 hours
The short version would be:
Ultimate Porraclarified its entry rules;publish-servicestarted publishing bilingual sites more strictly;nikki-asteinza-webaligned itself with the new default locale.
But the deeper change is different.
Nima Project started treating language and access as visible product contract, not as a derived consequence of content or flow.
That shows up in two mirrored decisions:
- a public game can require a pass without ceasing to be public;
- a site with
esandenfolders still needs an explicit default locale, alternates, analytics and output ordering.
What I take from this stretch
Public,private,free,paid,with passandwith codeare different axes; if copy mixes them, the product will too.- When a code is the real access key, hiding it outside the main card degrades operations.
- A bilingual system is not solved by having two content folders; it needs ordering, fallback, default locale and deterministic output.
- Injecting analytics and alternates from publish turns final HTML into contract, not just render output.
- Changing
defaultLocalein the real site matters as much as supporting it in the platform; otherwise the new capability stays trapped in infrastructure.
These 24 hours did not add the loudest functionality in the project.
They added something more important:
the discipline of not leaving either access rules or landing language implicit once the surface is truly public.
Part of my product and platform notes. Follow the blog or contact me.