New in ShotScript

Module types get their own nameNew

module Result makes the type ResultModule, so a type called Result can sit beside it.

Renames follow every useNew

Renaming or moving a class, module or type rewrites every use, from imports to doc links, in one undo step.

Types defined where they are usedNew

Write define public type X beside the code using it: check copies it into Types.shot, with errors at that line.

Links stay out of the checkNew

shot map shows a linked project as a link to its file, and check no longer reads it as yours.

Use linked projects by nameNew

In a Roblox or Generic project, use Inventory and import Item from Inventory reach a linked project's root, typed as it.

One root for Roblox and Generic projectsNew

shot check asks for one top-level module in a Roblox or Generic project, named after the project.

Typo hints in shot checkNew

An error about a name one typo away from a real one ends with "did you mean" and that name.

Strict checking everywhereNew

Every script is checked in Luau's strict mode, no --!strict line needed; a .luau file may opt out.

Turn a script offNew

A disabled script doesn't run, and shot run says so; map, outline and api mark it, and check still reads it.

ApiScriptsNew

A script starting with @api is the interface of the scripts under it: only types its export lines name leave it.

Built-in types and parentsNew

A Types.shot can import QuickSignal from QuickSignal, and a class can extend Mop or QuickSignal.

Clearer output on System projectsNew

shot map and overview count every file, api and outline show members as declared, and a silent run says what ran.

Notes for instances that can't work thereNew

shot check notes an instance that can't work where it sits, such as UI with no Window above it.

Roblox files keep their tagsNew

RobloxFileService reads the tags and whole-number attributes of places saved by current Studio.

Return types on the next lineNew

A function's return type may now sit on the line after its closing ), as in Luau.

Clear errors around closing bracesNew

A stray }, code after a closing } or a nameless class = { gets an error naming the fix.

A use line's example comes from your projectNew

A malformed use line now suggests forms that reach one of your project's own modules, like use script.Parent.Bank.

Errors keep their line under long signaturesNew

Parameter lists spanning several lines no longer shift later errors: shot check names their right line and column.

shot refs lists real uses onlyNew

shot refs Wallet.Pay no longer lists lines that only store a Wallet as an interface, and names that interface instead.

shot build cleans up after itselfNew

shot build removes files an earlier build wrote that the project no longer has, and leaves every other file alone.

Event docs stay with their eventNew

A doc comment above an event line is that event's doc, and shot outline and shot show print it.

Owned fields catch table editsNew

table.insert, remove, clear, sort and move on an owned field from outside its system are errors, like a direct write.

shot doc shows one pageNew

shot doc Wallet prints a page: members in groups with their docs, and links to the types it names.

Run shows only your project's scenariosNew

shot run lists and plays only your project's own scenarios; with none, it says how to write the first one.

Side checks follow use linesNew

The client and server checks and remote signature checks now follow modules and remotes reached through use lines.

Used projects need no save before a runNew

A run or shot check right after you edit a project you use reads that edit, with no save first.

Button's HoverLift and PressLift kept as deprecatedNew

Older code that sets Button's HoverLift or PressLift still runs: each sets the matching colour; completion offers only HoverColor and PressColor.

The header follows your use linesNew

A use external path changed to a same-named file moves its header line, keeping alias and interface; unused lines go.

Check and run agreeNew

shot run stops at any @shot path check refuses, with its words; check flags .luau string requires a run refuses.

Errors that say what to typeNew

Errors name the fix for your own line: a dot call becomes ProcessService:StartAsync(...), an @shot path use root.Data.Greeter.

Unknown service names point at the real oneNew

A wrong service name (Process, ProcesService, Files) now names the nearest service and the use line to write.

Using modules, and System scenariosNew

New pages: how a script uses its project's modules, and a System project's own scenarios. Guides now use .ssp.

Guides to files, services, instances and externalsNew

New pages walk through FileService, every service, how instances behave, and using another project with use external.

Each project is checked as its own kindNew

A System project's check holds each Generic project it uses to Generic's rules, with one error at the use line.

File name errors name both fixesNew

A file whose declaration has another name now says how to fix it: rename the declaration, or rename the file.

Moving a file renames its declarationNew

shot move to a new .shot name renames the declaration that matched the old name, and says how to find what still uses it.

One project file: .sspNew

A project is one .ssp file for every kind; older .shotsystem projects still open and can be saved as .ssp.

New projects pick their kindNew

shot new takes --kind system, roblox or generic and writes a project of that kind; System is the default.

Caught errors name their lineNew

pcall, xpcall and debug.traceback in a program now give the .shot file and line of an error, like an uncaught one.

shot trace follows later callsNew

shot trace now follows functions handed to later calls, like a timer's After, a page's Handle and BindToClose.

A refused use line stops the runNew

A use line that shot check refuses now stops shot run at that line with the same message.

Unknown requires say what existsNew

A require that names nothing now lists the project's services and built-in modules, and how its own modules are reached.

Instance.new names the class you meantNew

Instance.new with a misspelled class now says which class to write, then lists what it can make.

Attach to programs already runningNew

ProcessService:AttachAsync gets a running program by its pid, and GetChildProcessesAsync lists the programs a program started.

Child programs start soonerNew

ProcessService:StartAsync gets the first program of a run going much sooner, even with several programs starting at once.

Live channels close when the server stopsNew

Destroying a page server ends every open page's live channel at once, and each page hears that it closed.

Routes that answer a whole pathNew

A Handle route ending in /* answers every path below it that no other route, page or file answers.

Set many properties in one callNew

Instance.BulkSet sets one property on many instances and SetProperties sets many on one instance, all or nothing.

Environment, known folders and clean exitsNew

ProgramService reads environment variables and known folders, BindToClose runs cleanup before the program ends, and ExitAsync ends it.

Serve requests to other programsNew

HttpService:ServeAsync starts a local server that other programs call by method and path; requests from browser pages are refused.

Standard library types are checkedNew

shot check on a System project now knows the standard library's services and datatypes and checks every call into them.

Scripts, IntValue and print behave as in RobloxNew

A .shot script is a Script at run time, IntValue holds whole numbers, and printing an instance prints its name.

Named process handles and a kill countNew

Started programs are ProcessHandler objects named after the program, and KillAsync ends a whole process tree and says how many ended.

Timers you can start, stop and reuseNew

CreateTimer makes a timer to start, stop and reset, CreateAlarm fires at a clock time, and every timer counts its fires.

Follow files line by line, watch foldersNew

FollowAsync gives a FileFollower that hands over each new line and can pause; WatchAsync reports files added, changed or removed.

Arguments, project and a data folderNew

ProgramService gives a program its arguments, project path, working folder and a data folder of its own for settings and logs.

JSON keeps the shape of what it readNew

A decoded file encodes back with its key order, empty arrays and nulls kept, so files other tools write stay tidy.

Number and color sequences in programsNew

NumberSequence and ColorSequence work in programs with Roblox's keypoint rules, and collectgarbage("count") gives memory in KB.

Roblox datatypes work in programsNew

Vector3, Color3, CFrame, UDim2 and the other datatypes now work in programs, with Transition, Font, Icon and Curve values beside them.

The editor server answers only youNew

The editor's local server now needs its own key and refuses other sites, and a change to many items at once is one undo step.

Runs never save your projectNew

Run plays the editor's copy, with a Run menu for the program or each scenario, and leaves the file and its history untouched.

Every service is an objectNew

Services, files and the handles they give out are instances with events, Destroy, Clone and Instance.new, called with a colon as in Roblox.

Programs written in ShotScriptNew

New projects start with a Main.shot program, and the insert menu's Script makes one, so a program no longer needs plain Luau.

Help, map and overview for System projectsNew

shot help, shot map and shot overview work on a System project and describe its own tree, export and services.

Roblox habits get their fixNew

In a System project shot check names the Roblox forms that don't run there, like game:GetService, workspace and Enum, and says what to write instead.

Globals are errorsNew

In a System project shot check reports a write to a bare global, like Counter = 1, as an error. Use a local instead.

Appends keep every lineNew

Writes and appends to one file started at once now take turns, so every line lands, in the order it was written.

Edit the headerNew

shot show, shot edit and shot write work on a project's .shotsystem header, so you can change its export line.

Interface changes caughtNew

A project records the interfaces it uses; when one changes, shot check shows the difference and shot external accept takes it.

Projects that use projectsNew

use external "Bank.shotsystem" brings in another project's export, root names your own project's root, and shot check types both.

Checked servicesNew

Code using a service is checked against it, by shot check and as you type: a misspelt member is an error at its line.

Ready to runNew

shot new makes a project that runs at once; the insert menu starts each module, class and program from a template that checks clean.

Services by nameNew

Write use ProcessService, use FileService or another service by name; shot check types every call.

Web requestsNew

HttpService sends GET and POST requests and gives back the status, headers and body.

PagesNew

PageService serves a project's own web page with a live channel both ways, for tools with a window of their own.

Json and timeNew

JsonService encodes and decodes JSON; TimeService gives the time, formats it and runs code after a delay or on a timer.

FilesNew

FileService reads, writes, appends, lists, copies and moves files and folders, and follows a growing log file.

Start and stop programsNew

ProcessService starts programs with no window, streams their output line by line and stops them with their children.

Checked object pathsNew

shot check types every object path from the project's tree, so a misspelt child or game is an error.

Run a projectNew

shot run runs a project's program, or plays a library's scenarios, outside Roblox.

Objects with propertiesNew

Folders, scripts and value objects with attributes and tags, changed with shot create, set, attr and tag, each one undo step.

One-file projectsNew

A whole project lives in one readable text file: shot new makes one, shot import turns a folder into one.

Edits on an adopted game are parsedNew

shot edit and shot write on an adopted game now report whether the changed script still parses, with the line of any new error.

shot adopt: the tools on a plain Luau gameNew

shot adopt <folder> runs the shot tools on a Roblox game mirrored to disk as plain Luau, converting nothing.

Events on another busNew

event ItemSold(...) on ShopBus puts an event on a bus module of your own instead of EventBus.

Who may publish an eventNew

event CoinsGiven(...) published by Wallet, Shop names the systems that publish it; shot check flags any other publish.

Rules that always holdNew

invariant WalletServer.CoinsInRange names a function that checks a rule, and shot run checks it after every frame of every scenario.

Saved data lockNew

shot savelock records each saved section's shape; shot check flags a change that no Version bump and Migrate step covers.

Declared start orderNew

function Start() after Wallet.Start says which start runs first, and shot check checks the order of the start calls.

Owned fieldsNew

owns Purse.Coins via WalletServer.Grant: a write to the field from another system is an error naming that function.

Remote signaturesNew

RemoteEvent (board : Board) in a .instance file: shot check flags payloads Roblox can't send and sends that don't match.

Id kindsNew

id ProductId declares a kind of string id, and shot check catches a misspelt one and names the id you meant.

Typed eventsNew

Declare an event once in a system's Types.shot, and shot check checks every publish and every listener against it.

What a member reads and connects toNew

shot needs Bank.Give lists the state it reads and who writes it, and shot show lists what a member connects to.

Every one-file project opensNew

Some one-file projects could not be opened, from the terminal or in Studio. Now every one can.

One page for the task at hand

shot brief takes what you are about to do and prints one page: the systems it touches, their rules and members.

Errors that name the fix

A use that finds nothing or an unknown type says how to fix it, and a mistyped command suggests the nearest one.

Plain Luau files in a project

Keep .luau files beside your .shot files: they build as they are, are type checked, and use reaches them.

Super calls the parent class

In a class that extends another, super.new(...) and super:Name(...) call the parent's constructor and methods.

The Studio plugin

With the plugin in Studio, each change is one Studio undo step, Studio edits come back, and playtests reload changed code.

One-file projects

A whole project in one place file that Studio opens and plays, with undo and history for every change.

A map of the whole project

shot graph writes one page of every system, what it uses and its events, and marks events nobody sends or hears.

Declare which systems a system uses

List a system's uses in its Types.shot, and shot check flags every link you didn't plan and every pair that would use each other.

Interfaces and required functions

implements and required are promises shot check keeps: every member an interface lists, every function the game must call.

Match on string unions

Branch on a string union's value with match, and shot check names every value a match doesn't handle yet.

Follow code across systems

shot trace Bank.Give shows what runs after it, through calls, events and remotes. --up shows what leads to it.

Rename a member everywhere

shot rename Wallet.Add Deposit renames a member and every real use of it, then checks the project.

The use keyword instead of require

use Bank requires the nearest module named Bank, looking up through the folders.

Doc sections and checked code names

doc and rootdoc take Rules and Extend sections, and shot check flags a backticked name that no longer exists.

Find your way around from the terminal

shot map, outline, show, find, refs and wiring answer with the file and line of what you asked for.

Every mistake at its line

shot check reports parse errors, ShotScript's rules and Luau type errors at the .shot line and column.

Classes, modules and funcs in plain Luau

Declare one class, module or func per .shot file, and the build writes the metatables, types and Types module.

Play game flows without Studio

shot run plays your scenarios in a mock Roblox, with a server, player clients, remotes and virtual time.

Rojo output, remotes included

The build writes a Rojo layout, and a .instance file holding a RemoteEvent becomes a real remote that use reaches.

Scripts that start each side

@server or @client on a file's first line makes it a script that runs when the game starts.

Server and client code

Mark code server or client and shot check keeps each side out of the other's. A split module has one version per side.