| Employee | Dept | Score | Active | Idle | Resp. progress | Late | Misuse |
|---|
Last 15 days
Delivery
Last 15 days — daily breakdown
| Day | Score | Active | Productive | Personal | Idle | Misuse |
|---|
Today's top apps
| App | Active | Idle | Total | Bucket | Tag |
|---|
Today's top domains
| Domain | Active | Idle | Total | Bucket | Tag |
|---|
Today's top window titles
Visible for any non-idle activity, useful for seeing which pages/documents an employee opened when the URL itself couldn't be captured.
| Started | Window title | Time |
|---|
Responsibilities
| Title | Priority | Status | Progress | Due |
|---|
Org chart
Reporting hierarchy. Click ▸ to expand a manager's direct reports; click a name to open their detail tab. Default expansion is 2 levels — your last expand/collapse state is remembered per-browser. Filters dim non-matching nodes (the tree shape stays so you can still navigate around).
Unassigned — click to expand
Active employees with no manager set. Assign them on Manage → Employees to bring them into the tree.
Schedule vs productivity
Compares actual productive time against the
expected time defined by each employee's shift. Ratio is
weighted (uses the bucket weights from Manage → Bucket weights),
so e.g. learning time partially counts. Holidays / weekends /
admin-marked exempt days have expected = 0 and don't
drag the average down.
| Name | Department | Ratio | In-shift | Weighted | After-hours | Late | Early-leave | Expected |
|---|
Best & worst — last 7 days
Score = (productive + 0.5×learning − personal) ÷ active time, mapped to 0–100. Excludes employees with under 10 minutes of activity in the window. Security-risk time is shown separately as alerts — not deducted.
Auto-groups — last 14 days
Rule-based, transparent. Each membership shows the reason — useful for defending decisions in 1:1s.
Needs review
Apps, domains, and browser titles that have accumulated active time but aren't classified into a bucket yet. Tag them here once and they apply retroactively to every employee.
Uncategorized domains
Browser visits where the domain is known but no rule matches. Pick a bucket → re-classifies all matching events.
| Domain | Active time | Events | People | Tag as |
|---|
Uncategorized apps
Desktop apps with no rule match.
| App | Active time | Events | People | Tag as |
|---|
Browser titles with no domain extracted
Pages we couldn't auto-recognise. Click a title's Add keyword
button to have the title-extractor recognise that site in future
events. Choose a 2–3 word substring that's distinctive (e.g.
HRMS Login) and a target domain.
| Window title | Active time | Events | Suggest domain & tag |
|---|
My data
Your own activity at a glance.
Account
Sets a new password and signs out all your other sessions.
Export
Includes: activity events, daily summaries, and any RDS sessions linked to your account.
System health
Audit log
Every privileged action — grants, revokes, role changes, category re-tags, OMS syncs, retention runs.
| Time (UTC) | Actor | Action | Target | IP | Detail |
|---|
Integrations
Test the alert pipeline
Fires a synthetic alert through every configured webhook and (if SMTP is set) emails admins. Use this to verify your integrations after editing them.
Webhooks (alert push)
Each new alert is POSTed as JSON to every active matching webhook. Use this to fan out into Slack, Teams, or your ticketing system.
| Name | URL | Severity | Last fired | Last status |
|---|
Per-role bucket weights
Multiplier on the base bucket weight for a specific role. e.g. "Developer + productive × 1.5" makes IDE-time count more on the leaderboard for devs. Default = 1.0.
| Role | Bucket | × |
|---|
Data retention
Delete activity_events older than N days. Daily summaries are kept indefinitely.
Agent self-update
Server's current published version is shown below.
/v1/agent/download serves the bundled exe.
Responsibilities & delivery
| Employee | Title | Pri | Status | Progress | Due | Late? |
|---|
Alerts
| When | Employee | Kind | Severity | Message |
|---|
Active RDS thin-client sessions (Windows 2012)
Maps server\session_id -> AD user -> employee record.
| Server | Session | AD User | Client name | Client IP | Mapped employee | Started |
|---|
Employees — Windows login mapping
The OMS Windows login column is what your OMS reports
(LOWER(sec_users.login)). The Override column is a
manual mapping — useful when an employee's actual Windows account name
doesn't match the OMS login (e.g. administrator,
service.user). Override wins during agent matching and
survives OMS re-syncs.
| Name | Code | Dept | Role | Office | Device | OMS Windows login | Override | Shift | Manager | Status | Monitor | Dashboard access |
|---|
Windows agent — build & deploy
Download these files to a Windows machine, run the build
script, then install the resulting empmonitor_agent.exe on
each RDS host. The agent reports back to ….
One-click bundle
Everything needed to build & deploy, packed into a single zip with a README:
⬇ Downloadempmonitor_agent_bundle.zip
Or download files individually
| File | Size | Purpose |
|---|
Quick start (after you download)
# 1. On a Windows machine with Python 3.9+ in PATH:
Set-ExecutionPolicy -Scope Process Bypass
.\agent\build_windows.ps1
# Output: dist\empmonitor_agent.exe
# 2. On each RDS host, copy the exe + install_agent.ps1, then as Administrator:
.\install_agent.ps1 -ServerUrl "http://192.168.0.131:8090"
# Agent now starts at every user logon and reports its session to this server.
Category rules
| Kind | Pattern | Category | Score |
|---|
Shifts
Recurring time windows that define expected on-the-clock hours. Each employee inherits the default shift unless overridden on the Employees page. Productivity ratios on the Schedule dashboard use these windows.
Each shift now belongs to an office (or company-wide if blank), and has an effective from date. When computing for an employee on a given day, the system picks the most-recent active shift for their office whose effective_from ≤ that day, falling back to the company-wide shift if none.
| Name | Office | Effective from | Start | End | Lunch | Days | Break | TZ | Default | Status |
|---|
Holidays
Days where expected_s is forced to 0 — so
the productivity ratio reads as "off-day" rather than 0%. Leave
Office blank for company-wide holidays; otherwise it must
match the Employee.office string (e.g. Udupi).
| Date | Office | Name |
|---|
Title keywords
Maps a substring in a browser-window title to its
canonical domain. Used by the title extractor to recognise sites
like "Stack Overflow - Where Developers ..." →
stackoverflow.com. Higher priority is checked first;
keep more-specific keywords above generic ones.
| Keyword | Target domain | Priority | Active |
|---|
Office settings
Per-office effective_date — the date from
which monitoring is "live" in that location. Days before this date
are excluded from expected_s and from auto-leave for
employees in that office. Offices with no row here use the
global default on the System settings page.
| Office | Effective date | Status |
|---|
Add a new office
Use this only for offices not yet on any employee record. Otherwise the office is auto-listed above.
System settings
Configuration that affects how the productivity ratio is computed across the company.
Flagging thresholds
Two independent rules. Each can fire on its own — an employee can be flagged for unproductive use, for excess idle, or for both. Changes take effect on the next recompute (overnight, or run a manual recompute from Health).
How this is calculated
Each activity_event from the agent has a duration
(typically 5 s) and a bucket (productive / learning /
communication / neutral / personal / security_risk) plus an
idle bit. The recompute aggregates these per employee per
day:
productive_s— Σ duration where productivity > 0 (productive bucket).unproductive_s— Σ duration where productivity < 0 (default: personal bucket; weights are admin-editable).neutral_s— Σ duration where productivity = 0.idle_s— Σ duration where the idle bit is set (no keyboard/mouse activity for the agent's idle window).active_s= productive + unproductive + neutral (idle is excluded).
Unproductive flag fires when both:
active_s ≥ min_active_minutes × 60
AND unproductive_s / active_s ≥ unproductive_ratio.
Idle flag fires when
idle_s / 3600 ≥ idle_excess_hours.
The two flags are independent. The legacy combined
misuse_flag is recomputed as
unproductive_flag OR idle_flag and kept around for
backward compatibility with older queries.
Bucket weights
Weights applied to every second of activity time when
computing the daily productivity score. Negative weights deduct
(e.g. personal). Typical range is -1.0 to
+1.0; nothing rejects values outside that range — pick
what makes sense for your formula.