# abc2204/azuredevopspulse architecture

> Architecture diagram of the GitHub repository abc2204/azuredevopspulse, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/abc2204/azuredevopspulse
- Repository: https://github.com/abc2204/azuredevopspulse

## Overview

AzureDevOpsPulse is a Flask dashboard that collects local TFS/Azure DevOps Server activity into SQLite and presents developer, repository, and comparison statistics. The main workflow is configure a TFS connection, synchronize projects, repositories, commits, pull requests/reviews, and work items, then query and filter stored metrics in the browser. The graph separates scheduled/manual synchronization from dashboard queries and settings. Some route and template wiring is inferred from the README and tree because the excerpts are partial.

Main entry points: [`static/js/app.js`](https://github.com/abc2204/azuredevopspulse/blob/main/static/js/app.js) (Browser UI), [`app.py`](https://github.com/abc2204/azuredevopspulse/blob/main/app.py) (Flask routes), [`database.py`](https://github.com/abc2204/azuredevopspulse/blob/main/database.py) (Database access), [`scheduler.py`](https://github.com/abc2204/azuredevopspulse/blob/main/scheduler.py) (Sync scheduler)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_browser["Browser UI<br/>[app.js]"]
  node_heatmap["Activity heatmap<br/>[pulse.js]"]
  node_pages["Dashboard pages"]
end

subgraph group_api["Application API"]
  node_flask["Flask routes<br/>[app.py]"]
  node_statistics["Statistics API<br/>[app.py]"]
  node_admin["Settings and teams<br/>[app.py]"]
  node_dashboard["Developer metrics<br/>[database.py]"]
  node_repo_metrics["Repository metrics<br/>[database.py]"]
  node_workitems["Work item metrics<br/>[database.py]"]
  node_compare["Developer comparison<br/>[compare.html]"]
  node_developer["Developer detail<br/>[developer.html]"]
  node_repos["Repository view<br/>[repos.html]"]
  node_settings["Settings view<br/>[settings.html]"]
end

subgraph group_sync["Synchronization"]
  node_scheduler["Sync scheduler<br/>[scheduler.py]"]
  node_syncflow["Sync orchestration<br/>[collector.py]"]
  node_tfsclient["TFS API client<br/>[collector.py]"]
  node_syncdata["Activity ingestion<br/>[collector.py]"]
end

subgraph group_data["Persistence and config"]
  node_db["Database access<br/>[database.py]"]
  node_sqlite[("SQLite store")]
  node_config["Runtime config<br/>[config.py]"]
end

node_viewer(("Dashboard user"))
node_tfs{{"TFS server"}}

node_viewer -->|"uses"| node_browser
node_browser -->|"requests"| node_flask
node_flask -->|"renders"| node_pages
node_flask -->|"queries and updates"| node_db
node_flask -->|"starts sync"| node_scheduler
node_flask -->|"reads settings"| node_config
node_browser -->|"renders activity"| node_heatmap
node_flask -->|"serves metrics"| node_statistics
node_statistics -->|"queries"| node_dashboard
node_statistics -->|"queries"| node_repo_metrics
node_statistics -->|"queries"| node_workitems
node_statistics -->|"reads data"| node_db
node_scheduler -->|"loads sync state"| node_db
node_scheduler -->|"runs sync"| node_syncflow
node_syncflow -->|"fetches data"| node_tfsclient
node_tfsclient -->|"calls REST API"| node_tfs
node_syncflow -->|"normalizes activity"| node_syncdata
node_syncdata -->|"persists activity"| node_db
node_db -->|"reads and writes"| node_sqlite
node_compare -.->|"uses shared UI"| node_browser
node_developer -.->|"uses shared UI"| node_browser
node_repos -.->|"uses shared UI"| node_browser
node_settings -.->|"uses shared UI"| node_browser

click node_browser "https://github.com/abc2204/azuredevopspulse/blob/main/static/js/app.js"
click node_heatmap "https://github.com/abc2204/azuredevopspulse/blob/main/static/js/pulse.js"
click node_pages "https://github.com/abc2204/azuredevopspulse/tree/main/templates"
click node_flask "https://github.com/abc2204/azuredevopspulse/blob/main/app.py"
click node_statistics "https://github.com/abc2204/azuredevopspulse/blob/main/app.py"
click node_admin "https://github.com/abc2204/azuredevopspulse/blob/main/app.py"
click node_db "https://github.com/abc2204/azuredevopspulse/blob/main/database.py"
click node_config "https://github.com/abc2204/azuredevopspulse/blob/main/config.py"
click node_scheduler "https://github.com/abc2204/azuredevopspulse/blob/main/scheduler.py"
click node_syncflow "https://github.com/abc2204/azuredevopspulse/blob/main/collector.py"
click node_tfsclient "https://github.com/abc2204/azuredevopspulse/blob/main/collector.py"
click node_syncdata "https://github.com/abc2204/azuredevopspulse/blob/main/collector.py"
click node_dashboard "https://github.com/abc2204/azuredevopspulse/blob/main/database.py"
click node_repo_metrics "https://github.com/abc2204/azuredevopspulse/blob/main/database.py"
click node_workitems "https://github.com/abc2204/azuredevopspulse/blob/main/database.py"
click node_compare "https://github.com/abc2204/azuredevopspulse/blob/main/templates/compare.html"
click node_developer "https://github.com/abc2204/azuredevopspulse/blob/main/templates/developer.html"
click node_repos "https://github.com/abc2204/azuredevopspulse/blob/main/templates/repos.html"
click node_settings "https://github.com/abc2204/azuredevopspulse/blob/main/templates/settings.html"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_browser,node_heatmap,node_pages,node_viewer toneBlue
class node_flask,node_statistics,node_admin,node_dashboard,node_repo_metrics,node_workitems,node_compare,node_developer,node_repos,node_settings toneAmber
class node_scheduler,node_syncflow,node_tfsclient,node_syncdata,node_tfs toneMint
class node_db,node_sqlite,node_config toneRose
```

## Components

### Web experience

- [Browser UI](https://github.com/abc2204/azuredevopspulse/blob/main/static/js/app.js): `static/js/app.js`
- [Activity heatmap](https://github.com/abc2204/azuredevopspulse/blob/main/static/js/pulse.js): `static/js/pulse.js`
- [Dashboard pages](https://github.com/abc2204/azuredevopspulse/tree/main/templates): `templates`

### Application API

- [Flask routes](https://github.com/abc2204/azuredevopspulse/blob/main/app.py): `app.py`
- [Statistics API](https://github.com/abc2204/azuredevopspulse/blob/main/app.py): `app.py`
- [Settings and teams](https://github.com/abc2204/azuredevopspulse/blob/main/app.py): `app.py`
- [Developer metrics](https://github.com/abc2204/azuredevopspulse/blob/main/database.py): `database.py`
- [Repository metrics](https://github.com/abc2204/azuredevopspulse/blob/main/database.py): `database.py`
- [Work item metrics](https://github.com/abc2204/azuredevopspulse/blob/main/database.py): `database.py`
- [Developer comparison](https://github.com/abc2204/azuredevopspulse/blob/main/templates/compare.html): `templates/compare.html`
- [Developer detail](https://github.com/abc2204/azuredevopspulse/blob/main/templates/developer.html): `templates/developer.html`
- [Repository view](https://github.com/abc2204/azuredevopspulse/blob/main/templates/repos.html): `templates/repos.html`
- [Settings view](https://github.com/abc2204/azuredevopspulse/blob/main/templates/settings.html): `templates/settings.html`

### Synchronization

- [Sync scheduler](https://github.com/abc2204/azuredevopspulse/blob/main/scheduler.py): `scheduler.py`
- [Sync orchestration](https://github.com/abc2204/azuredevopspulse/blob/main/collector.py): `collector.py`
- [TFS API client](https://github.com/abc2204/azuredevopspulse/blob/main/collector.py): `collector.py`
- [Activity ingestion](https://github.com/abc2204/azuredevopspulse/blob/main/collector.py): `collector.py`

### Persistence and config

- [Database access](https://github.com/abc2204/azuredevopspulse/blob/main/database.py): `database.py`
- **SQLite store**
- [Runtime config](https://github.com/abc2204/azuredevopspulse/blob/main/config.py): `config.py`

### Other components

- **Dashboard user**
- **TFS server**

## Connections

- Dashboard user → Browser UI: uses
- Browser UI → Flask routes: requests
- Flask routes → Dashboard pages: renders
- Flask routes → Database access: queries and updates
- Flask routes → Sync scheduler: starts sync
- Flask routes → Runtime config: reads settings
- Browser UI → Activity heatmap: renders activity
- Flask routes → Statistics API: serves metrics
- Statistics API → Developer metrics: queries
- Statistics API → Repository metrics: queries
- Statistics API → Work item metrics: queries
- Statistics API → Database access: reads data
- Sync scheduler → Database access: loads sync state
- Sync scheduler → Sync orchestration: runs sync
- Sync orchestration → TFS API client: fetches data
- TFS API client → TFS server: calls REST API
- Sync orchestration → Activity ingestion: normalizes activity
- Activity ingestion → Database access: persists activity
- Database access → SQLite store: reads and writes
- Developer comparison → Browser UI: uses shared UI
- Developer detail → Browser UI: uses shared UI
- Repository view → Browser UI: uses shared UI
- Settings view → Browser UI: uses shared UI
