Tracking progress

Klub stores progress per user in a configurable field and exposes two endpoints to add or remove progress items. Use this page for course or lesson completion tracking.

Storage

By default progress is stored in the user field defined by UserFieldProgress::$field (default: progress). You can swap the storage handler with bnomei.klub.progress.handler.

site/blueprints/users/member.yml
fields:
  progress:
    extends: fields/klub/progress

Endpoints

  • POST /klub/progress/add
  • POST /klub/progress/remove

Both require CSRF tokens and accept a redirect parameter. The id can be a page UUID, page ID, or any custom key.

You can also send an optional data payload with /klub/progress/add to store extra metadata.

Example

<?php if ($page->hasProgress()): ?>
<form method="post" action="<?= site()->url() ?>/klub/progress/remove">
  <input type="hidden" name="id" value="<?= $page->uuid() ?>">
  <input type="hidden" name="redirect" value="<?= $page->url() ?>">
  <input type="hidden" name="token" value="<?= csrf() ?>">
  <button type="submit">Reset progress</button>
</form>
<?php endif ?>

<form method="post" action="<?= site()->url() ?>/klub/progress/add">
  <input type="hidden" name="id" value="<?= $page->uuid() ?>">
  <input type="hidden" name="redirect" value="<?= $page->url() ?>">
  <input type="hidden" name="token" value="<?= csrf() ?>">
  <button type="submit">Mark complete</button>
</form>

Querying progress

$page->hasProgress()
$user->hasProgress($page)
klub()->progress()->get($page)
Kirby Klub is not affiliated with the developers of Kirby CMS. We are merely standing on the shoulder of giants.
© 2026 Bruno Meilick All rights reserved.