Skip to content

Roadmap

Day to day task tracking lives on the Lua Learning GitHub project board. This page complements the board with a written map of where the codebase stands, which features are unfinished, and what is planned. It was last audited against the source on July 29, 2026, so specific details may drift as work lands.

If you enjoy visualizations, here is the git history of the project so far.

Where things stand

The desktop app is the reference implementation, with all five sections (Tutorials, Lessons, Quests, Multiplayer, Other), onboarding, search, deeplinks, and the full popup registry. The classroom desktop app is similarly rich on its own axis (Discussions, Assignments, Gradebook, Dashboard) though it lags the public app in a few places noted below. The mobile app covers a subset of the desktop app. The console and classroom mobile apps are placeholder screens. Everything below expands on those gaps plus the smaller unfinished threads found throughout the source.

Platform coverage

Mobile parity

The mobile app ships Tutorials, Tutor AI, and Other only. It has no Lessons, Quests, or Multiplayer sections, no tutorial authoring (mobile users can read and vote but can't submit), no onboarding tips, and no self profile in the topbar. Its popup registry lacks the screenshot tool, the effects overlay (confetti and fireworks), and the seasonal events overlays, and notifications are reachable only through the side panel. Deeplinks on mobile resolve tutorials only, while desktop also resolves lessons. Closing this gap is the largest single surface item on the roadmap, since a large share of Roblox players are on phones.

Classroom on mobile

ClassroomMobileApp mounts a single screen telling the student that joining a classroom from a mobile device isn't supported yet and to check again in the future. Once the classroom feature set settles, this needs a real shell.

Console

ConsoleApp renders one label saying consoles aren't supported. There is also a real bug adjacent to this. A console device joining a private server resolves to ClassroomConsoleApp, which doesn't exist, so AppLoader.LoadApp fails its require and mounts nothing at all. That combination gets a silent black screen instead of the friendly unsupported message. The fallback should be fixed regardless of whether console support ever happens.

Features in flight

Discussion bookmarking

The classroom discussion reader has bookmarking wired end to end in the UI with no implementation behind it. IsBookmarked is hardcoded to false, the bookmark button is built and then hidden with a TODO, the toggle handler is a warn stub, and the discover view offers a "Bookmarked" sort that can never match anything. The persistence transport already exists (GetBookmarks and SetBookmarks serve tutorial bookmarks today), and a commented-out implementation sits in DiscussionsSection/init.luau waiting to be adapted from tutorial keys to discussion keys.

The beta_ShareLinks flag gates share buttons in the tutorial readers on desktop and mobile and in the classroom discussion reader. The classroom instance is additionally forced invisible because deeplinks into private servers don't currently work. The classroom app's whole deeplink handler is commented out in ClassroomDesktopApp/init.luau for the same reason. Unblocking private-server deeplinks would light up both the commented handler and the hidden share button.

Glossary

The beta_Glossary flag gates glossary term rendering inside Markdown, backed by the Glossary content key. Graduating it out of beta is the remaining step.

Onboarding coverage

The OOBE teaching-tip handler is live in the desktop app, and the equivalent block in the classroom app is commented out, so classroom users currently get no guided tips at all. Onboarding stages also only exist for the Quests flow (plus the CodeCombat easter egg), leaving Tutorials, Lessons, Tutor AI, and the classroom sections without first-run guidance. Related, GitHub issue #255 tracks improving the first time user experience.

Multiplayer

The entire section sits behind the Beta Tester lock and is the least finished feature in the repo. It has a client slice only, with no server code, no remotes group, and no shared data. Quest Together renders a friends and server-players invite list whose buttons just print to the console, with a comment sketching cross-server invites over MessagingService. The tab bar advertises a second mode, Time Trials, and no Time Trials component exists anywhere in the codebase. sharedState.multiplayerLoading exists and is never set.

Classroom activity log

Activity log rows render as clickable and the click handler is a warn TODO that should open the relevant discussion or comment. On the server, _flushQueue writes queued entries one at a time with a TODO to batch them into a bulk request, and GetTimespan carries an unresolved TODO about gating longer history windows behind a subscription.

Quizzes section

sharedState.quizzesLoading is a reserved loading slot that nothing reads or writes, and every sibling slot maps to a live section. A Quiz.luau component already exists under the Lessons feature. Together they point at a planned Quizzes section, most plausibly a classroom sibling to Assignments and Gradebook.

Classroom browser

The Sprites.Sections table includes a Classrooms icon that no sidebar references, while every other key in that table maps to a live section. It reads like a planned classroom directory or browser section.

Discussion boards under tutorials

GitHub issue #10 tracks a long-standing plan to attach discussion boards to tutorials, distinct from the classroom-only discussions that exist today.

The in-game lesson editor

This is the largest designed-but-unbuilt piece. The LessonChecks system was built pure-data on purpose so that a future in-game lesson editor can let teachers and community members author lessons without touching the Content repo. Every check kind carries DefaultInfo and Params metadata that exist only to feed that editor's property panels, spec values are required to be JSON-representable so they can round-trip through the editor's storage, spec validation already rejects functions because specs will eventually come from untrusted editors, and tests/Tests/LessonCheckKinds.spec.luau enforces the editor-readiness contract on the registry. The version = 1 field in every spec is reserved for future format migrations and isn't validated yet. The Quest editor (QuestCreate with its PropertiesPanel) is the working precedent to model the UI on. Until the editor ships, the legacy Condition.lua path remains as a trusted escape hatch for curated content only.

Localization

Eight languages (German, Spanish, French, Italian, Japanese, Korean, Portuguese, Russian) are commented out of Locales.Supported while the locale ID mapping covers all nine and settings.language already defaults from the player's LocaleId. The plumbing is in place and switched off pending translated content. Tracked as GitHub issue #212.

Monetization loose ends

Gamepasses/PassIds.luau holds a second gamepass id reserved on Roblox under a commented TBD entry, and Products.Donation is an unset id of 0. The Tutor AI trial product and per-environment subscription ids are wired. The activity log subscription gate mentioned above is the other open monetization thread. The BetaLock copy promises that beta features become free once they're ready, so each beta graduation (share links, glossary, multiplayer) carries an implied task to remove its gate.

Correctness and safety gaps

The FigureCode assignment block's FilterForViewer returns its data unfiltered while every sibling text block clones and runs FilterText for the viewer, so learner-authored code inside assignments bypasses text filtering. The TODOs there sketch the intended fix of lexing the source and filtering individual tokens so filtering doesn't wreck the whole block. Relatedly, the Markdown syntax option for code blocks is commented out of the assignment editor because the in-house md lexer describes itself as heavy WIP.

Quest edits currently keep their prior upvotes, and Quests/server/Authoring.luau carries an open TODO on what should happen to votes after an edit. It's a product decision more than a code task.

The Fzy fuzzy matcher that powers search has a TODO for UTF8 support, so non-ASCII queries score incorrectly.

AwardsWidget forces recomputes with a manual dirty flag, and Graph.story.luau documents a dependency-ordering bug where graph lines build before heights recompute. Both are symptoms of the same class of Fusion 0.2 reactivity issue and are worth revisiting together.

The Password component's placeholder never shows for empty inputs, per the FIXME in its story. The ColorPicker reads UserInputService directly, which also makes it non-interactive in the story harness.

The one test that verifies every curriculum lesson's reference solution actually passes its own checks is permanently skipped, because the runner kills jobs by toggling script.Disabled and that only works in Run mode while the headless test session runs in Edit. Restructuring job execution so a test harness can drive it would put the curriculum under CI for real.

Maintenance and cleanup

src/kernel/Archived/ holds seven retained one-shot migration and fix scripts that still sync into the place as inert modules, some with hardcoded staging place ids. They're documented as intentionally retained. plugin-offline-backup/ is an out-of-tree Rojo project that no build script references. The GetQuestMetadatas official scope still executes after warning that it's deprecated, and its callers should move off it. ReadAllNotifications is defined and handled on the server and awaits a mark-all-read button on the client. The vendored LuauParser copy is at upstream v0.715 against whateverr Luau latest is now, and LessonChecks/README.md names the upstream flags whose arrival should trigger a re-vendor. Smaller strays include the commented-out volume setting in Display settings, the quest card date widget, the discussion editor's loading indicators, the moderation login and register screens' hidden server-reply labels, and the near-identical debug overlay blocks duplicated in Tooltip and TeachingTip.

Suggestions and brainstorms

This section was drafted by Claude from a full audit of the codebase in July 2026. Treat it as brainstorming rather than commitments.

Ship the lesson editor next

The hard design work is already done. The registry, validation, and editor-readiness contracts exist and are tested, and the Quest editor proves out the UI patterns. Classrooms are also a natural safe launch cohort, since teacher-authored lessons stay private to their classroom, letting the editor mature before community-wide publishing. It's the rare feature where most of the risk has already been paid down.

Let Time Trials revive the daily challenge

The parked daily-challenge branch already contains streak tracking and celebration UI. A daily rotating quest with a time leaderboard would give the empty Time Trials tab a concrete design, give players a daily reason to return, and give the streak work a home. The branch predates the current architecture, so treat it as a design reference and rebuild it as a proper feature slice with a server-side leaderboard.

Feed the evidence engine into Tutor AI

Analyze and Instrument already produce structured evidence about what a learner's code did, and the grader knows exactly which check failed and why. Passing that failed-check evidence into the Tutor AI debug conversation would let the tutor say what actually went wrong instead of re-deriving it from source, and it would make hints cheaper since the model gets facts rather than raw code alone.

Build Quizzes on the existing block and check systems

The reserved quizzesLoading slot suggests Quizzes were already planned. The BlockComponent renderer already has InputChoice and InputWritten blocks with mark counting, and the LessonChecks registry could auto-grade code questions. A classroom Quizzes section could be assembled largely from parts that already exist, with the Gradebook picking up scores.

Standardize remote responses with a tiny envelope

Issue #251 gets cheaper the earlier it lands. With 118 remotes, a small helper in the Remotes wrapper that normalizes every async response to a consistent success, value, and error shape would remove a whole class of ad-hoc result handling, and it could be adopted incrementally one remote group at a time.

Localize through the content pipeline

Content already ships as GitHub release assets, which is a good shape for localization. Per-locale content releases could be produced with machine-assisted first drafts and community review, letting the eight commented-out locales come online one at a time. UI strings are the smaller half of the problem given how much of the experience is content.

Track lesson friction with the analytics you already have

The Analytics feature and the evidence engine together could report per-check failure rates. A lesson where a large fraction of learners fail the same check is either mis-specified or badly explained, and that data would prioritize curriculum revisions in the Content repo far better than intuition.