Skip to content

Releases: BEKO2210/foldpage-android

FoldPage 1.13 — the release build speaks again

Choose a tag to compare

@BEKO2210 BEKO2210 released this 13 Aug 11:08

Reading aloud works in the released build. 1.12 shipped with a fault that
only existed once the build was minified: the app died the moment it tried to
speak with one of its own voices.

Fixed

  • The app no longer crashes at the first spoken word. FoldPage's speech
    engine reads its configuration across the Java/C++ boundary by field name.
    The release build renamed those fields to save space, the C++ side found
    nothing where it looked, and the process was killed outright — no message, no
    Java stack trace, and no sign of it in the debug build, which is not
    minified. Those names are part of the interface now and stay put.

Nothing else changed. The fix is one build rule and the note that explains why
it must not be removed.

Install

Around 120 MB, because this APK carries the speech engine for all four
processor types. The Play build is split per device and downloads about 30 MB.
Voices are in neither — they arrive only when you ask for one.

Android 7.0 (API 24) or newer. Same signing key as 1.12, so it installs over it
and your library stays.

apksigner verify --print-certs foldpage-1.13.apk

Certificate SHA-256:
84:50:48:E1:19:8E:0C:8C:2C:88:34:68:CD:14:14:46:03:13:76:4A:4A:CB:C7:CE:3A:D0:46:99:B0:A9:72:72

File SHA-256:
017ea6d51ef3073d4d2166701d92aa9a355daec7f11f1c7d1d0e16a8731319f9

Checked

58 unit tests green. The build was installed on a Galaxy S23 Ultra over 1.12,
an article read aloud from start to finish with a downloaded voice, and the
R8 mapping confirms the configuration fields keep their names.

FoldPage 1.12 — reading aloud, in its own voice

Choose a tag to compare

@BEKO2210 BEKO2210 released this 13 Aug 02:43

FoldPage now reads aloud in its own voice. No second app to install, no
account, nothing leaves the phone.

What is new

  • FoldPage carries a speech engine. Reading aloud no longer depends on
    whichever engine the phone happens to have. A neural voice for your language
    is fetched inside the app — about 20 MB — and works offline from then on.
  • A language, then its voices. Pick a language and you see the voices for
    that language and nothing else: FoldPage's own first, the phone's below,
    each with a listen button before you keep it. 31 voices across 22 languages;
    two each for German, English, French, Italian, Spanish, Dutch, Portuguese,
    Polish and Russian.
  • The download is a real flow — size before the tap, a bar with bytes,
    cancel, one plain sentence and a retry when it fails, remove when you no
    longer want it, and a line saying what the voices take up altogether.
  • One control for the thing the app is for. The reader's six identical
    glyphs became a labelled Listen and three quieter buttons.
  • Articles got their typography back. Paragraph spacing and real headings
    had been flattened by a CSS reset; the scale is measured and guarded now.
  • Settings stopped being a wall — 3,288 px of bordered cards became 2,284 px
    of sections, and two columns from a tablet's width up.
  • No developer words on screen, checked on every build.

Fixed

  • Reading aloud produced audio nobody could hear: the player returned as soon as
    the samples were queued and then released the track. It waits for the last
    sample now.
  • An uninstalled speech engine made the app silent with nothing on screen to say
    so. A stored choice that no longer exists is forgotten and re-picked before
    the first word.
  • A failed download could delete a working voice. Installs are atomic.
  • The page could be dragged sideways and stay there.
  • The welcome screen showed machine voice names ("en-us-x-msm00013-local").

Install

Around 120 MB, because this APK carries the speech engine for all four
processor types. The Play build is split per device and downloads about 30 MB.
Voices are in neither — they arrive only when you ask for one.

Android 7.0 (API 24) or newer.

apksigner verify --print-certs foldpage-1.12.apk

Certificate SHA-256:
84:50:48:E1:19:8E:0C:8C:2C:88:34:68:CD:14:14:46:03:13:76:4A:4A:CB:C7:CE:3A:D0:46:99:B0:A9:72:72

File SHA-256:
9b595252950366170f732fffcca185aa24aa726c6c02b898c0a22da254c4154c

Under it

58 unit tests, 39-article extraction corpus, 148 rendered reader pages, a
browser pass over every route in four modes, an audit for developer words, 27
checks on the language → voice rule, 12 on keyboard operation, and a structural
accessibility audit — all green. What a machine cannot judge is listed as
unverified in docs/UI-BASELINE.md rather than implied.

FoldPage 1.11 — Vorlesen, das sich selbst einrichtet

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 19:06

Erste reguläre Veröffentlichung nach den 1.9-Betas — kein Vorab-Bau mehr.

Vorlesen richtet sich selbst ein

Eine Sprache, eine Stimme: FoldPage sucht über alle installierten Engines
die beste Stimme je Sprache (nur lokale Stimmen, exakte Region vor bloß
verwandter, dann Androids eigene Qualitätsbewertung) und benutzt sie. Keine
Auswahl von Engine, Stimme oder Sprache mehr — einstellbar bleibt, was man
hören kann: Tempo, Tonhöhe, Länge der Pausen.

Der Hintergrund: Ein Telefon hat eine Standard-Engine, eine Bibliothek
mehrere Sprachen. Auf dem Testgerät trägt die neuronale deutsche Engine genau
eine deutsche Stimme und kein Wort Englisch — englische Artikel blieben stumm,
ohne dass irgendetwas es erklärt hätte.

Wie es klingt

  • Absätze werden satzweise gesprochen, mit Pausen an den Satzenden.
  • Überschriften bekommen einen Punkt, damit die Stimme abfällt statt in den
    Absatz zu laufen; Fußnotenmarken, Aufzählungszeichen und nackte URLs fallen
    aus dem Sprechtext (auf dem Bildschirm bleibt alles stehen).
  • Gemessene Stille zwischen zwei Absätzen: 0,23–0,35 s (Google TTS).

Sperrbildschirm und Fortsetzen

Media-Session mit Steuerung, und die Stelle im Artikel überlebt einen
App-Neustart — angeboten als „Continue", nie von selbst gestartet.

Feinschliff

Karte sinkt beim Drücken, Kopfzeile bekommt beim Scrollen eine Kante,
Lade-/Leer-/Fehlerzustände teilen sich eine Feder, Sprungmarken in den
Einstellungen, und beim Öffnen eines Artikels wandert der Kartentitel in die
Überschrift.

Zahlen und Methode: docs/SPEECH.md, docs/MOTION.md.

FoldPage 1.8 — der Reader wird gemessen, nicht behauptet

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 09:01

Fünf Arbeitsläufe seit 1.7. versionCode 10, signiert mit dem Play-Upload-Key.

Diesmal ging es um den Reader selbst — und dreimal war nicht der Code das Problem, sondern das Messgerät.

Der Artikel hat keine Löcher mehr

285 leere Absätze über 15 Artikel — Reste entfernter Werbeflächen, Platzhalter, Absätze mit nichts als einem Zählpixel. Jeder davon war eine Lücke mitten im Text. Entfernt, ohne einen einzigen Wortbestand zu ändern (85.676 Wörter vorher wie nachher). Ein <br> ist ein gewollter Umbruch und bleibt.

Eine Paywall heißt jetzt Paywall

Zwei Artikel wurden bisher als 29-Wörter-„Artikel" unter der echten Überschrift gespeichert — in Wahrheit der Cookie-Hinweis. Das ist schlimmer als ein Fehlschlag: es sieht aus wie der Artikel und fällt erst beim Lesen auf, womöglich offline. Jetzt bricht die Extraktion mit einer klaren Meldung ab. Bedingung bewusst zweiteilig — unter 150 Wörter und Wandformel —, damit eine Analyse über Bezahlschranken ein Artikel bleibt.

Englische Seiten sahen nur sauber aus

Die Möbel-Erkennung war fast rein deutsch — auch im Messskript. Deshalb meldeten alle englischen Quellen null Befunde, während sie Affiliate-Hinweise, Autoren-Biografien und Lizenztexte als Artikelende mitschleppten. Erst das Messgerät erweitert (4 Befunde sichtbar), dann behoben (4 → 0), dabei nur 174 Wörter entfernt.

Auf dem Tablet war die Zeile 93 Zeichen lang

Die Zeilenlänge wurde gemessen, aber nichts erzwang sie. Jetzt ist sie eine Bedingung — und der erste Lauf fand sofort: Telefon 41 Zeichen (gut), Tablet Median 93, Maximum 141. max-width: 39em unterstellte eine Zeichenbreite, die die Schrift nicht hat. Jetzt min(39em, 56ch): Tablet-Median 51.

Wischen

Nach rechts archivieren, nach links löschen — mit demselben Undo. Die Knöpfe bleiben: eine Wischgeste existiert für TalkBack und Tastatur nicht.

Barrierefreiheit, erstmals systematisch geprüft

Drei Befunde gefunden und behoben: die Einstellungen liefen bei doppelter Systemschrift 267 px über den Rand (der native Datei-Wähler), die Regler passten dann nicht mehr nebeneinander, drei Bedienelemente im Reader lagen unter 44 px. Offen und benannt: der Fokus bleibt nach einem Seitenwechsel auf <body> — das braucht einen TalkBack-Durchgang am Gerät.

Außerdem

npm run set-version -- 1.9 setzt Version an allen drei Stellen und erhöht versionCode; --check meldet Abweichungen mit Fehlercode. Genau die zwei Fehler, die uns bei 1.5 und 1.6 passiert sind.

Abnahme

Tests 27/27 grün
Korpus 37 extrahierbare Artikel, 2 Paywalls korrekt abgelehnt
Reader-Lab 148 Renderings, 2 Viewports, 84 Tabellenprüfungen, 0 Befunde
Barrierefreiheit 3 Routen, keine Befunde mehr

Zertifikat SHA-256 84:50:48:E1:…:72:72, unverändert seit 1.5.

FoldPage 1.7 — Bilder bleiben auf dem Telefon

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 07:48

Fünf Arbeitsläufe seit 1.6. versionCode 9, signiert mit dem Play-Upload-Key.

Bilder bleiben auf dem Telefon

Bisher speicherte FoldPage nur die Adressen der Bilder eines Artikels. Ohne Netz fehlten sie, mit Netz erfuhr der fremde Server bei jedem Öffnen Lesezeit und IP. Jetzt liegen sie in der App — einmal je Bild, egal in wie vielen Artikeln es vorkommt.

Gemessen, nicht geschätzt: der mittlere Artikel kostet 56 KB, ein einzelner Listen-Artikel mit 301 Teaser-Bildern dagegen 5,4 MB. Deshalb Deckel bei 2 MB je Bild, 4 MB und 40 Bildern je Artikel — für 100 Artikel rund 25 MB. Dazu ein Schalter („With the article" / „Link only"), ein Nachladen für alles, was vorher gespeichert wurde, und „Free up space".

Lese-Einstellungen

Hinter dem Zahnrad im Reader und in den Einstellungen: Theme (System/Hell/Dunkel), Textgröße, Serif oder Sans, Flatter- oder Blocksatz mit Silbentrennung, Zeilenabstand. Beim Umschalten bleibt der Text an derselben Stelle stehen. Kein Aufblitzen des Systemthemes mehr beim Start.

Kleineres, das im Alltag zählt

  • Artikel neu laden — eine Seite, die hinter einer Consent-Wand halb kaputt ankam, ist kein Dauerzustand mehr. Tags, Stern, Ablage und Lesefortschritt bleiben.
  • Langsames Speichern abbrechen — nach fünf Sekunden ein Hinweis und „Stop waiting".
  • Suche zeigt ihre Arbeit — Trefferzahl, markierter Begriff, und ein Hinweis bei Artikeln, deren Treffer nur im Fließtext steht.
  • Ein Stern lädt nicht mehr die halbe App neu — bei 200 Artikeln 411 ms → 271 ms.
  • Große Bildschirme: dritte Spalte, zentriertes Einstellungsfenster, Querformat geprüft.

Abnahme

Tests 23/23 grün
Korpus 39 Artikel, Extraktion unverändert
Reader-Lab 156 Renderings, 2 Viewports (412×915 und 1024×768), 84 Tabellenprüfungen, 0 Befunde

Prüfen

apksigner verify --print-certs foldpage-1.7.apk

Zertifikat SHA-256 84:50:48:E1:…:72:72 — derselbe Play-Upload-Key wie ab 1.5.

FoldPage 1.5 — bald im Play Store, neu signiert

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 00:42

Ab dieser Version laeuft die Auslieferung ueber den Google Play Store — der
Eintrag ist eingereicht. Die APK hier bleibt fuer alle, die sie direkt
installieren wollen.

Neuer Signaturschluessel

1.5 ist mit dem Play-Upload-Key signiert, nicht mehr mit dem Keystore der
Versionen bis 1.4. Ein Update ueber eine installierte 1.4 lehnt Android deshalb
ab ("App nicht installiert") — die alte Version vorher deinstallieren. Da 1.4
nie oeffentlich verteilt wurde, betrifft das praktisch niemanden.

Zertifikat SHA-256:

84:50:48:E1:19:8E:0C:8C:2C:88:34:68:CD:14:14:46:03:13:76:4A:4A:CB:C7:CE:3A:D0:46:99:B0:A9:72:72

Pruefen mit apksigner verify --print-certs foldpage-1.5.apk.

SHA-256 der Datei:

c9c518bd681c58051437f049c884f58b8295339625cae0e929c7e50e21fee41d  foldpage-1.5.apk

Signiert nach APK Signature Scheme v2 und v3, RSA 2048.
Benoetigt Android 7.0 (API 24) oder neuer. versionCode 7.

FoldPage 1.9 Beta 3 — Weg zu Androids Stimmen-Einstellungen

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 15:31

Beta 3. 1.9, versionCode 11, Play-Upload-Key — installiert sich über die vorhandene Installation.

Die Stimme gehört nicht FoldPage. Es spricht die Engine, die das Telefon eingestellt hat; fehlt sie, ist sie abgeschaltet oder hat keine Stimme für die Sprache, bleibt die App stumm und kann von innen nichts reparieren.

Neu in Einstellungen → „Reading aloud"

  • „Android speech settings" — öffnet Androids eigenen Bildschirm: Engine, Geschwindigkeit, Sprache und der Knopf „Beispiel anhören". Der entscheidet die Frage: Ist es dort still, liegt es nicht an FoldPage.
  • „Install voices" — Sprachpakete nachinstallieren.
  • „Check the voice" — geht die Kette durch und nennt jetzt auch die vorhandenen Sprachen der Engine.

Zwei Dinge, die außerhalb der App liegen

  1. Sprache läuft auf der Medien-Lautstärke, nicht auf der Klingel-Lautstärke. Ein Telefon mit lautem Klingelton und stummen Medien ist genau hier still und sonst nirgends.
  2. Kehrt das Testwort in unter 250 ms zurück, war das nicht lang genug für ein gesprochenes Wort — die Engine hat still aufgegeben.

Andere Engines gehen auch

FoldPage benutzt die Standard-Engine des Systems. Wer eine bessere will, installiert sie (Google Speech Services, Samsung TTS, RHVoice, Piper-basierte Apps) und wählt sie auf demselben Bildschirm aus — die App braucht dafür keine Änderung.

FoldPage 1.9 Beta 2 — Stimmen-Selbstprüfung

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 15:21

Beta 2. Gleiche Version wie Beta 1 (1.9, versionCode 11), signiert mit dem Play-Upload-Key — installiert sich über die vorhandene Installation, ohne die Bibliothek zu verlieren.

Einziger Zweck: herausfinden, warum das Vorlesen stumm bleibt.

Einstellungen → „Reading aloud" → „Check the voice"

„Es passiert nichts" ist keine Fehlermeldung. Vorlesen läuft durch ein Plugin, einen Systemdienst und ein Sprachpaket, und jedes davon kann wortlos fehlen. Die Prüfung geht die Kette durch und zeigt das erste Glied, das reißt:

  1. App oder Browser-Build
  2. Plugin geladen
  3. Engine antwortet — mit Anzahl der Sprachen
  4. Stimme für de-DE vorhanden
  5. Testwort gesprochen — mit Zeitmessung: Wer unter 250 ms zurückkommt, hat nicht gesprochen, sondern still aufgegeben

Daneben steht „Install voices", das Androids eigene Installationsseite öffnet.

Im Reader

Während des Vorlesens steht jetzt „Reading part 3 of 24" unter der Kopfzeile. Damit sieht ein Lauf, der startet und hängt, anders aus als einer, der nie startet.

Was vorher schon ausgeschlossen wurde

Die native Seite ist intakt: Die Plugin-Klasse überlebt R8 unter ihrem eigenen Namen (im Release-Mapping geprüft), das zusammengeführte Manifest enthält den <queries>-Eintrag für TTS_SERVICE, den Android 11+ braucht, um eine Sprach-Engine überhaupt zu sehen, und das Plugin steht in capacitor.plugins.json.

SHA-256: 3daa27457d9acc4b8efeddef2446558fe2229bd0b6242fa4128020c07d287150

FoldPage 1.9 Beta — Vorlesen, schnelle Suche, neues Zeichen

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 14:16

Beta. versionCode 11, signiert mit dem Play-Upload-Key, Release-Variante (minifiziert, nicht debuggable). Installiert sich über eine vorhandene 1.8.

Vorlesen — neu

Ein ▶-Knopf im Reader. Androids eigene Sprach-Engine liest den Artikel: kein Modell, kein Download, nichts verlässt das Telefon.

Der Artikel wird in Blöcke zerlegt — Absätze, Überschriften, Listenpunkte, Zitate, Bildunterschriften — und einzeln gesprochen. Das ist der Kern: Eine Engine, der man zwanzigtausend Zeichen gibt, liefert ein einziges undurchsichtiges Versprechen und keine Möglichkeit, anzuhalten oder zu sagen, wo sie ist. Blockweise ist beides da. Der laufende Absatz wird markiert und in Sicht gescrollt.

Die Sprache kommt aus dem Artikel, nicht aus der Systemsprache. Fehlt die Stimme, sagt die App das und öffnet Androids Installationsseite.

Noch nicht enthalten: Sperrbildschirm-Steuerung und Fortsetzen nach einem App-Neustart. Die Stelle merkt sich der Player nur innerhalb der Sitzung.

Suche und große Bibliotheken

Wortindex in einem eigenen Store und eine Liste, die 40 Karten rendert statt aller. Bei 1.000 Artikeln gemessen, dieselbe Maschine, dieselbe Abfrage:

vorher nachher
Bibliothek öffnen 1.789 ms 522 ms
Volltextsuche 1.348 ms 139 ms
dieselbe mit Index 103 ms

Datenbank-Schema 3, rein additiv — eine alte Bibliothek öffnet unverändert. Altbestand nachtragen unter Einstellungen → „Index for search".

Neues Zeichen

Das App-Symbol war ein Blatt mit drei Linien und einer kleinen gelben Ecke; bei 48 px blieb ein beliebiges Dokument-Symbol übrig. Jetzt nimmt die Falz ein Drittel des Blattes — dieselbe Geometrie in Kopfzeile, Willkommensbild und Splash. Die „gelesen"-Ecke auf der Karte ist eine echte umgeschlagene Ecke statt eines gelben Spitzes.

Barrierefreiheit

Der Fokus landet nach einem Seitenwechsel auf der Überschrift der neuen Seite statt auf <body> — für TalkBack der Unterschied zwischen „hier bist du" und „such es dir". Die Bibliothek hat erstmals überhaupt eine Überschrift.

Abnahme

34 Tests grün · Korpus 37 extrahierbare Artikel · Reader-Lab 148 Renderings über zwei Viewports ohne Befund · Barrierefreiheitsprüfung über drei Routen ohne Befund.

Prüfen

apksigner verify --print-certs foldpage-1.9-beta.apk

Zertifikat SHA-256 84:50:48:E1:…:72:72, unverändert seit 1.5.
SHA-256 der Datei: a2f9136ba2478d0efe9eda3b71fca5c95a459bb46c1f7cfb557442285c67626a

FoldPage 1.5-beta1 — Sanitizer-Allowlist (Testbuild)

Choose a tag to compare

@BEKO2210 BEKO2210 released this 12 Aug 06:10

Testbuild, kein Release. Debug-Variante von 1.5 (versionCode 7), gebaut aus dem Branch beta/sanitizer-allowlist.

Was neu ist

Der Sanitizer für gespeicherte Artikel ist von einer Blockliste auf eine Allowlist umgestellt. Gespeichertes HTML wird im eigenen Origin gerendert — was dort ausgeführt wird, kann die ganze Bibliothek aus IndexedDB lesen. Neu geschlossen:

  • <base href> — hätte jede relative URL der App umbiegen können
  • <svg> / <math> — deren Parser akzeptieren Konstrukte, die HTML nicht kennt (<animate attributeName="href">)
  • style — ein position:fixed;inset:0 hätte die eigene Oberfläche überdecken können
  • class — Kollisionen mit dem Stylesheet der App
  • URLs nur noch http(s), mailto, tel, #fragment, data:image

Unbekannte Elemente werden entpackt, ihr Text bleibt erhalten.

Gemessen

Tests 14/14 grün (neuer Test mit 7 Angriffsfällen)
Wortbestand über den Korpus (39 Artikel) 85.676 → 85.676, unverändert
Gespeicherte HTML-Bytes −22,5 %
Befund href-relative 1 → 0

Zum Testen

Der Sanitizer greift beim Speichern. Bereits gespeicherte Artikel behalten ihr altes HTML — für den Test bitte neue Artikel speichern (Wikipedia, heise, eine Seite mit Tabelle) und auf Bilder, seitwärts scrollende Tabellen und Links im Text achten.

Hinweise

  • Signiert mit dem Play-Upload-Key (SHA-256 84:50:…:72:72), lässt sich also über eine installierte 1.5 aktualisieren.
  • Es ist eine Debug-Variante: debuggable, ohne Minify, rund 5 MB statt 1,5 MB. Nicht für den Play Store, nicht zum Weitergeben.
  • SHA-256 der APK: b0fb98cfc74d0c04f4976bd8a58562fef5a18a1c32cbb4bf585da5216bc5d716