Task diary, organiser and knowledge base
No todos found. Add activities as todos to see them here!
No notes found.
Select the time period for your report
Choose format, options and download your report
Manage templates for report generation
Settings that apply to all modes of operation
Set your active activity hours and days for notifications
Set multiple time ranges for each day to accommodate complex schedules.
Structured work/break intervals with automatic notifications
Export or import your activity data
Configure confirmation dialogs for destructive actions
Test various system components and functionality
These actions cannot be undone
Use the search box above to find activities, todos, and hashtags.
Select a template to see preview
Templates use a simple variable substitution syntax with double curly braces to create dynamic reports.
{{variable}}
- Simple variable substitution{{#each array}}
... {{/each}}
- Loop through arrays{{#if condition}}
... {{/if}}
- Conditional contentTransform data using the pipe (|
) syntax to chain multiple functions together:
{{ variable | function }}
- Apply a single transformation{{ variable | function1 | function2 }}
- Chain multiple transformations{{ variable | function('parameter') }}
- Pass parameters to functionsdate('format')
- Format timestamps as dates{{ timestamp | date('yyyy-mm-dd') }}
→ "2025-08-02"{{ timestamp | date('mm/dd/yyyy') }}
→ "08/02/2025"{{ timestamp | date('dd mmm yyyy') }}
→ "02 Aug 2025"time
- Extract time from timestamps{{ timestamp | time }}
→ "14:30:25"escapeCsv
- Escape CSV special characters{{ "Hello, World" | escapeCsv }}
→ "\"Hello, World\""stripLinebreaks
- Remove line breaks from text{{ "Line 1\nLine 2" | stripLinebreaks }}
→ "Line 1 Line 2"Here's how the CSV template uses chaining to create clean, properly escaped output:
{{#each entry = entries}}{{ entry.timestamp | date('yyyy-mm-dd') }},{{ entry.timestamp | time }},{{ entry.activity | escapeCsv | stripLinebreaks }},{{ entry.description | escapeCsv | stripLinebreaks }}
{{/each}}
How this works:
entry.timestamp | date('yyyy-mm-dd')
- Converts timestamp to YYYY-MM-DD formatentry.timestamp | time
- Extracts time portionentry.activity | escapeCsv | stripLinebreaks
- First removes line breaks, then escapes for CSVentry.description | escapeCsv | stripLinebreaks
- Same process for descriptionsFunctions are applied left to right, so order is important:
{{ text | stripLinebreaks | escapeCsv }}
- Remove breaks first, then escape{{ text | escapeCsv | stripLinebreaks }}
- Escaping first may interfere with break removalThe following data is available in your templates:
{{reportTitle}}
- The report title{{startDate}}
- Report start date (formatted){{endDate}}
- Report end date (formatted){{totalEntries}}
- Total number of activity entries{{entries}}
- Array of all activity entriesEach entry in the {{#each entries}}
loop has:
{{activity}}
- The activity name{{description}}
- Activity description{{timestamp}}
- Raw ISO timestamp{{formattedTime}}
- Nicely formatted time (e.g., "2:30 PM"){{formattedDate}}
- Nicely formatted date (e.g., "Jan 15, 2025"){{isTodo}}
- Boolean: true if this is a todo item{{tags}}
- Array of hashtags for this entryTransform timestamps and format data:
{{formattedDate}}
and {{formattedTime}}
for human-readable formats{{#if description}}{{description}}{{/if}}
- only show if description exists{{#each tags}}#{{this}} {{/each}}
- display all hashtags{{#if isTodo}}TODO: {{/if}}
- mark todo itemsUse Markdown syntax for readable formatting:
# {{reportTitle}}
- Large heading## {{activity}}
- Medium heading**{{activity}}**
- Bold text*{{description}}*
- Italic text- {{activity}}
- Bullet point`{{formattedTime}}`
- Code formatting# {{reportTitle}}
From {{startDate}} to {{endDate}}
Total activities: {{totalEntries}}
{{#each entries}}
## {{formattedTime}} - {{activity}}
{{#if description}}
*{{description}}*
{{/if}}
{{#if tags}}
Tags: {{#each tags}}#{{this}} {{/each}}
{{/if}}
{{#if isTodo}}
**TODO ITEM**
{{/if}}
{{/each}}
You worked for X minutes
Would you like to save what you accomplished during this partial session?
Are you sure you want to perform this action?
Reminder alerts are switched off outside of activity hours.
To receive activity reminders, please update your activity schedule in the settings section. You can customize:
When you're outside your configured activity hours, reminders are automatically paused to avoid disrupting your personal time.
The following items are past their due date:
No hashtags found. Add activities with #hashtags to see them here!
Activity Tracker is a personal activity tracking application with smart notifications, comprehensive reporting, and Pomodoro timer functionality.
Key Features:
Activity Tracker can send reminder notifications directly to your operating system.
This allows you to receive activity reminders even when the app is minimized or you're using other applications.
Get reminder alerts through your operating system's notification center, plus sound alerts in the app.
Use only sound alerts within the app (no system notifications).
You can change this setting later in the General Settings section.
© 2025 Chris Carline
Personal activity tracking application built as a Progressive Web App. All data is stored locally on your device and remains completely private. No cookies, analytics, or tracking technologies used.
Each workspace maintains separate activities, settings, and state. Switch between workspaces to organize different projects or contexts.