RPGJS Studio
Choose a playable world, customize maps and events visually, then press Play. Start free in your browser and export your RPGJS source.
Discover games shared by the r/aigamedev community. Explore weekly highlights, follow development and help makers with feedback.
GamesJavaScript · CSSGitHub @energon-a-secasOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Discover games shared on r/aigamedev and follow their progress
Translation pending
Loading the full README.
Read the full README ↗Discover games, explore their history, and help the next version take shape
Playtrace collects games shared on r/aigamedev so players can discover a project, inspect its source history, and leave useful public feedback. An optional “Your ideal price” field lets visitors share a pricing suggestion. Reading and contributing require no account.
Live: playtrace.neorgon.com · API: service status
Public feedback uses a random browser edit key so visitors can update or remove their contribution. Favorites save on your device without login. The star filter in Browse shows your saved games, and signing in reconciles them with your private account list. Existing private account price responses stay private. See account activation.
The bundled snapshot is dated local exploration data; the live catalogue grows separately. No votes, demand figures, or user accounts are seeded.
The static publisher creates the directory routes and versioned assets. From this directory:
make serve
This builds _site/ from the saved catalogue before serving it. After editing source files, run make build again and reload. For a current catalogue build, run node scripts/build-site.mjs, then serve _site/ directly.
Open http://localhost:8900. js/config.js pins the production API address, whose CORS policy does not allow localhost. To explore the bundled snapshot, set apiBase to an empty string in your local checkout. Guest feedback and account features will then show as unavailable. Restore the pinned value before publishing. A configured API failure never switches silently to the bundled snapshot. For interactive local feedback, use the disposable Worker setup in the runbook.
The Worker uses Cloudflare D1 and R2. See the Worker configuration, the database migrations, and the API modules. Operator credentials belong in Worker secrets, never in js/config.js, a commit, or browser storage. The visitor's random edit key is intentionally browser-local. Local server secrets belong in an ignored worker/.dev.vars file. Authenticated account testing requires an HTTPS origin permitted by both Clerk and ALLOWED_ORIGINS.
node --test tests/*.test.mjs
node --test worker/tests/*.test.mjs
python3 worker/tests/schema.test.py
Client tests cover source validation, shared filters, progressive pagination, incomplete loads, guest posting and removal, storage failure, escaping, and stale responses. Backend tests use synthetic signed sessions, a SQLite-backed D1 adapter, and controlled archive/media responses. Use a Node runtime with node:sqlite. They cover guest ownership, moderation, rate limits, privacy separation, collections over 2,000 projects, resumable historical/recent collection, stable project identity, atomic imports, removal, and media validation. They do not manufacture activity in the live database.
| Area | Files | Responsibility |
|---|---|---|
| Browser shell | index.html, browse.html, profile.html, css/campaign.css | Focused landing page, catalogue, favorites and project dialogs |
| Research | research.html, js/question-flow.js, worker/src/research.mjs | Reusable guest playtests, versioned forms and private metrics |
| Editorial queue | js/admin-campaign.js, worker/src/jobs.mjs, worker/src/insights.mjs | URL/store checks, source references and cited review drafts |
| Client behavior | js/state.js, js/render.js, js/events.js | Validated collection state, filtering, navigation, rendering |
| Feedback client | js/feedback.js, js/api.js | Public notes, optional ideal prices, browser edit keys and guest controls |
| Account client | js/accounts.js, js/challenge.js | Optional authenticated follows and legacy private data controls |
| Collection | worker/src/archive.mjs, worker/src/ingestion.mjs | Archive normalization, conservative categorization, cursors and scheduling |
| Trust and storage | worker/src/feedback.mjs, worker/src/auth.mjs, worker/src/limits.mjs, worker/src/store.mjs, worker/src/media.mjs | Public contributions, identity, quotas, D1 records and consented R2 previews |
| Initial data | data/catalog.json | Dated, reviewed source snapshot for local exploration and initial import |
The interface uses pale slate, navy type, and warm amber actions, with system dark preference support. Archivo headings and Source Sans 3 body text are self-hosted with their font licenses. css/report.css owns the visual layer; vendored Neorgon kits provide shared header, footer, auth, persistence, and navigation behavior.
Arctic Shift is a third-party archive and may be delayed or incomplete. Original Reddit posts remain the primary source. A listed author, game stage, or AI-use claim is not independently verified. Clear showcases can publish automatically; ambiguous candidates require operator review. Earlier posts can extend a matching timeline while its original source anchor and project ID remain unchanged. “Historical” means checking available archived posts, not claiming every project or deleted post can be recovered. Reddit discussion remains linked at its source; it is not copied into the visitor feedback feed.
Guest writes require a 256-bit browser edit key and a server HMAC secret, with independent browser/network quotas. The server stores only an HMAC of the edit key. Public responses contain the contributor's chosen name, note, and optional price; they never include keys, network identifiers, or private account prices. The separate legacy account API uses server-verified sessions and its own configured protection mode.
Catalogue pages contain up to 200 projects. There is no 2,000-project public collection cap; individual imports remain bounded to 2,000 records and each game's timeline to 1,000 posts. Excess or ambiguous timeline candidates remain pending for review. Public preview storage is not an open upload endpoint. Endpoint details and rollback constraints are in the API contract.
The production Clerk domain connection and encrypted Worker secret are configured. Open the admin desk and sign in with the verified primary owner email. Real owner sign-in binds that account on its first successful request. No Clerk secret is stored in this checkout.
The live sign-in form is verified and accountsReady: true is published in js/config.js. Admin edits, account authorization and persistence are covered with signed fixture sessions; the owner's real Google account has not been used in automated checks. Guest notes and ideal prices remain independent of sign-in. The browser flag controls availability only; the Worker always verifies sessions for private endpoints.
The Pages workflow in .github/workflows/pages.yml builds _site/ from a complete live catalogue hourly, on pushes to main and on manual dispatch. It publishes permanent /games/<id>/ pages, a crawlable directory and sitemap.xml. Project metadata and JSON-LD are present without JavaScript. The artifact allowlist excludes Worker code, private files and editorial analysis documents. An incomplete fetch fails without replacing the last deployment. The Pages repository must use GitHub Actions as its build source.
For a local snapshot build: node scripts/build-site.mjs --catalog data/public-catalog.json. For current production reads: node scripts/build-site.mjs. _site/ is generated and ignored. Search Console ownership and sitemap submission require the property owner; generating a sitemap does not guarantee indexing.
Community Insights provides catalogue trends, model announcement comparisons, source inspection, CSV export and a separate Steam release timeline. Its hourly public snapshot is built from the allowlisted /insights endpoint. Admin desk → Insights adds community choices and anonymous usage counts through protected endpoints. Private questionnaires, identities and editorial jobs are never exported. See the dashboard methodology and 100-project enrichment pilot. Apply all migrations through 0014_feedback_context.sql before deploying this version. Accepted source-linked facts survive imports; explicit admin edits and approved images take precedence.
Reddit net-score snapshots refresh Sundays at 12:50 UTC for the previous 35 days: eight archive calls maximum, up to 100 IDs each, no hidden HTTP retries. Missing and older observations do not replace a good score. Initial source imports can seed a missing observation. The :50 hourly trigger dispatches this task on Sundays; five cron definitions are retained. Weekly picks use the explicit SAT weekday (Cloudflare numbers weekdays from Sunday).
Jev uses the encrypted JEV_API_KEY and https://api.typesafe.ai/v1/systemone. Feedback jobs combine public Playtrace notes with archived Reddit comments, bound the sample, preserve explicit/unknown experience and retain source citations. Private questionnaire analysis stays separate. Admin → Evidence queue shows integration/schedule status and lets editors change draft prose and labels before publishing. New written public feedback receives queue priority over store maintenance; Sunday maintenance adds up to eight recent projects. Both obey the existing daily job budget, cooldowns and a feedback backlog cap. No automatic publication occurs.
GET /feedback-patterns exposes recent public quick-answer counts and already-published citation labels, never draft classification or private research. Responses are uncached so removals apply immediately. GET /games/:id/feedback/:feedbackId resolves an individual public citation even beyond the first feedback page. Public notes have optional experience (preview, played, unspecified); older clients preserve prior values. Updating, hiding or deleting a copied note withdraws its derived review, including protection against jobs finishing after a removal.
See feedback operations and methodology for definitions and review workflow.
Local Jev post research, timing-data limitations and shorter public routes are documented in the post research guide.
Insights now groups its catalogue evidence into topic views with shared genre/platform/device/stage filters. Pie slices, legends, distribution labels and trend bars expose their underlying projects or source records. Technique and resource extraction runs on retained public source text; js/technique-evidence.js defines the explicit vocabulary. Counts describe mentions, not verified adoption. Source excerpts, original dates, missing classifications and model-comparison limitations remain visible.
Store summaries deduplicate by Steam app or itch.io listing. The Steam calendar separates exact planned dates from month/quarter/year-only and unknown announcements; past dates on still-upcoming listings need rechecking, not an inferred release. Itch.io minimum prices are collected from unambiguous JSON-LD offers during normal bounded store maintenance. Existing observations without a price stay unknown. The calendar and past-release timeline have distinct semantics.
Home image hints are generated from the actual published picks. Desktop preloads start in the document head; mobile retains lazy loading beyond the first image. showcase-images.js coordinates decoded artwork with a bounded, reduced-motion-aware reveal. Live refreshes reconcile unchanged panels rather than replacing them. Approved media's withdrawal and no-store behavior are preserved; loading improvements do not create a second persistent copy of uploaded artwork.