diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f0866fb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +dist/ +.vscode/ +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 8ae22d2..1152b3f 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,79 @@ -# Brave Origin Windows Unlocker +# Brave Origin Unlocker -A TypeScript utility for unlocking Brave Origin features on Windows by modifying -the local application state. +A TypeScript utility for unlocking Brave Origin features on Windows and macOS by modifying the local application state. ## Overview -This tool modifies the Brave Origin browser's local state configuration to -unlock premium features. It works by updating the `Local State` JSON file used -by Brave to store user preferences and license validation status. +This tool modifies the Brave Origin browser's local state configuration to unlock premium features. It works by updating the `Local State` JSON file used by Brave to store user preferences and license validation status. ## Features - ✅ Unlocks Brave Origin features - ✅ Modifies purchase validation state - ✅ Updates SKU credentials -- ✅ Windows-compatible local data path handling +- ✅ Windows and macOS auto-detection & compatibility +- ✅ Easy execution and cross-compilation via Deno tasks ## Requirements - **Deno** - Modern JavaScript/TypeScript runtime -- **Windows OS** - Designed for Windows file paths +- **Windows OS or macOS** - Supported operating systems - **Brave Origin** - The browser being modified -- **File Write Permissions** - Access to `%LOCALAPPDATA%` directory +- **File Write Permissions** - Access to browser configurations ## Installation -1. Install [Deno](https://deno.land/) if you haven't already +1. Install [Deno](https://deno.land/) if you haven't already. 2. Clone this repository: ```bash git clone https://github.com/ObjectAscended/brave-origin-windows-unlocker.git cd brave-origin-windows-unlocker ``` +## How to Run 🚀 + +The script automatically detects whether you are running on Windows or macOS. You can run the unlocker directly with: + +```bash +deno task unlock +``` + +--- + +## How to Compile / Cross-Compile 📦 + +You can build standalone binaries for different operating systems and architectures using the pre-configured compilation tasks: + +### Compile for Windows (x64) +```bash +deno task compile-win +``` + +### Compile for macOS Apple Silicon (ARM64) +```bash +deno task compile-mac-arm +``` + +### Compile for macOS Intel (x64) +```bash +deno task compile-mac-x64 +``` + +These tasks will output the built binaries into the `dist/` directory. + +--- + ## Pre-Bundled Deno Binaries 🎉 -In our latest releases, we offer **pre-bundled Deno binaries** that make running -the Windows unlocker easier than ever! 🚀 You can download them from our -[latest release page](https://github.com/ObjectAscended/brave-origin-windows-unlocker/releases/latest). -These binaries ensure a smooth setup and save you time, so you can focus on -enjoying your experience without unnecessary hassle! 🕒 +In our latest releases, we offer **pre-bundled Deno binaries** that make running the unlocker easier than ever! 🚀 You can download them from our [latest release page](https://github.com/ObjectAscended/brave-origin-windows-unlocker/releases/latest). These binaries ensure a smooth setup and save you time. -## Why Run the Windows Unlocker Instead of WSL? 🤔 +## Why Run the Unlocker Natively? 🤔 -Running the Windows unlocker natively is typically a better choice than running -a browser inside WSL. Here's why: +Running the unlocker natively is typically a better choice than running a browser inside virtual/emulated environments. Here's why: -1. **Performance**: The native Windows experience generally offers better - performance than emulated environments like WSL. ⚡ -2. **Simplicity**: You avoid complex setups and configurations, making it more - straightforward for users of all levels. 🛠️ -3. **Compatibility**: Some features and functionalities might only work - seamlessly in a Windows environment, ensuring you get the most out of your - tools. 🔗 -4. **User Experience**: Enjoy a more intuitive interface and fewer problems - managing dependencies. 😊 +1. **Performance**: The native experience generally offers better performance than emulated environments. ⚡ +2. **Simplicity**: You avoid complex setups and configurations, making it more straightforward for users of all levels. 🛠️ +3. **Compatibility**: Some features and functionalities might only work seamlessly in a native environment, ensuring you get the most out of your tools. 🔗 +4. **User Experience**: Enjoy a more intuitive interface and fewer problems managing dependencies. 😊 Enjoy using our tool! 🎈 diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..d72c1db --- /dev/null +++ b/deno.json @@ -0,0 +1,8 @@ +{ + "tasks": { + "unlock": "deno run --allow-env --allow-read --allow-write unlock.ts", + "compile-win": "deno compile --allow-env --allow-read --allow-write --target x86_64-pc-windows-msvc --output dist/unlock-win.exe unlock.ts", + "compile-mac-arm": "deno compile --allow-env --allow-read --allow-write --target aarch64-apple-darwin --output dist/unlock-mac-arm unlock.ts", + "compile-mac-x64": "deno compile --allow-env --allow-read --allow-write --target x86_64-apple-darwin --output dist/unlock-mac-x64 unlock.ts" + } +} \ No newline at end of file diff --git a/unlock.ts b/unlock.ts index 494e2cd..043acfa 100644 --- a/unlock.ts +++ b/unlock.ts @@ -1,15 +1,38 @@ -const localAppData = Deno.env.get("LOCALAPPDATA"); +const os = Deno.build.os; + +let localStatePathPattern: (version: string) => string; + +if (os === "windows") { + const localAppData = Deno.env.get("LOCALAPPDATA"); + if (!localAppData) { + console.error("Error: LOCALAPPDATA environment variable not found."); + Deno.exit(1); + } + localStatePathPattern = (version) => + `${localAppData}\\BraveSoftware\\${version}\\User Data\\Local State`; +} else if (os === "darwin") { + const homeDir = Deno.env.get("HOME"); + if (!homeDir) { + console.error("Error: HOME environment variable not found."); + Deno.exit(1); + } + localStatePathPattern = (version) => + `${homeDir}/Library/Application Support/BraveSoftware/${version}/Local State`; +} else { + console.error(`Error: Unsupported operating system: ${os}`); + Deno.exit(1); +} const versions = ["Brave-Origin", "Brave-Origin-Beta", "Brave-Origin-Nightly"]; let foundAny = false; for (const version of versions) { - const localStatePath = - `${localAppData}\\BraveSoftware\\${version}\\User Data\\Local State`; + const localStatePath = localStatePathPattern(version); try { const localState = JSON.parse(await Deno.readTextFile(localStatePath)); + localState.brave = localState.brave || {}; localState.brave.origin = { purchase_validated: true }; localState.skus = {