At least in contrast to other vendors, FP provides official support for microG, so this has been without noticeable loss of stability/quality for my use cases so far.
301 karma · joined March 15, 2014
At least in contrast to other vendors, FP provides official support for microG, so this has been without noticeable loss of stability/quality for my use cases so far.
It's an interesting example given that Wine considers deriving code from traces of original components (like hypervisor traces) tainted and also bans LLM contributions for legal considerations: https://gitlab.winehq.org/wine/wine/-/wikis/Clean-Room-Guide...
Where? You suggested it would go through Murena instead, but you can fully disable third party services by disabling external push providers and by using on-device databases for GPS. e/OS directly offers this configuration during initial setup.
> And what would you say GrapheneOS does of those? Do you know, or do you just assume that GrapheneOS does the worse there?
I'm not necessarily trying to present either as "better" or "worse" since they both have their merits depending what exactly you're after (which I don't feel this is the right time/place to have a detailed rundown of). It was the root comment that posited e/OS was strictly inferior for people who care about freedom.
The last bit of my sentence could easily be misread as an enumeration of three things ("microG", "OTA updates", "everything included"), but it was actually an elaboration: FP is the only vendor to support microG, and (in contrast to "unofficial" microG setups) it doesn't require sacrifices in convenience because standard features like OTA updates work just like with your average Android. Perhaps that's clearer?
(Notably "Everything included" does not mean it ships a thousand apps or something. To the contrary, FP stock OS is mostly vanilla Android)
Point being: I could install LineageOS on my last phone, but it was a poorly documented process, updates were a hassle (having to flash through custom recovery for lack of OTA), and I had virtually no confidence in data integrity when running major updates.
> Is it better to have microG contacting the Google servers or sandboxed Play Services going through a Graphene-powered proxy?
How about microG not contacting Google servers at all?
In any case you're presenting an unnecessarily binary argument though. Letting Google handle push notifications is different from using them as your location provider, and both are different from letting all Play Services lose on your system.
> And of course, fairphone’s hardware and OS are nothing to write home about. For the freedom and security nerds they’re better off with GrapheneOS on Pixel or whatever upcoming Motorola phones will support it.
For the "freedom nerds", FP is one of the only (if not the only?) vendor to have official support for microG-based operating systems, seamless OTA updates and everything included. The Murena e/OS offering in particular is simple enough that the non-nerds that (perhaps less outspokenly) care about freedom can just pick it up with little change in habits.
A "modular product" has tradeoffs in and of itself (such as size, price, water resistance, …), which presumably would not fly for a majority of customers.
The contact tracing APIs very deliberately avoided GPS for exactly the reason you mention.
For me the nvidia driver just keeps waking up the system instantly - but my setup is deviating from the upstream flake in a few ways, so I'm just wondering if it's worth setting up the system from scratch if it's working for other people.
Other than that, can fully second that the flake is working great. Only gotcha is that CUDA-enabled packages (including Firefox) require using the flox binary cache unless you want to compile them from source, but then the package versions can lag behind a bit (and debugging nix cache issues is surprisingly difficult).
This is still problematic, but the far more dangerous Chat Control 2.0 that would weaken end-to-end-encrypted messengers like Signal is not being discussed here.
Not to diminish the gravity of the new development, but the defeatist "no way to prevent this" narratives that are already popping up here are getting old -- when in fact it looks like 2.0 is off the table for good because protest against it has proven effective.
The effect is understated there, perhaps because Apple speakers are actually somewhat usable without this feature. For the X13s, the speakers might as well not exist in the current state on Linux.
Apple devices supported by Asahi are a far more polished experience.
Yes, there are certainly banks that block more aggressively, but if you look at e.g. iodéOS's forums most of them work fine: https://community.iode.tech/t/banking-finance-and-insurance-...
Anecdotally, I've also seen a lot of stories of people reaching out to support about overblocking actually seeing success. Apparently there are often enterprise reasons for the block and it literally just needs a customer to complain for engineering to be able to act.
Among the "GPU rendered terminal" options, afaik Ghostty is the only one that has proper search/context menus, tabs, and scroll bars. I'm sure it's easy to get by without, but compared to the overall value-add of these terminals (which exists indeed but isn't tremendous either) I find it quite a significant downgrade, so I appreciate that Ghostty has both.
As a minor bonus, the live-reload is also faster than what frameworks like React do. It truly has subsecond latency, which isn't exactly a game changer but is nice when iterating on visual details of an app.
outputs.apps.x86_64.screenshot = {
type = "app";
program = toString (pkgs.writeShellScript "screenshot-script" ''
set -euo pipefail
EMU_SDK="${androidEmulatorComposition.androidsdk}/libexec/android-sdk"
ADB="$EMU_SDK/platform-tools/adb"
EMULATOR="$EMU_SDK/emulator/emulator"
APK="${self.packages.${system}.debug}/myapp-debug.apk"
SRC_DIR="$(${pkgs.git}/bin/git rev-parse --show-toplevel)"
AVD_HOME="$(mktemp -d)"
trap 'kill "$EMU_PID" 2>/dev/null; wait "$EMU_PID" 2>/dev/null; rm -rf "$AVD_HOME"' EXIT
# Create AVD
AVD_DIR="$AVD_HOME/screenshot.avd"
mkdir -p "$AVD_DIR"
cat > "$AVD_HOME/screenshot.ini" <<EOF
avd.ini.encoding=UTF-8
path=$AVD_DIR
target=android-${platformVersion}
EOF
cat > "$AVD_DIR/config.ini" <<EOF
AvdId=screenshot
PlayStore.enabled=false
abi.type=x86_64
avd.ini.encoding=UTF-8
hw.cpu.arch=x86_64
hw.gpu.enabled=yes
hw.gpu.mode=swiftshader_indirect
hw.lcd.density=420
hw.lcd.height=2400
hw.lcd.width=1080
hw.ramSize=2048
image.sysdir.1=system-images/android-${platformVersion}/google_apis/x86_64/
skin.dynamic=yes
tag.display=Google APIs
tag.id=google_apis
disk.dataPartition.size=2G
EOF
echo "==> Starting emulator..."
ANDROID_AVD_HOME="$AVD_HOME" ANDROID_HOME="$EMU_SDK" \
"$EMULATOR" -avd screenshot -no-window -no-audio -no-boot-anim \
-gpu swiftshader_indirect -no-snapshot 2>&1 &
EMU_PID=$!
echo "==> Waiting for boot..."
for i in $(seq 1 90); do
BOOT=$("$ADB" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') || true
if [ "$BOOT" = "1" ]; then
echo " Booted after ~$((i * 2))s"
break
fi
sleep 2
done
if [ "$BOOT" != "1" ]; then
echo "ERROR: Emulator failed to boot" >&2
exit 1
fi
# Enable dark mode
"$ADB" shell cmd uimode night yes
# Install and launch
echo "==> Installing APK..."
"$ADB" install -r "$APK"
"$ADB" shell pm grant com.me.myapp android.permission.WRITE_SECURE_SETTINGS
"$ADB" shell am start -n com.me.myapp/.MainActivity
sleep 3
# Navigate to settings screen by tapping "Notification Filters" button
# This uses uiautomator to find the button by text for robustness
"$ADB" shell uiautomator dump /sdcard/ui.xml
BOUNDS=$("$ADB" shell cat /sdcard/ui.xml \
| ${pkgs.gnugrep}/bin/grep -oP 'text="Notification Filters"[^>]*bounds="\K[^"]+' \
|| true)
if [ -z "$BOUNDS" ]; then
echo "ERROR: Could not find Notification Filters button" >&2
exit 1
fi
# Parse bounds "[x1,y1][x2,y2]" to compute center tap coordinates
X1=$(echo "$BOUNDS" | ${pkgs.gnused}/bin/sed 's/\[\([0-9]*\),\([0-9]*\)\]\[\([0-9]*\),\([0-9]*\)\]/\1/')
Y1=$(echo "$BOUNDS" | ${pkgs.gnused}/bin/sed 's/\[\([0-9]*\),\([0-9]*\)\]\[\([0-9]*\),\([0-9]*\)\]/\2/')
X2=$(echo "$BOUNDS" | ${pkgs.gnused}/bin/sed 's/\[\([0-9]*\),\([0-9]*\)\]\[\([0-9]*\),\([0-9]*\)\]/\3/')
Y2=$(echo "$BOUNDS" | ${pkgs.gnused}/bin/sed 's/\[\([0-9]*\),\([0-9]*\)\]\[\([0-9]*\),\([0-9]*\)\]/\4/')
TAP_X=$(( (X1 + X2) / 2 ))
TAP_Y=$(( (Y1 + Y2) / 2 ))
"$ADB" shell input tap "$TAP_X" "$TAP_Y"
sleep 2
# Capture and process screenshot
echo "==> Capturing screenshot..."
"$ADB" shell screencap -p /sdcard/screenshot.png
"$ADB" pull /sdcard/screenshot.png "$AVD_HOME/raw.png"
# Crop to content: remove status bar (top 128px) and empty space below
# Per-App Overrides, then resize with high-quality Lanczos filter
${pkgs.imagemagick}/bin/magick "$AVD_HOME/raw.png" \
-crop 1080x1100+0+128 +repage \
-filter Lanczos -resize 540x \
"$SRC_DIR/fastlane/metadata/android/en-US/images/phoneScreenshots/settings.png"
echo "==> Screenshot saved to fastlane/metadata/android/en-US/images/phoneScreenshots/settings.png"
'');
};Meanwhile, Linux on my Lenovo X13s "works" but has tons of quirks: Boot fails 2 out of 3 times, the device hard-resets sometimes when waking up with a display connected, and the speakers are unusable due to lack of active overheat protection (and somehow this affects even external speakers). It technically works, but it's incredibly frustrating to use in practice.
If you plan to use Linux and don't need an ARM laptop, there's little reason to prefer a Qualcomm device over an x86 one currently. On the other hand, M1/M2 easily outperform a broad class of x86 laptops, and they have a Linux experience that's for many use cases close to on par with official vendor support.
Granted manually updating the screenshots isn't the most laborious task in the world, but the "upload-apk + take-screenshot + transfer-back-to-PC + edit" process is usually barely annoying enough that you end up almost never doing it otherwise (similar to the OP's experience in the closing paragraph).
https://github.com/zed-industries/zed/discussions/42583
Thanks for building an awesome product :)
export GH_TELEMETRY=false
export DO_NOT_TRACK=true
gh config set telemetry disabled (starting from version 2.91.0, which this announcement refers to)
Signal's server-side push notifications only contain a "wakeup" message. The actual message popup is displayed after decrypting the message contents locally on the device. Of the things you mentioned, only the time of notification is visible to Apple/Google.
"Loads" of private data? When has this allegedly happened or how would it technically even be possible?
NixOS containers are the most convenient way to do this, but those will map the entire global nix store into your container. So while only one app would be in your PATH, all other programs are still accessible in principle. From a threat-modelling perspective, this isn't usually a deal-breaker though.
There's also dockerTools, which lets you build bespoke docker/podman images from a set of nix packages. Those will have a fully self-contained and minimal set of files, at the expense of copying those files into the container image instead of just mapping them as a volume.
It's a valid concern, though perhaps worth mentioning you will be able to restore your 10-year old config as long as the files downloaded from now-broken links are still in the Nix cache. Of course in practice, this is only useful to large organizations that have resources to invest in bespoke infrastructure to ensure supply chain integrity, since any `nix store gc` run will immediately wipe all downloads :(
They don't ask for credit card information when signing up this way, so even if true you won't be charged if you forget canceling.