René's URL Explorer Experiment


Title: Feature request: airplane mode toggle + per-app offline requirement · Issue #141 · MicroPythonOS/MicroPythonOS · GitHub

Open Graph Title: Feature request: airplane mode toggle + per-app offline requirement · Issue #141 · MicroPythonOS/MicroPythonOS

X Title: Feature request: airplane mode toggle + per-app offline requirement · Issue #141 · MicroPythonOS/MicroPythonOS

Description: Summary MicroPythonOS currently has no first-class way to disable the radios (WiFi, Bluetooth) on the device, and no way for an app to declare it needs to run with networking off. That's a problem for apps that handle secrets — Bitcoin s...

Open Graph Description: Summary MicroPythonOS currently has no first-class way to disable the radios (WiFi, Bluetooth) on the device, and no way for an app to declare it needs to run with networking off. That's a problem ...

X Description: Summary MicroPythonOS currently has no first-class way to disable the radios (WiFi, Bluetooth) on the device, and no way for an app to declare it needs to run with networking off. That's a prob...

Opengraph URL: https://github.com/MicroPythonOS/MicroPythonOS/issues/141

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Feature request: airplane mode toggle + per-app offline requirement","articleBody":"## Summary\n\nMicroPythonOS currently has no first-class way to disable the radios (WiFi, Bluetooth) on the device, and no way for an app to declare it needs to run with networking off. That's a problem for apps that handle secrets — Bitcoin signers, seed-phrase tools, password managers, anything that should be offline-by-construction. Today the user has no UI affordance to airplane-mode the device, and a sensitive app can't communicate that requirement to the framework.\n\n## Today's state (as of 0.10.0)\n\n- WiFi is auto-started on every boot: `mpos/main.py` line 318 kicks off `WifiService.auto_connect()` on a thread, which calls `sta.active(True)` and reconnects to any saved network.\n- The Settings → WiFi app lets users scan / connect / forget networks. There's no \"WiFi: Off\" master switch.\n- `WifiService.temporarily_disable()` / `temporarily_enable()` exist (`mpos/net/wifi_service.py` line 391+), but the docstring is explicit that the intent is ADC2 conflict resolution on ESP32-S3 — not security.\n- The only WiFi-off code path that runs in normal use is the power-save in `auto_connect()` (line 381) when initial connection fails.\n- There's no `airplane`, `secure_mode`, `offline_mode`, or `network_disabled` setting anywhere in the codebase.\n- Bluetooth: MPOS bundles no BLE code at all. The ESP32-S3 has the silicon, MPOS just doesn't activate it. So today BLE is \\\"off by accident\\\", which is fine, but if BLE support is added later, the same security gap would emerge for it.\n\n## What I'd like\n\n### 1. User-facing: airplane mode toggle\n\nA toggle in Settings (probably next to the existing WiFi entry, or as a top-level entry) labelled \\\"Airplane mode\\\" / \\\"Offline\\\". When ON:\n\n- The connectivity manager doesn't auto-connect on boot\n- `WifiService.auto_connect()` no-ops while the toggle is on\n- Any currently-active connection is dropped and `sta.active(False)` is called\n- A visible indicator on the status bar / launcher so the user knows networking is disabled\n- (Future) if/when Bluetooth ships, the same toggle gates the BLE stack\n\nBacking pref: something like `mpos.settings.airplane_mode = true/false`, read by `WifiService.auto_connect` (and the future BLE init).\n\n### 2. Per-app: declare offline requirement in MANIFEST\n\nA new optional manifest field:\n\n```json\n{\n  \\\"requires_offline\\\": true\n}\n```\n\nWhen an app with `requires_offline: true` is launched:\n\n- If airplane mode is already on, the app just launches normally.\n- If airplane mode is OFF, MPOS shows a one-tap dialog: \\\"This app requires offline mode. Enable airplane mode to continue?\\\" → user confirms → airplane mode flips on → app launches.\n- On the app's `onPause` / `onDestroy`, airplane mode does NOT automatically flip back. The user explicitly turned it on (with consent), so they explicitly turn it off later — never a surprise reconnect mid-session, never a surprise reconnect after sensitive work.\n\n### 3. Programmatic API for apps\n\nSo a security-conscious app can also enforce \\\"radios down\\\" defensively without relying solely on the manifest gate:\n\n```python\nfrom mpos.net.airplane import AirplaneMode\n\nAirplaneMode.enable()   # disables WiFi (and BLE if present)\nAirplaneMode.is_enabled()\nAirplaneMode.disable()  # explicit user-consent flow, not auto\n```\n\nA `mpos.net.airplane.AirplaneMode` class (analogous to `WifiService`) seems like the right shape — keeps the radio policy in one place rather than scattered across each app.\n\n## Why this matters\n\nLightning Piggy is the obvious nearby example — it's a display-only wallet so WiFi-on is fine. But MicroPythonOS could also be a great target for **hardware-wallet-style apps**: a Nostr signer, a BIP-32 cold storage viewer, a secp256k1 PSBT signer, a passphrase manager. All of those want \\\"radios off\\\" as a foundational property, not as something each app re-implements with `WifiService.temporarily_disable()` (a private API meant for ADC2). Without an airplane-mode primitive, MPOS is implicitly an \\\"online-only\\\" OS.\n\n## Implementation sketch\n\n1. Add `airplane_mode` pref to `com.micropythonos.settings`\n2. Gate `WifiService.auto_connect()` and `WifiService.connect()` on it (early return if true, plus immediate `sta.active(False)` if any radio is up)\n3. Add a settings activity row that toggles the pref + a small icon in the launcher / status area\n4. Manifest schema: optional `requires_offline: bool` field in `META-INF/MANIFEST.JSON`. Handle in the launcher / activity-start path.\n5. Public Python API: `mpos.net.airplane.AirplaneMode` with `enable / disable / is_enabled`.\n\nHappy to take a first pass at this if there's interest — would prefer to align on the API shape first so we don't end up with two competing surfaces.\n\n## Related\n\n- MicroPythonOS#140 — separate decoder bug; not security-related but happened to come up while developing the LP on-chain wallet which prompted thinking about this","author":{"url":"https://github.com/bitcoin3us","@type":"Person","name":"bitcoin3us"},"datePublished":"2026-05-20T15:49:32.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/141/MicroPythonOS/issues/141"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:b4afd70c-eea6-805d-2209-6e76e02dbd64
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idE2FC:102756:2ABD5E5:3BF2E11:6A4F7044
html-safe-noncea3edc25b3ff5ae2cb6fd17f69c248c6b003874d41f30864c14871c1d550c4665
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFMkZDOjEwMjc1NjoyQUJENUU1OjNCRjJFMTE6NkE0RjcwNDQiLCJ2aXNpdG9yX2lkIjoiNzQzNzM3MTczNjEyNTgyOTE4OCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmaceb7fd695b9c34c5c762d10ec8455a2377e4ae687233cc543f231f7792c96e8a7
hovercard-subject-tagissue:4487925769
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/MicroPythonOS/MicroPythonOS/141/issue_layout
twitter:imagehttps://opengraph.githubassets.com/67656a2808fb514185d020a53688fa7f0b50ff159bfa23300c994dc2b48b23d3/MicroPythonOS/MicroPythonOS/issues/141
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/67656a2808fb514185d020a53688fa7f0b50ff159bfa23300c994dc2b48b23d3/MicroPythonOS/MicroPythonOS/issues/141
og:image:altSummary MicroPythonOS currently has no first-class way to disable the radios (WiFi, Bluetooth) on the device, and no way for an app to declare it needs to run with networking off. That's a problem ...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernamebitcoin3us
hostnamegithub.com
expected-hostnamegithub.com
Noneb92d11c0aa4a77d54ef4af1078b6a15fb5a70a215b30c4ecf28889d5a8e656d9
turbo-cache-controlno-preview
go-importgithub.com/MicroPythonOS/MicroPythonOS git https://github.com/MicroPythonOS/MicroPythonOS.git
octolytics-dimension-user_id213598128
octolytics-dimension-user_loginMicroPythonOS
octolytics-dimension-repository_id975472483
octolytics-dimension-repository_nwoMicroPythonOS/MicroPythonOS
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id975472483
octolytics-dimension-repository_network_root_nwoMicroPythonOS/MicroPythonOS
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release4b249b445842943ed31549e027f57a8ade9881ed
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/MicroPythonOS/MicroPythonOS/issues/141#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2FMicroPythonOS%2FMicroPythonOS%2Fissues%2F141
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2FMicroPythonOS%2FMicroPythonOS%2Fissues%2F141
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=MicroPythonOS%2FMicroPythonOS
Reloadhttps://github.com/MicroPythonOS/MicroPythonOS/issues/141
Reloadhttps://github.com/MicroPythonOS/MicroPythonOS/issues/141
Reloadhttps://github.com/MicroPythonOS/MicroPythonOS/issues/141
Please reload this pagehttps://github.com/MicroPythonOS/MicroPythonOS/issues/141
MicroPythonOS https://github.com/MicroPythonOS
MicroPythonOShttps://github.com/MicroPythonOS/MicroPythonOS
Notifications https://github.com/login?return_to=%2FMicroPythonOS%2FMicroPythonOS
Fork 82 https://github.com/login?return_to=%2FMicroPythonOS%2FMicroPythonOS
Star 737 https://github.com/login?return_to=%2FMicroPythonOS%2FMicroPythonOS
Code https://github.com/MicroPythonOS/MicroPythonOS
Issues 23 https://github.com/MicroPythonOS/MicroPythonOS/issues
Pull requests 7 https://github.com/MicroPythonOS/MicroPythonOS/pulls
Discussions https://github.com/MicroPythonOS/MicroPythonOS/discussions
Actions https://github.com/MicroPythonOS/MicroPythonOS/actions
Projects https://github.com/MicroPythonOS/MicroPythonOS/projects
Security and quality 0 https://github.com/MicroPythonOS/MicroPythonOS/security
Insights https://github.com/MicroPythonOS/MicroPythonOS/pulse
Code https://github.com/MicroPythonOS/MicroPythonOS
Issues https://github.com/MicroPythonOS/MicroPythonOS/issues
Pull requests https://github.com/MicroPythonOS/MicroPythonOS/pulls
Discussions https://github.com/MicroPythonOS/MicroPythonOS/discussions
Actions https://github.com/MicroPythonOS/MicroPythonOS/actions
Projects https://github.com/MicroPythonOS/MicroPythonOS/projects
Security and quality https://github.com/MicroPythonOS/MicroPythonOS/security
Insights https://github.com/MicroPythonOS/MicroPythonOS/pulse
Feature request: airplane mode toggle + per-app offline requirementhttps://github.com/MicroPythonOS/MicroPythonOS/issues/141#top
https://github.com/bitcoin3us
bitcoin3ushttps://github.com/bitcoin3us
on May 20, 2026https://github.com/MicroPythonOS/MicroPythonOS/issues/141#issue-4487925769
lv.image.set_src() silently fails on 8-bit RGBA PNGs (LV_COLOR_DEPTH=16, lodepng) #140https://github.com/MicroPythonOS/MicroPythonOS/issues/140
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.