Changelog

Local Test went from its first commit to v1.71.0 over 4 days, so the 94 releases below are closely spaced. Newest first. Versions follow SemVer and the app's own badge rule: anything under 1.0.0 reads as Beta, 1.0.0 and up reads as v.

Latest release
Releases
94
Current
v1.71.0

The 1.x line

82 releases, starting with the first stable build. Local Test has not been in beta since 1.0.0.

  1. v1.71.0

    Current

    The night's last two waves, one of features and one of guards, and the guards are the half worth reading. Eight new suites exist because an audit the day before found nine real problems and not one of them was found by the six thousand checks that were passing at the time. There is now a hostile project folder kept as a fixture rather than built by hand and thrown away, and it found a real leak the first time it ran: the export shipped a .env out of the machine through a hard link, because exportsite and the server had drifted apart on a judgement the module's own comment said must never be made twice. There are guards on every IPC handler's arguments, on the bridge in both directions, on the content security policy of every page, on the preferences of every window that gets built rather than the four somebody remembered, on what an imported backup can contain, on the update manifest field by field, on memory, and on every place the app unpacks anything. Two bugs came out of the findings the audit REFUTED, which is the argument for reading refutations rather than counting them. Load .env had never worked once: readEnvFile is async and both handlers called it without awaiting, so it answered "No .env file in this folder" every time, and the module's own suite passed throughout because a suite that covers a module is the one suite that cannot see its caller. And prod.env, local.env and staging.env were refused by neither the AI exclusion nor git's list, which agreed with each other perfectly by both being wrong. The features: line endings and trailing whitespace made visible, and a real bug underneath them, since a textarea cannot hold a carriage return at all. Column selection, a diff against what is on disk, per project response headers, a slow connection to test loading states against, a preferred port range, project groups you make and name, HTTPS on localhost with a certificate the app builds itself and is honest about, stashes, and a warning before committing a file the AI exclusion would have refused to send.

  2. v1.70.0

    Mostly Minecraft, and mostly about not losing things. An upgrade already copied the world first; what it did not do was insist. The copy is a precondition now: a disk too tight stops the update rather than warning about it, because here the alternative to a worse copy is no update at all, and no update is a perfectly good afternoon. It also caught a case where the world was renamed between the two readings of the folder, so the archive was built without it and the upgrade went ahead on the strength of a copy that did not contain the thing it was copying. Who has played is kept now rather than being said once and forgotten. The whitelist and the operator list are one panel, because they are one question. A server icon can be set, checked by its bytes rather than by its name. The jar and the world are compared before a start, and a world it cannot read says it could not tell instead of saying they match. A datapack can be added rather than only seen, from a folder or a zip, with a zip entry treated as the attacker-chosen path it is. Elsewhere: sharing on the network has a courtesy lock, applied before the URL is even decoded so every path is behind it, and the app says plainly that it is a courtesy on a local network and not a security boundary. A project can be archived. Two projects pointing at one folder now say so, settled by inode rather than by comparing path strings, which missed a symlink, a trailing separator and a case-blind disk. The last few removals can be put back. And git will show the whole of what a commit would contain before it contains it, and switch branch, which refuses rather than letting git silently carry your uncommitted work onto the branch you just moved to.

  3. v1.69.0

    Cycle five opens where the last one left off, at the plugin. The app can make the folder and the git repository now instead of only cloning one, and it stops there on purpose: creating the repository on GitHub would be a write to an API this app has only ever read from, and widening that promise is not a thing to do quietly at five in the morning. A plugin project stops being asked whether to Deploy, worked out from what is in the folder rather than from which template made it, because somebody can add a plugin folder the app never scaffolded. The two modules that pick a built jar turned out to disagree about which jar to pick, which meant the button and the watcher could put different bytes on a server. In the editor: a percentage saying where you are in a long file, a comment that silences the linter for one line, go to definition inside the open file, reopen closed tab, folding, and a warning before a file too big to edit opens and takes the window with it. On the server: a stylesheet edit now swaps the stylesheet instead of reloading the page, so your scroll position survives, with every case it cannot swap falling back to a reload and each one written down; the custom 404 can be looked at on purpose rather than only by mistyping a URL; and the request log records how long each answer took, which is the number anybody looking at that panel is actually chasing. Serving a subfolder was already built, and checking it properly found three gaps in it, one of which leaked.

  4. v1.68.0

    The rest of the list, and the thing the list did not know about. Switching between two open files kept your caret and threw your unsaved edits away, and then went on drawing the unsaved dot on the tab, because the dot is painted from a flag that was recorded truthfully at the moment the text stopped existing. A tab now carries its text while that text is unsaved and deliberately not once it is saved, since a saved file is better read from the disk again. Beyond that: a caret can be placed with a click, the app can say how much of the disk it has caused to be written and warn before a project gets heavy, the problem log can be narrowed to one project, a folder that has gone says so once instead of differently on every action, a port that moved says where it went, a project can be exported on its own, and the places panel stops measuring the same folders on every open. A second window is half done and honest about which half. Windows gets an install location in Add or Remove Programs, and the sharing note stops implying the app can see a firewall prompt being answered no, because it cannot: a refused packet never reaches this machine's socket, so what it says now is what actually arrived. Two more from the audit: the preview window gave every project the same browser session, so one repository's service worker was still installed when the next project inherited its port, and a hard link to a refused file was only found if it sat in the file's own branch of the tree.

  5. v1.67.0

    Four things at once, so this one is long. A Spigot plugin and the server it is written for are one piece of work now, rather than two projects that happen to sit next to each other: there is a plugin template that IntelliJ and the Minecraft Dev plugin open with nothing installed but the IDE, a plugin project can name the server it belongs to, and the jar it builds is carried into that server's plugins folder on its own when it appears, or on a button, with the offer to restart the server so the jar is actually loaded instead of sitting there unread. The editor grew the ordinary things it was missing: search across the tabs you have open, which is the middle ground between one file and the whole project, your place in a file kept as a line rather than as a pixel so it survives the file changing, word wrap, a way to give the editor the whole window, tabs that can be reordered, and a command palette that can run a project instead of only opening one. The Minecraft side can move a server to another folder, show the operators and not only the whitelist, search a console with a day of scrollback in it, see datapacks, show the last stack trace rather than the last line when a server dies, say so before a memory setting that will hurt, import a world, and restart on a schedule. And an audit went through eight surfaces of the app and put every finding to three more readers whose only job was to refute it: thirty six went in, nine distinct problems came out, and eight of them are fixed here. The one that mattered most was that Pull was the single git operation running without the guards that stop a repository's own config from choosing what executes, which every other git call in that file has had for months.

  6. v1.66.0

    Seven things the app already had half of. "What changed" is one question with two subjects now, so comparing against another project and comparing against the run before are one panel with a switch rather than two cards in two tabs. A replace across a project is remembered afterwards, the last ten, as a record of what was done and deliberately not as a way to do it again. The outline that draws the breadcrumb also answers the command palette, so jumping to a symbol is where somebody would look for it. The request log survives the server stopping and the app closing, which is exactly when the questions it answers start being asked, and it is bounded in bytes rather than in rows because every string in it was chosen by a stranger. An AI bundle can be told what the last one carried and leave out what has not changed since, and a file the secret rules refused can never come back through that door as merely unchanged. A project that wants a Node this machine is not running is offered one that is already installed, matched as numbers, so the version a folder asks for never becomes something to run. And a folder of theme files loads as a folder, every file through the same reader a single one goes through, so one file somebody is halfway through writing costs that theme and not the rest.

  7. v1.65.0

    Three things a Windows machine had to be standing in front of to find. A file name Windows will not accept, such as one with a question mark or a colon in it, now gets a sentence saying which characters it refuses, instead of the raw error the filesystem gave; so do the device names it keeps, like CON and NUL, which this version of Windows will happily create a file called and then most programs cannot open. Sharing with other devices says that Windows Defender Firewall is about to ask and which answer to give, because missing that prompt leaves an app that looks entirely correct and an address no phone can reach. And a phone on your own Wi-Fi is served over IPv6 rather than refused: every address the app offers you to type in is a routable one on most home connections now, and the rule that answered them was refusing the whole of 2000::/3, so it was refusing the addresses it had just printed. The internet is still refused, because it is on a different subnet.

  8. v1.64.0

    Two more from the Windows machine. Quitting while a Minecraft server was still being asked to stop left the server running on Windows: the hook that exists to catch exactly that killed one process, and a run goes through a shell there, so it killed the shell and left the server holding its port with nothing able to reach it. The check written to prevent this was watching that same shell, so it passed every time while the suite quietly left a server behind on every run. And Windows has a Recycle Bin and has never had a Trash, which the app said in twenty-three places, including the button you press to delete a file.

  9. v1.63.0

    The first run of the whole thing on real Windows, and the seven things it found. The Git panel did nothing at all on Windows: Git for Windows ships a system config naming a diff program, the guard against a repository naming one asked git a question that answers from every config on the machine, and so refused every repository on it. Backing up a Minecraft world wrote a file nothing could open, or failed outright, depending on which tar was first on the PATH. Settings and Check for Updates lived only in the macOS application menu, so both shortcuts the sheet promises did nothing here. The window opened sixty-one pixels shorter than on a Mac, because the number was the outside of the window and Windows spends more of it on the frame. The first screenshot after opening the preview always failed. Deleting any folder git had been in stopped halfway, because git marks its objects read-only and Windows means it. And a hard link, which is a second real name for the same bytes rather than a pointer to them, walked straight past the deny list that keeps .env and .git out of a served folder, on both platforms.

  10. v1.62.0

    The rest of cycle three, all of it: a theme read from a file, find and replace across a project with an exact undo, multiple cursors, a breadcrumb, a world manager, scheduled backups, updating a server in place, exporting a project, letting the AI see it with your consent read first, what a project needs to run, what changed between runs, an audit of what each device asked for, an optional frame around a screenshot, and an update check that finally tells you what it found.

  11. v1.61.0

    The throwaway profile that the smoke and screenshot runs use is now actually thrown away: every run had been leaving one behind, and on the machine this was found on there were nine hundred and fourteen of them taking up 1.8 GB.

  12. v1.60.0

    The Format button works, which it never had: the editor was handing it an indent in a shape it did not accept, so every press answered with a complaint about the indent. A project can now tidy a file automatically when it is saved, and the theme picker shows four of each theme's colours so one can be judged without applying it.

  13. v1.59.0

    A Minecraft server now says how it is doing, read out of the two lines it already prints rather than by asking it anything: how often it said it could not keep up, and the tick rate when you press the button for one.

  14. v1.58.0

    Settings now has one list of everywhere Local Test has written outside the folders you picked yourself, with what each one holds and how much of your disk it is using, and nothing on it deletes anything.

  15. v1.57.0

    Local Test records what a plugin jar was when you installed it, so it can later say whether the file on disk is still that one, which is a smaller claim than "this plugin is safe" and the only one anything here can honestly make.

  16. v1.56.0

    The command builder knows which commands your server is actually old enough to run, and says which version it would need and what would happen if it were sent anyway, rather than letting the server answer with a red line in the log that explains nothing.

  17. v1.55.0

    Duplicating a project asks where the copy goes, instead of pointing a second project at the first one's folder, and any single problem in the log can be copied on its own with the version and platform already on the end. The changed-file list in the Git panel is drawn by the rules written for it: a block left behind by an earlier design of that panel was still giving it a border, a monospace face and a cut-off at 150 pixels.

  18. v1.54.0

    Two ceilings, both there so a bug in this app cannot do something expensive on your behalf. AI questions are capped per hour, because every one is billed to your own account and nothing should be able to spend your money in a loop; the number is far above what anybody types by hand. And Local Test will not start more than a dozen projects at once: each is a real server with its own memory and its own port, and a machine running thirty of them stops responding rather than going faster. Neither is a licence limit, and both say what they are for rather than reading as the app being broken.

  19. v1.53.0

    Local Test now reads a Minecraft world's own file before starting a server, and asks the one question that matters: Minecraft upgrades a world when a newer version opens it and never goes back, which is the most destructive thing anybody can do here by accident and is invisible until it has happened. Deploy asks first, says it is permanent, and suggests backing up. A world too new for the server is refused with an explanation rather than a stack trace. The same file also answers which world this is without starting anything: the seed, the game mode, the day count and the version it was last opened with.

  20. v1.52.0

    The sidebar can group as well as sort. Twenty projects is a wall of names, and tags filtered but never grouped, so somebody doing client work could not collapse them by client. Group by tag or by what is running, fold the ones you are not looking at, and the folding is remembered. And the activity log can be searched across every project at once, which is the question "which project threw that error" and the one a per-project log cannot answer.

  21. v1.51.0

    Undo, for the two things that actually destroy work. Removing a project and throwing away your changes to a file both ask first, and asking is not the same as being able to change your mind: somebody who clicked through a confirmation because they were sure, and then was not, had nothing at all. A discard now keeps a copy first, so the exact bytes come back, and a file too big to copy says it cannot be undone rather than offering something the app cannot deliver. Deliberately one action, for five minutes, and only where the undo is exact, because an undo that half works is worse than none.

  22. v1.50.0

    A project can say what its folder weighs: the total, what is taking it up, and anything over a megabyte, which is almost always one image nobody looked at. It says what to do about it only where that is warranted, so a small site is not lectured about being small. node_modules, build folders, dotfiles and symlinks are left out, and the number of things left out is reported rather than hidden, because a total that quietly skipped half the folder is worse than no total. The preview also remembers the size each project was last opened at, so a phone-first site stops reopening at desktop, and the buttons that have a keyboard shortcut now mention it.

  23. v1.49.0

    A command builder for Minecraft servers: pick a command, fill in its arguments with the right control for each, and see the exact line before it is sent. The one that earns it is tellraw, whose JSON nobody remembers and which breaks in a way that looks like the server's fault the moment a message contains a quotation mark. Type the words, pick a colour, tick bold, and the app writes it. Ten commands, and a searchable list of a hundred and ninety item, effect, enchantment, entity and game rule ids, because nobody types minecraft:enchanted_golden_apple from memory. Anything built can be saved under a name and run again, and what you have already run is kept. Also: a command that throws on the way back from the main process now answers with an error instead of leaving the window waiting forever, which is what a panel stuck on "Loading..." has twice turned out to be.

  24. v1.48.0

    The preview window can take a picture of what it is showing, and the sizes it offers are the ones worth testing against rather than three round numbers. Eight presets, each saying what it stands for instead of only how wide it is, because a layout breaks at the narrow end and calling a 360 and a 430 phone both "phone" hides exactly that. One button saves the current size, another saves the whole page rather than the top of it, and a third saves every size at once into one folder, which is the version that saves real time: nobody resizes eight times and saves eight times, so nobody checks eight sizes. Also three new themes, one of which clears WCAG AAA on body text where the rest are held to AA, with a check that fails if it ever stops being the strongest.

  25. v1.47.0

    Everything found by auditing the Windows build instructions against the code before anybody runs them. Stopping a project could take the whole app down on Windows: the call that kills the process tree had no error listener, and an error event with nobody listening is not swallowed, it is rethrown and quits the app. The test suite could not run on Windows at all, for three separate reasons that were all environmental rather than about the app, and the instructions tell whoever is testing to stop on the first failure, so they would have stopped at step three of forty-two having learned nothing. And the in-app Uninstall said it moves the app to the Trash on a platform where it does not and cannot, while quietly deleting the settings anyway.

  26. v1.46.0

    The editor button opens whatever you actually use. Sixteen are detected rather than eight, which now includes the whole JetBrains family and finds them the way people really have them installed: IntelliJ alone ships under four different names and Toolbox puts it somewhere else entirely, so matching one name found about a third of the installs it should. Anything else can be pointed at by hand, including a plain executable. The button has a chevron beside it that opens a menu of everything installed, everything you have added, and a way to add another, and the choice can be for one project only, so a Minecraft server whose folder is jars and configs can open somewhere different from a codebase. A custom editor is launched directly rather than through a shell on every platform, which matters on Windows, where the built-in editors go through cmd.exe and a chosen path containing a quote would otherwise have run whatever came after it.

  27. v1.45.0

    Plugins can be removed and renamed as well as switched off. Removing goes to the Trash rather than nowhere, and when a plugin has a settings folder beside it the dialog asks whether that goes too, because keeping it is what you want when swapping versions and losing it is not. Renaming is how load order gets controlled on servers that read the folder alphabetically, and the new name cannot leave the plugins folder no matter what is typed into it.

  28. v1.44.0

    The Minecraft side stops being a setup wizard and becomes somewhere you administer a server. Every setting the server reads, all fifty-one of them, grouped by what they are for and each with what it actually does, what Minecraft's own default is, and whether it is only read at startup. The whitelist, the operators and both ban lists as real lists you add to and remove from, going through the console when the server is running because that is what an operator would do and editing those files underneath a running server loses the edit. Buttons for the commands everybody types. A reload button that tells you first why the Minecraft community treats reload as harmful, and an optional reload-after-a-plugin-changes that is off by default and says the same thing before it goes on. Purpur joins the list, fetched from PurpurMC's own API and checked against their digest. And accepting Mojang's EULA is a button, because it is one decision and it looked like a form field.

  29. v1.43.0

    Plugins. The install has always made a plugins folder and nothing ever put anything in it. There is now a panel: what is in there, a button to add a jar, and a tick box per plugin that turns one off by renaming it rather than deleting it, which is what a server administrator does by hand and is reversible in a way deleting is not. The part worth having is the last column: the app reads what the server itself said at boot, so a plugin built for a different Minecraft version is marked as having not loaded, with the reason, instead of sitting in the folder looking exactly like one that works. Nothing is downloaded: the places plugins come from are listings anyone can publish to, and fetching one of those and running it on your machine is a different act from fetching a server from the people who make the server.

  30. v1.42.0

    How long the app takes to show you anything is now a number rather than an impression, recorded at startup and checked on every run against a profile of forty projects rather than an empty one. The measurement immediately disagreed with the complaint it was written for: opening is not slow, and forty projects paint in a couple of milliseconds. What it did find is that the window was waiting on the licence check before drawing anything, and that check can involve a network while nothing on the first screen shows it, so it now happens after there is something to look at.

  31. v1.41.0

    The guided tour walked through deploying a folder and stopped, while the app grew an editor, a Git panel, Minecraft servers, AI mode and a command palette. Nothing failed: every check passed on a tour that had quietly become a tour of a smaller app, which is the first thing anybody sees. It now opens a file in the editor as a step of its own, and ends by naming the four things it skipped. And the keyboard reach of every scrolling panel is measured in the real window with real content in it, rather than found by hand after it ships, which is how the diff, the activity log and the problem log were each caught one at a time.

  32. v1.40.0

    After an update, the app tells you what it just became, in a card, in the app. The changelog has always been on the website, which is the wrong place for it at the one moment it matters: something has just changed under you and the answer is behind a browser and a search. It ships in the package now and the app reads its own entry out of it, so it works with no network and says the same thing the release was cut from. Nothing on a fresh install, where the tour is the right greeting and release notes are meaningless without a before. If you have skipped several versions you get all of them, up to eight, newest first.

  33. v1.39.0

    A Minecraft server restored from a backup came back as a plain folder to serve: the import copies fields one at a time by name, on purpose, so that a backup cannot carry in anything that runs, and nobody had added the server settings to that list. They are carried now, rebuilt rather than copied, so the start command still cannot come out of the file and a backup claiming you accepted Mojang's EULA cannot tick that box for a folder that says otherwise. And "Port 8000 is already in use" now names which of your own projects is sitting on it, because on a machine running this app that is almost always the answer, and it is more use than the port number you already knew.

  34. v1.38.0

    Throwing away your changes to a file, or putting a file back from an old commit, now has to be the project you are actually looking at. Both operations named the file in their confirmation and not the project, so an id muddled anywhere between the click and the handler would have destroyed real work in a real folder behind a dialog that read as entirely correct. Both dialogs now name the project and its folder, and a request for anything other than the project on screen is refused rather than performed. And the Minecraft setup says plainly where a server jar comes from and what is actually checked: the digest proves the file matches what the publisher listed, it does not prove who the publisher is, nobody signs these jars with anything checkable, and pretending otherwise would be worse than saying so.

  35. v1.37.0

    Your GitHub token, your AI provider key and your licence key are no longer sitting in a file in the clear. They go through the operating system's own store, Keychain on macOS and DPAPI on Windows, so a backup of the settings file, a synced profile folder or a copied disk image no longer hands all three to whoever has it. Existing keys move across on the next launch, with nothing to do and nothing to re-enter. A profile carrying a key sealed on a different machine says exactly that, rather than showing an empty box that looks like the app lost it. And an update feed that publishes a version older than the one you are running is now called what it is, a stale feed, instead of being reported as "you are on the latest version" in a green toast, which is the answer that keeps somebody on an old build while the app tells them all is well.

  36. v1.36.0

    A running Minecraft server is now something you can administer from Local Test rather than a wall of log: a list of who is on, and a console that takes the commands a server console takes, with the arrow keys walking back through what you have already sent. Backing up a world is one button, into the project's own backups folder, and the app says plainly that a copy taken while people are playing can be a few seconds behind what they are doing, because it can. Two backups pressed in the same second used to leave one archive, having deleted the other first, which is fixed. And backing up no longer types anything at a project that is not a Minecraft server, which it did, three commands at a time, into whatever that program was in the middle of.

  37. v1.35.0

    The command palette now knows about the whole app rather than the eight things that existed when it was written: 78 actions across nine groups, with their shortcuts, and searchable by what you would actually type, so "shut down" finds Stop. Errors no longer vanish with the toast that showed them. A project whose folder you deleted or moved says so instead of looking fine until you press Deploy, and offers to find it again. A Minecraft server is now stopped the way Minecraft wants, by sending it "stop" and letting it save, rather than being killed. And the app will only ever hand a plain http or https link to your browser, through one gate, with a test that fails if anybody adds a second way round it.

  38. v1.34.0

    Minecraft servers, natively. Pick Paper, Vanilla, Spigot or CraftBukkit and a version, choose where it goes and whether it gets a subfolder of its own, and Local Test fetches it, checks it against the checksum its publisher published, and sets it up. It tells you which Java the version needs before the download rather than after a stack trace, refuses to install on top of an existing world, and will not accept Mojang's EULA for you. Spigot and CraftBukkit are compiled on your machine with BuildTools, because they may not lawfully be handed out as files, and the app says so rather than leaving you watching a twenty minute silence.

  39. v1.33.0

    The editor highlights the bracket matching the one under your cursor, and marks one that has no partner, which is usually the reason a file will not parse and the tedious thing to find by eye. A bracket inside a string or a comment is not counted, because it is not a bracket. And a run that worked now records what it ran on, so if node moves from 20 to 24 underneath a project the app says so rather than leaving you to wonder what changed, since nothing about the project did.

  40. v1.32.0

    A small mark on a project in the sidebar when there is work in it you have not committed, or commits you have not pushed, so the question of which of eight projects you left something in is answered without opening each one.

  41. v1.31.0

    Environment variables have a real editor instead of a textarea: a row per variable, a warning when a name is not a valid one, and anything that looks like a credential shown as dots rather than in the clear, so a screen share of this panel does not hand over your keys. The value of a hidden one never reaches the window at all, and editing the row next to it cannot accidentally overwrite it. There is also a button to load a .env file from the folder, which shows you the names it found before it takes anything.

  42. v1.30.0

    A run that dies now says what happened, in a sentence, with the thing to do next and a button that does it: "That port is taken" and an offer to move to a free one, rather than "exited with code 1". Dependencies that were never installed are noticed before you press Run rather than after it fails, with the right package manager picked from the lockfile that is actually there. A project can restart itself when it dies, off by default and backing off so a crash loop is visible rather than endless, and the dot on a project row now tells running apart from running and actually answering.

  43. v1.29.0

    The Git panel is now worth using instead of a terminal: the history with what each commit touched, the actual diff of a file before you commit it, tick boxes so one stray edit does not ride along with every commit, throw away the changes to a single file, put a file back as it was at an earlier commit, branches, and one button to start a repository in a folder that has none. It also checks, every time, for things that should never be committed, and says plainly when one of them is already in the history, because a .gitignore does not help then. Selecting a project in the sidebar could run a program the repository chose, which is fixed.

  44. v1.28.0

    More than one file can be open at once, with tabs, and coming back to one puts you where you left it rather than at the top. Closing a tab drops you into the next file instead of back to the file list, and a tab with unsaved changes says so. Closing a file with unsaved changes now asks the real question, which has three answers and not two: save it, close it anyway, or never mind.

  45. v1.27.0

    AI mode now needs an API key rather than a paid tier, which is what was actually gating it all along: it runs on your key, billed to your account, and Local Test takes no cut, so putting it behind a tier that is not on sale meant nobody could use it at all. You can now choose the provider and the model, and Ollama runs on your own machine with no account, no key, no bill and nothing leaving the computer. There is an AI button beside the editor and the commit message box, on Cmd/Ctrl+I, that works on what you have selected: a reply that changes your file arrives as a diff with Apply and Discard, never applied on its own, and one Cmd/Ctrl+Z puts it back.

  46. v1.26.0

    The editor is now a code editor. Eighteen languages are highlighted by a real tokenizer written for this app, so a hash inside a Python string is not a comment and a slash that opens a regular expression is not a division. There are line numbers, the caret says which line and column it is on, Enter keeps and adds indentation, Tab indents a whole selection, typing a bracket or a quote brings its partner and typing the closer steps over it, Cmd/Ctrl+/ comments the selected lines, and JSON, YAML, JavaScript, CSS and HTML are checked for errors as you type with the line, the column, and a message that says what you actually did rather than naming a token. JSON, CSS, HTML, YAML and Markdown have a Format button that refuses a file with an error in it and can be undone with one Cmd/Ctrl+Z.

  47. v1.25.0

    Sharing a project now answers only devices that are actually on your network. Sharing had started listening on IPv6 as well as IPv4, which is what makes it work on a modern network, but IPv6 has no router doing NAT in front of it, so on a machine with a public v6 address "let the other devices on my wifi see this" had quietly become "let anyone who learns this address see this". A request from a network device could also run script on your site's own origin, because the page explaining a refusal quoted the file extension back without escaping it. And the two switches that page told you to turn on did not exist anywhere in the app; they do now, along with a place to name a tunnel or a hosts file entry so it stops getting a 403 from a server that is working perfectly.

  48. v1.24.0

    Cmd/Ctrl+F now searches the file you have open, which is what it means in every other editor and is not what it did here: it left your file alone and went off to filter the file list. The keyboard sheet had drifted out of true in both directions, promising shortcuts that were not registered and omitting ones that were, and its last three rows were being clipped out of sight by a panel that had stopped being tall enough, so it showed a heading with nothing under it.

  49. v1.23.0

    Closes two ways a repository could run a program of its own choosing on your machine: a git config naming an askpass helper, or naming its own upload-pack or receive-pack command, each of which git honours on a plain pull or push and neither of which the existing guard covered. Also stops the editor buttons taking the whole app down when the editor has been uninstalled, stops a folder full of files choosing which program opens it on Windows, and stops a folder cloned from one repository quietly syncing itself from another. The activity log can now be filtered by response, so asking for the 404s is one click.

  50. v1.22.0

    Sharing a site with other devices now works at every address your machine actually has, instead of picking one at random and refusing the rest, and it no longer hands a browsable listing of your project folder to anyone on the network, which the setting had promised all along. A saved API key or GitHub token now says on screen that it is saved, rather than showing a grey hint that looks identical to an empty box.

  51. v1.21.0

    Fixes three ways the guided tour came apart under you: pressing Add or Enter with a half-typed repository name started a real clone the step could never finish, so Add now stays closed until it matches and a stray click or Escape can no longer shut the Settings panel a step is pointing at; opening the template menu distorted the whole sidebar, because lighting it dropped it out of its own positioning; and skipping that step reopened the menu instead of moving on. Removing a project now asks you to type its name, the way GitHub does.

  52. v1.20.0

    Local Test is no longer MIT licensed: the source stays published so anyone can read it, but redistributing it, selling it, or removing the licensing checks is no longer permitted, which is what makes a paid tier possible at all. Everything released before this keeps the MIT terms it went out under.

  53. v1.19.0

    Any path on screen can be copied with one click: the project folder, the folder you are browsing, every file and folder in the list, and the clone folder in Settings, each with a small copy button beside it and a note saying what went to the clipboard.

  54. v1.18.0

    Closes the Windows spellings of a denied file, where the same bytes answer to more than one name: a stream suffix, an old-style short name, or a trailing dot each used to walk straight past the list that protects .env, node_modules and private keys.

  55. v1.17.0

    Makes the app usable from the keyboard: opening a dialog now puts you inside it, Tab stays in it, closing puts you back where you were, and the tabs and filter buttons say which one is selected rather than only looking it.

  56. v1.16.0

    Closes a hole where a symlink with an innocuous name served the very files the deny list exists to protect (.env, .git/config, a private key), stops a process that ignores the polite stop signal being orphaned when you quit, no longer leaks a file handle for every cancelled download, keeps multibyte characters intact when output is split across chunks, and gives the toasts, the project name field and both filter boxes something a screen reader can announce.

  57. v1.15.0

    Fixes three things that never worked and one that could lose everything: New file, New folder and Rename all called a dialog Electron does not have and failed silently, the Edit, Rename and Delete buttons on a file row were swallowed by the row itself, and a settings file that could not be read (a permissions problem, a failing disk) was mistaken for a fresh install and then overwritten, taking every project and every saved key with it.

  58. v1.14.0

    The two platforms no longer have to be released together: each download in the manifest now records its own version, a platform that was not rebuilt keeps exactly what was published for it instead of being switched off, and the app only offers an update it can actually install on the machine asking.

  59. v1.13.1

    Picking a second premade prompt now replaces only the prompt, keeping the question you wrote yourself, which the first attempt at this got wrong by mistaking the previous prompt for your own words.

  60. v1.13.0

    Fixes found by reviewing the three new features line by line: pasting the GitHub URL of a branch, a file, or a pull request now clones that repository rather than the last two words of the link (and a link to another host is refused rather than quietly fetched from GitHub), clones are filed under their owner so two accounts with a same-named repository no longer overwrite each other, exported backups no longer carry the licence key or a project's environment variables, AI mode survives a connection that drops mid-reply instead of leaving Send disabled until restart, a key carrying an invisible character is refused with an explanation, a huge file is skipped rather than read whole into memory, the fixed instruction sent with every question is now printed in full in the panel, and the cost note says twenty cents rather than a few, which is what a whole file actually costs.

  61. v1.12.3

    Fixes the refusal a full project list gives when you try to add several at once, which said there was room for 0 and then told you to add fewer.

  62. v1.12.2

    Fixes an in-app updater that refused every real update: it required an installer to sit on the same host as the manifest, but the installers are too large for the site and are served from object storage, so the check is now a fixed list of hosts compiled into the app, with the SHA-256 match against the manifest still the thing that decides whether an update installs.

  63. v1.12.1

    Points the app at its real home, local-test.app, so update checks, the changelog link, and a new Help menu entry for downloads all resolve, and clears out the claims that Local Test is open source or handed out through GitHub Releases, along with every em dash and en dash in the repo.

  64. v1.12.0

    Adds AI mode behind VIP: an AI tab on every project with nine premade prompts that arrive already carrying the project's file list, activity log, open file or changed files, assembled where you can read and edit every word before it is sent, answered with your own Anthropic key (stored masked, kept out of backups, never logged, sent only to Anthropic) and priced per answer, with a plain-English tutorial covering what an API key is, where to get one, who pays and roughly how much, and a failure path that never throws away what you typed.

  65. v1.11.0

    Introduces tiers: Local Test Free keeps five projects and says so plainly when you reach it (with the way past it one click away), anyone who already had more than five keeps every one of them, and VIP (unlocked with a license key in Settings, marked with a gold crown, shown as a masked key you can remove at any time without losing a project) makes projects unlimited.

  66. v1.10.0

    Adds a repository browser: scan a folder of clones and add any number of them at once (each listed with its branch, whether it has a page or a run command, and its remote, with ones already added shown greyed out rather than hidden), or type a GitHub username and clone several of that account's repositories in one go, with an optional read-only personal access token for private repositories that is masked in the UI, kept out of backups, and never leaves the main process.

  67. v1.9.1

    The tour now closes a panel the next step does not need, so skipping ahead out of Settings puts Settings away, and its lighting has three levels: the app behind is dimmed, an open panel sits at normal brightness, and the control the step is about is lifted above both.

  68. v1.9.0

    Security hardening from an external audit, with the update channel now verified end to end (checksum required, HTTPS only, artifact pinned to the manifest origin): an imported backup can no longer plant a run command or arm auto-start, symlinks can no longer serve files from outside a project through an index page, 404 page, SPA shell or serve folder, dotfiles like .env and .git are refused rather than merely hidden, a foreign Host header is rejected so a website cannot read your projects by rebinding DNS, clone and pull run through the hardened git wrapper with filter and diff drivers disabled, the macOS update swap no longer builds a shell command from archive contents, update redirects cannot drop HTTPS or change host, and commands found inside a cloned repo need a look before they run.

  69. v1.8.0

    Tour fixes from a real run-through: the dim now sits under the app's own modals so Settings is lit rather than blacked out, the panel never covers what it highlights (and follows the template menu once it opens), steps bring their own project to the front so the words match the button, skipping fulfils a step instead of stranding you, leaving clears away the examples the tour created, and starter templates refuse a folder that is not empty with instructions for making one.

  70. v1.7.0

    Fixes the guided tour so the app stays clickable during it (the overlay was swallowing every click), makes action steps advance when you do the action instead of asking for Continue, verifies what you type as you type it, and never clips its panel at any window size; adds a dependency-free Node server template the tour uses to demo running real software, a Guided tour button in Settings, and update checks that report new commits when Local Test is running from a git clone.

  71. v1.6.1

    Puts an update status chip next to the version in the corner: "up to date", "checking", "1.7.0 ready" (click to install), or "check failed", with the time of the last check in its tooltip.

  72. v1.6.0

    Adds a guided tour with spotlight highlighting that walks a first-timer through adding a real GitHub repo, deploying it, editing files, running an app, and deleting both so they finish with a clean slate; the Continue button stays hollow until each step is actually done, Skip jumps ahead, and exiting asks first. Also shows how long ago each project was last updated.

  73. v1.5.1

    Styles the dropdowns, which were still rendering as raw system controls: the Font size and sort selects now match the app's inputs in every theme, chevron included.

  74. v1.5.0

    Advanced launch behaviour: a project can start itself when Local Test opens (gated behind typing its exact name, with pasting blocked and the name re-checked in the main process), an "open at login" setting, and update checks that run on launch and hourly while the app is open, each one narrated by a dismissible banner, including the checks that find nothing.

  75. v1.4.2

    Redraws the app icon as a pocket console with the play mark optically centred on its screen, replacing the window-chrome mark whose triangle leaned left and whose dots crowded the corner curve.

  76. v1.4.1

    Credits graysonanderson.com throughout the app (Settings, the Help menu, the tutorial, the command palette, the README, and the package metadata) with a test that keeps the link reachable.

  77. v1.4.0

    Organizing: colour-coded tags on every project with tag filtering, a running/stopped filter, six sort orders (my order, name, recently added, recently deployed, most requests, port), pinning, per-project notes, and a redrawn app icon with the play mark properly centred.

  78. v1.3.0

    A retro-handheld pass over the look: two new pocket-console themes (Pocket Green and Berry Pocket), tactile shading on the controls, and short reduced-motion-aware animations throughout, plus a decked-out installer with pixel-art DMG artwork, drag-to-Applications layout, and Windows installer branding.

  79. v1.2.1

    Hardening pass from an adversarial review: project search now honours the symlink jail, Windows editor and terminal launches can no longer be influenced by folder names, git runs with a repo's own config disabled, oversized files can no longer be saved back truncated, undo works after every editor action, per-project environment variables are actually saved, and every theme now meets WCAG AA contrast (with a new test that enforces it).

  80. v1.2.0

    Editor and workspace polish: find and replace, insert an image from your computer, rename files, a keyboard-shortcut cheat sheet, a template-led first run, drag-to-reorder projects, per-request timings with live uptime, and activity export.

  81. v1.1.0

    The creator update: a full Markdown editor with live preview, formatting toolbar, and auto-save that pairs with live reload; project text search; one-click git commit and push; five starter templates; per-project environment variables; menu-bar and tray controls with a real application menu; device-sized preview windows; Cursor/VS Code/Zed/Sublime detection plus Open terminal; deploy-all and stop-all; and Local Test now refuses to serve its own installation.

  82. v1.0.0

    First stable release: a tested self-updating system (download and in-place install on macOS, installer hand-off on Windows, quiet check on launch) with an in-app uninstaller, a Cmd/Ctrl+K command palette, drag-and-drop to add folders, Open in VS Code, a live Dock badge and smart port assignment, a symlink-aware security hardening pass, and refreshed docs.

Beta history, 0.x

12 betas, from the first working build to the release candidate. The app was called Test Run until 0.1.5.

  1. Beta 0.1.5

    Renames the app to Local Test everywhere (settings migrate automatically from the old Test Run profile) and fixes the two features that broke in Finder-launched builds: Run commands and GitHub sync now recover the real shell PATH (npm, python, git are found again), git fails fast with a clear message on private repos instead of hanging, and the app smoke now also runs a command project end-to-end.

  2. Beta 0.1.4

    The theme dropdown is now a visual picker (each theme shown as its primary and secondary color swatches with the name set in that theme's font, in black), replacing the separate color/font settings, and Settings gains a GitHub section: pick a clone folder and add any owner/name repo as a project that auto-updates before every deploy.

  3. Beta 0.1.3

    Settings gains named modern Primary and Secondary color options (Cobalt, Iris, Violet, Emerald, Coral, and more) that restyle any theme's accents and live indicators, plus a named Font setting (System Sans, Geometric, Humanist, Editorial Serif, Typewriter Mono, Soft Rounded) alongside font size.

  4. Beta 0.1.2

    Deploy now auto-detects build-output folders (_site, dist, build, public, out) and serves the built site instead of a raw repo listing, with a per-project "Serve folder" override.

  5. Beta 0.1.1

    The screenshot tool can now capture any theme and tab (--shot-theme, --shot-tab) with a richer demo project, used to shoot the website gallery.

  6. Beta 0.1.0

    Feature-complete release candidate: HTTP Range support for media seeking, keyboard shortcuts (Cmd/Ctrl+O add, Cmd/Ctrl+D deploy/stop), and validation against real projects including Local Test running itself; remaining 1.0 blockers are code signing, signed auto-update, and a Windows pass.

  7. Beta 0.0.6

    Auto-recognizes software when a folder is added (Node, Vite, Rust, Go, Python/Django) and prefills the run command so it loads as software instead of a static localhost site.

  8. Beta 0.0.5

    Eight named themes (adaptive Default plus Midnight Harbor, Neon Drift, Amber Terminal, Rose Quartz, Matcha Cream, Glacier, and Paper & Ink) with per-theme fonts, gradients, and button colors, an independent font-size setting, and wrap-safe layouts at any window size.

  9. Beta 0.0.4

    Cloudflare-inspired project workspace: Overview/Files/Activity/Settings tabs, per-project serving settings (SPA fallback, directory listings, live reload), live reload via file watching, a GitHub-style file viewer that opens the README by default (spec.md as backup), and GitHub repo sync (clone/pull, optional pull-before-deploy).

  10. Beta 0.0.3

    Projects can now run software: an optional per-project command (like npm start) with live output and a Run/Stop lifecycle, plus SVG icons replacing all emoji and an in-app beginner tutorial.

  11. Beta 0.0.2

    Adds the app icon, packaged installers (macOS DMG/zip, Windows NSIS config), and a manual update check via the corner version badge.

  12. Beta 0.0.1

    First working beta: GitHub Desktop-style app for saving local folders as projects and deploying them as static sites on localhost, with settings, activity logs, and smoke tests.

Everything on this page is written into the HTML, so it reads the same with scripts blocked or the network down.