3.0-peridot-20260912-0407-OFFICIAL ================================== Input method * LeanType no longer crashes when the suggestion strip is not created yet. A selection update used to kill the keyboard. Nullroute * The boot seeder now decodes the baked baseline. Filtering was staying off (nobaseline / nomap) on every boot. Edge * Auto Game Mode when a game is in front: Edge gestures mute and the global input filter disarms. Leaving the game clears only the auto hold. UI * Cards, type and QS pills follow one BestROM chrome: 22dp cards, Space Grotesk, Doto for the clock, pill tile radii. 3.0-peridot-20260911-1758-OFFICIAL ================================== Charging speed * Sepolicy labels vendor.lineage.health (and bestrom aliases) so Settings → Battery → Charging speed binds. Modes match peridot: Slow=0, Fast=1 (default), Super=2. * FastChargeController retries waitForDeclaredService if the HAL races at boot. Input / gestures * Goodix edge filter stays off outside game mode. * Edge TOP-only claim; BestromAgent canPerformGestures=false; gestural back inset 8dp. Upstream (VoltageOS 17) * Platform security patch 2026-09-01. * Settings and frameworks/base security hardening (intent redirect, PduParser, URI grants, credential flows). * Skipped: GameSpace, default wallpaper, ParanoidSense voltageos rename (kept com.bestrom.faceunlock). HAL rename audit * Dual lineage+bestrom service/file contexts for health, livedisplay, powershare. Touch remains fully vendor.bestrom.touch. 3.0-peridot-20260911-1758-OFFICIAL ================================== Charging speed * Sepolicy labels vendor.lineage.health (and bestrom aliases) so Settings → Battery → Charging speed binds. Modes match peridot: Slow=0, Fast=1 (default), Super=2. * FastChargeController retries waitForDeclaredService if the HAL races at boot. Input / gestures * Goodix edge filter stays off outside game mode. * Edge TOP-only claim; BestromAgent canPerformGestures=false; gestural back inset 8dp. Upstream (VoltageOS 17) * Platform security patch 2026-09-01. * Settings and frameworks/base security hardening (intent redirect, PduParser, URI grants, credential flows). * Skipped: GameSpace, default wallpaper, ParanoidSense voltageos rename (kept com.bestrom.faceunlock). HAL rename audit * Dual lineage+bestrom service/file contexts for health, livedisplay, powershare. Touch remains fully vendor.bestrom.touch. 3.0-peridot-20260911-1320-OFFICIAL ================================== Touch and Edge * Goodix: keep the firmware edge filter off outside game mode (same as FocalTech). Level 2 in normal mode rejected near-bezel horizontal motion and broke Telegram/WhatsApp swipe-to-reply on Goodix panels. * Edge is shipped again. Left, right and bottom edges always passthrough continuous touches; only the top edge may claim. The global input filter arms only when a top zone is assigned and the IME is not visible. * EdgeLoader skips when persist.bestrom.edge.disable=1 or the package is disabled, and disarms the input hook. * Gestural back inset is 8dp (was 30dp / 90px). FrameworkOverlayPeridot is product_specific so it can win over the gestural overlay. * BestromAgent no longer requests canPerformGestures, which armed a device-wide AccessibilityInputFilter. SystemUI and display * Do not cancel the keyguard exit animation when the shade expands; that left a stuck KEYGUARD shade over the resumed app. * SurfaceFlinger touch boost 300 ms; content-detection refresh-rate voting off (was parking the panel at 60 Hz). Boot / charge * Default thermal profile is idle (0), not mgame (19). Charge limits clear after boot_complete. Optical UDFPS props are forced so a dirty flash cannot leave an ultrasonic overlay armed. 3.0-peridot-20260909-0059-OFFICIAL ================================== Changes since 2026-09-08-2346 ----------------------------- Agent mode * Fixed: there was no way into Agent mode from Settings. The rows had been added to a Custom Tweaks screen that nothing displays, so the feature shipped in 2346 with no entry point. They are on the Advanced tab now. Everything else in this build is unchanged from 2026-09-08-2346, whose notes follow. Changes since 2026-09-07-1010 3.0-peridot-20260908-2346-OFFICIAL ================================== Changes since 3.0-peridot-20260907-1010-OFFICIAL device/xiaomi/peridot * peridot: Turn off window blur * overlay: BestROM type system and dark defaults * overlay: Pill QS tiles and tighter notifications * peridot: Stamp the BestROM version into mtdoops * peridot: Drop GameSpace from the debloat list * peridot: Hold a black screen through shutdown vendor/bestrom * vendor: Add the BestROM MCP server * vendor: Document the tree for agents (AGENTS.md) * manifest: Copy AGENTS.md and .mcp.json to the root * manifest: Use the migrated repo names and branch 17 * vendor: Document how to get the source * vendor: Ship Cromite as the system WebView * vendor: Replace LatinIME with LeanType * vendor: update changelog for WebView and keyboard * vendor: Default LeanType to full keyboard size * vendor: Preinstall MiXplorer as a removable app * vendor: Fetch the Cromite WebView at build time * vendor: Skip release signing for the preloads * vendor: Record the MiXplorer preload grant * vendor: Document LeanType size, network and source * vendor: Ship Doto and Space Grotesk * config: Set org.bestrom.version to the ROM version * vendor: Note the Settings restyle in the changelog * manifest: Drop GameSpace * tools: Accept repo-local commit areas * manifest: Track the sepolicy fork * vendor: Note that the LeanType fork is public * vendor: Ship the Edge gesture app * manifest: Track the Edge app * vendor: Turn on the Settings device-state app functions * vendor: Ship BestromAgent * vendor: Add the Agent mode MCP tools * vendor: Document driving the phone * vendor: Take the WebView from the BestROM Cromite fork * tools: Match the agent bridge wire format * tools: Redact the agent pairing code * tools: Say what Agent mode really refuses * tools: Follow the bridge's final error surface * tools: Narrow the denylist claim in the README * tools: Accept BestromAgent as a commit area * vendor: Note the on-device agent runner * vendor: Correct the Agent mode notes * vendor: Wire up Nullroute * manifest: Track the resolver fork * manifest: Track the system/core fork * manifest: Track the Dialer on the BestROM fork * vendor: Ship the Nullroute app frameworks/base * base: enforce the hide developer status list * base: spoof ADB system properties for hide-developer-status apps * base: Hide the adb-disabled flag from spoofed apps * FontController: drop regex from the create path * SettingsProvider: allow seeding pure black * SystemUI: monochrome palette and black surfaces * SystemUI: Use the BestROM mark in the logo chip * base: Skip the developer-status check when isolated * SystemUI: Give a new keyguard clock the current time zone * base: Drop the GameSpace manager service * frameworks/base: Add the Edge input hook surface * SystemUI: Add a charging bolt to the text battery * frameworks/base: Log when the Edge input hook is armed packages/apps/Settings * Settings: remove the dead app backup row * Settings: read ro.bestrom.build.status again * Settings: restore legal category in About phone * Settings: Add the BestROM homepage resources * Settings: Restyle the homepage search bar * Settings: Add a BestROM header to the homepage * Settings: Fork the homepage row layout * Settings: Give each homepage row its own card * Settings: Show values on homepage rows * Settings: Add a device card to the homepage * Settings: Use the ROM row style on sub-pages * Settings: Show the BestROM version on About phone * Settings: Drop the unused Powerhub icon * Settings: Return after the device-state keyguard refusal packages/apps/SetupWizard * SetupWizard: Fix the Updater package name packages/apps/Updater * Updater: Replace the VoltageOS banner packages/apps/Launcher3 * Launcher3: Opaque app drawer by default * Launcher3: Generate the app functions index xml packages/apps/Dialer * Dialer: Let a call carry a note * Dialer: Add a reverse lookup provider the user points device/voltage/sepolicy * sepolicy: Add the Nullroute policy * sepolicy: Keep the nullroute index path out of m4 kernel/xiaomi/sm8635 * README: Note the DRM clones revert, ReSukiSU bump and QRTR caps in 2.8 packages/apps/Edge * Edge: Import EdgeX a0d415a * Edge: Build as a BestROM system app * Edge: Drop the premium and update-check surface * Edge: Replace the Xposed hooks with the framework hook surface * Edge: Harden the system_server half of the port * Edge: Remove leftovers of the dropped features * Edge: Drop every root path * Edge: Follow the BestROM palette and row style * Edge: Give the BestROM preset an overlay colour * Edge: Stop telling the user to check root * Edge: Restart SystemUI from system_server * Edge: Make the app look like a ROM feature * Edge: Replace the launcher icon * Edge: Stop dropping every event we are handed * Edge: Keep the shortcut picker working after an update packages/apps/BestromAgent * BestromAgent: Add the app skeleton * BestromAgent: Add the bridge and the accessibility half * BestromAgent: Add the settings screen and the audit log * BestromAgent: Stop promising controls the platform lacks * BestromAgent: Authenticate the socket peer * BestromAgent: Harden pairing and the audit log * BestromAgent: Close the launch and settings entry surfaces * BestromAgent: Align the wire format with the host * BestromAgent: Refuse excluded packages in app functions and launches * BestromAgent: Add the OpenAI-compatible brain client * BestromAgent: Add the tool surface the model sees * BestromAgent: Add the action policy * BestromAgent: Add the task runner * BestromAgent: Add the task screen * BestromAgent: Add the assistant entry and the brain settings * BestromAgent: Document the runner, the brain and what is not defended * BestromAgent: Reset the stuck counters when the screen moves * BestromAgent: Parse the endpoint with the platform * BestromAgent: Keep app names out of the system role * BestromAgent: Make the envelope unforgeable * BestromAgent: Refuse sensitive screens by tap as well * BestromAgent: Allow cleartext only to private addresses * BestromAgent: Keep the task screen to the phone * BestromAgent: Re-read the screen when the tree goes stale * BestromAgent: Compact screens and screenshots alike * BestromAgent: Tighten stop, restart and small edges * BestromAgent: Strengthen the host tests build/soong * soong: Say ninja in the start status frameworks/av * codec2: Survive a store that dies while being reached vendor/voltage * fonts: Add Space Grotesk and Doto families * AndroidBlackTheme: Keep the surface ramp monotonic * config: Move org.bestrom.version to vendor/bestrom * fonts: Correct the Doto family note * config: Stop shipping GameSpace * vendor: Drop etc/hosts from the addon.d survival list packages/apps/ParanoidSense * FaceUnlock: Drop the dead jar entry and jarjar rule packages/apps/BestromPreinstaller * BestromPreinstaller: Seed the default keyboard * BestromPreinstaller: Retry a failed install packages/apps/Powerhub * Powerhub: hide weather link without OmniJaws * Powerhub: fix crash when leaving mid-fetch * Powerhub: add Hide Developer Status app picker * Powerhub: Drop the VoltageOS PIF source * Powerhub: Add the Agent mode entry * Powerhub: Add the Ask the agent entry * Powerhub: Put the Agent mode rows on a screen that renders packages/apps/Nullroute * Nullroute: Add the NRDX on-disk index format * Nullroute: Add hostname canonicalization and the matcher * Nullroute: Add the blocklist parser and suffix collapse * Nullroute: Add the index serializer and rule-text sidecar * Nullroute: Add index mapping and control-page accessors * Nullroute: Add the resolver filter and hooks * Nullroute: Add the DNS wire codec and raw-query hook * Nullroute: Add the JNI bridge * Nullroute: Add nrctl and the boot seeder * Nullroute: Add fuzz targets and the host test harness * Nullroute: Add the app core, data layer and update pipeline * Nullroute: Add the query log and breakage notifier * Nullroute: Add list importers and configuration export * Nullroute: Add Deep mode * Nullroute: Add the user interface * Nullroute: Add the baked hosts floor and blocklist profiles * Nullroute: Add SELinux policy, init and privileged permissions * Nullroute: Add build files * Nullroute: Add the verification gates * Nullroute: Add documentation * Nullroute: Add the Phase 2 rules, query and per-app screens * Nullroute: Add the query log, settings and onboarding screens * Nullroute: Add CNAME uncloaking * Nullroute: Add the Deep mode screen, self-test and remaining CLI verbs * Nullroute: Wire the new screens into navigation * Nullroute: Add resources for the new screens * Nullroute: Fix the log row badge type and complete the fuzz gate * Nullroute: Harden the netd-side code against a hostile index * native: Build the app-side natives on this tree * app: Set the baked-in version code * rom: Fix two ways the SELinux fragments failed on a real tree * tools: Check the addon.d script the tree actually has * app: Add the index build package packages/modules/DnsResolver * resolv: Add the Nullroute filter hooks * resolv: Refresh the Nullroute filter sources system/core * init: stop fabricating sys.oem_unlock_allowed in the SafetyNet spoof * base: enforce the hide developer status list * base: spoof ADB system properties for hide-developer-status apps * base: Hide the adb-disabled flag from spoofed apps * FontController: drop regex from the create path * SettingsProvider: allow seeding pure black * SystemUI: monochrome palette and black surfaces * SystemUI: Use the BestROM mark in the logo chip * base: Skip the developer-status check when isolated * SystemUI: Give a new keyguard clock the current time zone * base: Drop the GameSpace manager service * frameworks/base: Add the Edge input hook surface * SystemUI: Add a charging bolt to the text battery * frameworks/base: Log when the Edge input hook is armed * Settings: remove the dead app backup row * Settings: read ro.bestrom.build.status again * Settings: restore legal category in About phone * Settings: Add the BestROM homepage resources * Settings: Restyle the homepage search bar * Settings: Add a BestROM header to the homepage * Settings: Fork the homepage row layout * Settings: Give each homepage row its own card * Settings: Show values on homepage rows * Settings: Add a device card to the homepage * Settings: Use the ROM row style on sub-pages * Settings: Show the BestROM version on About phone * Settings: Drop the unused Powerhub icon * Settings: Return after the device-state keyguard refusal * Launcher3: Opaque app drawer by default * Launcher3: Generate the app functions index xml * init: stop fabricating sys.oem_unlock_allowed in the SafetyNet spoof * soong: Say ninja in the start status * sepolicy: Add the Nullroute policy * sepolicy: Keep the nullroute index path out of m4 * fonts: Add Space Grotesk and Doto families * AndroidBlackTheme: Keep the surface ramp monotonic * config: Move org.bestrom.version to vendor/bestrom * fonts: Correct the Doto family note * config: Stop shipping GameSpace * vendor: Drop etc/hosts from the addon.d survival list 3.0-peridot-20260907-1010-OFFICIAL ================================== Detection / stock parity * SELinux: dropped a VoltageOS-added rule that granted CAP_SYS_ADMIN to the fsck_untrusted domain. AOSP forbids this (it calls the grant "a code mistake" and neverallows it), so stock and every other peridot ROM deny it - our ROM was the odd one out, and Duck Detector flagged the live policy as dirty. The grant is removed and the stock neverallow restored, so the check now reads DENIED like stock. (Removable USB-OTG storage that needs a userspace exFAT/NTFS repair is the one thing to sanity-check; the F6 has no SD slot and the 6.1 kernel mounts exFAT/NTFS itself.) * sys.oem_unlock_allowed is no longer fabricated. Our Play-Integrity property spoof used to hardcode it to 0; nothing in the ROM reads it, and inventing it only gave detection tools a property to flag. It is now absent, the stock-like state. (The bootloader-unlock verdict is attested by the TEE and is unaffected by any property.) Camera / Sound / Freezer * Unchanged from 2026-09-07-0458 (MiuiCamera restored with the Android 17 SELinux fix; Sound & vibration silent by default; camera/gallery unfreezable). 3.0-peridot-20260907-0458-OFFICIAL ================================== Camera * MiuiCamera is back as the only camera; Aperture is removed. The "photo not in the gallery" bug is fixed at its root: Android 17 runs platform-signed apps in a new SELinux domain, so every rule the MiuiCamera port carried was dead. The one that mattered blocked the app from handing the camera HAL its background-service callback, so MIVI post-processing never reported "done", the photo stayed as a hidden pending MediaStore row, and the next camera launch wrote a thumbnail-sized copy. The rules are rewritten for both domains: the callback registers, shots land in DCIM at full size within seconds, and Glimpse shows them immediately. * The camera's other denied reads are granted too (vendor camera, display and audio properties; PSI pressure files; camera tuning data and DSP directories), and the camera provider's own gaps are closed (GPU devfreq link, an AI-image-enhancement property relabel, a dead QSPM probe silenced). Two Xiaomi-only service lookups that peridot does not ship are labelled so they fail cleanly instead of tripping a neverallow. * Expected and harmless, not chased: the "com.miui.gallery not found" line (the hand-off falls through to Glimpse) and the missing com.xiaomi.scanner (the document-scan feature hides itself). Sound & vibration * Unchanged from 1558: silent by default (first-boot seeds), vibration intensities and screenshot sound off. Freezer * Unchanged from 1558: the camera and gallery apps cannot be frozen. 3.0-peridot-20260906-1558-OFFICIAL ================================== Camera * MiuiCamera is gone. It was the single largest item in the ROM (a 187 MB APK plus helper libraries) and it had a real bug: after a shot, its post-processing was killed once you left the app, so the photo stayed as a hidden pending MediaStore row and only appeared in the gallery at the NEXT camera launch, written from the thumbnail at low quality. Aperture (the stock LineageOS camera) is the camera app again; Glimpse remains the gallery. Xiaomi's HDR/night/portrait processing goes with MiuiCamera; Aperture uses the vendor camera HAL directly. * Aperture is set up exactly as LineageOS 23.2 does for peridot: the ultrawide is exposed as a separate lens next to the main camera and the front camera, and 60 fps video is available on both (up to 4K on the back). A second, redundant 1x back-lens button may show up because the HAL also exposes the main sensor standalone; hiding it needs an on-device measurement and will follow. Sound & vibration * Ships silent. Off by default: dial pad tones, touch sounds, screen locking sound, charging sound, charging vibration, touch feedback, and the ring, notification, alarm and media vibration intensities (the sliders stay, so any of it can be turned back on). Screenshot sound is off by default too. * The on/off toggles are first-boot seeds: they apply on a clean flash; a dirty flash keeps the values you already have. The vibration intensities and the screenshot sound apply on a dirty flash as well, unless you had already moved that slider or switch. * Accessibility haptics and the hardware haptics (power button, fingerprint) are untouched. Freezer * The camera and gallery apps can no longer be frozen, so "open gallery from the camera" and "take a photo" from other apps keep working. BestROM 3.0 for POCO F6 (peridot) ================================= Release: 3.0-peridot-20260906-1056-OFFICIAL Package: BestROM-3.0-peridot-20260906-1056-OFFICIAL.zip (2766633969 bytes) sha256: 480a955452fe343943dc8e38cf2d633517e7d9e8b519c0ff8cb4ab51d819f27c Android: 17 (SDK 37), AOSP android-17.0.0_r1, VoltageOS 6.1 base Kernel: 6.1.176 GKI (android14-6.1), Theettam 2.7 lts176 (unchanged) Patch: platform 2026-08-01, vendor 2026-06-01 (OS3.0.302.0.WNPMIXM blobs) Previous: 2026-09-06-1029 (first official build) Flashing -------- Boot to recovery, then: adb sideload BestROM-3.0-peridot-20260906-1056-OFFICIAL.zip Dirty flash over any earlier build. No wipe required. First boot after flashing takes a few minutes longer while apps are compiled. Changes since 2026-09-06-1029 ----------------------------- Custom Tweaks (Powerhub) * Specter added as a Play Integrity fingerprint source, and the keybox can be fetched online. (Maintainer commit e5b606d.) Notes * Built from an interactive shell rather than the release wrapper, so ro.build.user reads android-build instead of bestrom. The stock POCO fingerprint spoof is unaffected. Everything else is identical to 1029.