Join the discussion

Write your take first — we'll ask for email only when you're ready to publish.

  • Hacker News
  • I don't understand the comments to this post. Don't people use firewalls anymore to limit internet access only to the apps really needing it?
  • I had the goal to eliminate annoying ads in some apps that I use. I deleted the user data for those apps and also applied restrictions so they could no longer access internet. Ads still showed up.

    I mostly stopped using these types of apps and switched to F-Droid alternatives.

  • Firewalls are already a pain for desktop OS. They are basically unusable on mobile for normal users.
  • No, most people do not.
  • Could you please recommend a comfortable personal firewall app for Android?
  • This sounds great and I would like to try it on my iPhone. Will you be developing an IOS version?
  • Well done!

    > A tiny, open source, fully offline file viewer for Android that opens PDF, Word,

    Perhaps correct Word to DOCX. Word is not just DOCX and DOCX is not just Word. This user needs DOC viewing and would be disappointed having installed this app.

    I wish you every success with this.

  • Fair enough, fixed that in the README.
  • Seems nice, will check it out. I liked this one as well: "Little File Explorer – File Manager for Android 1.0 and above" 28.dec.2023 https://news.ycombinator.com/item?id=38789958
  • Since everything is offline, what ended up being the hardest format to support while keeping rendering faithful?
  • Why would rendering a document need internet access?
  • pptx by a mile. A slide is absolutely positioned shapes with a whole layout inheritance thing going on so the JS renderer ends up reimplementing a whole layout engine, and it gets you to "approximately right" and stops there. Charts I gave up on.

    docx was annoying in a different way. Bullets came out as junk characters for a while and I couldnt work out why. I then found that Word writes them as private use area codepoints in the Symbol font so unless you have that exact font you get some junk. I just map them back to unicode after the render.

    xlsx was the easy one, SheetJS does the hard part.

    On faithful though none of this is faithful the way LibreOffice is. Its more that "you can read the document and it looks roughly right" which is what I wanted out of an app of 14MB.

  • Thanks for sharing. Could it be possible to add optional force-dark mode for documents as well? The feature list mentioned dark mode, but that's for app's own UI. The really awesome feature would be to be able to invert the document colors so that the document itself is shown in dark mode. Thanks.
  • Could you publish to a store? Either/or Google Play or F-Droid
  • Seconded.
  • Can you add odt, ods, etc support? I use libreoffice viewer but it would be nice to reduce the number of apps on my device.
    by sgc
  • ods actually already works.. it goes through the same SheetJS path as xlsx and csv. But your question made me check properly and there's a bug... I never registered the OpenDocument mime type so Gander wont show up in the "open with" list when you tap a .ods. Opening it from inside the app works fine.

    Fixed in the manifest just now, it'll be in the next build.

    odt and odp dont work at all. odt is a fair ask.. its the same shape of problem as docx so it's doable. Less sure about odp though.. the pptx renderer is already the weakest part of this.

    And yeah, fewer apps on the phone was pretty much the whole reason I started building this.

  • This looks great. It seems crazy how we got to this point where this is a revolutionary, unique product.
  • Tried it and I love it. Good work! Have you considered hosting it on F-Droid?
  • That is listed in the Roadmap section right at the end of the README.md file
  • Obtainium works just fine with the github source
  • Please add signature to readme so users can verify before installing with Obtainium eg:

    5B:5C:F6:4A:94:23:7C:D5:F0:E0:85:76:00:38:BC:1C:EB:DF:18:DA:BA:5C:B3:EA:CA:7C:15:9F:22:A7:E2:4B

  • Added, it's in the README under Install now. Thanks for bringing that up!
  • This is interesting.

    I thought granting internet access to apps is not avoidable on Android.

    When an app does not request internet, is it really guaranteed that it cannot talk to the outside world? Or is it having other avenues like opening a browser or some other component with a custom url or something?

    Update: I just asked Gemini, and it does not look good:

    An Android app without the INTERNET permission is not guaranteed to be isolated from the outside world. While it cannot make direct network connections itself, it can use several other mechanisms to transmit data externally:

    Intent-Based Communication (The Browser) An app can launch an explicit or implicit Intent to hand data over to another app that does have internet access.

    That means the app can open a system browser using a URL containing the data it wants to transmit.

    It can also load a Chrome Custom Tab inside its own UI task, passing data through the URL string.

    There is also Inter-Process Communication: If two apps from the same developer share a User ID (sharedUserId), they run in the same process and share all permissions, including internet access.

    There is also the concept of Content Providers: Content Providers allow apps to share data. An offline app can write data into a shared database or a public Content Provider. A secondary, online-enabled app can then read that database and upload the contents.

  • Christ that's depressing.

    I'm assuming that all works even with application sandboxing (1) or am I mis-reading how that is applied to applications.

    Man I need to move my movement to GrapheneOS up to be sooner.

    (1) https://source.android.com/docs/security/app-sandbox

  • GrapheneOS asks for internet permission when you install any app.
  • I guess that makes sense. Since most non-privacy-focused Android distributions don't let users turn off the internet permission, keeping the permission secure likely ceased to be a priority.

    The full list of bypasses is likely much larger because it doesn't fall in the scope of bug bounties.

  • AOSP allows the internet permission to be denied per app (hence LineageOS and Graphene exposing it), it's just most OEMs ROMs don't expose it, you can draw your own conclusions from that.
  • You're aware that the only really secure computing device has no way to connect to a network and is under armed guard?

    Edit: also that LLMs are tuned for "engagement" not for answers like "it's secure enough, move along"?

  • "I just asked Gemini, and it turns out that Mossad can steal my data anyways".

    - An app without the INTERNET permission will crash the moment you try to access the internet. It's like a rite of passage of every android developer with every new project, you forgot the permission.

    - Launching an Intent is EXTREMELY visible. It opens a full on browser. It's limited to a GET with a dedicated URL, so what are they going to do, stuff your data in query params ?

    - Even in the case of another app being installed that would silently receive this intent and not pop an activity, you need a different app. It cannot be an activity added by the same package.

    - Loading a Chrome Custom Tab opens a whole ass browser in front of you, think you're going to miss it ?

    - Shared user IDs also require two different app installations and you cannot declare multiple. You also cannot have sharedUserId if you do not sign the apps with the same key. you cannot sharedUserId with Facebook, you need once again a dedicated app installation.

    - A ContentProvider needs a dedicated permission on the writing app AND on the reading app, which is once again very visible.

    I'll add more to your list: an app can request to write a file inside your downloads folder, and another one can show a popup asking you to open it! And if someone shows up with a hammer at your door, he can also hit your fingers really hard to make you tell him the data.

    Android apps are, by default, very well isolated. INTERNET is a permission like any other, just not surfaced as a dangerous one (like permanent access to your background location would be), or a runtime one (like access to your current location while the app is in foreground)