{"id":19375789,"url":"https://github.com/mika-f/plana","last_synced_at":"2025-07-08T07:11:45.984Z","repository":{"id":221711686,"uuid":"708396749","full_name":"mika-f/plana","owner":"mika-f","description":"Plana is a powerful general purpose obfuscator for C#, but optimized for Unity and UdonSharp, containing a variety of features which provide protection for your source code from the hackers","archived":false,"fork":false,"pushed_at":"2024-03-16T19:32:53.000Z","size":671,"stargazers_count":12,"open_issues_count":12,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-02T18:11:43.785Z","etag":null,"topics":["csharp","dotnet","obfuscate","obfuscation","obfuscator","protection","security","udonsharp","unity","vrchat"],"latest_commit_sha":null,"homepage":"https://docs.natsuneko.com/plana","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mika-f.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-22T12:54:25.000Z","updated_at":"2024-09-23T19:08:34.000Z","dependencies_parsed_at":"2024-02-20T13:30:28.351Z","dependency_job_id":"e78c202d-14f0-433d-89a9-1492d7efafe7","html_url":"https://github.com/mika-f/plana","commit_stats":null,"previous_names":["mika-f/plana"],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mika-f%2Fplana","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mika-f%2Fplana/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mika-f%2Fplana/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mika-f%2Fplana/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mika-f","download_url":"https://codeload.github.com/mika-f/plana/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250490525,"owners_count":21439159,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","dotnet","obfuscate","obfuscation","obfuscator","protection","security","udonsharp","unity","vrchat"],"created_at":"2024-11-10T08:40:20.438Z","updated_at":"2025-04-23T18:32:51.028Z","avatar_url":"https://github.com/mika-f.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Plana\n\nPlana is a powerful general purpose obfuscator for C#, but optimized for Unity and UdonSharp, containing a variety of features which provide protection for your source code from the hackers.\n\n## Key Features\n\n- cli and unity integration\n- support C#, Unity C#, and UdonSharp\n- pluggable\n\n## Official Plugins\n\n- (Planned) Plana.Composition.ControlFlowFlattening\n- (Planned) Plana.Composition.DeadCodeInjection\n- Plana.Composition.DisableConsoleOutput\n- (Planned) Plana.Composition.NumbersToExpressions\n- Plana.Composition.RenameSymbols\n- Plana.Composition.ShuffleDeclarations\n- (Planned) Plana.Composition.SourceMaps\n- (Planned) Plana.Composition.SplitStrings\n- (Planned) Plana.Composition.StringEncryption\n\n## How to use\n\nYou can use Plana from any integrations.\n\n### Command Line\n\n```bash\n# assembly level obfuscate\n$ plana-cli obfuscate --workspace ./YourUdonSharpProject.csproj --plugins ./plugins/ --rename-symbols --control-flow-flattening --source-maps\n\n# project level obfuscate\n$ plana-cli obfuscate --workspace ./YourUnityProject.sln --plugins ./plugins/ --rename-symbols --control-flow-flattening --source-maps\n```\n\nPlease visit https://docs.natsuneko.com/plana/integrations/cli for more information.\n\n### Unity Integration\n\nSee https://docs.natsuneko.com/plana/integrations/unity\n\n### Desktop Integration (for Windows and Linux)\n\nSee https://docs.natsuneko.com/plana/integrations/desktop\n\n## Develop Plugin\n\nYou can add any behaviour to Plana, by plugin system.\n\n1. create a C# project with .NET 8.\n2. add a new reference of `Plana.Composition.Abstractions` to project\n   1. also add `Plana.Composition.Extensions` for useful extension methods\n3. create a new C# source with the following template:\n\n```csharp\nusing System.Runtime.CompilerServices;\n\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\n\nusing Plana.Composition.Abstractions;\nusing Plana.Composition.Abstractions.Attributes;\nusing Plana.Composition.Extensions;\n\n[assembly: InternalsVisibleTo(\"Plana.Composition.YourFirstPlugin.Tests\")]\n\nnamespace Plana.Composition.YourFirstPlugin;\n\n[PlanaPlugin(\"your-first-plugin\")]\npublic class YourFirstPlugin : IPlanaPlugin2\n{\n    private static readonly PlanaPluginOption Flag = new(\"flag\", \"Flag Option\", \"this is flag option\", false);\n\n    internal bool IsFlagged;\n\n    public IReadOnlyCollection\u003cIPlanaPluginOption\u003e Options =\u003e new List\u003cIPlanaPluginOption\u003e { Flag }.AsReadOnly();\n\n    public string Name =\u003e \"Your First Plugin\";\n\n    public void BindParameters(IPlanaPluginParameterBinder binder)\n    {\n        IsFlagged = binder.GetValue(FlagOption);\n    }\n\n    public async Task ObfuscateAsync(IPlanaPluginRunContext context)\n    {\n        foreach (var document in context.Solution.Projects.SelectMany(w =\u003e w.Documents))\n        {\n            var oldNode = await document.SyntaxTree.GetRootAsync(context.CancellationToken);\n            var newNode = // create a new node\n\n            await document.ApplyChangesAsync(newNode, context.CancellationToken);\n        }\n    }\n}\n```\n\n4. add the following lines to csproj:\n\n```xml\n\u003cProject Sdk=\"Microsoft.NET.Sdk\"\u003e\n\n  \u003c!-- required --\u003e\n  \u003cPropertyGroup\u003e\n    \u003cEnableDynamicLoading\u003etrue\u003c/EnableDynamicLoading\u003e\n  \u003c/PropertyGroup\u003e\n\n  \u003c!-- recommended for developing plugins --\u003e\n  \u003cPropertyGroup\u003e\n    \u003cBuildOnCI\u003e$(CI)\u003c/BuildOnCI\u003e\n  \u003c/PropertyGroup\u003e\n\n  \u003cTarget Name=\"PostBuild\" AfterTargets=\"PostBuildEvent\"\u003e\n    \u003cExec Command=\"pwsh -Command New-Item -Force -ItemType Directory '/path/to/plana/plugins/'\" Condition=\"'$(BuildOnCI)' == ''\" /\u003e\n    \u003cExec Command=\"pwsh -Command Copy-Item '$(TargetDir)$(ProjectName).dll' '/path/to/plana/plugins/$(ProjectName).dll'\" Condition=\"'$(BuildOnCI)' == ''\" /\u003e\n    \u003cExec Command=\"pwsh -Command Copy-Item '$(TargetDir)$(ProjectName).dll' '/path/to/plana/plugins/$(ProjectName).dll'\" Condition=\"'$(Configuration)' == 'Release' And '$(BuildOnCI)' == ''\" /\u003e\n  \u003c/Target\u003e\n\n\u003c/Project\u003e\n```\n\n## License\n\nMIT by [@6jz](https://twitter.com/6jz)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmika-f%2Fplana","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmika-f%2Fplana","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmika-f%2Fplana/lists"}