The new extract/verify/swap flow surfaced a long-standing bug in Utils.clean_dir(). On macOS, browsing a folder in the Finder drops a hidden .DS_Store file in it, and clean_dir() had two flaws around that: - DirAccess listings skip hidden files by default, so .DS_Store was never listed nor removed and the directory was never actually empty. - The return value of dir.remove(subfolder) was ignored, so the failed removal of a subdirectory (non-empty because of its own hidden file) was silently swallowed and clean_dir() still reported success. As a result, delete_directory_recursive() emptied the old language pack but could not delete its directory, the rename of the new pack onto that still-existing directory failed, and the downloader showed the download-error popup. Since the version on disk was never updated, the app re-downloaded and failed again in a loop on every launch. The old pre-swap flow had the same deletion failure but masked it: it extracted directly into the existing directory and ignored rename errors. - clean_dir() now lists hidden files (include_hidden) and checks every removal, trying to remove everything (best effort, so callers like clear_all_local_data still wipe as much as possible) and reporting the first error encountered instead of a false OK. - The downloader verifies that the previous pack directory is really gone before renaming the new one into place; if not, it aborts the swap, keeps the temporary directory and shows the error instead of attempting a rename that cannot succeed. - Add regression tests covering hidden-file deletion, full content cleanup and the missing-directory error path. Verified with the GUT test suite (65/65 passing).
📖 Kalulu — Learn to Read, the Smart Way
🌍 Available Languages
- 🇪🇸 Español
- 🇫🇷 Français
- 🇧🇷 Português (Brasil)
📑 Table of Contents
🧠 Why Kalulu?
Kalulu is more than just a game — it’s an educational adventure grounded in scientific research that helps children learn to read through a decoding-based method.
Each lesson follows a structured sequence based on linguistic data drawn from children's literature. Learners start with vowels and gradually move on to more complex sounds.
- 🎯 Goal: Make learning to read fun and effective
- 🌟 Science-Based: Developed using research in education and neuroscience
- 👶 Target Audience: Primarily children, but useful for anyone wanting to learn to read
- 🔎 Published Research: Several articles have been published on Kalulu's design and reading results, read here:
https://www.tandfonline.com/doi/pdf/10.1080/00220973.2023.2173129
https://hal.science/hal-03015914/document
https://hal.science/hal-03702075/document
✨ Features
- Interactive grapheme-phoneme reading lessons
- Adaptive difficulty progression
- Child-friendly interface with engaging visuals
🛠️ Installation
📥 Clone the Repository
We recommend forking the repository before cloning, so you can easily contribute or manage your own changes.
- Go to the Kalulu GitHub Repository.
- Click the Fork button at the top-right corner to create your own copy of the repo.
- Once forked, open your terminal and run the following commands:
# Clone your fork of the repository
git clone https://github.com/YOUR_USERNAME/Kalulu-Frontend.git
# Or
git clone git@github.com:YOUR_USERNAME/Kalulu-Frontend.git
# Navigate into the project directory
cd Kalulu-Frontend
🔁 Remember to replace YOUR_USERNAME with your actual GitHub username.
🎮 Install the Godot Engine
To run Kalulu, you need the Godot Engine installed on your machine.
- Visit the official Godot Engine website: https://godotengine.org/
- Click on Download and choose the version compatible with your operating system.
- Extract the downloaded file and run the Godot executable to launch the editor.
That's it! You're now ready to explore the Kalulu project in Godot.
🧩 Addons
Kalulu includes several useful addons to enhance development and streamline workflow:
🔄 EnvironmentSwitcher
A utility to easily switch between development and production environments.
📤 export_tool_manager
Facilitates export to various platforms and simplifies the export process for additional tools like prof_tools.
✅ godot-form-validator
A plugin for Godot 4 that adds validation logic to any control element in your project.
🗃️ godot-sqlite
Provides SQLite integration for Godot projects.
Important: This addon must be downloaded manually from the Godot AssetLib. The folder
addons/godot-sqlite/binis excluded from version control due to its large size. Make sure to download and install it after cloning the repository.
🤝 Contributing
We welcome contributions from everyone! Whether it's fixing bugs, improving documentation, or suggesting new features, your help is greatly appreciated.
How to Contribute
-
Set up the Project
See the Installation section to learn how to fork and clone the repository. -
Create a New Branch
git checkout -b feature/your-feature-name -
Make Your Changes
Implement your changes or improvements. -
Commit and Push
git add . git commit -m "Describe your changes" git push origin feature/your-feature-name -
Open a Pull Request
Navigate to your forked repository on GitHub and click Compare & pull request to submit your changes for review.
Please make sure your code follows our coding conventions and includes relevant tests or documentation updates when appropriate.
❓ FAQ
📱 Is Kalulu available on mobile?
Yes! Kalulu is available on:
💻 Is Kalulu available on desktop?
Yes! Desktop versions for Windows, Mac, and Linux are available in the Releases section.
🌐 Is Kalulu available directly on the web?
We are working on it, stay tuned!
Related Repositories
| Repository | Description |
|---|---|
| Kalulu Backend | Serverless API — authentication, sync, dashboards, and data management |
| Kalulu Language Lambda | Pipeline that processes language packs and updates the database |
| Kalulu Languages | Linguistic data packs (French, Spanish, Portuguese etc...) |
Built with care by Excello Recherche & Education
We also have a website