<?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: Reallexi LLC</title>
    <description>The latest articles on DEV Community by Reallexi LLC (@reallexi_llc_384b040df139).</description>
    <link>https://dev.to/reallexi_llc_384b040df139</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%2F4113032%2F19e29637-cdcd-4498-80b1-7c8acf8f9bf8.jpg</url>
      <title>DEV Community: Reallexi LLC</title>
      <link>https://dev.to/reallexi_llc_384b040df139</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reallexi_llc_384b040df139"/>
    <language>en</language>
    <item>
      <title>Building BlockMyBlocks: A balance game for all ages</title>
      <dc:creator>Reallexi LLC</dc:creator>
      <pubDate>Tue, 08 Sep 2026 20:49:01 +0000</pubDate>
      <link>https://dev.to/reallexi_llc_384b040df139/building-blockmyblocks-a-balance-game-for-all-ages-4g84</link>
      <guid>https://dev.to/reallexi_llc_384b040df139/building-blockmyblocks-a-balance-game-for-all-ages-4g84</guid>
      <description>&lt;p&gt;BlockMyBlocks is out now on Web, iOS, Android. This is how it got made: the decisions, the pipeline, and what I would do differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;A balance game for all ages. Stack the pieces on a deck that tips, hold it steady, and keep going — the levels never run out.&lt;/p&gt;

&lt;p&gt;Stack the pieces on a deck that tips, hold it steady, and keep going — the levels never run out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Determinism and golden tests
&lt;/h2&gt;

&lt;p&gt;The sim is pure and deterministic — time and seed are parameters. That buys the strongest cheap test there is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The catch-up law: simulate(state, a+b) === simulate(simulate(state, a), b) for arbitrary
splits. Offline catch-up, tab-restore and server ticks all depend on it. Test it directly with
quantised splits (e.g. 120 = 60+60), plus: rewards are integers, no NaN anywhere after a very
long run.&lt;/li&gt;
&lt;li&gt;Golden files: shared/test/golden/.json holds
{seed, state0, actions[], expected: {hash per interval, final snapshot}}. The test replays the
actions and compares a stable hash of the state at every interval. Any sim change fails golden;
--update regenerates only after a human confirms the change is intended and the
PR says why. Keep scenarios small but adversarial (empty world, dense world, each subsystem
stressed, one long-horizon run).&lt;/li&gt;
&lt;li&gt;Cross-runtime determinism: the browser smoke computes the same hashes with the same shared
sim and must match the server — catches engine/float differences before they become a&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scene architecture
&lt;/h2&gt;

&lt;p&gt;Rules that keep the frame loop cheap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State reads in useFrame go through store.getState(), never per-instance subscriptions. Selectors are narrow (useWorld(s =&amp;gt; s.entities)).&lt;/li&gt;
&lt;li&gt;HUD is DOM, not canvas. Everything tappable is React DOM for accessibility and crisp text; in-world labels are drei with a hard cap (~40 visible, nearest first).&lt;/li&gt;
&lt;li&gt;Zero per-frame allocation in steady state: pre-parsed THREE.Color constants (col.copy(c), never col.set('#hex')), module-level scratch vectors, geometry rebuilds gated on a content signature, not on "something changed".&lt;/li&gt;
&lt;li&gt;Debug handles live on window.game: stats() (draw calls, tris, dpr, tier, fps), mem() (GPU bytes by owner), setQuality, setDpr, setTimeOfDay, governor flag. Test scripts read these; nothing in gameplay&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommended platform collections
&lt;/h2&gt;

&lt;p&gt;The generic meta-game set. Add game collections beside them; keep these shapes so payments, social and live-ops code stays portable between games. All timestamps epoch-ms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collection: Id Fields&lt;/li&gt;
&lt;li&gt;accounts: account id (nanoid) displayName, isGuest, &lt;code&gt;providers: [{provider: 'guest'\ 'google'\ 'apple'\ 'email', subject}], email?, passwordHash?, locale, country?, createdAt, lastSeenAt, bannedAt?, bannedReason?&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;sessions: opaque 32-byte token (never logged) accountId, deviceId?, createdAt, expiresAt, lastUsedAt&lt;/li&gt;
&lt;li&gt;wallets: : balance (integer ≥ 0, a cache of the ledger sum), updatedAt&lt;/li&gt;
&lt;li&gt;wallet_ledger: : accountId, currency, delta, balanceAfter, reason (&lt;code&gt;'collect'\ 'purchase'\ 'gift'\ 'event'\ 'admin'\ 'refund'…), refType?, refId?, at&lt;/code&gt; — append-only; the ledger is truth&lt;/li&gt;
&lt;li&gt;purchases: : accountId, productId, provider (&lt;code&gt;'stripe'\ 'play'\ 'apple'), state ('pending'\ 'granted'\ 'refunded'\ 'failed'), amountCents?, currency?, createdAt, grantedAt?, refundedAt?, rawReceiptRef?&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;entitlements: : key ('season_pass:', 'no_ads', 'pack:'), sourcePurchaseId?, grantedAt, expiresAt? (null = permanent), revokedAt?&lt;/li&gt;
&lt;li&gt;leaderboard_entries: :: score, meta? (display extras, id-only), updatedAt; periodKey = 'all', ISO week '2026-W35', or an event id&lt;/li&gt;
&lt;li&gt;flags: flag key value, segments? ({country?, minLevel?, pct?}), version, updatedAt — live-ops overrides on top of content&lt;/li&gt;
&lt;li&gt;events: event id runtime…&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Validator-per-message
&lt;/h2&gt;

&lt;p&gt;Every message type — WS and REST body alike — has exactly one validator function in shared/protocol.mjs, used by the client before sending and by the server before touching state. Validators are whitelists: the only fields that exist afterwards are the ones they return.&lt;/p&gt;

&lt;p&gt;Unknown t values and oversized frames (&amp;gt; 16 KB) close the socket; unknown fields are dropped; null from a validator is BAD_PAYLOAD, before any service code runs. There is never a second, looser parser&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;It is live at &lt;a href="https://ddkits.github.io/block-my-blocks" rel="noopener noreferrer"&gt;https://ddkits.github.io/block-my-blocks&lt;/a&gt;. If you have shipped something similar, I would like to hear what you would have cut.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>mobile</category>
      <category>software</category>
      <category>testing</category>
    </item>
    <item>
      <title>Building Apex Coloring: 3D Art Studio for Kids 3+</title>
      <dc:creator>Reallexi LLC</dc:creator>
      <pubDate>Mon, 07 Sep 2026 15:00:18 +0000</pubDate>
      <link>https://dev.to/reallexi_llc_384b040df139/building-apex-coloring-3d-art-studio-for-kids-3-5af8</link>
      <guid>https://dev.to/reallexi_llc_384b040df139/building-apex-coloring-3d-art-studio-for-kids-3-5af8</guid>
      <description>&lt;p&gt;Apex Coloring is out now on Web, iOS, Android. This is how it got made: the decisions, the pipeline, and what I would do differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;Apex Coloring — a 3D art studio for kids 3+. Color 3D animals, paint, solve art puzzles, play mini games, learn letters and numbers. No ads, no data collection, made for little hands.&lt;/p&gt;

&lt;p&gt;Color 3D animals, paint, solve art puzzles, play mini games, learn letters and numbers. No ads, no data collection, made for little hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Textures — baked in Blender, tiered per platform
&lt;/h2&gt;

&lt;p&gt;Models ship untextured; one atlas set per asset family ships beside them. scripts/blender/bake_textures.py builds 16 procedural node-tree materials per family on a 4×4 tile grid and runs two Cycles EMIT bakes (1 sample, no lights — a bake, not a render): base colour, and a packed data map. scripts/gen-textures.mjs then derives the tangent-space normal (from the baked height field) and the ORM (R occlusion / G roughness / B metalness / A emissive mask), and encodes one set per quality tier, capped at each tier's textureMax from config/platform-quality.json (high 2048 / medium 1024 / low 512):&lt;/p&gt;

&lt;p&gt;The client fetches exactly one tier (its own), chosen by the quality system — this is the other half of the platform-quality contract: the pipeline caps what each tier can even download.&lt;/p&gt;

&lt;p&gt;UV contract: faces carry TEXCOORD_0 = world-scaled tiling coordinates (metres per repeat, so brick courses align with floor lines) and TEXCOORD_1 = the tile origin, constant per face; the shader samples origin + fract(uv) * 0.25 with textureGrad so the tile wrap never picks a coarse mip. Only designated slots are tintable by the palette; everything else keeps its real albedo. The attributes survive weld/join/simplify/Draco, so all LODs share the atlas.&lt;/p&gt;

&lt;p&gt;KTX2 is a VRAM decision, not a download decision. Measured on an eleven-family set (4096 px albedo class):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;map: WebP download KTX2 download WebP VRAM…&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PII inventory and retention
&lt;/h2&gt;

&lt;p&gt;Keep this table current — it is the privacy policy's "what we collect" section and the store data-safety form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data: Purpose Retention&lt;/li&gt;
&lt;li&gt;email (optional): login, receipts, recovery life of account&lt;/li&gt;
&lt;li&gt;password hash (Argon2id): login life of account&lt;/li&gt;
&lt;li&gt;display name, world/city name (UGC): gameplay life of account&lt;/li&gt;
&lt;li&gt;OAuth subject ids (Google/Apple/Facebook): login life of account&lt;/li&gt;
&lt;li&gt;age band (never a birth date): minor protections life of account&lt;/li&gt;
&lt;li&gt;IP hash (SHA-256, daily rotating salt) + UA family: rate limiting, fraud 30 days&lt;/li&gt;
&lt;li&gt;purchase rows (amount, currency, country, provider ids): fulfilment, refunds, tax 7 years (tax law) — pseudonymised on account deletion, account id replaced by a tombstone&lt;/li&gt;
&lt;li&gt;chat messages: gameplay 30 days or last 200 messages per channel, whichever is less&lt;/li&gt;
&lt;li&gt;avatars / player images: profile life of account — and they are "Photos and videos" in the Play data-safety form, even when they are only profile pictures; declaring them as "other" fails review&lt;/li&gt;
&lt;li&gt;analytics events (no free text, no names): first-party analytics 13 months raw; aggregates forever&lt;/li&gt;
&lt;li&gt;push tokens: notifications until unregistered / 60 days unused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never collected: precise location, contacts, phone numbers, card data (the payment providers hold it), raw IPs at rest. Player-chosen names are UGC: run them through the same profanity filter as chat plus a PII regex (emails, phone numbers) —…&lt;/p&gt;

&lt;h2&gt;
  
  
  Camera per game type
&lt;/h2&gt;

&lt;p&gt;game.config.json gameType selects config/game-types/.json, whose camera block the rig is built from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gameType: camera.type camera.style camera.controls&lt;/li&gt;
&lt;li&gt;city-builder: orthographic isometric pan-zoom-rotate&lt;/li&gt;
&lt;li&gt;idle-tycoon: orthographic fixed-iso pan-zoom&lt;/li&gt;
&lt;li&gt;racing: perspective chase follow&lt;/li&gt;
&lt;li&gt;arcade: perspective third-person follow&lt;/li&gt;
&lt;li&gt;puzzle: perspective top-down fixed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the orthographic styles, zoom is the scale (camera.zoom = pixels per world unit, exponential steps so wheel and pinch feel identical), position is derived each frame from {target, zoom, yaw, pitch} at a fixed distance, and rotation snaps to the four cardinal views with a tween. Pitch clamps ~25°–60°; target clamps to world bounds plus a margin. For perspective styles the rig is a follow controller with the same clamping discipline. Either way the rig owns one small mutable object read in useFrame — never React state.&lt;/p&gt;

&lt;p&gt;An orthographic camera has a useful side effect: LOD can be global per zoom tier rather than per-object distance — one state swap, no mid-screen&lt;/p&gt;

&lt;h2&gt;
  
  
  The postMessage bridge
&lt;/h2&gt;

&lt;p&gt;One JSON envelope in both directions; constants shared from shared/bridge.js so web and native cannot drift.&lt;/p&gt;

&lt;p&gt;Rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id is opaque, unique, generated by the page; replies always echo it. Every request gets exactly one reply. Long-running flows (a purchase sheet) reply immediately with {started:true} and deliver the outcome as an event.&lt;/li&gt;
&lt;li&gt;Error codes are stable strings: unavailable, bad_namespace, bad_op, bad_request, cancelled, denied, simulator, sign_in_failed, purchase_error, native_error. Unknown ns/op returns unavailable — an older shell never hangs a newer web bundle.&lt;/li&gt;
&lt;li&gt;Payloads are JSON only. Never put a session token in a payload; the page owns auth.&lt;/li&gt;
&lt;li&gt;The page times out its own requests (default 60 s) and rejects with TIMEOUT; on the web (window.ReactNativeWebView absent) calls reject immediately with NO_BRIDGE, so every call site has a web fallback by construction.&lt;/li&gt;
&lt;li&gt;The reply lands on a different target per platform. react-native-webview's postMessage dispatches the reply as a MessageEvent on window on iOS but on document on Android, and the event does not bubble — so a window-only listener silently drops every Android reply and each call dies of its own timeout. The page must register the SAME handler on both window and document. Symptom when it is missing: Android shows "the store is not available" after a 30 s pause while iOS works perfectly (shipped in Apex…&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Latest changes
&lt;/h2&gt;

&lt;p&gt;Changelog&lt;/p&gt;

&lt;p&gt;Every release of Apex Coloring, newest first. Each entry carries one block per store locale in the format the Play Console release-notes field takes, so the notes can be pasted straight in — and App Store Connect, the website and the in-app What's New panel all read the same source.&lt;/p&gt;

&lt;p&gt;Generated by npm run release:sync from shared/content/release-notes.json — edit that file, never this one. Play allows at most 500 characters per language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;It is live at &lt;a href="https://apexkids.reallexi.io" rel="noopener noreferrer"&gt;https://apexkids.reallexi.io&lt;/a&gt;. If you have shipped something similar, I would like to hear what you would have cut.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>mobile</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Building Real Memory AI Agent: Private AI agent execution for real developer work.</title>
      <dc:creator>Reallexi LLC</dc:creator>
      <pubDate>Mon, 07 Sep 2026 03:24:03 +0000</pubDate>
      <link>https://dev.to/reallexi_llc_384b040df139/building-real-memory-ai-agent-private-ai-agent-execution-for-real-developer-work-36cj</link>
      <guid>https://dev.to/reallexi_llc_384b040df139/building-real-memory-ai-agent-private-ai-agent-execution-for-real-developer-work-36cj</guid>
      <description>&lt;p&gt;Real Memory AI Agent is out now on VS Code, Chrome. This is how it got made: the decisions, the pipeline, and what I would do differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;AI coding agent for VS Code with a Scrum/Agile Kanban board, workspace file edits, validation, screenshots, browser/CLI/MCP workflows, and local/cloud/custom model providers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbnpg10x02b7iutb4dmh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbnpg10x02b7iutb4dmh8.png" alt="Real Memory AI Agent menu" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Flows
&lt;/h2&gt;

&lt;p&gt;![Real Memory AI Agent flows][store-workflow]&lt;/p&gt;

&lt;p&gt;Real Memory AI Agent supports four model flows so tenants can choose speed, simplicity, specialization, or automatic routing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flow: Tenant Ability&lt;/li&gt;
&lt;li&gt;Auto: Let the agent choose the right route for the task, from quick answer to full implementation.&lt;/li&gt;
&lt;li&gt;Direct Model: Use the selected model directly for fast questions, tool-backed workspace work, and provider-native streaming.&lt;/li&gt;
&lt;li&gt;Single Model: Run one selected model across thinking, action, and reporting for simpler deployments.&lt;/li&gt;
&lt;li&gt;Planner + Coder: Use separate planner and coder models for serious project work, stronger scoping, and cleaner implementation results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These flows are available across the VS Code extension and provider-backed runtime. The browser extension also exposes Direct Model and provider settings in a side&lt;/p&gt;

&lt;h2&gt;
  
  
  Help Test Real Memory AI Agent
&lt;/h2&gt;

&lt;p&gt;We are looking for developers, agencies, AI builders, browser power users, and teams with real projects to test Real Memory AI Agent and tell us what works, what breaks, and what would make it more useful.&lt;/p&gt;

&lt;p&gt;Testers can try the agent in the surfaces they already use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code: install the VSIX, open the RM AI Agent chat, connect a provider, and ask it to inspect, edit, validate, document, or explain a real workspace.&lt;/li&gt;
&lt;li&gt;Chrome: load or install the Chrome package, open the side panel, connect a provider, inspect a tab, capture proof, and try browser-safe actions.&lt;/li&gt;
&lt;li&gt;Edge: install the Edge package or load the unpacked build, then test the same side-panel workflow in Microsoft Edge.&lt;/li&gt;
&lt;li&gt;CLI: run chat, ask, and run commands from the terminal for fast local project workflows and automation checks.&lt;/li&gt;
&lt;li&gt;MCP: start the local MCP runtime and verify that compatible clients can reach workspace, terminal, memory, and doctor tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we need feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First install experience: what was confusing, slow, missing, or blocked?&lt;/li&gt;
&lt;li&gt;Provider setup: which provider worked, which failed, and what error message helped or did not help?&lt;/li&gt;
&lt;li&gt;Real work results: did it make the correct edits, inspect the right context, validate properly, and summarize honestly?&lt;/li&gt;
&lt;li&gt;Browser behavior: did tab selection, sessions, screenshots, artifacts, and page actions feel clear?&lt;/li&gt;
&lt;li&gt;Workflow visibility: did the…&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For AI Platform Tenants
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Expose private model value inside real developer workflows.&lt;/li&gt;
&lt;li&gt;Connect hosted models, custom endpoints, or account-backed services.&lt;/li&gt;
&lt;li&gt;Offer a practical agent surface that can produce visible work, not only answers.&lt;/li&gt;
&lt;li&gt;Expand from VS Code to browser, CLI, web, and MCP without changing the user&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  VS Code Agent
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chat-first workspace assistant.&lt;/li&gt;
&lt;li&gt;Model, planner, backend, mode, and thinking controls.&lt;/li&gt;
&lt;li&gt;Sessions and conversation history.&lt;/li&gt;
&lt;li&gt;Workspace file reading, searching, writing, and replacement.&lt;/li&gt;
&lt;li&gt;Active editor context.&lt;/li&gt;
&lt;li&gt;Diagnostics and project inspection.&lt;/li&gt;
&lt;li&gt;Command execution with approval controls.&lt;/li&gt;
&lt;li&gt;Validation, retry, and repair workflows.&lt;/li&gt;
&lt;li&gt;Review banner with changed file count.&lt;/li&gt;
&lt;li&gt;Diff review, approve, reject, and revert actions.&lt;/li&gt;
&lt;li&gt;Activity Log for detailed runtime status.&lt;/li&gt;
&lt;li&gt;Debug backflow levels: None, Simple, or Detail for provider/runtime diagnostics.&lt;/li&gt;
&lt;li&gt;Screenshot validation for UI work.&lt;/li&gt;
&lt;li&gt;RealMemory login and model selection commands.&lt;/li&gt;
&lt;li&gt;Local setup, setup doctor, MCP start/stop, and provider readiness commands.&lt;/li&gt;
&lt;li&gt;Workflow controller settings for system load, max agents, max subagents, evidence requirements, and changed-file attachment.&lt;/li&gt;
&lt;li&gt;Context input controls, compact provider packets, chunked file reads, and lightweight local-model&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Latest changes
&lt;/h2&gt;

&lt;p&gt;Changelog&lt;/p&gt;

&lt;p&gt;Generated by build: 2026-09-03T21:20:35.894Z&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;It is live at &lt;a href="https://realmemoryai.com" rel="noopener noreferrer"&gt;https://realmemoryai.com&lt;/a&gt;. If you have shipped something similar, I would like to hear what you would have cut.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
