Lees weergave
iPhone 18 Pro First Impressions: What Do You Think So Far?
If you upgraded from an older phone, was it worth it? What about upgrading from an iPhone 17 Pro? What problems are you running into? Anything you love so far?
MacRumors readers have already been sharing early opinions on the MacRumors forums, and there are interesting discussion threads to read through. For early reviews and hands-on images, make sure to check out the first impressions and photos thread.
People have been taking excellent photos with the βiPhone 18 Proβ and sharing results in a dedicated image thread. If you're still thinking about getting the βiPhone 18 Proβ and want to know how the new variable aperture lens performs, the thread includes useful real-life examples.
Image via MacRumors reader twx
Image via MacRumors reader M1mba978Curious about battery life? There's a whole thread for that with early data. Readers have also shared how heavy the iPhone 18 Pro Max feels in the hand, and we've seen the reasons why some 17 Pro Max owners decided to upgrade to the iPhone 18 Pro Max.
The new iPhones aren't perfect, and a few people have run into heat issues, speaker bugs, and problems with Face ID. Apple just released iOS 27.0.1 with a Face ID fix, so if you're having that bug, let us know if the new software solves it.
For easy navigation, here are all the threads linked above, along with other suggested reading.
- iPhone 18 Pro Max is here! First impressions and photos thread
- Photos taken with iPhone 18 Pro / Pro Max β Worldwide (2026β2027)
- iPhone 18 Series + Duo Battery Mega-Thread
- Did anyone with a 17 Pro Max upgrade to the 18 Pro Max?
- How really heavy is the 18PM?
- iPhone 18 Pro Max speaker issue?
- New 18 Pro - "Face ID not available"?
- 18 Pro Max rebooting
- Extreme heating up on 18 PM
- iPhone 18 Pro TLC vs QLC NAND modules
- iPhone 18 Pro Unlocks - Even If I'm Not Looking Directly at It?
Holding out for the iPhone Duo instead of the βiPhone 18 Proβ? You're not alone. Lots of MacRumors readers are discussing Apple's foldable, weighing possible downsides, and mulling where to order for the best chance of getting one at launch.
This article, "iPhone 18 Pro First Impressions: What Do You Think So Far?" first appeared on MacRumors.com
Discuss this article in our forums
Shoutout to More Layouts β These Weeks in Firefox: Issue 210
Highlights
- RΓ©v OβConner added a settings popup to control the layout of the Inspector. βAutoβ automatically switches the layout at a given toolbox width.
- The new sidebar (sidebar.revamp) and switcher setting will be enabled by default for users along with Nova in DevEdition, Beta and Release channels. To ease the transition for old sidebar users, the βOpen tools from sidebarβ option will be unchecked for those users to more closely resemble the old sidebar experience. The migration wonβt apply to users who had already tried the new sidebar and reverted back.
- The custom wallpaper library for the New Tab page is coming along! This allows you to save multiple images to your wallpaper folder, rather than replacing one image at a time. While itβs still in development, you can test it by setting
browser.newtabpage.activity-stream.newtabWallpapers.customWallpaper.library.enabledto true, starting in Firefox 157. - Mark added an MDN search engine for Nightly and Developer Edition. Select it from the menus, or type @mdn <search term>.
Friends of the Firefox team
Resolved bugs (excluding employees)
Script to find new contributors from bug list
Volunteers that fixed more than one bug
- :Benjamin Peterson
- Amadi
- any1here
- Caleb Pickard
- Chris Vander Linden
- Gopalarathnam Venkatesan
- Igor [:ExplodingJoysticks]
- Khalid AlHaddad
- LukΓ‘Ε‘ LipinskΓ½
- Mayank Bansal
- Nazeer Ahmed Shaikh
- Noah Varghese
- Sameem [:sameembaba]
- Sebastian Zartner [:sebo]
- sfshah
- Xiaosen Zhuang
New contributors (π = first patch)
- Amadi:
- Caleb Pickard
- dchen705: Remove unnecessary module import in browser/components/urlbar/tests/browser/head.js
- Ekerin Agboola: Remove old documentation related to the removed SEARCH_SUGGESTIONS_LATENCY_MS histogram
- Igor [:ExplodingJoysticks]:
- Gopalarathnam Venkatesan:
- βAdd classβ button (.cls) should be disabled when a class canβt be added to the selected node
- Remove unused lightweightThemes.getMoreURL pref
- Remove orphaned selectHistoryMode JSDoc from browser/components/preferences/tests/privacy/head.js
- gBrowser.selectedTabs does not return tabs in tab order
- π Jieke Jiang: Remove unused AboutReaderParent._getArticle
- π Andrew: White flash on startup caused by abouthome_cache storingΒ incompatible startup frame
- π RΓ©v OβConner: Inspector does not respect panel layout
- π Kana: browser_privatebrowsing_resetPBM.js awaits an array instead of Promise.all, so the tab-close wait does nothing
- RaΓΊl: L10nCache.add() throws on an unknown Fluent ID instead of reporting it
- π Samuel Mbabhazi: Use new color syntax throughout the DevTools
- K: βGo to lineβ sets a cursor line which does not exist in footer location indicator
- sfshah:
- Nazeer Ahmed Shaikh
- Noah Varghese:
- Valerie Racine (:v-racine): Fix incorrect assertion message in browser_adoptTab_failure.js
- π Xiaosen Zhuang:
Project Updates
Add-ons / Web Extensions
Addon Manager & about:addons
- As part of Project Nova related work:
- Fixed responsive layout issues that caused horizontal scrolling in about:addons at high zoom levels β Bug 2059864
- Fixed the βDiscover extensionsβ button appearing multiple times in about:addons β Bug 2070281
- Added telemetry for theme-picker shown events and for appearance/native-theme changes in about:addons β Bug 2069417 / Bug 2070341
- Added an accessible name to the themes mode control in about:addons, fixed in Firefox 158 and uplifted to the Firefox 157 beta channel β Bug 2064563
- Thanks to Mark Kennedy for the help on fixing this accessibility gap
- Updated the built-in dark and light theme previews to use the nova style β Bug 2070274
- Thanks to Emilio Cobos Γlvarez for the fix to the default light and dark theme previews.
- Fixed the Nova default and AMO curated theme previews to follow the OS light/dark mode while ignoring the Website appearance setting, fixed in Firefox 158 and uplifted to the Firefox 157 beta channel β Bug 2070562
- Stopped setting unused taarId session cookies for AMO on startup β Bug 1871561
- Thanks to Manuel Bucher for helping us to clean up these unused internals.
WebExtension APIs
- Fixed webRequest requestBody parsing so POST form fields named __proto__ are no longer dropped β Bug 2061470
- Changed alarms.clearAll() to resolve with undefined instead of a boolean, starting in Firefox 157 β Bug 2067229
- Thanks to Ollie Hensman-Crook for the fix to the alarms API.
- Implemented native messaging support via xdg-native-messaging-proxy for Flatpak and Snap builds β Bug 1955255
- Thanks to Jan Horak for the native messaging work on Linux packaging.
- As part of Florian Quèze effort to investigate and fix intermittent failures:
- Made windows.update() wait for the window to actually resize or move before resolving, fixing an intermittent Linux test failure β Bug 1307759
- Fixed a pageAction popup incorrectly opening via a commands API shortcut while the extension was already shutting down β Bug 2039637
- Fixed action.openPopup() rejecting when a tab hover preview was showing, a regression from Bug 2022281 in Firefox 150, with the fix shipping in Firefox 157 and no uplift planned β Bug 2062229
DevTools
- The team has a few sizable ongoing projects.
- Bomsy is working on moving Stylesheets to the Debugger so we can retire the (XUL-based) Style Editor, and turn the Debugger into a βSourcesβ panel (keeping all the existing functionality of course).Β (pref: devtools.debugger.features.stylesheets-in-debugger)
- Alex is investigating ways to better handle CSS authored text and CSSOM changes in the Inspector, building information directly from the Rust CSS engine, with the hope it will bring performance improvement editing styles in the Rules view.
- Nicolas is implementing a way to show to the user how the engine goes from a CSS declaration value to the computed value so itβs easier to follow whatβs the result of the different call sites, or how the different units (em, %, vmin, β¦) are computed to their final (e.g. px) values. Β (pref: devtools.inspector.css-explainers)
External contributions
- Chris Vander Linden finalized a multi-months project to add a search toolbar in the Netmonitor Raw Response panel, adapting and reusing the component we are using in the Debugger (#1941575)
- Amadi made the βOpen in new tabβ context menu entry to open tab next to the selected tab, not at the very end of the tab list (#2059979)
- Mayank Bansal optimized the performance of console.clear() (#2068156, #2068157, #2067000)
- Benoit added JSON Lines (JSONL/NDJSON) support in the Netmonitor Response panel (#2059673)
- Gopalarathnam Venkatesan made the βAdd classβ button (.cls) to be disabled when a class canβt be added to the selected node (e.g. itβs a text node, or a comment, or the doctype node) (#2000150)
- K fixed an issue with the βGo to lineβ action in the Debugger (#2064575)
- Samuel Mbabhazi refactored our CSS codebase to use new color syntax (e.g. rgb(255 0 0) instead of rgb(255, 0, 0)) (#2054228)
- sfshah turned devtools/client/jsonview/converter-child.js into an ES class (#2004273)
Team/Project Update
- Florian Quèze [:florian] is working on fixing test flakiness in devtools/client/debugger and already landed an impressive stack of patches (#2001947, #2070917, #2070920, #2070932, #2070970, #2027953, #1932082, #2070923, #2070933, #1814093, #1868969, #2071238)
- that also includes fixing various accessibility issues that were spotted by a11y_checks #2070911, #2070955, #2071227, #2071231)
- Note that Julian Descottes [:jdescottes] also has an ongoing quest to reduce intermittent failures in our codebase and fixed a few those last 2 weeks (#1767707, 2069100, #2009386)
- [florian] 24 patches landed on Friday, you can see the impact on https://tests.firefox.dev/tests.html?path=devtools%2Fclient%2Fdebugger
- Nicolas Chevobbe [:nchevobbe] fixed a few issues spotted by Jake in the Inspector for the new-ish attr()CSS function (#2068479, #2068480, #2068483)
- Alexandre Poirot [:ochameau] fixed an OOM crash when viewing source mapped file for a large wasm module with many workers (#2058286)
- Julian Descottes [:jdescottes] improved performance of the Inspector when Devtools was opened on a page with many grid elements (#1988868)
- Hubert Boma Manilla (:bomsy) fixed an infinite loop in the Debugger search if you were searching for $ on a big JS file (#2068517)
WebDriver
- Sameem merged two internal helpers (remote/shared/Sync.sys.mjs and remote/marionette/sync.sys.mjs) which removed some code duplication.
- Khalid AlHaddad unified the navigation commands in Marionette and WebDriver BiDi to always initiate navigations via browsingContext.loadURI().
- Khalid AlHaddad updated the WebDriver BiDi client used by WebDriver tests so that browsing_context.locate_nodes returns the nodes array directly instead of the enclosing result object, matching the updated command response.
- Julian Descottes made the destinationFolder mandatory when calling the browser.setDownloadBehavior command with type=βallowedβ β which aligns us with the specification. In order to restore the default behavior without having to specify a folder, clients should call setDownloadBehavior with null instead.
- Henrik Skupin fixed a bug in geckodriver where specifying androidIntentArguments in the capabilities caused the default intent arguments to be omitted.
Fluent
- According to arewefluentyet.com, ~74.77% of our strings are now using Fluent!
Lint, Docs and Workflow
- According to arewemozsrcyet.com, ~59% of our modules are now using moz-src.
- eslint-plugin-mozilla has switched from using Mocha to Jest for tests.
- Planning on future updates to investigate getting devtools & newtab to use the jest installed at the top-level, rather than separately installed copies.
Information Management/Sidebar
- Weβre working away on bug fixes for sidebar, vertical tabs, split-view, and Nova
- Thanks Florian (:fqueze) for landing a set of patches that have markedly reduced test flakiness in the Sidebar component
New Tab Page
- Custom wallpaper library
- Dre added a βYour imagesβ folder to the wallpaper picker on the New Tab Page, letting users save and switch between multiple custom wallpapers directly from the picker UI (desktop channels), which reduces friction for users who frequently change backgrounds.
- Dre implemented storage and migration for multiple custom wallpapers so users keep their existing wallpaper during upgrade while gaining the ability to save and switch multiple wallpapers β migration moves old single-wallpaper prefs into the new multi-wallpaper storage and the NTP now reads the wallpaper array at load/sync points.
- Dre updated New Tab Page strings to support multiple custom wallpapers so users now see accurate, localized labels and accessibility text when managing or switching between multiple custom backgrounds, reducing confusion in the UI during wallpaper selection.
- Dre added a delete affordance for saved custom wallpapers inside the New Tab Page picker so users can remove unwanted images from their saved set without going to profile files or prefs, improving manageability of user-provided wallpapers.
- Weβve completed a mass migration of our unit tests from Mocha (not mochi) / Karma to Jest/RTL, which is more modern and actively maintained.
- Sections is now enabled globally for all regions that show the content feed!
- Reem Hamoui fixed Lists widget so that keyboard users can now tab to completed items on the New Tab Page and see a visible selection/focus state
- Reem Hamoui fixed the Timer widget so that keyboard users can toggle focus vs break modes with standard keys (Enter/Space/arrow keys) thanks to restored keyboard handlers and tabindex semantics.
- Reem Hamoui made it so that screenreaders now announce wallpaper names via added aria-labels/alt text and role improvements in the Customize UI.
- Maxx Crawford made it so that the Customize UI now filters wallpapers by their metadata and no longer surfaces images marked hidden or in specific visibility groups.
- Irene Ni added Section Layout Name (String) telemetry to newtab content impression & click events so impressions/clicks now carry layout identifiers for more granular UX and A/B analysis
- Reem Hamoui added accessible names (aria-label/aria-labelledby) to the HNT Customize panel back buttons to fix screen-reader discoverability and keyboard/AT announcement when navigating the New Tab Customize flow.
- Nina Pypchenko [:nina-py] preserved iframe rendering for New Tab Page widgets during drag operations to prevent iframe-backed widgets from going blank while being moved.
- Nina Pypchenko [:nina-py] restored the Stocks widget dropdown and menu visibility under High Contrast Mode by adjusting contrast-aware CSS and ARIA roles so users relying on HCM can access stock controls again.
- Nina Pypchenko [:nina-py] fixed a results text overflow for long search queries in the Stocks widget by adding word-wrap/clamping to result lines, preventing layout breakage and truncated controls when users enter long symbols or queries.
- Nina Pypchenko [:nina-py] added telemetry for theme selection in the New Tab customization panel by emitting a selection ping on change, enabling measurement of user theme choices without changing UX.
- Irene Ni restored the Lists widget switcher checkmark for the selected list by fixing menu item selection-state rendering so users can again see which list is active in the switcher.
- Reem Hamoui updated the Privacy widget CTA and spacing on the New Tab Page, adjusting CSS/layout and CTA copy so the action is more discoverable and has a clearer tap/click target across responsive breakpoints.
- Reem Hamoui updated the zero-state copy for the New Tab Privacy widget to clarify what the widget does and the next steps for users when no privacy events or trackers are present, reducing confusion for first-time or cleared-state users.
- Maxx Crawford landed Fluent strings for the Nova launch New Tab customization callout, enabling localized text in the New Tab customization callout so users in supported locales see translated UI instead of missing-string fallbacks.
- Nina Pypchenko made the customization panel reset when closed, ensuring about:newtab customization state (temporary tile/layout previews) is cleared on close so users no longer see stale previews when reopening the panel.
- DΓ£o Gottwald fixed New Tab to pick up system High Contrast Mode on Linux and macOS, restoring correct high-contrast colors/contrast on those platforms for users who rely on OS-level accessibility settings.
- Irene Ni restored theme matching for New Tab context menus by reapplying theme-aware CSS variables in the New Tab Page contextmenu styles, fixing mismatched colors for users with custom/light/dark themes.
- Dustin Whisman fixed New Tab section context menu button color regression by adjusting the section-contextmenu button style rules (button color variables and state selectors) so section actions now respect theme contrast.
- Irene Ni restored transparency to New Tab card backgrounds by removing opaque background rules so cards correctly display background images/themes and improve visual consistency across DPI/compositing setups.
Picture-in-Picture
- Thanks to Sebastian Zartner [:sebo] for fixing broken Dailymotion captions on the PiP player.
- kpatenio fixed YouTubeβs displayed playback speed settings being out of sync with PiP.
- Thanks to Sylvestre Ledru [:Sylvestre] for helping fix a broken link in our PiP docs as a part of Bug 2071683.
Search and Urlbar
Address Bar
- Dao and Moritz are working on bringing the full urlbar experience into the newtab page, now enabled on nightly and going through polish and improvements.. (Bug 2068104, Bug 2068633, Bug 2069260, Bug 2064747)
- Drew enabled AMP and Wikipedia by default in AT, BE, CH, ES, IE, LU, NL, PL, PT and SE. (Bug 2066294)
- James gated adaptive autofill page results behind a minimum score threshold. (Bug 2066171)
- any1here stopped disabled Manage AI and Labs quick actions being displayed when disabled. (Bug 2070378)
Search
- Dale landed the Recent Searches widget which will be be used launched as an experiment (Bug 2063718)
- Caleb fixed the search box eating the first character typed into it. (Bug 1953361)
- Mark configured Wikipedia search for Sardinian (sc) to use the Sardinian Wikipedia rather than the Italian one. (Bug 2057690)
Places
- Marco fixed bookmarked Google Maps using Googleβs default favicon. (Bug 1575809)
- Marco fixed the Downloads and History windows going full-screen instead of floating on macOS. (Bug 2058062)
Tests
- Dashboards:
- Most frequent oranges: https://tests.firefox.dev/intermittent.html#date=21days
- Folders with the most flaky tests: https://tests.firefox.dev/flaky.html?kind=mochitest#date=21days&view=list
- Issues of tests in a given folder: https://tests.firefox.dev/tests.html
- Eg devtools debugger tests shows progress of the recent effort to fix these tests recently
- Flakiness burn down
- Multi-agent Claude sessions running for hours investigating and fixing tests of a given set provided in the prompt. Still iterating on the process. Did this 3 times so far:
- Bug 2062142 β [meta] Fix the flakiness in browser/components/extensions/test/browser
- Top 20 intermittent mochitest bugs annotated by sheriffs.
- Probably what made the mochitest line go down for the first time on https://tests.firefox.dev/
- And what helped with the sidebar component, even though sidebar wasnβt my target.
- Bug 2070797 β [meta] Fix the flakiness in devtools/client/debugger/test/mochitest
- Multi-agent Claude sessions running for hours investigating and fixing tests of a given set provided in the prompt. Still iterating on the process. Did this 3 times so far:
- Profile your claude session for cost and context size: https://github.com/fqueze/claude-profiler
- To monitor cost during your sessions, try https://github.com/padenot/foxtail
iOS 26.7.1 Fixes Vulnerability Used in Targeted Attacks
Apple's security support pages say there was a CoreGraphics out-of-bounds write issue that could be exploited with a maliciously crafted file, allowing for arbitrary code execution. It has been fixed with improved bounds checking.
Apple says the flaw was exploited in an "extremely sophisticated attack" on targeted individuals running older versions of iOS. Apple's latest operating systems don't appear to be affected, and the iOS 27.0.1, iPadOS 27.0.1, and macOS Golden Gate 27.0.1 updates that came out today have no published CVE entries.
While the attack wasn't widespread, if you're still running a version of iOS 26, iPadOS 26, macOS Tahoe, or macOS Sequoia, you should install the new updates as soon as possible. Now that the vulnerability is public, it could be further exploited against users who aren't protected.
This article, "iOS 26.7.1 Fixes Vulnerability Used in Targeted Attacks" first appeared on MacRumors.com
Discuss this article in our forums
Early Prime Day Deals Offer Up to 65% Off Anker and Jackery Power Stations
Anker SOLIX
Note: MacRumors is an affiliate partner with Jackery and Anker. When you click a link and make a purchase, we may receive a small payment, which helps us keep the site running.
Anker's SOLIX brand is hosting an early Prime Day sale with early bird deals, free gifts, and more. This sale is focused on Anker's high-end SOLIX portable power stations, with options that range from 1-2 days of backup to 3-5 days of backup.
For cheaper options, Amazon has notable markdowns on lower-cost SOLIX batteries, like the popular SOLIX C300 Portable Power Station with Lantern for $199.99 ($50 off). If you're shopping on Anker's website, be sure to make your purchases before October 5, when the sale ends.
- SOLIX C200 - $129.98, down from $169.99
- SOLIX C300 with Lantern - $199.99, down from $249.99
- SOLIX C1000 Gen 2 - $499.99, down from $599.00
- SOLIX S2000 - $679.99, down from $1,199.00
- SOLIX C2000 Gen 2 - $899.99, down from $1,499.00
- SOLIX F3000 - $1,399.99, down from $1,699.00
- SOLIX E10 Whole-Home Backup System - $4,299.00, down from $4,599.00
Jackery
Over on Jackery's website, you'll find up to 65% off a wide array of portable power stations, solar generators, add-on batteries, and more. This is another Prime Big Deal Days early access event, and is set to run through October 3.
- Explorer 300D - $209.00, down from $249.00
- Explorer 2000 v2 - $899.00, down from $999.00
- Battery Pack 2000 Plus - $799.00, down from $1,399.00
- Battery Pack 3600 - $1,349.00, down from $1,499.00
- HomePower 3000 Solar Generator - $1,349.00, down from $1,499.00
- Explorer 2000 v2 + Dual 200W Solar Panels - $1,399.00, down from $1,639.00
- HomePower 3000 Solar Generator + Dual 200W Solar Panels - $1,799.00, down from $2,139.00
- HomePower 3600 Plus Solar Generator - $2,469.00, down from $2,729.00
- Explorer 5000 Plus - $4,639.00, down from $5,159.00
If you're on the hunt for more discounts, be sure to visit our Apple Deals roundup where we recap the best Apple-related bargains of the past week.
Deals Newsletter
Interested in hearing more about the best deals you can find in 2026? Sign up for our Deals Newsletter and we'll keep you updated so you don't miss the biggest deals of the season!
This article, "Early Prime Day Deals Offer Up to 65% Off Anker and Jackery Power Stations" first appeared on MacRumors.com
Discuss this article in our forums
Apple Releases macOS Golden Gate 27.0.1 With Bug Fixes
Mac users can download the new βmacOS Golden Gateβ software by using the Software Update section in System Settings.
Apple says βmacOS Golden Gateβ 27.0.1 fixes unspecified bugs. Apple has also released macOS 26.7.1 and macOS 15.8.1 security updates.
This article, "Apple Releases macOS Golden Gate 27.0.1 With Bug Fixes" first appeared on MacRumors.com
Discuss this article in our forums
Apple Releases iOS 27.0.1 With Face ID Bug Fix
iOS 27.0.1 can be downloaded over the air by going to Settings > General > Software Update. Apple has also released iPadOS 27.0.1 and visionOS 27.0.1 updates, as well as iOS and iPadOS 26.7.1 updates for devices not updated to iOS and iPadOS 27.
According to Apple's release notes, iOS 27.0.1 addresses an issue that could cause Face ID not to work properly on the iPhone 18 Pro.
Some iPhone 18 Pro users have complained that authentication can fail to work for things like unlocking a locked app. In some cases, the device freezes up and then reboots. Other users have seen a "βFace IDβ is Not Available" message when attempting βFace IDβ setup, and others have experienced issues with the Require Attention for βFace IDβ setting. Apple's release notes for the update are below.
This update provides bug fixes for your iPhone, including fixes for the following issues:
- iPhone 18 Pro and iPhone 18 Pro Max may unexpectedly restart when Face ID fails to authenticate
- A color artifact may appear on photos captured at 2x under certain lighting conditions at f/1.48 on a small number of iPhone 18 Pro and iPhone 18 Pro Max devices
- Opening Notification Center and Control Center simultaneously may cause the touchscreen to become unresponsive
The βiPhone 18 Proβ models have an infrared camera that's under the display for the first time, but it's unclear if the hardware has been causing a problem. Apple said last week that it would be able to address the βFace IDβ bugs with a software update.
While the iOS 27.0.1 update has multiple βiPhone 18 Proβ bug fixes, it is available for all iPhones able to run βiOS 27β.
This article, "Apple Releases iOS 27.0.1 With Face ID Bug Fix" first appeared on MacRumors.com
Discuss this article in our forums
Last Chance: OWC's Best Mac Accessories Are on Sale Just for MacRumors Readers
Note: MacRumors is an affiliate partner with OWC. When you click a link and make a purchase, we may receive a small payment, which helps us keep the site running.
All discounts have been applied automatically, so all you need to do is follow the links below and add one of the accessories to your cart to see the savings. To be clear, many of these products are already on sale, but you need to add them to your cart and then go to your cart or checkout page to see the extra MacRumors discount.
There are 13 total items on sale, including docks, hubs, enclosures, and USB-C cables.
Notable accessories on sale include the OWC Thunderbolt Go Dock for $179.99 ($119 off), and the OWC ThunderBay 4 External Storage Enclosure for $299.00 ($99 off). For anyone looking to upgrade their desktop setup, there are six total enclosures on sale for our readers, with as much as $104 in savings.
External Storage Enclosures
- OWC Express 1M2 80GB Portable Enclosure - $149.00, down from $219.00
- OWC Express 4M2 USB4 External Storage Enclosure - $154.00, down from $239.99
- OWC Express 4M2 USB4 Enclosure with SoftRAID - $274.00, down from $379.99
- OWC ThunderBay 4 External Storage Enclosure - $299.00, down from $399.99
- OWC Express 1M2 1TB Portable Enclosure - $398.00, down from $469.99
- OWC ThunderBay 4 Enclosure with SoftRAID - $429.00, down from $549.99
Cables
- 3.6 Meter HDMI 2.0 Cable - $3.50, down from $9.99
- Philips 60W 2-Port GaN Charger - $9.99, down from $39.99
- 0.8 Meter OWC Thunderbolt 5 USB-C Cable - $19.00, down from $27.99
Hubs and Docks
- HyperDrive 6-in-2 USB-C Hub - $17.99, down from $39.99
- OWC Thunderbolt Dual DisplayPort Adapter - $29.00, down from $79.99
- OWC Thunderbolt Ethernet Adapter - $158.00, down from $199.99
- OWC Thunderbolt Go Dock - $179.00, down from $299.99
If you're on the hunt for more discounts, be sure to visit our Apple Deals roundup where we recap the best Apple-related bargains of the past week.
Deals Newsletter
Interested in hearing more about the best deals you can find in 2026? Sign up for our Deals Newsletter and we'll keep you updated so you don't miss the biggest deals of the season!
This article, "Last Chance: OWC's Best Mac Accessories Are on Sale Just for MacRumors Readers" first appeared on MacRumors.com
Discuss this article in our forums
Otto KekΓ€lΓ€inen: Using multiple git remotes for true distributed version control

One of the primary design principles for Linus Torvalds when creating Git is that it should be a distributed system, capable of working with multiple remotes. However, most people seem to use Git with just one remote, typically having GitHub or GitLab as the only origin.
Version control systems before Git relied on a centralized model. For example in Subversion or CVS you could only sync with one single remote server, which was considered the primary host of the source code. Git however is not just a VCS, but a DVCS, for distributed version control system. If you currently use Git with just one single remote as if it was a centralized version control system, now is the time to change that and learn how to add multiple remotes, and configure more flexible git pull and git push rules.
The first concept to grasp is that Git can have multiple remotes. For example, after running a basic clone command such as git clone https://github.com/ottok/debcraft.git you would end up with a single remote origin pointing to GitHub:
$ git remote --verbose
origin https://github.com/ottok/debcraft.git (fetch)
origin https://github.com/ottok/debcraft.git (push)$ git remote --verbose
origin https://github.com/ottok/debcraft.git (fetch)
origin https://github.com/ottok/debcraft.git (push)You can however configure multiple remotes with the command git remote:
$ git remote rename origin github
$ git remote add gitlab https://gitlab.com/ottok/debcraft.git
$ git remote --verbose
github https://github.com/ottok/debcraft.git (fetch)
github https://github.com/ottok/debcraft.git (push)
gitlab https://gitlab.com/ottok/debcraft.git (fetch)
gitlab https://gitlab.com/ottok/debcraft.git (push)$ git remote rename origin github
$ git remote add gitlab https://gitlab.com/ottok/debcraft.git
$ git remote --verbose
github https://github.com/ottok/debcraft.git (fetch)
github https://github.com/ottok/debcraft.git (push)
gitlab https://gitlab.com/ottok/debcraft.git (fetch)
gitlab https://gitlab.com/ottok/debcraft.git (push)You can push and pull from these individually, or from all at once:
$ git pull --all
Fetching github
Fetching gitlab
Already up to date.$ git pull --all
Fetching github
Fetching gitlab
Already up to date.When you review the git history, note the labels gitlab/main and github/main which tell which commit the branch main points to on various remotes. In this case they are all in sync and point to the same 5d1815c:
$ git log --oneline
5d1815c (HEAD -> main, gitlab/main, github/main) Bump Debhelper version from 13 to 14
ca518a7 Temporarily disable automatic copyright year bumping due to frequent bugs
d6e201e Exclude .pm from codespell to decrease false positives (Closes: #1140488)
708ee35 Exclude debian/copyright from codespell due to frequent false positives$ git log --oneline
5d1815c (HEAD -> main, gitlab/main, github/main) Bump Debhelper version from 13 to 14
ca518a7 Temporarily disable automatic copyright year bumping due to frequent bugs
d6e201e Exclude .pm from codespell to decrease false positives (Closes: #1140488)
708ee35 Exclude debian/copyright from codespell due to frequent false positivesWhen pushing, you can choose what remote to push to. For example, if I am working on branch dev and I only want to push it to GitLab to trigger a CI run there, I can run git push gitlab dev. You can also configure a default remote by running once git push --set-upstream gitlab dev and thereafter simply run git push and it will automatically push the branch dev only to that remote.
A related setting is remote.pushDefault, which tells git which remote to push to when a branch does not define one of its own, and it applies to every branch that lacks a [branch] section in .git/config. Setting it once is what lets a repository have a per-branch pull remote, like the debcraft example below, and still have a single, predictable git push target. To see which remote git will use for each of your branches, run git branch -vv, and to refresh the remote-tracking branches of all remotes at once, run git fetch --all --prune.
If you want to have multiple remotes, but automatically push and pull to all of them at once, you configure one single remote to have multiple URLs with git remote set-url --add. Since git prints one line per push URL, git remote -v then shows the same remote several times, once for each URL it pushes to.
As an illustration, in my actual local Debcraft development project I have all these configured:
$ git remote -v
github-pull-requests git@github.com:ottok/debcraft.git (fetch)
github-pull-requests git@github.com:ottok/debcraft.git (push)
gitlab-merge-requests git@gitlab.com:ottok/debcraft.git (fetch)
gitlab-merge-requests git@gitlab.com:ottok/debcraft.git (push)
origin git@salsa.debian.org:debian/debcraft.git (fetch)
origin git@salsa.debian.org:debian/debcraft.git (push)
origin git@gitlab.com:ottok/debcraft.git (push)
origin git@github.com:ottok/debcraft.git (push)
otto git@salsa.debian.org:otto/debcraft.git (fetch)
otto git@salsa.debian.org:otto/debcraft.git (push)
otto git@gitlab.com:ottok/debcraft.git (push)
otto git@github.com:ottok/debcraft.git (push)
otto git@git.sr.ht:~ottok/debcraft (push)
otto ssh://git@codeberg.org/ottok/Debcraft.git (push)
salsa-merge-requests git@salsa.debian.org:debian/debcraft.git (fetch)
salsa-merge-requests git@salsa.debian.org:debian/debcraft.git (push)$ git remote -v
github-pull-requests git@github.com:ottok/debcraft.git (fetch)
github-pull-requests git@github.com:ottok/debcraft.git (push)
gitlab-merge-requests git@gitlab.com:ottok/debcraft.git (fetch)
gitlab-merge-requests git@gitlab.com:ottok/debcraft.git (push)
origin git@salsa.debian.org:debian/debcraft.git (fetch)
origin git@salsa.debian.org:debian/debcraft.git (push)
origin git@gitlab.com:ottok/debcraft.git (push)
origin git@github.com:ottok/debcraft.git (push)
otto git@salsa.debian.org:otto/debcraft.git (fetch)
otto git@salsa.debian.org:otto/debcraft.git (push)
otto git@gitlab.com:ottok/debcraft.git (push)
otto git@github.com:ottok/debcraft.git (push)
otto git@git.sr.ht:~ottok/debcraft (push)
otto ssh://git@codeberg.org/ottok/Debcraft.git (push)
salsa-merge-requests git@salsa.debian.org:debian/debcraft.git (fetch)
salsa-merge-requests git@salsa.debian.org:debian/debcraft.git (push)The settings can also be viewed directly in the config file:
$ cat .git/config
...
[remote "origin"]
url = git@salsa.debian.org:debian/debcraft.git
fetch = +refs/heads/*:refs/remotes/origin/*
pushurl = git@salsa.debian.org:debian/debcraft.git
pushurl = git@gitlab.com:ottok/debcraft.git
pushurl = git@github.com:ottok/debcraft.git
[remote "otto"]
url = git@salsa.debian.org:otto/debcraft.git
fetch = +refs/heads/*:refs/remotes/otto/*
pushurl = git@salsa.debian.org:otto/debcraft.git
pushurl = git@gitlab.com:ottok/debcraft.git
pushurl = git@github.com:ottok/debcraft.git
pushurl = git@git.sr.ht:~ottok/debcraft
pushurl = ssh://git@codeberg.org/ottok/Debcraft.git
...
[branch "main"]
remote = origin
merge = refs/heads/main
[branch "dev"]
remote = otto
merge = refs/heads/dev
...$ cat .git/config
...
[remote "origin"]
url = git@salsa.debian.org:debian/debcraft.git
fetch = +refs/heads/*:refs/remotes/origin/*
pushurl = git@salsa.debian.org:debian/debcraft.git
pushurl = git@gitlab.com:ottok/debcraft.git
pushurl = git@github.com:ottok/debcraft.git
[remote "otto"]
url = git@salsa.debian.org:otto/debcraft.git
fetch = +refs/heads/*:refs/remotes/otto/*
pushurl = git@salsa.debian.org:otto/debcraft.git
pushurl = git@gitlab.com:ottok/debcraft.git
pushurl = git@github.com:ottok/debcraft.git
pushurl = git@git.sr.ht:~ottok/debcraft
pushurl = ssh://git@codeberg.org/ottok/Debcraft.git
...
[branch "main"]
remote = origin
merge = refs/heads/main
[branch "dev"]
remote = otto
merge = refs/heads/dev
...On branch main:
- Running
git pullwill fetch fromsalsa.debian.org/debian/debcraft(the primary git hosting for this project) - Running
git pushwill push to Salsa, GitLab and GitHub, one after the other, making sure they all have the latestmain
On branch dev:
- Running
git pullwill fetch fromsalsa.debian.org/otto/debcraft(the personal fork) - Running
git pushwill push to Salsa, GitLab, GitHub, Sourcehut and Codeberg all one after the other
The command output will have the same message three times, once for each remote (assuming they were all already up-to-date):
$ git push
Everything up-to-date
Everything up-to-date
Everything up-to-date$ git push
Everything up-to-date
Everything up-to-date
Everything up-to-dateUse cases for distributed version control
The most obvious use case for any distributed system is improved availability. In this example, the salsa.debian.org is often overloaded/unavailable, so pushing to GitLab and GitHub as well allows collaborators to use them to fetch git commits if the primary code hosting site is unresponsive. Once it comes back online again, the next git push/pull will automatically bring it up to the same content as what backup hosts had.
The second main benefit is that having the code live on multiple code forges allows collaborators to use their own favorite host. Debcraft itself is a great example of this, as collaborators who donβt have a Salsa account can - and have - submitted Merge Requests on GitLab.com and Pull Requests on GitHub.com.
A third use case is code hosting migrations. If you for example want to gradually phase out GitHub.com and replace it with something else, you could configure git to pull from the old location and push to both, ensuring that other collaborators can start using the new code hosting location without disruptions to those who have not yet updated their remotes or done a fresh git clone from the new location.
Automating setting up a project on multiple code forges
While I donβt push all projects I work on to all Salsa/GitLab/GitHub, I do set up multiple remotes for enough git projects that I have this script to automate configuring a git repository that is cloned from Salsa to also push to GitLab and GitHub. It accepts the repository whether it was cloned over SSH or HTTPS, and it adds the push URLs and then pushes the current branch, all branches, and tags for you:
#!/bin/bash
# Add GitLab and GitHub push URLs to an existing git remote, so that a plain
# "git push" writes the same commits to all three code forges.
#
# Usage: ./git-multipush-salsa.sh
#
# Environment:
# SALSA_REMOTE remote to turn into a mirror, default origin
# SALSA_USER your Salsa user, only used to detect that the source
# remote is somebody else's project
# GITLAB_USER your GitLab user, default ottok
# GITHUB_USER your GitHub user, default ottok
# PROTOCOL ssh (default) or https, for the push URLs
set -euo pipefail
SCRIPT=$(basename "$0")
SALSA_REMOTE=${SALSA_REMOTE:-origin}
SALSA_USER=${SALSA_USER:-otto}
GITLAB_USER=${GITLAB_USER:-ottok}
GITHUB_USER=${GITHUB_USER:-ottok}
PROTOCOL=${PROTOCOL:-ssh}
die() { echo "$SCRIPT: $*" >&2; exit 1; }
# A failing command leaves the push URLs half configured behind, so say how
# to get back to where we started
fail()
{
echo "$SCRIPT: '$*' failed, the push URLs may already have been added" >&2
echo " git config --unset-all remote.${SALSA_REMOTE}.pushurl" >&2
echo " git remote set-url --add --push ${SALSA_REMOTE} ${SALSA_URL}" >&2
exit 1
}
git rev-parse --git-dir > /dev/null 2>&1 || die "not inside a git repository"
git remote | grep -qx "$SALSA_REMOTE" || die "no remote named '$SALSA_REMOTE'"
# Example: git@salsa.debian.org:otto/salsa-ci-pipeline.git
SALSA_URL=$(git remote get-url "$SALSA_REMOTE")
# The source remote may use any of the URL forms salsa.debian.org accepts,
# for example git@salsa.debian.org:otto/salsa-ci-pipeline.git or
# https://salsa.debian.org/otto/salsa-ci-pipeline.git
case "$SALSA_URL" in
git@salsa.debian.org:*) SALSA_PATH=${SALSA_URL#git@salsa.debian.org:} ;;
ssh://git@salsa.debian.org/*) SALSA_PATH=${SALSA_URL#ssh://git@salsa.debian.org/} ;;
https://salsa.debian.org/*) SALSA_PATH=${SALSA_URL#https://salsa.debian.org/} ;;
http://salsa.debian.org/*) SALSA_PATH=${SALSA_URL#http://salsa.debian.org/} ;;
*) die "unexpected source URL '$SALSA_URL', expected a salsa.debian.org URL" ;;
esac
SALSA_PATH=${SALSA_PATH%/}
SALSA_PATH=${SALSA_PATH%.git}
SOURCE_USER=${SALSA_PATH%%/*}
PROJECT=${SALSA_PATH##*/}
# Write the push URLs in one and the same protocol, no matter how the
# repository happens to have been cloned
if [ "$PROTOCOL" = "https" ]
then
SALSA_URL="https://salsa.debian.org/${SALSA_PATH}.git"
GITLAB_URL="https://gitlab.com/${GITLAB_USER}/${PROJECT}.git"
GITHUB_URL="https://github.com/${GITHUB_USER}/${PROJECT}.git"
else
SALSA_URL="git@salsa.debian.org:${SALSA_PATH}.git"
GITLAB_URL="git@gitlab.com:${GITLAB_USER}/${PROJECT}.git"
GITHUB_URL="git@github.com:${GITHUB_USER}/${PROJECT}.git"
fi
# Mirroring somebody else's project is fine, but it is usually not what you
# want: you most likely want to mirror your own fork instead
if [ "$SOURCE_USER" != "$SALSA_USER" ]
then
echo "Note: $SALSA_REMOTE points to $SOURCE_USER's project, not your own."
echo "To mirror your own fork, run this with SALSA_REMOTE set to its name."
echo
fi
# Bail out instead of adding the same push URLs twice
EXISTING=$(git remote get-url --push --all "$SALSA_REMOTE")
if [ "$(printf '%s\n' "$EXISTING" | wc -l)" -gt 1 ]
then
die "remote '$SALSA_REMOTE' already has multiple push URLs:
$EXISTING"
fi
echo "Mirroring $SALSA_URL to $GITLAB_URL and $GITHUB_URL"
git remote set-url --add --push "$SALSA_REMOTE" "$SALSA_URL"
git remote set-url --add --push "$SALSA_REMOTE" "$GITLAB_URL"
git remote set-url --add --push "$SALSA_REMOTE" "$GITHUB_URL"
# Push the branch you have checked out first, and never with --force: the
# first branch a GitLab or GitHub project receives becomes its default branch,
# the one you then protect
DEFAULT_BRANCH=$(git symbolic-ref --short HEAD) || die "not on a branch, check out a branch first"
git push -u "$SALSA_REMOTE" "$DEFAULT_BRANCH"
git push "$SALSA_REMOTE" --all
git push "$SALSA_REMOTE" --tags
# The push above creates the GitLab and GitHub projects, but GitLab projects
# are private by default, so make the new mirror public with glab if installed.
if command -v glab > /dev/null
then
echo "Make the GitLab project public and describe it as a mirror:"
glab api -X PUT "projects/${GITLAB_USER}%2F${PROJECT}" \
-f visibility=public \
-f description="Mirror of ${SALSA_URL}" \
-f notification_email=disabled
else
echo "Install glab to do the same automatically, or visit"
echo "https://gitlab.com/${GITLAB_USER}/${PROJECT}/edit to make the project public"
fi
echo "To undo, drop all push URLs and add back only the original one:"
echo " git config --unset-all remote.${SALSA_REMOTE}.pushurl"
echo " git remote set-url --add --push ${SALSA_REMOTE} ${SALSA_URL}"#!/bin/bash
# Add GitLab and GitHub push URLs to an existing git remote, so that a plain
# "git push" writes the same commits to all three code forges.
#
# Usage: ./git-multipush-salsa.sh
#
# Environment:
# SALSA_REMOTE remote to turn into a mirror, default origin
# SALSA_USER your Salsa user, only used to detect that the source
# remote is somebody else's project
# GITLAB_USER your GitLab user, default ottok
# GITHUB_USER your GitHub user, default ottok
# PROTOCOL ssh (default) or https, for the push URLs
set -euo pipefail
SCRIPT=$(basename "$0")
SALSA_REMOTE=${SALSA_REMOTE:-origin}
SALSA_USER=${SALSA_USER:-otto}
GITLAB_USER=${GITLAB_USER:-ottok}
GITHUB_USER=${GITHUB_USER:-ottok}
PROTOCOL=${PROTOCOL:-ssh}
die() { echo "$SCRIPT: $*" >&2; exit 1; }
# A failing command leaves the push URLs half configured behind, so say how
# to get back to where we started
fail()
{
echo "$SCRIPT: '$*' failed, the push URLs may already have been added" >&2
echo " git config --unset-all remote.${SALSA_REMOTE}.pushurl" >&2
echo " git remote set-url --add --push ${SALSA_REMOTE} ${SALSA_URL}" >&2
exit 1
}
git rev-parse --git-dir > /dev/null 2>&1 || die "not inside a git repository"
git remote | grep -qx "$SALSA_REMOTE" || die "no remote named '$SALSA_REMOTE'"
# Example: git@salsa.debian.org:otto/salsa-ci-pipeline.git
SALSA_URL=$(git remote get-url "$SALSA_REMOTE")
# The source remote may use any of the URL forms salsa.debian.org accepts,
# for example git@salsa.debian.org:otto/salsa-ci-pipeline.git or
# https://salsa.debian.org/otto/salsa-ci-pipeline.git
case "$SALSA_URL" in
git@salsa.debian.org:*) SALSA_PATH=${SALSA_URL#git@salsa.debian.org:} ;;
ssh://git@salsa.debian.org/*) SALSA_PATH=${SALSA_URL#ssh://git@salsa.debian.org/} ;;
https://salsa.debian.org/*) SALSA_PATH=${SALSA_URL#https://salsa.debian.org/} ;;
http://salsa.debian.org/*) SALSA_PATH=${SALSA_URL#http://salsa.debian.org/} ;;
*) die "unexpected source URL '$SALSA_URL', expected a salsa.debian.org URL" ;;
esac
SALSA_PATH=${SALSA_PATH%/}
SALSA_PATH=${SALSA_PATH%.git}
SOURCE_USER=${SALSA_PATH%%/*}
PROJECT=${SALSA_PATH##*/}
# Write the push URLs in one and the same protocol, no matter how the
# repository happens to have been cloned
if [ "$PROTOCOL" = "https" ]
then
SALSA_URL="https://salsa.debian.org/${SALSA_PATH}.git"
GITLAB_URL="https://gitlab.com/${GITLAB_USER}/${PROJECT}.git"
GITHUB_URL="https://github.com/${GITHUB_USER}/${PROJECT}.git"
else
SALSA_URL="git@salsa.debian.org:${SALSA_PATH}.git"
GITLAB_URL="git@gitlab.com:${GITLAB_USER}/${PROJECT}.git"
GITHUB_URL="git@github.com:${GITHUB_USER}/${PROJECT}.git"
fi
# Mirroring somebody else's project is fine, but it is usually not what you
# want: you most likely want to mirror your own fork instead
if [ "$SOURCE_USER" != "$SALSA_USER" ]
then
echo "Note: $SALSA_REMOTE points to $SOURCE_USER's project, not your own."
echo "To mirror your own fork, run this with SALSA_REMOTE set to its name."
echo
fi
# Bail out instead of adding the same push URLs twice
EXISTING=$(git remote get-url --push --all "$SALSA_REMOTE")
if [ "$(printf '%s\n' "$EXISTING" | wc -l)" -gt 1 ]
then
die "remote '$SALSA_REMOTE' already has multiple push URLs:
$EXISTING"
fi
echo "Mirroring $SALSA_URL to $GITLAB_URL and $GITHUB_URL"
git remote set-url --add --push "$SALSA_REMOTE" "$SALSA_URL"
git remote set-url --add --push "$SALSA_REMOTE" "$GITLAB_URL"
git remote set-url --add --push "$SALSA_REMOTE" "$GITHUB_URL"
# Push the branch you have checked out first, and never with --force: the
# first branch a GitLab or GitHub project receives becomes its default branch,
# the one you then protect
DEFAULT_BRANCH=$(git symbolic-ref --short HEAD) || die "not on a branch, check out a branch first"
git push -u "$SALSA_REMOTE" "$DEFAULT_BRANCH"
git push "$SALSA_REMOTE" --all
git push "$SALSA_REMOTE" --tags
# The push above creates the GitLab and GitHub projects, but GitLab projects
# are private by default, so make the new mirror public with glab if installed.
if command -v glab > /dev/null
then
echo "Make the GitLab project public and describe it as a mirror:"
glab api -X PUT "projects/${GITLAB_USER}%2F${PROJECT}" \
-f visibility=public \
-f description="Mirror of ${SALSA_URL}" \
-f notification_email=disabled
else
echo "Install glab to do the same automatically, or visit"
echo "https://gitlab.com/${GITLAB_USER}/${PROJECT}/edit to make the project public"
fi
echo "To undo, drop all push URLs and add back only the original one:"
echo " git config --unset-all remote.${SALSA_REMOTE}.pushurl"
echo " git remote set-url --add --push ${SALSA_REMOTE} ${SALSA_URL}"If you prefer not to install glab, the last part simply reduces to visiting the GitLab project settings once and ticking the project public, and it is also worth setting a description like Mirror of https://salsa.debian.org/debian/debcraft and disabling notification email there, as nobody wants a mirror sending out a flood of emails every time you push.
There are a few caveats worth knowing about before mirroring everything everywhere. Every push to a remote with multiple push URLs writes to all of them, so a project with continuous integration configured on three forges will run its CI three times and cost you roughly three times as much. If one of the push URLs fails, say because the host is momentarily unreachable, git prints the error and stops there, leaving the remotes listed after the failing one without the new commits. Simply re-run the push once the host is reachable again; the remotes that did get the commits will just respond with Everything up-to-date. And you should never force-push to only one of the remotes, as that leaves the mirrors permanently out of sync with your local repository.
Avoid pulling too much
Related to multiple remotes, you should also be aware that git allows one to configure which branches to pull. By default a git clone will track all branches from the remote and pull everything, which in a typical open source project will bring in a lot of temporary development branches in vain.
Thus it is better to run git clone with the --single-branch and --branch parameters to fetch only the branch that matters, which in most cases is the main branch. That can be accomplished with:
git clone --single-branch --branch main https://github.com/ottok/debcraft.gitgit clone --single-branch --branch main https://github.com/ottok/debcraft.gitIf a repository was already cloned, it can be configured to track only one branch with:
git config remote.upstream.fetch "+refs/heads/main:refs/remotes/upstream/main"
git fetch upstream
git config --get-all remote.upstream.fetch
+refs/heads/main:refs/remotes/upstream/maingit config remote.upstream.fetch "+refs/heads/main:refs/remotes/upstream/main"
git fetch upstream
git config --get-all remote.upstream.fetch
+refs/heads/main:refs/remotes/upstream/mainIf you later need to track more branches, you can configure them with commands such as:
git config --add remote.upstream.fetch "+refs/heads/3.2.y:refs/remotes/upstream/3.2.y"
git fetch upstream
git checkout 3.2.ygit config --add remote.upstream.fetch "+refs/heads/3.2.y:refs/remotes/upstream/3.2.y"
git fetch upstream
git checkout 3.2.yFor additional details about any of the tips in this post I recommend reading the git man pages.
Now go and spread your code around
Distributing your code over multiple code forges costs you almost nothing in configuration, and in return you get availability, a choice of host for your collaborators, and freedom to migrate without a big bang. Add the push URLs to the remotes you already have, push once, and you are done.
The rest of the git fundamentals are covered in my other posts. If your commits are not yet polished, start with what makes a good git commit message and git commit messages by example. If you work on Debian packaging, Git-based collaboration in Debian explains why the Salsa merge request workflow is built the way it is, and Salsa merge request best practices covers the review process itself.
12 New Things to Expect From Apple This October
Below, we have outlined 12 new things to expect from Apple this October.
Confirmed
- iPhone Duo: The foldable iPhone Duo launches on Friday, October 23. Pre-orders begin Friday, October 16 at 5 a.m. Pacific Time.
- iOS 27.1: Apple said the iPhone Duo will ship with iOS 27.1, so the software update is expected to be released before October 23.
- iOS 27.2: Apple jumped ahead to an iOS 27.2 beta because iOS 27.1 is dedicated to the iPhone Duo. iOS 27.2 adds support for the five additional Siri AI languages that Apple promised would be coming in October, so accordingly we can expect iOS 27.2 to be released at some point during the month.
- Mac Studio (512GB RAM): While the new Mac Studio with M5 Max and M5 Ultra chips was released last week, Apple said a high-end configuration with the M5 Ultra and 512GB of RAM will be available in late October.
Rumored
- iPad mini 8: OLED display, A20 Pro chip, landscape front camera, redesigned speaker system, and water-resistant design.
- 24" iMac: M6 chip and new color options.
- 14" MacBook Pro: M6 chip.
- 14" and 16" MacBook Pro models with OLED displays: A major MacBook Pro redesign in late 2026 with M5 Pro and M5 Max chips, an OLED display, a touch screen, a Dynamic Island, and a thinner design.
- Apple TV 4K (4th Generation): A19 or A19 Pro chip, an increased 8GB to 12GB of RAM for Apple Intelligence and Siri AI support, an Apple-designed N1 chip with Wi-Fi 7 support, and an updated Siri Remote. A leak revealed the new Apple TV will look the same as the existing model.
- HomePod mini 2: Newer chip, Siri AI support, improved sound quality, Apple's N1 chip with Wi-Fi 7 support, a second-generation Ultra Wideband chip, and new color options, including pink and green. No major design changes.
- Home hub: An all-new Apple smart home hub featuring Siri AI, a 6-inch to 7-inch square display, an A18 chip or newer for Apple Intelligence, FaceTime, and more. A new operating system will feature clock faces, widgets, and more. There will be a tabletop version with a speaker base and a wall-mounted version.
- homeOS: Apple's smart home hub is expected to run an all-new operating system that may be named homeOS, according to trademark filings.
This article, "12 New Things to Expect From Apple This October" first appeared on MacRumors.com
Discuss this article in our forums
AirPods 5 vs. AirPods Pro 3 Buyer's Guide: Which Should You Buy?
The βAirPods 5β arrived in September 2026, a year after the AirPods Pro 3. They continue to narrow the feature gap between the devices, but the Pro model still offers a sealed in-ear fit, substantially better noise cancellation, and hearing and workout features. Our guide helps to answer the question of how to decide which of these sets of AirPods is best for you.
| βAirPods 5β
(2026) |
βAirPods 5β with Wireless Charging Case
(2026) |
βAirPods Pro 3β
(2025) |
|---|---|---|
| Open-ear fit without ear tips | Open-ear fit without ear tips | In-ear fit with foam-infused silicone ear tips in five sizes |
| Optical in-ear sensor | Optical in-ear sensor | Skin-detect sensor |
| Open-ear Active Noise Cancellation | Open-ear Active Noise Cancellation | In-ear Active Noise Cancellation; up to 3x more effective than βAirPods 5β |
| Force sensor controls | Force sensor controls with volume swipe | Touch controls with volume swipe |
| Hearing Test, Hearing Aid, Hearing Protection, Automatic Conversation Boost, and Loud Sound Reduction | ||
| Heart rate sensing during workouts | ||
| Up to 4 hours of listening time on one charge with ANC | Up to 5 hours of listening time on one charge with ANC | Up to 8 hours of listening time on one charge with ANC |
| Up to 20 hours of listening time with ANC using the case | Up to 22 hours of listening time with ANC using the case | Up to 24 hours of listening time with ANC using the case |
| Case charges via USB-C | Case charges via USB-C, Apple Watch charger, or Qi charger | Case charges via USB-C, Apple Watch charger, Qi charger, or MagSafe charger |
| Speaker in case for βFind Myβ | Speaker in case for βFind Myβ | |
| Second-generation Ultra Wideband chip in case for Precision Finding with a compatible iPhone | ||
| Charging case is 1.97 inches (50.1 mm) wide | Charging case is 1.97 inches (50.1 mm) wide | Charging case is 2.45 inches (62.2 mm) wide and has a lanyard loop |
| Starts at $129 | Starts at $149 | Starts at $249 |
The βAirPods 5β with Wireless Charging Case are the best choice for most buyers. For $20 more than the base model, you get an extra hour of listening time per charge with ANC, volume swipes on the stems, wireless charging, and a speaker that makes a misplaced case easier to find. Choose the $129 model if the lowest price matters most and you are content with its shorter battery life and USB-C-only charging case.
However, the βAirPods Pro 3β are worth the extra $100 over the higher-end βAirPods 5β if noise cancellation is your priority and you prefer a snug in-ear fit. Apple says they provide up to three times as much ANC as the βAirPods 5β, since the ear tips create a physical seal. Their eight-hour listening time per charge is particularly useful on long journeys. In our hands-on testing, the βAirPods 5β sounded muddier than the Pro 3, particularly in the lower midrange.
The βAirPods Pro 3β are also the clear choice if you want their hearing health features or heart rate sensing during workouts without relying on an Apple Watch. Their charging case adds Precision Finding, too. If you dislike silicone ear tips, the βAirPods 5β let you keep the open-ear fit while getting nearly all of the everyday listening features shared by the Pro model.
AirPods frequently receive discounts from third-party retailers, which can narrow the βAirPods Pro 3β's $100 list-price premium over the $149 βAirPods 5β. Check the latest prices using our Deals roundup before buying.
This article, "AirPods 5 vs. AirPods Pro 3 Buyer's Guide: Which Should You Buy?" first appeared on MacRumors.com
Discuss this article in our forums
Apple Ordered to Pay $5.7 Billion Over Haptic Patent Infringement
Taction sued Apple in 2021, arguing that Apple's Taptic Engine in the company's Apple Watches and iPhones uses its inventions without proper license or authority. Apple initially had the case dismissed in 2023, but the Federal Circuit later revived it.
The jury trial began September 14, and seven jurors deliberated for two days after proceedings concluded. They returned on Friday and delivered the verdict in favor of Taction.
"We're happy the jury found for Taction and vindicated its patent rights," the company's lead counsel, Lance Yang, told CNBC. "Taction waited five and a half years for this case to get to trial, so it was a long time coming."
Apple said it intends to appeal the decision.
"While we thank the jury for their consideration, we strongly disagree with today's verdict and the damages awarded, which are entirely unsupported by the facts," Apple told CNBC in a statement. "Apple's Taptic Engine is fundamentally different from Taction's technology, which Taction's own testing of Apple's products confirmed during trial. Apple does not use Taction's technology, and we will appeal."In Friday's verdict at the U.S. District Court for the Southern District of California, jurors did not find that Apple had infringed the patents willingly.
This article, "Apple Ordered to Pay $5.7 Billion Over Haptic Patent Infringement" first appeared on MacRumors.com
Discuss this article in our forums
New Vision Pro Headset: Apple Considering Four Different Concepts
Writing in his latest Power On newsletter, Gurman said Apple's Vision team is exploring four concepts for the device, codenamed N224, including designs that offload internal components in a similar way to Meta's latest VR Glasses, which are expected to launch next spring.
An external computing module on Meta's device houses the battery and main processor, and can be clipped to the user's waist. Gurman, who has previewed Meta's headset, says the module is about the same size and weight as the current Vision Pro's battery pack, but with a grippy exterior.
Gurman reports that regardless of the Vision team's work, senior Apple decision-makers still consider the external puck concept as a "poor user experience" and want the company to stick with "something closer to an all-in-one design."
If any of this sounds familiar, that's because Gurman reported in June that Apple was still working on a cheaper, lighter successor to its Vision Pro headset. (The device-in-development is distinct from the long-rumored "Vision Air," which was cancelled last year.)
Apple knows it needs to come up with ways to simplify the design and make something cheaper and lighter, and it is said to be actively exploring ways to reduce the headset's weight by experimenting with plastic, titanium, other metals and various materials.
Still, Gurman has been told the work is on "life support" as the company focuses more on smart glasses, which it aims to release in late 2027. Despite the Vision Pro's most senior leaders "pressing their bosses to keep the category alive, funded and growing at Apple," Gurman says there's still no guarantee a new headset will ever launch.
This article, "New Vision Pro Headset: Apple Considering Four Different Concepts" first appeared on MacRumors.com
Discuss this article in our forums
Development Release: openSUSE 16.1 RC
DistroWatch Weekly, Issue 1192
Review: ReactOS 0.4.16
News: Garuda offers NixOS-based edition, KDE turns 30, NetBSD polishes Enlightenment port, Q4OS offers Breeze theme for Trinity, Canonical speeds up kernel patches, postmarketOS becomes Nura
Questions and answers: Identifying the video card
Released last week: Univention Corporate Server 5.2-7, NetBSD 10.2
Torrent corner:....
Dima Kogan: Lunar terminator paradox
There's an optical illusion known by names like the "lunar terminator paradox". This has much discussion and descriptions online, but none made sense in my head, so I wrote this program to figure out what was going on. The paradox:
- The moon is illuminated by the sun
- After sunset, the sun is below, so we would expect the illuminated portion of the moon to point down, towards where the sun is
- This isn't what always happens!
I was camping in the mountains with a friend recently. We were looking up at the sky, just after the sun has set. The moon was clearly pointing up.
After playing with this program, I have clarity: we're looking up at the moon from below. The most pathological case is a full moon. Let's say the moon is on the horizon: elevation=0. If we're looking at this low moon, and the moon is full, the sun is directly behind us. The moon is fully illuminated, and we see 100% of the moon disc lit up.
Now, what happens if the moon is not at the horizon, but higher up at the sky? Effectively, the sun is infinitely far away, so the same part of the moon is lit up. But we're now looking at the moon from below, and we would see some of the dark side on the bottom edge. I.e. the moon appears bright at the top, but has a dark slice missing at the bottom: it points up! Even at sunset.
This is the most clearly weird case. A half-moon has no paradoxical behavior, and the more full the moon, the more clearly we can observe the bright moon pointing up despite the sun being down.
I produce two plots. At 3/4-full moon at sunset we look at the moon as it rises from the horizon all the way up to the zenith:
If the moon is at the horizon (elevation = 0), we see the expected 3/4-lit disc. As the moon rises, we see more and more of its bottom, and thus more and more dark areas show up: It clearly points up at sunset!
We can also move the sun around. Let's say the moon is 60deg up; let's move the sun from new-moon to a full-moon:
In the darkest configuration, we can still see a lit crescent on the bottom: the illumination is all on the opposite side, but we can see a slice of the illuminated back side. As the sun swings around, we see more and more of the moon. At azimuth = 90deg, we have a half-lit moon. Past that, more and more of the moon is visible, always pointing up.
This was also a super interesting study of the current state of AI tools. As I was writing this and debugging, I would talk to Claude and Gemini about how this worked and what I should be seeing. They were both completely unable to comprehend this, and would make infinite circular arguments. Clearly they read some incomplete explanations on the internet (as I have), and lack the reasoning capability necessary to distill it into something resembling "understanding". AGI is not here yet.






