Feature Gap Ideas — 2026-07-31¶
Document type: Product idea list (no implementation)
Method: Read the live tree on claude/website-feature-ideas-ax3l1v — lib/games.ts,
lib/apps.ts, app/routes/** (~90 site routes, ~120 API namespaces), prisma/schema.prisma
(252 models), server/, go-services/ — then subtracted everything already shipped and
everything already specced in the three existing idea docs so nothing here is a repeat:
docs/plans/2026-07-15-cross-system-feature-ideas.md— 6 features (tournaments, wagers, prediction markets, creator coin bridge, AI residents, live-ops season)docs/plans/2026-07-19-platform-expansion-design.md— 12 features (arcade pass, creator studio, live spaces, party system, events, replays-as-content, marketplace, gifting v2, digest email, AI concierge, onboarding v2, stat cards)docs/plans/2026-07-20-parity-qol-customization-design.md— 16 features (lists, saves, history, game hubs, awards, wishlists, presence, status, close friends, profile v2, a11y suite, theme studio, dashboard, notifications v2, feed controls, search v2)
Every idea below states the gap evidence (what I actually checked) so none of it is speculative. Effort is XS/S/M/L on the same scale the other plan docs use.
Framing. This platform is past “build the basics.” Nearly every consumer-social and gamification primitive exists. The gaps that remain cluster in three unglamorous places: (1) the safety/compliance layer under a real-money-adjacent economy, (2) the operational surfaces that let you ship and un-ship safely, and (3) the connective tissue between systems that already exist but don’t know about each other. Those are ranked first. The “fun” ideas are real too, but they are worth less than #1–#6 on this list.
Priority summary¶
# |
Idea |
Category |
Effort |
Why it ranks here |
|---|---|---|---|---|
1 |
Age assurance + regional gating for the wager/stake tier |
Safety |
M |
Real-money-adjacent surfaces ship today with no age signal at all |
2 |
Strike appeals + user-facing moderation record |
Safety |
S |
|
3 |
Visibility tiers (limited reach) instead of binary ban |
Safety |
M |
Only escalation available today is nuke-the-account |
4 |
Feature flags + kill switches + staged rollout |
Ops |
M |
No flag system anywhere; every launch is all-or-nothing with no runtime off-switch |
5 |
Public status & incident page |
Ops |
S |
A |
6 |
Changelog / “what shipped” feed |
Ops |
S |
|
7 |
Keyword, phrase & tag mutes |
Safety |
S |
|
8 |
Auctions, offers & price history on the market |
Economy |
M |
|
9 |
Economy health dashboard (faucets vs sinks) |
Economy |
M |
|
10 |
Unified matchmaking + anti-cheat service |
Games |
L |
|
11 |
OAuth 2.0 apps (third-party auth) |
Dev platform |
M |
Only PATs ( |
12 |
Semantic search across library/blog/builds |
Discovery |
M |
Search is keyword-only |
13 |
Colorblind-safe palettes + palette tester |
A11y |
S |
Themes cover contrast/motion/dyslexia, not color vision |
14 |
Translate-this-post (UGC translation) |
i18n |
M |
16 locales for chrome, zero for user content |
15 |
Per-tag / per-user RSS + ActivityPub read-only |
Discovery |
M |
RSS is blog+news only |
16 |
Study groups + cross-content spaced repetition |
Apps |
M |
|
17 |
Co-authored posts & collab builds |
Creator |
S |
Every content model is single-owner |
18 |
Item crafting / fusion sink |
Economy |
M |
|
19 |
Import from other platforms |
Portability |
M |
Export exists; no on-ramp |
20 |
Spectate + watch-party for multiplayer games |
Live |
L |
Replays are post-hoc only |
21 |
Transparency report (automated) |
Safety |
S |
Data exists in |
22 |
Gift cards & regional pricing |
Monetization |
M |
|
23 |
Teen/supervised accounts |
Safety |
L |
Pairs with #1 |
24 |
Home-screen widgets + offline reading queue |
Mobile |
M |
PWA + |
A. Safety, trust & compliance¶
This is the weakest layer relative to everything else, and it is the one that carries regulatory and platform-risk exposure rather than just product upside.
1. Age assurance + regional gating for the wager/stake tier¶
Concept. A one-time age/eligibility check that gates the money-adjacent surfaces —
/wager, /predictions, /ranked payouts, CoinStake, TournamentPayout,
RedemptionRequest — with a per-region policy table so a jurisdiction can be switched to
view-only without a deploy.
Gap evidence. grep -ril "age-verification|parental" across app/ components/ lib/ server/ returns nothing. Meanwhile the schema ships WagerMatch, CoinStake,
Prediction/PredictionPosition, TournamentPayout and RedemptionRequest (coins →
something of value). There is a birthdate-free User model. So today a minor in any
jurisdiction can stake coins on a peer-to-peer wager and request redemption.
Why it fits. Reuses Better Auth account state, the existing settings/privacy surface,
and the admin console for review queues. Composes with idea #4 (flags) to make regions
switchable at runtime.
Shape. UserEligibility { userId, ageBand, region, verifiedAt, method, expiresAt } +
a policy table + a requireEligibility() guard in the standard API handler chain (session →
eligibility → rate limit → zod). Self-declared date-of-birth as tier 1; document/third-party
check only if you ever take real money in.
Risks. Don’t store raw documents. Verification vendors are a cost center. Regional policy is a legal question, not an engineering one — the code should just make the answer configurable.
Effort. M (the guard is small; the policy matrix and the “what do we do about existing accounts” backfill are the work).
2. Strike appeals + a user-facing moderation record¶
Concept. Give users a “Your account status” page listing every strike, its reason, its expiry, and the content it attached to — plus a one-shot appeal per strike routed to a new admin queue.
Gap evidence. model UserStrike (schema) has userId, adminId, reason, expiresAt and
no acknowledgedAt, appealStatus, or contentId. app/routes/_site/admin/reports.tsx
is the moderator side; there is no user-side counterpart anywhere under
app/routes/_site/settings/. The word “appeal” appears in the codebase only for
admin/library-quota (storage quota requests), not moderation.
Why it fits. ContentReport, AdminAuditLog, Notification and the admin shell all
exist — this is mostly one new page, one new queue tab, and three schema columns. The
library-quota request flow is already the exact UX pattern to copy.
Effort. S. Highest trust-per-line-of-code item on this list.
3. Visibility tiers instead of a binary ban¶
Concept. A graduated enforcement ladder — NORMAL → LIMITED (replies/feed deranked, no discovery surfaces) → RESTRICTED (existing followers only) → SUSPENDED — so moderators
have a proportionate response for borderline cases.
Gap evidence. No shadowban or visibility-tier concept anywhere; UserStrike +
ContentReport + account deletion are the whole toolkit. FeedSignal already exists as the
ranking input, which is exactly where a tier multiplier would attach.
Why it fits. lib/moderation/auto-moderate.server.ts already classifies content — it
currently has nowhere proportionate to route a medium-confidence hit. Explicitly pair this
with #2: a hidden penalty with no notice is the failure mode every platform gets sued over,
so the tier must be visible on the user’s own status page.
Effort. M (the ranking integration is the real work, not the enum).
7. Keyword, phrase & tag mutes¶
Concept. Per-user mute rules — word, phrase, hashtag, or regex-lite — with a duration and a scope (feed / notifications / everywhere). Plus a “mute this conversation” on threads.
Gap evidence. UserMute and UserBlock are both user→user. Hashtag/PostHashtag
exist so tag muting is nearly free. Feature 15 in the parity doc covers algorithm
transparency but not content filters.
Why it fits. Slots into settings/content, applies at the same query layer as UserBlock.
Effort. S.
21. Automated transparency report¶
Concept. A quarterly public page: reports received by category, actions taken, median time-to-action, appeals filed and overturned, government/DMCA requests.
Gap evidence. ContentReport, AdminAuditLog, UserStrike and
app/routes/copyright.tsx (DMCA) hold every input. Nothing aggregates or publishes it.
Why it fits. It’s a scheduled job (pg-boss is already in server/) writing a static
JSON blob plus one _site route. Also a strong SEO/credibility artifact.
Effort. S — but it only means anything after #2 exists to generate appeal numbers.
23. Teen / supervised accounts¶
Concept. An account class with the economy tier disabled, DMs restricted to mutuals, discovery surfaces limited, and an optional linked guardian who sees a weekly activity summary.
Gap evidence. No parental/teen concept exists. Depends entirely on #1.
Effort. L. Only worth doing if the audience actually skews young — worth measuring first.
B. Platform operations & release engineering¶
4. Feature flags, kill switches & staged rollout¶
Concept. A flag service — DB-backed, cached, evaluated server-side in the SSR pass and exposed to the client via the root loader — supporting boolean kill switches, percentage rollouts, per-user/per-role targeting, and an admin UI.
Gap evidence. grep -ril "feature-flag|ab-test" returns nothing across the tree. With
18 games, 12 apps and ~120 API namespaces behind a blue/green deploy, the only way to
disable a misbehaving subsystem today is to ship a commit through GitHub Actions → GHCR →
webhook → deploy.sh.
Why it fits. This is the multiplier on every other item in this document — including the
28 features already specced in the other three plan docs. It turns each of them from a
big-bang launch into a rollout you can halt. It also makes #1’s regional policy runtime-
configurable, and gives senior-review.yml-gated risky changes a safety net.
Shape. FeatureFlag { key, description, enabled, rolloutPct, targetRoles, targetUserIds, updatedBy, updatedAt }, an in-process cache with a short TTL + a pub/sub invalidation on the
existing socket tier, useFlag() on the client, flag() in server handlers, admin page under
_site/admin/. Ship the audit trail into AdminAuditLog from day one.
Effort. M. This is the single highest-leverage item in the document.
5. Public status & incident page¶
Concept. status.rmhstudios.com (or /status): live health of web SSR, socket hub,
rmhtube, rmhbox, the Go supervisor workers, Postgres, and Stripe — plus an incident timeline
with subscribe-by-email.
Gap evidence. go-services/ ships a status service that runs in production (per
CLAUDE.md and docker-compose.yml), and app/routes/api/health.ts exists — but
ls app/routes/_site/ | grep -i status returns nothing. The data is being collected and
never shown to a user.
Why it fits. Mostly a read-only page over a service that already exists. Pairs with the
Notification/email infrastructure for incident subscriptions. Also the natural home for
scheduled-maintenance notices ahead of a blue/green flip.
Effort. S.
6. Changelog / “what shipped” feed¶
Concept. A /changelog route rendering release notes per deploy, with per-entry tags
(game, app, fix, economy) and an RSS feed — plus an opt-in “new since your last visit” toast.
Gap evidence. app/routes/_site/roadmap.tsx exists and tells users what’s planned.
Nothing tells them what landed. BlogPost and NewsArticle exist but are editorial, not
release-scoped. The word “changelog” appears in the codebase only for User Build versions.
Why it fits. deploy.sh already receives a <sha>; the entries can be authored in
markdown alongside the code and surfaced through the existing blog rendering pipeline.
Cheap retention lever — the platform ships constantly and no one is told.
Effort. S.
C. Economy depth¶
The economy is broad (coins, staking, market, tournaments, wagers, storefront, memberships, redemptions) but every mechanism is a transfer. There are few sinks and no instrumentation.
9. Economy health dashboard (faucets vs. sinks)¶
Concept. An admin dashboard over CoinTransaction: coins minted per source per day
(quests, streaks, wheel, achievements, tips) vs. destroyed per sink (shop, market fees,
unlocks, staking losses), total float, Gini-style distribution, and a “days of runway before
inflation makes the shop meaningless” projection.
Gap evidence. CoinTransaction records everything with a type; _site/admin/analytics.tsx
covers product analytics, not currency supply. DailyWheelSpin, UserQuest, DailyStreak,
ArcadeStreak, ContentAward and tips are all faucets. Sinks: StorefrontPurchase,
PostUnlock, BuildUnlock, MarketListing (a transfer, not a sink unless there’s a fee).
Why it fits. Pure read-side aggregation over existing data. Every subsequent economy decision (#8, #18, #22) is a guess without it.
Effort. M.
8. Auctions, offers & price history¶
Concept. Extend the market with timed auctions (ascending bid, anti-snipe extension), private offers on unlisted inventory, and a public price-history sparkline per item.
Gap evidence. model MarketListing has priceCoins + status + a unique escrowed
inventoryId — fixed price, no bid table, no closed-price index for history. The escrow
mechanism is already correct, which is the hard part.
Why it fits. Reuses escrow, CoinTransaction, the socket tier for live bid updates, and
Notification for outbid alerts. A market fee on settle is also the cleanest coin sink
you can add, which feeds directly into #9.
Risks. Auctions plus a peer-to-peer market is a wash-trading vector — needs the fee and some velocity limits. Sniping/anti-snipe rules must be decided up front.
Effort. M.
18. Crafting / fusion sink¶
Concept. Combine N duplicate or themed UserInventory items into a higher-tier cosmetic;
seasonal recipes that expire. Optionally a “dismantle” that returns a fraction in coins.
Gap evidence. UserInventory items are terminal — acquired via shop/quests/achievements
and then held forever. Nothing consumes them.
Why it fits. Composes UserInventory + StorefrontProduct + UserSeasonProgress +
useCelebration(). Gives duplicates a purpose and creates the item sink the economy lacks.
Effort. M.
22. Gift cards & regional pricing¶
Concept. Prepaid coin/membership codes that can be bought and redeemed by someone else, plus purchasing-power-adjusted membership pricing per region and an annual plan.
Gap evidence. GiftMembership and PromoClaim/RedemptionRequest exist, so the
redemption plumbing is there — but there’s no prepaid-code product and Stripe pricing appears
single-tier. _site/pricing.tsx exists as the surface.
Why it fits. Stripe is already wired through Better Auth. Regional pricing is the single biggest conversion lever for a platform with 16 locales.
Effort. M (mostly Stripe configuration and fraud rules around code resale).
D. Games platform infrastructure¶
10. Unified matchmaking + anti-cheat / score attestation¶
Concept. One service that every multiplayer game calls for queueing (skill band, region, party, latency) and one server-side score-attestation contract that every leaderboard write goes through — replacing per-game ad-hoc validation.
Gap evidence. EloRating and RankedChallenge exist but are ranked-mode-specific.
Each game carries its own lobby model (SSLobby, RMHboxMatch, AltairMatch,
RmhTypeMatch, …) and its own socket handler. “anti-cheat” appears only inside two
individual game files (wiki-race, synapse-storm), i.e. it’s per-game and inconsistent.
Meanwhile 18 games write to SongLeaderboard/DailyPuzzleScore/per-game score tables.
Why it fits. This is the infrastructure the already-specced party system (expansion doc feature 4) needs anyway — building matchmaking without it means building it 18 times. Anti-cheat matters more now that scores route into wagers and tournament payouts (real value at stake).
Shape. A Node hub service alongside socket-server, a MatchTicket model, a shared
submitScore() that signs and replays deterministic runs where the game supports it
(GameReplay already exists — replays are the attestation substrate).
Effort. L. Best done as a two-game pilot before a fleet migration.
20. Spectate + watch parties¶
Concept. Live spectating of in-progress multiplayer matches with a delay buffer, plus a “watch party” room where a group co-watches a live match or a replay with synced chat.
Gap evidence. GameReplay + /replays/$id + embed.replay.$id are all post-hoc.
RmhTubeRoom proves the synced-co-watch pattern already works in this codebase — it’s just
never been pointed at game state.
Why it fits. Directly monetizes the tournaments/wagers systems (people bet on things they can watch) and reuses the RMHTube room mechanics wholesale.
Effort. L.
E. Discovery & distribution¶
12. Semantic search¶
Concept. Vector search over LibraryDocument, BlogPost, NewsArticle, UserBuild,
GameGuide and Flashcard decks — “find me things about X” rather than exact-token matching,
with a hybrid keyword+vector rank.
Gap evidence. app/routes/api/search/ + search.ts are keyword-based; parity feature 16
adds filters/recents/saved searches but not semantics. pgvector is not in the schema.
Why it fits. The library and blog corpus is the moat and it’s currently only reachable if
you guess the right words. Postgres + pgvector keeps it in the existing DB; embeddings can
run on the existing Go worker fleet.
Effort. M.
15. Per-tag / per-user RSS + read-only ActivityPub¶
Concept. RSS/Atom for any hashtag, any user’s public posts, and any community — then, as a second step, read-only ActivityPub actors so RMHarks profiles are followable from Mastodon.
Gap evidence. blog.rss[.]xml.ts and news.rss[.]xml.ts exist; nothing else has a feed.
grep -ril "activitypub|atproto" returns nothing. oembed.ts and embed.post.$id show the
syndication instinct is already there.
Why it fits. Free distribution for a platform whose growth problem is discovery. Read-only federation is a fraction of the work of full federation and carries none of the inbound- moderation burden — which is the part that would collide with section A.
Effort. M (RSS is S; ActivityPub read-only is the M).
19. Import from other platforms¶
Concept. Bring-your-own-archive importers: Twitter/X and Mastodon archives → RMHarks
drafts, Anki decks → FlashcardDeck, YouTube playlists → RMHTube playlists, Goodreads →
library collections.
Gap evidence. app/routes/api/account/export.ts handles the exit; there is no entrance.
Why it fits. Every importer targets a model that already exists. The single highest- converting onboarding step for a new social platform is “your stuff is already here” — pairs naturally with the already-specced onboarding v2.
Risks. Import must respect the same auto-moderation path as fresh content, and be rate-limited/queued through pg-boss rather than done inline.
Effort. M per importer; start with one.
F. Creator & content¶
16. Study groups + cross-content spaced repetition¶
Concept. Shared flashcard decks with a group review leaderboard, plus an SRS scheduler that pulls from any content — library highlights, blog passages, game trivia — not just manually authored cards. An exam mode with a scheduled target date that works backwards.
Gap evidence. FlashcardDeck/Flashcard/FlashcardReview + RmhStudyProfile/
RmhStudySession are all single-user and deck-scoped. LibraryDocument and Album content
is never a card source.
Why it fits. RMHStudy is the app with the clearest external value and the least social
surface. GroupChat, Community and the leaderboard system all already exist to hang it on.
Effort. M.
G. Developer platform¶
11. OAuth 2.0 third-party apps¶
Concept. Real “Sign in with RMH” — an app registry, scoped consent screen, authorization code + PKCE flow, refresh tokens, per-app rate tiers, and a user-facing “connected apps” page with revocation.
Gap evidence. DeveloperApiKey is a personal access token model; _site/developer/ is a
single page; api/v1/openapi[.]json.ts and WebhookEndpoint/WebhookDelivery exist. So the
API is documented and outbound-eventful, but there is no way for a third party to act on
behalf of a user. grep -ril "oauth-app" returns nothing.
Why it fits. Better Auth already handles the inbound direction (Discord/Google/GitHub).
This is the piece that turns a documented API into an ecosystem — and it’s a prerequisite for
any future mobile app or rmhcode CLI acting as a user rather than a key holder.
Effort. M. Add a sandbox org + seeded test data alongside it if you want external developers to actually build.
H. Accessibility & internationalization¶
13. Colorblind-safe palettes + a palette tester¶
Concept. Deuteranopia/protanopia/tritanopia-safe theme variants, plus a shape/pattern redundancy pass anywhere color alone encodes meaning (leaderboard deltas, prediction up/down, rarity tiers, game state).
Gap evidence. stores/themeStore.ts covers default, graphite, high-contrast,
density (cozy/compact), rmh-reduce-transparency and dyslexia-friendly type — a genuinely
strong a11y story that has no color-vision axis. grep -ril "color-blind" returns nothing.
~8% of male users are affected, and this is a games platform where color is state.
Why it fits. The --site-*/--app-* token architecture means this is largely a new token
set plus an audit, not a rewrite. Extends parity feature 11 (a11y suite) rather than
duplicating it.
Effort. S for the palettes, M including the redundancy audit.
14. Translate-this-post¶
Concept. An inline “Translate” affordance on user-generated content — posts, comments, build descriptions, reviews, guides — with the result cached per (content, target locale) and the original always one tap away.
Gap evidence. 16 locales × 67 namespaces localize the interface; every piece of user
content is served in whatever language it was written. i18n-translate.yml already runs an
LLM translation pipeline in CI — for catalog strings only.
Why it fits. A 16-locale platform where users can’t read each other’s posts is 16 parallel monolingual sites. The CI translation pipeline proves the plumbing exists; this points it at runtime content with a cache table and a strict rate limit.
Risks. Cost control is the whole design — cache aggressively, translate on demand only, never batch-translate the corpus.
Effort. M.
I. Mobile¶
24. Home-screen widgets + offline reading queue¶
Concept. PWA widgets (streak status, daily puzzle, unread count) plus an explicit “save for offline” that pins library documents, blog posts and news to the service worker cache for flights/transit.
Gap evidence. public/sw.js + lib/sw-register.ts + manifest.webmanifest + VAPID push
are all live, and app/routes/offline.tsx exists — so the PWA shell is there, but nothing
caches content deliberately. SavedItem/SaveFolder (parity feature 2) is the natural
selection UI and doesn’t currently imply offline availability.
Why it fits. Small delta on infrastructure that’s already deployed, and it makes
DailyStreak far more defensible — the #1 cause of a broken streak is not having signal.
Effort. M.
Suggested sequencing¶
Do first (one sprint, unblocks everything else): #4 feature flags → #5 status page → #6 changelog. All three are ops surfaces, all are S–M, and #4 de-risks every launch after it.
Do second (the compliance floor): #1 age gating → #2 appeals → #7 keyword mutes → #21 transparency report. #3 (visibility tiers) follows once #2 exists to make it visible. This block is not optional if the wager/stake/redemption surfaces stay live.
Then pick a lane:
Economy — #9 dashboard first (it’s the instrument), then #8 auctions and #18 crafting.
Games — #10 matchmaking/anti-cheat, which the already-specced party system needs anyway.
Growth — #19 importers + #15 feeds + #12 semantic search.
Long-horizon flagship: #10 + #20 together — unified matchmaking with live spectating — is the thing that makes 18 separate games feel like one arcade, and it’s what the tournaments and wager systems are currently missing an audience for.
Explicitly not proposed¶
Things I checked for and deliberately left off, so the next reader doesn’t re-derive them:
Party system, live audio spaces, replays-as-content, digest email, AI concierge, stat cards, lists, saves, history, awards, wishlists, presence, close friends, profile v2, theme studio, notifications v2, feed controls, search filters — all already specced in the three prior plan docs.
hreflang / per-locale URLs — already tracked as deferred in
website-improvement-plan.md(architectural; needs per-locale routing first).Feed virtualization, CSP enforcement, responsive images — already tracked as deferred in the same doc.
Full inbound ActivityPub federation — the moderation burden collides with section A; read-only (#15) captures most of the distribution value at a fraction of the risk.
Ads / sponsored posts — technically feasible on
FeedSignal, but it would compete with the membership and creator-coin models rather than complement them.