Time Log for Azure DevOps
Keep Completed and Remaining time accurate on every task — without the manual bookkeeping.
Time Log lets each team member record time against work items in a couple of clicks, keeps
Azure DevOps scheduling fields (Completed / Remaining / Original Estimate) in sync
automatically, and rolls everything up into team reports, personal timesheets, a weekly
shortfall report and an analytics dashboard.
Why teams use it
- Logged time updates Completed and Remaining automatically — no double entry, no drift.
- Report time accurately by project, team and time type for planning and billing.
- Give every user a personal weekly timesheet (My Time Log) with a configurable target.
- Spot under-logging early with the Weekly shortfall report.
- Visualise logged time with charts and summary tables via the Analytics Dashboard.
- Set capacity from actual values, and record, monitor and reduce waste.
- Automatically set Remaining work when it is missing on new work items.
- Full REST API for integration with your own applications, reporting suite or data warehouse.
Getting started
- Install — click Get it free above and follow the prompts.
- Add your API key — go to Project settings → Extensions → Time Log Admin and set the
REST API key for your organisation.
- Trial API key (shared, for evaluating the extension only):
pfcooS75dcpEekjJvdsOvsY0FIJqrsoWicnyY1GQQVby2PVwVl0KBw==
- For ongoing use, each organisation receives its own private key — keep it secret and do
not share it (see Time Log REST API Key under Configuration below).
- Set up time types — add the categories you want to track (Development, Meeting, Test,
Documentation, Admin, Lost Time, …), per project or across the whole organisation.
See Configuration below.
- Log time — record time on any work item via the Time Log tab.
- Review — open Time Log Summary and My Time Log from the menu.
Features
Manage time per work item
Every work item gets a Time Log tab.

Record what you spent — hours and minutes, the date, the type of work it was, and a comment — and the work item's Completed and Remaining fields move with it. There is no second place to update and nothing to reconcile later, so what Azure DevOps reports stays in step with what the team actually did.

Everything already logged against the item is listed underneath, so an earlier entry can be corrected or removed without leaving the work item. Time can be logged on behalf of other team members too, where your administrator allows it — useful for recording a workshop or a pairing session in one go.
See where the time went
The bar at the top of the tab says how far through its estimate a work item is. It does not say where that time went; the chart button beside it does. Time breakdown answers that without making you read the entry table row by row.

Three figures sit across the top: total logged with the number of entries behind it, of estimate — how much of the original estimate that represents — and remaining, with the forecast total it implies. Below them the same time is broken down three ways:
- By time type — whether an item went mostly on development or mostly on rework.
- By person — whether it was one person's work or the team's.
- By day — the fourteen most recent days that have time against them. Only days actually worked are shown, so an item picked up months after it was last touched does not render as a row of empty columns.
The first two show a stacked bar over a table of hours and share of the total. Colours match the Analytics Dashboard, so a time type reads the same in both.
The button appears only once there is time logged, so it never opens onto an empty dialog, and it reuses the entries the tab has already loaded — the breakdown costs no extra requests and needs no new permissions.
Start and stop a timer
Time can be recorded as it is spent, rather than remembered at the end of the day. A timer sits at the top of each work item's Time Log tab: start it when you pick the work up, and stopping it logs the time. The timer already knows the work item, the type, the day and the duration, so there is nothing left to fill in. The same timer appears on My Time Log, where a ▶ in any of today's cells starts one and a bar above the grid shows what is running, how long for, and when it started.
Only one timer runs per user at a time. Starting a second asks first, and by default logs the running one's time against its own work item before the new one begins, so nothing is thrown away by accident. Where a project offers a single time type there is nothing to choose, so the timer starts on the click instead of opening a picker.
The timer lives against your Azure DevOps account rather than in the browser. It survives a reload, follows you between machines, and reads the same in both places. A timer running on a different work item is drawn differently from one running on the item in front of you, and captioned with the work item it belongs to, so its elapsed time cannot be mistaken for time accrued here. One left running for more than twelve hours is flagged rather than stopped for you.
What happens when you stop depends on where you are. On My Time Log the Add Time Log dialog always opens, pre-filled with the elapsed time and the type it was started with, because the work item being timed may not be one on screen. On the work item's own tab the time is recorded directly — unless Minimum comment length is set, in which case the dialog opens there too, ready for the comment your organisation requires. Cancelling it leaves the timer running rather than losing the time.
A timed entry is an ordinary entry: the lock date, the ban on logging to closed items and the rule on future dates all apply, and Completed and Remaining update exactly as they do for one typed in by hand.
The timer is off until an administrator turns it on — see Enable the time log timer under Configuration.
Time Log Summary
Time Log Summary answers the question every stand-up, invoice and sprint review runs into: who logged what, against which work item, in which week?

Choose a range, a project or several, a team and a user, then Search. The project filter opens on the project you are in and takes as many as you need, with the team and user lists following your choice; organisations with a single project do not see it, since there is nothing to choose. The range is one dropdown — This week, Last week, Last 2 weeks, Last 3 weeks, This month, Last month, Last 2 months, or any custom from/to dates. The Range total for everything on screen sits right beside the buttons, and Export downloads the full result as CSV for your own spreadsheets, invoicing or data warehouse.

- A week at a glance, a month when you need it — days run across the columns beneath the week they belong to. Click a week heading to collapse it to a single total, click again for the daily breakdown, so a two-month range stays as readable as a single week.
- Group it your way — User, Project, Area path, Iteration, Parent item, Work item and Type are chips you can tick, untick and drag into any order. The grid regroups instantly, so the same search answers "what did this team spend on that epic?" and "how much of the month went to meetings?" without searching again.
- Save grouping — stores your arrangement against your Azure DevOps account, so it follows you to any browser or machine and is waiting for you next time.
- Straight through to the work — rows carry the real Azure DevOps work item type icon and link to the item itself, custom types included. Work items that have since been deleted still let you clear up the time log entries they left behind.
- Keep digging — View Dashboard carries the filters you already set into the Analytics Dashboard, and My Time Log jumps to your personal timesheet.
Team leads get the whole team in one grid: expand a person down through their projects, work items and time types, or collapse them back to a single weekly total.

My Time Log
The My Time Log hub is your own weekly timesheet: review and correct everything you have logged without visiting each work item in turn.

- Work items down the rows, Monday–Sunday across the columns, grouped by project.
- Each cell shows one pill per log on that day. Click a pill to edit; click an empty cell to create — the dialog is pre-filled with the correct date and work item.
- Navigate Previous / Next / This week to move through the weeks — no hard limit on how far back you can go.
- Work items you have logs against this week are shown, plus any active work items assigned to you. Toggle Show assigned work items off for a pure logged-time view.
- The hero card at the top shows total time logged this week against a configurable weekly target, with progress bar, true percentage, and hours to go / over.
- Honours the admin settings: future-date logging, minimum comment length, lock date, and disabled time types.
Copy last week
Most weeks look a great deal like the one before them. Copy last week, beside the
Show assigned work items toggle, takes last week's entries and offers them for this
week, day for day — a Wednesday's three hours becomes this Wednesday's three hours.
- The dialog shows last week as a miniature of the grid: one row per work item, the seven
days across, and a chip for every entry. Untick a whole work item, or a single day, and
the total at the foot follows along. Nothing is written until you press Copy.
- Copy comments too is on by default; turn it off to copy the hours and the type but
leave the comments blank.
- An entry that is already logged in this week — same work item, day, type and
duration — starts unticked and is marked, so running the copy twice does not silently
double your week. Tick it if you really did do the same hour twice.
- If part of a copy fails, the dialog stays open with the entries that saved unticked, so
pressing Copy again retries only what failed.
- Every rule that applies to logging a single entry applies here. An entry that cannot be
copied is shown struck through and cannot be ticked, with the reason spelled out beneath
the grid: the work item is closed or has been deleted, the day it would land on is in
the future or on or before the lock date, its time type has since been disabled, or the
organisation requires a comment the entry does not have.
- Copied entries update Completed and Remaining on each work item exactly as
entries typed by hand do — once per work item, with the total of everything copied
against it.
Analytics Dashboard
A View Dashboard button on the Time Log Summary opens the Analytics Dashboard — a visual breakdown of the data currently shown in the summary. It uses the same date range and user filters, so you can drill from any summary view into charts and aggregate tables without re-entering filters.

The dashboard shows:
- Summary cards — total hours, active users, total entries, average hours per entry, distinct categories, and distinct work items.
- Time Trends — hours logged by user, daily and weekly trends, monthly totals, and hours split by category.
- User Breakdown — active users per month and average hours per task for the top 10 users.
- Detailed tables — per-user and per-category summaries with entry counts and share of total time.
Time Log Admin
Manage time types
Create time types so time can be broken down for reporting and planning. Reach them from Project settings → Extensions → Time Log Admin.
Who can manage time types
The Time Log Admin page is open only to Project Administrators of the current project — everyone else sees a "Not authorised" panel instead of the admin UI. Membership is transitive, so Project Collection Administrators, and members of AAD / Entra ID / on-premises AD groups nested inside Project Administrators, are recognised too.
Within the page, each time type is managed by an administrator of its own project. The Current Types table lists every project's types, so on a row for a project you do not administer the Move entries, Delete and Edit icons are greyed out and inert, and the create / edit form's Add / Update button is disabled with an explanatory message when the project you have selected is not one you administer. Organisation-wide ("All Projects") types, and orphaned types whose owning project has been deleted or is not visible to you (shown as "Unknown project"), defer to the current project's administrator. The check fails closed: while your permissions for a project are still being resolved the controls stay disabled.
Creating a type
Each time type can be made available to All Projects, or to one project chosen from the Project menu. When logging time, you are offered that project's own types plus every All Projects type.

Tick Project Default to have the type preselected when logging time. The default is taken from the work item's own project, so logging against a work item in another project picks up that project's default rather than the current page's; if that project has no default, any type marked as a default is used.
The list of time types can then be amended as needed. Types are listed All Projects first, then by project and name, with a tick in the Default column against each project's default and the Options column carrying the per-row actions. A disabled type is struck through and carries a Blocked icon alongside its extra Move entries action.

Disabling a time type
A type that is no longer in use can be retired without losing the history behind it: edit the type and tick Disabled. A default type cannot be disabled — clear Project Default first.
A disabled type still appears in the type dropdown when logging time, marked with a Blocked icon and sorted below the active types, but it cannot be chosen for a new entry. Existing entries keep their type: they are shown greyed on the work item's Time Log tab, and can still be edited (with a warning that the type cannot be used for new logs) or deleted.
Move time log entries to another type
When a time type is disabled it can no longer be selected for new time logs, but existing entries still reference it. To tidy these up, each disabled type in the Current Types table has a Move entries action.

Choose a replacement (active) type and every time log entry using the disabled type is reassigned to it, with a confirmation of how many entries were moved. For a type that belongs to a project, the Show replacement types from toggle filters the replacement list between that type's own project and "All Projects" (organisation-level) types — it only changes which types you can pick, all of the disabled type's entries are moved either way. An "All Projects" type offers organisation-level replacements only, so the toggle is not shown. Once a disabled type's entries have been moved, the type can be safely deleted.
Weekly shortfall report
Spot users who logged less than their weekly target for any ISO week from a single page. Reach it via the Weekly shortfall report button on the Time Log Admin page.
- Defaults to the last completed week; navigate with Previous / Next / "This week".
- Shows each user's effective target (organisation default or personal override), logged time, and shortfall — sorted by largest deficit first. A
personalised badge marks users on a per-user target.
- Scoped to active users only (those with at least one log in the previous four weeks), so leavers are not surfaced.
- Logged time is the user's total across every project in the organisation for that week — the same figure as My Time Log. The team filter only chooses which users are listed; it never narrows what is logged for them.
- Hero cards summarise users below target, total shortfall across the organisation, and average shortfall per user.
- Download CSV exports the table for further analysis.
REST API with full query support
The Time Log REST API lets you get more out of your Time Log data. Query by any combination of filters, then pass the results to your in-house reporting suite or data warehouse. Anything the extension records, your own code can read back — and create, amend and delete, so time logged in another system can be brought in without anyone retyping it.
What you need
Three things, all on the Time Log Admin page (Project settings → Extensions → Time Log Admin):
- Your organisation ID. Shown in the top right corner of the page, with a button to copy it. Every URL starts with it, and it is what scopes a request to your data.
- Your REST API key. The Time Log REST API Key setting, issued with your licence agreement. It is the only credential the API needs, and it goes in the
x-functions-key header of every request.
- The root URL.
https://boznet-timelogapi.azurewebsites.net/api/ for the hosted service. An on-premises deployment has its own, which is whatever is in the Time Log REST API URL setting.
Your first request
Every endpoint has the same shape — root URL, your organisation ID, then the path — and the API key travels in the x-functions-key header. This asks for everything logged in January:
curl -H "x-functions-key: YOUR-API-KEY" \
"https://boznet-timelogapi.azurewebsites.net/api/YOUR-ORGANISATION-ID/timelog/query?fromDate=2026-01-01&toDate=2026-01-31"
Which comes back as JSON, one object per entry:
[
{
"timeLogId": "ca42579e-6a00-464c-bcaa-7987cbf374bb",
"comment": "Fixing the import",
"week": "2026-W02",
"timeTypeDescription": "Development",
"minutes": 120,
"date": "2026-01-08",
"userId": "a96193a0-51e5-482b-9bcb-b1efcef4b170",
"userName": "Anna Smith",
"userEmail": "anna@example.com",
"workItemId": 3814,
"projectId": "31b3d8f8-1092-4f88-9847-7cc3b4f0eb9d",
"createdOn": "2026-01-08T17:04:11.98",
"createdBy": "Anna Smith",
"updatedOn": null,
"updatedBy": null,
"deletedOn": null,
"deletedBy": null
}
]
At least one filter is required, so a query cannot accidentally ask for every log an organisation has ever recorded. Beyond the dates above you can filter by work item, project, user, team, time type or ISO week, and by when a log was created, updated or deleted — which is what an incremental nightly extract into a warehouse uses to pick up only what has changed since it last ran.
Full reference, with every endpoint and worked examples: https://docs.timelogextension.com/reference/rest-api/
An example query in Postman:

An example chart in Power BI, extracting and presenting the same data:

Configuration
Prevent remaining time going negative
When set, if time remaining becomes negative it is set to zero. When not set, you are asked whether to allow the remaining to go negative.
Keep Remaining in sync with Original Estimate
When set, Remaining is recalculated as Original Estimate − Completed Work on every add / edit / delete of a time log, so Completed + Remaining always equals Original Estimate. This prevents Remaining from drifting when the Original Estimate is changed after time has been logged. Skipped when Original Estimate is missing or the work item is closed. Manual edits to Completed on the work item form, and any Completed work that pre-dated the extension, are respected because the calculation uses the Completed field after the change has been applied.
Prevent time logging to closed items
When set, time cannot be logged to items that are closed. When not set, logging to a closed item is allowed but leaves the remaining time unchanged, since a closed item's remaining is assumed to be zero.
Allow logging time to future dates
When set, time can be logged for dates in the future.
Assign task automatically
When set, logging the first entry against an unassigned task assigns it to the user the time was logged for.
Start task automatically
When set, logging the first entry against a new task starts it.
Prevent adding time to other users
When set, time cannot be added for other users, and their entries cannot be amended or deleted.
Allow selecting many users when logging time
When set, time can be added for several users at once.
Prevent logging time on or before this date
Lock down logging so time cannot be logged, or existing logs changed, on or before the date entered. Format YYYY-MM-DD.
Time Log REST API Key
Your organisation's secure API key. Do not share it with anyone else.
Time Log REST API URL
Used to point the extension at a different Time Log REST API — needed only for on-premises deployments.
Prevent saving time if comment length is less than this. 0 to allow empty comments.
Only show current project in Summary
When set, the Time Log Summary's project filter offers the current project and nothing else, and every search is scoped to that project whatever the filter is showing.
Restrict summary to current user
When set, the Time Log Summary stops users browsing each other's time. The team filter offers only the teams the user belongs to, and within those teams they can select only themselves — unless they are an Azure DevOps team administrator of a selected team, in which case they can select every member of that team. Being an administrator of one team does not expose the members of another team the user merely belongs to. Project Administrators are exempt: the restriction lifts entirely for someone who administers every project the filter is set to, and where they administer only some of them they see every team of those projects alongside their own teams elsewhere. Defaults off, so existing organisations see no change.
Enable the time log timer
When set, a start/stop timer is available on My Time Log (a ▶ in each of today’s cells, and a bar above the grid showing what is running) and on each work item’s Time Log tab. Only one timer runs per user at a time, and it is stored against your Azure DevOps account rather than the browser, so it survives a reload and is the same timer wherever you look at it. Stopping a timer opens the ordinary Add Time Log dialog pre-filled with the elapsed time and the type it was started with, so every other rule on this page — comment length, the lock date, closed work items — still applies before anything is recorded. When not set, no timer is shown anywhere and no timer data is read or written. Defaults off, so existing organisations see no change.
Weekly target hours
Target hours per week shown on the My Time Log page. Non-integer values like 37.5 are supported. Set to 0 to hide the progress bar.
Include ADO days off
When set, Azure DevOps Capacity team and personal days off are folded into the My Time Log grid — the column is shaded and carries a badge linking to the sprint capacity page — and reduce the weekly target on My Time Log and the Weekly shortfall report by the organisation's daily rate (weekly target ÷ 5) for each day off. You can override this for yourself from the My weekly target dialog (Use organisation default / Always include / Always exclude).
Azure DevOps Server compatibility
The extension targets REST API version 6.1 — the maximum supported by Azure DevOps Server 2020 — so it works on both on-premises Server installs and hosted Azure DevOps. To preserve this, the build pins azure-devops-extension-api to the v1 line; v2 and every later major of that package default to REST api-version=7.2, which Server 2020 rejects with a 400. 1.158.0 is the final v1 release, so this is a ceiling rather than a version we have fallen behind on, and the extension manifest declares a matching api-version/5.1 demand.
azure-devops-extension-sdk is pinned at 2.0.11 as a direct consequence of that, not as a separate decision. azure-devops-extension-api@1.158.0 declares the SDK as a hard dependency at ~2.0.11 and calls into it, so raising the SDK on its own makes npm install a second copy nested underneath the API. The SDK refuses to initialise twice — it guards on a _AzureDevOpsSDKVersion global — and two copies in one bundle means two message channels to the Azure DevOps host and a broken handshake. Both pins therefore move together, and only if on-premises Server support is dropped.
TFS 2018 and hosted Azure DevOps servers
There is some extra work to do, documented here.
If you are still having issues, try authorising your project's process to allow permissions — for example Admin settings → Process → Agile → Settings → Security → Add user or group, then allow all permissions (not inherited).
Migration of data
If you wish to migrate data into Time Log, please ask for details. We have a high-volume migration tool that can load large quantities of data quickly.
FAQs
Trials and installation
Is there a free trial?
Yes. The evaluation version allows 250 time log records per month.
How do I install Time Log?
Install the evaluation version from the Azure DevOps Marketplace and choose your organisation. It appears in your projects straight away: a Time Log tab on every work item, and Time Log Summary and My Time Log in the main navigation.
What happens when I reach the 250-record limit?
You are warned as you approach it. Once it is reached, no new time log records can be created until the next month, or until you move to Premium. Nothing is lost: every record you already have stays available to view and report on, and your data is never deleted. The limit can be raised on request.
Does Time Log work with Azure DevOps Server (on-premises)?
Yes. Both Azure DevOps Services (cloud-hosted) and Azure DevOps Server are supported. See Azure DevOps Server compatibility for the versions this covers.
How do I get the Premium version?
The Premium listing is private on the Azure DevOps Marketplace. To upgrade you sign a licence agreement covering the agreed terms, after which you receive access and your own REST API key. Contact us at info@timelogextension.com to start.
Using Time Log
Does Time Log update Remaining Work automatically?
Yes. Completed Work and Remaining Work are both updated as time is logged, so boards, burndown charts and capacity planning reflect real progress without anyone editing the fields by hand.
Can several people log time to the same work item?
Yes. Each person's time is recorded separately while the work item carries the combined total, which is what you want for pair programming, workshops and team ceremonies.
Can I edit or delete time log entries after they are created?
Yes. Edit or delete them from the work item's Time Log tab, or from My Time Log. Your administrator can restrict this: Prevent adding time to other users limits you to your own entries, and Prevent logging time on or before this date closes off earlier periods entirely.
Does Time Log work with Sprints and Kanban boards?
Yes. Time can be logged against any work item type, on any board — Sprints, Kanban, Scrum and custom board configurations alike.
What are time types, and how do I use them?
Time types categorise time for reporting: Development, Support, Testing, Documentation, and whatever else you need to tell apart. Create them per project or across the whole organisation from Project settings → Extensions → Time Log Admin.
Can I move time log entries to a different time type?
Yes. Disable the type you are retiring, then use its Move entries action on the Time Log Admin page to reassign every entry to another active type. Once drained, the old type can be deleted.
Can I see my weekly timesheet?
Yes. My Time Log shows everything you logged in any week on one grid, so there is no need to visit each work item.
Is there a REST API?
Yes. Every Time Log operation is available through the Time Log REST API, so you can feed your own reporting suite or data warehouse.
Can I book a demo?
Yes. Email info@timelogextension.com and we will arrange a convenient time.
Pricing and billing
How does pricing work?
Premium is pay-as-you-go. Time log records are bought in advance and consumed as they are created, so you pay only for what you use. Current pricing is £50 per 1,000 records, with volume discounts of 10% at 50,000 and 20% at 100,000. That includes unlimited users, unlimited projects and full REST API access. Payment is by card or bank transfer, and you are invoiced automatically once fewer than 30 days of records remain.
How many users can use Time Log?
As many as you like. You pay per time log record created, never per user, which keeps the cost predictable as a team grows.
Do unused time log records expire?
No. Records bought in advance never expire and roll over indefinitely, so you can use them at your own pace.
Can I cancel at any time?
Yes. There is no long-term commitment, and you can pause or stop at any point.
History
| Version |
Details |
| 2.0.47 |
My Time Log: add Copy last week, for the weeks that look like the one before them. A button beside Show assigned work items opens last week as a miniature of the grid — one row per work item, seven days across, a chip per entry — and writes it into this week day for day. Everything starts ticked; untick a work item or a single day and the total follows. Nothing is written until Copy is pressed, and Copy comments too (on by default) decides whether comments travel with the hours. Every rule that governs a typed entry governs a copied one: one that cannot be copied is struck through and the reason given — the work item is closed, deleted or its state unconfirmed (which fails closed), the target day is in the future or on/before the lock date, its time type has since been disabled, or a required comment is missing. Completed and Remaining update once per work item, with the total of what actually saved, so a partial copy credits only what landed. Copying twice does not double the week: an entry matching one already logged (same work item, day, type and duration) starts unticked, and after a partial failure the dialog stays open with the saved entries unticked, so Copy retries only what failed. Time Log Summary: add a Project filter, so time can be reported beyond the project the hub is open in. It sits beside the date range, takes several projects at once, and offers the same Select All, Clear and filter box as the team picker. It opens on the current project, so results are scoped to it from the first search — where an unfiltered Summary could previously return a selected user’s time from any project. Teams belong to a project, so changing the filter reloads the team list and re-selects the team you belong to in each project chosen, with the user list following; where more than one project is in play each team is listed with its project, since names can repeat. The Only show current project in Summary option still holds — with it on the filter shows that project alone and the search stays pinned to it — and Restrict summary to current user is now answered per project, still failing closed while it resolves. A project whose teams cannot be read no longer costs the others theirs: the rest load and a message names what is missing. Organisations with a single project do not see the filter at all — there is nothing to choose. Time Log Summary: hide time logs on work items you are not authorised to see — for example one since moved into a project you cannot read. They previously appeared as a struck-through [NOT FOUND] row, counted in the total and export and could be deleted; they are now left out and cannot be deleted. Project Administrators still see and can delete them in the projects they administer. Weekly shortfall report: Logged now matches My Time Log for the same user and week. The report summed each user's week on a week key stamped when the entry was written, and older entries can carry an out-of-date key, so their time was silently left out and the report read low. It now sums by date, Monday to Sunday, across every project in the organisation — the figure My Time Log has always shown — so the two agree. The team filter still only chooses which users are listed. |
| 2.0.46 |
Time Log: add a time breakdown to the work item's Time Log tab, answering where the time on an item actually went. The progress bar still shows how far through the estimate the work item is, and a new chart button beside it opens a dialog breaking the logged time down three ways: by time type, by person, and by day. Each of the first two shows a stacked bar over a table of hours and share, so a glance says whether an item went mostly on development or mostly on rework, and whether it was one person's work or a team's; the day chart shows the days time was actually logged rather than a continuous calendar, so an item picked up months after it was last touched does not render as a row of empty columns. Three figures sit above them: total logged with the number of entries behind it, how much of the estimate that represents, and what remains with the forecast total it implies. The information was always there — the table below the panel lists every entry — but reading it meant reading the whole table. The button only appears when there is time logged against the work item, so it never opens onto an empty dialog, and it reuses the entries the tab has already loaded, so opening the breakdown costs no extra requests and needs no new permissions. Colours match the Analytics Dashboard, so a time type reads the same on both. Time Log: restyle the progress bar on the work item's Time Log tab in the Azure DevOps idiom. It was a tall terracotta pill in a colour belonging to no Azure DevOps palette, over a fixed light track that ignored the host theme — so it stayed stubbornly pale in dark and high-contrast themes. It is now the same slim bar My Time Log already uses for the weekly target, drawn entirely in Azure DevOps' own theme colours, so it follows light, dark and high contrast. The percentage moves out of the fill and sits beside the bar, where it stays legible on a barely-started item that previously clipped it away altogether, and the bar takes on the same three-way reading My Time Log gives the weekly target: blue while in progress, green at completion, and amber when the item is over its estimate — the fill caps at 100% and the figure beside it carries the true overrun. The bar is also announced to screen readers as a progress bar, which it previously was not. Time Log: start the timer straight away when a project offers a single time type — asking which type to use is only worth doing when there is a choice, so the dropdown is no longer shown and, on My Time Log, the ▶ starts timing on the click rather than opening a picker containing one option. Time Log: say plainly when the running timer is on another work item. A timer running elsewhere was drawn on a work item's Time Log tab with the same signals as one running on the item being viewed — the filled, pulsing green dot and green edge — with only a work item number in the title to tell them apart. The green treatment is now reserved for "this work item is on the clock"; a timer running elsewhere gets a hollow ring, a neutral edge, a title that says so outright, and its elapsed time captioned with the work item it belongs to, so the figure cannot be read as time accrued here. The twelve-hour stale warning still overrides both, and nothing about the behaviour changes. Also removes the New badge from My Time Log, Weekly shortfall report and View Dashboard, which have all been available for several releases. |
| 2.0.45 |
My Time Log and the work item form: add a start/stop timer, so time can be recorded as it is spent rather than remembered afterwards. A ▶ appears in each of today’s cells on My Time Log: pick a time type and the work item starts timing, with a bar above the grid showing what is running, how long for, and when it started. The same timer sits at the top of each work item’s Time Log tab, where stopping it simply logs the time: the timer already knows the work item, the type, the day and the duration, so there is nothing left to fill in and no Add to press. Where Minimum comment length is set, stopping opens the Add Time Log dialog pre-filled instead, ready for the comment your organisation requires — and cancelling it leaves the timer running rather than losing the time. Only one timer runs per user: starting a second one asks first, and by default logs the running timer’s time against its own work item before the new one starts — the Add dialog opens for that work item, pre-filled, so the time is recorded rather than thrown away. Discarding it instead stays available, but it is never the default. The timer is stored against your Azure DevOps account rather than in the browser, so it survives a reload, follows you between machines, and reads the same on both surfaces — the elapsed time is counted from the moment the server recorded, not from when the page opened. On My Time Log, where the running timer may be for a work item that is not on screen, stopping opens the ordinary Add Time Log dialog pre-filled with the elapsed time and the type it was started with, so the entry can be checked and a comment written. Either way every existing rule (minimum comment length, the lock date, no logging to closed items) still applies, and the work item’s Completed / Remaining update exactly as they do for a typed entry. Cancelling that dialog leaves the timer running; Discard throws the time away after confirming. A timer left running for more than twelve hours is flagged rather than stopped for you. The whole feature is behind a new admin option, Enable the time log timer, which defaults off — until it is turned on nothing is shown and no timer data is read or written. Backed by three new REST endpoints (GET / POST / DELETE /{organisationId}/timer/{userId}). |
| 2.0.44 |
Time Log Summary: add Area path as a grouping level, for organisations that split their work by team or product area. Area path rows show the work item's area with the project prefix dropped, since Project is a level of its own, and group on the area itself rather than its name, so an area that is renamed or moved during the period stays as one row. |
| 2.0.43 |
Time Log Summary: a rebuilt summary grid and a simpler search. The three search boxes are replaced by a single toolbar: pick This week, Last week, Last 2 weeks, Last 3 weeks, This month, Last month, Last 2 months, or a custom from/to range, alongside the same team and user filters, then search as before — results and the CSV export are unchanged. The grid opens on the familiar grouping — User › Project › Parent › Work Item › Type — with every row and every week already expanded, and adds an Iteration level. Grouping is now yours to arrange: each level is a chip you can tick, untick, or drag into a different position, and Save grouping remembers your arrangement against your Azure DevOps account, so it follows you to any browser or machine and is restored next time you open the page. Weeks are separated by a divider in the header and the body, work item rows show the real Azure DevOps type icon and link through to the work item, and deleted or missing work items still offer the action to clean up their orphaned time log entries. |
| 2.0.42 |
Time Log: fix logged time going missing from the work item's Completed / Remaining fields when two entries were saved at nearly the same moment — for example double-clicking Add, or logging to the same work item from two tabs or by two users at once. Each save read the work item's Completed value, added its own entry's time and wrote the result back, so overlapping saves both started from the same value and one increment was silently overwritten: both time log entries were recorded (appearing as duplicates on the same day with the same type), but the work item's Completed came up short of the entries' total. Two guards now close this. The Add / Update buttons — on the work item's Time Log tab and in the My Time Log dialogs — are disabled while a save is in flight — with the save spinner now shown for the whole operation, including edits and the work item update, rather than only the initial request — and a repeated submission is ignored, so a double-click can no longer fire two overlapping saves. And the My Time Log update path now stamps each write with the work item revision it was calculated from, so Azure DevOps rejects a write based on a stale read; the update is then recalculated from a fresh read and retried, meaning simultaneous updates from other tabs or users are merged instead of overwritten. Time Log: after Add, the form now resets ready for the next entry — Hours, Minutes and Comment are cleared, the Date returns to today and the Type to the default time type (previously everything except the comment carried over). A failed save keeps what was entered, and a multi-user selection is kept so the same group can be logged for again. The default type now comes from the work item's own project rather than the page's current project. Also fix the date picker refusing every date on organisations whose saved configuration pre-dates the lock-date setting. |
| 2.0.41 |
Time Log Admin: fix genuine Project Administrators being locked out of the Admin page on projects created in a language other than English. The access check introduced in 2.0.37 identified the built-in Project Administrators group by its English display name, but Azure DevOps localises built-in group names when a project is provisioned — a French project has "Administrateurs de projet" and no English spelling at the data layer — so the lookup matched nothing and the strict default-deny policy denied every administrator. The group is now identified by its well-known, language-independent security identifier (S-1-9-...-0-0-0-0-1), resolved by listing the project scope's groups rather than searching for a name, and the group's owning project is verified before it is trusted. The Identity Service transitive check (used for Project Collection Administrators and nested AAD / Entra ID / AD groups) now matches on the same identifier, so it no longer depends on the localised [Project]\Project Administrators account name either. The English name match is retained only as a last resort, so installs that work today are unaffected. Also fixes a diagnostic gap: failing to resolve the admin group previously denied access silently, leaving no console message to explain a lockout. Time Log Summary: Project Administrators are now exempt from the Restrict summary to current user option added in 2.0.40, so they can see logged time for every user in the current project. Previously the option narrowed the Summary for everyone, including the administrators who configure the extension, so a project administrator wanting a project-wide view had to turn the option off for the whole organisation. With the option on, an administrator now sees the full team and user lists exactly as if it were off; everyone else is unaffected, keeping the existing per-team rules (own time only, unless they are an Azure DevOps team administrator of a selected team). Administrator status is resolved with the same language-independent, transitive check described above, so Project Collection Administrators and members of AAD / Entra ID / AD groups nested inside Project Administrators are recognised too, and it is only requested when the option is on. It fails closed: while the answer is being resolved, or if it cannot be resolved at all, the restriction stays in force. Time Log Admin: time type management is now restricted to administrators of each type's project. The admin page already required Project Administrator rights on the current project, but the time type table lists every project's types and the create / edit form could target any project — so an administrator of one project could edit, move or delete another project's types. The table's edit, delete and move controls are now greyed out unless the user administers the row's project, and the create / edit form's Add / Update button is disabled with an explanatory message when the selected project is not one the user administers. Organisation-wide ("All Projects") types, and orphaned types whose owning project has been deleted or is not visible (now labelled "Unknown project" in the table, form and Move dialog instead of a blank cell), defer to the current project's administrator. Per-project administrator status is resolved lazily for the projects on screen using the same language-independent, fail-closed check described above. Time Log Summary: work item and parent rows in the pivot now show the work item's real Azure DevOps type icon, as My Time Log already does. Previously rows were marked with a hard-coded coloured bar that only recognised the seven built-in process-template types, so custom work item types — and customised icons or colours on built-in types — were not represented. The icon is fetched from Azure DevOps per project and work item type (cached, and concurrency-capped like the Summary's other Azure DevOps requests); the old coloured bar remains only as a fallback for a type whose icon cannot be resolved. Maintenance: upgrade the build toolchain to Vite 8 (Rolldown-powered) and Vitest 4 — with @vitejs/plugin-react 6 and esbuild updates, plus the fixes to the Azure DevOps AMD module shim, plugin peer range and CSS minification the new majors required — bump uuid and jest-junit, and regenerate the npm lockfile to resolve a picomatch dependency issue. |
| 2.0.40 |
Time Log Summary: add an admin option Restrict summary to current user for organisations that need to stop users viewing each other's time. When enabled, the Summary's team filter lists only the teams the current user belongs to (resolved via the Core API's mine filter, one request), and the user filter offers only the user themselves. Azure DevOps team administrators are the exception: for each selected team they administer, every member of that team remains selectable. The rule is evaluated team by team, so administering one team never exposes the members of another team the user merely belongs to. Every failure mode fails closed — an unresolvable team list or membership lookup yields no teams and no users rather than falling back to the full set. Defaults off, so existing organisations see no behaviour change. Maintenance: migrate the build and test toolchain from Create React App + Jest to Vite + Vitest; the extension's behaviour, build output layout and test suite are unchanged. |
| 2.0.39 |
Time Log Summary CSV: add Project Id (alongside the existing Project name), Team Name and Team Id, and the work item's Area Path and Area Id (System.AreaPath / System.AreaId, placed after Work Item Title) columns to the download. The values reuse data already fetched by the Summary, so no extra Azure DevOps requests are made; placeholder rows (deleted / not found / failed batch) leave the new cells blank. Also a maintenance and security pass with no other functional changes: resolve all high-severity npm dependency advisories in the build toolchain (nth-check, serialize-javascript, brace-expansion and related transitive packages pulled in via react-scripts) using package.json overrides. Harden the build/release pipeline: declare a Node >=20 engine requirement, pin Node 22.x in Azure Pipelines, and switch CI to npm ci for reproducible installs from the committed lockfile. Also fix a local npm start dev-server crash by pinning webpack-dev-server to 4.11.1. |
| 2.0.38 |
Time Log Admin: add Move time log entries to another type for disabled time types. Each disabled type in the Current Types table gains a Move entries action that reassigns every time log entry using it to a different, active type (updating both the entry's time type id and description). A Show replacement types from toggle filters the replacement list between the source type's project and "All Projects" (organisation-level) types; all of the disabled type's entries are moved regardless of the choice. This lets a disabled type be fully drained so it can then be deleted. Backed by a new REST endpoint POST /{organisationId}/timetype/{sourceTimeTypeId}/move-timelogs. |
| 2.0.37 |
Lock the Time Log Admin page (and the Weekly Shortfall report sub-page) to Project Administrators of the current project. Non-admins now see a "Not authorised" panel instead of the admin UI. Membership is determined via the current user's transitive membership in the project's Project Administrators group — so Project Collection Administrators and members of AAD / Entra ID / on-prem AD groups nested inside Project Administrators are also recognised. On Azure DevOps Services (cloud) the direct-membership check uses the modern Graph API, with nested/transitive membership resolved via the Identity Service (_apis/identities?queryMembership=ExpandedUp on the SPS host); on Azure DevOps Server (verified on 2020 and 2022, where _apis/Graph/Descriptors 404s) the whole check transparently falls back to the legacy Identity Service, so the lockdown works on both. Every failure mode is strict default-deny: if neither the Graph API nor the Identity Service can verify membership, the user is treated as a non-admin until the install's identity endpoints are fixed. Adds the vso.graph and vso.identity scopes to the extension manifest; existing customers will be prompted to re-consent on update. |
| 2.0.36 |
My Time Log: fix the work item link (and sprint capacity day-off link) opening the wrong URL on Azure DevOps Server (on-prem) installs — the host was previously hardcoded to https://dev.azure.com/<org>/, which only resolved on cloud. The link now uses the host base URL reported by ADO's LocationService, so it works on both cloud (dev.azure.com/<org>/…) and on-prem (<server>/<collection>/…). Also add an admin option Keep Remaining in sync with Original Estimate: when enabled, Remaining is recalculated as Original Estimate − Completed Work on every add / edit / delete of a time log (from both the Time Log tab and the My Time Log hub), so Completed + Remaining always equals Original Estimate. Fixes the drift that occurs when the Original Estimate is changed after time has been logged. Skipped when Original Estimate is missing or the work item is closed. Defaults off so existing organisations see no behaviour change. Also fix the Time Log Users field auto-populating with the wrong user (e.g. an organisation admin) when Azure's identity search ranked another user ahead of the logged-in one; the picker now matches the search response against the active user's id / email and falls back to a constructed identity from the SDK user context, so the field is always pre-filled with the user who is actually logged in. |
| 2.0.35 |
My Time Log: edits and deletions of time entries now refresh the grid in place; previously the dialog and grid unmounted briefly during the RTK Query refetch, which made the change appear not to take effect. Also disable the edit pill on rows whose ADO work item is deleted, not found, or unreachable (matching the existing behaviour of the "+" add button); the per-pill delete button stays enabled so individual logs can still be cleaned up. Fix permanently deleted work items rendering as [UNAVAILABLE] (with the bulk-delete button hidden) instead of [NOT FOUND]: a 404 from the ADO recycle-bin endpoint is now treated as "none of the ids are in the bin" rather than as a probe failure, so the bulk-delete button is exposed for genuinely-gone work items. |
| 2.0.34 |
Time Log Summary: convert the team filter to multi-select with Select All and Clear actions; the user dropdown now lists the de-duplicated members of every selected team (or every user in the project after Select All) and is empty when no team is selected. When the team selection changes to teams the active user is not part of, the user selection is cleared. Make user, From Date and To Date mandatory with inline error messages on the form; reject a From Date in the future and a To Date earlier than the From Date. Performance: cache team-member responses for the session so toggling the team filter no longer re-hits the ADO API; switch member de-duplication to a Map (O(n)) for 100+ teams / 500+ users. |
| 2.0.33 |
Add My Time Log page: personal weekly timesheet view with inline edit/create/delete, project grouping, and a configurable weekly target. Add Weekly shortfall report on the Time Log Admin page: list users below their weekly target for any ISO week, with organisation-wide / per-user targets, active-user scoping, hero summary cards, and CSV export. Integrate ADO Capacity into both views: shade off-day columns, link the column-header badge to the sprint capacity page, and reduce the weekly target by the organisation's daily rate × days off. New IncludeAdoDaysOff setting on the Time Log Admin page (organisation-wide default) and a per-user override in the My weekly target dialog. |
| 2.0.32 |
Increase the number of teams returned in the Summary to 1000. Add Analytics Dashboard with Recharts visualization. |
| 2.0.31 |
Fix "Minimum comment length" = 0 validation. Add retry to failed WIT API calls. Enable Summary download button when results have finished rendering. Bump azure-devops-extension-api to 2.226.0 |
| 2.0.30 |
Fix Summary not show parent work items |
| 2.0.29 |
Support for Disable Time Types |
| 2.0.27 |
Add usage to admin page. Add Delete time logs link to items not found in the summary. |
| 2.0.25 |
Do not update remaining on completed work items. Improve download summary performance |
| 2.0.24 |
Add 9 to hours drop down |
| 2.0.23 |
Optionally, only show current project in summary. Sort Summary teams. Increase summary font size |
| 2.0.22 |
Summary date out by 1 in some regions |
| 2.0.21 |
Username with non standard characters giving an error. |
| 2.0.20 |
Date 1 day out in some time zones. Stop resetting Time Type after save. |
| 2.0.19 |
Fix losing config issue, improve readability of summary, allow copy paste of Time Log table, fix date -1 day for time zones less than UTC |
| 2.0.6 |
Fix edit Time Log for different regions |
| 2.0.4 |
Fix saving Time Logs when lockdown date is empty |
| 2.0.0 |
Rewrite to use DevOps Design standards and components |
| 1.1.11 |
Support more than 100 teams per project |
| 1.1.10 |
Improve summary for items with long descriptions. Added Host ID. |
| 1.1.9 |
Fix parent work item not showing, Hub Preview not setting completed if empty |
| 1.1.8 |
Add toast for assigned and task start |
| 1.1.7 |
Fix Axio library not working |
| 1.1.6 |
Add project default to time types |
| 1.1.5 |
Fix error messages not showing |
| 1.1.4 |
Fix save logs when "Prevent adding time to other users" is on |
| 1.1.3 |
Add time log to many users (turn on by config) |
| 1.1.2 |
Improve performance of TimeLog Summary and TimeLogs when loading teams. Highlight selected time log during edit. Summary not showing if there are deleted work items |
| 1.1.1 |
Improve performance of add and update TimeLog. |
| 1.1.0 |
Upgrade to Jquery 3.6.0. Fix Github security scan issues. Add caching to TimeTypes. |
| 1.0.14 |
Fix delete issues for users with non ISO-8859-1 characters in their name |
| 1.0.13 |
Prevent logging time to and amending/deleting other users times (based on configuration). Add "Done" and "Removed" as a closed status. Use soft delete via DeletedOn and DeletedBy. Store the user changing and updating logs via CreatedBy and UpdatedBy. Only allow users with permission to amend types (Devops Service Only). Added lockdown feature to prevent logging time on or before a configured date. Improve support for Devops Server. |
| 1.0.12 |
Allow future dates based on configuration |
| 1.0.11 |
Allow more than 100 users in each team |
| 1.0.10 |
Delete orphan logs via the summary. Configure auto assignment and auto start |
| 1.0.9 |
Collapse user and project, add Parent of task to summary. Increase vertical scroll height of summary. Fix day order in summary. |
| 1.0.8 |
Prevent complete going negative. Minor bug fixes |
| 1.0.7 |
Reduce the number of calls to get logs. |
| 1.0.6 |
Log time for someone else. Set to In Progress if needed. Assign to current user if needed. Prevent negative and future time. Fix amend time issue. |
| 1.0.5 |
Add sub totals and collapse to users in summary. Fix team filter in summary. |
| 1.0.4 |
Validate REST API key is present |
| 1.0.3 |
Edit icon not visible in non maximised window |
| 1.0.2 |
Return Location in Header for POST TimeLog and TimeType. Assign task to current user when add first time log to unassigned |
| 1.0.1 |
Initial version |
Contribute
Please pass on any questions or suggestions via the Q & A section or directly to info@timelogextension.com