Custom Redmine Plugin for Project Management and Resource Tracking

How do you extend Redmine beyond its defaults to support project tracking, time logging, and reporting the way your company actually works?

Azati built and continuously maintains a custom Ruby on Rails plugin for Redmine that extends the platform's default functionality to support centralized project management, employee time tracking, department-level reporting, leave management, and automated logging reminders across a 350+ person software engineering company.

Customize my Redmine
350+

employees using the custom Redmine instance daily for project and time tracking

Ongoing

active development and maintenance with rolling feature additions and Redmine upgrades

One

centralized platform replacing fragmented project tracking and reporting across all internal teams

Technologies used

Ruby
Ruby
Ruby on Rails
Ruby on Rails
JavaScript
JavaScript
PostgreSQL
PostgreSQL
Redis
Redis
Docker
Docker

Motivation

Off-the-shelf Redmine is built for the general case. A software engineering company with 350+ people, juggling internal R&D and client delivery simultaneously, is not the general case. The default reporting is project-centric when you need it to be team-centric. There are no automated nudges for missing time entries. Leave is tracked somewhere else entirely. The interface looks like a tool from 2010.

Rather than bolt on a collection of third-party plugins that half-solve each problem and break on every Redmine upgrade, Azati built one coherent plugin that owns the full surface: reporting, reminders, leave, and the visual layer. It has been in continuous production use and development since.

What standard Redmine doesn't cover out of the box

Challenge 01

Reporting at the department and group level

Standard Redmine reports are project-centric. A software company needs to see time allocation, workload, and project coverage across departments, teams, and individual employees simultaneously, a view standard Redmine doesn't provide:

  • No built-in department or group-level aggregation in reports
  • Management needs cross-project visibility into team capacity
  • Time data exists but is hard to surface in the right format
  • Custom report views needed for different stakeholder roles
#1
Challenge 02

Time logging reminders that actually reach people

Getting 350+ engineers to consistently log time without manual chasing is an operational challenge. Standard Redmine has no automated reminder mechanism for missing time entries:

  • No built-in notifications for days or weeks with unlogged time
  • Manual follow-up creating overhead for project managers
  • Time data gaps making reporting unreliable
  • Reminder logic needing to respect leave days and non-working periods
#2
Challenge 03

Leave management integrated with project tracking

Leave tracking and project management are two separate concerns in most companies, but they need to be connected: a developer on leave shouldn't be showing as available in project capacity views:

  • No native leave management in standard Redmine
  • Leave data needed to feed into capacity and time tracking views
  • Integration between leave records and time logging expectations
#3
Challenge 04

Redmine upgrades and dependency management over time

Running a custom plugin on top of Redmine means every Redmine version upgrade requires validating and updating the plugin against the new version's API and dependencies:

  • Redmine and Rails API changes affecting plugin compatibility
  • Dependency updates needing coordination across the plugin and core
  • Test coverage required to make upgrades safe
  • Ongoing maintenance work to keep the platform current
#4

What this project demonstrates about Redmine development

Redmine plugins are a Ruby on Rails problem, not a configuration problem

A custom Redmine plugin hooks into the framework's models, controllers, and views. It follows Rails conventions, uses ActiveRecord, and breaks in the same ways Rails apps break. Teams that treat Redmine customization as a click-through exercise hit the ceiling quickly. The work here required genuine Ruby on Rails depth, not Redmine familiarity alone.

The bar is different when you live with the result

This plugin runs Azati's own operations. A confusing report view, a misfiring reminder, a broken upgrade, all of these have real consequences for real colleagues. That accountability produces a different kind of care than building for a client you'll hand off to in three months.

Maintenance is the hardest part, and the most transferable skill

Building the first version of a Redmine feature is straightforward. Keeping it working across Redmine upgrades, extending it without breaking what exists, and maintaining test coverage that makes future changes safe, that's where expertise accumulates. This is also what the separate Redmine client engagement covers: plugin development, upgrade, and DevOps for an external team.

The full stack, not just the plugin

Docker deployment, PostgreSQL, Redis for background jobs, SSL and SSH, the production environment is managed as part of the same engagement. A plugin that works in development and breaks in production is not a finished plugin.

Need Redmine to do more than it does out of the box?

Custom plugins, reporting extensions, time tracking workflows, theme customization, version upgrades, Azati has built and maintained all of this on a production Redmine instance used by 350+ people. Let's talk about what you need.

Customize my Redmine

What the custom Redmine plugin covers

The plugin extends Redmine across four core areas, each addressing a gap in standard Redmine functionality that a software engineering company running both internal and client projects needs to fill.

01

Enhanced reporting by department, group, and employee

The reporting module provides management with structured views across the organization that standard Redmine's project-centric reports don't offer. Reports can be filtered and grouped by department, team, and individual employee, giving project managers and leadership the capacity and workload visibility they need without manual data aggregation.

Key capabilities:
  • Department-level time and project reports
  • Group and employee breakdown views
  • Cross-project workload visibility
  • Report export and management summaries
02

Automated time logging reminders

Background jobs check for employees with unlogged time and send automated reminders, reducing the manual chasing that project managers previously had to do. The reminder logic accounts for leave days and non-working periods, so it doesn't generate noise on days when time logging isn't expected.

Key capabilities:
  • Automated reminders for unlogged time entries
  • Leave-aware reminder logic
  • Redis-backed background job processing
  • Reduced manual follow-up overhead for project managers
03

Leave management

The leave management module tracks employee leave within the same platform used for project and time management, so capacity views and time logging expectations stay accurate. Leave records integrate with the time tracking and reporting modules so that availability data is consistent across the platform.

Key capabilities:
  • Employee leave tracking within Redmine
  • Leave data integration with time tracking
  • Capacity view accuracy across projects
  • Leave-aware reporting
04

Custom Azati theme and visual improvements

A custom branded theme replaces the Redmine default interface with Azati's own styling, making the platform feel like an internal product rather than a generic open-source tool. The theme has been maintained and updated alongside Redmine version upgrades to stay compatible.

Key capabilities:
  • Custom branded theme for Redmine
  • Visual and UX improvements over the default interface
  • Theme compatibility maintained across Redmine upgrades

What Azati maintains

AreaWhat the team does
ReportingEnhanced department, group, and employee-level reporting views
Time loggingAutomated reminders for unlogged time with leave-aware logic
Leave managementEmployee leave tracking integrated with capacity and time data
ThemeCustom Azati-branded Redmine interface
UpgradesRedmine version upgrades and dependency updates
Test coverageOngoing test coverage improvements for safe plugin updates
Bug fixesOngoing bug fixing and stability improvements
InfrastructureDocker deployment, PostgreSQL, Redis, SSL/SSH on Hetzner

Engagement & delivery

Ongoing internal project, no fixed team

The plugin is maintained as an internal project at Azati. Rather than a dedicated full-time team, engineers contribute features, fixes, and improvements as capacity allows, a model that works for internal tooling where urgency is manageable and the codebase is well-understood across the team.

Redmine upgrades as a regular part of the work

Keeping the plugin compatible with new Redmine versions is a recurring responsibility alongside feature work:

  • Regular Redmine version upgrades tested against the custom plugin
  • Dependency updates coordinated with plugin compatibility
  • Test coverage maintained to make upgrades safe and predictable
  • Documentation updated alongside feature and upgrade work

What changed in practice

One place for everything

Internal projects, client projects, time entries, leaves, all in one system with one login. The alternative was a spreadsheet for leaves here, a different tracker for internal work there, and Redmine only for client projects. Consolidation sounds unglamorous but it removes daily friction at scale.

Fewer conversations about time logging

Automated reminders handle the follow-up that project managers used to do manually. The reminder logic knows about leave days, so it doesn't fire when it shouldn't. Less noise, more signal.

Reports that managers can actually use

Cross-project workload visibility by department and team without exporting to a spreadsheet first. Leadership gets the view they need without an analyst in the middle.

An internal tool that gets better, not older

Test coverage and regular Redmine upgrades mean the plugin stays current. Internal tools have a tendency to calcify. This one doesn't.

Strategic wins

What this engagement demonstrates:

Redmine depth is Ruby on Rails depth

The reminders, the reporting aggregations, the leave integration, none of these were achievable through Redmine's admin UI. They required hooks into the framework's job infrastructure, model layer, and view system. If you can build this, you can build almost any Ruby on Rails customization a company might need.

Years of maintenance is more valuable than the first release

The first version of a feature is easy to find a contractor for. Someone who has kept that feature working through three Redmine major versions, a dependency upgrade cycle, and two rounds of requirements changes is much harder to find. That's what ongoing internal tooling produces.

Using your own tools honestly is a kind of quality control

Azati runs on this plugin. There is no buffer between the people who built it and the people who use it. That proximity is worth more than most quality processes.

The described expertise is relevant for

  • Custom Redmine plugin development in Ruby on Rails
  • Redmine time tracking and reporting extensions
  • Redmine leave management and HR workflow integration
  • Redmine theme and UI customization
  • Redmine version upgrades and plugin compatibility maintenance
  • Redmine deployment with Docker, PostgreSQL, and Redis
  • Internal project management tooling for software companies
  • Redmine plugin development, upgrade, and DevOps for external clients

Last updated

Got a job for Azati? Let’s talk business!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

What's next?

  • 1. Tell Us Your Story
    Describe your project. We come back within 24 hours with team availability and a rough plan. NDA on request before the first call.
  • 2. Get Your Roadmap
    Receive a detailed proposal with scope, team composition, timeline, and costs tailored to your goals.
  • 3. Start Building
    Azati aligns on details, finalize terms, and launch your project with full transparency.