{"id":13621140,"url":"https://github.com/shdwmtr/millennium","last_synced_at":"2025-04-15T01:31:26.499Z","repository":{"id":159379209,"uuid":"634620807","full_name":"shdwmtr/millennium","owner":"shdwmtr","description":"Apply themes/skins/customize Steam® after the 2023-04-27 Chromium UI update","archived":false,"fork":false,"pushed_at":"2025-04-10T05:44:46.000Z","size":61141,"stargazers_count":1724,"open_issues_count":22,"forks_count":43,"subscribers_count":19,"default_branch":"main","last_synced_at":"2025-04-10T06:37:06.566Z","etag":null,"topics":["millennium","patcher","plugins-api","reverse-engineering","skins","steam","themes","valve"],"latest_commit_sha":null,"homepage":"https://steambrew.app","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/shdwmtr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"ko_fi":"shadowmonster"}},"created_at":"2023-04-30T18:06:18.000Z","updated_at":"2025-04-10T05:44:51.000Z","dependencies_parsed_at":"2023-12-05T00:23:16.158Z","dependency_job_id":"5ea3130e-8d4d-4922-9982-76106acbfc77","html_url":"https://github.com/shdwmtr/millennium","commit_stats":null,"previous_names":["shadowmonster99/millennium-steam-patcher","shdwmtr/millennium","steamclienthomebrew/millennium"],"tags_count":60,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shdwmtr%2Fmillennium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shdwmtr%2Fmillennium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shdwmtr%2Fmillennium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shdwmtr%2Fmillennium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shdwmtr","download_url":"https://codeload.github.com/shdwmtr/millennium/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248989173,"owners_count":21194544,"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":["millennium","patcher","plugins-api","reverse-engineering","skins","steam","themes","valve"],"created_at":"2024-08-01T21:01:02.891Z","updated_at":"2025-04-15T01:31:26.493Z","avatar_url":"https://github.com/shdwmtr.png","language":"C++","funding_links":["https://ko-fi.com/shadowmonster"],"categories":["C++","Jump To"],"sub_categories":["Modded"],"readme":"\u003cdiv align=\"center\"\u003e\n\u003c!-- \u003cimg src=\"https://i.imgur.com/9qYPFSA.png\" alt=\"Alt text\" width=\"40\"\u003e\n  ## Millennium for Steam® --\u003e\n\n\u003ch3\u003e\u003cimg align=\"center\" height=\"40\" src=\"https://i.imgur.com/9qYPFSA.png\"\u003e \u0026nbsp; \u0026nbsp;Millennium for Steam®\u003c/h3\u003e\n\n\n\u003ckbd\u003e\n  \u003ca href=\"https://steambrew.app/discord\"\u003e\n      \u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/discord-green?labelColor=151B23\u0026color=151B23\u0026style=for-the-badge\u0026logo=discord\u0026logoColor=white\" href=\"#\"\u003e\n  \u003c/a\u003e\n\u003c/kbd\u003e\n\u003ckbd\u003e\n  \u003ca href=\"https://steambrew.app\"\u003e\n      \u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/website-green?labelColor=151B23\u0026color=151B23\u0026style=for-the-badge\u0026logo=firefoxbrowser\u0026logoColor=white\" href=\"#\"\u003e\n  \u003c/a\u003e\n\u003c/kbd\u003e\n\u003ckbd\u003e\n  \u003ca href=\"https://docs.steambrew.app\"\u003e\n      \u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/documentation-green?labelColor=151B23\u0026color=151B23\u0026style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\" href=\"#\"\u003e\n  \u003c/a\u003e\n\u003c/kbd\u003e\n\u003ckbd\u003e\n  \u003ca href=\"#\"  title=\"Lines of Code\"\u003e\n      \u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Floc-counter.onrender.com%2F%3Frepo%3Dshdwmtr%2Fmillennium%26branch%3Dmain%26languages%3DC%252B%252B%2CC%2520Header%26ignored%3Dvendor\u0026style=for-the-badge\u0026labelColor=%23151B23\u0026color=%23151B23\u0026logo=coderwall\u0026label=%20Lines of Code\u0026logoColor=white\"\u003e\n  \u003c/a\u003e\n\u003c/kbd\u003e\n\n\u003cbr\u003e\n\u003cbr\u003e\n\nMillennium is an **open-source low-code modding framework** to create, manage and use themes/plugins for the desktop Steam Client without any low-level internal interaction or overhead.\n\nIf you enjoy this tool, please consider starring the project ⭐\n\n\u003cbr\u003e\n\n\u003c!-- credits to https://github.com/clawdius for this intro video --\u003e\nhttps://github.com/user-attachments/assets/20dec435-ed47-4042-9fb7-38635480b850\n\n\n\n\u003cbr\u003e\n\u003c/div\u003e\n\n## Installation\n\n### Automatic Installation (Recommended)\n\n  Installing Millennium is only a few steps. See [this page](https://docs.steambrew.app/users/installing#automatic) for a more detailed guide.\n\n### Manual Installation\n\nFor normal users, installing via the installers makes the most sense. However when wanting to either develop Millennium, or when the installers do not work, this option can be used. Check our [documentation](https://docs.steambrew.app/users/installing#manual) for a guide on how to do this.\n\n\u0026nbsp;\n\n## Core Features\n\n- ### [Plugin Loader](/src/)\n  - **TypeScript ([React](https://react.dev/)) frontend** container in Steam\n  - **Python backend** container in [usermode](https://en.wikipedia.org/wiki/User-Mode_Driver_Framework)\n  - **[Foreign function interface](https://en.wikipedia.org/wiki/Foreign_function_interface)** binding from **Python** to **JavaScript** and vice versa\n  - **Hook modules in the Steam web browser**\n    - Overwrite/Modify HTTP requests\n    - Load custom JavaScript (Native) into web browser\n    - Load custom StyleSheets into web browser\n- ### [Core Modules](/assets/)\n  - Manage and load custom user themes into Steam\n  - Manage custom plugins for steam\n  - Maintain theme \u0026 plugin versions.\n  - Manage [embedded Python](https://www.python.org/downloads/release/python-3118/) installation\n    - Manage [Millennium Python Developer Tools](https://pypi.org/project/millennium/)\n    - Custom package manager for all plugins\n\n\u0026nbsp;\n\n## Adding Spoken Language Support\n\nTake a look [here](./assets#adding-languages), it quickly covers what files you'll need to edit in order to add your spoken language to Millennium!\n\n\u0026nbsp;\n\n## Creating Plugins \u0026 Themes\n\nCreating themes and plugins for Millennium is relatively straight foward. Our [documentation](https://docs.steambrew.app/developers) goes over the basics of both,\nand we have examples for both in [examples](./examples)\n\n\u0026nbsp;\n\n## Platform Support\n\n\nSupported Platforms:\n\n- Windows (x86/x64/ARM) NT (10 and newer)\n- Linux (x86/x86_64/i686/i386)\n- OSX (Support planned, WIP)\n\n\u0026nbsp;\n\n## Unix File Structure\n\n```bash\n/\n├─ usr/\n│  ├─ lib/\n│  │  ├─ millennium/\n│  │  │  ├─ libMillennium.so # millennium\n│  │  │  ├─ libpython-3.11.8.so # dynamically linked to millennium, allows user plugin backends to run\n├─ home/\n│  ├─ $user/\n│  │  ├─ .local/share\n│  │  │  ├─ millennium/\n│  │  │  │  ├─ lib/\n│  │  │  │  │  ├─ assets/ # builtin plugin that provides base functionality for millennium.\n│  │  │  │  │  ├─ cache/ # a cached, minimal, production build of python's runtime deps, used to run and manage plugins\n│  │  │  │  │  ├─ shims/\n│  │  │  │  ├─ logs/\n│  │  │  │  ├─ plugins/ # user plugins\n│  │  ├─ .config/\n│  │  │  ├─ millennium/ # config files\n```\n\n## Building from source\n\n### Windows 10/11\n\nBuilding Millennium will require a long list of steps, however everything should work smoothly given you follow the instructions\n\nThe following guide includes the installation of the following:\n- [MSYS2](https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20241208.exe) (MinGW32 specifically)\n- [Visual Studio Build Tools ](https://aka.ms/vs/17/release/vs_BuildTools.exe)\n\n### Build Steps\n1. Download and install [MSYS2](https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20241208.exe)\n1. Download and install [Visual Studio Build Tools](https://aka.ms/vs/17/release/vs_BuildTools.exe)\n1. Run `Developer PowerShell for VS 2022` installed from the previous step.\n1. Navigate to somewhere you want to build to\n1. Next, open Powershell to download and build Python 3.11.8 (Win32).\n\n    - Download \u0026 Extract Python 3.11.8\n      ```bash\n      $ curl -o python3.11.8.tgz https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz\n      $ tar -xzvf python3.11.8.tgz\n      $ cd python-3.11.8\n      ```\n\n    - Update Build Configuration to be MultiThreaded\n      ```ps1\n      $ (Get-Content \"PCbuild/pythoncore.vcxproj\" -Raw) -replace '\u003c/ClCompile\u003e', '\u003cRuntimeLibrary Condition=\"`$(Configuration)|`$(Platform)\"==\"Release|Win32\"\u003eMultiThreaded\u003c/RuntimeLibrary\u003e\u003cRuntimeLibrary Condition=\"`$(Configuration)|`$(Platform)\"==\"Debug|Win32\"\u003eMultiThreadedDebug\u003c/RuntimeLibrary\u003e\u003c/ClCompile\u003e' | Set-Content \"PCbuild/pythoncore.vcxproj\"\n      ```\n\n    - Bootstrap Python builder\n      ```bash\n      $ ./PCbuild/get_externals.bat\n      ```\n\n    - Build Python\n      ```bash\n      $ msbuild PCBuild/pcbuild.sln /p:Configuration=Release /p:Platform=Win32 /p:RuntimeLibrary=MT\n      $ msbuild PCBuild/pcbuild.sln /p:Configuration=Debug /p:Platform=Win32 /p:RuntimeLibrary=MT\n      ```\n\n    - Check Python version\n      ```bash\n      $ ./PCbuild/win32/python.exe --version\n      ```\n\n    - Check the following items have been built, you'll need them later\n      ```bash\n      # Release binaries, required for building Millennium in release mode\n      PCbuild/win32/python311.dll\n      PCbuild/win32/python311.lib\n      # Debug binaries, required for building Millennium in debug mode\n      PCbuild/win32/python311_d.dll\n      PCbuild/win32/python311_d.lib\n      ```\n\n1. Now, open MSYS2, any of the shells should work fine.\n1. Run the following and close the shell.\n   ```bash\n    $ pacman -Syu\n    $ pacman -S mingw-w64-i686-cmake\n    $ pacman -S --needed base-devel mingw-w64-i686-toolchain\n    $ pacman -S git\n   ```\n1. Open CMD, and navigate to somewhere you want to build millennium and then run:\n`C:\\msys64\\msys2_shell.cmd -defterm -no-start -mingw32` this will put you in the MinGW shell\n1. Clone the Millennium repository\n    ```cmd\n    $ git clone https://github.com/shdwmtr/millennium --recursive\n    $ cd millennium\n    ```\n1. From the previous step, where we built python, copy the files to `%MILLENNIUM_SRC_DIR%/vendor/python`\n1. Build Millennium\n    ```bash\n    $ cmake --preset=\"windows-mingw-debug\"\n    # or for release\n    $ cmake --preset=\"windows-mingw-release\"\n    $ cmake --build ./build\n    ```\n\n1. Next, you'll need to build Millenniums internal plugin from source.\nYou can install NodeJs from MinGW, or you could use your local install from PowerShell/CMD\n\n    ```bash\n    $ cd \"%MILLENNIUM_SRC_DIR%/assets\"\n    $ npm install\n    $ npm run dev\n    ```\n\n    Millennium expects these shim assets to be at `%MILLENNIUM_DIR%/ext/data/assets`\n\n    where `%MILLENNIUM_DIR%` is:\n    - Steam path (default `C:\\Program Files (x86)\\Steam`) on Windows\n    - `~/.millennium` on Unix\n\n    You can either symlink them or copy them over.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshdwmtr%2Fmillennium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshdwmtr%2Fmillennium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshdwmtr%2Fmillennium/lists"}