<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Ioni</title>
    <description>The latest articles on DEV Community by Daniel Ioni (@danielioni).</description>
    <link>https://dev.to/danielioni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4014925%2F997f1a4a-e9ae-47a4-a2fd-cb9c37f82a9f.jpg</url>
      <title>DEV Community: Daniel Ioni</title>
      <link>https://dev.to/danielioni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielioni"/>
    <language>en</language>
    <item>
      <title>Building MyZubster Together: Meet the Contributors Creating an Open-Source, Decentralized Ecosystem</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Tue, 27 Oct 2026 04:56:05 +0000</pubDate>
      <link>https://dev.to/danielioni/building-myzubster-together-meet-the-contributors-creating-an-open-source-decentralized-ecosystem-447d</link>
      <guid>https://dev.to/danielioni/building-myzubster-together-meet-the-contributors-creating-an-open-source-decentralized-ecosystem-447d</guid>
      <description>&lt;h1&gt;
  
  
  Building MyZubster Together: Meet the Contributors Creating an Open-Source, Decentralized Ecosystem
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;From a simpler service marketplace to independent infrastructure, gardening, digital comics and AI-assisted development.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#opensource&lt;/code&gt; &lt;code&gt;#github&lt;/code&gt; &lt;code&gt;#webdev&lt;/code&gt; &lt;code&gt;#community&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;MyZubster is an open-source experiment with a simple ambition: &lt;strong&gt;help people turn their skills, projects and knowledge into useful services, while allowing contributors to build and operate independent parts of the ecosystem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are not trying to build everything behind one centralized team.&lt;/p&gt;

&lt;p&gt;Instead, we are exploring a network where developers, artists, gardeners, service providers and independent infrastructure operators can contribute in different ways.&lt;/p&gt;

&lt;p&gt;Today, I want to introduce some of the people helping us build MyZubster, share their public work, and explain what is already implemented, what is being reviewed, and what we are still testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 The main project
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MyZubster GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://myzubster.com" rel="noopener noreferrer"&gt;https://myzubster.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our current priorities are deliberately practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the Marketplace easier to understand and use.&lt;/li&gt;
&lt;li&gt;Help contributors offer real services through Seller Free.&lt;/li&gt;
&lt;li&gt;Keep Zorgax, our assistant, available to support users.&lt;/li&gt;
&lt;li&gt;Preserve the Metaverse and experimental projects without making the homepage complicated.&lt;/li&gt;
&lt;li&gt;Explore independent infrastructure, privacy and interoperability.&lt;/li&gt;
&lt;li&gt;Connect contributions to public evidence, skills and contributor profiles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is how the community is helping.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 Wasim — Simplifying the Homepage and Marketplace
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Contributor:&lt;/strong&gt; &lt;a href="https://github.com/wasim-builds" rel="noopener noreferrer"&gt;@wasim-builds&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wasim is working on one of our most important improvements: making MyZubster understandable to someone visiting for the first time.&lt;/p&gt;

&lt;p&gt;His redesign focuses on four clear actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find services.&lt;/li&gt;
&lt;li&gt;Offer a service.&lt;/li&gt;
&lt;li&gt;Explore the Metaverse.&lt;/li&gt;
&lt;li&gt;Sign in or manage a profile.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The new interface also introduces featured service categories, clearer navigation and a more direct route into the Marketplace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current work:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1627" rel="noopener noreferrer"&gt;PR #1627 — Simplified Marketplace navigation and homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1662" rel="noopener noreferrer"&gt;PR #1662 — Marketplace listing photographs and previews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wasim has reported passing automated tests for the Seller Free workflow, including seller activation, listing publication and editing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; The redesign and photo features are still under review. Automated tests have passed in isolated environments, but we are not presenting them as proof of a completed public production rollout.&lt;/p&gt;

&lt;p&gt;Our immediate goal is to release the simpler homepage first, then continue improving listing photographs and other features.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ Wasim and Gangkor — Isolated Infrastructure and Interoperability
&lt;/h2&gt;

&lt;p&gt;Decentralization also means thinking carefully about who operates infrastructure, how services communicate and how access is secured.&lt;/p&gt;

&lt;p&gt;Wasim and Gangkor are involved in separate but related infrastructure experiments.&lt;/p&gt;

&lt;p&gt;Their work explores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolated development environments.&lt;/li&gt;
&lt;li&gt;Least-privilege access.&lt;/li&gt;
&lt;li&gt;Threat modeling.&lt;/li&gt;
&lt;li&gt;Mock peer-to-peer interoperability.&lt;/li&gt;
&lt;li&gt;Safer testing without exposing production wallets or credentials.&lt;/li&gt;
&lt;li&gt;Possible future Tor Onion access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public work:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1659" rel="noopener noreferrer"&gt;Issue #1659 — Gangkor and Wasim security/interoperability pilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1661" rel="noopener noreferrer"&gt;PR #1661 — Threat model and mock P2P interoperability tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1584" rel="noopener noreferrer"&gt;Issue #1584 — Proposed Tor Onion resilience pilot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; These are development and security pilots. We are not claiming that a fully decentralized production network or public Onion service has already been completed.&lt;/p&gt;

&lt;p&gt;The goal is to let contributors develop independent capabilities while maintaining clear security boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  🖼️ Nicola — Comics, Zorgax and Independent Projects
&lt;/h2&gt;

&lt;p&gt;Nicola is exploring how original creative work can become part of an open-source ecosystem.&lt;/p&gt;

&lt;p&gt;His Nicola Comics pilot connects digital artwork, public evidence and possible future integrations with contributor identities and the Marketplace.&lt;/p&gt;

&lt;p&gt;One concrete software contribution is a read-only bridge allowing Zorgax to retrieve information from the Nicola Comics pilot when a user explicitly requests it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public work:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nicolaususnicola-lgtm" rel="noopener noreferrer"&gt;Nicola's GitHub profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1460" rel="noopener noreferrer"&gt;PR #1460 — Zorgax bridge for Nicola Comics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This integration is intentionally limited: it does not mint NFTs, transfer funds or claim ownership that has not been independently verified.&lt;/p&gt;

&lt;p&gt;Nicola is also part of our broader exploration of independent contributor infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; The comics integration has been developed; further independent-node and creative-commerce capabilities remain areas of experimentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌱 Nico — Connecting Real Gardening Work to GitHub
&lt;/h2&gt;

&lt;p&gt;One of the most meaningful experiments is not about advanced software.&lt;/p&gt;

&lt;p&gt;It is about everyday work.&lt;/p&gt;

&lt;p&gt;Nico is documenting gardening and urban green-space maintenance through a public GitHub project.&lt;/p&gt;

&lt;p&gt;His repository includes a work diary describing activities such as mowing, pruning, garden maintenance and transplanting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/celofix-giardinaggio/celofix-giardinaggio" rel="noopener noreferrer"&gt;Celofix Giardinaggio repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/celofix-giardinaggio/celofix-giardinaggio/blob/main/diario/2026-10-25.md" rel="noopener noreferrer"&gt;Gardening work diary — October 25&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1660" rel="noopener noreferrer"&gt;MyZubster gardening Marketplace pilot — Issue #1660&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our proposed next step is to help Nico connect his documented skills to a real Seller Free service listing.&lt;/p&gt;

&lt;p&gt;Imagine a gardener who does not need to become a programmer to benefit from open-source tools.&lt;/p&gt;

&lt;p&gt;GitHub can hold a portfolio of work. An assistant can help explain the technical steps. A Marketplace can make those services easier to discover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; The independent repository and work diary exist. A successful live Seller listing has not yet been verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧾 ClearSheet — Testing a Remote Digital Service
&lt;/h2&gt;

&lt;p&gt;Another potential Marketplace participant is ClearSheet, a proposed service for converting documents into structured spreadsheets with human review.&lt;/p&gt;

&lt;p&gt;This is a different kind of service from gardening, but it helps us test the same question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can MyZubster support both local work and remote digital skills through a simple seller experience?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We have invited ClearSheet to test the Seller Free onboarding process, using synthetic examples rather than publishing customer documents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public discussion:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1613" rel="noopener noreferrer"&gt;Issue #1613 — Contributors as Marketplace sellers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Invitation and onboarding discussion underway. A real production listing has not yet been confirmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 An AI Agent Has Also Proposed Contributing
&lt;/h2&gt;

&lt;p&gt;Recently, the GitHub account &lt;a href="https://github.com/aiautomationagentesting" rel="noopener noreferrer"&gt;@aiautomationagentesting&lt;/a&gt;, which identifies itself as an autonomous AI agent, expressed interest in MyZubster.&lt;/p&gt;

&lt;p&gt;It proposed two possible contributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests for the public bounty API's funding-state filters.&lt;/li&gt;
&lt;li&gt;An original four-panel comic with documented provenance and rights information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public discussions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1440" rel="noopener noreferrer"&gt;Issue #1440 — Bounty API tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1479" rel="noopener noreferrer"&gt;Issue #1479 — Contributor comic with provenance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have asked how the agent discovered MyZubster and whether it would be interested in a small, human-reviewed pilot.&lt;/p&gt;

&lt;p&gt;We are also discussing the possibility of internal MYZ credits for approved contributions.&lt;/p&gt;

&lt;p&gt;These credits are not being presented as guaranteed monetary compensation or as automatically convertible cryptocurrency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; This is an early proposal, not a completed contribution. We do not yet know whether the agent discovered the project independently or through an external assignment.&lt;/p&gt;

&lt;p&gt;It raises an interesting question for the future of open source:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How should human contributors and AI agents collaborate transparently, with verifiable evidence and human oversight?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Knowledge, Evidence and Contributor Identity
&lt;/h2&gt;

&lt;p&gt;We want contributions to be more than usernames in a list.&lt;/p&gt;

&lt;p&gt;A useful contributor record could connect:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity → Project → Contribution → Evidence → Skills → Review → Recognition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a developer, evidence might be a pull request and passing tests.&lt;/p&gt;

&lt;p&gt;For an artist, it might be an original file, its Git commit and documented rights.&lt;/p&gt;

&lt;p&gt;For a gardener, it might be an authorized work diary and a portfolio of completed activities.&lt;/p&gt;

&lt;p&gt;These are different kinds of work, but all deserve clear attribution.&lt;/p&gt;

&lt;p&gt;Our Contributor Passport and knowledge-graph ideas are intended to explore these connections. Their capabilities are evolving, and not every proposed integration is available today.&lt;/p&gt;

&lt;h2&gt;
  
  
  🪙 What About MYZ, Monero and Rewards?
&lt;/h2&gt;

&lt;p&gt;MyZubster is also experimenting with ways to recognize contributions and support privacy-conscious payments.&lt;/p&gt;

&lt;p&gt;We distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal MYZ credits:&lt;/strong&gt; ecosystem rewards whose use and terms must be clearly defined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monero and other payment integrations:&lt;/strong&gt; separate financial infrastructure with its own operational and security requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proposed bounties:&lt;/strong&gt; potential rewards that are not payment promises until funding and terms are explicitly agreed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We do not want contributors to mistake an unfunded issue for guaranteed compensation.&lt;/p&gt;

&lt;p&gt;Transparency about the state of a reward is just as important as transparency about the state of the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What Comes Next?
&lt;/h2&gt;

&lt;p&gt;Our next milestone is not to announce ten more features.&lt;/p&gt;

&lt;p&gt;It is to prove a small, useful workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A person signs in → activates Seller Free → publishes a real service → another person discovers it → a genuine inquiry can happen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the same time, we want to continue improving the homepage, supporting independent contributor projects and testing interoperability without compromising production security.&lt;/p&gt;

&lt;p&gt;MyZubster is still a work in progress.&lt;/p&gt;

&lt;p&gt;Some contributions are implemented. Others are awaiting review. Several ideas are experimental.&lt;/p&gt;

&lt;p&gt;But the people and projects are real, and the public GitHub links allow anyone to follow the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Want to Contribute?
&lt;/h2&gt;

&lt;p&gt;You do not have to work on every part of MyZubster.&lt;/p&gt;

&lt;p&gt;You can choose a direction that fits your skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend development and accessibility.&lt;/li&gt;
&lt;li&gt;Marketplace testing.&lt;/li&gt;
&lt;li&gt;Security and independent infrastructure.&lt;/li&gt;
&lt;li&gt;Documentation and knowledge organization.&lt;/li&gt;
&lt;li&gt;Art, comics and digital creativity.&lt;/li&gt;
&lt;li&gt;Local or remote services.&lt;/li&gt;
&lt;li&gt;Responsible AI-assisted open-source contributions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start by exploring the repository and joining an issue that interests you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marketplace contributor pilot:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1613" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1613&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://myzubster.com" rel="noopener noreferrer"&gt;https://myzubster.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our vision is not that everyone must become a software developer.&lt;/p&gt;

&lt;p&gt;It is that &lt;strong&gt;people with different skills can build useful things, document their work and connect with one another through an open ecosystem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built in public, one contribution at a time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;— Daniel, MyZubster&lt;/p&gt;

</description>
      <category>myzubster</category>
      <category>opensource</category>
      <category>decentralized</category>
      <category>ecosystem</category>
    </item>
    <item>
      <title>Building the MyZubster Metaverse: Realtime Infrastructure, Security, Reliability, and What Comes Next</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:19:00 +0000</pubDate>
      <link>https://dev.to/danielioni/building-the-myzubster-metaverse-realtime-infrastructure-security-reliability-and-what-comes-231f</link>
      <guid>https://dev.to/danielioni/building-the-myzubster-metaverse-realtime-infrastructure-security-reliability-and-what-comes-231f</guid>
      <description>&lt;h1&gt;
  
  
  Building the MyZubster Metaverse: Realtime Infrastructure, Security, Reliability, and What Comes Next
&lt;/h1&gt;

&lt;p&gt;The MyZubster Metaverse is evolving from an experimental interactive environment into a more structured, observable, and production-oriented platform.&lt;/p&gt;

&lt;p&gt;Our goal is not simply to render a virtual world. We are building an open-source environment where authenticated users, guests, communities, developers, and AI-assisted experiences can interact through traceable and reliable services.&lt;/p&gt;

&lt;p&gt;During the latest development phase, we focused on the foundations that must exist before adding more ambitious WebXR, social, and multiplayer features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticated metaverse sessions;&lt;/li&gt;
&lt;li&gt;server-authorized world actions;&lt;/li&gt;
&lt;li&gt;realtime communication;&lt;/li&gt;
&lt;li&gt;distributed abuse protection;&lt;/li&gt;
&lt;li&gt;privacy-safe observability;&lt;/li&gt;
&lt;li&gt;MongoDB and Redis readiness;&lt;/li&gt;
&lt;li&gt;Preview infrastructure isolated from Production;&lt;/li&gt;
&lt;li&gt;automated tests and continuous evidence;&lt;/li&gt;
&lt;li&gt;explicit operational and security gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article describes what we implemented, the architectural decisions behind it, what we verified, and what still needs to happen before production rollout.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. From client-controlled actions to authenticated sessions
&lt;/h2&gt;

&lt;p&gt;One of the most important changes was moving world actions away from implicit client trust.&lt;/p&gt;

&lt;p&gt;A browser must not be able to claim an arbitrary user identity or perform a privileged action simply by sending a crafted request.&lt;/p&gt;

&lt;p&gt;The current architecture binds metaverse actions to authenticated session credentials. The server is responsible for determining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which user is connected;&lt;/li&gt;
&lt;li&gt;which role the user has;&lt;/li&gt;
&lt;li&gt;which session or community the action belongs to;&lt;/li&gt;
&lt;li&gt;whether the requested operation is permitted;&lt;/li&gt;
&lt;li&gt;whether the submitted identity matches the authenticated principal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a clear trust boundary:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
Browser input
    ↓
Authenticated HTTP or realtime session
    ↓
Server-side identity and authorization checks
    ↓
Validated world action
    ↓
Persistent or realtime state update
Client state can still improve the user experience, but it is no longer treated as authoritative security evidence.
2. Realtime access tokens
We introduced a dedicated token endpoint for the realtime subsystem.
An authenticated application session can request a short-lived realtime token. The token contains only the minimum information required by the gateway, such as:
- user identifier;
- authorized role;
- optional public username;
- correlation identifier;
- expiration time.
The response also describes the supported connection contract:
{
  "success": true,
  "expiresInSeconds": 300,
  "socketPath": "/realtime",
  "transports": ["websocket", "polling"],
  "namespaces": [
    "user:{id}",
    "community:{id}",
    "session:{id}"
  ]
}
The correlation identifier lets us connect an HTTP request, token-minting operation, socket connection, and later operational events without exposing sensitive application data.
3. Authorized realtime channels
Realtime communication is organized around explicit channel families:
user:{id}
community:{id}
session:{id}
These channels are not arbitrary rooms that a client can join freely.
The server validates whether the authenticated user may enter the requested channel. This is essential for preventing:
- cross-user subscription;
- unauthorized community access;
- session impersonation;
- client-generated room escalation;
- accidental data leakage between realtime contexts.
We are also separating connection authorization from application events. Establishing a socket connection does not automatically authorize every action that may travel through it.
4. Redis-backed distributed presence
A single-process memory map is useful during local development, but it is not sufficient for a horizontally scaled realtime service.
When multiple application instances are running, each instance sees only its own connected users. A reconnect or deployment can also destroy local presence state.
We therefore implemented a Redis-backed presence store.
Redis keeps short-lived connection records for users inside community and session channels. The implementation supports:
- adding a connection;
- refreshing its expiration;
- removing it during disconnection;
- listing active members;
- handling multiple sockets belonging to the same user;
- pruning expired records;
- detecting the first and last active connection.
Presence data uses a TTL. Stale sockets eventually disappear even when the application does not receive a clean disconnect event.
The service retains a local fallback to avoid completely breaking realtime behavior during a Redis incident. However, that fallback is considered degraded mode—not production-ready distributed presence.
5. Redis failure handling
Redis operations are wrapped with explicit failure handling.
When Redis initialization or an established operation fails, the service:
1. records an aggregate Redis failure;
2. emits a structured operational event;
3. invalidates the failed shared client;
4. falls back locally where permitted;
5. exposes the degraded state through readiness.
We deliberately avoid returning Redis connection strings, internal exception messages, usernames, or infrastructure details to public clients.
Operational errors are represented through safe categories such as:
{
  "event": "redis_presence_failure",
  "operation": "health",
  "status": "local_fallback",
  "mode": "local-fallback",
  "reason": "redis_error"
}
6. Distributed rate limiting
Metaverse actions and realtime endpoints need protection against abuse, spam, and accidental request storms.
Local counters are insufficient when traffic reaches multiple server instances, so we developed a distributed rate-limiting path using Redis.
The rate-limiting architecture is designed to support:
- authenticated user limits;
- guest or anonymous limits;
- action-specific policies;
- shared counters across instances;
- explicit retry metadata;
- privacy-safe operational metrics;
- controlled degraded behavior.
Rate limiting is part of the server-side authorization boundary. A client cannot reset its allowance by refreshing the page or connecting to a different application instance.
7. Privacy-safe observability
Operational visibility is necessary, but observability must not become a second surveillance system.
The realtime metrics endpoint is restricted to administrators and exposes aggregate counters rather than individual user activity.
Current metrics can describe behavior such as:
- connection attempts;
- successful connections;
- authorization failures;
- active connection changes;
- Redis failures;
- rate-limit decisions;
- service degradation.
The endpoint does not return raw tokens, Redis URLs, database credentials, private messages, or individual browsing histories.
A simplified response follows this pattern:
{
  "success": true,
  "privacy": "aggregate-only",
  "counters": {
    "connectionAttempts": 42,
    "connectionSuccesses": 40,
    "redisFailures": 0
  }
}
The response uses Cache-Control: no-store so operational data is not retained by shared caches.
8. A real production-readiness endpoint
We added a public readiness endpoint:
GET /api/realtime/health
Its purpose is different from a generic “the process is running” check.
The endpoint verifies whether the dependencies required by the realtime subsystem are actually operational:
- Express router;
- MongoDB connection;
- Redis connection.
A healthy response follows this contract:
{
  "success": true,
  "service": "myzubster-realtime",
  "status": "ready",
  "checks": {
    "router": "ready",
    "mongodb": "connected",
    "redis": "connected"
  },
  "timestamp": "2026-10-23T00:00:00.000Z"
}
If MongoDB or Redis is unavailable, the endpoint returns HTTP 503:
{
  "success": false,
  "service": "myzubster-realtime",
  "status": "degraded",
  "checks": {
    "router": "ready",
    "mongodb": "connected",
    "redis": "disconnected"
  }
}
Readiness therefore means more than “the route exists.” It means the service can currently use its required durable and distributed infrastructure.
9. Reusing the shared Redis client
The readiness endpoint does not create a separate Redis implementation.
It uses the same shared Redis client used by the presence store. This reduces the risk of reporting a healthy dependency through one connection while the application is using another broken connection.
The readiness function:
1. checks whether REDIS_URL is configured;
2. initializes or reuses the shared client;
3. sends PING;
4. returns a normalized status;
5. invalidates the client after a failed ping;
6. records the failure through the existing observability service.
Conceptually:
async function redisReadiness() {
  if (!redisConfigured()) {
    return { ready: false, status: "not_configured" };
  }

  const client = await getRedis();

  if (!client) {
    return { ready: false, status: "disconnected" };
  }

  try {
    await client.ping();
    return { ready: true, status: "connected" };
  } catch (error) {
    recordRedisFailure(error);
    invalidateRedisClient(client);

    return { ready: false, status: "disconnected" };
  }
}
10. Isolated Preview infrastructure
We did not reuse Production database credentials for branch deployments.
Instead, the Vercel Preview environment was connected to isolated resources:
- a dedicated MongoDB Preview database;
- a scoped MongoDB Preview user;
- a Redis resource connected through REDIS_URL;
- environment variables restricted to Preview.
This gives us a safer environment for testing readiness, presence, failure modes, and migrations.
The boundary is explicit:
Pull request branch
    ↓
Vercel Preview deployment
    ↓
Preview-only MongoDB
    ↓
Preview-only Redis
Production secrets were not copied into the branch environment, and Production was not changed during this phase.
11. Automated verification
We added tests at two levels.
Presence-store tests
The Redis presence tests verify that the service:
- reports Redis as connected after a successful ping;
- reports it as disconnected after a failed ping;
- records an alertable Redis failure;
- falls back locally when connection initialization fails;
- falls back when an established Redis operation fails.
HTTP route tests
The realtime route tests verify:
- HTTP 200 when MongoDB and Redis are ready;
- HTTP 503 when MongoDB is disconnected;
- HTTP 503 when Redis is disconnected;
- the presence of the expected readiness fields;
- Cache-Control: no-store;
- the absence of sensitive values;
- administrator-only access to aggregate metrics;
- denial of metrics access to regular users.
The main CI workflow completed successfully, including:
- backend lint;
- backend unit tests;
- frontend unit tests;
- backend build;
- frontend build;
- artifact generation.
The Seller Free policy regression workflow also passed, and the Continuous Evidence Gate produced a retained evidence artifact.
12. Current pull-request status
The readiness work is tracked in a Draft pull request.
The latest implementation includes:
- Redis readiness in the shared presence service;
- Redis gating in the public health endpoint;
- MongoDB and Redis degradation behavior;
- unit and route-level tests;
- successful Preview deployment.
The pull request remains Draft intentionally.
We have not merged it and have not performed a Production rollout.
13. The current security blocker
The latest security audit detected two dependency advisories:
- one high-severity vulnerability;
- one moderate-severity vulnerability.
The affected package is ip-address &amp;lt;= 10.7.3, and an updated version is available.
This dependency issue is separate from the Redis readiness implementation, but it is still a release gate. The lockfile and the transitive dependency path must be reviewed and updated in a focused security change.
We will not describe the branch as release-ready while a high-severity dependency audit is failing.
14. What is still missing
The core realtime foundation is substantially stronger, but MYZ-83 is not complete.
The remaining work includes the following.
Dependency remediation
Upgrade the vulnerable dependency path, regenerate the lockfile, rerun the complete audit, and verify that the change does not break network-address handling.
Load baseline
Measure the realtime system under repeatable workloads:
- concurrent socket connections;
- connection and reconnection bursts;
- channel joins and leaves;
- presence refresh operations;
- distributed rate-limit operations;
- token issuance;
- HTTP and socket latency;
- MongoDB and Redis resource consumption.
The result must include reproducible commands, environment information, and retained metrics.
Redis restart drill
We need to demonstrate what happens when Redis becomes unavailable and later returns:
Redis healthy
    ↓
Redis interrupted
    ↓
Readiness becomes degraded
    ↓
Failures are counted
    ↓
Local fallback is bounded
    ↓
Redis reconnects
    ↓
Readiness returns to ready
MongoDB restart drill
The same operational evidence is required for MongoDB:
- health transition;
- connection retry behavior;
- public response safety;
- recovery time;
- absence of credential leakage;
- final healthy state.
Multi-instance validation
Distributed presence and rate limiting must be tested with multiple application instances. A single-instance test cannot prove that Redis-backed coordination behaves correctly across replicas.
Reconnection behavior
We still need repeatable tests for:
- short network interruptions;
- token expiration;
- reconnect storms;
- duplicate sockets;
- stale presence cleanup;
- retry backoff;
- client state restoration.
Production smoke test
Production verification will happen only after:
1. security remediation;
2. completed review;
3. explicit merge authorization;
4. an approved deployment;
5. confirmation that the correct Production resources are configured.
No Production change should be inferred from the successful Preview work.
15. What comes after reliability
Once the operational foundation is accepted, we can continue with higher-level metaverse features:
- richer shared-world interactions;
- realtime community events;
- persistent avatars and progression;
- WebXR exploration;
- spatial interfaces;
- collaborative missions;
- verified contributor identities;
- connections between the Metaverse and MyZubster Knowledge;
- development requests linked to GitHub contributions;
- community-governed experiences;
- optional reward and bounty bridges backed by verifiable evidence.
The sequence matters.
WebXR and visual features are valuable, but authentication, authorization, abuse protection, distributed state, and recovery behavior must come first.
Conclusion
The latest MyZubster Metaverse work is primarily about trustworthiness.
We moved closer to a system where:
- identities are derived from authenticated sessions;
- world actions are authorized by the server;
- realtime channels have explicit access rules;
- presence and rate limits can work across multiple instances;
- Redis and MongoDB are part of the readiness contract;
- operational metrics remain aggregate and privacy-safe;
- Preview infrastructure is isolated from Production;
- CI produces reproducible technical evidence;
- known security failures remain visible instead of being hidden.
The Metaverse is not production-complete yet, but its foundation is becoming measurable, testable, and independently reviewable.
That is the kind of progress we want: not unsupported claims, but small engineering steps backed by code, tests, deployments, and evidence.
Project links
- GitHub: https://github.com/danieldirimini-myzubster/myzubster
- Metaverse: https://www.myzubster.com/metaverse
- Realtime readiness PR: https://github.com/danieldirimini-myzubster/myzubster/pull/40
- MYZ-83 roadmap issue: https://linear.app/myzubster/issue/MYZ-83/b6-realtime-observability-reliability-and-load-tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>node</category>
      <category>redis</category>
    </item>
    <item>
      <title>Building MyZubster: From a Working AI Gateway to GitHub Contributor Onboarding</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Wed, 21 Oct 2026 05:37:13 +0000</pubDate>
      <link>https://dev.to/danielioni/building-myzubster-from-a-working-ai-gateway-to-github-contributor-onboarding-4l6e</link>
      <guid>https://dev.to/danielioni/building-myzubster-from-a-working-ai-gateway-to-github-contributor-onboarding-4l6e</guid>
      <description>&lt;h1&gt;
  
  
  Building MyZubster: From a Working AI Gateway to GitHub Contributor Onboarding
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;How we connected Vercel, our VPS, local AI, and a step-by-step GitHub guide — and what our real-world tests taught us.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building an open-source platform is not just about writing code. It's about making technology accessible to people who may have never used GitHub, configured a development environment, or contributed to a repository before.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;MyZubster&lt;/strong&gt;, we're working toward a decentralized ecosystem where people can share skills, collaborate on projects, and build independent services.&lt;/p&gt;

&lt;p&gt;Today, we made measurable progress on one important part of that vision: &lt;strong&gt;Zorgax, our AI assistant.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Restoring the connection between Vercel and our VPS
&lt;/h2&gt;

&lt;p&gt;Our application runs through Vercel, while part of our backend infrastructure and local AI services operate on a VPS.&lt;/p&gt;

&lt;p&gt;Previously, requests to the Zorgax assistant could fail with HTTP 502 errors.&lt;/p&gt;

&lt;p&gt;We worked on a signed HTTPS gateway connecting the Vercel deployment to the VPS backend.&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vercel Production successfully communicates with the Zorgax gateway.&lt;/li&gt;
&lt;li&gt;The backend responds to assistant requests.&lt;/li&gt;
&lt;li&gt;Our local AI infrastructure remains available on the VPS.&lt;/li&gt;
&lt;li&gt;We confirmed successful HTTP 200 responses during testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an important infrastructure milestone, but it does not mean every feature is finished.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Giving Zorgax a practical job: helping new contributors
&lt;/h2&gt;

&lt;p&gt;We want Zorgax to do more than answer general questions.&lt;/p&gt;

&lt;p&gt;One of its first practical responsibilities is to help people join MyZubster through GitHub.&lt;/p&gt;

&lt;p&gt;A new contributor should be able to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi Zorgax, help me create a GitHub profile for MyZubster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And receive a clear first step, rather than a complicated technical explanation.&lt;/p&gt;

&lt;p&gt;We introduced a local GitHub onboarding guide that starts with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Create your GitHub account.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://github.com/signup" rel="noopener noreferrer"&gt;https://github.com/signup&lt;/a&gt;, complete the registration, and return when ready.&lt;/p&gt;

&lt;p&gt;The assistant also reminds users not to share passwords or verification codes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Teaching the assistant to remember progress
&lt;/h2&gt;

&lt;p&gt;Our first live tests revealed a problem.&lt;/p&gt;

&lt;p&gt;Zorgax correctly started the registration process, but after a contributor supplied a GitHub username, it sometimes restarted Step 1.&lt;/p&gt;

&lt;p&gt;We traced the issue to the onboarding rules.&lt;/p&gt;

&lt;p&gt;We then introduced username recognition and used conversation history to identify whether the contributor had already started the registration process.&lt;/p&gt;

&lt;p&gt;The updated assistant can now respond:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Step 2 — You've provided your GitHub username. Open PowerShell and check your Git and GitHub CLI installations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This change was tested before deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regression test results: 4/4 passed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tests covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starting GitHub registration.&lt;/li&gt;
&lt;li&gt;GitHub social login guidance.&lt;/li&gt;
&lt;li&gt;Handling login errors.&lt;/li&gt;
&lt;li&gt;Recognizing a contributor's GitHub username.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After applying the change, restarting the VPS service, and testing the public chat, we confirmed that Zorgax progressed to Step 2 instead of restarting registration.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Local AI and privacy-conscious processing
&lt;/h2&gt;

&lt;p&gt;Our VPS runs local AI services, including Ollama.&lt;/p&gt;

&lt;p&gt;During the onboarding tests, we observed two response paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;local-rule · github-guide&lt;/code&gt; — deterministic instructions for GitHub onboarding.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;local-ollama · qwen2.5:3b&lt;/code&gt; — responses generated by the local language model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test responses reported &lt;code&gt;privacy_local_only&lt;/code&gt;, indicating local processing for those requests.&lt;/p&gt;

&lt;p&gt;This architecture allows us to combine predictable instructions for critical workflows with a language model for more flexible assistance.&lt;/p&gt;

&lt;p&gt;However, the distinction matters: a model-generated answer is not the same as a verified workflow step.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What didn't work yet
&lt;/h2&gt;

&lt;p&gt;Our next test simulated a Windows user who had Git and GitHub CLI installed.&lt;/p&gt;

&lt;p&gt;Instead of progressing to GitHub authentication, Zorgax switched to Ollama and began discussing the creation of a MyZubster character.&lt;/p&gt;

&lt;p&gt;That wasn't the expected response.&lt;/p&gt;

&lt;p&gt;The correct next step should be to guide the contributor through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify authentication using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without requesting passwords, tokens, or private credentials.&lt;/p&gt;

&lt;p&gt;This exposed the next engineering task: extending the deterministic onboarding guide so that the AI doesn't lose track of the contributor's actual objective.&lt;/p&gt;

&lt;p&gt;We are not presenting this part as complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What's next for MyZubster?
&lt;/h2&gt;

&lt;p&gt;Our next development priorities are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete Git and GitHub CLI installation checks.&lt;/li&gt;
&lt;li&gt;Guide contributors through GitHub authentication.&lt;/li&gt;
&lt;li&gt;Help users configure their local Git identity.&lt;/li&gt;
&lt;li&gt;Connect contributors to the appropriate MyZubster repository.&lt;/li&gt;
&lt;li&gt;Guide their first fork and pull request.&lt;/li&gt;
&lt;li&gt;Make the onboarding experience usable by people without programming experience.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Longer term, we want Zorgax to support the MyZubster marketplace, contributor collaboration, and independent projects — without making the platform unnecessarily complicated.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Why this matters
&lt;/h2&gt;

&lt;p&gt;MyZubster is exploring a model where contributors can participate not only by writing code, but also by offering services, documenting knowledge, testing software, and connecting independent projects.&lt;/p&gt;

&lt;p&gt;A useful AI assistant should lower the barrier to participation.&lt;/p&gt;

&lt;p&gt;It should explain one step at a time, remember progress, avoid claiming that something has been verified when it hasn't, and help people become more independent.&lt;/p&gt;

&lt;p&gt;Today we didn't finish the entire onboarding journey.&lt;/p&gt;

&lt;p&gt;But we verified that our Production assistant can start it, recognize a GitHub username, and continue to the next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small, tested improvements are how an open-source ecosystem becomes usable.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Join the project
&lt;/h3&gt;

&lt;p&gt;Website: &lt;a href="https://www.myzubster.com" rel="noopener noreferrer"&gt;https://www.myzubster.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zorgax assistant: &lt;a href="https://www.myzubster.com/zorgax" rel="noopener noreferrer"&gt;https://www.myzubster.com/zorgax&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/MyZubster-Ecosystem" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're interested in contributors who want to help simplify onboarding, improve local AI workflows, test the marketplace, or explore decentralized collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you expect an open-source AI assistant to do when helping a complete beginner make their first GitHub contribution?&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #github #ai #nodejs
&lt;/h1&gt;

</description>
      <category>github</category>
      <category>ai</category>
      <category>contributor</category>
      <category>myzubster</category>
    </item>
    <item>
      <title>Building the MyZubster Metaverse: Sessions, Verified Identities, CI Hardening, and the Road Ahead</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:57:10 +0000</pubDate>
      <link>https://dev.to/danielioni/building-the-myzubster-metaverse-sessions-verified-identities-ci-hardening-and-the-road-ahead-2k4</link>
      <guid>https://dev.to/danielioni/building-the-myzubster-metaverse-sessions-verified-identities-ci-hardening-and-the-road-ahead-2k4</guid>
      <description>&lt;p&gt;Building the MyZubster Metaverse: Sessions, Verified Identities, CI Hardening, and the Road Ahead&lt;br&gt;
MyZubster is evolving from a traditional community platform into an experimental open-source metaverse where people, contributors, knowledge, and software services can interact through verifiable identities and authenticated actions.&lt;br&gt;
This article summarizes what we have implemented, what is currently operational, and what still needs to be completed before the system can be considered production-ready.&lt;br&gt;
What We Are Building&lt;br&gt;
The MyZubster Metaverse is designed as a connected environment composed of several layers:&lt;br&gt;
User identity&lt;br&gt;
    ↓&lt;br&gt;
Authenticated session&lt;br&gt;
    ↓&lt;br&gt;
Metaverse character&lt;br&gt;
    ↓&lt;br&gt;
World actions&lt;br&gt;
    ↓&lt;br&gt;
Realtime services&lt;br&gt;
    ↓&lt;br&gt;
Verified Knowledge and Zorgax&lt;br&gt;
    ↓&lt;br&gt;
GitHub contributions and Development Requests&lt;br&gt;
The goal is not simply to render a virtual world. We want every relevant action to have a verifiable context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who initiated the action?&lt;/li&gt;
&lt;li&gt;Which session authorized it?&lt;/li&gt;
&lt;li&gt;Which character represents the user?&lt;/li&gt;
&lt;li&gt;When does the authorization expire?&lt;/li&gt;
&lt;li&gt;Which backend service accepted the action?&lt;/li&gt;
&lt;li&gt;Can another participant independently verify the result?
Public Metaverse Interface
The public Metaverse page is available at:
&lt;a href="https://www.myzubster.com/metaverse" rel="noopener noreferrer"&gt;https://www.myzubster.com/metaverse&lt;/a&gt;
The interface currently exposes the public layer of the ecosystem, including registered characters and verified explorers.
During our latest production verification, the page loaded correctly with:&lt;/li&gt;
&lt;li&gt;25 public characters&lt;/li&gt;
&lt;li&gt;7 verified explorers&lt;/li&gt;
&lt;li&gt;No blocking browser-console errors&lt;/li&gt;
&lt;li&gt;Successful Vercel production deployment
This public interface is only one part of the system. The most important work has been happening underneath it: authentication, session isolation, action authorization, workflow reliability, and contributor identity integration.
Binding World Actions to Session Credentials
One of the most important architectural changes is the transition from anonymous or loosely identified requests to session-bound world actions.
A metaverse action should not be accepted only because the client sends a character identifier. The backend must derive authority from a trusted session.
The intended request flow is:
Client
→ authenticated request
→ session credential validation
→ active lease verification
→ character ownership resolution
→ action policy validation
→ world-state mutation
This prevents a client from impersonating another character merely by changing an identifier in the request payload.
The server-side authority model follows a rule similar to:
const session = await resolveAuthenticatedSession(request);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;if (!session) {&lt;br&gt;
  throw new UnauthorizedError();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const lease = await getActiveSessionLease(session.id);&lt;/p&gt;

&lt;p&gt;if (!lease || lease.expiresAt &amp;lt;= new Date()) {&lt;br&gt;
  throw new SessionExpiredError();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const character = await resolveCharacterForSession(session);&lt;/p&gt;

&lt;p&gt;await authorizeWorldAction({&lt;br&gt;
  session,&lt;br&gt;
  lease,&lt;br&gt;
  character,&lt;br&gt;
  action: request.body.action,&lt;br&gt;
});&lt;br&gt;
The important principle is that identity must be derived from the authenticated context—not trusted directly from client-controlled fields.&lt;br&gt;
Session Lease Lifecycle&lt;br&gt;
Persistent sessions are useful, but unlimited sessions are dangerous. We therefore introduced a session-lease model.&lt;br&gt;
A lease represents the limited period during which a session may perform metaverse actions.&lt;br&gt;
Conceptually, the lifecycle is:&lt;br&gt;
CREATED&lt;br&gt;
   ↓&lt;br&gt;
ACTIVE&lt;br&gt;
   ↓&lt;br&gt;
RENEWED ─────┐&lt;br&gt;
   ↓         │&lt;br&gt;
EXPIRED      │&lt;br&gt;
   ↓         │&lt;br&gt;
REVOKED ←────┘&lt;br&gt;
A lease can become invalid because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its expiration time has passed.&lt;/li&gt;
&lt;li&gt;The user logged out.&lt;/li&gt;
&lt;li&gt;The account was disabled.&lt;/li&gt;
&lt;li&gt;The credential was rotated.&lt;/li&gt;
&lt;li&gt;The session was explicitly revoked.&lt;/li&gt;
&lt;li&gt;A security policy invalidated older sessions.
World-action endpoints must reject expired or revoked leases even when the original session cookie or token is still present.
This creates a clear separation between:&lt;/li&gt;
&lt;li&gt;Authentication: proving which account initiated a request.&lt;/li&gt;
&lt;li&gt;Authorization: deciding which action that account may perform.&lt;/li&gt;
&lt;li&gt;Lease validity: determining whether the authorization is still active.
Zorgax and Contributor Identities
Zorgax is the identity and knowledge layer connecting public contributor profiles, GitHub activity, Knowledge Cards, and metaverse characters.
The current model distinguishes carefully between:&lt;/li&gt;
&lt;li&gt;A public GitHub alias&lt;/li&gt;
&lt;li&gt;A MyZubster account&lt;/li&gt;
&lt;li&gt;A professional profile&lt;/li&gt;
&lt;li&gt;A metaverse character&lt;/li&gt;
&lt;li&gt;A verified external identity
These concepts must not be treated as interchangeable.
A GitHub-connected contributor can be represented as a proposed character, but this does not automatically imply:&lt;/li&gt;
&lt;li&gt;Legal identity verification&lt;/li&gt;
&lt;li&gt;Employment&lt;/li&gt;
&lt;li&gt;Ownership&lt;/li&gt;
&lt;li&gt;Partnership&lt;/li&gt;
&lt;li&gt;Payment eligibility&lt;/li&gt;
&lt;li&gt;Institutional endorsement
Character onboarding therefore uses an explicit opt-in process. A proposed character remains in a draft state until the contributor accepts it.
GitHub contribution
↓
Optional character proposal
↓
Explicit contributor acceptance
↓
Registered public character
This protects contributors from being automatically represented in the metaverse without consent.
Distributed Rate Limiting
Authentication alone is not enough. Authenticated clients can still generate excessive traffic, spam actions, or create concurrency problems.
The Metaverse roadmap includes distributed rate limiting for:&lt;/li&gt;
&lt;li&gt;Authentication attempts&lt;/li&gt;
&lt;li&gt;Session creation and renewal&lt;/li&gt;
&lt;li&gt;Character movement&lt;/li&gt;
&lt;li&gt;World interactions&lt;/li&gt;
&lt;li&gt;Realtime messages&lt;/li&gt;
&lt;li&gt;Profile updates&lt;/li&gt;
&lt;li&gt;Public API searches
A local in-memory rate limiter is insufficient when several application instances are running. Each instance would maintain a different counter.
Production enforcement must therefore use shared state:
Client requests
↓
Vercel or application instances
↓
Shared rate-limit backend
↓
Atomic counter and expiration
The rate-limit key should combine the smallest amount of information required by the policy:
const key = [
"metaverse",
actionType,
sessionId,
accountId,
].join(":");
IP addresses should be used carefully. They can be useful for abuse prevention, but they are personal data and may group unrelated users behind the same network.
Realtime Architecture
The next major layer is realtime communication.
The Metaverse will eventually require:&lt;/li&gt;
&lt;li&gt;Presence updates&lt;/li&gt;
&lt;li&gt;Character movement&lt;/li&gt;
&lt;li&gt;Interaction events&lt;/li&gt;
&lt;li&gt;Session revocation propagation&lt;/li&gt;
&lt;li&gt;World-state synchronization&lt;/li&gt;
&lt;li&gt;Reconnection and missed-event recovery
A robust realtime system cannot assume that messages arrive exactly once or in order.
Each event should include enough information to detect duplicates and stale updates:
{
"eventId": "evt_01...",
"worldId": "myzubster-main",
"characterId": "character_...",
"sessionId": "session_...",
"sequence": 1842,
"type": "character.position.updated",
"occurredAt": "2026-10-19T04:50:00.000Z",
"payload": {
"x": 12.4,
"y": 0,
"z": -8.1
}
}
The client should be able to reconnect with its last accepted sequence number and request any missing state.
GitHub Actions and Node.js 24
We also completed an important CI modernization.
GitHub reported that older JavaScript actions were still using the deprecated Node.js 20 runtime. We updated the affected workflows:&lt;/li&gt;
&lt;li&gt;uses: actions/checkout@v4&lt;/li&gt;
&lt;li&gt;uses: actions/setup-node@v4
to:&lt;/li&gt;
&lt;li&gt;uses: actions/checkout@v5&lt;/li&gt;
&lt;li&gt;uses: actions/setup-node@v5
The update covered:&lt;/li&gt;
&lt;li&gt;12 workflow files&lt;/li&gt;
&lt;li&gt;26 action references&lt;/li&gt;
&lt;li&gt;CI and lint&lt;/li&gt;
&lt;li&gt;Security auditing&lt;/li&gt;
&lt;li&gt;SBOM generation&lt;/li&gt;
&lt;li&gt;Vercel deployment&lt;/li&gt;
&lt;li&gt;Continuous evidence validation&lt;/li&gt;
&lt;li&gt;Seller policy regression tests&lt;/li&gt;
&lt;li&gt;MYZ ledger verification&lt;/li&gt;
&lt;li&gt;Pilot API tests&lt;/li&gt;
&lt;li&gt;Decentraland SDK7 proofs
Before publishing the change, we verified that:&lt;/li&gt;
&lt;li&gt;All 16 workflow YAML files parsed successfully.&lt;/li&gt;
&lt;li&gt;No affected v4 references remained.&lt;/li&gt;
&lt;li&gt;Only files under .github/workflows were modified.&lt;/li&gt;
&lt;li&gt;Workflow triggers, permissions, jobs, and commands remained unchanged.
The change was published through Pull Request #38 and squash-merged into main.
Final production commit:
69ef67716df50482e8fbf9960ccab7dfc37d3000
Post-Merge Verification
The merge triggered a complete verification cycle on main.
All seven post-merge workflows completed successfully:&lt;/li&gt;
&lt;li&gt;CI — Test and Lint&lt;/li&gt;
&lt;li&gt;Security Audit&lt;/li&gt;
&lt;li&gt;SBOM and Vulnerability Scan&lt;/li&gt;
&lt;li&gt;Continuous Evidence Gate&lt;/li&gt;
&lt;li&gt;MYZ Canonical Ledger Contract&lt;/li&gt;
&lt;li&gt;MYZ-164 Seller Free Policy&lt;/li&gt;
&lt;li&gt;Deploy to Vercel
The Vercel deployment also completed successfully.
This matters because updating a GitHub Action runtime can affect checkout behavior, dependency caching, authentication, build paths, and artifact handling. The post-merge results confirmed that the new runtime did not introduce an observable regression.
What Is Already Working
The current verified baseline includes:&lt;/li&gt;
&lt;li&gt;A deployed public Metaverse interface&lt;/li&gt;
&lt;li&gt;Public characters and verified explorers&lt;/li&gt;
&lt;li&gt;GitHub-connected contributor identities&lt;/li&gt;
&lt;li&gt;Optional Zorgax character proposals&lt;/li&gt;
&lt;li&gt;Session-based authorization work&lt;/li&gt;
&lt;li&gt;Session lease lifecycle enforcement&lt;/li&gt;
&lt;li&gt;Knowledge and profile integration&lt;/li&gt;
&lt;li&gt;Security and SBOM automation&lt;/li&gt;
&lt;li&gt;Continuous evidence checks&lt;/li&gt;
&lt;li&gt;Automated Vercel deployment&lt;/li&gt;
&lt;li&gt;Node.js 24-compatible GitHub Actions
What Still Needs to Be Completed&lt;/li&gt;
&lt;li&gt;Complete Authentication and Session Enforcement
Every state-changing metaverse endpoint must use the same canonical authentication path.
We still need to verify:&lt;/li&gt;
&lt;li&gt;Logout revocation&lt;/li&gt;
&lt;li&gt;Credential rotation&lt;/li&gt;
&lt;li&gt;Concurrent sessions&lt;/li&gt;
&lt;li&gt;Expired leases&lt;/li&gt;
&lt;li&gt;Disabled accounts&lt;/li&gt;
&lt;li&gt;Cross-account character access&lt;/li&gt;
&lt;li&gt;Replay attempts&lt;/li&gt;
&lt;li&gt;Finish Distributed Rate Limiting
The policy must be enforced through a shared backend and tested across multiple application instances.
Required tests include:&lt;/li&gt;
&lt;li&gt;Boundary requests&lt;/li&gt;
&lt;li&gt;Concurrent requests&lt;/li&gt;
&lt;li&gt;Retry behavior&lt;/li&gt;
&lt;li&gt;Counter expiration&lt;/li&gt;
&lt;li&gt;Fail-open versus fail-closed behavior&lt;/li&gt;
&lt;li&gt;Recovery when the shared backend is unavailable&lt;/li&gt;
&lt;li&gt;Complete Realtime Synchronization
Realtime work must include:&lt;/li&gt;
&lt;li&gt;Presence&lt;/li&gt;
&lt;li&gt;Movement&lt;/li&gt;
&lt;li&gt;Interaction events&lt;/li&gt;
&lt;li&gt;Reconnection&lt;/li&gt;
&lt;li&gt;Missed-event recovery&lt;/li&gt;
&lt;li&gt;Duplicate suppression&lt;/li&gt;
&lt;li&gt;Ordering guarantees&lt;/li&gt;
&lt;li&gt;Backpressure handling&lt;/li&gt;
&lt;li&gt;Add Privacy-Safe Analytics
We need operational visibility without unnecessarily collecting personal information.
Useful metrics include:&lt;/li&gt;
&lt;li&gt;Active sessions&lt;/li&gt;
&lt;li&gt;Lease-renewal failures&lt;/li&gt;
&lt;li&gt;Realtime disconnections&lt;/li&gt;
&lt;li&gt;Rejected actions&lt;/li&gt;
&lt;li&gt;Rate-limit activations&lt;/li&gt;
&lt;li&gt;World-state latency&lt;/li&gt;
&lt;li&gt;API error rates
Sensitive identifiers should be minimized, truncated, aggregated, or pseudonymized.&lt;/li&gt;
&lt;li&gt;Reliability and Load Testing
Before expanding the public experience, we need repeatable tests for:&lt;/li&gt;
&lt;li&gt;Concurrent users&lt;/li&gt;
&lt;li&gt;Character movement bursts&lt;/li&gt;
&lt;li&gt;Realtime fan-out&lt;/li&gt;
&lt;li&gt;Session-store latency&lt;/li&gt;
&lt;li&gt;Rate-limit contention&lt;/li&gt;
&lt;li&gt;Backend restarts&lt;/li&gt;
&lt;li&gt;Partial infrastructure failure&lt;/li&gt;
&lt;li&gt;Deployment rollback&lt;/li&gt;
&lt;li&gt;End-to-End Acceptance Testing
The complete user journey must be tested:
Sign in
→ create or select a character
→ establish a session lease
→ enter the metaverse
→ perform an authorized action
→ receive a realtime update
→ reconnect
→ recover state
→ log out
→ confirm the session can no longer act&lt;/li&gt;
&lt;li&gt;WebXR
WebXR remains a later milestone.
It should be introduced only after authentication, realtime communication, abuse prevention, and reliability are stable. Adding an immersive client before stabilizing these layers would only make the system harder to secure and debug.
The Current Priority Order
Our recommended implementation sequence is:&lt;/li&gt;
&lt;li&gt;Authentication and session enforcement&lt;/li&gt;
&lt;li&gt;Distributed rate limiting&lt;/li&gt;
&lt;li&gt;Realtime synchronization&lt;/li&gt;
&lt;li&gt;Privacy-safe analytics&lt;/li&gt;
&lt;li&gt;Reliability and load testing&lt;/li&gt;
&lt;li&gt;End-to-end acceptance&lt;/li&gt;
&lt;li&gt;WebXR client
Conclusion
The MyZubster Metaverse is no longer only a visual concept. It now has an increasingly concrete technical foundation built around authenticated sessions, explicit contributor consent, verifiable identities, automated security checks, and reproducible deployments.
There is still substantial work ahead. Realtime synchronization, distributed abuse protection, complete session enforcement, load testing, and WebXR are not finished.
Our objective is to publish progress without presenting experimental components as completed production systems. Each milestone should be supported by source code, automated tests, deployment evidence, and independently inspectable results.
That is how we want to build the MyZubster Metaverse: incrementally, transparently, and with verifiable evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6:56&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>opensource</category>
      <category>myzubster</category>
    </item>
    <item>
      <title># MyZubster: Building an Open-Source Ecosystem Where Skills, Projects, Marketplaces and Independent Nodes Connect</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Sun, 18 Oct 2026 04:03:39 +0000</pubDate>
      <link>https://dev.to/danielioni/-myzubster-building-an-open-source-ecosystem-where-skills-projects-marketplaces-and-independent-3g0h</link>
      <guid>https://dev.to/danielioni/-myzubster-building-an-open-source-ecosystem-where-skills-projects-marketplaces-and-independent-3g0h</guid>
      <description>&lt;h1&gt;
  
  
  MyZubster: Building an Open-Source Ecosystem Where Skills, Projects, Marketplaces and Independent Nodes Connect
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;What if your GitHub contributions, real-world skills, independent projects and local communities could become part of one interoperable ecosystem — without giving up ownership of your work?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;strong&gt;MyZubster&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We are building an open-source ecosystem designed to connect people, knowledge, software, services and independent projects.&lt;/p&gt;

&lt;p&gt;Our goal is not simply to create another marketplace, another AI assistant or another decentralized application.&lt;/p&gt;

&lt;p&gt;We want to explore how these components can work together to help people &lt;strong&gt;demonstrate what they know, share what they create, offer services and collaborate across independent environments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And we're inviting developers, designers, researchers, creators and community members to participate.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://www.myzubster.com/" rel="noopener noreferrer"&gt;https://www.myzubster.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Vision: From a Single Platform to an Ecosystem
&lt;/h2&gt;

&lt;p&gt;Most digital platforms organize activity around one central service.&lt;/p&gt;

&lt;p&gt;Users create accounts, publish content, build reputations and offer services. But their contributions often remain locked inside that platform.&lt;/p&gt;

&lt;p&gt;MyZubster is exploring a different approach.&lt;/p&gt;

&lt;p&gt;We want people and projects to maintain their own identities, repositories, infrastructure and evidence of work while connecting to a wider network.&lt;/p&gt;

&lt;p&gt;Imagine a developer maintaining an independent GitHub repository, an artist publishing digital creations, a gardener documenting an urban garden, and a community group offering equipment or technical services.&lt;/p&gt;

&lt;p&gt;They have different skills and different needs.&lt;/p&gt;

&lt;p&gt;But they could all participate in the same ecosystem through shared connections:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity → Skills → Contributions → Evidence → Projects → Services → Opportunities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the direction we're building toward.&lt;/p&gt;

&lt;p&gt;MyZubster is currently an evolving MVP, with working components, technical experiments and features that still require integration and validation.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Marketplace: Turn Skills Into Services
&lt;/h2&gt;

&lt;p&gt;One of the most accessible ways to participate is through the &lt;strong&gt;MyZubster Marketplace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is straightforward: people should be able to offer what they know how to do, what they create, or the resources they can share.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software development and website creation&lt;/li&gt;
&lt;li&gt;AI integrations and automation&lt;/li&gt;
&lt;li&gt;Graphic design and digital art&lt;/li&gt;
&lt;li&gt;Technical support and consulting&lt;/li&gt;
&lt;li&gt;Tutoring and knowledge sharing&lt;/li&gt;
&lt;li&gt;Audio equipment and sound-system services&lt;/li&gt;
&lt;li&gt;Gardening and local community services&lt;/li&gt;
&lt;li&gt;Creative projects and equipment rental&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also want to support non-commercial exchanges, such as sharing resources or participating in community initiatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why combine a marketplace with open source?
&lt;/h3&gt;

&lt;p&gt;A GitHub repository can demonstrate that someone has written code.&lt;/p&gt;

&lt;p&gt;But it does not automatically help that person find a customer or explain what service they can provide.&lt;/p&gt;

&lt;p&gt;A marketplace listing creates a different opportunity.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;A developer contributes to an open-source integration, documents the work on GitHub, and creates a Marketplace listing offering similar development services.&lt;/p&gt;

&lt;p&gt;Their public contributions may help prospective collaborators understand their experience.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;a GitHub contribution is evidence of specific work, not automatic professional certification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Likewise, creating a listing does not guarantee customers or earnings.&lt;/p&gt;

&lt;p&gt;The goal is to make useful connections possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore the Marketplace:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.myzubster.com/community-marketplace.html" rel="noopener noreferrer"&gt;https://www.myzubster.com/community-marketplace.html&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. GitHub: Where Developers Can Build With Us
&lt;/h2&gt;

&lt;p&gt;GitHub is a central part of the MyZubster development process.&lt;/p&gt;

&lt;p&gt;Our repository provides an entry point for developers who want to inspect the code, report problems, propose improvements or contribute new functionality.&lt;/p&gt;

&lt;p&gt;You do not need to be an experienced blockchain engineer or infrastructure specialist to participate.&lt;/p&gt;

&lt;p&gt;There are opportunities across several areas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend and user experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Improve accessibility, onboarding, mobile layouts, Marketplace interfaces and contributor profiles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend and integrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Work on APIs, authentication, data models, interoperability and automated tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI and automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Explore how Zorgax and supporting AI services can help people understand projects, document work and navigate the ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure and security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contribute to Docker environments, Tor Onion experiments, deployment documentation, observability and resilience testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation and community&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Improve guides, translations, tutorials, contributor onboarding and real-world pilot documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to start contributing
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Visit the main repository.&lt;/li&gt;
&lt;li&gt;Read the README and contribution guidance.&lt;/li&gt;
&lt;li&gt;Explore existing GitHub issues.&lt;/li&gt;
&lt;li&gt;Choose a small task that matches your interests.&lt;/li&gt;
&lt;li&gt;Comment on the issue with your proposed approach.&lt;/li&gt;
&lt;li&gt;Fork the repository and create a dedicated branch.&lt;/li&gt;
&lt;li&gt;Submit a pull request with reproducible evidence.&lt;/li&gt;
&lt;li&gt;Participate in code review and improve the contribution when needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contributions are reviewed before acceptance. Opening a PR does not automatically establish eligibility for payment or a verified credential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main repository:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open invitation to choose a contributor role:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1622" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1622&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Zorgax: AI as a Tool for Participation
&lt;/h2&gt;

&lt;p&gt;Not everyone knows how to navigate a large open-source repository.&lt;/p&gt;

&lt;p&gt;Not everyone knows how to describe their skills or organize technical documentation.&lt;/p&gt;

&lt;p&gt;This is one of the problems we want &lt;strong&gt;Zorgax&lt;/strong&gt;, the AI component of MyZubster, to help address.&lt;/p&gt;

&lt;p&gt;The broader direction includes assisting people with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding available contribution paths&lt;/li&gt;
&lt;li&gt;Exploring GitHub profiles and public contributions&lt;/li&gt;
&lt;li&gt;Drafting skill descriptions and biographies&lt;/li&gt;
&lt;li&gt;Organizing project documentation&lt;/li&gt;
&lt;li&gt;Discovering relevant learning resources&lt;/li&gt;
&lt;li&gt;Preparing structured knowledge records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI should assist people rather than make unsupported claims about their abilities.&lt;/p&gt;

&lt;p&gt;For example, an AI-generated description of someone's expertise is not proof that they possess that expertise.&lt;/p&gt;

&lt;p&gt;A useful system should distinguish what someone declares, what their work demonstrates, and what has been independently verified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore Zorgax:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.myzubster.com/zorgax" rel="noopener noreferrer"&gt;https://www.myzubster.com/zorgax&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Contributor Passport: Making Work and Skills More Visible
&lt;/h2&gt;

&lt;p&gt;Imagine that someone contributes to an open-source project, documents a real-world experiment, helps maintain infrastructure or publishes a reusable technical resource.&lt;/p&gt;

&lt;p&gt;How can that work become discoverable beyond a single issue or conversation?&lt;/p&gt;

&lt;p&gt;This is the motivation behind the &lt;strong&gt;Contributor Passport&lt;/strong&gt; concept.&lt;/p&gt;

&lt;p&gt;We are developing a model that can connect:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributor → Contribution → Knowledge → Evidence → Review → Recognition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Contributor Passport could reference accepted pull requests, project artifacts, documented tests and other relevant evidence.&lt;/p&gt;

&lt;p&gt;The goal is not to generate artificial reputation scores.&lt;/p&gt;

&lt;p&gt;It is to make the relationship between a person, their work and the supporting evidence easier to inspect.&lt;/p&gt;

&lt;h3&gt;
  
  
  A simple example
&lt;/h3&gt;

&lt;p&gt;Suppose a contributor builds a Docker integration.&lt;/p&gt;

&lt;p&gt;Their public record might reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The GitHub repository&lt;/li&gt;
&lt;li&gt;The relevant pull request&lt;/li&gt;
&lt;li&gt;The code changes&lt;/li&gt;
&lt;li&gt;The test results&lt;/li&gt;
&lt;li&gt;The review status&lt;/li&gt;
&lt;li&gt;A description of the specific technical work completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can help other people discover the contribution and understand its limits.&lt;/p&gt;

&lt;p&gt;Public profiles and evidence sharing should remain consent-based and privacy-conscious.&lt;/p&gt;

&lt;p&gt;The Passport is an evolving component of the ecosystem, not a universally recognized professional credential.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Knowledge Graph: Connecting People, Projects and Evidence
&lt;/h2&gt;

&lt;p&gt;The next challenge is connecting knowledge across different contributors and projects.&lt;/p&gt;

&lt;p&gt;A traditional list of profiles tells us who participates.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Knowledge Graph&lt;/strong&gt; can help describe how things relate.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;A developer contributes a software integration.&lt;/p&gt;

&lt;p&gt;That integration supports a local project.&lt;/p&gt;

&lt;p&gt;The local project produces documentation and experimental results.&lt;/p&gt;

&lt;p&gt;Another contributor uses those results to build something new.&lt;/p&gt;

&lt;p&gt;Instead of storing these as disconnected records, the ecosystem can link them through structured relationships.&lt;/p&gt;

&lt;p&gt;This could make it easier to discover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who contributed to a project&lt;/li&gt;
&lt;li&gt;Which repositories contain relevant work&lt;/li&gt;
&lt;li&gt;What evidence supports a knowledge claim&lt;/li&gt;
&lt;li&gt;Which skills are associated with particular contributions&lt;/li&gt;
&lt;li&gt;How independent projects depend on or build upon one another&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A graph connection does not automatically prove that a claim is scientifically correct or professionally certified.&lt;/p&gt;

&lt;p&gt;It is a way to organize and trace information.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. LIFE: Connecting Open Source to Real-World Projects
&lt;/h2&gt;

&lt;p&gt;Software becomes more meaningful when it helps people accomplish something outside the development environment.&lt;/p&gt;

&lt;p&gt;MyZubster's LIFE-oriented pilot work explores connections between digital tools and real-world activities.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community resource sharing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Documenting exchanges, such as kefir cultures, and exploring how community knowledge and marketplace listings can support them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Urban gardening&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connecting gardening activities, photographs, practical knowledge and potentially environmental sensors to a digital project record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creative communities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supporting artists, sound-system groups and independent cultural projects with documentation, listings and technical collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open knowledge projects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exploring how research, documentation and reusable software can be linked to public evidence.&lt;/p&gt;

&lt;p&gt;These are pilot directions with different levels of maturity.&lt;/p&gt;

&lt;p&gt;They should not be mistaken for completed scientific validations, commercial deployments or institutional endorsements.&lt;/p&gt;

&lt;p&gt;The aim is to make the technology useful to actual people and communities.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Decentralization: Independent Nodes, Not Just One Central Server
&lt;/h2&gt;

&lt;p&gt;One of the most ambitious parts of MyZubster is the move toward a network of independently operated environments.&lt;/p&gt;

&lt;p&gt;Today, many open-source projects still depend on one maintainer, one server or one organization.&lt;/p&gt;

&lt;p&gt;We want to explore how contributors can operate their own services while remaining connected through documented interfaces and shared evidence.&lt;/p&gt;

&lt;p&gt;A contributor might maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Their own GitHub repository&lt;/li&gt;
&lt;li&gt;A local Docker environment&lt;/li&gt;
&lt;li&gt;An independent VPS&lt;/li&gt;
&lt;li&gt;A project-specific API&lt;/li&gt;
&lt;li&gt;A Tor Onion service&lt;/li&gt;
&lt;li&gt;A separate knowledge or marketplace integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important principle is &lt;strong&gt;independent ownership with optional interoperability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A contributor should not have to transfer ownership of their infrastructure or project to participate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Our Docker and Tor Onion experiments
&lt;/h3&gt;

&lt;p&gt;MyZubster's main Docker Compose configuration includes an Onion service capable of generating and persisting a Tor v3 Onion identity when the service is started.&lt;/p&gt;

&lt;p&gt;This makes it possible for different installations to have different Onion addresses.&lt;/p&gt;

&lt;p&gt;However, installing the repository does not by itself prove that Tor is running or that an endpoint is reachable.&lt;/p&gt;

&lt;p&gt;We are currently testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolated Docker networks&lt;/li&gt;
&lt;li&gt;Tor Onion services&lt;/li&gt;
&lt;li&gt;HAProxy routing&lt;/li&gt;
&lt;li&gt;Service availability&lt;/li&gt;
&lt;li&gt;Identity persistence&lt;/li&gt;
&lt;li&gt;Recovery after interruptions&lt;/li&gt;
&lt;li&gt;Independent-node interoperability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An isolated static Onion pilot has been documented, but this does not yet demonstrate that the complete MyZubster platform operates as a decentralized production federation.&lt;/p&gt;

&lt;p&gt;We are explicitly separating laboratory results from independently verified production capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tor Onion pilot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1584" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1584&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voluntary node registry:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1623" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1623&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. A Real Example: Independent Contributor Projects
&lt;/h2&gt;

&lt;p&gt;The decentralization vision becomes more concrete when we look at contributor-owned work.&lt;/p&gt;

&lt;p&gt;One example is the N4K48 project associated with contributor Nicola.&lt;/p&gt;

&lt;p&gt;Its documented interoperability experiments involve a contributor-operated agent, an authenticated broker and a creative catalog.&lt;/p&gt;

&lt;p&gt;Other contributors, including Wasim, have worked on reproducing and testing parts of this integration in isolated environments.&lt;/p&gt;

&lt;p&gt;These experiments are useful because they explore whether software developed and operated independently can exchange information through defined interfaces.&lt;/p&gt;

&lt;p&gt;There is an important distinction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A working integration through a central broker is not the same as a fully independent peer-to-peer network.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our next technical milestones include reproducible cross-node tests, failure recovery and independently reviewed evidence.&lt;/p&gt;

&lt;p&gt;The goal is to make the architecture increasingly portable and resilient.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. DAO and Shared Governance: Distributing Responsibility
&lt;/h2&gt;

&lt;p&gt;Decentralization is not only about servers.&lt;/p&gt;

&lt;p&gt;It is also about decisions, maintenance, responsibility and economic sustainability.&lt;/p&gt;

&lt;p&gt;MyZubster is exploring a &lt;strong&gt;DAO-inspired governance model&lt;/strong&gt; in which contributors can voluntarily participate in clearly defined areas of work.&lt;/p&gt;

&lt;p&gt;Possible responsibilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintaining a software component&lt;/li&gt;
&lt;li&gt;Reviewing pull requests&lt;/li&gt;
&lt;li&gt;Operating an independent node&lt;/li&gt;
&lt;li&gt;Documenting technical standards&lt;/li&gt;
&lt;li&gt;Supporting a community pilot&lt;/li&gt;
&lt;li&gt;Reviewing contribution evidence&lt;/li&gt;
&lt;li&gt;Proposing improvements to shared governance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Participation should not require someone to purchase a VPS or assume financial obligations.&lt;/p&gt;

&lt;p&gt;Likewise, contributing code does not automatically make someone a DAO member or grant governance authority.&lt;/p&gt;

&lt;p&gt;Our governance work is still experimental. A complete decentralized governance system should not be assumed to exist merely because we have published proposals and coordination issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is to distribute meaningful responsibility, not just distribute tasks while keeping every decision centralized.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Payments, Monero and Sustainable Open Source
&lt;/h2&gt;

&lt;p&gt;For an ecosystem to last, it needs more than technical enthusiasm.&lt;/p&gt;

&lt;p&gt;It needs a sustainable economic model.&lt;/p&gt;

&lt;p&gt;MyZubster is experimenting with ways to connect services, marketplace activity and contributor rewards.&lt;/p&gt;

&lt;p&gt;The broader payment direction includes conventional payment infrastructure and privacy-conscious cryptocurrency options, including Monero.&lt;/p&gt;

&lt;p&gt;Monero is relevant to our exploration because financial privacy can matter to independent participants.&lt;/p&gt;

&lt;p&gt;But payment infrastructure must be approached carefully.&lt;/p&gt;

&lt;p&gt;There are important distinctions between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A proposed reward and an approved budget&lt;/li&gt;
&lt;li&gt;An accepted contribution and a payment obligation&lt;/li&gt;
&lt;li&gt;An internal accounting unit and a transferable cryptocurrency&lt;/li&gt;
&lt;li&gt;A transaction record and independently verified settlement&lt;/li&gt;
&lt;li&gt;A marketplace listing and an actual customer purchase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;MYZ&lt;/strong&gt; concept is currently treated as an internal reward/accounting mechanism unless a separate settlement arrangement is explicitly established.&lt;/p&gt;

&lt;p&gt;We do not want to promise earnings, funded bounties or automatic cryptocurrency rewards that have not been approved and financed.&lt;/p&gt;

&lt;h3&gt;
  
  
  What would make MyZubster sustainable?
&lt;/h3&gt;

&lt;p&gt;Our long-term hypothesis is that a useful marketplace, independently maintained services and verifiable contributions could reinforce one another.&lt;/p&gt;

&lt;p&gt;People offer useful services.&lt;/p&gt;

&lt;p&gt;Customers and communities receive value.&lt;/p&gt;

&lt;p&gt;Contributors improve the software.&lt;/p&gt;

&lt;p&gt;Independent operators maintain their own infrastructure.&lt;/p&gt;

&lt;p&gt;A transparent, sustainable economic model could help fund shared services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That cycle is a goal to validate, not an achievement we are claiming today.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  12. How You Can Join MyZubster Today
&lt;/h2&gt;

&lt;p&gt;There is no single correct way to participate.&lt;/p&gt;

&lt;p&gt;You can choose the path that matches your interests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Path A — Become a Marketplace seller
&lt;/h3&gt;

&lt;p&gt;If you have a skill, service or creative product, explore the Marketplace and try creating a listing.&lt;/p&gt;

&lt;p&gt;You might offer development, design, technical assistance, local services or another legitimate service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marketplace:&lt;/strong&gt; &lt;a href="https://www.myzubster.com/community-marketplace.html" rel="noopener noreferrer"&gt;https://www.myzubster.com/community-marketplace.html&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Path B — Become a GitHub contributor
&lt;/h3&gt;

&lt;p&gt;If you enjoy building software, start by exploring the repository.&lt;/p&gt;

&lt;p&gt;Choose a small issue, discuss the proposed change and submit a pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Path C — Connect your independent project
&lt;/h3&gt;

&lt;p&gt;Already working on something?&lt;/p&gt;

&lt;p&gt;You can explore how your project might connect through documentation, APIs, evidence or a pilot integration.&lt;/p&gt;

&lt;p&gt;You do not need to give up your repository or infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributor roles:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1622" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1622&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Path D — Experiment with independent infrastructure
&lt;/h3&gt;

&lt;p&gt;If you have experience with Linux, Docker, Tor or networking, you can help document and test independent-node architecture.&lt;/p&gt;

&lt;p&gt;Participation is voluntary, and production access or infrastructure spending is not required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Onion node registry:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1623" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1623&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Path E — Contribute knowledge or a real-world pilot
&lt;/h3&gt;

&lt;p&gt;You do not need to be a programmer.&lt;/p&gt;

&lt;p&gt;You may be able to help through documentation, community initiatives, local projects, usability feedback or knowledge sharing.&lt;/p&gt;

&lt;p&gt;Start with something small and demonstrable.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. What We're Looking for Next
&lt;/h2&gt;

&lt;p&gt;We're particularly interested in people who want to help us answer practical questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a new user create a useful Marketplace listing without assistance?&lt;/li&gt;
&lt;li&gt;Can a first-time contributor complete a GitHub task with clear guidance?&lt;/li&gt;
&lt;li&gt;Can independent projects exchange data through documented interfaces?&lt;/li&gt;
&lt;li&gt;Can a contributor-operated Onion service be verified without exposing private information?&lt;/li&gt;
&lt;li&gt;Can knowledge and contribution evidence be made portable?&lt;/li&gt;
&lt;li&gt;Can the ecosystem generate enough real-world value to sustain its infrastructure and maintenance?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are open engineering, product and community questions.&lt;/p&gt;

&lt;p&gt;We believe the most useful way to answer them is to build small, reproducible experiments and share the results.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. An Invitation to Build Together
&lt;/h2&gt;

&lt;p&gt;MyZubster is not a finished decentralized economy.&lt;/p&gt;

&lt;p&gt;It is an open-source project exploring how marketplaces, AI assistance, verifiable skills, community knowledge and independently operated infrastructure can work together.&lt;/p&gt;

&lt;p&gt;Some components are operational.&lt;/p&gt;

&lt;p&gt;Others are prototypes, proposals or experiments.&lt;/p&gt;

&lt;p&gt;We're looking for people who want to help turn those ideas into useful, testable software and real-world applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can start without spending money, operating a server or making a long-term commitment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a listing.&lt;/p&gt;

&lt;p&gt;Read an issue.&lt;/p&gt;

&lt;p&gt;Submit a small improvement.&lt;/p&gt;

&lt;p&gt;Document an experiment.&lt;/p&gt;

&lt;p&gt;Introduce a project.&lt;/p&gt;

&lt;p&gt;Help another contributor.&lt;/p&gt;

&lt;p&gt;The network becomes meaningful when independent people can create value together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Join the ecosystem
&lt;/h3&gt;

&lt;p&gt;🌐 &lt;strong&gt;MyZubster:&lt;/strong&gt; &lt;a href="https://www.myzubster.com/" rel="noopener noreferrer"&gt;https://www.myzubster.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🛒 &lt;strong&gt;Marketplace:&lt;/strong&gt; &lt;a href="https://www.myzubster.com/community-marketplace.html" rel="noopener noreferrer"&gt;https://www.myzubster.com/community-marketplace.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🤖 &lt;strong&gt;Zorgax:&lt;/strong&gt; &lt;a href="https://www.myzubster.com/zorgax" rel="noopener noreferrer"&gt;https://www.myzubster.com/zorgax&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🤝 &lt;strong&gt;Choose your contribution path:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1622" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1622&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧅 &lt;strong&gt;Independent Onion nodes:&lt;/strong&gt; &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1623" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1623&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you like to contribute: code, a service, a skill, a local project, or an independent node?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tell us in the comments or join the discussion on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let's build useful connections between people, knowledge and independent technology.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>webdev</category>
      <category>community</category>
    </item>
    <item>
      <title>We Built Our First Isolated Tor v3 Onion Service for MyZubster 🧅</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Sat, 17 Oct 2026 07:21:20 +0000</pubDate>
      <link>https://dev.to/danielioni/we-built-our-first-isolated-tor-v3-onion-service-for-myzubster-1g87</link>
      <guid>https://dev.to/danielioni/we-built-our-first-isolated-tor-v3-onion-service-for-myzubster-1g87</guid>
      <description>&lt;h1&gt;
  
  
  We Built Our First Isolated Tor v3 Onion Service for MyZubster 🧅
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;An open-source experiment in privacy, Docker isolation, and decentralized infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At MyZubster, we're exploring how independent contributors can build and operate interoperable services without relying on a single centralized infrastructure.&lt;/p&gt;

&lt;p&gt;Today, we reached a new technical milestone: &lt;strong&gt;our first isolated Tor v3 Onion pilot successfully completed the Tor bootstrap process and displayed its experimental web page.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a small but meaningful step toward our broader vision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;The pilot uses a deliberately minimal architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tor Browser
    |
    v
Tor v3 Onion Service
    |
    v
Isolated HAProxy
    |
    v
Static MyZubster Pilot Page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The environment includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dedicated Tor container running Tor 0.4.9.11&lt;/li&gt;
&lt;li&gt;An isolated HAProxy container&lt;/li&gt;
&lt;li&gt;Separate Docker networks&lt;/li&gt;
&lt;li&gt;A persistent volume for the Onion service identity&lt;/li&gt;
&lt;li&gt;A static experimental page&lt;/li&gt;
&lt;li&gt;No intended access to MyZubster production APIs, wallets, or payment services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The proxy was configured to return HTTP 200 for the homepage and HTTP 404 for &lt;code&gt;/api&lt;/code&gt; and &lt;code&gt;/admin&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our First Successful Tor Bootstrap
&lt;/h2&gt;

&lt;p&gt;During the initial tests, we encountered Docker permission errors when Tor attempted to switch to its dedicated system user.&lt;/p&gt;

&lt;p&gt;After adjusting the container capabilities, Tor started successfully.&lt;/p&gt;

&lt;p&gt;The logs eventually confirmed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bootstrapped 100% (done): Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also generated a dedicated Onion v3 address:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://lrkjukwcbn7ftl7nkhuaefarwqymxx6xzopt77qa7mc4uinbdxrzn4id.onion" rel="noopener noreferrer"&gt;http://lrkjukwcbn7ftl7nkhuaefarwqymxx6xzopt77qa7mc4uinbdxrzn4id.onion&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The experimental page displays:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MyZubster Onion Pilot&lt;br&gt;&lt;br&gt;
Experimental Tor v3 service.&lt;br&gt;&lt;br&gt;
Isolated technical pilot without API or payment access.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This demonstrates an initial working proof of concept. It is not yet a production-ready, independently security-audited deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does This Matter?
&lt;/h2&gt;

&lt;p&gt;MyZubster is exploring a model where contributors can connect their own projects, services, skills, and infrastructure.&lt;/p&gt;

&lt;p&gt;Our longer-term goals include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent infrastructure nodes&lt;/li&gt;
&lt;li&gt;Interoperability between contributor projects&lt;/li&gt;
&lt;li&gt;Privacy-conscious access through Tor&lt;/li&gt;
&lt;li&gt;Verifiable contributions and digital contributor passports&lt;/li&gt;
&lt;li&gt;Community-driven governance and resource sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decentralization is not simply adding a blockchain or an Onion address.&lt;/p&gt;

&lt;p&gt;It requires real operational independence, reproducible deployments, clear security boundaries, and contributors who can maintain services without depending on a single administrator.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next? Contributor-Led Development
&lt;/h2&gt;

&lt;p&gt;We're inviting &lt;strong&gt;@wasim-builds&lt;/strong&gt; to help advance the next phase of this Tor/HAProxy pilot.&lt;/p&gt;

&lt;p&gt;The proposed work includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reproducible Docker Compose configuration&lt;/li&gt;
&lt;li&gt;Network isolation and threat-model documentation&lt;/li&gt;
&lt;li&gt;Meaningful health checks and rollback procedures&lt;/li&gt;
&lt;li&gt;End-to-end Tor Browser testing&lt;/li&gt;
&lt;li&gt;Recovery tests after container restarts or network changes&lt;/li&gt;
&lt;li&gt;Independent code review&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is an opt-in open-source contribution proposal, not a confirmed paid assignment.&lt;/p&gt;

&lt;p&gt;You can follow the technical discussion here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1584" rel="noopener noreferrer"&gt;MyZubster GitHub — Tor Onion Pilot #1584&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1605" rel="noopener noreferrer"&gt;Contributor Operations and DAO Pilots #1605&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Experiment
&lt;/h2&gt;

&lt;p&gt;We're looking for developers interested in Tor, Docker, networking, privacy engineering, and interoperable open-source infrastructure.&lt;/p&gt;

&lt;p&gt;You don't need to operate a VPS or join a DAO to contribute.&lt;/p&gt;

&lt;p&gt;Start with a review, a reproducible test, documentation, or a small pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal isn't to claim we've already decentralized everything. It's to build and verify one independent component at a time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Explore the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://www.myzubster.com/" rel="noopener noreferrer"&gt;https://www.myzubster.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;MyZubster — Connecting people, knowledge, projects, and independent infrastructure.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #tor #docker #privacy
&lt;/h1&gt;

</description>
      <category>opensource</category>
      <category>tor</category>
      <category>docker</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Building the MyZubster Metaverse: Secure Sessions, Verified Identities and the Road to Realtime</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Sat, 17 Oct 2026 05:19:27 +0000</pubDate>
      <link>https://dev.to/danielioni/building-the-myzubster-metaverse-secure-sessions-verified-identities-and-the-road-to-realtime-57i5</link>
      <guid>https://dev.to/danielioni/building-the-myzubster-metaverse-secure-sessions-verified-identities-and-the-road-to-realtime-57i5</guid>
      <description>&lt;h1&gt;
  
  
  Building the MyZubster Metaverse: Secure Sessions, Verified Identities and the Road to Realtime
&lt;/h1&gt;

&lt;p&gt;The MyZubster Metaverse is evolving from a visual experiment into a real, testable multiplayer environment.&lt;/p&gt;

&lt;p&gt;Our objective is not simply to render avatars on a page. We are building an open-source world where guest users, verified contributors and independent communities can interact through a shared identity and knowledge layer.&lt;/p&gt;

&lt;p&gt;The public entry point is now available here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.myzubster.com/metaverse" rel="noopener noreferrer"&gt;https://www.myzubster.com/metaverse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article explains what we have implemented, the security work completed in our latest development cycle, the current architecture and what still needs to be built before the platform can be considered production-ready at scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the MyZubster Metaverse is
&lt;/h2&gt;

&lt;p&gt;The MyZubster Metaverse is intended to connect several parts of the ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;public and verified user profiles;&lt;/li&gt;
&lt;li&gt;GitHub contributor identities;&lt;/li&gt;
&lt;li&gt;Zorgax characters;&lt;/li&gt;
&lt;li&gt;Verified Knowledge;&lt;/li&gt;
&lt;li&gt;community spaces;&lt;/li&gt;
&lt;li&gt;Development Requests;&lt;/li&gt;
&lt;li&gt;open-source contributions;&lt;/li&gt;
&lt;li&gt;optional rewards and bounties;&lt;/li&gt;
&lt;li&gt;future immersive WebXR experiences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current version focuses on the foundations: identity, presence, sessions and authenticated world actions.&lt;/p&gt;

&lt;p&gt;Users can currently enter the world as guests without requiring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a cryptocurrency wallet;&lt;/li&gt;
&lt;li&gt;identity documents;&lt;/li&gt;
&lt;li&gt;a GitHub account;&lt;/li&gt;
&lt;li&gt;an installed application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verified MyZubster explorers can also be displayed with their associated public GitHub identity.&lt;/p&gt;

&lt;p&gt;This gives us two different identity levels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Guest explorers&lt;/strong&gt;, who can enter quickly using a public display name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verified explorers&lt;/strong&gt;, whose public character is linked to an authorized account or GitHub identity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verification here does not mean KYC or legal identity verification. It only represents a confirmed connection with the declared public account.&lt;/p&gt;




&lt;h1&gt;
  
  
  What we have implemented
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Public Metaverse entry point
&lt;/h2&gt;

&lt;p&gt;The production interface now provides a dedicated Metaverse route:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
https://www.myzubster.com/metaverse
The entry interface includes:
- guest onboarding;
- public display-name selection;
- automatic character creation;
- verified explorer discovery;
- multilingual UI support;
- links to account-based authentication.
The guest path is intentionally lightweight. A user can explore the world without being forced to create a permanent account first.
2. World presence model
The backend maintains a presence record for each active Metaverse participant.
A presence can contain information such as:
{
  sessionId,
  displayName,
  characterId,
  accountId,
  githubLogin,
  position,
  status,
  lastSeenAt
}
The public representation deliberately excludes private credentials and internal security fields.
Presence data is used by the world API to support operations such as:
- joining the world;
- synchronizing visible participants;
- moving a character;
- sending chat messages;
- publishing emotes;
- leaving the world;
- retrieving world events.
Before our latest security work, knowing a public session identifier could potentially be sufficient to target mutable session routes. That is not an acceptable trust boundary for a multiplayer environment.
A public identifier must identify a session, but it must never prove ownership of it.
The latest milestone: possession-bound sessions
Our latest merged pull request introduces possession-based session credentials.
Pull request:
👉 MyZubster PR #34 — Bind world actions to session credentials
Production commit:
148a798
This work creates a security boundary between:
- the public session identifier;
- the private credential required to control that session.
How session creation now works
When a player joins the world, the backend creates:
1. a public sessionId;
2. a cryptographically random private session token.
The token is generated from 32 random bytes, providing 256 bits of entropy.
Conceptually:
const sessionToken = crypto.randomBytes(32).toString("base64url");
The raw token is returned to the client only when the session is created.
It is never included in public player data.
3. Only the token digest is stored
The backend does not persist the raw session token.
Instead, it calculates a SHA-256 digest:
const tokenHash = crypto
  .createHash("sha256")
  .update(sessionToken)
  .digest("hex");
The presence record stores the digest:
{
  sessionId,
  sessionTokenHash: tokenHash
}
This reduces the impact of an accidental database disclosure. An attacker reading the presence collection would not immediately obtain the active bearer credentials.
A token cannot be recovered directly from its digest.
4. Constant-time credential verification
Mutable world routes verify the submitted credential against the stored digest.
The comparison uses a constant-time operation to reduce timing side-channel exposure:
crypto.timingSafeEqual(expectedBuffer, receivedBuffer);
Credential validation is centralized in an ownership middleware similar to:
requireOwnedSession
The middleware checks that:
- the session exists;
- the private token was provided;
- the submitted token produces the expected digest;
- the credential belongs to the requested session.
Missing or invalid credentials result in an unauthorized response.
HTTP 401 Unauthorized
5. Protected world actions
The following routes are now protected by session ownership verification:
/sync
/move
/chat
/emote
/leave
/events
Knowing another player’s public sessionId is no longer sufficient to:
- move that player;
- send messages as that player;
- publish their emotes;
- synchronize private session state;
- remove them from the world;
- retrieve protected session events.
This closes an important class of horizontal session-ownership vulnerabilities.
6. Tokens are sent through a dedicated header
The frontend now sends the private credential through:
X-Metaverse-Session-Token: &amp;lt;private-token&amp;gt;
Example:
const createSessionHeaders = (sessionToken) =&amp;gt; ({
  "X-Metaverse-Session-Token": sessionToken,
});
The token is not placed inside normal public JSON payloads:
{
  "sessionId": "public-session-id",
  "x": 120,
  "y": 80
}
Separating authorization data from world-state payloads makes the security boundary clearer and reduces the risk of credentials being copied into:
- application logs;
- analytics events;
- public state;
- debugging output;
- serialized world events.
The backend temporarily supports a legacy request-body token for compatibility, but the header is the canonical client mechanism.
7. Credentials remain in memory
The browser keeps the Metaverse session credential in React runtime memory.
We deliberately avoid storing it in:
localStorage
sessionStorage
public profile objects
world event payloads
In-memory credentials disappear when the page or browser session is closed.
This does not eliminate every browser-side threat, especially an active cross-site scripting vulnerability, but it reduces long-lived credential exposure.
Privacy and identity boundaries
The Metaverse must distinguish several concepts that are often incorrectly combined:
Account identity
      ↓
Public profile
      ↓
Character identity
      ↓
Temporary world session
      ↓
Private session credential
A public GitHub profile proves control of a public contributor account only when an authorization flow verifies it.
It does not automatically prove:
- legal identity;
- employment;
- institutional affiliation;
- ownership of an organization;
- eligibility for payment;
- control of a blockchain wallet.
Similarly, the public session ID identifies an active world session, but only the private session credential authorizes mutations for that session.
These distinctions are now documented in the repository’s Metaverse privacy and security documentation.
Testing completed
The session-ownership work includes backend, frontend and static architecture tests.
Backend verification
The targeted backend suites cover:
- secure token creation;
- SHA-256 digest persistence;
- successful authorized operations;
- missing credential rejection;
- invalid credential rejection;
- attempts to mutate another player’s session;
- exclusion of credentials from public payloads;
- protected movement, chat, emote, synchronization and leave routes.
Result:
3 targeted backend suites
22 tests passed
Frontend verification
Frontend tests validate:
- token retention in application memory;
- use of X-Metaverse-Session-Token;
- authorized API requests;
- session-aware world operations;
- absence of the token from public request bodies.
Result:
1 targeted frontend suite
5 tests passed
Build and integration verification
We also completed:
Production frontend build: successful
git diff --check: clean
MYZ-164 Marketplace regression: passed
Vercel preview deployments: successful
Main deployment: successful
The implementation was squash-merged into main and deployed through the production workflow.
Current architecture
The current architecture can be summarized as:
React Metaverse Client
        |
        | HTTPS requests
        | X-Metaverse-Session-Token
        v
Node.js / Express Metaverse API
        |
        | ownership middleware
        | token hashing and verification
        v
Metaverse Presence Storage
        |
        v
Shared world polling and event synchronization
The current system provides a practical foundation, but it is not yet the final realtime architecture.
What still needs to be completed
1. Realtime transport
The current shared-world model still relies on polling-based synchronization in important areas.
The next architectural step is to introduce a proper realtime transport, most likely based on:
- WebSockets;
- Socket.IO;
- Server-Sent Events for selected read-only streams;
- a message broker when horizontal scaling becomes necessary.
Realtime transport must include:
- authenticated connection establishment;
- session-token validation;
- connection-to-session binding;
- reconnect handling;
- event ordering;
- duplicate-event protection;
- backpressure controls;
- presence expiry.
We should not simply move the existing endpoints to WebSockets. The event protocol must be explicitly designed and versioned.
2. Distributed rate limiting
In-memory rate limiting is insufficient when multiple backend instances process requests.
We still need a distributed limiter for:
- session creation;
- movement events;
- chat messages;
- emotes;
- authentication attempts;
- reconnect operations.
Possible storage layers include Redis or another shared atomic counter service.
The limiter should support dimensions such as:
IP address
account ID
session ID
route
world or room ID
time window
Movement events should have different limits from chat or authentication attempts.
3. Session lifecycle and revocation
Possession-bound credentials are now implemented, but lifecycle management needs additional work.
Remaining tasks include:
- explicit session expiration;
- server-side revocation;
- automatic removal of abandoned sessions;
- token rotation;
- reconnect-safe credential renewal;
- maximum active sessions per account;
- logout across devices;
- suspicious-session invalidation.
We also need clear rules for temporary guest sessions versus authenticated persistent characters.
4. Stronger account authentication
Verified characters need a canonical authentication path.
The roadmap includes:
- stable GitHub OAuth integration;
- verified account-to-character linking;
- protection against account-link substitution;
- clear reauthorization flows;
- audit trails for identity changes;
- recovery procedures.
The Metaverse must never trust a GitHub username supplied directly by the browser without verifying control of that account.
5. Privacy-safe analytics
We need operational visibility without building invasive tracking.
Metrics should focus on system health:
- active anonymous sessions;
- session duration ranges;
- API latency;
- reconnect frequency;
- rate-limit events;
- server errors;
- world capacity;
- event throughput.
We should avoid collecting unnecessary personal identifiers.
Analytics data needs:
- documented retention;
- aggregation;
- access restrictions;
- deletion rules;
- explicit separation from public profile data.
6. Reliability and load testing
The next reliability milestone must test realistic concurrent behavior.
Scenarios should include:
- many simultaneous joins;
- movement bursts;
- reconnect storms;
- inactive sessions;
- malformed events;
- duplicate events;
- slow clients;
- backend restarts;
- database latency;
- multiple application instances.
The system needs measurable targets for:
maximum concurrent participants
p95 and p99 API latency
event delivery delay
error rate
recovery time
presence consistency
7. Complete end-to-end acceptance tests
Unit and integration tests are not sufficient for the entire world flow.
We still need automated E2E tests covering:
Guest joins
→ session credential is issued
→ character becomes visible
→ movement is synchronized
→ chat and emotes are authorized
→ another session cannot impersonate the guest
→ reconnect behavior is correct
→ session leaves or expires
Equivalent tests are required for verified characters.
8. WebXR and immersive clients
WebXR remains a later-stage objective.
Before adding immersive rendering, we need to stabilize:
- authentication;
- world protocol;
- realtime synchronization;
- abuse prevention;
- accessibility;
- performance;
- mobile behavior.
The WebXR client should consume the same documented world protocol rather than implementing an independent backend.
This will allow multiple compatible clients:
2D web client
3D browser client
WebXR client
mobile client
community-built client
9. Dependency security debt
The current repository still reports dependency vulnerabilities during npm audit.
The latest Metaverse pull request did not modify package or lock files, so these findings were not introduced by the session-security work.
However, they remain real technical debt.
They must be handled in a separate dependency-hardening cycle involving:
1. vulnerability classification;
2. identification of production versus development exposure;
3. safe direct dependency updates;
4. transitive dependency analysis;
5. regression testing;
6. replacement of abandoned packages;
7. lockfile regeneration;
8. SBOM and audit evidence updates.
We should not hide or disable the audit simply to obtain a green badge.
Proposed next development sequence
The recommended order is:
1. Stabilize session expiration and revocation
2. Implement distributed rate limiting
3. Complete canonical account authentication
4. Design the versioned realtime event protocol
5. Introduce authenticated WebSocket connections
6. Add privacy-safe operational metrics
7. Execute reliability and load testing
8. Complete full guest and verified-user E2E tests
9. Resolve dependency security debt
10. Start the WebXR client milestone
Security and reliability must come before graphical complexity.
Open-source collaboration
We are looking for developers and independent testers interested in:
- Node.js and Express;
- React;
- realtime systems;
- WebSockets;
- MongoDB;
- Redis;
- application security;
- abuse prevention;
- privacy engineering;
- load testing;
- WebXR;
- open-source documentation.
Repository:
👉 https://github.com/danieldirimini-myzubster/myzubster
Public Metaverse:
👉 https://www.myzubster.com/metaverse
Recent security implementation:
👉 https://github.com/danieldirimini-myzubster/myzubster/pull/34
Conclusion
The MyZubster Metaverse now has a stronger technical foundation.
We have moved from trusting public session identifiers to enforcing private possession-bound credentials for mutable world actions.
The platform now includes:
- public guest access;
- verified explorer discovery;
- character presence;
- protected world operations;
- 256-bit session credentials;
- SHA-256 token digests;
- constant-time verification;
- header-based authorization;
- memory-only client credentials;
- backend and frontend tests;
- automated production deployment.
The next challenge is no longer simply creating more visual features.
It is building a secure, realtime, distributed and independently testable world protocol that can support different clients and communities without sacrificing privacy or transparency.
That is the direction of the next MyZubster Metaverse milestones.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>metaverse</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>MyZubster: From a Centralized VPS to a Network of Independent Nodes — The Work of Nicola N4K48 and Wasim</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Thu, 15 Oct 2026 05:24:59 +0000</pubDate>
      <link>https://dev.to/danielioni/myzubster-from-a-centralized-vps-to-a-network-of-independent-nodes-the-work-of-nicola-n4k48-and-7ci</link>
      <guid>https://dev.to/danielioni/myzubster-from-a-centralized-vps-to-a-network-of-independent-nodes-the-work-of-nicola-n4k48-and-7ci</guid>
      <description>&lt;h1&gt;
  
  
  MyZubster: From a Centralized VPS to a Network of Independent Nodes — The Work of Nicola N4K48 and Wasim
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Open source, Docker, Tor, interoperability, verifiable knowledge, and distributed governance: we are exploring an ecosystem where contributors can build, verify, and eventually operate independent nodes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decentralization does not begin with a cryptocurrency. It begins when multiple people can develop, verify, and operate a system without depending entirely on a single administrator.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the direction we are exploring with &lt;a href="https://myzubster.com" rel="noopener noreferrer"&gt;MyZubster&lt;/a&gt;, an open-source ecosystem connecting a marketplace, AI tools, independent projects, contributors, and verifiable knowledge.&lt;/p&gt;

&lt;p&gt;Our goal is not simply to create another marketplace.&lt;/p&gt;

&lt;p&gt;We want to build an ecosystem where developers, artists, researchers, and local communities can contribute their own projects, document their work, demonstrate their skills, and progressively operate independent infrastructure.&lt;/p&gt;

&lt;p&gt;Two contributors are helping turn this vision into a concrete technical roadmap:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nicola (N4K48) and Wasim (@wasim-builds).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Their work represents two complementary approaches to decentralization.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Nicola N4K48: Building an Independent Node
&lt;/h2&gt;

&lt;p&gt;Nicola is developing an experimental model connecting creative projects, digital catalogs, software agents, and Docker-based infrastructure.&lt;/p&gt;

&lt;p&gt;His work addresses a fundamental question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an independent project maintain its technical autonomy while interoperating with the wider MyZubster ecosystem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The documented checkpoints include local catalog and agent verification, alongside a previously completed authenticated connection test between the MyZubster VPS and the N4K48 node.&lt;/p&gt;

&lt;p&gt;Following credential rotation, the agent has remained offline pending authorization for any further authenticated testing.&lt;/p&gt;

&lt;p&gt;This is an important principle: decentralization must not come at the expense of security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nicola's GitHub contributions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1583" rel="noopener noreferrer"&gt;DAO Pilot #1583 — Independent Node Replication and Interoperability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1505" rel="noopener noreferrer"&gt;Pilot Node Network #1505 — Connecting Independent Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1520" rel="noopener noreferrer"&gt;Contributor Bridge #1520 — Opt-in Links and Interoperability Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1551" rel="noopener noreferrer"&gt;Second Independent Node Checkpoint #1551&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1499" rel="noopener noreferrer"&gt;Docker Node Reproduction #1499 — Proposed Bounty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1176" rel="noopener noreferrer"&gt;Nicola Comics #1176 — Zorgax Catalog Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1474" rel="noopener noreferrer"&gt;Contributor Update #1474 — Docker Nodes and NFT Provenance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nicola's work demonstrates how an independent creative project can also become an experiment in autonomous infrastructure, verifiable contributions, and interoperability.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Wasim: Designing Resilient and Reproducible Infrastructure
&lt;/h2&gt;

&lt;p&gt;While Nicola is experimenting with an independent node, Wasim is working on the technical foundations that could make this model safer, more resilient, and easier to reproduce.&lt;/p&gt;

&lt;p&gt;His contributions currently cover four major areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Tor Onion, HAProxy, and Docker
&lt;/h3&gt;

&lt;p&gt;Wasim has prepared an architecture proposal involving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker containerization&lt;/li&gt;
&lt;li&gt;HAProxy reverse proxy&lt;/li&gt;
&lt;li&gt;Tor Onion connectivity&lt;/li&gt;
&lt;li&gt;Threat modeling&lt;/li&gt;
&lt;li&gt;Reproducible local tests&lt;/li&gt;
&lt;li&gt;Rollback procedures&lt;/li&gt;
&lt;li&gt;Security evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is to investigate ways of improving service resilience and reducing infrastructure dependencies.&lt;/p&gt;

&lt;p&gt;His reported tests were performed in an isolated local environment, without exposing host ports, using real credentials, or consuming external VPS resources.&lt;/p&gt;

&lt;p&gt;The design is documented in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1584" rel="noopener noreferrer"&gt;Issue #1584 — Wasim's DAO Pilot: Tor Onion and Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1610" rel="noopener noreferrer"&gt;Draft PR #1610 — Tor/HAProxy/Docker Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; This is currently a technical proposal under review, not a production Tor service or an operational independent node.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Pastebin → GitHub → Zorgax Interoperability
&lt;/h3&gt;

&lt;p&gt;Another contribution focuses on connecting external information sources to MyZubster's verifiable knowledge system.&lt;/p&gt;

&lt;p&gt;Wasim has updated a technical design for an evidence-ingestion workflow with security protections, provenance checks, and human review.&lt;/p&gt;

&lt;p&gt;The proposal includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS-only source restrictions&lt;/li&gt;
&lt;li&gt;Redirect blocking&lt;/li&gt;
&lt;li&gt;Protection against requests to private network addresses&lt;/li&gt;
&lt;li&gt;Deterministic rejection tests&lt;/li&gt;
&lt;li&gt;Payload limits&lt;/li&gt;
&lt;li&gt;Sensitive-information filtering&lt;/li&gt;
&lt;li&gt;Mandatory human review before accepting evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The proposed evidence format uses:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;myzubster.knowledge.evidence.v1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The goal is to establish a clear distinction between information that has been submitted, imported, reviewed, and verified.&lt;/p&gt;

&lt;p&gt;External information should not automatically become trusted knowledge.&lt;/p&gt;

&lt;p&gt;Related work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1591" rel="noopener noreferrer"&gt;Issue #1591 — Pastebin → GitHub → Zorgax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1611" rel="noopener noreferrer"&gt;Draft PR #1611 — Interoperability Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C. Contributor Passport Privacy
&lt;/h3&gt;

&lt;p&gt;Wasim has also participated in reviewing privacy protections for the MyZubster Contributor Passport.&lt;/p&gt;

&lt;p&gt;The underlying principle is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A contributor's personal information should not become publicly accessible without appropriate consent controls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is particularly important when connecting identities, technical contributions, skills, evidence, and reputation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1599" rel="noopener noreferrer"&gt;PR #1599 — Contributor Passport Privacy Gate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  D. GitHub CI Reliability and Hardhat 3
&lt;/h3&gt;

&lt;p&gt;Decentralized infrastructure also requires reliable and independently verifiable software.&lt;/p&gt;

&lt;p&gt;Wasim has contributed to GitHub Actions troubleshooting and reviewed the migration to Hardhat 3.&lt;/p&gt;

&lt;p&gt;His review covered a change separating NFT tooling from the main application's dependency structure.&lt;/p&gt;

&lt;p&gt;We are also investigating CI failures in our development fork.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1608" rel="noopener noreferrer"&gt;Issue #1608 — CI Reliability and Security Audit Triage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1604" rel="noopener noreferrer"&gt;PR #1604 — Hardhat 3 Migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danieldirimini-myzubster/myzubster/pull/32" rel="noopener noreferrer"&gt;PR #32 — Fork Security Audit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. What Are We Building Together?
&lt;/h2&gt;

&lt;p&gt;Our long-term objective is to evolve MyZubster into a federated ecosystem of independently operated projects.&lt;/p&gt;

&lt;p&gt;A simplified conceptual architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                MyZubster Ecosystem
                        |
          +-------------+-------------+
          |             |             |
      Nicola Node   Future Node   Future Node
        N4K48        Wasim?       Contributor
          |             |             |
     Docker/Agent   Tor/HAProxy    Independent
     Local Catalog  Docker         Application
          |             |             |
          +-------------+-------------+
                        |
               Interoperability
                        |
                  Zorgax / APIs
                        |
              Knowledge &amp;amp; Evidence
                        |
              Contributor Passport
                        |
                   Marketplace
                        |
                DAO Governance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;This diagram represents a proposed architecture, not an already operational federation. Wasim has not yet confirmed an independently operated production node.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The idea is that contributors could retain control over their own projects while choosing how to connect them to a shared ecosystem.&lt;/p&gt;

&lt;p&gt;Different MyZubster components would serve complementary purposes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zorgax&lt;/strong&gt; could help contributors explore and organize connected knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Contributor Passport&lt;/strong&gt; could document identities, skills, contributions, and supporting evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Marketplace&lt;/strong&gt; could enable contributors to offer services, products, and technical expertise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Independent nodes&lt;/strong&gt; could host projects without requiring every service to run on the founder's central VPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DAO governance&lt;/strong&gt; could eventually help distribute responsibilities, decision-making, infrastructure costs, and rewards.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why We Want to Reduce Dependence on a Single VPS
&lt;/h2&gt;

&lt;p&gt;A centralized infrastructure creates practical limitations.&lt;/p&gt;

&lt;p&gt;One administrator may be responsible for hosting costs, maintenance, security, availability, and operational decisions.&lt;/p&gt;

&lt;p&gt;This creates both technical and organizational risks.&lt;/p&gt;

&lt;p&gt;Our goal is to investigate a model in which:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contributors can independently operate parts of their infrastructure.&lt;/li&gt;
&lt;li&gt;Projects communicate through documented interfaces.&lt;/li&gt;
&lt;li&gt;Credentials remain under the control of their respective operators.&lt;/li&gt;
&lt;li&gt;Tests can be reproduced without production access.&lt;/li&gt;
&lt;li&gt;Infrastructure costs and responsibilities can be distributed.&lt;/li&gt;
&lt;li&gt;Contributions and knowledge are supported by verifiable evidence.&lt;/li&gt;
&lt;li&gt;Independent projects retain their identity and autonomy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This transition cannot be achieved through a single deployment.&lt;/p&gt;

&lt;p&gt;It requires reproducible tests, shared protocols, security reviews, operational agreements, and genuine collaboration.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Toward a DAO and Sustainable Contributor Economy
&lt;/h2&gt;

&lt;p&gt;We are also exploring a DAO-inspired governance model for distributing work, responsibilities, costs, and rewards.&lt;/p&gt;

&lt;p&gt;Our goal is to avoid building an ecosystem whose long-term survival depends entirely on one founder's personal resources.&lt;/p&gt;

&lt;p&gt;However, a DAO is not created simply by issuing tokens or opening a GitHub discussion.&lt;/p&gt;

&lt;p&gt;A sustainable governance model requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clearly defined responsibilities&lt;/li&gt;
&lt;li&gt;Transparent decision-making&lt;/li&gt;
&lt;li&gt;Verifiable contributions&lt;/li&gt;
&lt;li&gt;Fair and documented compensation arrangements&lt;/li&gt;
&lt;li&gt;Sustainable infrastructure funding&lt;/li&gt;
&lt;li&gt;Dispute-resolution procedures&lt;/li&gt;
&lt;li&gt;Independent oversight&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These mechanisms remain under development.&lt;/p&gt;

&lt;p&gt;Related discussions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1554" rel="noopener noreferrer"&gt;Issue #1554 — DAO Roles, MYZ Rewards, and Treasury&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1560" rel="noopener noreferrer"&gt;Issue #1560 — Removing the Founder/VPS Single Point of Failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1580" rel="noopener noreferrer"&gt;Issue #1580 — Independent Node Operator Program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1605" rel="noopener noreferrer"&gt;Issue #1605 — Contributor Operations v1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our objective is to develop a model in which independent contributors can create value, receive recognition, and potentially participate in sustainable economic activity.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. What Has Been Tested, and What Still Needs to Be Proven?
&lt;/h2&gt;

&lt;p&gt;One of the most important principles behind MyZubster is distinguishing proposals from verified implementations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Already documented
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub contributions and technical reviews&lt;/li&gt;
&lt;li&gt;Local Docker testing&lt;/li&gt;
&lt;li&gt;N4K48 catalog and agent checks&lt;/li&gt;
&lt;li&gt;A previously completed authenticated VPS-to-node checkpoint&lt;/li&gt;
&lt;li&gt;Hardhat 3 migration review&lt;/li&gt;
&lt;li&gt;Contributor Passport privacy review&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Currently under review
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Wasim's Tor/HAProxy architecture&lt;/li&gt;
&lt;li&gt;Pastebin-to-Zorgax evidence ingestion&lt;/li&gt;
&lt;li&gt;Additional CI reliability work&lt;/li&gt;
&lt;li&gt;Reproducibility and security of the proposed infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Not yet demonstrated
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A stable federation of multiple independently operated production nodes&lt;/li&gt;
&lt;li&gt;Effective failover between independent infrastructure operators&lt;/li&gt;
&lt;li&gt;Fully operational decentralized governance&lt;/li&gt;
&lt;li&gt;Sustainable distributed infrastructure financing&lt;/li&gt;
&lt;li&gt;End-to-end interoperability across all proposed services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These distinctions matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We want our technical claims to be supported by reproducible evidence, not just ambitious announcements.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. An Invitation to Open-Source Contributors
&lt;/h2&gt;

&lt;p&gt;MyZubster is open to developers, researchers, creators, and independent project operators interested in experimenting with interoperability and decentralization.&lt;/p&gt;

&lt;p&gt;You do not need to own a VPS or invest money to begin contributing.&lt;/p&gt;

&lt;p&gt;Useful contributions can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code reviews and security analysis&lt;/li&gt;
&lt;li&gt;Docker-based local experiments&lt;/li&gt;
&lt;li&gt;API interoperability testing&lt;/li&gt;
&lt;li&gt;Privacy and consent mechanisms&lt;/li&gt;
&lt;li&gt;Knowledge graph research&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Accessibility improvements&lt;/li&gt;
&lt;li&gt;Independent verification of technical evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We believe meaningful collaboration starts with small, clearly scoped, reproducible contributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explore the project
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Main project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://myzubster.com" rel="noopener noreferrer"&gt;MyZubster Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;MyZubster GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nicola N4K48&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1583" rel="noopener noreferrer"&gt;Independent Node Pilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1520" rel="noopener noreferrer"&gt;Contributor Bridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1505" rel="noopener noreferrer"&gt;Pilot Node Network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wasim&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1610" rel="noopener noreferrer"&gt;Tor/HAProxy/Docker Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1611" rel="noopener noreferrer"&gt;Pastebin/GitHub/Zorgax Interoperability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1608" rel="noopener noreferrer"&gt;CI and Security Audit Work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Decentralization roadmap&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1560" rel="noopener noreferrer"&gt;Removing Centralized Infrastructure Dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1554" rel="noopener noreferrer"&gt;DAO Governance and Sustainable Treasury&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion: Decentralization Is Something We Build Together
&lt;/h2&gt;

&lt;p&gt;MyZubster is not yet a fully decentralized federation.&lt;/p&gt;

&lt;p&gt;We are building and testing the components that could make such a federation possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nicola is helping us understand how an independent project can operate as a node.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wasim is helping us investigate how those nodes can become more secure, reproducible, interoperable, and resilient.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next milestone is to verify that these components can work together safely, under distributed operational responsibility.&lt;/p&gt;

&lt;p&gt;We are not simply trying to connect servers.&lt;/p&gt;

&lt;p&gt;We are exploring how to connect &lt;strong&gt;people, projects, skills, evidence, and independent infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And we want that process to remain open, transparent, and verifiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The future of MyZubster should not depend on one person operating everything. It should be something contributors can build, verify, and sustain together.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Daniel Ioni (h4x0r)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Creator &amp;amp; Administrator — MyZubster Ecosystem&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #decentralization #docker #webdev
&lt;/h1&gt;

</description>
      <category>myzubster</category>
      <category>docker</category>
      <category>wasim</category>
      <category>n4k48</category>
    </item>
    <item>
      <title>Building the MyZubster Metaverse: What We've Shipped and What's Next</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Thu, 15 Oct 2026 04:48:24 +0000</pubDate>
      <link>https://dev.to/danielioni/building-the-myzubster-metaverse-what-weve-shipped-and-whats-next-57mk</link>
      <guid>https://dev.to/danielioni/building-the-myzubster-metaverse-what-weve-shipped-and-whats-next-57mk</guid>
      <description>&lt;h1&gt;
  
  
  Building the MyZubster Metaverse: What We've Shipped and What's Next
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;From account-linked experiences to distributed abuse protection — an open-source development update.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Over the past development cycle, we've made meaningful progress on the MyZubster Metaverse.&lt;/p&gt;

&lt;p&gt;Our goal is not simply to build another virtual environment. We're exploring how a metaverse can connect people, independent projects, digital identities, knowledge, and real-world communities through an open-source ecosystem.&lt;/p&gt;

&lt;p&gt;Here's what we've completed, what we've tested, and what still needs work.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ What we've completed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Account-linked Metaverse experience
&lt;/h3&gt;

&lt;p&gt;The public Metaverse route is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.myzubster.com/metaverse" rel="noopener noreferrer"&gt;https://www.myzubster.com/metaverse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have implemented and tested the account-linked flow, connecting the Metaverse experience with MyZubster's broader authentication and user ecosystem.&lt;/p&gt;

&lt;p&gt;This provides a foundation for future interactions between digital identity, community participation, and independent projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Distributed rate limiting
&lt;/h3&gt;

&lt;p&gt;One of our latest milestones is the implementation of MongoDB-backed abuse protection.&lt;/p&gt;

&lt;p&gt;The system introduces rate limits for four Metaverse operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;join&lt;/code&gt; — entering a session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sync&lt;/code&gt; — synchronizing session state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat&lt;/code&gt; — sending messages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;emote&lt;/code&gt; — submitting interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using a shared MongoDB-backed limiter helps coordinate abuse controls across application instances instead of relying exclusively on individual server memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Privacy-conscious throttling
&lt;/h3&gt;

&lt;p&gt;We've introduced HMAC-derived identifiers for throttling, rather than storing raw identifiers directly as rate-limit keys.&lt;/p&gt;

&lt;p&gt;The implementation also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic TTL-based expiration&lt;/li&gt;
&lt;li&gt;HTTP &lt;code&gt;429 Too Many Requests&lt;/code&gt; responses&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Retry-After&lt;/code&gt; information&lt;/li&gt;
&lt;li&gt;Protection against spoofed proxy headers&lt;/li&gt;
&lt;li&gt;Documented privacy and retention boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measures are intended to reduce abuse while limiting unnecessary retention of identifying information.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fail-closed production behavior
&lt;/h3&gt;

&lt;p&gt;During review, we identified an important issue: if MongoDB became unavailable, the limiter could fall back to local in-memory behavior.&lt;/p&gt;

&lt;p&gt;We corrected this behavior so that the production configuration fails closed when the shared rate-limiting dependency is unavailable.&lt;/p&gt;

&lt;p&gt;This is an important security trade-off: availability may be reduced during an infrastructure failure, but abuse protection is not silently weakened.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Automated testing and GitHub integration
&lt;/h3&gt;

&lt;p&gt;The final development work included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;21 backend test suites passing&lt;/li&gt;
&lt;li&gt;125 backend tests passing in the final local verification&lt;/li&gt;
&lt;li&gt;Clean Git diff checks&lt;/li&gt;
&lt;li&gt;GitHub pull request review and merge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The distributed abuse protection was merged through:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PR #30 — &lt;code&gt;feat(metaverse): add distributed abuse rate limits&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/danieldirimini-myzubster/myzubster/pull/30" rel="noopener noreferrer"&gt;https://github.com/danieldirimini-myzubster/myzubster/pull/30&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merge commit: &lt;code&gt;d911cadd824a1ca00b50cfead7929eb8f80934d0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This represents completed implementation work, not a claim that every production-readiness requirement has been satisfied.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ What still needs to be completed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Dependency security remediation
&lt;/h3&gt;

&lt;p&gt;Our security pipeline continues to flag an existing dependency backlog.&lt;/p&gt;

&lt;p&gt;The latest reported audit included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;61 vulnerabilities in total&lt;/li&gt;
&lt;li&gt;43 high-severity vulnerabilities&lt;/li&gt;
&lt;li&gt;1 critical vulnerability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some remediation paths involve potentially breaking dependency upgrades, including a major Hardhat migration.&lt;/p&gt;

&lt;p&gt;We don't want to hide these findings or blindly apply incompatible updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next step:&lt;/strong&gt; review production versus development dependencies, assess actual exposure, submit targeted fixes, and rerun the security pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Final production verification
&lt;/h3&gt;

&lt;p&gt;The pull request has been merged, but the final production verification was interrupted before completion.&lt;/p&gt;

&lt;p&gt;We still need to verify the deployed commit, production health, and real behavior of the new rate limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Multi-user and load testing
&lt;/h3&gt;

&lt;p&gt;Passing unit and integration tests is not the same as demonstrating scalability.&lt;/p&gt;

&lt;p&gt;We want to validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concurrent user sessions&lt;/li&gt;
&lt;li&gt;Distributed synchronization&lt;/li&gt;
&lt;li&gt;Chat and interaction throttling&lt;/li&gt;
&lt;li&gt;MongoDB availability and recovery behavior&lt;/li&gt;
&lt;li&gt;Performance under realistic traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Contributor-led testing
&lt;/h3&gt;

&lt;p&gt;We're inviting open-source contributors to test the Metaverse independently, report reproducible bugs, review security assumptions, and improve documentation.&lt;/p&gt;

&lt;p&gt;A useful contribution doesn't have to be a large feature.&lt;/p&gt;

&lt;p&gt;A clear bug report, a failing test, or a small targeted pull request can move the project forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Independent infrastructure and decentralization
&lt;/h3&gt;

&lt;p&gt;MyZubster is also exploring interoperability with contributor-owned infrastructure.&lt;/p&gt;

&lt;p&gt;Our N4K48 pilot is an early step toward connecting independently managed projects and nodes.&lt;/p&gt;

&lt;p&gt;However, an independently hosted VPS is not automatically a decentralized network.&lt;/p&gt;

&lt;p&gt;We still need documented interfaces, tested recovery procedures, access controls, and independently reproducible interoperability tests.&lt;/p&gt;

&lt;p&gt;This work remains in progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 The bigger vision
&lt;/h2&gt;

&lt;p&gt;We want MyZubster to become a place where people can connect their real-world activities, creative work, services, and technical contributions to a shared digital ecosystem.&lt;/p&gt;

&lt;p&gt;The Metaverse is one component of that vision, alongside Zorgax, the Marketplace, and the Contributor Passport.&lt;/p&gt;

&lt;p&gt;But our immediate priority is simpler:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make the existing features reliable, secure, understandable, and useful before expanding their scope.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Join the development
&lt;/h2&gt;

&lt;p&gt;We're looking for contributors interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security and dependency remediation&lt;/li&gt;
&lt;li&gt;Backend and MongoDB testing&lt;/li&gt;
&lt;li&gt;Metaverse frontend testing&lt;/li&gt;
&lt;li&gt;Accessibility and user experience&lt;/li&gt;
&lt;li&gt;Docker and infrastructure automation&lt;/li&gt;
&lt;li&gt;Documentation and reproducible test cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contributor coordination:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1609" rel="noopener noreferrer"&gt;https://github.com/MyZubster-Ecosystem/myzubster/issues/1609&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Metaverse:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.myzubster.com/metaverse" rel="noopener noreferrer"&gt;https://www.myzubster.com/metaverse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're interested, explore the repository, choose a focused task, and join the discussion.&lt;/p&gt;

&lt;p&gt;We're building MyZubster in the open — one verified contribution at a time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Daniel Ioni (h4x0r)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;MyZubster — Open-Source Ecosystem&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  opensource #webdev #nodejs #metaverse
&lt;/h1&gt;

</description>
      <category>metaverse</category>
      <category>opensource</category>
      <category>node</category>
      <category>myzubster</category>
    </item>
    <item>
      <title>Building an Evidence-First Contributor Network: How MyZubster Connects Independent Projects</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Tue, 13 Oct 2026 05:05:00 +0000</pubDate>
      <link>https://dev.to/danielioni/building-an-evidence-first-contributor-network-how-myzubster-connects-independent-projects-1pmh</link>
      <guid>https://dev.to/danielioni/building-an-evidence-first-contributor-network-how-myzubster-connects-independent-projects-1pmh</guid>
      <description>&lt;h1&gt;
  
  
  Building an Evidence-First Contributor Network: How MyZubster Connects Independent Projects
&lt;/h1&gt;

&lt;p&gt;Open-source collaboration becomes fragile when contribution history, current responsibilities, public profiles, and external projects all live in different places.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;MyZubster&lt;/a&gt;, we are working on a simpler boundary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Contributors keep control of their own repositories and environments.&lt;br&gt;&lt;br&gt;
MyZubster connects only the evidence, interfaces, and explicitly approved collaboration checkpoints.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not a claim that every contributor belongs to a DAO, has a public digital passport, or is part of a funded research consortium. Those are separate states and must remain separate.&lt;/p&gt;

&lt;p&gt;Our public README now includes a compact status index for contributor roles, digital-passport publication, external projects, and LIFE-oriented pilot candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1606" rel="noopener noreferrer"&gt;Contributor status index PR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1605" rel="noopener noreferrer"&gt;Contributor Operations v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1505" rel="noopener noreferrer"&gt;Pilot Node Network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The model
&lt;/h2&gt;

&lt;p&gt;A connected contributor project follows this path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;independent repository or environment
→ public, bounded evidence
→ documented interface or fixture
→ reproducible test
→ reviewed result
→ optional Knowledge / Passport / pilot link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important words are &lt;em&gt;bounded&lt;/em&gt;, &lt;em&gt;optional&lt;/em&gt;, and &lt;em&gt;reviewed&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A GitHub fork is not automatically a competence credential. A merged pull request is not automatically a public Passport. A pilot is not automatically a partnership. And a LIFE-oriented internal track is not an EU LIFE grant or consortium.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contributors and linked projects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Daniel Ioni — coordination and evidence boundaries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/danieldirimini-myzubster" rel="noopener noreferrer"&gt;@danieldirimini-myzubster&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Core project: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;MyZubster&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Current scope: interim product and governance coordination, privacy boundaries, acceptance criteria, and evidence architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The role is deliberately limited: coordination is not unilateral DAO authority. High-impact actions such as public-profile publication, treasury activity, deployment, funding, or institutional commitments require their own explicit process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nicola / N4K48 — independent Docker node and interoperability reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/nicolaususnicola-lgtm" rel="noopener noreferrer"&gt;@nicolaususnicola-lgtm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Project: &lt;a href="https://github.com/nicolaususnicola-lgtm/myzubster-mvp" rel="noopener noreferrer"&gt;myzubster-mvp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reference: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1474" rel="noopener noreferrer"&gt;independent pilot-node path&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nicola’s work is the clearest example of the independent-project model. The N4K48 environment remains independently operated, while published Docker, provenance, and read-only interoperability evidence can be reviewed by others.&lt;/p&gt;

&lt;p&gt;The next proposed checkpoint is an authenticated, sanitized N4K48 ↔ MyZubster test. It is a technical interoperability task—not a transfer of ownership, a production deployment, or a LIFE membership claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  khongten124 — Open Period Care research and evidence package
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/khongten124" rel="noopener noreferrer"&gt;@khongten124&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Evidence: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1451" rel="noopener noreferrer"&gt;PR #1451&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Project documentation: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/tree/main/docs/pilots/open-period-care" rel="noopener noreferrer"&gt;Open Period Care package&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Network reference: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1505" rel="noopener noreferrer"&gt;Pilot Node Network #1505&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Open Period Care work is connected as a research/evidence package. The contribution has a bounded evidence state and can be reused as a reference for provenance, structured requirements, and reproducible review.&lt;/p&gt;

&lt;p&gt;It does not claim clinical validation, product efficacy, institutional endorsement, or a formal LIFE role.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aming9303 — gateway, sensor, replication, and signed-webhook evidence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Aming9303" rel="noopener noreferrer"&gt;@Aming9303&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Project fork: &lt;a href="https://github.com/Aming9303/MyZubsterGateway" rel="noopener noreferrer"&gt;MyZubsterGateway&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Evidence:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/859" rel="noopener noreferrer"&gt;sensor adapter PR #859&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/861" rel="noopener noreferrer"&gt;replication validator PR #861&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/891" rel="noopener noreferrer"&gt;signed webhooks PR #891&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aming’s public work contributes to the technical edge of the network: adapters, replication checks, and signed webhook behavior. These are useful building blocks for future environmental or operational pilots, including Circular Water, but they do not imply access to a partner’s systems or data.&lt;/p&gt;

&lt;h3&gt;
  
  
  wasim-builds — security and local resilience design
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/wasim-builds" rel="noopener noreferrer"&gt;@wasim-builds&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Evidence:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/860" rel="noopener noreferrer"&gt;security regression PR #860&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1513" rel="noopener noreferrer"&gt;onboarding fix PR #1513&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1584" rel="noopener noreferrer"&gt;local Tor/HAProxy pilot #1584&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wasim has opted into a strictly local and isolated resilience-design track. The planned deliverable is a draft PR containing a threat model, Compose configuration, health checks, rollback instructions, and redacted smoke-test evidence.&lt;/p&gt;

&lt;p&gt;There is no authorization for a public Onion deployment, production access, reimbursement, or paid bounty in that scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  foxxx009 — documentation, KPI, and evidence framework
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/foxxx009" rel="noopener noreferrer"&gt;@foxxx009&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation repository: &lt;a href="https://github.com/foxxx009/myzubster-docs" rel="noopener noreferrer"&gt;myzubster-docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Marketplace repository: &lt;a href="https://github.com/foxxx009/MyZubster-Marketplace" rel="noopener noreferrer"&gt;MyZubster-Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Evidence:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/894" rel="noopener noreferrer"&gt;KPI/evidence framework PR #894&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/259" rel="noopener noreferrer"&gt;GitHub monitor test PR #259&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/pull/1526" rel="noopener noreferrer"&gt;re-enable fix PR #1526&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;foxxx009 has consented to existing public graph links. That is not the same as accepting a new project assignment. Their evidence is useful for future independent verification and KPI work, but any new pilot must start with a separate opt-in and a defined test plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shweta Singh — technical verifier path, still consent pending
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Shweta-singh24" rel="noopener noreferrer"&gt;@Shweta-singh24&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Project fork: &lt;a href="https://github.com/Shweta-singh24/MyZubsterGateway" rel="noopener noreferrer"&gt;MyZubsterGateway&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reference: &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1505" rel="noopener noreferrer"&gt;Pilot Node Network #1505&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shweta’s public fork has been discovered, but a fork alone is not enough to claim a verified contributor role. The proposed path is technical verification: Docker, Node.js, HTTPS/read-only interoperability, documentation, and contributor-to-contributor reproduction.&lt;/p&gt;

&lt;p&gt;That path remains opt-in and evidence pending.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the digital Passport means
&lt;/h2&gt;

&lt;p&gt;A MyZubster Contributor Passport is not an automatic profile created from a GitHub username.&lt;/p&gt;

&lt;p&gt;A public Passport requires explicit publication consent. It should expose only an approved, minimized public projection of contribution evidence. It must not expose internal reviewer data, payment identifiers, reward amounts, settlement records, secrets, or sensitive personal information.&lt;/p&gt;

&lt;p&gt;This is an active privacy requirement, tracked in &lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1598" rel="noopener noreferrer"&gt;issue #1598&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “LIFE-oriented” means here
&lt;/h2&gt;

&lt;p&gt;MyZubster has candidate real-world tracks such as kefir, Circular Water, and circular-care evidence. They can reuse technical components created by independent contributors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker and independent-node operation;&lt;/li&gt;
&lt;li&gt;data schemas and deterministic hashes;&lt;/li&gt;
&lt;li&gt;read-only adapters;&lt;/li&gt;
&lt;li&gt;KPI dashboards;&lt;/li&gt;
&lt;li&gt;evidence review and provenance;&lt;/li&gt;
&lt;li&gt;privacy and consent controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the language must stay precise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a candidate is not a consortium member;&lt;/li&gt;
&lt;li&gt;a technical pilot is not a validated field pilot;&lt;/li&gt;
&lt;li&gt;a company reviewing a concept is not yet a project partner;&lt;/li&gt;
&lt;li&gt;an internal LIFE-oriented track is not EU LIFE funding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Circular Water, the correct approach is to build reusable, synthetic-data components first. If a water utility later authorizes a real case, only the authorized data, constraints, and measurements are connected to the shared framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this structure matters
&lt;/h2&gt;

&lt;p&gt;The goal is not to centralize everyone’s work under one account or one server.&lt;/p&gt;

&lt;p&gt;The goal is to make collaboration inspectable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;who owns the project?
what was actually tested?
what evidence is public?
what is proposed versus accepted?
what consent exists?
what can be reused safely?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how a contributor network becomes credible: not by making the biggest possible claim, but by preserving the boundary between evidence, consent, current work, and future ambition.&lt;/p&gt;

&lt;p&gt;If you want to contribute, start with a small bounded task, publish reproducible evidence, and keep control of your own work. The network can connect it when both the technical and consent conditions are satisfied.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster" rel="noopener noreferrer"&gt;MyZubster core repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1605" rel="noopener noreferrer"&gt;Contributor Operations v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues/1505" rel="noopener noreferrer"&gt;Pilot Node Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MyZubster-Ecosystem/myzubster/issues" rel="noopener noreferrer"&gt;Open contributor issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>contributor</category>
      <category>network</category>
      <category>myzubster</category>
      <category>connects</category>
    </item>
    <item>
      <title>Hardhat 3 in a CommonJS Application: Isolating ESM Tooling Without Breaking CI</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Tue, 13 Oct 2026 04:28:50 +0000</pubDate>
      <link>https://dev.to/danielioni/hardhat-3-in-a-commonjs-application-isolating-esm-tooling-without-breaking-ci-1mh8</link>
      <guid>https://dev.to/danielioni/hardhat-3-in-a-commonjs-application-isolating-esm-tooling-without-breaking-ci-1mh8</guid>
      <description>&lt;h1&gt;
  
  
  Hardhat 3 in a CommonJS Application: Isolating ESM Tooling Without Breaking CI
&lt;/h1&gt;

&lt;p&gt;Modernising blockchain tooling inside an established application is rarely just a dependency upgrade.&lt;/p&gt;

&lt;p&gt;Our repository is primarily a CommonJS Node.js application: the server, most tests, and existing runtime scripts use &lt;code&gt;require()&lt;/code&gt;. At the same time, we needed to move the NFT toolchain to Hardhat 3, which is ESM-first. A naïve migration—setting &lt;code&gt;"type": "module"&lt;/code&gt; at the repository root—would have changed the module semantics of the whole application and created unnecessary runtime risk.&lt;/p&gt;

&lt;p&gt;This article documents the approach we used instead: isolate the ESM toolchain, make mixed test execution deterministic, remove a high-severity dependency path, and verify the result without deploying anything to a public chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraints
&lt;/h2&gt;

&lt;p&gt;The change had four non-negotiable constraints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The existing CommonJS application had to remain CommonJS.&lt;/li&gt;
&lt;li&gt;Solidity contracts and NFT scripts needed to run under Hardhat 3.&lt;/li&gt;
&lt;li&gt;CommonJS Jest tests and ESM Node tests needed to run correctly in both local development and CI.&lt;/li&gt;
&lt;li&gt;Dependency auditing had to fail on high and critical vulnerabilities without relying on unsafe automatic upgrades.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal was not to “make the build pass” at any cost. The goal was to make the boundaries explicit and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why converting the repository root was the wrong move
&lt;/h2&gt;

&lt;p&gt;Hardhat 3 expects an ESM project. The obvious reaction is to add this to the root &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That would make every &lt;code&gt;.js&lt;/code&gt; file in the repository ESM by default. In a mature CommonJS application, that affects server startup, test helpers, scripts, configuration files, and dependencies that expect &lt;code&gt;require()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The blockchain toolchain has different module requirements from the application runtime. Treating them as one module system turns a local migration into a repository-wide compatibility project.&lt;/p&gt;

&lt;p&gt;The safer design was to create a narrow ESM boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an isolated ESM workspace
&lt;/h2&gt;

&lt;p&gt;We moved Solidity-specific tooling into a dedicated directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nft-tools/
  package.json
  hardhat.config.js
  contracts/
  scripts/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its &lt;code&gt;package.json&lt;/code&gt; is intentionally small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@myzubster/nft-tools"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"private"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The root application remains CommonJS. Only the NFT workspace is ESM.&lt;/p&gt;

&lt;p&gt;This lets the Hardhat configuration use native imports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hardhat/config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;hardhatEthers&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@nomicfoundation/hardhat-ethers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hardhatEthers&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;solidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.8.28&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./contracts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./artifacts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The separation is more than cosmetic. Hardhat resolves project files relative to its project boundary, so contracts must live inside that ESM workspace rather than outside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrate scripts deliberately
&lt;/h2&gt;

&lt;p&gt;The previous NFT scripts used CommonJS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hardhat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the isolated ESM workspace, they now use the Hardhat 3 runtime model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hardhat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrCreate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSigners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scripts retain their original safety characteristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployment and minting remain explicit commands;&lt;/li&gt;
&lt;li&gt;public-chain operations require an external private-key environment variable;&lt;/li&gt;
&lt;li&gt;local tests use Hardhat’s simulated network;&lt;/li&gt;
&lt;li&gt;no real transaction is sent during compilation or local verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Root-level scripts make the intended boundary visible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nft:compile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cd nft-tools &amp;amp;&amp;amp; ../node_modules/.bin/hardhat compile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nft:test:local"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cd nft-tools &amp;amp;&amp;amp; ../node_modules/.bin/hardhat run scripts/test-comic-nft.mjs"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A local NFT test deploys the contract, mints a test token, and verifies ownership and metadata URI. It does not use a wallet, a public RPC account, or production funds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependency audit: avoid destructive “fixes”
&lt;/h2&gt;

&lt;p&gt;During the audit, the high-severity issue was not application code. It came from the development watcher dependency path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nodemon → chokidar → braces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An automated &lt;code&gt;npm audit fix --force&lt;/code&gt; proposed breaking downgrades, including old versions of development tooling. That is not a reliable security remediation strategy.&lt;/p&gt;

&lt;p&gt;Instead, we removed the unnecessary watcher dependency and used Node’s built-in watch mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node --watch server.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dependency audit then had no high or critical findings. Moderate findings remain in Jest coverage-related transitive dependencies and are documented rather than hidden. The CI gate continues to fail on high or critical findings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm audit &lt;span class="nt"&gt;--audit-level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Security work should reduce exposure without silently introducing a different operational risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mixed CommonJS and ESM tests need two runners
&lt;/h2&gt;

&lt;p&gt;The repository contains two valid kinds of tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a large Jest suite for CommonJS application tests;&lt;/li&gt;
&lt;li&gt;a small set of &lt;code&gt;.test.mjs&lt;/code&gt; files that must run through Node’s native ESM test runner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jest can discover &lt;code&gt;.mjs&lt;/code&gt; files, but attempting to execute them as CommonJS produces errors such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Must use import to load ES Module
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution is not to force ESM tests through a CommonJS runner. Instead, the test command is an explicit two-stage process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;spawnSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:child_process&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;esmTests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;identity/credential/credential.test.mjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;identity/verifier/verify.test.mjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;identity/hash-verification/verify-hash.test.mjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;workshop/app/domain.test.mjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;workshop/app/integrate.test.mjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spawnSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;stdio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inherit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jest is restricted to JavaScript test files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;testMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**/?(*.)+(test).js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the ESM files run separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;esmTests&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives each test type the runtime it actually requires.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CI argument-forwarding trap
&lt;/h2&gt;

&lt;p&gt;One subtle failure only appeared in CI.&lt;/p&gt;

&lt;p&gt;The workflow called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--runInBand&lt;/span&gt; &lt;span class="nt"&gt;--testPathIgnorePatterns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/frontend/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jest command-line options can override settings declared in &lt;code&gt;jest.config.js&lt;/code&gt;. In this case, the workflow’s &lt;code&gt;testPathIgnorePatterns&lt;/code&gt; replaced the repository configuration, allowing Jest to discover the ESM test files again.&lt;/p&gt;

&lt;p&gt;The wrapper now filters that externally supplied ignore-pattern override before invoking Jest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jestArgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--testPathIgnorePatterns=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jest/bin/jest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;jestArgs&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository configuration remains the source of truth for test discovery; CI still passes useful execution options such as &lt;code&gt;--runInBand&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is a general lesson: forwarding CLI arguments blindly can change test semantics. A wrapper should forward only the arguments that are safe for that stage of the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification results
&lt;/h2&gt;

&lt;p&gt;The final verification was intentionally layered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jest:                 221 suites / 969 tests passed
Node ESM runner:       26 tests passed
Hardhat compile:       4 Solidity contracts compiled
Local NFT test:        deploy + mint + ownership + URI passed
Security audit:        no high or critical vulnerabilities
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No deployment and no public-chain transaction were performed.&lt;/p&gt;

&lt;p&gt;The pull request also passed the repository’s test, evidence, policy, security-audit, and secret-scanning checks. A Vercel status remained blocked by external deployment authorization, so it was treated as an environment-integration issue—not as evidence that the code had been deployed or independently validated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this migration changed
&lt;/h2&gt;

&lt;p&gt;The important result is not simply “Hardhat 3 works.”&lt;/p&gt;

&lt;p&gt;The repository now has clearer operational boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the application runtime remains CommonJS;&lt;/li&gt;
&lt;li&gt;blockchain tooling is isolated in an ESM workspace;&lt;/li&gt;
&lt;li&gt;CommonJS and ESM tests run with their native runners;&lt;/li&gt;
&lt;li&gt;CI argument handling cannot accidentally re-enable incompatible test discovery;&lt;/li&gt;
&lt;li&gt;local blockchain verification is explicit and does not touch public networks;&lt;/li&gt;
&lt;li&gt;high- and critical-severity audit findings are gated without unsafe forced upgrades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tooling migrations are safest when they reduce ambiguity. In this case, separating module systems, test runners, and deployment intent made the codebase easier to verify—and harder to accidentally misuse.&lt;/p&gt;

</description>
      <category>hardhat</category>
      <category>commonjs</category>
      <category>myzubster</category>
      <category>esm</category>
    </item>
    <item>
      <title>Building the MyZubster Metaverse: Browser-First WebXR, Server-Authoritative Rooms, Versioned Scenes, and the Road Ahead</title>
      <dc:creator>Daniel Ioni</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:21:01 +0000</pubDate>
      <link>https://dev.to/danielioni/building-the-myzubster-metaverse-browser-first-webxr-server-authoritative-rooms-versioned-5f8f</link>
      <guid>https://dev.to/danielioni/building-the-myzubster-metaverse-browser-first-webxr-server-authoritative-rooms-versioned-5f8f</guid>
      <description>&lt;p&gt;Building the MyZubster Metaverse: Browser-First WebXR, Server-Authoritative Rooms, Versioned Scenes, and the Road Ahead&lt;br&gt;
The MyZubster Metaverse is evolving from a narrative prototype into a browser-first, testable platform with explicit technical contracts.&lt;br&gt;
The objective is not to build a VR-only experience. The objective is to create a shared digital environment that works on ordinary browsers first, can progressively enable WebXR when available, and can connect virtual experiences to real MyZubster projects—including LIFE-oriented environmental pilots.&lt;br&gt;
This technical update covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What currently works&lt;/li&gt;
&lt;li&gt;What we verified in production&lt;/li&gt;
&lt;li&gt;The browser and WebXR capability layer&lt;/li&gt;
&lt;li&gt;The server-authoritative room lifecycle&lt;/li&gt;
&lt;li&gt;The versioned scene-manifest contract&lt;/li&gt;
&lt;li&gt;Security and validation boundaries&lt;/li&gt;
&lt;li&gt;How this connects to LIFE and evidence-based pilots&lt;/li&gt;
&lt;li&gt;What is still missing&lt;/li&gt;
&lt;li&gt;The next implementation milestones
Repository: MyZubster-Ecosystem/myzubster
Live entry point: MyZubster Metaverse&lt;/li&gt;
&lt;li&gt;The Architecture We Are Building
The current direction separates the metaverse into several technical layers:
┌───────────────────────────────────────────────────────────┐
│                    Browser Experience                     │
│                                                           │
│  React UI → capability checks → browser/WebXR fallback    │
└───────────────────────────────┬───────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────┐
│                   Metaverse Client Runtime                │
│                                                           │
│  Scene loading → controls → chat → emotes → interactions  │
└───────────────────────────────┬───────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────┐
│                  Server-Authoritative API                 │
│                                                           │
│  Rooms → sessions → access → capacity → stage → tokens    │
└───────────────────────────────┬───────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────┐
│                 Versioned Scene Contract                  │
│                                                           │
│  Assets → spawn points → zones → portals → capabilities   │
└───────────────────────────────┬───────────────────────────┘
                            │
                            ▼
┌───────────────────────────────────────────────────────────┐
│                    Evidence / LIFE Layer                  │
│                                                           │
│  Pilot → provenance → evidence → KPI/MRV → visualization  │
└───────────────────────────────────────────────────────────┘
Each layer has a different responsibility.
The browser detects what the device can do. The server controls room and session authority. The scene manifest defines what should be loaded. The evidence layer determines what claims can legitimately be represented.
This separation matters because a 3D scene must not become the source of truth for authentication, permissions, environmental claims, or evidence.&lt;/li&gt;
&lt;li&gt;What Works Today
Neon Plaza is available directly from a browser. A VR headset, crypto wallet, native application, or dedicated GPU is not required for the standard experience.
During our production desktop smoke test, we verified:&lt;/li&gt;
&lt;li&gt;Authenticated access&lt;/li&gt;
&lt;li&gt;Character-associated entry&lt;/li&gt;
&lt;li&gt;Neon Plaza loading&lt;/li&gt;
&lt;li&gt;An active online session&lt;/li&gt;
&lt;li&gt;Movement controls&lt;/li&gt;
&lt;li&gt;Emotes&lt;/li&gt;
&lt;li&gt;Room chat&lt;/li&gt;
&lt;li&gt;Browser capability detection&lt;/li&gt;
&lt;li&gt;A non-blocking fallback when immersive WebXR is unavailable
The critical product rule is:
WebXR is an optional capability. It must never become a mandatory gateway to the MyZubster Metaverse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desktop and mobile browsers remain the baseline. VR devices can progressively enhance the experience when supported.&lt;br&gt;
This is important for accessibility, adoption, testing, and compatibility with real-world projects. A LIFE participant, researcher, local community member, or developer should not need a headset simply to inspect a pilot, join a session, or understand a project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser and WebXR Capability Detection
The first implementation milestone was tracked in:&lt;/li&gt;
&lt;li&gt;PR #1597 — Add non-blocking WebXR capability fallback
The browser capability module defines explicit WebXR states:
export const WEBXR_STATUS = Object.freeze({
CHECKING: 'checking',
SUPPORTED: 'supported',
UNSUPPORTED: 'unsupported',
ERROR: 'error'
});
This is intentionally more precise than a boolean such as hasWebXR.
There are several meaningful conditions:
checking
│
├── supported
│
├── unsupported
│
└── error
An unsupported API is different from a capability check that failed. A browser without navigator.xr is different from a browser exposing the API but rejecting the request.
The implementation checks the browser baseline separately:
export function browserCapabilityBaseline(browser = window) {
return [
{ label: 'JavaScript', ok: true },
{ label: 'Fetch API', ok: typeof browser.fetch === 'function' },
{ label: 'Storage locale', ok: Boolean(browser.localStorage) },
{
  label: 'CSS Grid',
  ok: Boolean(browser.CSS?.supports?.('display', 'grid'))
},
{
  label: 'Connessione',
  ok: browser.navigator?.onLine !== false
}
];
}
WebXR support is detected asynchronously:
export async function detectImmersiveVr(
navigatorLike = navigator
) {
if (!navigatorLike?.xr?.isSessionSupported) {
return {
  status: WEBXR_STATUS.UNSUPPORTED,
  reason: 'api-unavailable'
};
}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;try {&lt;br&gt;
    const supported =&lt;br&gt;
      await navigatorLike.xr.isSessionSupported('immersive-vr');&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return {
  status: supported
    ? WEBXR_STATUS.SUPPORTED
    : WEBXR_STATUS.UNSUPPORTED,
  reason: supported ? null : 'session-unsupported'
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;} catch (_error) {&lt;br&gt;
    return {&lt;br&gt;
      status: WEBXR_STATUS.ERROR,&lt;br&gt;
      reason: 'capability-check-failed'&lt;br&gt;
    };&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
Why dependency injection matters here&lt;br&gt;
The function accepts navigatorLike instead of directly depending on the global navigator internally.&lt;br&gt;
That makes capability behavior testable:&lt;br&gt;
await detectImmersiveVr({&lt;br&gt;
  xr: {&lt;br&gt;
    isSessionSupported: async () =&amp;gt; true&lt;br&gt;
  }&lt;br&gt;
});&lt;br&gt;
It also allows us to test unsupported and error conditions without requiring an actual headset in every CI run.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Non-Blocking Fallback UX
Capability detection is connected to a React component that communicates the system state to the user.
A simplified version of the state mapping is:
const XR_COPY = {
checking: 'Checking WebXR support…',
supported: 'Immersive WebXR is available',
unsupported:
'Browser mode active: a headset is not required',
error:
'WebXR could not be verified: continue in browser mode'
};
The important behavior is not just the message. It is the absence of a blocking redirect or fatal error.
const browserReady =
checks.every((check) =&amp;gt; check.ok);&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;const ready =&lt;br&gt;
  browserReady &amp;amp;&amp;amp;&lt;br&gt;
  xr.status !== WEBXR_STATUS.CHECKING;&lt;br&gt;
When immersive VR is unavailable, the interface explicitly keeps the browser path open:&lt;br&gt;
{xr.status !== WEBXR_STATUS.SUPPORTED &amp;amp;&amp;amp; (&lt;br&gt;
  &lt;small&gt;&lt;br&gt;
    Neon Plaza remains accessible from desktop and mobile.&lt;br&gt;
    The WebXR check never blocks entry.&lt;br&gt;
  &lt;/small&gt;&lt;br&gt;
)}&lt;br&gt;
This approach supports progressive enhancement:&lt;br&gt;
Basic browser&lt;br&gt;
    ↓&lt;br&gt;
Neon Plaza browser experience&lt;br&gt;
    ↓&lt;br&gt;
Optional advanced capabilities&lt;br&gt;
    ├── richer graphics&lt;br&gt;
    ├── immersive WebXR&lt;br&gt;
    ├── spatial input&lt;br&gt;
    └── device-specific controls&lt;br&gt;
The baseline must remain usable even when one of the enhancement layers is unavailable.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Server-Authoritative Room Lifecycle
The metaverse is not controlled only by client-side React state.
Rooms and sessions have server-authoritative lifecycle states:
const ROOM_TRANSITIONS = Object.freeze({
draft: new Set(['published']),
published: new Set(['scheduled', 'live']),
scheduled: new Set(['live']),
live: new Set(['ended']),
ended: new Set(['archive']),
archive: new Set([])
});
This gives us a forward-only state machine:
draft
│
▼
published
│
├───────────────┐
▼               ▼
scheduled        live
│               │
└───────►───────┘
              ▼
            ended
              │
              ▼
           archive
Invalid reverse transitions are rejected.
For example:
if (
patch.state &amp;amp;&amp;amp;
patch.state !== room.state
) {
if (!ROOM_TRANSITIONS[room.state]?.has(patch.state)) {
return {
  valid: false,
  status: 409,
  error:
    &lt;code&gt;Invalid room transition&lt;/code&gt; +
    &lt;code&gt;${room.state} -&amp;gt; ${patch.state}&lt;/code&gt;
};
}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;room.state = patch.state;&lt;br&gt;
}&lt;br&gt;
This prevents a browser client from arbitrarily changing an ended room back to live.&lt;br&gt;
The client requests a transition. The server decides whether it is valid.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Room Access and Capacity
A virtual room can currently use one of three access policies:
accessPolicy: {
type: String,
enum: [
'public',
'authenticated',
'private'
],
default: 'authenticated'
}
Capacity is bounded at the model and service layers:
capacity: {
type: Number,
min: 1,
max: 500,
default: 100
}
Join validation checks:&lt;/li&gt;
&lt;li&gt;Session state&lt;/li&gt;
&lt;li&gt;Blocklist&lt;/li&gt;
&lt;li&gt;Private-room allowlist&lt;/li&gt;
&lt;li&gt;Host access&lt;/li&gt;
&lt;li&gt;Current participant count&lt;/li&gt;
&lt;li&gt;Existing membership
async function validateJoin({
session,
room,
actorUserId
}) {
if (session.state !== 'live') {
return {
  valid: false,
  status: 409,
  error: 'Session is not live'
};
}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;const actor = String(actorUserId);&lt;/p&gt;

&lt;p&gt;if ((room.blockedUserIds || []).includes(actor)) {&lt;br&gt;
    return {&lt;br&gt;
      valid: false,&lt;br&gt;
      status: 403,&lt;br&gt;
      error: 'Access blocked'&lt;br&gt;
    };&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;if (&lt;br&gt;
    room.accessPolicy === 'private' &amp;amp;&amp;amp;&lt;br&gt;
    !(room.allowedUserIds || []).includes(actor) &amp;amp;&amp;amp;&lt;br&gt;
    actor !== String(room.hostUserId)&lt;br&gt;
  ) {&lt;br&gt;
    return {&lt;br&gt;
      valid: false,&lt;br&gt;
      status: 403,&lt;br&gt;
      error: 'Private room access denied'&lt;br&gt;
    };&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;const current =&lt;br&gt;
    new Set(session.participantUserIds || []);&lt;/p&gt;

&lt;p&gt;if (&lt;br&gt;
    !current.has(actor) &amp;amp;&amp;amp;&lt;br&gt;
    current.size &amp;gt;= session.capacity&lt;br&gt;
  ) {&lt;br&gt;
    return {&lt;br&gt;
      valid: false,&lt;br&gt;
      status: 409,&lt;br&gt;
      error: 'Session is at capacity'&lt;br&gt;
    };&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return { valid: true };&lt;br&gt;
}&lt;br&gt;
The server therefore remains authoritative over membership. A modified browser cannot legitimately join a closed or full session simply by changing local state.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Short-Lived Realtime Tokens
After a successful join, the backend can mint a short-lived realtime token.
The token is scoped to:&lt;/li&gt;
&lt;li&gt;The authenticated user&lt;/li&gt;
&lt;li&gt;A specific purpose&lt;/li&gt;
&lt;li&gt;A session&lt;/li&gt;
&lt;li&gt;A room&lt;/li&gt;
&lt;li&gt;A scene-manifest version
function mintRealtimeToken(
session,
actorUserId
) {
const secret =
process.env.REALTIME_TOKEN_SECRET ||
process.env.JWT_SECRET;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;if (!secret) {&lt;br&gt;
    throw new Error(&lt;br&gt;
      'Realtime token secret is not configured'&lt;br&gt;
    );&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return jwt.sign({&lt;br&gt;
    sub: String(actorUserId),&lt;br&gt;
    purpose: 'metaverse-realtime',&lt;br&gt;
    sessionId: session.sessionId,&lt;br&gt;
    roomId: session.roomId,&lt;br&gt;
    sceneManifestVersion:&lt;br&gt;
      session.sceneManifestVersion&lt;br&gt;
  }, secret, {&lt;br&gt;
    expiresIn: '5m'&lt;br&gt;
  });&lt;br&gt;
}&lt;br&gt;
The five-minute expiration limits the lifetime of captured tokens.&lt;br&gt;
Future work will need to evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token refresh&lt;/li&gt;
&lt;li&gt;Revocation semantics&lt;/li&gt;
&lt;li&gt;Horizontal realtime scaling&lt;/li&gt;
&lt;li&gt;Redis-backed session coordination&lt;/li&gt;
&lt;li&gt;Replay resistance&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Reconnect behavior&lt;/li&gt;
&lt;li&gt;Multi-region latency&lt;/li&gt;
&lt;li&gt;Moderation Without Exposing Raw Account IDs
Moderation references are generated as opaque identifiers rather than exposing account IDs directly in public session views.
function moderationParticipantRef(
sessionId,
actorUserId
) {
return hashRoomInviteCode(
&lt;code&gt;${sessionId}:${actorUserId}&lt;/code&gt;
).slice(0, 24);
}
Room blocklist references are scoped separately:
function blockedParticipantRef(
roomId,
actorUserId
) {
return hashRoomInviteCode(
&lt;code&gt;blocklist:${roomId}:${actorUserId}&lt;/code&gt;
).slice(0, 24);
}
This does not make the system anonymous by itself, but it reduces unnecessary identifier exposure in moderation interfaces.
The server supports actions such as:&lt;/li&gt;
&lt;li&gt;Removing a participant from a live session&lt;/li&gt;
&lt;li&gt;Blocking a participant from a room&lt;/li&gt;
&lt;li&gt;Removing pending stage requests&lt;/li&gt;
&lt;li&gt;Revoking speaker status&lt;/li&gt;
&lt;li&gt;Listing blocklist entries through opaque references
The public session representation also excludes raw participant arrays:
function publicSession(session) {
return {
id: session.sessionId,
roomId: session.roomId,
state: session.state,
capacity: session.capacity,
participantCount:
  (session.participantUserIds || []).length,
sceneManifestVersion:
  session.sceneManifestVersion,
lifecycleVersion:
  session.lifecycleVersion,
startedAt: session.startedAt || null,
endedAt: session.endedAt || null
};
}&lt;/li&gt;
&lt;li&gt;Versioned Scene Manifest v1
The second major implementation milestone was delivered through:&lt;/li&gt;
&lt;li&gt;PR #1601 — Validate versioned scene manifests before publication
The manifest establishes an explicit contract between the room configuration, asset pipeline, backend, and client runtime.
The current schema version is:
const SCENE_MANIFEST_SCHEMA_VERSION = '1';
Supported asset types are intentionally constrained:
const ASSET_TYPES = new Set([
'gltf',
'glb',
'image',
'audio',
'video'
]);
The initial contract also defines allowed zone types, lighting presets, and capability requirements:
const ZONE_TYPES = new Set([
'portal',
'stage',
'link'
]);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;const LIGHTING_PRESETS = new Set([&lt;br&gt;
  'day',&lt;br&gt;
  'sunset',&lt;br&gt;
  'night',&lt;br&gt;
  'studio'&lt;br&gt;
]);&lt;/p&gt;

&lt;p&gt;const CAPABILITIES = new Set([&lt;br&gt;
  'webgl2',&lt;br&gt;
  'webxr-immersive-vr',&lt;br&gt;
  'audio',&lt;br&gt;
  'video'&lt;br&gt;
]);&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Safe Default Manifest&lt;br&gt;
Every newly created room receives a minimal valid scene manifest:&lt;br&gt;
function defaultSceneManifest() {&lt;br&gt;
return {&lt;br&gt;
schemaVersion:&lt;br&gt;
  SCENE_MANIFEST_SCHEMA_VERSION,&lt;/p&gt;

&lt;p&gt;assetBundleVersion: '1',&lt;/p&gt;

&lt;p&gt;assets: [],&lt;/p&gt;

&lt;p&gt;spawnPoints: [&lt;br&gt;
  {&lt;br&gt;
    id: 'default',&lt;br&gt;
    position: [0, 0, 0]&lt;br&gt;
  }&lt;br&gt;
],&lt;/p&gt;

&lt;p&gt;interactionZones: [],&lt;/p&gt;

&lt;p&gt;stage: {&lt;br&gt;
  position: [0, 0, 0],&lt;br&gt;
  capacity: 1&lt;br&gt;
},&lt;/p&gt;

&lt;p&gt;lighting: {&lt;br&gt;
  preset: 'day'&lt;br&gt;
},&lt;/p&gt;

&lt;p&gt;capabilities: []&lt;br&gt;
};&lt;br&gt;
}&lt;br&gt;
This provides a known baseline rather than leaving newly created rooms in an undefined state.&lt;br&gt;
The room creation service persists this default:&lt;br&gt;
const room = await VirtualRoom.create({&lt;br&gt;
roomId: crypto.randomUUID(),&lt;br&gt;
slug: safeSlug,&lt;br&gt;
name: safeName,&lt;br&gt;
hostUserId: String(actorUserId),&lt;br&gt;
accessPolicy,&lt;br&gt;
capacity: numericCapacity,&lt;br&gt;
stagePolicy,&lt;br&gt;
sceneManifest: defaultSceneManifest()&lt;br&gt;
});&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example of a More Complete Scene Manifest&lt;br&gt;
A future Neon Plaza manifest could look like this:&lt;br&gt;
{&lt;br&gt;
"schemaVersion": "1",&lt;br&gt;
"assetBundleVersion": "42",&lt;br&gt;
"assets": [&lt;br&gt;
{&lt;br&gt;
  "id": "neon-plaza",&lt;br&gt;
  "type": "glb",&lt;br&gt;
  "url": "&lt;a href="https://cdn.myzubster.com/scenes/neon-plaza.42.glb" rel="noopener noreferrer"&gt;https://cdn.myzubster.com/scenes/neon-plaza.42.glb&lt;/a&gt;"&lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
  "id": "ambient-track",&lt;br&gt;
  "type": "audio",&lt;br&gt;
  "url": "&lt;a href="https://cdn.myzubster.com/audio/neon-plaza.7.ogg" rel="noopener noreferrer"&gt;https://cdn.myzubster.com/audio/neon-plaza.7.ogg&lt;/a&gt;"&lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
  "id": "life-dashboard",&lt;br&gt;
  "type": "image",&lt;br&gt;
  "url": "&lt;a href="https://cdn.myzubster.com/life/pilot-dashboard.12.webp" rel="noopener noreferrer"&gt;https://cdn.myzubster.com/life/pilot-dashboard.12.webp&lt;/a&gt;"&lt;br&gt;
}&lt;br&gt;
],&lt;br&gt;
"spawnPoints": [&lt;br&gt;
{&lt;br&gt;
  "id": "main-entrance",&lt;br&gt;
  "position": [0, 1.6, 4]&lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
  "id": "life-hub",&lt;br&gt;
  "position": [12, 1.6, -3]&lt;br&gt;
}&lt;br&gt;
],&lt;br&gt;
"interactionZones": [&lt;br&gt;
{&lt;br&gt;
  "id": "life-portal",&lt;br&gt;
  "type": "portal",&lt;br&gt;
  "position": [10, 0, -3],&lt;br&gt;
  "radius": 1.5,&lt;br&gt;
  "destination": "life-hub"&lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
  "id": "pilot-details",&lt;br&gt;
  "type": "link",&lt;br&gt;
  "position": [14, 1, -4],&lt;br&gt;
  "radius": 1,&lt;br&gt;
  "destination": "&lt;a href="https://www.myzubster.com/life-pilot" rel="noopener noreferrer"&gt;https://www.myzubster.com/life-pilot&lt;/a&gt;"&lt;br&gt;
}&lt;br&gt;
],&lt;br&gt;
"stage": {&lt;br&gt;
"position": [0, 0, -8],&lt;br&gt;
"capacity": 30&lt;br&gt;
},&lt;br&gt;
"lighting": {&lt;br&gt;
"preset": "sunset"&lt;br&gt;
},&lt;br&gt;
"capabilities": [&lt;br&gt;
"webgl2",&lt;br&gt;
"audio"&lt;br&gt;
]&lt;br&gt;
}&lt;br&gt;
This is a contract, not an arbitrary JSON document.&lt;br&gt;
The server validates its structure before accepting it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Input Validation and Security Boundaries&lt;br&gt;
Manifest IDs must use a constrained format:&lt;br&gt;
function validId(value) {&lt;br&gt;
return (&lt;br&gt;
typeof value === 'string' &amp;amp;&amp;amp;&lt;br&gt;
/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(value)&lt;br&gt;
);&lt;br&gt;
}&lt;br&gt;
Coordinates must contain exactly three finite values:&lt;br&gt;
function validVector(value) {&lt;br&gt;
return (&lt;br&gt;
Array.isArray(value) &amp;amp;&amp;amp;&lt;br&gt;
value.length === 3 &amp;amp;&amp;amp;&lt;br&gt;
value.every(Number.isFinite)&lt;br&gt;
);&lt;br&gt;
}&lt;br&gt;
Asset and external-link URLs must use HTTPS:&lt;br&gt;
function validHttpsUrl(value) {&lt;br&gt;
if (&lt;br&gt;
typeof value !== 'string' ||&lt;br&gt;
value.length &amp;gt; 2048&lt;br&gt;
) {&lt;br&gt;
return false;&lt;br&gt;
}&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;try {&lt;br&gt;
    return new URL(value).protocol === 'https:';&lt;br&gt;
  } catch {&lt;br&gt;
    return false;&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
This blocks obvious unsafe values such as:&lt;br&gt;
javascript:alert(1)&lt;br&gt;
&lt;a href="http://untrusted.example/asset.glb" rel="noopener noreferrer"&gt;http://untrusted.example/asset.glb&lt;/a&gt;&lt;br&gt;
invalid-url&lt;br&gt;
HTTPS validation alone does not solve every asset-security problem. Future protections should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Approved asset origins&lt;/li&gt;
&lt;li&gt;Content-Type verification&lt;/li&gt;
&lt;li&gt;Maximum file size&lt;/li&gt;
&lt;li&gt;Download timeouts&lt;/li&gt;
&lt;li&gt;Hash or checksum validation&lt;/li&gt;
&lt;li&gt;Malware scanning where applicable&lt;/li&gt;
&lt;li&gt;glTF structural validation&lt;/li&gt;
&lt;li&gt;Texture and geometry limits&lt;/li&gt;
&lt;li&gt;CORS verification&lt;/li&gt;
&lt;li&gt;Redirect restrictions&lt;/li&gt;
&lt;li&gt;Decompression-bomb protections&lt;/li&gt;
&lt;li&gt;Asset-license metadata&lt;/li&gt;
&lt;li&gt;Bounded Collections
The validator limits the number of objects that can be supplied.
For example:
if (
!Array.isArray(input.assets) ||
input.assets.length &amp;gt; 100
) {
errors.push(
'assets must be an array with at most 100 entries'
);
}
Spawn points are also bounded:
if (
!Array.isArray(input.spawnPoints) ||
input.spawnPoints.length &amp;lt; 1 ||
input.spawnPoints.length &amp;gt; 32
) {
errors.push(
'spawnPoints must contain between 1 and 32 entries'
);
}
Bounding collection sizes reduces accidental or malicious resource amplification before scene loading begins.
Client-side budgets will still be needed for:&lt;/li&gt;
&lt;li&gt;Triangle count&lt;/li&gt;
&lt;li&gt;Texture memory&lt;/li&gt;
&lt;li&gt;Audio duration&lt;/li&gt;
&lt;li&gt;Video resolution&lt;/li&gt;
&lt;li&gt;Animation count&lt;/li&gt;
&lt;li&gt;Shader complexity&lt;/li&gt;
&lt;li&gt;Draw calls&lt;/li&gt;
&lt;li&gt;Concurrent network requests&lt;/li&gt;
&lt;li&gt;Duplicate and Invalid Spawn Points
Spawn-point IDs must be valid and unique:
const ids = new Set();&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;input.spawnPoints.forEach((spawn, index) =&amp;gt; {&lt;br&gt;
  if (!isRecord(spawn) || !validId(spawn.id)) {&lt;br&gt;
    errors.push(&lt;br&gt;
      &lt;code&gt;spawnPoints[${index}].id is invalid&lt;/code&gt;&lt;br&gt;
    );&lt;br&gt;
  } else if (ids.has(spawn.id)) {&lt;br&gt;
    errors.push(&lt;br&gt;
      &lt;code&gt;spawnPoints[${index}].id must be unique&lt;/code&gt;&lt;br&gt;
    );&lt;br&gt;
  } else {&lt;br&gt;
    ids.add(spawn.id);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;if (&lt;br&gt;
    !isRecord(spawn) ||&lt;br&gt;
    !validVector(spawn.position)&lt;br&gt;
  ) {&lt;br&gt;
    errors.push(&lt;br&gt;
      &lt;code&gt;spawnPoints[${index}].position&lt;/code&gt; +&lt;br&gt;
      'must be a finite xyz vector'&lt;br&gt;
    );&lt;br&gt;
  }&lt;br&gt;
});&lt;br&gt;
This prevents ambiguous spawn resolution and invalid coordinates such as:&lt;br&gt;
{&lt;br&gt;
  "id": "entrance",&lt;br&gt;
  "position": [0, null, 4]&lt;br&gt;
}&lt;br&gt;
or:&lt;br&gt;
{&lt;br&gt;
  "id": "entrance",&lt;br&gt;
  "position": [0, 1]&lt;br&gt;
}&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Portal and Link Validation
Interaction zones can currently represent:&lt;/li&gt;
&lt;li&gt;Portals&lt;/li&gt;
&lt;li&gt;Stage areas&lt;/li&gt;
&lt;li&gt;External links
Portal destinations must be valid internal identifiers:
if (
zone?.type === 'portal' &amp;amp;&amp;amp;
!validId(zone.destination)
) {
errors.push(
&lt;code&gt;interactionZones[${index}].destination&lt;/code&gt; +
'is required for portals'
);
}
External links must use HTTPS:
if (
zone?.type === 'link' &amp;amp;&amp;amp;
!validHttpsUrl(zone.destination)
) {
errors.push(
&lt;code&gt;interactionZones[${index}].destination&lt;/code&gt; +
'must use https for links'
);
}
A complete implementation will also need to distinguish:
internal room destination
internal MyZubster route
approved external URL
blocked external URL
missing destination
temporarily unavailable destination&lt;/li&gt;
&lt;li&gt;Validation Before Publication
The most important server-side behavior is the publication gate.
When the client supplies a new manifest—or tries to publish a draft—the backend validates the candidate first:
const manifestCandidate =
patch.sceneManifest !== undefined
? patch.sceneManifest
: room.sceneManifest;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;if (&lt;br&gt;
  patch.sceneManifest !== undefined ||&lt;br&gt;
  patch.state === 'published'&lt;br&gt;
) {&lt;br&gt;
  const manifestValidation =&lt;br&gt;
    validateSceneManifest(manifestCandidate);&lt;/p&gt;

&lt;p&gt;if (!manifestValidation.valid) {&lt;br&gt;
    return {&lt;br&gt;
      valid: false,&lt;br&gt;
      status: 400,&lt;br&gt;
      error: 'Invalid scene manifest',&lt;br&gt;
      details: manifestValidation.errors&lt;br&gt;
    };&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;room.sceneManifest =&lt;br&gt;
    manifestValidation.manifest;&lt;br&gt;
}&lt;br&gt;
Only after this check can the room continue through the lifecycle transition.&lt;br&gt;
The intended invariant is:&lt;br&gt;
invalid manifest&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
HTTP 400&lt;br&gt;
      │&lt;br&gt;
      └── publication rejected&lt;br&gt;
while:&lt;br&gt;
valid manifest&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
lifecycle validation&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
draft → published&lt;br&gt;
This is stronger than validating only in the frontend. Frontend validation improves UX, but it cannot be authoritative because requests can be sent outside the official UI.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Persisting the Scene Contract
The room model now stores both the manifest version and manifest content:
sceneManifestVersion: {
type: String,
default: '1'
},&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;sceneManifest: {&lt;br&gt;
  type: mongoose.Schema.Types.Mixed,&lt;br&gt;
  default: null&lt;br&gt;
}&lt;br&gt;
The public room representation includes the scene configuration:&lt;br&gt;
function publicRoom(room) {&lt;br&gt;
  return {&lt;br&gt;
    id: room.roomId,&lt;br&gt;
    slug: room.slug,&lt;br&gt;
    name: room.name,&lt;br&gt;
    state: room.state,&lt;br&gt;
    accessPolicy: room.accessPolicy,&lt;br&gt;
    capacity: room.capacity,&lt;br&gt;
    stagePolicy: room.stagePolicy,&lt;br&gt;
    sceneManifestVersion:&lt;br&gt;
      room.sceneManifestVersion,&lt;br&gt;
    sceneManifest:&lt;br&gt;
      room.sceneManifest || null,&lt;br&gt;
    scheduledFor:&lt;br&gt;
      room.scheduledFor || null&lt;br&gt;
  };&lt;br&gt;
}&lt;br&gt;
This is the first version of the contract. It is not the final persistence design.&lt;br&gt;
The next implementation should separate the current manifest pointer from immutable historical versions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Testing the Contract
The validator includes tests for:&lt;/li&gt;
&lt;li&gt;A safe default manifest&lt;/li&gt;
&lt;li&gt;Versioned asset bundles&lt;/li&gt;
&lt;li&gt;Valid spawn points&lt;/li&gt;
&lt;li&gt;Valid interaction zones&lt;/li&gt;
&lt;li&gt;Portal destinations&lt;/li&gt;
&lt;li&gt;HTTPS links&lt;/li&gt;
&lt;li&gt;Unsupported schema versions&lt;/li&gt;
&lt;li&gt;Insecure asset URLs&lt;/li&gt;
&lt;li&gt;Malformed vectors&lt;/li&gt;
&lt;li&gt;Duplicate IDs&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unsupported capability requirements&lt;br&gt;
A simplified example:&lt;br&gt;
test(&lt;br&gt;
'rejects unsupported schema versions and insecure asset urls',&lt;br&gt;
() =&amp;gt; {&lt;br&gt;
const manifest = {&lt;br&gt;
  ...defaultSceneManifest(),&lt;/p&gt;

&lt;p&gt;schemaVersion: '2',&lt;/p&gt;

&lt;p&gt;assets: [{&lt;br&gt;
    id: 'plaza',&lt;br&gt;
    type: 'glb',&lt;br&gt;
    url: '&lt;a href="http://cdn.example.com/plaza.glb" rel="noopener noreferrer"&gt;http://cdn.example.com/plaza.glb&lt;/a&gt;'&lt;br&gt;
  }]&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;const result =&lt;br&gt;
  validateSceneManifest(manifest);&lt;/p&gt;

&lt;p&gt;expect(result.valid).toBe(false);&lt;/p&gt;

&lt;p&gt;expect(result.errors).toEqual(&lt;br&gt;
  expect.arrayContaining([&lt;br&gt;
    'schemaVersion must be 1',&lt;br&gt;
    'assets[0].url must use https'&lt;br&gt;
  ])&lt;br&gt;
);&lt;br&gt;
}&lt;br&gt;
);&lt;br&gt;
Another test verifies malformed vectors and duplicate IDs:&lt;br&gt;
test(&lt;br&gt;
'rejects malformed vectors, duplicate ids and unsupported capabilities',&lt;br&gt;
() =&amp;gt; {&lt;br&gt;
const manifest = {&lt;br&gt;
  ...defaultSceneManifest(),&lt;/p&gt;

&lt;p&gt;spawnPoints: [&lt;br&gt;
    {&lt;br&gt;
      id: 'same',&lt;br&gt;
      position: [0, 0]&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      id: 'same',&lt;br&gt;
      position: [0, 0, Number.NaN]&lt;br&gt;
    }&lt;br&gt;
  ],&lt;/p&gt;

&lt;p&gt;capabilities: ['telepathy']&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;const result =&lt;br&gt;
  validateSceneManifest(manifest);&lt;/p&gt;

&lt;p&gt;expect(result.valid).toBe(false);&lt;br&gt;
}&lt;br&gt;
);&lt;br&gt;
The merged changes passed:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend lint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frontend unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend build&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frontend build&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security audit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous evidence checks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What We Verified in Production&lt;br&gt;
The current evidence boundary is important.&lt;br&gt;
We verified the following using a desktop browser against the production environment:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The metaverse page loaded&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authentication was active&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Neon Plaza loaded&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The session appeared online&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Controls were visible&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emotes were available&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chat was available&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The browser capability panel rendered&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Baseline browser checks passed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;WebXR fallback messaging appeared&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The experience remained accessible without immersive WebXR&lt;br&gt;
We have not yet treated the following as fully verified:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real-device mobile behavior&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real-headset WebXR entry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real-headset WebXR exit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Controller input across different headsets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Long-running realtime reliability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High-concurrency room behavior&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CDN-backed versioned 3D asset loading&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manifest rollback in production&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete accessibility validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A full LIFE pilot represented in the scene&lt;br&gt;
This distinction prevents roadmap intentions from being reported as completed features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connecting the Metaverse to LIFE&lt;br&gt;
The MyZubster Metaverse should not become only a visual or social layer.&lt;br&gt;
Its more valuable role is to become an interface between:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real-world pilots&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Technical evidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Community participation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Education&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environmental indicators&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replicable workflows&lt;br&gt;
The proposed LIFE-oriented flow is:&lt;br&gt;
Real-world pilot&lt;br&gt;
  ↓&lt;br&gt;
Observation or measurement&lt;br&gt;
  ↓&lt;br&gt;
Data provenance&lt;br&gt;
  ↓&lt;br&gt;
Evidence classification&lt;br&gt;
  ↓&lt;br&gt;
KPI / MRV calculation&lt;br&gt;
  ↓&lt;br&gt;
MyZubster project record&lt;br&gt;
  ↓&lt;br&gt;
Metaverse representation&lt;br&gt;
  ↓&lt;br&gt;
Mission or educational interaction&lt;br&gt;
  ↓&lt;br&gt;
Community feedback&lt;br&gt;
  ↓&lt;br&gt;
Improved pilot&lt;br&gt;
Example&lt;br&gt;
Imagine a LIFE-oriented water or circular-agriculture pilot.&lt;br&gt;
A participant enters Neon Plaza and approaches a portal labelled “Water Pilot”.&lt;br&gt;
The portal opens a dedicated scene. Inside that scene, the participant can inspect:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The pilot location at an appropriate privacy level&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The project methodology&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The instruments or sensors used&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The observation period&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Current evidence status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relevant KPIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data-quality warnings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Missing evidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replication instructions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Public contribution tasks&lt;br&gt;
The scene might include a dashboard, but the dashboard must reference an authoritative evidence record.&lt;br&gt;
The scene itself is not evidence.&lt;br&gt;
3D visualization ≠ verified measurement&lt;br&gt;
simulation ≠ real-world result&lt;br&gt;
self-declaration ≠ independent validation&lt;br&gt;
project goal ≠ achieved impact&lt;br&gt;
The UI should make these boundaries visible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evidence States for LIFE Scenes&lt;br&gt;
A useful next contract could attach evidence states to interactive objects:&lt;br&gt;
{&lt;br&gt;
"id": "water-savings-display",&lt;br&gt;
"type": "evidence-panel",&lt;br&gt;
"position": [4, 1.5, -2],&lt;br&gt;
"evidence": {&lt;br&gt;
"status": "measured",&lt;br&gt;
"source": "pilot-observation-2026-10",&lt;br&gt;
"methodologyVersion": "0.2",&lt;br&gt;
"verifiedBy": null,&lt;br&gt;
"independentVerification": false&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
Possible evidence states could include:&lt;br&gt;
planned&lt;br&gt;
self-declared&lt;br&gt;
observed&lt;br&gt;
measured&lt;br&gt;
methodology-reviewed&lt;br&gt;
independently-verified&lt;br&gt;
disputed&lt;br&gt;
superseded&lt;br&gt;
This would allow the metaverse client to render different visual treatments:&lt;br&gt;
verified data        → solid green indicator&lt;br&gt;
measured, unverified → amber indicator&lt;br&gt;
self-declared        → blue information indicator&lt;br&gt;
simulation           → purple simulation indicator&lt;br&gt;
missing evidence     → grey warning indicator&lt;br&gt;
disputed             → red review indicator&lt;br&gt;
The goal is not to gamify uncertainty away. The goal is to make uncertainty understandable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What Is Still Missing&lt;br&gt;
The current implementation is a foundation, not a finished metaverse stack.&lt;br&gt;
22.1 Real mobile-device validation&lt;br&gt;
We still need structured testing on real devices:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Android Chrome&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Android Firefox&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iOS Safari&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iPadOS Safari&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Low-memory devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Slow or unstable networks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Small screens&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Touch-only navigation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Orientation changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Background and resume behavior&lt;br&gt;
The UI claims that mobile browser access is supported as the intended baseline, but a complete real-device verification matrix is still required.&lt;br&gt;
22.2 Real WebXR headset testing&lt;br&gt;
We need physical tests for:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entering immersive mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exiting immersive mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Session interruption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Controller input&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Focus loss&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guardian or boundary changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Headset sleep and resume&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unsupported-feature fallback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Audio behavior&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Motion comfort&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance degradation&lt;br&gt;
Automated capability tests cannot replace physical-device validation.&lt;br&gt;
22.3 Immutable manifest history&lt;br&gt;
The current room stores its active manifest.&lt;br&gt;
The next persistence layer should add immutable versions:&lt;br&gt;
{&lt;br&gt;
roomId: 'room-123',&lt;br&gt;
version: '7',&lt;br&gt;
schemaVersion: '1',&lt;br&gt;
assetBundleVersion: '42',&lt;br&gt;
checksum: 'sha256:...',&lt;br&gt;
manifest: { /* immutable snapshot */ },&lt;br&gt;
createdBy: 'account-reference',&lt;br&gt;
createdAt: '2026-10-12T...'&lt;br&gt;
}&lt;br&gt;
A room should point to an active version rather than mutating history:&lt;br&gt;
VirtualRoom&lt;br&gt;
activeManifestVersion → 7&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SceneManifestVersion&lt;br&gt;
  version 5&lt;br&gt;
  version 6&lt;br&gt;
  version 7&lt;br&gt;
22.4 Safe rollback&lt;br&gt;
Rollback should not destroy newer history.&lt;br&gt;
Instead, it should create a new version based on a previous valid snapshot:&lt;br&gt;
v5 → v6 → v7&lt;br&gt;
          │&lt;br&gt;
          └── rollback requested&lt;br&gt;
                    ↓&lt;br&gt;
                   v8&lt;br&gt;
       content derived from v6&lt;br&gt;
That preserves auditability.&lt;br&gt;
22.5 CDN and cache invalidation&lt;br&gt;
Versioned asset URLs should be immutable:&lt;br&gt;
/scenes/neon-plaza.42.glb&lt;br&gt;
/textures/plaza-floor.18.webp&lt;br&gt;
/audio/neon-ambient.7.ogg&lt;br&gt;
The manifest can change its pointer to a new asset version, while previous versions remain available for rollback.&lt;br&gt;
The CDN layer needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immutable cache headers&lt;/li&gt;
&lt;li&gt;Content hashes&lt;/li&gt;
&lt;li&gt;CORS configuration&lt;/li&gt;
&lt;li&gt;Range requests where appropriate&lt;/li&gt;
&lt;li&gt;Compression strategy&lt;/li&gt;
&lt;li&gt;Cache invalidation rules&lt;/li&gt;
&lt;li&gt;Origin failure handling&lt;/li&gt;
&lt;li&gt;Asset availability checks
22.6 Graceful asset failure
A missing decorative object should not necessarily prevent the whole scene from loading.
The client needs failure classes:
critical asset failure
└── load fallback scene&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;important asset failure&lt;br&gt;
    └── continue with visible warning&lt;/p&gt;

&lt;p&gt;optional asset failure&lt;br&gt;
    └── omit asset and continue&lt;br&gt;
A future manifest entry could declare this explicitly:&lt;br&gt;
{&lt;br&gt;
  "id": "neon-plaza",&lt;br&gt;
  "type": "glb",&lt;br&gt;
  "url": "&lt;a href="https://cdn.myzubster.com/scenes/neon-plaza.42.glb" rel="noopener noreferrer"&gt;https://cdn.myzubster.com/scenes/neon-plaza.42.glb&lt;/a&gt;",&lt;br&gt;
  "criticality": "critical",&lt;br&gt;
  "fallbackAssetId": "basic-plaza"&lt;br&gt;
}&lt;br&gt;
22.7 Resource budgets&lt;br&gt;
Schema validity does not guarantee runtime safety.&lt;br&gt;
We still need budgets for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asset file size&lt;/li&gt;
&lt;li&gt;Texture dimensions&lt;/li&gt;
&lt;li&gt;Total texture memory&lt;/li&gt;
&lt;li&gt;Polygon count&lt;/li&gt;
&lt;li&gt;Draw calls&lt;/li&gt;
&lt;li&gt;Animation complexity&lt;/li&gt;
&lt;li&gt;Audio memory&lt;/li&gt;
&lt;li&gt;Video resolution&lt;/li&gt;
&lt;li&gt;Concurrent downloads&lt;/li&gt;
&lt;li&gt;Scene initialization time
22.8 Realtime load testing
The realtime system needs controlled tests for:&lt;/li&gt;
&lt;li&gt;Concurrent joins&lt;/li&gt;
&lt;li&gt;Concurrent leaves&lt;/li&gt;
&lt;li&gt;Chat bursts&lt;/li&gt;
&lt;li&gt;Stage requests&lt;/li&gt;
&lt;li&gt;Participant moderation&lt;/li&gt;
&lt;li&gt;Token refresh&lt;/li&gt;
&lt;li&gt;Reconnect storms&lt;/li&gt;
&lt;li&gt;Server restart&lt;/li&gt;
&lt;li&gt;Database latency&lt;/li&gt;
&lt;li&gt;Redis degradation&lt;/li&gt;
&lt;li&gt;Network partitions
22.9 Accessibility
The browser-first experience needs continued testing for:&lt;/li&gt;
&lt;li&gt;Keyboard navigation&lt;/li&gt;
&lt;li&gt;Screen-reader labels&lt;/li&gt;
&lt;li&gt;Focus management&lt;/li&gt;
&lt;li&gt;Reduced motion&lt;/li&gt;
&lt;li&gt;Colour contrast&lt;/li&gt;
&lt;li&gt;Text scaling&lt;/li&gt;
&lt;li&gt;Captions&lt;/li&gt;
&lt;li&gt;Non-spatial alternatives&lt;/li&gt;
&lt;li&gt;Touch targets&lt;/li&gt;
&lt;li&gt;Cognitive load
An immersive view cannot be the only way to access important project information.
22.10 LIFE evidence integration
The first complete LIFE scene still needs:&lt;/li&gt;
&lt;li&gt;A selected pilot&lt;/li&gt;
&lt;li&gt;A defined methodology&lt;/li&gt;
&lt;li&gt;A provenance contract&lt;/li&gt;
&lt;li&gt;Evidence states&lt;/li&gt;
&lt;li&gt;KPI definitions&lt;/li&gt;
&lt;li&gt;MRV boundaries&lt;/li&gt;
&lt;li&gt;Privacy rules&lt;/li&gt;
&lt;li&gt;A public scene representation&lt;/li&gt;
&lt;li&gt;A contribution workflow&lt;/li&gt;
&lt;li&gt;A validation and review process&lt;/li&gt;
&lt;li&gt;Proposed Next Technical Milestones
The next roadmap can be structured into the following slices.
C2.1 — Immutable manifest versions
Create manifest version model
→ calculate checksum
→ store immutable snapshot
→ point room to active version
C2.2 — Manifest rollback
Select historical version
→ validate snapshot
→ create new version
→ update active pointer
→ preserve audit history
C2.3 — Asset pipeline
Upload
→ validate
→ scan
→ optimize
→ hash
→ version
→ CDN publish
→ manifest reference
C2.4 — Client scene loader
Fetch room
→ fetch manifest
→ check schema version
→ check capabilities
→ load critical assets
→ load optional assets
→ expose failures
→ enter scene
C2.5 — LIFE pilot scene
Pilot record
→ evidence contract
→ KPI/MRV mapping
→ manifest generation
→ scene visualization
→ public test&lt;/li&gt;
&lt;li&gt;Links to the Work
Main repository&lt;/li&gt;
&lt;li&gt;MyZubster-Ecosystem/myzubster
Browser and WebXR fallback&lt;/li&gt;
&lt;li&gt;PR #1597 — Non-blocking WebXR capability fallback
Versioned scene manifest&lt;/li&gt;
&lt;li&gt;PR #1601 — Scene manifest validation and publication gate
Live experience&lt;/li&gt;
&lt;li&gt;MyZubster Metaverse&lt;/li&gt;
&lt;li&gt;MyZubster&lt;/li&gt;
&lt;li&gt;LIFE Pilot&lt;/li&gt;
&lt;li&gt;How Developers Can Contribute
The most useful contributions right now include:&lt;/li&gt;
&lt;li&gt;Android and iOS browser test reports&lt;/li&gt;
&lt;li&gt;Real-headset WebXR test reports&lt;/li&gt;
&lt;li&gt;Scene-manifest reviews&lt;/li&gt;
&lt;li&gt;glTF and GLB validation&lt;/li&gt;
&lt;li&gt;3D performance budgets&lt;/li&gt;
&lt;li&gt;Asset fallback design&lt;/li&gt;
&lt;li&gt;Accessibility reviews&lt;/li&gt;
&lt;li&gt;Realtime load-test scenarios&lt;/li&gt;
&lt;li&gt;Security reviews&lt;/li&gt;
&lt;li&gt;CDN architecture&lt;/li&gt;
&lt;li&gt;Manifest version-history design&lt;/li&gt;
&lt;li&gt;Rollback implementation&lt;/li&gt;
&lt;li&gt;LIFE evidence modelling&lt;/li&gt;
&lt;li&gt;KPI and MRV data contracts&lt;/li&gt;
&lt;li&gt;Technical documentation
A useful contribution should include reproducible evidence:
environment
browser or device
exact version
steps performed
expected result
observed result
screenshots or logs when safe
related issue or pull request
Please do not publish:&lt;/li&gt;
&lt;li&gt;Passwords&lt;/li&gt;
&lt;li&gt;Authentication tokens&lt;/li&gt;
&lt;li&gt;Private wallet keys&lt;/li&gt;
&lt;li&gt;Seed phrases&lt;/li&gt;
&lt;li&gt;Private participant information&lt;/li&gt;
&lt;li&gt;Precise sensitive locations&lt;/li&gt;
&lt;li&gt;Unredacted personal data
Conclusion
The MyZubster Metaverse now has two important foundations:&lt;/li&gt;
&lt;li&gt;A browser-first runtime that treats WebXR as progressive enhancement&lt;/li&gt;
&lt;li&gt;A server-side scene contract that blocks invalid manifests from publication
The completed work is publicly traceable through:&lt;/li&gt;
&lt;li&gt;PR #1597&lt;/li&gt;
&lt;li&gt;PR #1601
The next challenge is not simply adding more 3D content.
It is building a reliable chain from versioned assets and authoritative sessions to transparent, evidence-aware virtual experiences:
code
→ validated contract
→ versioned scene
→ reliable session
→ real-world pilot
→ evidence
→ understandable visualization
→ community contribution
That is the direction of the MyZubster Metaverse: an open, browser-first environment where virtual experiences connect to documented projects, reproducible evidence, and real-world collaboration.
Status verified: October 12, 2026.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>metaverse</category>
      <category>browser</category>
      <category>sever</category>
      <category>rooms</category>
    </item>
  </channel>
</rss>
