Judo Progress: an offline Flutter journal

Keeping a record of judo sessions, observations and the next thing to practise. I designed and developed this personal project around a simple constraint: the journal must remain usable without a server.

Flutter / DartBloc / CubitSQLite / sqfliteFR / EN

Study checked on . Role: personal design and development.

Context and use

The journal connects a session to concrete observations and a progression challenge. Entry should stay brief; reviewing it should help prepare the next session. Users enter their journal data while the application initialises the technique reference.

My scope

Session and challenge models, Flutter screens, Bloc/Cubit state management, SQLite repositories and schema evolution. The verification presented here covers the journal, database migrations and locale resolution.

Architecture

The interface displays journal state supplied by a Cubit. Business operations use a repository contract implemented with sqflite. A dedicated component opens the database, enables foreign keys and applies schema creation or migrations.

  1. 01

    Flutter

    Entry, journal, preparation and review.

  2. 02

    Bloc / Cubit

    Interface state and challenge lifecycle.

  3. 03

    Repository / SQLite

    Local persistence, relationships and migrations.

Chosen trade-offs

The local database as the source of truth

The journal does not need a network response to save a session. This simplifies offline use. The trade-off is that it does not automatically provide multi-device synchronisation; backup and transfer need their own design.

An explicit progression model

A challenge lifecycle distinguishes activation, pausing and completion. The Cubit also handles a conflict with an already active challenge. These rules have explicit state and can be tested without navigating every application screen.

Preserving user-entered data

The schema evolves through migrations. Old demonstration records are identified precisely so they can be distinguished from sessions and challenges users actually added. A fresh database seeds the reference catalogue while leaving the journal empty.

Verification actually run

On 23 October 2026, four test files were run against the local code: 40 targeted tests passed, no failures. They check SQLite creation and migrations, the journal repository, the challenge lifecycle and French/English locale resolution.

What this verification establishes

Persistence tests use in-memory SQLite and test data. They check an initially empty journal, saving and reading sessions, and preserving data through covered migrations. Locale resolution follows supported language preferences.

This targeted check is neither acceptance on every device nor a usage measurement. No user count, sports improvement or client result is claimed.

An app that needs to work in the field?

Describe the devices, network conditions and data to retain. Initial reply within 48 business hours, quote after scoping.

← All projects