BACUAAn Algerian BAC study app frontend
BACUA is an Algerian BAC study app frontend with structured lessons, reading progress and a contextual chat interface. Authentication and assistant replies are mocked.
An Algerian BAC study app frontend
React Native / Expo / RTLThe problem & workflow
Choose a stream → open a subject and lesson → mark progress → hand lesson context to chat → receive/cancel a mock streamed reply → restore local state after restart.
Key features
- Onboarding and academic stream selection
- Subject/unit/lesson navigation with reading progress
- Lesson context handed to a streaming mock assistant
- Conversation persistence, cancellation and local preferences
- Explicit RTL, Arabic typography, animation and reduced-motion settings
- Skia/CanvasKit initialization with fallback behavior
Architecture & decisions
- I use an AIProvider interface to separate the chat experience from a future provider integration. Authentication and responses are mocked.
- I persist conversations and reading progress locally so the study experience carries across sessions.
- Arabic typography, RTL layout, cancellation and reduced-motion preferences are part of the interface design.
Inside the source
A frontend with a clear integration boundary
I built BACUA as an Algerian BAC mobile study frontend.
BACUA explores an Algerian BAC study experience through onboarding, stream selection, structured lessons, progress and contextual chat. Its value is in the interface and state transitions. Authentication and assistant replies are mocked; the AIProvider contract marks where a real service could later connect as a future integration boundary.
Conversations and reading progress persist locally. Lesson context can move into a conversation, streamed text updates the interface, and cancellation stops an in-progress mock reply. These interactions require consistent state across navigation, refresh and interrupted output. Explicit RTL choices and Arabic typography are part of the layout rather than a translated label layer.
Treating streamed text as incomplete input
During development, a partial Markdown table header could make the parser loop indefinitely. A message that is valid when complete can be invalid at one of its streaming prefixes. The extracted pure parser now has prefix regression checks, including incomplete headers and Arabic text.
The supported web demonstration uses the existing non-Skia fallback. CanvasKit and native device rendering remain separate checks. Future work can connect a real provider, evaluate lesson retrieval and verify accessible device behavior; those belong to the roadmap, not the implemented feature list.
Project status
Designed frontend application. Authentication and assistant replies are mocked; there is no deployed AI service implied.
Use the committed Expo SDK 54 dependencies. No backend or provider credentials are needed. Default web preview uses EXPO_PUBLIC_ENABLE_SKIA_WEB=0; set it to 1 only for a separate CanvasKit investigation. Mock sign-in accepts demonstration input; use learner@example.test and never a real password. Local persistence is browser/device storage, not a remote account.
Development checks & runtime notes
Type checking and static Expo web export passed. An incremental Markdown parser could loop forever on a partial table header during streaming; its pure parser now has prefix regression checks. The default web preview uses the existing non-Skia fallback. Browser checks passed completed mock replies, conversation restoration after refresh and cancellation. Mock sign-in and the visible demonstration label are retained. Native device and opt-in CanvasKit verification are separate remaining checks.
Authentication and assistant responses are local mocks. The default browser fallback is the supported demonstration path; enabling EXPO_PUBLIC_ENABLE_SKIA_WEB=1 opts into a separately unverified CanvasKit path. No real AI, remote account security or cross-device synchronization is claimed.
Technical details ↗