Skip to content

Repository files navigation

JW Streak 🫶

Unofficial, independent project. JW Streak is not affiliated with or endorsed by Jehovah's Witnesses, the Watch Tower Bible and Tract Society, or JW.org in any way. It's a personal tool, made by a Jehovah's Witnesse, that links out to JW.org / JW Library for their own content, it does NOT host, redistribute, or claim to represent that content as its own !

Hi! JW Streak (JWS) is a friendly Flutter application that helps maintain a daily Bible reading habit, with quizzes, a streak system, achievements, and personal notes. All of this 100% local, no account or server required. While I made JWS for me and others Jehovah’s Witnesses, anyone can use and enjoy it. JWS works on Android, iOS and iPadOS.

Screenshots

Home screen with the streak and today's chapter Reading progress across the whole Bible Achievements Bible browser
Home Progress Achievements Bible browser
Chapter grid for a book Settings Theme picker Home screen in the Amethyst theme
Chapters Settings Themes Amethyst theme

Is it safe for my faith?

Absolutely! The app works hand in hand with the organisation's content and material, so the content cannot be altered or changed by anyone other than our beloved organisation, JW.org. When opening the Bible or the daily text, the app shows it directly in JW Library or jw.org/_____, based on the user's preferences and if JW Library is installed. The only thing that should be verified is the quizzes. I made them myself, and because I'm human, I may have made some mistakes creating them. Regardless, if I receive feedback or a report, I'd be more than happy to fix my mistakes :)

Features

  • Guided Reading: One chapter at a time, opened in JW Library or on jw.org (choice in settings), with progress tracking across the entire Bible.
  • Interactive Quizzes: Multiple choice, typed answer, or word reconstruction with typo-tolerant validation (only fr/en/es/de/it/pt/pl; ru/zh remain multiple choice soory).
  • Streak & Matches: The streak grows each active day; "matches" (earned by completing quizzes) automatically cover missed days
  • Achievements: Milestones unlocked through reading, quizzes, and streaks
  • Personal Notes: Linked to a passage, viewable and exportable from a dedicated library
  • Backup & Restore: Save everything to one readable file and bring it back on another device
  • Configurable Daily Reminders: Simple notifications
  • Onboarding: 4 steps + a guided tour replayable from settings
  • 9 Languages: French (reference language), English, German, Spanish, Italian, Polish, Portuguese, Russian, Simplified Chinese. More to come
  • Theme: Follow system / light / dark / dark OLED, with optional dynamic color (Material 3 E.). More themes on the way

Privacy

  • First things first, you can find JWS's privacy policy at jws.olynthe.org
  • No data leaves the device: no account, no backend, no tracking or analytics.
  • All data (readings, notes, settings, streaks) is stored locally in a cute SQLite db.
  • No fonts or resources are loaded from a server at runtime ; everything is embedded in the APK.

Backup & restore

Everything the app knows lives in one local SQLite database, so a backup is simply that database written out as JSON.

  • Back up my data (Settings → Privacy) writes every table; readings, notes, quizzes, reflections, reminders, streak, achievements and settings to a single dated file and hands it to the share sheet. Where it goes is entirely your choice; the app never uploads anything by itself.
  • Restore from a backup replaces everything on the device with the contents of that file.
  • Setting up a new phone? Tap I already have a backup on the very first screen. Your settings travel with the backup, so you land straight on your own dashboard instead of going through onboarding for data you already have.

The file is plain, readable JSON on purpose. This app's promise is that your data never leaves the device unless you send it somewhere, and a file you can open in a text editor is the only version of that promise you can check for yourself. It also means your notes outlive the app: they are recoverable with nothing more than a text editor.

It is not encrypted and it contains your notes (assuming you wrote something). Keep it somewhere you trust !

Technical Stack

  • Flutter / Dart
  • sqflite : readings, notes, settings, achievements, streak
  • flutter_local_notifications + permission_handler : daily reminders and permissions
  • url_launcher : JW Library deep link, web fallback jw.org
  • dynamic_color : optional Material You palette
  • flutter_markdown, pdf, share_plus : note sharing
  • file_selector : picking a backup file to restore

Project Layout

lib/
  main.dart              app entry point
  app_constants.dart     jw.org / wol.jw.org locale codes, defaults
  bible_data.dart        the 66 books and their chapter counts
  achievements_data.dart achievement definitions
  quiz/                  quiz content: quiz_data.dart (French source) plus
                         quiz_data_<lang>.dart aggregators and their
                         quiz_data_<lang>_c1..c8.dart chapter files
  l10n/                  .arb translations + generated AppLocalizations
  screens/  services/  widgets/  theme/
assets/                  only what ships in the app (icons, bundled font)
tool/icons/              icon pipeline, not shipped: process_icon.py turns the
                         source art into assets/icon.png, then
                         generate_launcher_icons.py writes the Android mipmaps
test/                    widget and content tests
docs/                    the privacy policy served by GitHub Pages

A language is only fully supported once it has both an .arb file and a complete set of quiz/ chapter files; any checkpoint a language does not override falls back to the French source automatically.

Local Execution

Prerequisites: Flutter SDK installed + Android SDK configured.

flutter pub get
flutter run

Production Build

A release build requires a signing key. Generate yours once (it is NEVER committed, see .gitignore):

keytool -genkeypair -v -keystore android/app/keystore/upload-keystore.jks \
  -storetype PKCS12 -keyalg RSA -keysize 2048 -validity 10000 -alias upload

Then create android/key.properties:

storePassword=<keystore password>
keyPassword=<key password>
keyAlias=upload
storeFile=keystore/upload-keystore.jks

Save the .jks file and passwords outside the repository (i.e. good password manager): losing them prevents publishing a signed update the same way. Something bad coulp happen if you don't backup that somewhere.

flutter build appbundle --release   # for Google Play
flutter build apk --release         # for direct distribution / F-Droid

Android Permissions

  • POST_NOTIFICATIONS — reading reminders (Android 13+).
  • SCHEDULE_EXACT_ALARM — reminders at exact time.
  • RECEIVE_BOOT_COMPLETED — reschedules reminders after reboot.
  • Intent queries VIEW for jwlibrary:// and https:// (opening JW Library or web fallback).

License

JW Streak is free software under the GNU GPLv3 license (see LICENSE).

The Plus Jakarta Sans font is embedded under the SIL Open Font License (see assets/fonts/PlusJakartaSans-OFL.txt).

Contact

Hiiiii if you have something to say please do at contact@olynthe.org

Badges

SQLite
Flutter
Claude Code
MistralAI


🥖 Readme.md but in french

JW Streak

Projet indépendant et non officiel. JW Streak n'est affilié à, ni approuvé par, les Témoins de Jéhovah, la Watch Tower Bible and Tract Society, ou à JW.org. C'est un outil personnel, créé par 2 Témoins de Jéhovah, qui renvoie simplement vers JW.org / JW Library pour leur propre contenu, il n'héberge pas, ne redistribue pas, et ne prétend pas représenter ce groupe ou organisation.

Salut ! JW Streak (JWS) est une application Flutter conviviale (Android, Material 3 Expressive) qui aide à maintenir une habitude de lecture quotidienne de la Bible, avec des quiz, un système de série, des succès et des notes personnelles. Tout cela 100% local, aucun compte ou serveur requis. Bien que j'ai créé JWS pour les Témoins de Jéhovah, tout le monde peut l'utiliser et en profiter.

Est-ce sûr pour ma foi ?

Absolument ! L'application fonctionne en parfaite harmonie avec le contenu et le matériel de l'organisation, donc le contenu ne peut être altéré ou modifié par personne d'autre que notre bien-aimée organisation, JW.org. Lors de l'ouverture de la Bible ou du texte du jour, l'application l'affiche directement dans JW Library ou sur jw.org/_____, selon les préférences de l'utilisateur et si JW Library est installé. La seule chose qui devrait être vérifiée concerne les quiz. Je les ai créés moi-même, et parce que je suis humain, j'ai pu faire quelques erreurs en les créant. Quoi qu'il en soit, si je reçois des retours ou un signalement, je serai plus qu'heureux de corriger mes erreurs :)

Fonctionnalités

  • Lecture guidée : Un chapitre à la fois, ouvert dans JW Library ou sur jw.org (choix dans les paramètres), avec suivi de la progression à travers toute la Bible.
  • Quiz interactifs : Choix multiples, réponse saisie ou reconstruction de mots avec validation tolérante aux fautes de frappe (uniquement fr/en/es/it/de/pt/pl ; ru/zh restent en choix multiples désolé).
  • Série & Matchs : La série augmente chaque jour actif ; les « matchs » (gagnés en complétant les quiz) couvrent automatiquement les jours manqués.
  • Succès : Jalons débloqués grâce à la lecture, aux quiz et aux séries.
  • Notes personnelles : Liées à un passage, consultables et exportables depuis une bibliothèque dédiée.
  • Sauvegarde et restauration : Enregistrez tout dans un seul fichier lisible et récupérez-le sur un autre appareil.
  • Rappels quotidiens configurables : Notifications simples.
  • Onboarding : 4 étapes + un guide de découverte rejouable depuis les paramètres.
  • 9 langues : Français (langue de référence), Anglais, Allemand, Espagnol, Italien, Polonais, Portugais, Russe, Chinois simplifié. D'autres à venir.
  • Thème : Suit le système / clair / sombre / sombre OLED, avec couleur dynamique optionnelle (Material 3 E.). D'autres thèmes en route.

Confidentialité

  • Avant tout, vous pouvez trouver la politique de confidentialité de JWS à jws.olynthe.org
  • Aucune donnée ne quitte l'appareil : aucun compte, aucun backend, aucun suivi ou analytique.
  • Toutes les données (lectures, notes, paramètres, séries) sont stockées localement dans une mignonne base de données SQLite.
  • Aucune police ou ressource n'est chargée depuis un serveur à l'exécution ; tout est intégré dans l'APK.

Sauvegarde et restauration

Tout ce que l'application connaît tient dans une seule base SQLite locale : une sauvegarde, c'est simplement cette base écrite en JSON.

  • Sauvegarder mes données (Paramètres → Confidentialité) écrit toutes les tables — lectures, notes, quiz, réflexions, rappels, série, succès et réglages — dans un seul fichier daté, puis le passe au menu de partage. Où il atterrit ne dépend que de vous ; l'application n'envoie rien d'elle-même.
  • Restaurer une sauvegarde remplace tout ce qui se trouve sur l'appareil par le contenu de ce fichier. Elle vous montre d'abord ce que le fichier contient (date, chapitres lus, notes), et toute la restauration se fait dans une seule transaction : un fichier endommagé laisse donc vos données intactes au lieu de les remplacer à moitié.
  • Nouveau téléphone ? Touchez J'ai déjà une sauvegarde dès le premier écran. Vos réglages voyagent avec la sauvegarde, vous arrivez donc directement sur votre tableau de bord au lieu de refaire l'onboarding.

Le fichier est du JSON lisible, et c'est volontaire. La promesse de cette application, c'est que vos données ne quittent l'appareil que si vous les envoyez quelque part : un fichier que vous pouvez ouvrir dans un éditeur de texte est la seule version de cette promesse que vous puissiez vérifier vous-même. Cela veut aussi dire que vos notes survivent à l'application.

Il n'est pas chiffré et contient vos notes. Conservez-le dans un endroit sûr.

Stack technique

  • Flutter / Dart
  • sqflite : lectures, notes, paramètres, succès, série
  • flutter_local_notifications + permission_handler : rappels quotidiens et permissions
  • url_launcher : lien profond JW Library, repli web jw.org
  • dynamic_color : palette Material You optionnelle
  • flutter_markdown, pdf, share_plus : partage de notes
  • file_selector : choix du fichier de sauvegarde à restaurer

Organisation du projet

lib/
  main.dart              point d'entrée de l'app
  app_constants.dart     codes de langue jw.org / wol.jw.org, valeurs par défaut
  bible_data.dart        les 66 livres et leur nombre de chapitres
  achievements_data.dart définition des succès
  quiz/                  contenu des quiz : quiz_data.dart (source française),
                         les agrégateurs quiz_data_<langue>.dart et leurs
                         fichiers de chapitres quiz_data_<langue>_c1..c8.dart
  l10n/                  traductions .arb + AppLocalizations généré
  screens/  services/  widgets/  theme/
assets/                  uniquement ce qui est embarqué (icônes, police)
tool/icons/              chaîne de génération des icônes, non embarquée :
                         process_icon.py produit assets/icon.png à partir de
                         l'art source, puis generate_launcher_icons.py écrit
                         les mipmaps Android
test/                    tests de widgets et de contenu
docs/                    la politique de confidentialité servie par GitHub Pages

Une langue n'est pleinement prise en charge qu'une fois qu'elle possède à la fois un fichier .arb et un jeu complet de fichiers de chapitres dans quiz/ ; tout point d'étape qu'une langue ne redéfinit pas retombe automatiquement sur la source française.

Exécution locale

Prérequis : Flutter SDK installé + Android SDK configuré.

flutter pub get
flutter run


## Build de production

Un build `release` nécessite une clé de signature. Générez la vôtre une fois (elle n'est JAMAIS commitée, voir `.gitignore`) :

```bash
keytool -genkeypair -v -keystore android/app/keystore/upload-keystore.jks \
  -storetype PKCS12 -keyalg RSA -keysize 2048 -validity 10000 -alias upload

Ensuite, créez android/key.properties :

storePassword=<mot de passe du keystore>
keyPassword=<mot de passe de la clé>
keyAlias=upload
storeFile=keystore/upload-keystore.jks

Sauvegardez le fichier .jks et les mots de passe en dehors du dépôt (c.-à-d. dans un bon gestionnaire de mots de passe) : les perdre empêche de publier une mise à jour signée de la même manière. Quelque chose de mauvais pourrait arriver si vous ne sauvegardez pas cela quelque part.

flutter build appbundle --release   # pour Google Play
flutter build apk --release         # pour distribution directe / F-Droid

Permissions Android

  • POST_NOTIFICATIONS — rappels de lecture (Android 13+).
  • SCHEDULE_EXACT_ALARM — rappels à l'heure exacte.
  • RECEIVE_BOOT_COMPLETED — reprogramme les rappels après redémarrage.
  • Requêtes Intent VIEW pour jwlibrary:// et https:// (ouverture de JW Library ou repli web).

Licence

JW Streak est un logiciel libre sous licence GNU GPLv3 (voir LICENSE).

La police Plus Jakarta Sans est intégrée sous la licence SIL Open Font License (voir assets/fonts/PlusJakartaSans-OFL.txt).

Contact

Hiiiii si vous avez quelque chose à dire, veuillez le faire à contact@olynthe.org

Badges

SQLite
Flutter
Claude Code
MistralAI


About

JWS is a friendly, modern and simple companion app to help all kind of people, especially JWs, to start the good habbit of reading the bibble every day, and getting the most out of it! :D

Topics

Resources

Contributing

Stars

5 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages