Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# bridge value are valid. No VITE_ variable may contain a secret.
VITE_WARPKEEP_SHARED_ALPHA_ENABLED=false
VITE_SPACETIMEDB_URI=https://maincloud.spacetimedb.com
VITE_SPACETIMEDB_DATABASE=warpkeep-89e4u
VITE_SPACETIMEDB_DATABASE=c2001f161d44e50c0a75356d79a4d10fa4a9d77ea4eddd56cda7ac6af50b570e
VITE_WARPKEEP_AUTH_BRIDGE_URL=
VITE_WARPKEEP_OIDC_ISSUER=
VITE_WARPKEEP_OIDC_AUDIENCE=warpkeep-spacetimedb
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
VITE_WARPKEEP_OIDC_ISSUER: ${{ vars.WARPKEEP_OIDC_ISSUER || '' }}
VITE_WARPKEEP_OIDC_AUDIENCE: ${{ vars.WARPKEEP_OIDC_AUDIENCE || 'warpkeep-spacetimedb' }}
VITE_SPACETIMEDB_URI: ${{ vars.WARPKEEP_SPACETIMEDB_URI || 'https://maincloud.spacetimedb.com' }}
VITE_SPACETIMEDB_DATABASE: ${{ vars.WARPKEEP_SPACETIMEDB_DATABASE || 'warpkeep-89e4u' }}
VITE_SPACETIMEDB_DATABASE: ${{ vars.WARPKEEP_SPACETIMEDB_DATABASE || 'c2001f161d44e50c0a75356d79a4d10fa4a9d77ea4eddd56cda7ac6af50b570e' }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ jobs:
run: |
pnpm --dir spacetimedb run verify
npm run stdb:verify-bindings
npm run stdb:verify-worker-migration
npm run stdb:verify-additive-migration

- name: Audit module dependencies
Expand Down
19 changes: 17 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,20 @@ dist
.DS_Store
coverage
*.local
.cache/warpkeep-assets/
.cache/warpkeep-tools/

# Machine-local caches, deployment state, and diagnostic captures.
.cache/
.wrangler/
.dev.vars*
!.dev.vars.example
*.har
*.log

# Credential-bearing files must stay in Keychain or ignored local config.
.npmrc
*.key
*.pem
*.p12
*.pfx
*.jks
*.keystore
17 changes: 16 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@ full engineering record.

## [Unreleased]

## [0.3.14] — 2026-07-22

- Made the Realm recover from temporary graphics interruptions while preserving
selection and camera intent, and let castles continue at compact detail when
optional richer models cannot load.
- Gave river and ocean surfaces gentle motion and selectable, read-only public
records, including source-to-mouth river navigation. Reduced-motion play
keeps the water still.
- Refined the Lowlands toward a clearer green palette and denser grass coverage
without changing authoritative terrain, ownership, or resource rules.
- Staged a server-authoritative four-worker foundation behind inactive migration
and activation gates. Workers are not live in Alpha 0.3.14; the existing
expedition flow remains in place.

## [0.3.13] — 2026-07-19

- Let the old scattered lakes return to lowland while preserving twelve
Expand Down Expand Up @@ -111,7 +125,8 @@ full engineering record.
Lowlands, a first keep, Farcaster sign-in, and an admission-gated shared-world
foundation.

[Unreleased]: https://github.com/ael-dev3/Warpkeep/compare/v0.3.13...HEAD
[Unreleased]: https://github.com/ael-dev3/Warpkeep/compare/v0.3.14...HEAD
[0.3.14]: https://github.com/ael-dev3/Warpkeep/compare/v0.3.13...v0.3.14
[0.3.13]: https://github.com/ael-dev3/Warpkeep/compare/v0.3.12...v0.3.13
[0.3.12]: https://github.com/ael-dev3/Warpkeep/compare/v0.3.11...v0.3.12
[0.3.11]: https://github.com/ael-dev3/Warpkeep/compare/v0.3.8...v0.3.11
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## What is this?

Genesis 001 is a persistent, invite-only 10,000-cell Lowlands realm with 100 permanent castle sites kept close to its founding district. Each founder signs in with a verified Farcaster identity, receives one durable keep, and privately holds Food / Wood / Stone / Gold. Food, Wood, and Stone are governed by authoritative terrain yield, while dedicated expeditions can gather all four resources. Alpha 0.3.13 is live but early; founders can explore its coast, twelve rivers, clustered forests, and resource sites, follow their supply wagons, and return to a world that remembers them, while the intended core strategy loop is not playable yet. Warpkeep is a one-person experiment—not a finished MMO or financial product; there are no token rewards, no financial promises, and joining does not earn an airdrop or financial return or guarantee a reward or future value.
Genesis 001 is a persistent, invite-only 10,000-cell Lowlands realm with 100 permanent castle sites kept close to its founding district. Each founder signs in with a verified Farcaster identity, receives one durable keep, and privately holds Food / Wood / Stone / Gold. Food, Wood, and Stone are governed by authoritative terrain yield, while dedicated expeditions can gather all four resources. Alpha 0.3.14 is live but early; founders can explore its coast, twelve rivers, clustered forests, and resource sites, follow their supply wagons, and return to a world that remembers them, while the intended core strategy loop is not playable yet. Warpkeep is a one-person experiment—not a finished MMO or financial product; there are no token rewards, no financial promises, and joining does not earn an airdrop or financial return or guarantee a reward or future value.

![Development preview of Genesis 001 showing the Lowlands and an open Wheat Farm inspection panel.](docs/reference/screenshots/2026-07-22-realm-wheat-farm-preview/warpkeep-realm-wheat-farm-preview-f3b1f7e598c543d6.png)

Expand All @@ -27,7 +27,7 @@ Open the local URL Vite prints; shared Alpha access stays off by default. Contri

| State | Today |
| --- | --- |
| ✅ Live | Alpha 0.3.13 is live and invite-only. |
| ✅ Live | Alpha 0.3.14 is live and invite-only. |
| ✅ World | Genesis 001 persists 10,000 cells, a coastline, twelve one-cell rivers, and 100 permanent castle sites near the founding district. Founders return to one durable keep, explore the Lowlands up to its fog, and inspect nearby founders through their public username / portrait / castle. The same authoritative world waits across sessions. |
| ✅ Authority | FID is the durable identity; handles and portraits are bounded presentation metadata. Farcaster sign-in uses a browser-bound, least-privilege bridge. The browser presents. The server decides admission and ownership. It also owns resources, timers, and saved state. |
| ✅ Resources | Each keep privately holds Food / Wood / Stone / Gold. Food, Wood, and Stone come from authoritative terrain yield and can also be gathered at Wheat Farms, Logging Camps, and Stone Quarries; Gold comes from Gold Mines. The resource rail shows stored and ready amounts, and hover, focus, or tap explains current behavior. The browser never invents balances. |
Expand All @@ -52,7 +52,7 @@ Open the local URL Vite prints; shared Alpha access stays off by default. Contri
- **Architecture:** The [technical architecture](docs/technical-architecture.md) explains what the browser shows and what the server decides.
- **Roadmap:** The [roadmap](docs/design/roadmap.md) and [game direction](docs/design/warpkeep-direction.md) separate today's game from later plans.
- **Authentication:** The [Farcaster integration](docs/farcaster-integration.md) guide covers sign-in, privacy, and public configuration.
- **Release:** The [Alpha 0.3.13 release notes](CHANGELOG.md#0313--2026-07-19) record exactly what is live.
- **Release:** The [Alpha 0.3.14 release notes](CHANGELOG.md#0314--2026-07-22) record exactly what is live.
- **Licensing:** [LICENSING.md](LICENSING.md) explains release rules; [asset provenance](ASSETS-LICENSE.md) records where media came from and what permissions apply.
- **Contributing:** [CONTRIBUTING.md](CONTRIBUTING.md) covers checks and provenance; the [Realm Council issue forms](https://github.com/ael-dev3/Warpkeep/issues/new/choose) accept privacy-safe bugs and ideas.
- **Security:** Report sensitive issues privately through [SECURITY.md](SECURITY.md), never through a public issue.
Expand Down
39 changes: 39 additions & 0 deletions docs/design/realm-renderer-recovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Realm renderer recovery

The Realm keeps a real WebGL scene as the source of truth once it has become
ready. The renderer lifecycle is explicit: `probing`, `loading`, `ready`,
`recovering`, `static-unsupported`, and `failed`.

`static-unsupported` is reserved for a device that cannot create WebGL before
the first successful scene. It is an accessible, bounded illustrated view; it
is never a post-ready error surface. A renderer construction error, failed
castle assembly, castle-count mismatch, or synchronization failure remains an
explicit loading/recovery/failed state instead of silently replacing a real
world with a full-world SVG.

Context loss calls `preventDefault`, pauses ambient work and rendering, and
retains React selection, camera intent, and the scene attestation. Pointer,
wheel, label-click, and camera input are synchronously suspended while the
context is lost so a partially disposed scene cannot consume a gesture. The
restored event starts a bounded scene rebuild and records loss/restore counts on
the canvas for DOM diagnostics. If the browser does not restore the context in
time, the user sees an explicit retry surface. All renderer surfaces share one
cached, non-destructive WebGL2 capability probe. No capability check calls
`WEBGL_lose_context` or otherwise tears down a context; a probe only reads the
optional texture-size limit.

Castle loading is staged: Compact is mandatory and retried once for transient
transport failures after a deterministic short yield; Balanced and High are
optional upgrades. A missing optional LOD records the active quality in
`data-realm-castle-active-lod` and continues with Compact. Pairing, integrity,
and Compact failures are reported with stable failure codes for telemetry and
QA. Each controlled load is assigned a monotonic renderer generation. Scene
callbacks carry that generation and stale callbacks from a disposed scene are
ignored by both the React boundary and the pure lifecycle reducer. The DOM
exposes the active generation and the last generation that rendered a
successful frame, making recovery assertions deterministic. A ready renderer
can never transition into static compatibility mode.

The recovery contract is intentionally frontend-only. Durable world state,
authorization, and SpacetimeDB subscriptions remain outside the renderer and
are never mutated by recovery code.
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
{
"schemaVersion": 1,
"id": "hegemony-worker-record-art-v1",
"recordedAt": "2026-07-19",
"purpose": "Transparent decorative Worker art for the Worker inspection panel",
"projectAuthorization": {
"authorizedBy": "Warpkeep project owner",
"instructionDate": "2026-07-19",
"scope": "Use the supplied transparent Worker illustration in the Warpkeep Worker UI slice stacked on the stable Realm PR. This authorizes repository/runtime integration only after review; it does not authorize merge, deployment, production activation, worker seeding, or generic worker authority.",
"notGranted": [
"proof of underlying copyright ownership",
"a public open-content licence",
"general third-party derivative or redistribution permission",
"trademark or canonical-identity rights",
"worker ownership, status, route, cargo, reward, or settlement authority"
]
},
"sourceInputs": [
{
"role": "owner-supplied transparent Worker illustration",
"repositoryRetained": false,
"originalName": "codex-clipboard-1312042e-175b-466f-adda-9bef7b12c1f0.png",
"bytes": 478174,
"sha256": "f6ae700affb5ce981074c7952bc81f90b60e2dab947b94867c5394d3e23b4d6d",
"image": {
"format": "png",
"width": 1024,
"height": 1024,
"channels": 4,
"alpha": true
}
}
],
"processing": {
"tool": "sharp 0.35.3",
"operation": "lossy WebP derivative with alpha preserved",
"outputEncoding": "quality 92, alphaQuality 100, effort 6, smartSubsample true",
"runtimeAsset": {
"path": "public/images/realm/hegemony-worker-record.webp",
"format": "webp",
"width": 1024,
"height": 1024,
"bytes": 86984,
"sha256": "ff758ecbf520b05ccf0a2fa490bcafa6c564514de5ee56ef5a720fd6da24193e",
"decodedRgbaSha256": "2e77492f76801576adcc9cfe660fa15494123bc43fcd767e005cd5ad95d8b047",
"alpha": {
"transparentPixels": 858605,
"partiallyTransparentPixels": 39551,
"opaquePixels": 150420
},
"visibleBoundsAlpha16": {
"minX": 256,
"minY": 50,
"maxX": 863,
"maxY": 934
}
}
},
"presentationBoundary": {
"component": "src/components/realm/WorkerInspectionPanel.tsx",
"runtimeUse": "same-origin decorative hero art in a focus-safe Worker inspector",
"forbiddenClaims": [
"private FID",
"private cargo or account balance",
"browser-invented worker ownership",
"browser-derived dispatch or recall authority",
"reward or Marks linkage"
]
},
"licence": {
"spdx": "LicenseRef-Warpkeep-Provenance-Required",
"policy": "The exact project instruction authorizes this Warpkeep runtime use but does not establish a public relicensing grant. See ASSETS-LICENSE.md."
},
"visualQa": {
"transparentSourceVerified": true,
"visibleBoundsRecorded": true,
"runtimeDerivativeViewedOnTransparentViewer": true,
"externalRuntimeUrl": false
}
}
2 changes: 1 addition & 1 deletion docs/releases/versioning.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Versioning and releases

Warpkeep uses semantic versions for the product and Git commit SHAs for builds.
The current Alpha is `0.3.13`.
The current Alpha is `0.3.14`.

## Version numbers

Expand Down
5 changes: 5 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
data-warpkeep-production-csp
http-equiv="Content-Security-Policy"
content="default-src 'none'; base-uri 'none'; object-src 'none'; frame-src 'none'; form-action 'none'; script-src 'self' 'wasm-unsafe-eval'; script-src-attr 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' https://auth.warpkeep.com https://relay.farcaster.xyz https://mainnet.optimism.io https://maincloud.spacetimedb.com wss://maincloud.spacetimedb.com https://imagedelivery.net https://wrpcd.net https://res.cloudinary.com https://i.imgur.com https://lh3.googleusercontent.com https://i.seadn.io; worker-src 'self' blob:; manifest-src 'none'"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta
name="description"
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "warpkeep",
"private": true,
"version": "0.3.13",
"version": "0.3.14",
"description": "A Farcaster-connected persistent strategy world in active Alpha development.",
"license": "Apache-2.0",
"homepage": "https://warpkeep.com",
Expand Down Expand Up @@ -69,6 +69,7 @@
"stdb:generate": "node scripts/generate-spacetime-bindings.mjs",
"stdb:verify-bindings": "node scripts/verify-spacetime-bindings.mjs",
"stdb:verify-additive-migration": "node scripts/verify-spacetime-additive-migration.mjs",
"stdb:verify-worker-migration": "node scripts/verify-castle-worker-additive-migration.mjs",
"stdb:publish:dev": "node scripts/publish-spacetime-dev.mjs",
"stdb:seed-world": "tsx scripts/hermes-admin.ts seed-world",
"stdb:expand-world-v3": "tsx scripts/hermes-admin.ts expand-world-v3",
Expand Down
Binary file added public/images/realm/hegemony-worker-record.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions scripts/qa-observer/rendered-webgl-browser-probe.d.mts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export const RENDERED_WEBGL_QA_CHROME_TEAM_ID: 'EQHXZ8M8AV';
export const RENDERED_WEBGL_QA_CASE_COUNT: 14;
/** Exact authoritative terrain count for the Genesis generation-v3 render target. */
export const RENDERED_WEBGL_QA_SEMANTIC_TERRAIN_CELL_COUNT: 10000;
/** Exact visible terrain-kind count after canonical no-lake revision activation. */
export const RENDERED_WEBGL_QA_SEMANTIC_TERRAIN_KIND_COUNT: 6;
export const RENDERED_WEBGL_QA_LABEL_MAX_ANCHOR_DISPLACEMENT_PIXELS: 0;
export const RENDERED_WEBGL_QA_LABEL_COORDINATE_SERIALIZATION_EPSILON_PIXELS: 0.015;
/** Vite 8 default deny patterns plus the local asset-cache boundary. */
Expand Down
Loading