diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1b076ebc1..a1626c2cd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,15 +1 @@ -# Lines starting with '#' are comments. -# Each line is a file pattern followed by one or more owners. - -# More details are here: https://help.github.com/articles/about-codeowners/ - -# The '*' pattern is global owners. - -# Order is important. The last matching pattern has the most precedence. -# The folders are ordered as follows: - -# In each subsection folders are ordered first by depth, then alphabetically. -# This should make it easy to add new rules without breaking existing ones. - -# Global rule: -* @ClaraCrazy +* @Willy-JL @Sil333033 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index b70b073d7..a9c2e81cc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,13 +1,2 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: crazyco -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +ko_fi: willyjl +custom: ["https://bunq.me/WillyJL", "https://paypal.me/willyjl1"] diff --git a/.github/assets/badkb.png b/.github/assets/badkb.png new file mode 100644 index 000000000..dd2e08131 Binary files /dev/null and b/.github/assets/badkb.png differ diff --git a/.github/assets/logo.png b/.github/assets/logo.png new file mode 100644 index 000000000..c9499ce07 Binary files /dev/null and b/.github/assets/logo.png differ diff --git a/.github/assets/packs-done.png b/.github/assets/packs-done.png new file mode 100644 index 000000000..8e10de573 Binary files /dev/null and b/.github/assets/packs-done.png differ diff --git a/.github/assets/packs-folder.png b/.github/assets/packs-folder.png new file mode 100644 index 000000000..13ba6a94a Binary files /dev/null and b/.github/assets/packs-folder.png differ diff --git a/.github/assets/packs-select.png b/.github/assets/packs-select.png new file mode 100644 index 000000000..4aaadb86e Binary files /dev/null and b/.github/assets/packs-select.png differ diff --git a/.github/assets/settings.png b/.github/assets/settings.png new file mode 100644 index 000000000..bd72696f7 Binary files /dev/null and b/.github/assets/settings.png differ diff --git a/.github/workflow_data/devbuild.py b/.github/workflow_data/devbuild.py index 3a2d8facc..2f00e8a87 100644 --- a/.github/workflow_data/devbuild.py +++ b/.github/workflow_data/devbuild.py @@ -5,26 +5,21 @@ import requests import json import os -dev_share = os.environ["NC_HOST"] + "s/sGHsQB94a9x5CRs/download?path=/&files={files}" +dev_share_id = "" +dev_share = os.environ["NC_HOST"] + f"s/{dev_share_id}/download?path=/&files={{files}}" if __name__ == "__main__": with open(os.environ["GITHUB_EVENT_PATH"], "r") as f: event = json.load(f) client = nextcloud_client.Client(os.environ["NC_HOST"]) - _session = requests.session - def session(*args, **kwargs): - s = _session(*args, **kwargs) - s.headers["User-Agent"] = os.environ["NC_USERAGENT"] - return s - requests.session = session client.login(os.environ["NC_USER"], os.environ["NC_PASS"]) for file in ( os.environ["ARTIFACT_TGZ"], os.environ["ARTIFACT_SDK"], ): - path = f"XFW-Dev/{file}" + path = f"MNTM-Dev/{file}" # try: # client.delete(path) # except Exception: @@ -38,7 +33,7 @@ if __name__ == "__main__": "content": None, "embeds": [ { - "title": "Devbuild infos:", + "title": "New Devbuild:", "description": "", "url": "", "color": 16734443, @@ -58,12 +53,12 @@ if __name__ == "__main__": ], "author": { "name": "Build Succeeded!", - "icon_url": "https://cdn.discordapp.com/emojis/1080005692485795930.png" - }, - "footer": { - "text": "Build go brrrr", - "icon_url": "https://cdn.discordapp.com/emojis/1059798228725403719.png" + # "icon_url": "" }, + # "footer": { + # "text": "Build go brrrr", + # "icon_url": "" + # }, "timestamp": dt.datetime.utcnow().isoformat() } ], diff --git a/.github/workflow_data/hotfix.py b/.github/workflow_data/hotfix.py deleted file mode 100644 index 91a60868f..000000000 --- a/.github/workflow_data/hotfix.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -import datetime as dt -import requests -import pathlib -import json -import sys -import os -import re - -if __name__ == "__main__": - with open(os.environ["GITHUB_EVENT_PATH"], "r") as f: - event = json.load(f) - - release = requests.get( - event["repository"]["releases_url"].rsplit("{/")[0] + "/latest", - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}" - } - ).json() - - artifacts = { - os.environ['ARTIFACT_TGZ']: "application/gzip", - os.environ['ARTIFACT_ZIP']: "application/zip", - os.environ['ARTIFACT_SDK']: "application/zip", - } - - for asset in release["assets"]: - req = requests.delete( - asset["url"], - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}" - } - ) - if not req.ok: - print(f"{req.url = }\n{req.status_code = }\n{req.content = }") - sys.exit(1) - - for artifact, mediatype in artifacts.items(): - req = requests.post( - release["upload_url"].rsplit("{?", 1)[0], - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}", - "Content-Type": mediatype - }, - params={ - "name": artifact - }, - data=pathlib.Path(artifact).read_bytes() - ) - if not req.ok: - print(f"{req.url = }\n{req.status_code = }\n{req.content = }") - sys.exit(1) - - hotfix_time = dt.datetime.now().strftime(r"%d-%m-%Y %H:%M") - hotfix_desc = event['pull_request']['body'] - hotfix = f"- `{hotfix_time}`: {hotfix_desc}\n" - - body = release["body"] - body = re.sub( - r"(https://github\.com/Flipper-XFW/Xtreme-Firmware/releases/download/[A-Za-z0-9_-]+?/)[A-Za-z0-9_-]+", - r"\1" + os.environ['VERSION_TAG'], - body - ) - body = body.replace("", "") - insert = body.find("\n [//]: \n") - body = body[:insert] + hotfix + body[insert:] - - req = requests.patch( - release["url"], - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}" - }, - json={ - "body": body - } - ) - if not req.ok: - print(f"{req.url = }\n{req.status_code = }\n{req.content = }") - sys.exit(1) - - changelog = body.split("## 🚀 Changelog", 1)[1] - with open(os.environ["ARTIFACT_TGZ"].removesuffix(".tgz") + ".md", "w") as f: - f.write(changelog.strip() + "\n\n") diff --git a/.github/workflow_data/release.md b/.github/workflow_data/release.md index f3fdab973..f556bfb57 100644 --- a/.github/workflow_data/release.md +++ b/.github/workflow_data/release.md @@ -1,30 +1,32 @@ ## ⬇️ Download ->### [🖥️ Web Updater (chrome)](https://flipper-xtre.me/update) [recommended] +>### [🖥️ Web Updater (chrome)](https://momentum-fw.dev/update) [recommended] ->### [🐬 qFlipper Package (.tgz)](https://github.com/Flipper-XFW/Xtreme-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_TGZ}) +>### [🐬 qFlipper Package (.tgz)](https://github.com/Next-Flip/Momentum-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_TGZ}) ->### [📦 Zipped Archive (.zip)](https://github.com/Flipper-XFW/Xtreme-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_ZIP}) +>### [📦 Zipped Archive (.zip)](https://github.com/Next-Flip/Momentum-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_ZIP}) -**Check the [install guide](https://github.com/Flipper-XFW/Xtreme-Firmware#install) if you're not sure, or [join our Discord](https://discord.gg/flipper-xtreme) if you have questions or encounter issues!** +**Check the [install guide](https://github.com/Next-Flip/Momentum-Firmware#install) if you're not sure, or [join our Discord](https://discord.gg/momentum) if you have questions or encounter issues!** ## ❤️ Support -If you like what you're seeing, **please consider donating to us**. We won't ever put this behind a paywall, but we'd still appreciate a few bucks! +If you enjoy the firmware, please consider donating to the team, or sharing it with others! :D -- **[Patreon](https://patreon.com/CynthiaLabs)**: ❤️ Account needed, subscription with perks across my entire org. -- **[Wire-transfer](https://bunq.me/ClaraK)**: No account needed, one-time -- **[Paypal](https://paypal.me/RdX2020)**: Account needed, one-time -- **[ko-fi](https://ko-fi.com/cynthialabs)**: No account needed, one-time -- **Monero**: `41kyWeeoVdK4quzQ4M9ikVGs6tCQCLfdx8jLExTNsAu2SF1QAyDqRdjfGM6EL8L9NpXwt89HJeAoGf1aoArk7nDr4AMMV4T` +> **[Ko-fi](https://ko-fi.com/willyjl)**: One-off or Recurring, No signup required -**Thanks for all your support <3** +> **[Bank transfer](https://bunq.me/WillyJL)**: One-off, No signup required + +> **[PayPal](https://paypal.me/willyjl1)**: One-off, Signup required + +> **BCH**: `1EnCi1HF8Jw6m2dWSUwHLbCRbVBCQSyDKm` + +> **ETH**: `0x90b8284c3eba44108427e3148ff8efa0ae7a61a8` + +> **BTC**: `1EnCi1HF8Jw6m2dWSUwHLbCRbVBCQSyDKm` + +> **SHIB**: `0x90b8284c3eba44108427e3148ff8efa0ae7a61a8` + +> **DOGE**: `DNUdUqtmWaAiJ6yoV6hRNEh6Nn1Tg4Aorr` + +**Thank you <3** ## 🚀 Changelog {CHANGELOG} - - diff --git a/.github/workflow_data/version.sh b/.github/workflow_data/version.sh index 7803bd3e9..2e98c4b04 100644 --- a/.github/workflow_data/version.sh +++ b/.github/workflow_data/version.sh @@ -6,8 +6,8 @@ import json import os with open(os.environ["GITHUB_EVENT_PATH"], "r") as f: event = json.load(f) -version = int(event["pull_request"]["title"].removeprefix("V").removesuffix(" Release").removesuffix(" Hotfix")) +version = int(event["pull_request"]["title"].removeprefix("V").removesuffix(" Release") date = dt.datetime.now().strftime("%d%m%Y") -print(f"XFW-{version:04}_{date}", end="") +print(f"MNTM-{version:03}_{date}", end="") ''')" echo "VERSION_TAG=${VERSION_TAG}" >> $GITHUB_ENV diff --git a/.github/workflow_data/webupdater.py b/.github/workflow_data/webupdater.py index e9a861aaa..b30fc17fe 100644 --- a/.github/workflow_data/webupdater.py +++ b/.github/workflow_data/webupdater.py @@ -5,16 +5,10 @@ import os if __name__ == "__main__": client = nextcloud_client.Client(os.environ["NC_HOST"]) - _session = requests.session - def session(*args, **kwargs): - s = _session(*args, **kwargs) - s.headers["User-Agent"] = os.environ["NC_USERAGENT"] - return s - requests.session = session client.login(os.environ["NC_USER"], os.environ["NC_PASS"]) file = os.environ["ARTIFACT_TGZ"] - path = f"XFW-Updater/{file}" + path = f"MNTM-Release/{file}" try: client.delete(path) except Exception: @@ -34,7 +28,7 @@ if __name__ == "__main__": os.environ['ARTIFACT_TGZ'], os.environ['ARTIFACT_TGZ'].removesuffix(".tgz") + ".md" ) - for file in client.list("XFW-Updater"): + for file in client.list("MNTM-Release"): if file.name.startswith(version) and file.name not in files: try: client.delete(file.path) diff --git a/.github/workflows/hotfix.yml b/.github/workflows/hotfix.yml deleted file mode 100644 index 2357afd4d..000000000 --- a/.github/workflows/hotfix.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: "Hotfix" - -on: - pull_request_review: - types: [submitted] - -env: - TARGETS: f7 - DEFAULT_TARGET: f7 - -jobs: - hotfix: - if: | - github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name && - endsWith(github.event.pull_request.title, ' Hotfix') && - github.event.review.author_association == 'OWNER' && - startsWith(github.event.pull_request.title, 'V') && - github.event.pull_request.base.ref == 'main' && - github.event.pull_request.head.ref == 'dev' && - github.event.pull_request.state == 'open' && - github.event.pull_request.draft == false && - github.event.review.state == 'APPROVED' - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - - name: 'Checkout code' - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.sha }} - - - name: "Read version tag" - run: bash .github/workflow_data/version.sh - - - name: 'Build the firmware' - run: | - set -e - for TARGET in ${TARGETS}; do - TARGET_HW="$(echo "${TARGET}" | sed 's/f//')"; \ - ./fbt TARGET_HW=$TARGET_HW DIST_SUFFIX=$VERSION_TAG updater_package - done - - - name: "Check for uncommitted changes" - run: | - git diff --exit-code - - - name: "Make tgz, zip and sdk" - run: bash .github/workflow_data/package.sh - - - name: "Upload hotfix" - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - run: | - python -m pip install requests - python .github/workflow_data/hotfix.py - - - name: "Upload to webupdater" - env: - NC_HOST: "https://cloud.cynthialabs.net/" - NC_USERAGENT: "${{ secrets.NC_USERAGENT }}" - NC_USER: "${{ secrets.NC_USER }}" - NC_PASS: "${{ secrets.NC_PASS }}" - run: | - python -m pip install pyncclient - python .github/workflow_data/webupdater.py - - - name: "Merge pull request" - uses: "pascalgn/automerge-action@v0.15.6" - env: - MERGE_LABELS: "" - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/webhook.yml b/.github/workflows/webhook.yml index 6ea140c62..1de0b1de2 100644 --- a/.github/workflows/webhook.yml +++ b/.github/workflows/webhook.yml @@ -13,7 +13,6 @@ on: workflow_run: workflows: - "Build" - - "Hotfix" - "Lint" - "Release" - "SonarCloud" diff --git a/.gitmodules b/.gitmodules index 0dd8d045e..642cd8979 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "applications/external"] path = applications/external - url = https://github.com/Flipper-XFW/Xtreme-Apps.git + url = https://github.com/Next-Flip/Momentum-Apps.git [submodule "lib/mlib"] path = lib/mlib url = https://github.com/P-p-H-d/mlib.git diff --git a/ReadMe.md b/ReadMe.md index c1ee8b816..6d64ebf9b 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,81 +1,68 @@ -

XFW - Xtreme Firmware for the Flipper Zero

-

- + Momentum Firmware +

for Flipper Zero

- Website | Intro | Install | Changelog | Wiki | Discord | Donate + Install | Features | Discord | Donate

-This firmware is an extensive overhaul of the [Official Firmware](https://github.com/flipperdevices/flipperzero-firmware), and also features most of the awesome code-bits from [Unleashed](https://github.com/DarkFlippers/unleashed-firmware). +This custom firmware is based on the [Official Firmware](https://github.com/flipperdevices/flipperzero-firmware), and features most of the awesome features from [Unleashed](https://github.com/DarkFlippers/unleashed-firmware). It is a direct continuation of the Xtreme firmware, built by the same (and only) developers who made that project special, until being unfairly thrown out. -----
-

What makes it special?

+

Modus Operandi:

-We have spent many hours perfecting this code even further, and getting the most out of it. - -The goal of this Firmware is to regularly bring out amazing updates based on what the community wants, with an actual understanding of whats going on. Fixing bugs that are regularly talked about, broadening the capabilities of the Flipper with new exciting functionality, and most importantly, ensuring the easiest user experience possible. +The goal of this firmware is to constantly push the bounds of what is possible with Flipper Zero, driving the innovation of many new groundbreaking features, while maintaining the easiest and most customizable user experience of any firmware. Fixing bugs promptly and ensuring a stable and compatible system is also of our utmost importance.

--

Feature-rich: We include all commonly found apps in the firmware, as long as they work.

+-

Feature-rich: We include all third-party features and apps as long as they fulfill a useful purpose and they work correctly, aswell as implement ourselves many new exciting functionalities.

--

Stable: Many hours have been spent rewriting core parts of the Flipper's firmware as well as some of its apps to ensure stability. A task that was long needed on all Firmware, so we tackled it right away.

+-

Stable: We ensure the most stable experience possible by having an actual understanding of what's going on, and proactively making all tweaks and additions backwards-, and inter-, compatible.

--

Customizable: Dont like the Animations, want to turn on/off the Home screen icons (battery, SD card etc), change the flippers name or anything like that? You absolutely can. No need to mess with code or deal with weird manifest files. Its all done with an App.

+-

Customizable: You can tweak just about everything you see: add/remove apps from the menu, change the animations, replace icon graphics, change your Flipper's name, change how the main menu looks, setup different keybinds like never before, and so much more. All on-device, with no complicated configuration.



-Note, the below mentioned changes are only a few things we did. For a full list check [down here](https://github.com/Flipper-XFW/Xtreme-Firmware#List-of-Changes) +Note that mentioned below are only a few of our staple additions to the firmware. For a full list check [down here](https://github.com/Next-Flip/Momentum-Firmware#List-of-Changes). -----
-

Xtreme Settings:

+

Momentum Settings:

-We wrote a powerful yet easy-to-use application specifically for our Firmware, that gives you easy-access to most of the fancy things we implemented: +We offer a powerful and easy-to-use application tailor-made for our firmware, that lets you configure everything you could dream of, and more: - - - + -- Interface: Customize every bit of your Flipper, from the desktop animations, to the main menu apps, lockscreen style etc. +- Interface: Tweak every part of your Flipper, from the desktop animations, to the main menu, lockscreen behavior, file browser, etc. -- Protocols: Here you can configure BadKB, manage custom Subghz frequencies, and setup the GPIO pins mappings. +- Protocols: Configure SubGhz settings, add/remove custom frequencies, and setup which GPIO pins are used by different external modules. -- Misc: All the other options that don't fit elsewhere. Change your Flipper's name, xp level, and configure the RGB backlight. +- Misc: Everything else that doesn't fit the previous categories. Change your Flipper's name, XP level, screen options, and configure the RGB backlight.
-----
-

Animations / Asset Packs: -

Want to try some asset packs? Check here -

- +

Animations / Asset Packs:

-We created our own improved Animation / Asset system that lets you create and cycle through your own `Asset Packs` with only a few button presses, allowing you to easily load custom Animations, Icons and Fonts like never before. +We created our own improved Animation / Asset system that lets you create and cycle through your own `Asset Packs` with only a few button presses, allowing you to easily load custom Animations, Icons and Fonts like never before. Think of it as a Theme system that's never been easier. - -You can easily create your own pack, or find some user made ones on our website or on discord. Check here for a tutorial on creating your own. Essentially, each Asset Pack can configure its own Anims, Icons & Fonts. + +You can easily create your own pack, or find some community-made ones on our website or on Discord. Check here for a tutorial on creating your own. Essentially, each Asset Pack can configure its own Anims, Icons & Fonts.

- -Once you have some packs, upload them to your Flipper in SD/asset_packs (if you did this right you should see SD/asset_packs/PackName/Anims and/or SD/asset_packs/PackName/Icons). + +Once you have some asset packs, upload them to your Flipper in SD/asset_packs (if you did this right you should see SD/asset_packs/PackName/Anims and/or SD/asset_packs/PackName/Icons). Alternatively, install directly using the website.

- -After installing the packs to Flipper, hit the Arrow UP button on the main menu and go to Xtreme Settings. Here choose which pack you want and tweak the other settings how you prefer, then press back to reboot and enjoy your newly fully customized Flipper! + +After installing the packs to Flipper, hit the Arrow Up button on the main menu and go to Momentum Settings > Interface > Graphics. Here choose which asset pack you want and tweak the other settings how you prefer, then exit the app to reboot and enjoy your fully customized Flipper!
@@ -83,45 +70,41 @@ After installing the packs to Flipper, hit the Arrow UP button on t

Bad Keyboard:

- - -BadUSB is a wonderful app, but it lacks bluetooth capabilities. Now some might argue that its useless as you will always need authentication from both sides, but what if I told you that we found a solution to this problem? -

-Bad-KB allows you to toggle between USB and Bluetooth mode for your attacks. In Bluetooth mode it allows you to spoof the name & MAC of the device to whatever you want. Being a JBL speaker or a wireless razer keyboard is easily doable, allowing you to trick people so you can run your payloads without needing a cable at hand. + +BadUSB is a great app, but it lacks Bluetooth connectivity. Bad-KB allows you to toggle between USB and Bluetooth mode for your attacks. ------ -
-

Levels:

+In Bluetooth mode it allows you to spoof the display name and MAC address of the device to whatever you want. Showing up as a portable speaker or a wireless keyboard is easily doable, allowing you to get the attention of your target without needing a cable at hand. -This Firmware has 30 levels, not just the basic 3 the official one has. - -With this new system in place, it allows for some cool stuff like locking animations behind a certain level. This can be done fairly easy: The idle_animations are tied to the level system. Specifically, the `Min level` variable of your manifest file is used here. Each level you reach, unlocks a new animation. The higher your level, the more animations people can see. +In USB mode it also enables additional functionality to spoof the manufacturer and product names, as well as vendor and product IDs (VID/PID). -----

List of changes:

-There are too many to name them all, this is a **non-comprehensive** list of the **most notable from an end-user perspective**. For a more detailed list, read through the [**changelogs**](https://github.com/Flipper-XFW/Xtreme-Firmware/releases) and commits/code. Also, you can find a **feature comparison with other firmwares** on [our website](https://flipper-xtre.me/#features). +There are too many to name them all, this is a **non-comprehensive** list of the **most notable from an end-user perspective**. For a more detailed list, you can read through the [**changelogs**](https://github.com/Next-Flip/Momentum-Firmware/releases) and commits/code. Also, you can find a **feature comparison with other firmwares** on [our website](https://momentum-fw.dev/#features). Note that this repo is always updated with the great work from our friends at [Unleashed](https://github.com/DarkFlippers/unleashed-firmware) and the latest changes from [OFW](https://github.com/flipperdevices/flipperzero-firmware). Below are mentioned only **our** changes that we can actually be credited for, so make sure to check their fantastic additions aswell. And a huge thank you to both teams! ```txt [Added] -- Xtreme App (Easy configuration of most features exclusive to Xtreme) +- Momentum App (Easy configuration of features and behavior of the firmware) - Asset Packs (Unparalleled theming and customization) - More UI customization, redesigns and optimizations - Bad-Keyboard App - BLE Spam App +- NFC Maker App - Wardriver App - File Search across SD Card -- Easy spoofing (Name, Mac, Serial) - Additional NFC parsers and protocols - Subdriving (saving GPS coordinates for Sub-GHz) +- Easy spoofing (Name, MAC address, Serial number) - Enhanced RGB Backlight modes (Full customization & Rainbow mode) - File management on device (Cut, Copy, Paste, Show, New Dir, etc.) +- Remember Infrared GPIO settings and add IR Blaster support in apps - Advanced Security measures (Lock on Boot, reset on false pins, etc.) -- Remember Infrared GPIO and IR Blaster auto-detection + support in apps +- Disk Image management (Mount and view image contents, open in Mass Storage) +- Extended JavaScript API (Support for UsbDisk/Mass Storage, File operations) ``` ```txt [Updated] @@ -129,12 +112,12 @@ Note that this repo is always updated with the great work from our friends at [U - Enhanced WiFi support for easiest setup ever - Extended keyboard with cursor movevent and symbols - File Browser with Sorting, More supported File Types -- Advanced and optimized Level System (Read more above) -- Storage backend with instant rename and more optimizations +- Advanced and optimized Level System (Up to 30 levels) - Desktop Keybind system for full key and press/hold remapping +- Storage backend with instant rename and virtual mounting for disk images - Weather Station, POCSAG, TPMS protocols and more integrated into Sub-GHz - Expanded Sub-GHz App (Duplicate detection & Ignore, Autosave, History improvements) -- Improved Error Messages (Showing actual root) +- Improved Error Messages (Showing source file paths) ``` ```txt [Removed] @@ -148,26 +131,27 @@ Note that this repo is always updated with the great work from our friends at [U

Install:


-There are 3 methods to install Xtreme, we recommend you use the **Web Updater**, but choose whichever one you prefer: +There are 3 methods to install Momentum, we recommend you use the **Web Updater**, but choose whichever one you prefer:
>
Web Updater (Chrome)
>
qFlipper Package (.tgz)
>
Zipped Archive (.zip)