Activity Feed & Updates¶
Hardhat Flow tracks two distinct types of activity: ActivityLog (system-generated, immutable audit trail) and Updates (user-posted notes and photos). Both appear in context on bids and jobs. The Dashboard Feed aggregates relevant activity and alerts for each role.
ActivityLog (System-Generated)¶
The ActivityLog is an immutable, system-generated audit trail. Every significant change in the system automatically creates an ActivityLog entry. No user can edit or delete an ActivityLog record under any circumstance.
ActivityLog records are permanent. They cannot be edited, deleted, or soft-deleted — not even by Platform Admin.
What is Stored¶
Each ActivityLog entry contains:
| Field | Description |
|---|---|
entity_type |
The type of object affected (e.g. bid, job, invoice, user). |
entity_id |
The ID of the specific record affected. |
action_type |
The category of change. See table below. |
performed_by |
The user who triggered the action (or system for automated actions). |
metadata |
A JSON object capturing the before/after diff of changed fields, or contextual data. |
created_at |
UTC timestamp of when the action occurred. |
Action Types¶
| Action Type | What Triggers It |
|---|---|
status_change |
Any status transition on a bid, job, or invoice. |
field_update |
A field value is changed on a bid, job, or invoice. Metadata contains a JSON diff. |
assignment |
A worker or PM/Supervisor is assigned to or removed from a job. |
blocked_change |
The blocked flag is set or cleared on a bid or job. |
subcontractor_added |
A subcontractor is added to or removed from a job. |
payment_recorded |
A payment is recorded against an invoice. |
login |
A user successfully authenticates. |
role_change |
A user's role is changed by an Owner or Platform Admin. |
invoice_edit |
Any field on an invoice is modified after creation. |
admin_action |
A Platform Admin performs an administrative operation (e.g. soft-delete, tenant provisioning). |
tenant_provisioned |
A new tenant is created and its database provisioned. |
Why it is Immutable¶
The ActivityLog is the system's legal and operational audit trail. It guarantees that:
- Every change can be traced to a specific user and time.
- No one can cover their tracks by deleting log entries.
- Disputes about what happened — and when — can be resolved objectively.
Updates (User-Generated)¶
Updates are manual notes posted by users directly on a bid or job. They support free-text content and photo attachments.
Posting an Update¶
- Any user with access to the bid or job can post an update.
- Updates support text content and attached photos (see Photos).
- Updates are not editable after posting in V1. If a mistake is made, a follow-up update should be posted for clarification.
- Updates are not deleted — all deletes in the system are soft deletes, and Platform Admin must initiate them.
The no-edit policy on Updates ensures a trustworthy record of communications and observations on a project.
Who Can See Updates¶
- All users assigned to the relevant bid or job can see updates posted on that entity.
- Owner can see all updates across all entities.
- Accounting can view updates on invoices and jobs but not post to them directly.
Dashboard Feed¶
The Dashboard Feed is the landing page for all users. It shows a role-scoped stream of recent activity and active alerts.
Role-Scoped Visibility¶
Sees everything: all bids, all jobs, all alerts across the entire tenant. Full picture of operations.
Sees activity and alerts for bids and jobs where they are the assigned PM — their full hierarchy.
Sees activity and alerts only for jobs where they are the assigned Supervisor.
Sees invoice-related activity and status changes. No operational alerts.
Does not have a dashboard feed. Sees only their assigned job list.
Alerts Panel¶
The dashboard surfaces three categories of alerts prominently:
| Alert Type | Trigger | Who Sees It |
|---|---|---|
| Priority | Any bid or job with priority = true. |
Owner (all), PM (their items), Supervisor (their jobs). |
| Blocked | Any bid or job with blocked = true. |
Owner (all), PM (their items), Supervisor (their jobs). |
| Stale Jobs | Any In Progress job with no status change beyond the stale threshold (default: 14 days). |
Owner (all), PM (their items). |
The stale job threshold is configurable per tenant in CompanySettings. The default is 14 days of inactivity.