Skip to content
← All work

Desktop Application

TaskDesk

Production — actively evolving

A desktop application with an Android companion that turns client email and meeting transcripts into tracked tasks, logged time and billing-ready records. Python and PostgreSQL, in production use in my own consulting practice.

Consulting work generates a continuous stream of tasks, open threads, source files and partial progress across several clients at once. The task managers I evaluated treated each task as an isolated item. They had no queryable data model for the relationships that matter here: a task belongs to a project, a project belongs to a client, and the value is in the trail of emails, meeting decisions, notes and time that builds up around it.

From email to billing record

  1. Email and meetings arrive

    Messages and Teams meeting transcripts are collected on a schedule.

  2. They become tasks and notes

    Requests turn into tasks, notes and work-log entries, each linked to its source.

  3. AI decisions are reviewed

    Suggested closures and links wait in the AI Inbox to be approved, edited or undone.

  4. Time is recorded

    A timer or manual entry captures minutes, notes and a billable flag.

  5. Work is invoiced

    Finished work is grouped into reports and billed through Fiscal Desk.

What it solves

  • Task status scattered across inboxes, spreadsheets and memory, with no single record of what was asked, what was done and what is waiting on someone else.
  • Meeting decisions and email requests that never become tracked work, or become it days later and without their source.
  • Time that has to be reconstructed at invoice time instead of being captured as the work happens.
  • Losing context when moving between clients or returning to paused work.

Technology stack

PythonQt desktop UIPostgreSQL 18SQLite local cacheFastAPIKotlin / Jetpack Compose (Android)Microsoft GraphWindows Task Scheduler

My role

I designed and built TaskDesk, and I use it to run my consulting practice. Requirements come from real operational use rather than a specification document, and new capabilities are added when a genuine need appears.

Highlights

Email and meeting capture

Incoming email and Microsoft Teams meeting transcripts are summarized and turned into tasks, notes and work-log entries, each linked back to the message or meeting it came from. A run reports exactly what it created and changed, and each change shows its source and the reason.

AI Inbox: land first, review second

Captured facts always land immediately. Decisions layered on top, such as closing a task or linking two records, go to a review queue where they can be approved, edited, rejected or undone. A completion cannot be approved without a written summary.

Task lifecycle with context

Statuses distinguish active work, work waiting on someone else, work pending approval and work an AI review thinks is finished. The detail pane keeps the source context, notes, activity timeline and time history together.

Time tracking that feeds billing

A timer or manual entries record minutes, notes, an optional rate and a billable flag. Finished work is grouped into reports and carried into invoices issued through Fiscal Desk, which marks it invoiced.

Offline-tolerant sync

The desktop app works from a local cache and syncs with the server on demand, with pending-change badges so it is always clear what has not yet been pushed.

Android companion

A mobile client for reading and updating tasks, time and notes. After I confirm, it can also log a completed work phone call. It reaches the data only through a private server-side API.

Key decisions

AI decisions are reviewable and never gate the data

An AI suggestion that is rejected or ignored must not hide or discard the email, task or work-log entry underneath it. This keeps the record trustworthy even when the AI is wrong, and keeps a person responsible for anything that closes a task or gets billed.

One self-hosted PostgreSQL database

In June 2026 I moved the data layer from Azure SQL to a self-hosted PostgreSQL 18 server and retired the Azure SQL paths. TaskDesk and Fiscal Desk now share one database, with a headless ingestion runner and the mobile API running alongside it.

The phone never touches the database

The Android app holds no database credentials. All mobile reads and writes go through a server-side API that is private to my own devices and authorizes each user.

Why a custom application

Consulting work is relational, and the task managers I evaluated were not. TaskDesk is built around the relationship between client, project, task, source and time, so returning to work that was paused three weeks ago does not mean reconstructing what was happening.

How data moves

Email and meeting ingestion runs headlessly on a schedule using Microsoft Graph, and the desktop app pulls the results. The database is backed up nightly and weekly, with an off-machine copy.

Current status and what is next

TaskDesk is in production and actively evolving. A weekly reconciliation pass, which compares open tasks against captured evidence before mail and meeting retention limits remove it, is built and in live testing. Recurring tasks are planned but not started.

Outcomes

  • Time logged against a task is carried into invoices, so billing narratives start from what was actually recorded.
  • Every task keeps the email or meeting that created it, so the reason for the work can be found later.
  • AI-assisted changes are visible, attributable and reversible.

Screenshots

Active Work: source items on the left, the task queue in the middle and the task detail on the right. Demonstration data.
Status and due-date filters that separate active work from work waiting on someone else or pending review.
The Tools menu: processing actions and the AI review tools.

The overview image at the top has client details blurred. The screenshots below use demonstration data.

Have a similar problem to solve?
Let’s talk about what a practical solution would look like for your organization.
Discuss a project