Customization Examples

July 2, 2026 · View on GitHub

Assign to me — global plugin action

Shortcut key that sets the selected task's assignee to the current user

views:
  actions:
    - key: "a"
      label: "Assign to me"
      action: update where id = id() set assignee=user()

The same format works as a per-plugin action (under a plugin's actions: key) if you only want it in a specific view.

Add tag to task — plugin action

Appends a tag to the selected task's tag list without removing existing tags.

actions:
  - key: "t"
    label: "Tag my_project"
    action: update where id = id() set tags=tags + ["my_project"]

Custom status + reject action

Define a custom "rejected" status, then add a plugin action on the Inbox view to reject tasks.

fields:
  - name: status
    type: enum
    values:
      - value: rejected
        label: Rejected
        visual: "🚫"
- name: Inbox
  key: "F3"
  lanes:
    - name: Inbox
      filter: select where status = "inbox" order by priority
  actions:
    - key: "r"
      label: "Reject"
      action: update where id = id() set status="rejected"

Implement with Claude Code — pipe action

Shortcut key that pipes the selected task's title and description to Claude Code for implementation.

actions:
  - key: "i"
    label: "Implement"
    action: >
      select title, description where id = id()
      | run("claude -p 'Implement this: \$1. Details: \$2'")

Search all tikis — single-lane plugin

A plugin with one unfiltered lane shows every task. Press / to search across all of them.

- name: All
  key: "F5"
  lanes:
    - name: All
      columns: 4
      filter: select order by updatedAt desc

Quick assign — lane-based assignment

Three lanes split tasks by assignee. Moving a task into Alice's or Bob's lane auto-assigns it.

- name: Team
  key: "F6"
  lanes:
    - name: Unassigned
      filter: select where assignee is empty order by priority
    - name: Alice
      filter: select where assignee = "alice" order by priority
      action: update where id = id() set assignee="alice"
    - name: Bob
      filter: select where assignee = "bob" order by priority
      action: update where id = id() set assignee="bob"

Stale task detection — time trigger + plugin

A daily trigger tags in-progress tasks that haven't been updated in a week. A dedicated plugin shows all flagged tasks.

triggers:
  - description: flag stale in-progress tasks
    ruki: >
      every 1day
        update where status = "inProgress" and now() - updatedAt > 7day
               and "attention" not in tags
          set tags=tags + ["attention"]
- name: Attention
  key: "F7"
  lanes:
    - name: Needs Attention
      columns: 4
      filter: select where "attention" in tags order by updatedAt

My tasks — user-scoped plugin

Shows only tasks assigned to the current user

- name: My Tasks
  key: "F8"
  lanes:
    - name: My Tasks
      columns: 4
      filter: select where assignee = user() order by priority

Recent ideas — good or trash?

Two-lane plugin to review recent ideas and trash the ones you don't need. Moving to Trash swaps the "idea" tag for "trash".

- name: Recent Ideas
  description: "Review recent"
  key: "F9"
  lanes:
    - name: Recent Ideas
      columns: 3
      filter: select where "idea" in tags and now() - createdAt < 7day order by createdAt desc
    - name: Trash
      columns: 1
      filter: select where "trash" in tags order by updatedAt desc
      action: update where id = id() set tags=tags - ["idea"] + ["trash"]

Auto-delete stale tasks — time trigger

Deletes inbox tasks that were created over 3 months ago and haven't been updated in 2 months.

triggers:
  - description: auto-delete stale inbox tasks
    ruki: >
      every 1day
        delete where status = "inbox"
                     and now() - createdAt > 3month
                     and now() - updatedAt > 2month

Priority triage — five-lane plugin

One lane per priority level. Moving a task between lanes reassigns its priority.

- name: Priorities
  key: "F10"
  lanes:
    - name: Critical
      filter: select where priority = "high" order by updatedAt desc
      action: update where id = id() set priority="high"
    - name: High
      filter: select where priority = "medium-high" order by updatedAt desc
      action: update where id = id() set priority="medium-high"
    - name: Medium
      filter: select where priority = "medium" order by updatedAt desc
      action: update where id = id() set priority="medium"
    - name: Low
      filter: select where priority = "medium-low" order by updatedAt desc
      action: update where id = id() set priority="medium-low"
    - name: Minimal
      filter: select where priority = "low" order by updatedAt desc
      action: update where id = id() set priority="low"

Sprint board — custom enum lanes

Uses a custom sprint enum field. Lanes per sprint; moving a task between lanes reassigns it. The third lane catches unplanned inbox tasks.

Requires:

fields:
  - name: sprint
    type: enum
    values: [sprint-7, sprint-8, sprint-9]
- name: Sprint Board
  key: "F9"
  lanes:
    - name: Current Sprint
      filter: select where sprint = "sprint-7" and status != "done" order by priority
      action: update where id = id() set sprint="sprint-7"
    - name: Next Sprint
      filter: select where sprint = "sprint-8" order by priority
      action: update where id = id() set sprint="sprint-8"
    - name: Unplanned
      filter: select where sprint is empty and status = "inbox" order by priority
      action: update where id = id() set sprint=empty

Severity triage — custom enum filter + action

Lanes per severity level. The last lane combines two values with or. A per-plugin action lets you mark a task as trivial without moving it.

Requires:

fields:
  - name: severity
    type: enum
    values: [critical, major, minor, trivial]
- name: Severity
  key: "F10"
  lanes:
    - name: Critical
      filter: select where severity = "critical" order by updatedAt desc
      action: update where id = id() set severity="critical"
    - name: Major
      filter: select where severity = "major" order by updatedAt desc
      action: update where id = id() set severity="major"
    - name: Minor & Trivial
      columns: 2
      filter: >
        select where severity = "minor" or severity = "trivial"
        order by severity, priority
      action: update where id = id() set severity="minor"
  actions:
    - key: "t"
      label: "Trivial"
      action: update where id = id() set severity="trivial"

Subtasks in project — custom tikiIdList + quantifier trigger

A subtasks field on parent tasks tracks their children (inverse of dependsOn). A trigger auto-completes the parent when every subtask is done. The plugin shows open vs. completed parents.

Requires:

fields:
  - name: subtasks
    type: tikiIdList
triggers:
  - description: close parent when all subtasks are done
    ruki: >
      every 5min
        update where subtasks is not empty
                     and status != "done"
                     and all subtasks where status = "done"
          set status="done"
- name: Projects
  key: "F11"
  lanes:
    - name: In Progress
      filter: >
        select where subtasks is not empty
                     and status != "done"
        order by priority
    - name: Completed
      columns: 1
      filter: >
        select where subtasks is not empty
                     and status = "done"
        order by updatedAt desc

By topic — tag-based lanes

Split tasks into lanes by tag. Useful for viewing work across domains at a glance.

- name: By Topic
  key: "F11"
  lanes:
    - name: Frontend
      columns: 2
      filter: select where "frontend" in tags order by priority
    - name: Backend
      columns: 2
      filter: select where "backend" in tags order by priority

Bulk cleanup — delete without selection

A bulk action that deletes all done tasks without needing a selection. Because this action does not use id(), it has no id requirement and stays enabled even when nothing is selected.

actions:
  - key: "X"
    label: "Delete all done"
    action: delete where status = "done"

AI-gated action — require

An action that only enables when an AI agent is configured and a task is selected. The ai requirement is checked against config.yaml's ai.agent setting. The id requirement is auto-inferred from id() usage — listing it explicitly is allowed but redundant.

actions:
  - key: "c"
    label: "Chat about task"
    action: select title, description where id = id() | run("claude -p 'Discuss: \$1. Details: \$2'")
    require: ["ai"]

From the Inbox view opens a Quick Select picker showing only projects that the current tiki is not already linked to, and adds it to the chosen project's list. From the Roadmap view, pick any non-project tiki that is not already linked to the selected project, and add it.

- name: Inbox
  actions:
    - key: "e"
      label: "Link to project"
      action: update where id = choose(select where type = "project" and id() not in dependsOn) set dependsOn = dependsOn + id()
- name: Roadmap
  actions:
    - key: "l"
      label: "Add tiki to project"
      action: update where id = id() set dependsOn = dependsOn + choose(select where type != "project" and id not in target.dependsOn)

A tiki is linked to a project by adding its id to the project's dependsOn list. Each filter hides projects/tikis where the link already exists:

  • Inbox: id() not in dependsOn — the candidate project's own dependsOn doesn't already contain this tiki.
  • Roadmap: id not in target.dependsOn — the candidate tiki's id is not already in the selected project's dependsOn.