Skip to content

Redmine integration

The Redmine integration connects Speedwave to self-hosted or managed Redmine instances. Claude can inspect issue hierarchies, register time logs, manage journal entries, link issue dependencies, and coordinate project planning workflows.

Redmine runs in an isolated worker container. Credentials and instance mappings reside in ~/.speedwave/tokens/<project>/redmine/:

  • Directory~/.speedwave/tokens/<project>/redmine/
    • api_key
    • config.json

The integration uses an API access key rather than user passwords. Because Redmine instances assign dynamic numerical identifiers to issue trackers, statuses, priorities, and time activities, config.json stores deterministic semantic mappings (e.g. status_in_progress -> 2, tracker_bug -> 1).

Descriptions, notes, and journal entries are formatted in Textile syntax. Speedwave sanitizes markup inputs prior to dispatch, stripping insecure HTML elements.

Failed requests execute automatic retries up to 3 times with exponential backoff delays (2s, 4s, 8s).

CategoryCanonical identifier keys
Statusstatus_new, status_in_progress, status_resolved, status_feedback, status_closed, status_rejected
Prioritypriority_low, priority_normal, priority_high, priority_urgent, priority_immediate
Trackertracker_bug, tracker_feature, tracker_task, tracker_support
Activityactivity_design, activity_development, activity_testing, activity_documentation, activity_support, activity_management, activity_devops, activity_review

The Redmine worker exposes 23 specialized tools:

Tool nameDescription
listIssueIdsQuery issue identifiers with filters for project, status, tracker, priority, and assignee.
getIssueFullRetrieve comprehensive issue metadata including custom fields, relations, and history.
searchIssueIdsSearch issues using text keywords.
createIssueAuthor new issues specifying tracker, status, priority, assignee, and parent IDs.
updateIssueModify issue attributes and append journal notes in a single atomic call.
commentIssueAppend discussion notes (journal entries) to an issue.
listJournalsRetrieve history logs and comments for an issue.
updateJournalEdit existing journal note text.
deleteJournalPermanently remove journal entries.
listTimeEntriesQuery logged work hours by issue, user, project, or date interval.
createTimeEntryLog billable or non-billable work hours against issues or projects.
updateTimeEntryUpdate logged hours, activity classifications, or comments.
listUsersList Redmine users or project membership rosters.
resolveUserResolve usernames or me shortcuts to canonical user IDs.
getCurrentUserRetrieve authenticated user account profile metadata.
listProjectIdsEnumerate accessible project identifiers.
getProjectFullRetrieve full project configuration (trackers, categories, modules).
searchProjectIdsSearch projects by name or slug.
listRelationsEnumerate issue dependency relations.
createRelationCreate issue relations (blocks, precedes, relates, duplicates, etc.).
deleteRelationPermanently remove an issue relation link.
getMappingsRetrieve active status, tracker, and activity mapping tables.
getConfigRetrieve active Redmine host URL and project bindings.
  1. In Redmine, navigate to My account and copy the API access key.
  2. Open the Redmine integration card in the Desktop application and enter your Redmine URL and API Key. Click Validate.
  3. Confirm mapped project scope and review detected ID mappings for statuses and trackers.
  4. Save the configuration to initialize the worker container.

The Redmine worker mounts only its dedicated token directory in read-only mode. All API calls pass through the stateless Tool Gateway. If a project identifier is fixed in config.json, the worker rejects mutations outside that scope. See Credentials management for details.