• v2.0.77-dev accfbd3148

    Phandroid v2.0.77-dev Pre-release

    thoralf released this 2026-10-14 10:32:00 +02:00 | 61 commits to main since this release

    Changed

    • Merged upstream Phanpy — 4 commit(s); no Android-fork code changes (see CHANGELOG.phanpy.md for upstream detail):
      • 56a8e3fc Add one more 'View Quotes' menu
      • fa9ba209 Reduce gap between boosts in carousel
      • ee4bd4e5 Try macroTransform
      • 1e4e7d06 i18n updates (fi-FI,tr-TR) (#1613)
    Downloads
  • v2.0.24 89d18c8aa7

    thoralf released this 2026-10-11 23:17:52 +02:00 | 4538 commits to main since this release

    Same fixes as dev 2.0.74 — the findings of the 2026-10-11 whole-project review.

    Fixed

    • Camera capture works again. The native camera component never forwarded the
      ref that the composer clicks, so "Take photo or video" and the toolbar button
      did nothing at all — while the listing advertised the feature. The component is
      patched in place now instead of overridden, so it also produces upstream's current
      attachment shape and cannot silently drift behind upstream again.
    • No more source maps in the APK. Upstream builds them for crash-report
      symbolication, which Phandroid does not ship; Capacitor copied them into the
      assets anyway, so every APK carried its own complete unminified source. They are
      excluded now and the release verifies on the artifact that none remain.
    • Sharing into the running app works, and a share no longer repeats itself. The
      event that signals a share to an already-running app was dispatched on iOS only,
      and the share intent stayed the activity's current intent for its whole life — so
      a warm share did nothing, while every WebView reload re-opened the composer with
      the same old share (by then without its image).
    • A share into a logged-out app waits instead of vanishing. It is kept until you
      log in, and a toast says why nothing happened yet.
    • The status bar follows the theme. It was set once at startup, so a light system
      with a dark app theme gave same-coloured icons on a same-coloured header.
    • Multi-account push no longer kills the other accounts. Turning push off for one
      account unregistered the endpoint every account shares, an endpoint rotation healed
      only the current account, and logging out left the preference behind — so a later
      login silently re-enabled push.
    • Account export: a cancelled share sheet is no longer reported as "Export
      failed"
      , and the cache file is cleaned up by the next export instead of racing
      the app you shared to.
    • German F-Droid clients get a "What's New" text (English content under a German
      heading) instead of an empty update note.

    Added

    • A crash shows a recovery screen instead of a blank app, with a Reload button and
      the stack behind "Error details" — the app has no telemetry, so a screenshot of that
      screen is the only diagnostic you can send.
    • Failures you can act on now say so: camera failure, an unreadable shared image
      and failed push (re-)subscribes show a toast instead of only a console message that
      release builds strip.

    Security

    • The FileProvider no longer exposes all of external storage — only the two
      app-private roots the camera and the export actually use.
    • A shared item's name can no longer make Phandroid delete arbitrary files in its
      private directory; only names that look like the plugin's own image copy are removed.

    Changed

    • Pipeline hardening (no user-visible effect): no secrets while apt-get installs
      fdroidserver, concurrency guards so overlapping runs cannot corrupt each other, job
      timeouts, the signer fingerprint checked before publishing, failure reporting for the
      iPhanpy watcher, and correct release-note labelling.
    Downloads
  • v2.0.21 d10a5bab27

    thoralf released this 2026-10-07 07:33:03 +02:00 | 4552 commits to main since this release

    Changed

    • Merged upstream Phanpy production — 70 commits, including Preact 11, the reworked push
      notification settings, dependency upgrades and translation updates (see
      CHANGELOG.phanpy.md). The automatic sync had stopped at three conflicts in files the fork
      patches; they are resolved the same way as on the dev channel, so prod now runs the same
      code as dev 2.0.65 apart from the app's identity.

    Fixed

    • Push settings keep the chosen policy ("from everyone", "from people you follow", …).
      Upstream moved it into a different field; the native push layer reads it from both places.
    • The inherited Phanpy Rollbar token is gone from prod as well (error logging is off in
      Phandroid; the token had only been removed on the dev channel).

    Added

    • Phandroid has tests of its own, and the pipeline runs them (tests-phandroid/): back
      button, link warning, composer and native login, against the built app in Chromium posing
      as the Android runtime. The upstream sync runs them before pushing a merge, every release
      before signing.
    Downloads
  • v2.0.19 1d2574dcbe

    thoralf released this 2026-09-14 21:23:00 +02:00 | 4626 commits to main since this release

    Fixed

    • The app no longer keeps every scrolled-past post in memory. A timeline appended
      every loaded page to its list and never dropped anything, so posts, their DOM and the
      matching states entries piled up for as long as the reader kept scrolling. Measured
      against a build: ~37 DOM nodes and ~0.12 MB of heap per post, with no ceiling — 520
      posts came to 19.6k nodes and 74 MB. Upstream's state GC could not reclaim any of it,
      because it deliberately skips posts that are still mounted. A browser tab gets closed
      or reloaded and never notices; the Android app is one process that stays alive for
      days. Timelines now keep at most 200 posts mounted, which holds the same run at ~8k
      nodes and lets the GC clear the rest. The reading position is unaffected — an anchored
      post stays put to within 0.4 px when older ones are dropped.
    • Aborting a link preview no longer raises an unhandled rejection. StatusCard cancels
      its unfurl request when a post unmounts but never caught the resulting rejection; with
      posts now unmounting during scrolling, that fired on every trim.
    Downloads
  • v2.0.18 8a7c477ec7

    thoralf released this 2026-09-07 08:24:47 +02:00 | 4629 commits to main since this release

    Fixed

    • Closing a picture opened from a feed returns to the feed instead of opening the post.
      Images tapped in a timeline or a profile's media grid open through ?media-only=, where
      the post page is only a carrier for the image. Closing dropped that parameter and left
      the reader on a post they never asked to open. It now returns to where the picture was
      opened from, computed the same way the post page computes its own close target.
    Downloads
  • v2.0.17 bd5c1ed17a

    thoralf released this 2026-09-06 00:16:46 +02:00 | 4630 commits to main since this release

    Fixed

    • Images opened from a profile's media grid can be closed again. Those open through a
      second URL parameter (media-only) that the close handler did not recognise on this
      channel, so the viewer stayed on screen with no way out except force-quitting the app.
      The dev channel got this in 2.0.28 on 2026-08-22; porting it here was missed.
    Downloads
  • v2.0.16 3a92d58940

    thoralf released this 2026-09-05 16:27:02 +02:00 | 4632 commits to main since this release

    Fixed

    • Structurally prevents the 2.0.14 bug from recurring. app_name,
      title_activity_main, package_name and custom_url_scheme were hand-maintained
      literals in values/strings.xml, duplicating applicationId with nothing to check
      them against it. They are generated from applicationId now and no longer exist as
      editable source, and the release workflow independently verifies app label and OAuth
      scheme against the actually built APK before it is signed.
    Downloads
  • v2.0.15 0869432cc8

    thoralf released this 2026-08-25 08:30:42 +02:00 | 4635 commits to main since this release

    Fixed

    • App name, applicationId string and URL scheme were wrong. 2.0.14 shipped this build
      with app_name, package_name and custom_url_scheme copied from the dev channel
      (values/strings.xml), so the app showed "Phandroid Dev" and carried the dev appId string
      and OAuth scheme in its resources — introduced while adding the UnifiedPush string
      resources. Restored to prod's own values.
    Downloads
  • v2.0.14 ae4f5c2654

    thoralf released this 2026-08-22 23:16:58 +02:00 | 4636 commits to main since this release

    Added

    • Phandroid has its own privacy policy. The one shipped so far was upstream Phanpy's,
      word for word — it described a website on Cloudflare Pages, not an Android app that
      registers for push and asks for notification permission.
    • German translations for the push messages in the native layer, which were hardcoded in
      German so everyone else got German system messages.

    Fixed

    • Push toasts appear reliably — they were posted from a background thread.
    • The dev release pruning works past 100 releases (the listing was not paginated).
    • The iPhanpy watcher no longer re-baselines itself after a network error.
    • CI failures are reported even when the job dies before the checkout, and never on the
      public instance.
    Downloads
  • v2.0.11 13165dbbeb

    thoralf released this 2026-08-17 08:46:15 +02:00 | 4639 commits to main since this release

    Changed

    • Merged upstream Phanpy — 58 commit(s); no Android-fork code changes (see CHANGELOG.phanpy.md for upstream detail):
      • ef1920a1 Allow injection of the commit hash and timestamp for hermetic builds.
      • e450df1e Allow mocking out the build time too.
      • e09e527f Delete .prettierrc.
      • ecb871ec i18n updates (kab) (#1552)
      • 124fd9af Upgrade deps
      • b56ca996 Use punycode.toUnicode for ascii domains
      • a2e7e4f6 Punycode all the things
      • f7c0612e Safari prefers percentage
      • 3febb6a3 i18n updates (ar-SA,ca-ES,cs-CZ,de-DE,eo-UY,es-ES,eu-ES,fa-IR,fi-FI,fr-FR,gl-ES,he-IL,hu-HU,it-IT,ja-JP,ko-KR,lt-LT,nb-NO,nl-NL,oc-FR,pl-PL,pt-BR,pt-PT,ru-RU,th-TH,tok,tr-TR,uk-UA,zh-CN,zh-TW) (#1554)
      • c39b766f Downgrade vite
      • eb238db7 Don't need treeshake: false anymore
      • c3a493de Let's give Vite 8.1 a try again
      • 7924490b Shazam only the avatars part, not the followers text
      • 37b47e35 Sort latest first for changelog
      • 56245a68 Migrate from react-quick-pinch-zoom to react-zoom-pan-pinch
      • 0fc51ac7 Load temml.min.js instead
      • 5467bb5c Attempt to fix weird avatar issues
      • e2dd6504 [autofix.ci] apply automated fixes
      • c143f7ea i18n updates (de-DE,gl-ES,it-IT,pt-BR) (#1555)
      • 1f08c03a Update README.md
      • b0aeb771 i18n updates (fi-FI) (#1557)
      • 2eee0273 i18n updates (fi-FI,pl-PL) (#1558)
      • 6ca018eb Upgrade deps
      • d74dfe0a Fix bugs due to oxfmt upgrade
      • b6d73b29 Make bundle size report smarter
      • da8aeb14 [autofix.ci] apply automated fixes
      • 538c7d4b Fix script error
      • aa9eadd2 Improve size diff table
      • 6d1994fe Fix missing curSize
      • 6bffb3e2 i18n updates (kab) (#1560)
      • d09ee9f6 Small adjustments to how the diff looks
      • 3dc87d24 Estimate gzip
      • 50210175 Update community deployments in README
      • bc0d0419 Update README.md
      • 5f48f84c Include quotes as part of "mentions"
      • d8b11351 i18n updates (pt-BR,zh-CN) (#1561)
      • 9dad55f8 Squircle all the things
      • bc673ea4 Test if this would fix double-click zoom quirk
      • 0b78702e Set buildTime from an env var, but leave now alone.
      • 00edb9e1 Unfurl quoted posts too
      • ad6db1fd i18n updates (pt-BR) (#1563)
      • 7d5adfbb i18n updates (pt-BR) (#1564)
      • 7062c7b3 i18n updates (pt-BR) (#1565)
      • c432942e i18n updates (pt-BR) (#1568)
      • ff134a58 i18n updates (pt-BR) (#1569)
      • 57870e34 i18n updates (ca-ES,pt-BR) (#1570)
      • 68ec2caf Fix missing native image context menu in media modal
      • 9a9da8fa i18n updates (de-DE,pt-BR) (#1571)
      • fabe7404 Update README.md
      • d650f026 Disable opening custom emoji in a modal if inside a link
      • 90511e43 Perf-related fixes for composer
      • fe7a7dc9 Fix search button not working
      • 1aadde48 Possible fix for overlapping compse button and tab bar
    Downloads