Skip to content
The product

Most productivity software flatters you. This one reports.

A tracker asks what you intend to do and then congratulates you for saying it. Rihla asks what you actually did, computes only what your record can support, and says nothing where it has nothing. That single constraint decided almost every other thing about the product.

The loop

Four stages, and each one only ever reads from the one before it.

There is no stage where a number appears from outside your own record. That is why the app can be quiet: when a stage has nothing upstream of it, it has nothing to say, and it says so.

  1. 01

    Record

    A block of time with a named kind — deep focus, rest, or admin — and, if you want, a written intention. That is the raw material. Nothing further exists without it.

    block_type.dart
  2. 02

    Measure

    Five sub-scores computed from those blocks: focus, consistency, energy, goal alignment, life balance. Below two available sub-scores the composite is not a low number — it is unavailable.

    score_engine.dart
  3. 03

    Reflect

    Four cadences — daily, weekly, monthly, yearly — each opening with how long it should take. The weekly one starts from numbers that are already computed, so you are only asked to tell the truth about them.

    review_models.dart
  4. 04

    Decide

    Five angles on a choice — impact, effort, time, risk, alignment — where alignment derives from your own life balance, so an option serving a neglected area scores higher. It reflects; it never rules.

    decision_engine.dart
Four refusals

The product is mostly defined by what it will not do.

Each of these is a line of code that returns nothing where a competitor returns a number. They cost engagement and they are the reason anything the app does say is worth reading.

  • It will not invent a time

    The golden-hour nudge does not fire when your peak hour is unknown. There is no fallback to nine in the morning, because a suggested time you did not earn is a guess wearing the clothes of a measurement.

    nudge_scheduler.dart
  • It will not score an absence

    A sub-score with no data behind it is excluded from the average rather than counted as zero. Zero is a claim that you did badly; absent is a claim that we do not know, and only one of those is true.

    score_engine.dart
  • It will not simulate without history

    Ask what happens if a goal gets one more hour a week and you get a band, a number of weeks and the first bottleneck responsible — unless the goal has no deadline or not enough behind it, in which case you get nothing rather than a shape.

    simulation_engine.dart
  • It will not talk about you like that

    Ninety-one phrases are blocked outright across four lists: shame about the person, verdicts that decide for you, claims with nothing behind them, and actions the app did not take. The matcher is a blunt substring test on purpose — a cleverer one is a rule a model can talk its way around.

    honesty_phrases.dart

The systems, one at a time.

Eight of them, each with the figures it actually uses and the state it falls back to when it does not know.