I am currently working on two major features: change history and three-way merging of two branches. These features will likely be ready by the end of the year.



vector2/vector3/vector4, int-vector*, rectangle, int-rectangle,tags or tags-collection editor is stored as a string, and until now every game had to split and parse that<Name>Raw companion,// Unity
UnityEngine.Vector3 spawn = enemy.SpawnPoint;
// non-Unity C#
System.ValueTuple<float, float, float> spawn = enemy.SpawnPoint;
var (x, y, z) = enemy.SpawnPoint;
// the stored text is still there
string raw = enemy.SpawnPointRaw;UnityEngine.Vector3, UnityEngine.Rect, UnityEngine.RectInt, ...System.ValueTuple<float, float, float>, ... — deconstructs with var (x, y, z) = ...readonly [number, number, number], readonly string[]{x:Float, y:Float, z:Float}, Array<String>{ x = ..., y = ..., z = ... }, array tableGetParsedSpawnPoint() beside the unchanged FString SpawnPointrawCompositeTypes Optimization--optimizations rawCompositeTypes turns the above off: composite text properties keep their original name and<Name>Raw. This optimization is the way out.document collection properties, looking for the value in every entry of the collection.--changesFile option:dnx dotnet-charon -- SERVER START --dataBase ./aurora_gamedata.gdjs --changesFile ./new_frontier_mod.patch.jsonchangesFile query parameter on the data source URI (with an optionalreadOnly parameter to force read-only mode on a writable file), so it works for every verb, not just the server.DATA APPLYPATCH command.
package.json (config.customPages: id, selector, title,breadcrumb) and open them with context.navigation.customPage(packageName, pageId, restOfRoute?, params?)./ext/:packageName/:pageId/...), can own extra path segments forparams, restOfRoute,document-action-menu) and the document list's Actions menudocument-list-action-menu, formerly grid-action-menu). Form actions receive the open document'sdocumentControl; list actions receive the collection's schema and the current row selection.
customActions entry can set pageId instead of functionName, soside-navigation-menu, a persistent entry in the project's left sidebar. Sidebar namesSection/Label convention: Design/Summary Page creates a "Design" heading with a "Summary Page" link,context.ui.dialog.showCustom(selector, data,
options) — no package.json declaration required, just a custom element the extension has already registered..data and a.dialogRef.close(result) handle to return a result to the caller. Unlike progress dialogs, custom dialogs stack.context.navigation also gained dashboard(), settings(), documentCollection(),documentForm(), errorPage() and back() for one-line navigation from any action, and the action context nowservices property.

package.json cannot be read is now rejectedDATA SEARCH — cross-schema text search with an optional schema filter, printing either a flatSchema | Document Id | Path | Value table or the full JSON result.DATA LISTSCHEMAS — browse schema definitions, a sibling of DATA LIST fixed to the schema metadata.DATA EXAMINE — document counts and hashes without loading full data.DATA FINDFILES — scan a folder for game data files and report what was found.DATA PROJECTSETTINGS — retrieve the project settings document (languages, primary language, and otherDATA UPDATEPROJECTSETTINGS writes a single project settings property, addressed by name or by JSON Pointer. The--valueIsJson.DATA LIST filter and sorter descriptions now document the JSON Pointer syntax for deeper property paths.data_get_project_settings — read the project settings document (languages, primary language and the rest),data_find_by_id.generate_lua_code — generate Lua source code, alongside the existing C#, TypeScript, Haxe and Unreal tools.null there).LocalizedText was made faster on C#, TypeScript, Haxe and Lua by comparing an internal version counter insteadINIT could exit before the new game data file was written, leaving only .tmp and .bak files behind whileLocalizedText cached values by current language only, so changing the fallback language or fallback option.tar were invisible until the server restarted.dnx dotnet-charon -- form.
CharonSchemaEditorElement [New]CharonPropertyEditorElement [Updated]--lockFile parameter to join an already running server process instead of starting an independent one, allowing shared usage of the same game data files between different servers. The first process serves requests; later ones redirect to it, wait for its exit, and replicate its exit code.--lockFile parameter for SERVER START now accepts a default value, which resolves to a lock file path in the %PROGRAMDATA%/Charon folder. This allows process joining without needing to know where the shared lock file is located.-- separator.f suffix, causing "double to float coercion" warnings..generated.h include, causing StaticEnum<T> expressions to fail due to missing metadata.FSharedString instead of FString) in Unreal Engine 5.8.

ToolsVersion format to use a version range instead of the exact app version, allowing a wider compatibility window between charon DATA ... tools and data files.{} instead of null.charon MCP to run in stdio MCP mode. Discover available tools and resources with npx @modelcontextprotocol/inspector.string is automatically replaced with FString in Unreal Engine C++ generated code.vector2/3/4 fields in Unreal Engine C++ generated code. Field values can now be accessed using native types (FVector2D, FVector, FVector4) instead of unparsed FString. For example, a Text Position field with a vector2 sub-type will generate an additional FVector2D GetParsedPosition() accessor method.Invoke method is now generated for each formula type.x is Type expressions incorrectly returning true for null and Object in TypeScript generated code.UClass-derived classes now include a UPROPERTY attribute to maintain valid object references.Function constructor, eval(), prototype walking, Reflect, and similar mechanisms.Ctrl/Cmd+C and Ctrl/Cmd+V.
dotnet tool install -g dotnet-charonclaude mcp add --transport stdio charon -- charon MCP
charon.live is currently being migrated to another email provider. Registration and two-factor authentication codes may not work. The migration is expected to take one day.
FGameDataDocumentReference type not being editable outside of “default value” contexts by changing its metadata from EditDefaultsOnly to EditAnywhere..bat and .sh to neutral .windows and .unix extensions.GENERATE TEMPLATE command in favor of direct downloads from the repository. The tool no longer bundles .tt code generation templates and will attempt to download them from GitHub when templates are requested.Context in C# formulas and context in TypeScript formulas to the SetGlobal() and setGlobal() methods, respectively.AutoNullPropagation and autoNullPropagation support for formulas in C# and TypeScript generated code.'null' tag appeared when the suggestion list was empty.0 as a document identifier. While technically valid, this value is not recommended and is now avoided.Shift key while clicking Save.null instead of empty strings, ensuring they are correctly reported as validation errors when left unfilled.
Perforce and PlasticSCM version control systems for purpose of postponing file reloads.#define constants from the top of each file into the module declaration.app-version meta tag and the data-app-version attribute to the HTML document’s <body> element.
Shift + D shortcut triggered document duplication while typing capital “D”. The table row duplication shortcut has been updated to Ctrl + Shift + D.prefers-reduced-motion.ValueControl values always match the type defined by the associated SchemaProperty, improving UI extension reliability.Reference Collection dropdown lists.
$oneOf — allow you to store documents of different shapes within the same collection or inside nested documents. Match ApplyVisitor asUnion() converter that reinterprets a document as a Sum Type.match helper method as an alternative for ergonomic pattern matching.asEnum() converter that transforms a document into an Enum type.ApplyVisitor method. 
SettingsService usage in #if UNITY_2022_3_OR_NEWER to maintain compatibility with older Unity Editor versions.FGameDataDocumentReference::GetReferencedDocument based on GameData->RevisionHash. The current GetRevisionHash() implementation is reflection-based; future generated code will provide a faster version.