SOURCE / PINNED RELEASE
Made of little things.
Napcraft
- Release
- ee47ac6a25df…
- Author-recorded commit
- 410dea87e109…
- License
- LICENSE
- Author’s source reference
- nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-52f9e22f5ce
Archive hash verified: 9e6e0cabb18d0d46…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
# Visible friends and direct building
## Behavior
Desktop players can hover to preview a column, click any visible block face to
place on that column, and right-click to erase its top block. Shift-click only
aims. A drag pans without editing; cancelled gestures, middle clicks and empty
sky clicks do not place blocks. Space, X and the existing buttons still work.
This is a column-building game: clicking a side does not create unsupported
floating blocks or replace the provider's foundation/support rules.
Touch retains tap-to-aim plus immediate Build/Erase buttons. Pointer type decides
whether a gesture builds, so a phone tap never accidentally becomes a desktop
click. Touch guidance also works on wide screens.
Friends previously spawned at exactly the same point and could be painted over
by foreground terrain. Each transport now gets a spread-out starting position,
color and short friend label. Starting-position collisions yield deterministically
before player movement. Gardeners render as visible game pieces above terrain;
labels are drawn last and separated when overlapping. The live-player indicator
is visible on phones. Departures clear their marker; new peer joins reset stale
presence sequence state and immediately send the local position.
The existing compatible WebRTC protocol remains cosmetic. Only connected peers
with finite, bounded positions/colors are accepted. No peer message writes blocks.
All click edits use the existing optimistic queue, exact retry journal, conflict
revalidation and authoritative CVM path. Backend handlers, schemas, release
pinning, provider, dependencies and selected creator were preserved.
## Verification
- `pnpm verify`: 21 tests passed, type-check and build passed.
- `soyli backend check`: all six operations compile.
- `soyli check`: checked with `space-playback-4`, Chromium 153.0.8010.12.
- `pnpm test:conformance`: 5 passed, 0 failed, 5 skipped. Manifest-event evidence,
wire-envelope evidence and lifecycle measurement remain unverified by that run.
- `soyli multiplayer tests/direct-building.mjs --latency 50 --jitter 15 --timeout 150
--turn-binary /opt/homebrew/bin/turnserver`: 15 assertions passed. Two independent
players, visible friend labels, movement, actual mouse placement, visible-side
right-click removal, hover/Shift aim, sky/middle/cancel/drag behavior, touch
aim/build, phone presence indicator, departure/rejoin and saved blocks.
- The same runner's existing edit-correctness scenario passed 22 assertions:
simultaneous conflicts, independent edits, outage queues, lost acknowledgement,
exact retry, reload and changed-transport recovery, owner permissions and
everyone leaving. Its aim helper now uses Shift-click explicitly.
- Original multiplayer scenario: 9 assertions passed; movement, shared edits,
owner pause/resume and world persistence. Total: **46 hosted assertions**.
- Real `soyli dev` preview at `http://127.0.0.1:60152/`: exact iframe sizes 200×160,
320×560, 900×600, 1440×900, 390×844, 360×640 and 844×390; simultaneous movement/build
touch, release, both color schemes and optional-domain absence passed.
Tests use the real soyLI backend, independent browser contexts and disposable
authenticated local TURN/TCP. No fake database or creator credentials are used
for test players. These are local tests with WebRTC delay/jitter, not public
network or physical iOS/Android certification. Full backend process-restart and
old-release compatibility were verified in the preceding responsive-editing work;
the backend is unchanged in this update.
## Captures and reproduction
Final HTML: 49,912 bytes, SHA-256
`fc5c1e0ac629450bd5c0f4ed7357c36f6d0e31361f27c6985cec5f23984597d4`.
`tests/capture.mjs` enters an actual two-player world, captures a 1200×750 cover
and 390×844 portrait with touch emulation, then records desktop clicks building a
stack, friend movement/building, and right-click removal. The selected files are
`preview-friends.png`, `preview-friends-portrait.png`, and `preview-friends.webm`.
The clip is seven seconds, 960×600, silent VP8. Prior media is preserved.
The actual images and filmstrip were visually inspected; the selected image
decoded and the entire clip played successfully in the soyLI Listing. The owned
preview and disposable test relays were stopped after verification.
Start `soyli dev --no-open --port 0`, use its printed URL as `NAPCRAFT_URL` for
`tests/responsive.mjs`, `tests/capture.mjs` and `tests/review-media.mjs`. Capture
metadata under ignored `.napplet-space/promotion/capture.json` identifies the raw
video and matching build hash. Trim its final seven seconds with ffmpeg, select
the new files in `napplet.json`, inspect images and play the clip in Listing.
Stop the owned preview after testing.
The requested publication was attempted after committing this build. It remains
blocked; see the [frontend/backend publication report](publication-attempt-2026-09-25.md).
